LKDOS Extended BASIC Demos (Larken Edition)

Developer(s): Robert Shade
Date: 1994
Type: Diskette
Platform(s): TS 2068
Tags: Demo

A disk of demonstration programs for LKDOS extended BASIC, the window, font and graphics commands that the Larken disk cartridge adds to TS2068 BASIC. The title screen calls it “Timex / Larken Ex-BASIC data base prototype routines using DELETE / MERGE loaders, Timex / Larken subroutines & five Timex / Larken fonts”. Two data-entry prototypes fill in a photography job record (description lines, consultants, photographer, project, owner, date and time), with each field restricted to all characters, capitals only or numbers only, item highlighting, next/prior item and window-to-window movement, and range checks on the date and time. A font demo pages through the five fonts, and a graphics demo draws borders, frames, text-box constructs, simulated tractor-feed paper and labels, 35mm film strips and repeating patterns from a graphics font.

This is a Larken edition: it needs a TS2068 with the Larken disk interface and has not been converted for tape. Every program opens Larken windows (OPEN #5,"w0" to #7,"w2"), sets window size, position and font through PRINT #4: POKE into the cartridge, and loads one of its fonts into cartridge memory, so none of it runs on a stock machine.

What is on the disk

  • MENU.B1: the “LKDOS EX-BASIC DEMO PROGRAMS” menu: real 3-window demo, pseudo 3-window demo, font demo, graphics demo, and a “disk menu” entry.
  • LKEBCR.B1: Demonstration Program #1, data entry across three Larken windows (yellow, red and green, streams #5, #6 and #7).
  • LKEBCR.B2: Demonstration Program #2, the same form in one Larken window divided into three sections (“pseudo windows”), which types faster.
  • LKEBCR.B3: font demo. It shows the Larken 64 character/line, Larken italic and Larken 42 character/line fonts and the Timex bold 32 character/line and Timex graphics fonts, each beside the ROM character set.
  • LKEBCR.B4: three graphics demo menus: borders and frames, multi-section constructs, a framed colour display (“all ready to work together to produce screen displays”), film-strip simulations, and patterns built from one, two or four graphics characters, then cycled through every paper and ink colour.
  • LKEBCR.B5, LKEBCR.B6: the bare framework, a DELETE/MERGE loader (lines 0-99) plus the core routines (lines 9800 on). Line 20 deletes lines 100-9799 and merges in the next “implementation program”, which is left as the placeholder name XXXXXX.B1.
  • DECODE.C1 (1,817 bytes at 60552): the machine code the demos call: LKDOS disk-status utilities and a BREAK routine, the data-entry routine compiled with the Timachine compiler, and a routine that clears the 64-character input buffer.
  • FONTS1.C1 (four fonts at 62460) and CHAR64.CS (the 64-column font, loaded into the cartridge at 15200).
  • MENU01.C1, MENU02.C1: title and instruction screens for the two data-entry demos; DASC01.C1, DASC01.C2: their three-window and one-window form screens.
  • L.B1: the disk also carries Bob Swoger’s LOGICALL disk menu, version 5.0L3 (1993).

How the programs are built

All six LKEBCR programs share one layout: a loader in lines 0-99, the demo itself in lines 100-9799, and a library of core subroutines from line 9800, reached by GO SUB. The library holds printer code tables, Timex and Larken font switching (through the CHARS system variable or the cartridge’s font pointer), opening, sizing, colouring and clearing the three Larken windows, menus and notices, and checks for the year (1850-2050), month, day (with leap years), hour and minute. Text typed into a field goes into a 64-character buffer above RAMTOP, which BASIC PEEKs back into a string.

The data-entry routine is half compiled machine code and half BASIC. The window operations (PRINT #5;CHR$ B;, cursor characters, and PRINT #4: DRAW to erase) would not compile, so the compiled part passes its state through a parameter buffer at 62375-62385 and jumps back into BASIC lines 9889-9926 for each keystroke. That is why the three-window version types more slowly than the one-window version.

The demos are by Robert Shade. His “Windows by Shade” series in ZXir QLive Alive (Winter 1994 to Autumn 1996) describes them as his demo programs and prints their listings. The articles also explain the DELETE/MERGE loader scheme, the core routines and the memory map above RAMTOP, and note that the italic font is meant for printing company names on simulated labels. The disk-status and BREAK routines at the start of DECODE.C1 are by Jack Dohany, as Shade says in the articles; the compiled data-entry routine that follows is Shade’s own.

Notes

  • Option 5, “DISK MENU”, is printed on the MENU.B1 screen but the menu has no line that handles it.
  • The demo screens say “PRESS ‘C’ TO CONTINUE”, but they wait with PAUSE 0, so any key continues.
  • The data-entry demos stop at entry and checking. They save no files, and the “write this data into files” prompt in the core routines is never used.
  • None of the demos is on the disk in a version for tape. The demos were only partly tried in ZEsarUX: a test copy of the graphics demo, with the Larken window calls replaced by stubs, drew its frames and patterns from FONTS1.C1. The window captions came out in the ROM font and in the wrong place. The other screenshots are the disk’s own SCREEN$ files, plus a chart of the five fonts drawn from the font files.

The download holds the original disk image, every file from the disk as a TAP, and a README. It needs the Larken disk interface and cartridge (LKDOS version 3 extended BASIC); boot LKDOS and load MENU.B1.

Related Products

Floppy disk interface, LKDOS cartridge, operating manual and LKDOS utilities disk. Can support up to four 3″ to 5.25″ single-sided, double-sided or quad density disk drives.

Related Articles

Here is a more recent and sophisticated general purpose LarKen extended BASIC demo which I developed for my LABELMAKER II program upgrade project.
Each of the windows is preset by the implementation program to a different mode.
I am enclosing two copies of the program listings of both versions of my LKDOS extended BASIC data entry demo...
Third is the data entry block which is the compiled machine code part of the data entry routine from address 60899 to 62298.
The failure of the compiled data entry routine to run properly, plus the fact that as of this date I...

Image Gallery

Source Code

   10 CLEAR VAL "60551": LET A=SGN PI: LET B=SGN PI: LET C=SGN PI: GO SUB 9873: LET W$="                                ": LET A=SGN PI: LET B=SGN PI: GO SUB VAL "9872": POKE VAL "23658",VAL "11": PRINT #VAL "4": LOAD "DECODE.C1"CODE VAL "60552": PAUSE VAL "10": PRINT #VAL "4": LOAD "FONTS1.C1"CODE VAL "62460"
  100 CLS : GO SUB 9964: DIM M(2): LET M(1)=2: LET M(2)=2: LET RN=60899: PRINT #4: LOAD "MENU01.C1"SCREEN$ : GO TO 110
  110 IF INKEY$="1" THEN CLS : GO TO 150
  120 IF INKEY$="2" THEN CLS : GO SUB 9847: PRINT #4: LOAD "MENU.B1"
  130 GO TO 110
  140 DATA 2,1,14,14,2,17,30,14,18,1,30,21,9,9,9,48,22,32
  150 RESTORE 140: GO SUB 9843: GO SUB 9930: GO SUB 9848: GO SUB 9930: GO SUB 9849: GO SUB 9930: GO SUB 9850: GO SUB 9927: GO SUB 9857: GO SUB 9927: GO SUB 9858: GO SUB 9927: GO SUB 9859: GO SUB 9927: GO SUB 9851: GO SUB 9927: GO SUB 9852: GO SUB 9927: GO SUB 9853: PRINT #4: LOAD "CHAR64.CS"CODE 15200: GO SUB 9835: PRINT #4: LOAD "DASC01.C1"SCREEN$ 
  160 GO SUB 485: RESTORE 170: GO TO 590
  170 DATA 5,1,13,280,200,240,0,440,190
  180 DATA 0,1,8,128,26,0
  190 GO SUB 520: RESTORE 180: GO TO 592
  200 GO SUB 485: RESTORE 210: GO TO 590
  210 DATA 8,1,13,280,240,160,0,440,230
  220 DATA 0,1,8,104,26,0
  230 GO SUB 520: RESTORE 220: GO TO 592
  240 GO SUB 485: RESTORE 250: GO TO 590
  250 DATA 11,1,13,280,160,200,0,440,260
  260 DATA 0,1,8,80,26,0
  270 GO SUB 520: RESTORE 260: GO TO 592
  280 GO SUB 485: RESTORE 290: GO TO 594
  290 DATA 5,17,13,400,320,360,0,700,440
  320 GO SUB 485: RESTORE 330: GO TO 594
  330 DATA 8,17,13,400,360,280,0,440,350
  340 DATA 1,2,136,104,26,6
  350 GO SUB 520: RESTORE 340: GO TO 596
  360 GO SUB 485: RESTORE 370: GO TO 594
  370 DATA 11,17,13,400,280,320,0,440,390
  380 DATA 1,2,136,80,26,6
  390 GO SUB 520: RESTORE 380: GO TO 596
  400 GO SUB 485: RESTORE 402: GO TO 598
  402 DATA 18,6,1,160,420,420,0,440,800
  420 GO SUB 485: RESTORE 422: GO TO 598
  422 DATA 18,20,1,160,400,400,0,440,900
  440 IF INKEY$="W" OR INKEY$="w" THEN GO SUB 510: GO TO D
  442 IF INKEY$="N" OR INKEY$="n" THEN LET X=E: GO TO 500
  444 IF INKEY$="P" OR INKEY$="p" THEN LET X=F: GO TO 500
  446 IF INKEY$="C" OR INKEY$="c" THEN GO TO H
  448 IF INKEY$="E" OR INKEY$="e" THEN GO TO I
  460 IF INKEY$="F" OR INKEY$="f" THEN GO TO 600
  470 IF INKEY$="Q" OR INKEY$="q" THEN GO TO 30
  480 GO TO 440
  485 GO SUB 580: GO SUB 9874: RETURN 
  500 IF G=1 THEN GO TO 440
  502 GO SUB 510: GO TO X
  510 GO SUB 530: PRINT AT A,B; PAPER J; INK K; OVER 1;W$( TO C); OVER 0: RETURN 
  520 GO SUB 530: PRINT AT A,B; PAPER J; INK K;W$( TO C): RETURN 
  530 IF L=1 THEN LET J=5: LET K=0: RETURN 
  540 IF L=2 THEN LET J=6: LET K=0: RETURN 
  550 IF L=3 THEN LET J=2: LET K=6: RETURN 
  570 IF L=4 THEN LET J=4: LET K=0: RETURN 
  580 BEEP .02,10: RETURN 
  590 GO SUB 9935: LET L=1: GO SUB 510: LET L=2: GO TO 440
  592 GO SUB 9884: LET DR=E: GO SUB 9881: GO TO 9889
  594 GO SUB 9935: LET L=2: GO SUB 510: LET L=3: GO TO 440
  596 GO SUB 9884: LET DR=E: GO SUB 9882: GO TO 9889
  598 GO SUB 9935: LET L=3: GO SUB 510: LET L=4: GO TO 440
  600 RESTORE 610: GO SUB 9877: GO TO 604
  602 RESTORE 612: GO SUB 9879
  604 IF INKEY$="Y" OR INKEY$="y" THEN LET RS=0: GO SUB 615: GO TO A
  606 IF INKEY$="N" OR INKEY$="n" THEN LET RS=1: GO SUB 615: GO TO B
  608 GO TO 604
  610 DATA 22,4,0,32,602,620
  612 DATA 22,4,0,32,620,30
  615 GO SUB 9880: GO SUB 9927: GO SUB 9853: GO SUB 9928: RETURN 
  620 RESTORE 640: GO SUB 9880: LET L=2
  622 FOR X=1 TO 11
  623 IF X>3 AND X<7 THEN LET L=3
  624 IF X=4 THEN GO SUB 9929: GO SUB 510: GO TO 628
  625 IF X>6 THEN LET L=4
  626 IF RS=0 THEN GO SUB 9929: GO SUB 520
  627 IF RS=1 THEN GO SUB 9929: GO SUB 510
  628 IF X=11 THEN GO TO 630
  629 NEXT X
  630 GO TO 160
  640 DATA 4,0,5,1,13,8,1,13,11,1,13,5,17,13,8,17,13,11,17,13,18,6,1,18,9,1,18,12,2,18,20,1,18,23,1
  700 RESTORE 710: GO SUB 9928: GO SUB 9861: GO SUB 9928: GO SUB 520: GO SUB 580: LET M(1)=M(1)+1
  702 IF M(1)>2 THEN LET M(1)=1
  704 IF M(1)=1 THEN PRINT #6;"LINDA SHADE PHOTOGRAPHY"
  706 IF M(1)=2 THEN PRINT #6;"LOOMIS-SHADE PHOTOGRAPHY"
  708 LET L=2: GO SUB 510: LET L=3: GO TO 440
  710 DATA 136,128,5,17
  800 GO SUB 860: RESTORE 801: GO SUB 9884: LET DR=802: GO TO 974
  801 DATA 2,3,48,24,2,0
  802 GO SUB 9885: IF LEN Y$<1 THEN GO TO 800
  803 LET B$(5 TO 6)=Y$
  804 RESTORE 805: GO SUB 9929: GO SUB 520: RESTORE 806: GO SUB 9884: LET DR=807: GO TO 974
  805 DATA 18,9,1
  806 DATA 2,3,72,24,2,0
  807 GO SUB 9885: IF LEN Y$<1 THEN GO TO 804
  818 LET B$(7 TO 8)=Y$
  819 RESTORE 820: GO SUB 9929: GO SUB 520: RESTORE 821: GO SUB 9884: LET DR=822: GO TO 974
  820 DATA 18,12,1
  821 DATA 2,3,96,24,4,0,22
  822 GO SUB 9885: IF LEN Y$<1 THEN GO TO 819
  823 LET B$(1 TO 4)=Y$
  824 GO SUB 9940
  825 IF N=1 THEN GO TO 850
  826 GO SUB 9946
  827 IF N=1 THEN GO TO 850
  828 GO SUB 9950
  829 IF N=1 THEN GO TO 850
  830 GO TO 420
  850 RESTORE 852: GO SUB 9927: GO SUB 9853: GO SUB 9880: GO SUB 860: GO TO 400
  852 DATA 32,4,0
  860 RESTORE 870: LET L=4: FOR X=1 TO 3: GO SUB 9929: GO SUB 520: NEXT X: RETURN 
  870 DATA 18,6,1,18,9,1,18,12,2
  900 GO SUB 970: RESTORE 901: GO SUB 9884: LET DR=902: GO TO 974
  901 DATA 2,3,160,24,2,0
  902 GO SUB 9885: IF LEN Y$<1 THEN GO TO 900
  903 LET B$(9 TO 10)=Y$
  904 RESTORE 905: GO SUB 9929: GO SUB 520: RESTORE 906: GO SUB 9884: LET DR=907: GO TO 974
  905 DATA 18,23,1
  906 DATA 2,3,184,24,2,0,22
  907 GO SUB 9885: IF LEN Y$<1 THEN GO TO 904
  909 LET B$(11 TO 12)=Y$: GO SUB 9965
  910 IF N=1 THEN GO TO 950
  912 GO SUB 9969
  914 IF N=1 THEN GO TO 950
  920 RESTORE 921: LET L=3: GO SUB 9929: GO SUB 510: GO TO 922
  921 DATA 18,26,1
  922 IF INKEY$="C" THEN GO TO 960
  924 IF INKEY$="N" OR INKEY$="n" OR INKEY$="P" OR INKEY$="p" THEN RESTORE 921: LET L=4: GO SUB 9929: GO SUB 510: GO TO 400
  926 GO TO 922
  950 RESTORE 952: GO SUB 9927: GO SUB 9853: GO SUB 9880: GO SUB 970: GO TO 420
  952 DATA 32,4,0
  960 RESTORE 961: LET L=4: GO SUB 9928: GO SUB 9862: GO SUB 9928: GO SUB 520: GO SUB 580: LET M(2)=M(2)+1: GO TO 962
  961 DATA 208,24,18,26
  962 IF M(2)>2 THEN LET M(2)=1
  964 IF M(2)=1 THEN PRINT #7;"PM"
  966 IF M(2)=2 THEN PRINT #7;"AM"
  968 RESTORE 921: LET L=3: GO SUB 9929: GO SUB 510: GO TO 922
  970 RESTORE 972: LET L=4: FOR X=1 TO 2: GO SUB 9929: GO SUB 520: NEXT X: RETURN 
  972 DATA 18,20,1,18,23,1
  974 GO SUB 9882: GO TO 9889
  990 STOP 
 9800 DATA 1,13
 9801 DATA 1,10
 9802 DATA 1,12
 9803 DATA 3,27,87,1
 9804 DATA 3,27,87,0
 9805 DATA 2,27,69
 9806 DATA 2,27,70
 9807 DATA 3,27,45,1
 9808 DATA 3,27,45,0
 9809 DATA 1,15
 9810 DATA 2,27,80
 9811 DATA 2,27,77
 9812 DATA 2,27,52
 9813 DATA 2,27,53
 9814 DATA 3,27,108,0
 9815 DATA 3,27,108,9
 9816 DATA 3,27,108,14
 9817 DATA 2,27,64
 9818 DATA 19,27,42,1,14,0,60,66,66,153,153,165,165,165,165,129,129,66,66,60
 9819 DATA 3,27,42,1
 9820 DATA 1,18
 9821 DATA 2,27,58
 9822 DATA 4,27,88,0,64
 9823 DATA 4,27,88,9,72
 9824 DATA 4,27,88,14,77
 9825 DATA 18,27,76,14,0,60,66,66,153,153,165,165,165,165,129,129,66,66,60
 9826 DATA 2,27,76
 9827 GO SUB 9927: LET B=A: FOR X=1 TO B: GO SUB 9927
 9828 IF IN 127>237 THEN GO TO 9828
 9829 OUT 127,A: NEXT X: RETURN 
 9830 POKE VAL "23606",NOT PI: POKE VAL "23607",VAL "60": RETURN 
 9831 POKE VAL "23606",VAL "252": POKE VAL "23607",VAL "242": RETURN 
 9832 POKE VAL "23606",VAL "253": POKE VAL "23607",VAL "245": RETURN 
 9833 POKE VAL "23606",VAL "254": POKE VAL "23607",VAL "248": RETURN 
 9834 POKE VAL "23606",VAL "255": POKE VAL "23607",VAL "251": RETURN 
 9835 PRINT #VAL "4": POKE VAL "8218",VAL "14944": RETURN 
 9836 PRINT #VAL "4": POKE VAL "8218",VAL "62204": RETURN 
 9837 PRINT #VAL "4": POKE VAL "8218",VAL "62973": RETURN 
 9838 PRINT #VAL "4": POKE VAL "8218",VAL "63742": RETURN 
 9839 PRINT #VAL "4": POKE VAL "8218",VAL "64511": RETURN 
 9840 PRINT #VAL "4": OPEN #VAL "5","w0": RETURN 
 9841 PRINT #VAL "4": OPEN #VAL "6","w1": RETURN 
 9842 PRINT #VAL "4": OPEN #VAL "7","w2": RETURN 
 9843 PRINT #VAL "4": OPEN #VAL "5","w0": PRINT #VAL "4": OPEN #VAL "6","w1": PRINT #VAL "4": OPEN #VAL "7","w2": RETURN 
 9844 PRINT #VAL "4": CLOSE #VAL "5": RETURN 
 9845 PRINT #VAL "4": CLOSE #VAL "6": RETURN 
 9846 PRINT #VAL "4": CLOSE #VAL "7": RETURN 
 9847 PRINT #VAL "4": CLOSE #VAL "5": PRINT #VAL "4": CLOSE #VAL "6": PRINT #VAL "4": CLOSE #VAL "7": RETURN 
 9848 PRINT #VAL "4": INPUT #NOT PI,a,b,c,d: RETURN 
 9849 PRINT #VAL "4": INPUT #SGN PI,a,b,c,d: RETURN 
 9850 PRINT #VAL "4": INPUT #VAL "2",a,b,c,d: RETURN 
 9851 PRINT #VAL "4": POKE VAL "16014",A: RETURN 
 9852 PRINT #VAL "4": POKE VAL "16034",A: RETURN 
 9853 PRINT #VAL "4": POKE VAL "16054",A: RETURN 
 9854 PRINT #VAL "4": CLEAR NOT PI: RETURN 
 9855 PRINT #VAL "4": CLEAR SGN PI: RETURN 
 9856 PRINT #VAL "4": CLEAR VAL "2": RETURN 
 9857 PRINT #VAL "4": POKE VAL "16014",A: PRINT #VAL "4": CLEAR NOT PI: RETURN 
 9858 PRINT #VAL "4": POKE VAL "16034",A: PRINT #VAL "4": CLEAR SGN PI: RETURN 
 9859 PRINT #VAL "4": POKE VAL "16054",A: PRINT #VAL "4": CLEAR VAL "2": RETURN 
 9860 PRINT #VAL "4": POKE VAL "16005",A: PRINT #VAL "4": POKE VAL "16006",B: RETURN 
 9861 PRINT #VAL "4": POKE VAL "16025",A: PRINT #VAL "4": POKE VAL "16026",B: RETURN 
 9862 PRINT #VAL "4": POKE VAL "16045",A: PRINT #VAL "4": POKE VAL "16046",B: RETURN 
 9863 PRINT #VAL "4": DRAW A,B,C: RETURN 
 9864 PRINT #VAL "4": CIRCLE A,B,C: RETURN 
 9865 LET B=VAL "23540": FOR X=B TO B+VAL "7": GO SUB VAL "9927": POKE B,A: NEXT X: RETURN 
 9866 PRINT #VAL "4": PAPER A: PRINT #VAL "4": INK B: RETURN 
 9867 PRINT #VAL "4": POKE A,B: RETURN 
 9868 PRINT #VAL "4": GO TO A: RETURN 
 9869 PRINT #VAL "4": POKE VAL "16090",A: RETURN 
 9870 PRINT #VAL "4": POKE VAL "16094",A: RETURN 
 9871 PRINT #VAL "4": GO TO VAL "4": PRINT #VAL "4": FORMAT "8",: PRINT #VAL "4": GO TO NOT PI: RETURN 
 9872 PRINT #NOT PI;AT NOT PI,NOT PI; PAPER A; INK B;W$( TO VAL "32");AT SGN PI,NOT PI;W$( TO VAL "32"): RETURN 
 9873 BORDER A: PRINT #VAL "4": PAPER B: PRINT #VAL "4": INK C: CLS : RETURN 
 9874 GO SUB VAL "9833": PRINT #NOT PI;AT NOT PI,NOT PI; PAPER VAL "7"; INK NOT PI;" '"; INK VAL "2";"W"; INK NOT PI;"'indow-'"; INK VAL "2";"N"; INK NOT PI;"'ext/'"; INK VAL "2";"P"; INK NOT PI;"'rior"; INK SGN PI;" (Item) ";AT SGN PI,NOT PI; INK NOT PI;"'"; INK VAL "2";"C"; INK NOT PI;"'hange-'"; INK VAL "2";"E"; INK NOT PI;"'nter-'"; INK VAL "2";"F"; INK NOT PI;"'inish-'"; INK VAL "2";"Q"; INK NOT PI;"'uit": GO SUB VAL "9830": RETURN 
 9875 GO SUB VAL "9833": PRINT #NOT PI;AT NOT PI,NOT PI; PAPER VAL "7"; INK NOT PI;" '"; INK VAL "2";"N"; INK NOT PI;"'ext/'"; INK VAL "2";"P"; INK NOT PI;"'rior"; INK SGN PI;"(Item)"; INK NOT PI;"-'"; INK VAL "2";"C"; INK NOT PI;"'hange  ";AT SGN PI,NOT PI; INK NOT PI;"    '"; INK VAL "2";"E"; INK NOT PI;"'nter-'"; INK VAL "2";"F"; INK NOT PI;"'inish-'"; INK VAL "2";"Q"; INK NOT PI;"'uit     ": GO SUB VAL "9830": RETURN 
 9876 GO SUB VAL "9833": PRINT #NOT PI;AT NOT PI,NOT PI; PAPER VAL "7"; INK NOT PI;" '"; INK VAL "2";"N"; INK NOT PI;"'ext file -  '"; INK VAL "2";"P"; INK NOT PI;"'reveous file ";AT SGN PI,NOT PI; INK NOT PI;"'"; INK VAL "2";"R"; INK NOT PI;"'eedit this file - '"; INK VAL "2";"Q"; INK NOT PI;"'uit edit": GO SUB VAL "9830": RETURN 
 9877 LET A=VAL "64": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";"  IS THIS DATA CORRECT 'Y' OR 'N' ": PAUSE NOT PI: RETURN 
 9878 LET A=VAL "52": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";" WRITE THIS DATA INTO FILES 'Y' OR 'N' ": PAUSE NOT PI: RETURN 
 9879 LET A=VAL "65": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";" ANOTHER FILE UNIT 'Y' OR 'N' ": PAUSE NOT PI: RETURN 
 9880 GO SUB VAL "9928": PRINT AT VAL "20",SGN PI; PAPER A; INK B;W$( TO VAL "30"): RETURN 
 9881 GO SUB VAL "9833": PRINT #NOT PI;AT NOT PI,NOT PI; PAPER VAL "6"; INK NOT PI;" '"; INK VAL "2";"CS"; INK NOT PI;"'+'"; INK VAL "2";"2"; INK NOT PI;"'cursor- '"; INK VAL "2";"CS"; INK NOT PI;"'+'"; INK VAL "2";"0"; INK NOT PI;"'delete   ";AT SGN PI,NOT PI; INK NOT PI;"  '"; INK VAL "2";"ENTER"; INK NOT PI;"' to finish this item   ": GO SUB VAL "9830": RETURN 
 9882 GO SUB VAL "9833": PRINT #NOT PI;AT NOT PI,NOT PI; PAPER VAL "6"; INK NOT PI;"   '"; INK VAL "2";"CS"; INK NOT PI;"'+'"; INK VAL "2";"0"; INK NOT PI;"' delete characters   ";AT SGN PI,NOT PI; INK NOT PI;"  '"; INK VAL "2";"ENTER"; INK NOT PI;"' to finish this item   ": GO SUB VAL "9830": RETURN 
 9884 LET W=62377: FOR X=W TO (W+5): GO SUB 9927: POKE X,A: NEXT X: RETURN 
 9885 LET Y$="": LET Z=PEEK 62390: FOR X=62391 TO (62391+(Z-2)): LET Z$=CHR$ PEEK X: LET Y$=Y$+Z$: NEXT X: RANDOMIZE USR 62304
 9886 RETURN 
 9887 GO SUB VAL "9834": GO SUB VAL "9934": PRINT AT A,B; PAPER D; INK E;CHR$ F;: FOR X=(B+SGN PI) TO (C-SGN PI): PRINT PAPER D; INK E;CHR$ G;: NEXT X: PRINT PAPER D; INK E;CHR$ H: RETURN 
 9888 GO SUB VAL "9834": GO SUB VAL "9935": FOR Y=A TO D: PRINT AT Y,B; PAPER E; INK F;CHR$ G;: FOR X=(B+SGN PI) TO (C-SGN PI): PRINT PAPER E; INK F; OVER 1;CHR$ H;: NEXT X: PRINT PAPER E; INK F;CHR$ I: NEXT Y: RETURN 
 9889 RANDOMIZE USR RN
 9890 LET BG=PEEK 62383: LET CW=PEEK 62378: LET CU=PEEK 62385: LET CS=PEEK 62377: LET A=PEEK 62376: LET B=PEEK 62380
 9891 IF CW=1 THEN PRINT #4: POKE 16005,A: PRINT #4: POKE 16006,B: GO TO 9894
 9892 IF CW=2 THEN PRINT #4: POKE 16025,A: PRINT #4: POKE 16026,B: GO TO 9894
 9893 IF CW=3 THEN PRINT #4: POKE 16045,A: PRINT #4: POKE 16046,B
 9894 IF BG=1 THEN GO TO 9914
 9895 LET F=PEEK 62380: LET H=PEEK 62382: PLOT INK H;A,F: LET DL=PEEK 62384
 9896 PRINT #4: DRAW (4*DL),8,0:
 9898 IF BG=2 THEN GO TO 9902
 9899 IF BG=3 THEN LET RN=61872: GO TO 9889
 9900 IF BG=4 THEN GO TO 9906
 9901 IF BG=5 THEN LET RN=60899: GO TO DR
 9902 LET B=PEEK 62375
 9903 IF CW=1 THEN PRINT #5;CHR$ B;: GO TO 9917
 9904 IF CW=2 THEN PRINT #6;CHR$ B;: GO TO 9920
 9905 IF CW=3 THEN PRINT #7;CHR$ B;: GO TO 9923
 9906 IF CW=2 THEN GO TO 9910
 9907 IF CW=3 THEN GO TO 9912
 9908 IF CU=0 THEN PRINT #5;"^": GO TO 9926
 9909 IF CU=1 THEN PRINT #5;"_": GO TO 9926
 9910 IF CU=0 THEN PRINT #6;"^": GO TO 9926
 9911 IF CU=1 THEN PRINT #6;"_": GO TO 9926
 9912 IF CU=0 THEN PRINT #7;"^": GO TO 9926
 9913 IF CU=1 THEN PRINT #7;"_": GO TO 9926
 9914 IF CW=1 THEN GO TO 9917
 9915 IF CW=2 THEN GO TO 9920
 9916 IF CW=3 THEN GO TO 9923
 9917 IF CS=0 AND CU=0 THEN PRINT #5;"^": GO TO 9926
 9918 IF CS=0 AND CU=1 OR CS=1 THEN PRINT #5;"_": GO TO 9926
 9919 IF CS=2 THEN PRINT #5;"\": GO TO 9926
 9920 IF CS=0 AND CU=0 THEN PRINT #6;"^": GO TO 9926
 9921 IF CS=0 AND CU=1 OR CS=1 THEN PRINT #6;"_": GO TO 9926
 9922 IF CS=2 THEN PRINT #6;"\": GO TO 9926
 9923 IF CS=0 AND CU=0 THEN PRINT #7;"^": GO TO 9926
 9924 IF CS=0 AND CU=1 OR CS=1 THEN PRINT #7;"_": GO TO 9926
 9925 IF CS=2 THEN PRINT #7;"\"
 9926 LET RN=62141: GO TO 9889
 9927 READ A: RETURN 
 9928 READ A,B: RETURN 
 9929 READ A,B,C: RETURN 
 9930 READ A,B,C,D: RETURN 
 9931 READ A,B,C,D,E: RETURN 
 9932 READ A,B,C,D,E,F: RETURN 
 9933 READ A,B,C,D,E,F,G: RETURN 
 9934 READ A,B,C,D,E,F,G,H: RETURN 
 9935 READ A,B,C,D,E,F,G,H,I: RETURN 
 9936 READ A,B,C,D,E,F,G,H,I,J: RETURN 
 9937 READ A,B,C,D,E,F,G,H,I,J,K: RETURN 
 9938 READ A,B,C,D,E,F,G,H,I,J,K,L: RETURN 
 9939 READ A$: RETURN 
 9940 LET N=NOT PI: LET O=VAL B$(SGN PI TO VAL "4")
 9941 IF O>=VAL "2051" THEN LET N=SGN PI: GO SUB VAL "9957": RETURN 
 9942 IF O<=VAL "1849" THEN LET N=SGN PI: GO SUB VAL "9958": RETURN 
 9943 LET T=O-VAL "1796": LET U=INT (T/VAL "4"): LET V=(T/VAL "4"): LET W=V-U
 9944 IF W=NOT PI THEN LET LY=NOT PI: RETURN 
 9945 IF W>NOT PI THEN LET LY=SGN PI: RETURN 
 9946 LET N=NOT PI: LET P=VAL B$(VAL "5" TO VAL "6")
 9947 IF P<SGN PI THEN LET N=SGN PI: GO SUB VAL "9960": RETURN 
 9948 IF P>VAL "12" THEN LET N=SGN PI: GO SUB VAL "9961": RETURN 
 9949 RETURN 
 9950 LET N=NOT PI: LET Q=VAL B$(VAL "7" TO VAL "8")
 9951 IF Q<SGN PI THEN LET N=SGN PI: GO SUB VAL "9962": RETURN 
 9952 IF Q>VAL "31" THEN LET T=VAL "31": LET N=SGN PI: GO SUB VAL "9963": RETURN 
 9953 IF LY=SGN PI AND Q=VAL "29" AND P=VAL "2" THEN LET N=SGN PI: GO SUB VAL "9959": RETURN 
 9954 IF P=VAL "2" AND Q>VAL "29" THEN LET T=VAL "29": LET N=SGN PI: GO SUB VAL "9963": RETURN 
 9955 IF P=VAL "4" AND Q>VAL "30" OR P=VAL "6" AND Q>VAL "30" OR P=VAL "9" AND Q>VAL "30" OR P=VAL "11" AND Q>VAL "30" THEN LET T=VAL "30": LET N=SGN PI: GO SUB VAL "9963": RETURN 
 9956 RETURN 
 9957 LET A=VAL "34": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";" YEAR ENTERED IS TO HIGH - MUST BE 2050 OR LOWER ": PAUSE NOT PI: RETURN 
 9958 LET A=VAL "34": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";" YEAR ENTERED IS TO LOW - MUST BE 1850 OR HIGHER ": PAUSE NOT PI: RETURN 
 9959 LET A=VAL "16": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";" YEAR ENTERED NOT A LEAP YEAR - MUST BE 28 DAYS OR LESS": PAUSE NOT PI: RETURN 
 9960 LET A=VAL "35": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";" MONTH ENTERED IS TO LOW - MUST BE 1 OR HIGHER ": PAUSE NOT PI: RETURN 
 9961 LET A=VAL "32": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";" MONTH ENTERED IS TO HIGH - MUST BE 12 OR LOWER ": PAUSE NOT PI: RETURN 
 9962 LET A=VAL "42": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";" DAY ENTERED IS TO LOW MUST BE 1 OR HIGHER ": PAUSE NOT PI: RETURN 
 9963 LET A=VAL "34": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";"  DAY ENTERED IS TO HIGH - MUST BE ";T;" OR LESS  ": PAUSE NOT PI: RETURN 
 9964 DIM B$(VAL "12"): RETURN 
 9965 LET N=NOT PI: LET R=VAL B$(VAL "9" TO VAL "10")
 9966 IF R<SGN PI THEN LET N=SGN PI: GO SUB VAL "9972": RETURN 
 9967 IF R>VAL "12" THEN LET N=SGN PI: GO SUB VAL "9973": RETURN 
 9968 RETURN 
 9969 LET N=NOT PI: LET S=VAL B$(VAL "11" TO VAL "12")
 9970 IF S>VAL "59" THEN LET N=SGN PI: GO SUB VAL "9974": RETURN 
 9971 RETURN 
 9972 LET A=VAL "32": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";"  HOUR ENTERED IS TO LOW - MUST BE 1 OR HIGHER ": PAUSE NOT PI: RETURN 
 9973 LET A=VAL "34": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";" HOUR ENTERED IS TO HIGH - MUST BE 12 OR LOWER ": PAUSE NOT PI: RETURN 
 9974 LET A=VAL "27": LET B=VAL "8": GO SUB VAL "9862": GO SUB VAL "9927": GO SUB VAL "9853": PRINT #VAL "7";"  MINUTE ENTERED IS TO HIGH - MUST BE 59 OR LOWER  ": PAUSE NOT PI: RETURN 
 9975 LET X=USR 60552: RETURN 
 9976 LET X=USR 60556: LET Y=PEEK 60560: LET Z=(Y-X): RETURN 
 9977 LET X=USR 60558: RETURN 
 9978 DIM N$(9): LET N$=K$: LET X=60562: FOR Y=0 TO 8: POKE (X+Y),CODE N$(Y+1): NEXT Y: LET Z=USR 60554: RETURN 
 9979 RANDOMIZE USR (60813+A): RETURN 
 9994 STOP 
 9995 CLEAR : PRINT #4: SAVE "LKEBCR.B1" LINE 10
 9996 STOP

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.