L<}6CD l0C)HCC WhL/h `CmCDiD`  R@P1  Y0,0'@R !L` ` C D     )16CS S)  C)D1 p p 0 C9DI pCDL~CiCDiD`vA STRING INITIALIZATION;A,%67@,.A%67A,.A(67@},.D1:CH10PRG1.BAS10 REM STRING INITIALIZATION20 DIM A$(1000)30 A$(1)="A":A$(1000)="A"40 A$(2)=A$S DELETE LINE EXAMPLE +-@@* (@p(@!(@*(CONT(-@}2AB@&<AB@FTHESE LINESP WILL BEZ DELETEDD:CH10PRG2.BASw10 REM DELETE LINE EXAMPLE20 GRAPHICS 0:POSITION 2,430 ? 70:? 80:? 90:? "CONT"40 POSITION 2,050 POKE 842,13:STOP 60 POKE } 842,1270 REM THESE LINES80 REM WILL BE90 REM DELETED 9ABVTAATAOFFHL  } dPLAYER/MISSILE EXAMPLEn;A,;@ ,x:6-%@""6@067< },.>:,: A 440,255,129,129,129,129,129,129,129,129,255,0,-1'AY@b'A@&6-F:A,}&@&BBy'B2w@'AA$%%6-F:A4,%F:A5,$AV%%6-F:A@,%F:AA,}$AV 6-$AV%A$&$6-P:'AV,$6-&$AV*%@%@ 36-@`6-A}'6-@36-@"67<%@,."B2H 6-%6-% !A) @3 6-6 !A}) @I 6-6D A@D1:CH10PRG3.BAS9100 REM PLAYER/MISSILE EXAMPLE110 DIM A$(512),B$(20)120 X=X+1:READ A:IF A<>-1 THEN B$(X,X)=CHR$(A):GOTO 120130 DATA 0,255,}129,129,129,129,129,129,129,129,255,0,-12000 POKE 559,62:POKE 704,882020 I=PEEK(106)-16:POKE 54279,I2030 POKE 53277,3:POKE} 710,2242040 VTAB=PEEK(134)+PEEK(135)*2562050 ATAB=PEEK(140)+PEEK(141)*2562060 OFFS=I*256+1024-ATAB2070 HI=INT(OFFS/256):}LO=OFFS-HI*2562090 POKE VTAB+2,LO:POKE VTAB+3,HI3000 Y=60:Z=100:V=1:H=14000 A$(Y,Y+11)=B$:POKE 53248,Z4010 Y=Y+V:Z=Z+H40}20 IF Y>213 OR Y<33 THEN V=-V4030 IF Z>206 OR Z<49 THEN H=-H4420 GOTO 4000M./ +@#-@9-@(}2,@$%</@$%@@F P Z6-F:A,dAF:A,nAF:A} ,xA F:A,AD1:CH3PRG1.BASC10 GRAPHICS 2320 FOR X=0 TO 3930 FOR I=0 TO 340 COLOR I50 PLOT 4*X+I,O60 DRAWTO 4*X+1,9570 NEXT I80 NEXT X90 A=PEEK(7}12)100 POKE 712,PEEK(710)110 POKE 710,PEEK(709)120 POKE 709,PEEK(708)130 POKE 708,AX01PMBASRAMTOSDMCTGRACTHPOSPPCOLRMYPMBASBByAAYB2wB2HAA@P }@ B @ -6-BBy-Player-missile base pointer'6-A'OS top of RAM pointer/6-AY }/RAM shadow of DMACTL register06-B2w0CTIA graphics control register+6-B2H+Horizontal position of P0 }*6-A*Shadow of player 0 color G +'0@GSet background color to black46-A }4BASIC's player horizontal position26-@H2BASIC's player vertical position(26-F:,&@2Get RAM 2K belo !}w top of RAM2& &Tell ANTIC where PM RAM is<06-AV$0Keep track of PM RAM addressF/@F/Enable PM "} DMA with 2-line resP#@#Enable PM displayZ-A-Declare horizontal positiond5-%A%A@ #}5this loop clears playernx -%A%%A%$"$This loop draws the player  $} 8,17,35,255,32,16,8&@&Make the player pink"6-R:,"Read joystick2"@ A %}2If inactive, try again#"@6-&@##"@6-%@#@ A &} -@6@$$%A%%F:%A%%, 6-%@@ A"- '}@,$$%A%%F:%A%%,6 @6-&@J AD1:CH4PRG1.BAS o1 PMBASE=54279:REM Player-missile base pointer2 RAMTOP=106:REM OS top of RAM pointer3 SDMCTL=559:REM RAM shadow of DMACTL r$)}egister4 GRACTL=53277:REM CTIA graphics control register5 HPOSP0=53248:REM Horizontal position of P06 PCOLR0=704:REM Shado$*}w of player 0 color10 GRAPHICS 0:SETCOLOR 2,0,0:REM Set background color to black20 X=100:REM BASIC's player horizontal pos$+}ition30 Y=48:REM BASIC's player vertical position40 A=PEEK(RAMTOP)-8:REM Get RAM 2K below top of RAM50 POKE PMBASE,A:REM T$,}ell ANTIC where PM RAM is60 MYPMBASE=256*A:REM Keep track of PM RAM address70 POKE SDMCTL,46:REM Enable PM DMA with 2-line $-}res80 POKE GRACTL,3:REM Enable PM display90 POKE HPOSP0,100:REM Declare horizontal position100 FOR I=MYPMBASE+512 TO MYPMB$.}ASE+640:REM this loop clears player110 POKE I,0120 NEXT I130 FOR I=MYPMBASE+512+Y TO MYPMBASE+518+Y140 READ A:REM This lo$/}op draws the player150 POKE I,A160 NEXT I170 DATA 8,17,35,255,32,16,8180 POKE PCOLR0,88:REM Make the player pink190 A=ST$0}ICK(0):REM Read joystick200 IF A=15 THEN GOTO 190:REM If inactive, try again210 IF A=11 THEN X=X-1:POKE HPOSP0,X220 IF A=7$1} THEN X=X+1:POKE HPOSP0,X230 IF A<>13 THEN GOTO 280240 FOR I=8 TO 0 STEP -1250 POKE MYPMBASE+512+Y+I,PEEK(MYPMBASE+511+Y+I$2})260 NEXT I270 Y=Y+1280 IF A<>14 THEN GOTO 190290 FOR I=0 TO 8300 POKE MYPMBASE+511+Y+I,PEEK(MYPMBASE+512+Y+I)310 NEXT $3}I320 Y=Y-1330 GOTO 190$;<%:RAMTOPMBASSDMCTGRACTHPOSPPCOLRSIZEPGPRIOMYPMBASABByAYB2wB2HAB(5}2VA#@0 A@ BX@ Bd'6-A'OS top of RAM pointer26-BBy2ANTIC player-missile RAM(6} pointer"6-AY"Shadow of DMACTL06-B2w0CTIA graphics control register46-B2H4Horizontal positi(7}on register of P036-A3Shadow of player 0 color register/6-B2V/Player width control register+6-A(8}#+Priority control register +@0@@@0@( @24-(9}@y4This loop fills the screen<,F/AYP Z56-F:,&@ 5Must back up further (:}for GR. 7d n6-AV$x@F@A-%A%A@)AU)(;}Make player solid color @/@/Set player to quadruple width@Set priority(<} @-@0@@,%@"/%@C  D:CH4PRG2.BAS(`1 RAMTOP=106:REM OS top of RAM pointer2 PMBASE=54279:REM ANTIC player-missile RAM pointer3 SDMCTL=559:REM Shadow of DMACTL,>}4 GRACTL=53277:REM CTIA graphics control register5 HPOSP0=53248:REM Horizontal position register of P06 PCOLR0=704:REM Shad,?}ow of player 0 color register7 SIZEP0=53256:REM Player width control register8 GPRIOR=623:REM Priority control register10 ,@}GRAPHICS 720 SETCOLOR 4,8,430 SETCOLOR 2,0,040 COLOR 350 FOR Y=0 TO 79:REM This loop fills the screen60 PLOT 0,Y70 DRAW,A}TO 159,Y80 NEXT Y90 A=PEEK(RAMTOP)-20:REM Must back up further for GR. 7100 POKE PMBASE,A110 MYPMBASE=256*A120 POKE SDMC,B}TL,46130 POKE GRACTL,3140 POKE HPOSP0,100150 FOR I=MYPMBASE+512 TO MYPMBASE+640160 POKE I,255:REM Make player solid color,C}170 NEXT I180 POKE PCOLR0,88190 POKE SIZEP0,3:REM Set player to quadruple width200 POKE GPRIOR,4:REM Set priority210 COL,D}OR 4220 FOR Y=30 TO 40230 PLOT Y+22,Y240 DRAWTO Y+43,Y250 NEXT Y,E01)RAMTOPMBASSDMCTHPOSPPCOLRMYPMBASGRACTABByAYB2HAADBhdB2w0F} @ '6-A'OS top of RAM pointer26-BBy2ANTIC player-missile RAM pointer"6-A0G}Y"Shadow of DMACTL26-B2w2CTIA's graphics control register46-B2H4Horizontal position register of P00H}36-A3Shadow of player 0 color register C +6-F:,&@CMust back up for 1-line resolution 0I}6-AV$(@b2@<AF-%A$%APZ dA@0J}n-@x"%A% 14,29,24,24,24,24,24,2424,24,24,24,24,24,184,112 (0K} Clear screen-@@ (xdxD1:CH4PRG3.BAS0I1 RAMTOP=106:REM OS top of RAM pointer2 PMBASE=54279:REM ANTIC player-missile RAM pointer3 SDMCTL=559:REM Shadow of DMACTL4M}4 GRACTL=53277:REM CTIA's graphics control register5 HPOSP0=53248:REM Horizontal position register of P06 PCOLR0=704:REM Sh4N}adow of player 0 color register10 GRAPHICS 0:A=PEEK(RAMTOP)-16:REM Must back up for 1-line resolution20 POKE PMBASE,A30 MY4O}PMBASE=256*A40 POKE SDMCTL,6250 POKE GRACTL,360 POKE HPOSP0,10270 FOR I=MYPMBASE+1024 TO MYPMBASE+128080 POKE I,090 NEX4P}T I100 POKE PCOLR0,140110 FOR I=0 TO 15120 READ X130 POKE MYPMBASE+1100+I,X140 NEXT I150 DATA 14,29,24,24,24,24,24,2414Q}60 DATA 24,24,24,24,24,24,184,112170 ? " ":REM Clear screen180 POSITION 15,6190 ? "xdx"4[10 DLIST=PEEK(560)+256*PEEK(561):REM Find display list20 POKE DLIST+15,130:REM Insert interrupt instruction30 FOR I=0 TO 198S}:REM Loop for poking DLI service routine40 READ A:POKE 1536+I,A:NEXT I50 DATA 72,138,72,169,80,162,8860 DATA 141,10,212,148T}1,23,20870 DATA 142,24,208,104,170,104,6480 POKE 512,0:POKE 513,6:REM Poke in interrupt vector90 POKE 54286,192:REM Enable8U} DLI20870 DATA 142,24,208,104,170,104,6480 POKE 512,0:POKE 513,6:REM Poke in interrupt vector90 POKE 54286,192:REM Enable8 DLISBh@ @d 9%6-F:A`,%AV$F:Aa,9Find display list6%@A0:,.6-%p}@8 @% #A"("6@26-?:C:,<<<<<<<<,7-APp} < @0d182,168,0,0,0,0,0,0n162,168,182,166,0,0,0,0x 144,168,162,166,35,166,0,0##128,168,144,166,40p},166,35,166##121,168,128,166,45,166,40,166##108,168,121,166,47,166,45,166""96,168,108,166,53,166,47,166!!91,1p}68,96,166,60,166,53,166-1,0,0,0,0,0,0,0(#2#<#33this data contains the machine lang. program,F#and is readp} into SIMUL$'CC104,133,203,162,0,104,104,157,0,210,232,228,203,208,246,96,-1 D:CH7PRG2.BASpe10 SOUND 0,0,0,0:DIM SIMUL$(16)20 RESTORE 9999:X=125 READ Q:IF Q<>-1 THEN SIMUL$(X)=CHR$(Q):X=X+1:GOTO 2527 RESTORE 10030t} READ F1,C1,F2,C2,F3,C3,F4,C440 IF F1=-1 THEN END 50 X=USR(ADR(SIMUL$),F1,C1,F2,C2,F3,C3,F4,C4)55 FOR X=0 TO 150:NEXT X60t} GOTO 30100 DATA 182,168,0,0,0,0,0,0110 DATA 162,168,182,166,0,0,0,0120 DATA 144,168,162,166,35,166,0,0130 DATA 128,168,1t}44,166,40,166,35,166140 DATA 121,168,128,166,45,166,40,166150 DATA 108,168,121,166,47,166,45,166160 DATA 96,168,108,166,53t},166,47,166170 DATA 91,168,96,166,60,166,53,166999 DATA -1,0,0,0,0,0,0,09000 REM 9010 REM 9020 REM this data contains tht}e machine lang. program,9030 REM and is read into SIMUL$9999 DATA 104,133,203,162,0,104,104,157,0,210,232,228,203,208,246,9t}6,-1t0100 ;0110 ; VONLY Bob Fraser 7-23-810120 ;0130 ;0140 ;volume-only AUDC1-4 bit test routine0150 ;0160 ;0170 ;018x}0 ;0190 AUDCTL = $D2080200 AUDF1 = $D2000210 AUDC1 = $D2010220 SKCTL = $D20F0230 ;0240 ;0250 *= $Bx}O0260 TEMPO .BYTE 10270 MSC .BYTE 00280 ;0290 ;0300 ;0310 *= $40000320 LDA #00330 STA AUDCTL0340x} LDA #30350 STA SKCTL0360 LDX #00370 ;0380 LDA #00390 STA $D40E ; kill vbi's0400 STA $D2x}0E ; kill irq's0410 STA $D400 ; kill dma0420 ;0430 ;0440 ;0450 L00 LDA DTAB,X0460 STA MSC0470 ;0480 x}LDA VTAB,X0490 L0 LDY TEMPO0500 STA AUDC10510 L1 DEY0520 BNE L10530 ;0540 ; dec most sig ctr0550 DECx} MSC0560 BNE L00570 ;0580 ;0590 ; new note0600 ;0610 INX0620 CPX NC0630 BNE L000640 ;0650 ; wrap nx}ote pointer0660 LDX #00670 BEQ L000680 ;0690 ;0700 NC .BYTE 28; note count0710 ;0720 ; table of volumes to bex} played In succession0730 VTAB0740 .BYTE 24,25,26,27,28,29,30,310750 .BYTE 30,29,28,27,26,25,240760 .BYTE 23,x}22,21,20,19,18,170770 .BYTE 18,19,20,21,22,230780 ;0790 ; this table contains the duration of each entry above0800 DTx}AB0810 .BYTE 1,1,1,2,2,2,3,60820 .BYTE 3,2,2,2,1,1,10830 .BYTE 1,1,2,2,2,3,60840 .BYTE 3,2,2,2,1,1xw10 ; RESET THE MEMLO POINTER20 ;30 START = $60040 DOSINI = $0C50 MEMLO = $2E760 NEWMEM = $|}3000 ;THIS IS THE NEW VALUE FOR MEMLO65 ;70 ;THIS ROUTINE RESERVES SPACE FOR ASSEMBLY ROUTINES90 ;BY RESETING THE MEMLO PO|}INTER. IT RUNS AS0100 ;AN AUTORUN.SYS FILE. IT ALSO RESETS MEMLO ON [RESET].0120 ;MEMLO IS SET TO THE VALUE OF NEWMEM.0130|} ;0140 ; THIS PART IS PERMANENT, IE. NEEDS TO BE RESIDENT.0150 ; THE SYSTEM DOSINI VECTOR HAS BEEN STOLEN0160 ; AND STORED|} IN THE ADDRESS PORTION OF THE JSR TROJAN0170 ; INSTRUCTION. SO WHEN [RESET] IS PRESSED, DOSINI VECTORS0180 ; TO INITDOS, J|}SR TROJAN THEN CALLS THE DOS INITIALIZATION0185 ; ROUTINES, MEMLO IS RESET TO NEW VALUE AND CONTROL0190 ; RETURNS TO THE MO|}NITOR.0200 *= START0210 INITDOS0220 JSR TROJAN ; DO DOS INITIALIZATION0230 LDA #NEWMEM&2550240 STA MEM|}LO0250 LDA #NEWMEM/2560260 STA MEMLO+10270 TROJAN0280 RTS0290 ; THIS PART IS EXECUTED AT POWER UP ONLY AND0|}300 ; CAN BE DELETED AFTER POWER-UP.0330 ; THIS ROUTINE STORES THE CONTENTS OF DOSINI INTO THE JSR0350 ; TROJAN INSTRUCTION|}. IT THEN REPLACES DOSINI WITH0370 ; A NEW VALUE, LOCATION INITDOS.0390 GRABDOSI0400 LDA DOSINI ; SAVE DOSINI0410|} STA INITDOS+10420 LDA DOSINI+10430 STA INITDOS+20440 LDA #INITDOS&255 ; SET DOSINI0450 STA DOSINI04|}60 LDA #INITDOS/2560470 STA DOSINI+10480 LDA NEWMEM&255 ; SET MEMLO0490 STA MEMLO0500 LDA #NEWMEM/256|}0510 STA MEMLO+10520 RTS0530 *= $2E20540 .WORD GRABDOSI ; SET RUN ADDRESS0550 .END|r40 *=$60050 ;METRONOME ROUTINE...USES $0000 TO PASS THE METRONOME RATE60 ;70 AUDF1 = $D200 ; AUDIO FREQUENCY }REGISTER80 AUDC1 = $D201 ; AUDIO CONTROL REGISTER90 FREQ = $08 ; AUDF1 VALUE0100 VOLUME = $AF ; AUDC1 VALUE0110} OFF = $A0 ; TURN OFF VOLUME0120 SETVBV = $E45C ; SET TIMER VALUE ROUTINE0130 XITVBV = $E4620140 CDTMV2 = $021A ; }TIMER 20150 CDTMA2 = $0228 ; TIMER 2 VECTOR0160 ZTIMER = $0000 ; ZPAGE VBLANK TIMER VALUE0170 ;0180 START LDA #100190} STA ZTIMER0200 ; SET THE TIMER VECTOR0220 ;0230 INIT LDA #CNTINT&2550240 STA CDTMA20250 LDA #CNT}INT/2560260 STA CDTMA2+10270 ;0280 ; SET THE TIMER VALUE AFTER THE VECTOR0290 ;0300 LDY ZTIMER ; SET TIMER} TWO TO COUNT0310 JSR SETIME0320 RTS0340 ; METRONOME COUNT DOWN VECTORS TO HERE0380 ; SET UP AUDIO CHANNEL }FOR MET CLICK0400 CNTINT LDA #VOLUME0410 STA AUDC10420 LDA #FREQ0430 STA AUDF10435 LDY #$FF }; DELAY0440 DELAY DEY0442 BNE DELAY0450 STY AUDC10460 JMP INIT0480 ;0490 ; SUBROUTINE TO SET TIME}R0500 ;0520 SETIME LDX #0 ; NO TIME >256 VBLANKS0530 LDA #2 ; SET TIMER 20540 JSR SETVBV ; SYSTEM ROUTINE T}O SET TIMER0550 RTS0560 *=$2E20570 .WORD START0580 .ENDY20 *= $4000 ; ARBITRARY STARTING POINT30 FMOVE = $DDB640 FSUB = $DA6050 FTEMP = $048260 FSTOR = $DD}A770 FASC = $D8E680 INBUFF = $00F385 AFP = $D80090 CIX = $00F20100 LBUFF = $05800120 CR = $9B0130} PUTREC = $090140 GETREC = $050150 CIOV = $E4560160 ICCOM = $03420170 ICBAL = $03440180 ICBLL = $03480190 ;0200 ;} FLOATING POINT DEMONSTRATION0210 ; READS TWO NUMBERS FROM SCREEN EDITOR,0215 ; CONVERTS THEM TO FLOATING POINT,0220 ; SUB}TRACTS THE FIRST FROM THE SECOND,0225 ; STORES THE RESULT IN FTEMP,0230 ; WHICH IS A USER DEFINED FP REGISTER,0240 ; AND D}ISPLAYS THE RESULT.0260 START JSR GETNUM ; GET 1ST NUMBER FROM E:0270 JSR FMOVE ; MOVE NUMBER FROM FRO TO FR10280} JSR GETNUM ; GET 2ND NUMBER FROM E:0290 JSR FSUB ; FRO <-- FR0-FR10300 BCC NOERR ; SKIP IF NO ERROR}0340 LDA #ERRMSG&255 ; IF ERR., DISPLAY MESSAGE0350 STA ICBAL0360 LDA #ERRMSG/2560370 JMP CONT}IN0390 NOERR LDX #FTEMP&255 ; STORE RESULT IN FTEMP0400 LDY #FTEMP/2560410 JSR FSTOR0420 ;0430 ; CONVERT }NUMBER TO ATACSII STRING.0440 ; FIND END OF STRING,0445 ; CHANGE NEGATIVE NUM. TO POSITIVE,0450 ; AND ADD CARRIAGE RETURN.}0470 JSR FASC ; FP TO ATASCII, RESULT IN LBUFF0480 LDY #$FF0490 MLOOP INY0500 LDA (INBUFF),Y ; LOAD} NEXT BYTE0510 BPL MLOOP ; IF POSITIVE, CONTINUE0520 AND #$7F ; IF NOT, MASK OFF MSBIT0530 STA (INBU}FF),Y0540 INY0550 LDA #CR ; STORE CARRIAGE RETURN0560 STA (INBUFF),Y0570 ;0580 ; DISPLAY RESULT06}00 LDA INBUFF ; GET BUFFER ADDRESS0610 STA ICBAL0620 LDA INBUFF+10630 CONTIN STA ICBAL+10640 }LDA #PUTREC ; COMMAND FOR PUT RECORD0650 STA ICCOM0660 LDA #40 ; SET BUFFER LENGTH = 400670 STA ICB}LL0690 LDA #00700 STA ICBLL+10710 LDX #0 ; IOCB 0 FOR SCREEN EDITOR0720 JSR CIOV ; CALL CIO0}730 JMP START ; DO IT AGAIN0750 ; GET ATASCII STRING FROM E:0755 ; CONVERT TO FP, RESULT IN FR00780 GETNUM LDA #GE}TREC ; GET RECORD (ENDS WITH CR)0790 STA ICCOM0800 LDA #LBUFF&255 ; SET BUFFER ADDRESS = LBUFF0810 S}TA ICBAL0820 LDA #LBUFF/2560830 STA ICBAL+10840 LDA #40 ; SET BUFFER LENGTH =400850 STA ICBL}L0860 LDA #00870 STA ICBLL+10880 LDX #0 ; IOCB 0 FOR SCREEN EDITOR0890 JSR CIOV ; CALL CIO09}00 LDA #LBUFF&255 ; STORE BUFFER ADD. IN INBUFF0910 STA INBUFF0920 LDA #LBUFF/2560930 STA INBU}FF+10940 LDA #0 ; SET BUFFER INDEX = 00950 STA CIX0960 JSR AFP ; CALL ATASCII TO FP0970 RTS}0980 ERRMSG .BYTE "ERROR",CR1000 ; ROUTINE START INFO1020 * = $2E01030 .WORD START1040 .ENDu10 POKMSK = 001020 KBCODE = $D20930 VKEYBD = $020840 IRQEN = $D20E45 IRQST = IRQEN46 VMIRQ = $0216}60 *= $60080 START SEI ; DISABLE IRQS90 LDA VMIRQ ; REPLACE THE IRQ VECTOR0100 STA NBRK+1 ;WITH} OUR OWN0110 LDA VMIRQ+1 ; ALL IRQS WILL0120 STA NBRK+2 GO TO NBRK0130 LDA #IRQ&2550140 STA VMIRQ01}50 LDA #IRQ/2560160 STA VMIRQ+10170 CLI ; ENABLE IRQS0200 LDA VKEYBD ; POINT KEY IRQ TO0210 }STA JUMP+1; REP0220 LDA VKEYBD+10230 STA JUMP+20240 LDA #REP&255; VECTOR KEY IRQ0250 STA VKEYBD;} LOW BYTE OF VECTOR0260 LDA #REP/2560270 STA VKEYBD+10280 RTS0290 *=$6390300 REP LDA KBCODE ; AL}L KEY IRQS COME HERE0310 AND #$80 ; CHECK IF CONTROL HIT0320 BEQ JUMP ;IF NOT HIT THEN GO0330 PLA ; ELSE} IGNORE CONTROL KEY0340 RTI0360 JUMP JMP ; JUMP THIS CALLS THE OLD KEY IRQ0375 IRQ PHA ; ALL IRQS COME HERE0380 } LDA IRQST ; CHECK IF [BREAK]0390 BPL BREAK ; IF [BREAK] IRQ,BRANCH0405 PLA ; ELSE CALL OLD IRQ VECTOR0410} NBRK JMP NBRK ; CALL OLD IRQ VECTOR0430 BREAK LDA #$7F ; HERE IF [BREAK]0440 STA IRQST ; SHOW NO [BREAK]0450 } LDA POKMSK0460 STA IRQEN0462 PLA0464 RTI ; RETURN AS IF NO [BREAK]0470 *= $02E20480 .WORD S}TART01 ; HANDLER ADDRESS TABLE02 PRINTV = $E43003 CASETV = $E44004 EDITRV = $E40005 SCRENV = $E41006 KEYBDV = $E42}007 ;08 *= $031A09 ;10 HATABS20 .BYTE 'P' ; PRINTER30 .WORD PRINTV ; ENTRY POINT TABLE40 .BYTE } 'C' ; CASSETTE50 .WORD CASETV ; ENTRY POINT TABLE60 .BYTE 'E' ; DISPLAY EDITOR70 .WORD EDITRV ; ENTRY POIN}T TABLE80 .BYTE 'S' ; SCREEN HANDLER90 .WORD SCRENV ; ENTRY POINT TABLE0100 .BYTE 'K' ; KEYBOARD0110 .WORD} KEYBDV ; ENTRY POINT TABLE0120 .BYTE 0 ; FREE ENTRY 1 (DOS)0130 .BYTE 0,00140 .BYTE 0 ; FREE ENTRY 2 (850 MODUL}E)0150 .BYTE 0,00160 .BYTE 0 ; FREE ENTRY 30170 .BYTE 0,00180 .BYTE 0 ; FREE ENTRY 40190 .BYTE 0,00200 } .BYTE 0 ; FREE ENTRY 50210 .BYTE 0,00220 .BYTE 0 ; FREE ENTRY 60230 .BYTE 0,00240 .BYTE 0 ; FREE ENTRY 7{ *=$PRINTV .WORD PHOPEN-1 ; DEVICE OPEN .WORD PHCLOS-1 ; DEVICE CLOSE .WORD BADST-1 ; DEVICE READ-NOT IMPLEMENT}ED .WORD PHWRIT-1 ; DEVICE WRITE .WORD PHSTAT-1 ; DEVICE STATUS .WORD BADST-1 ; SPECIAL-NOT IMPLEMENTED JMP PHINIT} ; DEVICE INITIALIZATION 10 * = $60020 HATABS = $031A40 START LDY #060 LOOP LDA HATABS,Y70 CMP #0 ; FREE ENTRY?80 } BEQ FOUND90 INY0100 INY0110 INY ; POINT TO NEXT HATABS ENTRY0120 CPY #34 ; AT END }OF HATABS?0130 BNE LOOP ; NO ... CONTINUE0140 SEC ; YES... INDICATE ERROR0150 RTS0160 ;0180 FOUND} LDA #'N ; SET DEVICE NAME0190 STA HATABS,Y0200 INY0210 LDA #NULLTAB&2550220 STA HATABS,Y ;} HANDLER ADDRESS0230 INY0240 LDA #NULLTAB/2560250 STA HATABS,Y0260 RTS0270 ;0290 NULLTAB .WO}RD RTHAND-1 ; OPEN0300 .WORD RTHAND-1 ; CLOSE0310 .WORD NOFUNC-1 ; READ0320 .WORD RTH}AND-1 ; WRITE0330 .WORD RTHAND-1 ; STATUS0340 .WORD NOFUNC-1 ; SPECIAL0350 JMP RTHAN}D ; INITILIZATION0360 ;0380 RTHAND LDY #1 ; SUCCESSFUL I/O FUNCTION0400 NOFUNC RTS ; FUNCTION NOT IMPLEMENTED}05 *= $3000 ARBITRARY START10 ;THIS ROUTINE PRINTS A LINE TO THE PRINTER BY CALLING SIO E45920 SIOV = $E459 ;} SIO VECTOR30 CR = $9B ; EOL40 PRNTID = $40 ; PRINTER SERIAL BUS ID45 MODE = $4E ; NORMAL MODE50 PT}IMOT = $001C ; TIMEOUT LOCATION60 DDEVIC = $300 ; DEVICE SERIAL BUS ID70 DUNIT = $301 ; SERIAL UNIT NUMBER80} DCOMND = $302 ; SIO COMMAND90 DSTATS = $303 ; SIO DATA DIRECTION0100 DBUFLO = $304 ; BUFFER LOW ADDRESS0110 DBU}FHI = $305 ; BUFFER HIGH ADDRESS0120 DTIMLO = $306 ; SIO TIMEOUT0130 DTIMHI = $3070140 DBYTLO = $308 ; BUFFER LENGT}H0150 DBYTHI = $3090160 DAUX1 = $30A ; AUXILARY BYTE---PRINTER MODE0170 DAUX2 = $30B ; AUXILARY BYTE---NOT USED 01}80 ;0190 MESS .BYTE "EXAMPLE 12",CR0200 ;0220 LDA #PRNTID ; SET BUS ID0230 STA DDEVIC 0240 LD}A #1 ; SET UNIT NUMBER0250 STA DUNIT0260 LDA #MODE0270 STA DAUX1 ; PRINTER MODE NORMAL0275 } LDA #10280 STA DAUX2 ; UNUSED0290 STA DTIMHI ; TIMEOUT<256 SECS0300 LDA PTIMOT ; SET SIO TI}MEOUT FOR PRINTER0310 STA DTIMLO0320 LDA #MESS&2550330 STA DBUFLO ; SET MESS AS BUFFER0340 } LDA #MESS/2560350 STA DBUFHI0360 LDA #$80 ; SET SIO DATA DIRECTION FOR0370 STA DSTATS ; P}ERIPHERAL TO RECEIVE0380 LDA #'W ; SIO COMMAND WRITE0390 STA DCOMND0410 JSR SIOV ; CALL SIO042}0 BMI ERROR0430 GOOD BRK0440 ERROR BRK9QR,FILECIOCMSTADERROIOCBIOCICCOICSTICBAICBAICBLICBLAUXTEMLOHIGBYTE@A6}@ A4A5 A6 A7 A@ AA @44THIS }PROGRAM LOADS PAGE 6 FROM THE FILE D:TESTd);@ ,;@,)6.hhh*LVdj..CIO$ IS PLA,PLA,PLA,TAX,JMP $E456 (CI}OV)n6.D:TEST- *FILE NAMEx%6-@6-A6% B("@%(TRANSFER COMPLETE(&GG(ERROR }#  OCCURRED AT LINE # F:A,%AV$F:A,,_ CIO SETUP SUBROUTINE60u1u2u88THIS ROUTI}NE LOADS OR SAVES MEMORY FILE FROM BASIC3u44BY SETTING UP AN IOCB AND CALLING CIO DIRECTLY4u6u&&ON ENTRY CMD=7 MEANS }LOAD MEMORY8u_CMD=11 MEANS SAVE MEMORY9u00_STADR= THE ADDRESS TO LOAD OR SAVE MEMORY:u11_BYTES= THE NUMBER OF BYTES T}O SAVE OR LOAD;u_IOCB= THE IOCB TO USEu..ON EXIT ERROR=1 MEANS SUCCESSFUL CO}MMANDBu((_ERROR<>1 THEN ITS AN ERROR STATUSCuDu_ *** IOCB EQUATES ***FuHu-6-$@6-A4%-6-A5}%Ju6-A6%6-A7%Lu6-A@%6-AA%MuNu'6-@"@'6-@Su B }Xu 6- Bu u 6- Bu u 6-?:C:,<,u 6-F:,$ }u\v99_ ***ROUTINE RETURNS HIGH,LOW BYTE OF 16 BIT NUMBERv$w*6-P:'AV,'6-P:&$AV,*$Vww55***T }RAP HERE IF ERROR OCCURS DURING ROUTINE****x6-F:A,x  $ D:CH8PRG7.BAS^30 REM THIS PROGRAM LOADS PAGE 6 FROM THE FILE D:TEST100 DIM FILE$(20),CIO$(7):CIO$="hhh*LVd"106 REM CIO$ IS PLA,PLA,PLA,TA }X,JMP $E456 (CIOV)110 FILE$="D:TEST":REM - *FILE NAME120 CMD=7:STADR=1536:GOSUB 30000130 IF ERROR=1 THEN ? "TRANSFER COMPL}ETE":STOP 135 ? "ERROR # ";ERROR;" OCCURRED AT LINE # ";PEEK(186)+256*PEEK(187)200 END 300 REM _ CIO SETUP SUBROUTINE310 }REM 30000 REM 30001 REM 30002 REM THIS ROUTINE LOADS OR SAVES MEMORY FILE FROM BASIC30003 REM BY SETTING UP AN IOCB AND C}ALLING CIO DIRECTLY30004 REM 30006 REM ON ENTRY CMD=7 MEANS LOAD MEMORY30008 REM _CMD=11 MEANS SAVE MEMORY30009 REM _STAD}R= THE ADDRESS TO LOAD OR SAVE MEMORY30010 REM _BYTES= THE NUMBER OF BYTES TO SAVE OR LOAD30011 REM _IOCB= THE IOCB TO USE}30012 REM _FILE$= DESTINATION FILE NAME30013 REM _30014 REM ON EXIT ERROR=1 MEANS SUCCESSFUL COMMAND30018 REM _ERROR<>1 TH}EN ITS AN ERROR STATUS30019 REM 30020 REM _ *** IOCB EQUATES ***30022 REM 30024 IOCBX=IOCB*16:ICCOM=834+IOCBX:ICSTA=835+I}OCBX30026 ICBAL=836+IOCBX:ICBAH=837+IOCBX30028 ICBLL=840+IOCBX:ICBLH=841+IOCBX30029 REM 30030 AUX1=4:IF CMD=11 THEN AUX1=}830035 TRAP 30900:OPEN #IOCB,AUX1,0,FILE$30040 TEMP=STADR:GOSUB 3050030090 POKE ICBAL,LOW:POKE ICBAH,HIGH30100 TEMP=BYTES}:GOSUB 3050030130 POKE ICBLL,LOW:POKE ICBLH,HIGH30140 POKE ICCOM,CMD:ERROR=USR(ADR(CIO$),IOCBX)30150 ERROR=PEEK(ICSTA):RET}URN 30200 REM 30300 REM _ ***ROUTINE RETURNS HIGH,LOW BYTE OF 16 BIT NUMBER30400 REM 30500 HIGH=INT(TEMP/256):LOW=INT(TEM}P-HIGH*256):RETURN 30550 REM 30600 REM ***TRAP HERE IF ERROR OCCURS DURING ROUTINE****30900 ERROR=PEEK(195)30920 CLOSE #I}OCB:RETURN 23HOUMISECMHIGMELOCLOCKTIMISEIMIIHOU@ @X@@A6A7A8}&2A @r @X @ @9@AR@) (+)CLEAR SCREEN (+=ESC-CTRL-}CLR)1 (HOUR(MINUTE!-(SECOND16-@ @E#(+::( #( 6-@} @E &(:: & @ ++THIS IS A DEMO OF THE REAL TIME CLOCKHHTHIS ROUTINE ACCEPTS AN I}NITIAL TIME IN HOURS,MINUTES, AND SECONDS))IT SETS THE REAL TIME CLOCK TO ZERO(IITHE CURRENT VALUE OF RTCLOCK IS USED }TO ADD THE INITIAL TIME TO GET*##THE CURRENT TIME HOUR,MIN,SEC-'6-A66-A7'6-A82<$$******ENT }RY POINT****** 65 REMFAA_`****INITIALIZE CLOCK*****ad9@ '@!}9@i;@P,j 6. k An 6-6-6-$*******READ CLOCK*****ȥ"}6-?:C:,,666-++++F:,$AV,%F:,,$AV,%F:,,'@Y34&6-P:'A6,&6-&+$A6,)6-P:'@#}`,)6-P:&+$@`,,3 6-%!@`%6-&@`36-%@3 6-%!@`%6-&@`36-%@$} 6-% 6-&+P:'@$,,$@$$,0-@@8")67<,.>:,- 0$6++104,165,18,141,0,6%},165,19,141,1,6,165@''20,141,2,6,165,18,205,0,6,208,234J66165,19,205,1,6,208,227,165,20,205,2,6,208,220,96D1:CH&}8PRG8.BAS 1 POKE 752,13 ? "+":REM CLEAR SCREEN (+=ESC-CTRL-CLR)4 ? "HOUR";:INPUT HOUR:? "MINUTE";:INPUT MIN:? "SECOND";:INPUT SEC5 C(}MD=1:GOSUB 456 ? "+";HOUR;":";MIN;":";SEC:? " ":? " "7 CMD=2:GOSUB 459 ? "";HOUR;":";MIN;":";SEC;" ":GOTO 710 REM THIS )}IS A DEMO OF THE REAL TIME CLOCK20 REM THIS ROUTINE ACCEPTS AN INITIAL TIME IN HOURS,MINUTES, AND SECONDS30 REM IT SETS THE*} REAL TIME CLOCK TO ZERO40 REM THE CURRENT VALUE OF RTCLOCK IS USED TO ADD THE INITIAL TIME TO GET42 REM THE CURRENT TIME H+}OUR,MIN,SEC45 HIGH=1536:MED=1537:LOW=153850 REM 60 REM ******ENTRY POINT****** 65 REM70 ON CMD GOTO 100,20095 REM 96 RE,}M ****INITIALIZE CLOCK*****97 REM 100 POKE 20,0:POKE 19,0:POKE 18,0105 DIM CLOCK$(50)106 CLOCK$=" "107 GOSUB 300110 IHO-}UR=HOUR:IMIN=MIN:ISEC=SEC:RETURN 197 REM 198 REM *******READ CLOCK*****199 REM 200 REM 201 A=USR(ADR(CLOCK$))210 TIME=(.}(((PEEK(HIGH)*256)+PEEK(MED))*256)+PEEK(LOW))/59.923334220 HOUR=INT(TIME/3600):TIME=TIME-(HOUR*3600)230 MIN=INT(TIME/60):SE/}C=INT(TIME-(MIN*60))235 SEC=SEC+ISEC:IF SEC>60 THEN SEC=SEC-60:MIN=MIN+1236 MIN=MIN+IMIN:IF MIN>60 THEN MIN=MIN-60:HOUR=HOU0}R+1237 HOUR=HOUR+IHOUR240 HOUR=HOUR-(INT(HOUR/24))*24250 RETURN 300 FOR J=1 TO 38:READ Z:CLOCK$(J,J)=CHR$(Z):NEXT J:RETUR1}N 310 DATA 104,165,18,141,0,6,165,19,141,1,6,165320 DATA 20,141,2,6,165,18,205,0,6,208,234330 DATA 165,19,205,1,6,208,227,2}165,20,205,2,6,208,220,96%r@@@@THIS IS A BASIC PROGRAM TO CONTROL THE RATE OF A METRONOME4} }CLEAR SCREEN (6-@(INITIAL VALUE FOR RATE1-@@ 1SOFTWARE DELAY LOOP2JR:5},"@&6-%@JSTICK FORWARD MEANS SPEED UP RATE3MR:,"@&6-&@MSTICK BACK MEANS SLOW6} METRONOME RATE40 @6-@0NEVER GO BELOW ONE5*!AU6-AU*OR ABOVE 2556PRINT BEATS/MI7}NUTE8,,(P:A6', BEATS/MINUTES <33LOCATION $0000 HOLDS THE RATE FORF( (THE FOLLOWING AS8}SEMBLY ROUTINE D:CH8PRG9.BAS$1 REM THIS IS A BASIC PROGRAM TO CONTROL THE RATE OF A METRONOME2 REM 3 REM 5 PRINT "}":REM CLEAR SCREEN10 X=10:REM INITI:}AL VALUE FOR RATE20 FOR J=1 TO 10:NEXT J:REM SOFTWARE DELAY LOOP50 IF STICK(0)=14 THEN X=X+1:REM STICK FORWARD MEANS SPEED ;}UP RATE51 IF STICK(0)=13 THEN X=X-1:REM STICK BACK MEANS SLOW METRONOME RATE52 IF X<1 THEN X=1:REM NEVER GO BELOW ONE53 IF<} X>255 THEN X=255:REM OR ABOVE 25554 REM PRINT BEATS/MINUTE56 ? "";INT(3600/X);" BEATS/MINUTES "60 POKE 0,X:REM LOCAT=}ION $0000 HOLDS THE RATE FOR70 NEXT I:REM THE FOLLOWING ASSEMBLY ROUTINEJ[CMINDEXSEBYTRECORD@EETHIS ROUTINE CR?}EATES AND ACCESSES RANDOM ACCESS FILES FOR FIXEDLENGTH RECORDS... COMMANDS ARECMD=1 WRITE NTH RECOR@}DCMD=2 READ NTH RECORDCMD=3 UPDATE NTH RECORD((RECORD$ IS THE INPUT/OUTPUT RECORDN IS THE RECOA}RD NUMBER==INDEX IS A TWO DIMENSIONAL ARRAY DIM'ED INDEX(1,RECNUM)11INDEX HOLDS THE NOTE VALUES FOR ALL RECORDSBBB}THIS ROUTINE ASSUMES LOGICAL FILE #1 HAS BEEN OPENED FOR I/OL`ROUTINE BEGINS AT 1200jA A0C}A@""............................4WRITE NTH RECORD@68<,-68<,-` (@$D} ""............................ READ NTH RECORD  6-8<,6-8<, @ @ $E}""............................UPDATE NTH RECORD6-8<,6-8<,@(@F}$ D:CH9PRG1.BAS1000 REM THIS ROUTINE CREATES AND ACCESSES RANDOM ACCESS FILES FOR FIXED1001 REM LENGTH RECORDS1002 REM 1003 REM ... COMMAH}NDS ARE1004 REM CMD=1 WRITE NTH RECORD1005 REM CMD=2 READ NTH RECORD1006 REM CMD=3 UPDATE NTH RECORD1007 REM 1008 RI}EM RECORD$ IS THE INPUT/OUTPUT RECORD1009 REM N IS THE RECORD NUMBER1010 REM INDEX IS A TWO DIMENSIONAL ARRAY DIM'ED INDEX(J}1,RECNUM)1015 REM INDEX HOLDS THE NOTE VALUES FOR ALL RECORDS1020 REM THIS ROUTINE ASSUMES LOGICAL FILE #1 HAS BEEN OPENED K}FOR I/O1100 REM 1120 REM ROUTINE BEGINS AT 12001130 REM 1200 ON CMD GOTO 2000,3000,40002000 REM ........................L}....2100 REM WRITE NTH RECORD2200 NOTE #1,X,Y2300 INDEX(SEC,N)=X:INDEX(BYTE,N)=Y2400 ? #1;RECORD$:RETURN 3000 REM ......M}......................3010 REM READ NTH RECORD3020 REM 3030 X=INDEX(SEC,N):Y=INDEX(BYTE,N)3040 POINT #1,X,Y3050 INPUT #1N};RECORD$3060 RETURN 4000 REM ............................4010 REM UPDATE NTH RECORD4020 REM 4040 X=INDEX(SEC,N):Y=INDEX(O}BYTE,N)4050 POINT #1,X,Y4060 ? #1;RECORD$4070 RETURN 9IN 33PROGRAM "FROG" TO DEMONSTRATE SYNCHRONIZATION33OF AUDIO WITH DIGITAL FORQ} THE CASSETTE SYSTEM(;@ ,2%B@@R%TURN ON MOTOR< +@F[* @THE PRINCESS ANDR} THE FROG: @[SET UP THE SCREEN FOR EVENT 2.PD ADCHECK SYNC MARK, MAKE SURE THE INTRODUCTION IS SAIDS}.d/ -! @ YOUR NAME?/FOR EVENT 4i AEVENT 5n1B@@`1STOP MOTOR FOR USER INPUTx"T}"WAIT FOR THE USER'S NAMEB@@R, @>:A%,,CLEAR THE SCREEND - @& @U}DDISPLAY SCREEN FOR EVENT 109 A9MAKE SURE SPEECH FOR EVENT 10 IS FINISHED( @(READY FORV} EVENT 12g9P:F:B7u,'@2%?P,"P:F:B7u,'@2,<$gCHECK THE 5TH BIT OF EACH INCOMING BYTE.00IF IT IW}S "0" THEN THE SYNC SPACE IS FOUND. A D:CHCPRG1.BASF10 REM PROGRAM "FROG" TO DEMONSTRATE SYNCHRONIZATION20 REM OF AUDIO WITH DIGITAL FOR THE CASSETTE SYSTEM30 REM 40 DIM IN$(Y}20)50 POKE 54018,52:REM TURN ON MOTOR60 GRAPHICS 170 PRINT #6;"THE PRINCESS AND THE FROG":PRINT #6;,,,,:REM SET UP THE SCRZ}EEN FOR EVENT 2.80 GOSUB 1000:REM CHECK SYNC MARK, MAKE SURE THE INTRODUCTION IS SAID.100 POSITION X,Y:PRINT #6;"YOUR NAME?[}":REM FOR EVENT 4105 GOSUB 1000:REM EVENT 5110 POKE 54018,60:REM STOP MOTOR FOR USER INPUT120 INPUT IN$:REM WAIT FOR THE U\}SER'S NAME130 POKE 54018,52135 PRINT #6,CHR$(125):REM CLEAR THE SCREEN140 POSITION X,Y:PRINT #6;IN$:PRINT #6;,,,,:REM DISP]}LAY SCREEN FOR EVENT 10150 GOSUB 1000:REM MAKE SURE SPEECH FOR EVENT 10 IS FINISHED160 PRINT #6;,,,,:REM READY FOR EVENT 12^}1000 IF INT(PEEK(53775)/32+0.5)=INT(PEEK(53775)/32) THEN RETURN :REM CHECK THE 5TH BIT OF EACH INCOMING BYTE.1005 REM IF IT_} IS "0" THEN THE SYNC SPACE IS FOUND.1010 GOTO 10005KMbICONSOLCASIB7`B2yB@@  PUSH "START" CONSOL KEY TO%%a}ADD THE SYNC MARK ONTO THE TAPE(2'6-B7`6-B2y'6-B@d-@n"%xb} }55THE FOR LOOP SETS THE AUDIO FREQUENCY & CHANNEL5,160,7,160,5,160,7,160,0**I/O IS SETUP; NOW START THc}E CASSETTE@R@8F:,"@A08CONSOLE=7 MEANS WRITE MARK,=%@@! Ad}=CONSOLER KEYS NOT PRESSEDF%@A(%@) AFIF CONSOLE=7 WRITE "SPACE" D:CHCPRG2.BAS|10 REM PUSH "START" CONSOL KEY TO20 REM ADD THE SYNC MARK ONTO THE TAPE30 REM 40 REM 50 IO=53760:CONSOLE=53279:CASS=54018f}100 FOR I=0 TO 8110 READ J:POKE IO+I,J120 NEXT I125 REM THE FOR LOOP SETS THE AUDIO FREQUENCY & CHANNEL130 DATA 5,160,7,g}160,5,160,7,160,0140 REM 150 REM I/O IS SETUP; NOW START THE CASSETTE160 POKE CASS,52200 POKE CONSOLE,8210 IF PEEK(CONSOq}UBCH10PRG1BASBCH10PRG1LSTBCH10PRG2BASB CH10PRG2LSTB CH10PRG3BASBCH10PRG3LSTBCH3PRG1 BASBCH3PRG1 LSTB CH4PRG1 BASB (CH4PRG1 LSTB 4CH4PRG2 BASB=CH4PRG2 LSTBECH4PRG3 BASBLCH4PRG3 LSTBRCH5PRG1 LSTBVCH5PRG1 BASBZCH5PRG2 BASB_CH5PRG2 LSTBcCH6PRG1 BASBgCH6PRG1 LSTBjCH6PRG2 BASBnCH6PRG2 LSTBrCH6PRG3 BASBzCH6PRG3 LSTBCH6PRG4 BASBCH6PRG4 LSTBCH7PRG1 BASBCH7PRG1 LSTBCH7PRG2 BASBCH7PRG2 LSTB CH7PRG3 SRCB CH8PRG1 SRCB CH8PRG10SRCBCH8PRG11SRCB CH8PRG2 SRCBCH8PRG3 SRCBCH8PRG4 SRCBCH8PRG5 SRCB CH8PRG6 SRCB CH8PRG7 BASB CH8PRG7 LSTB CH8PRG8 BASB 'CH8PRG8 LSTB3CH8PRG9 BASB9CH8PRG9 LSTB >CH9PRG1 BASB GCH9PRG1 LSTBPCHCPRG1 BASBXCHCPRG1 LSTB`CHCPRG2 BASBeCHCPRG2 LSTBsCHDPRG1 BASBxCHDPRG1 LSTLE)=7 THEN 230:REM CONSOLE=7 MEANS WRITE MARK,220 POKE IO+15,11:GOTO 200:REM CONSOLER KEYS NOT PRESSED230 POKE IO+15,128+11r}:GOTO 200:REM IF CONSOLE=7 WRITE "SPACE") @ C +@@@1ACA @1 @,t}@@1/@@p',@@@'/@@@p(1 @,@ @1/@ @p2'u},@A@'/@A@p<1 @,@0@1/@0@pF!-@!AeP;,$v}@%%@`@;/$@%%@`@pZ;/$@%%@@@p;-$@%%@@@d++@w}@@S:n  D:CHDPRG1.BAS810 GRAPHICS 8:POKE 87,7:POKE 710,0:POKE 709,1420 COLOR 1:PLOT 10,5:DRAWTO 10,7030 PLOT 40,5:DRAWTO 40,7040 COLOR 2:PLOT 20y},5:DRAWTO 20,7050 PLOT 41,5:DRAWTO 41,7060 COLOR 3:PLOT 30,5:DRAWTO 30,7070 FOR X=I TO 3:COLOR X:POKE 765,X80 PLOT X*25+6z}0,5:DRAWTO X*25+60,7090 DRAWTO X*25+40,70:POSITION X*25+40,5100 XIO 18,#6,12,0,"S:"110 NEXT Xa