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 nameXXXXXX.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) andCHAR64.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.B1screen 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.
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 STOPNote: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.





