@L|}6CD l0C)HCC WhL/h `CmCDiD`  R@W1  Y0@R !L` D  C D     )16CS S)  C)D1 p p 0 C9DI pCDL~CiCDiD` D  C D     )16CS S)  C)D1 p p }0 C9DI pCDL~CiCDiD` DD˙` d J)L !}D L(( LL()  L| L( S LH 0p n  } CY?  q  L L  ` )} `A! d߰")-݆ "  $G@LLL&") $G% }H0 3S8`G ȱG ȱG   Gȭ Gȭ GG}GHiH8(()) G$H% `(0 })8` d)L ݆  LGȘ ݆LL d  ! LL d)N>Q  HH) }  hyhyB q L> Lm JJ  Ln*` dB%' }8  H H` 1 { LL   !L     Hh SY?  q  1L }  !? S   q 1 L   Ll  Lg E`L   !L)  q 1L}) `L0AM݊L݉ ML  N݆LLLNLMLHG!@}1F GȱGLLEEȩÑEȑEEȑE Ed E7EȩE  q} L !,0,0SGɛ L 1 !L EHEh W G gLLSROTCES EERF } G) *Gȩ GȽG GȌd q q G`  8   0G  `D}CEDC0X:Ȣ Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`Y}`piH n0)բY? 08`0 }  0$L GGȽG L `8L`L}8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`}E8FEh( l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTE} H8EEȱEEȩEh J E8   . m  i`LI!)E1FR}1LJ舩9GIH`LJJ`HGHh l`} S gL   8 rii `дCDCG W  }C  Lq` X٨`DOS SYS IIIIIIIIIIIIIIIC`0 ߩ0}} } HE |||DDOS DOSDOS SYS }}}}CDOS SYSB*+DUP SYSB-UMEM SAVBgTAPEPROGSRCBDISKREL SRCBrDISKPROGSRCBTAPEPROGOBJB:DCHANGE} BAS 0`BDELV !B }`LVUQ   ]   TU J ]L!T  #      TU  } L ? .  t`GBJ V~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI   0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DELV䌚 !B y`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J V (` 9 V⪍ ઍ  -'}LLu DEHILV 9 .l 9 .l  `` s$B VBH(}I|DE V BLV nB,DE J V* \*` B V BLVDEHI BLVL)}1u H232435; 1 ;  hh@2 e1i1LHҍ 00) 08 109hh@ Ҡ2e*}1i1232435ޥ<<8} 3E:}DISK OPERATING SYSTEM II VERSION 2.0SCOPYRIGHT 1980 ATARIA. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDGE J. D,}UPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRESSF. LOCK F-}ILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES9!&x#!7&p))'&X*./)L''-؆莟.}R'S  vW DEHHI 1A#! @ ~0ɛ8A0.) ȅ 1 1i/}il ! 1L NO SUCH ITEMSELECT ITEM OR FOR MENU! 0 .{z:*{}.|~ 1 0 00}JB 18L^%|DLl%DIRECTORY--SEARCH SPEC,LIST FILE? # 0 0 n&|D! 1L NOT A DISK FILE1}N !B 1L " 1 !BDED:}:1BJ|DE 1DEBH2}I 1 h0ߢ 0.  0?詛 1 ~0YЛ 1 "L<" "L 3} BL1TYPE "Y" TO DELETE...DELETE FILE SPECCOPY--FROM, TO?OPTION NOT ALLOWED COPYING---DN:4}# 0|D .L$A#B#C#JB|DE 1BHIDD#E 1D#0: B5} 1L B#C#C#B# B 1N#$0SYS1}:e#D# d# D# .d#ȽD# d# 𩛙d#X# 1,A#6}PdD#ELO- A.BJdD#E 1 1HH 0hh|DL^%1}:e# Lt% e#dD#EL%7} 1 0 . .0% 1L WILD CARDS NOT ALLOWED IN DESTINATION 0 A.|K@C}//3Hu ξL/L DRIVE TO WRITE DOS FILES TO?WRITING NEW DOS FILESTYPE "Y" TO WRITE DOS TO DRIVE 1.?}D1:DOS.SYSERROR - NOT VERSION 2 FORMAT. , &* բ( 1L `[) 0NΞ 0 L1M) 1@} L BAD LOAD FILELOAD FROM WHAT FILE?) 0 0#B 1L WHAT FILE TO LOCK?) 0 0$B 1L WHAT FILE TO UNLOCK?DUA}P DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO USE PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV. h  ,B}  `)  <0 2 2 0  ,   ,,ޢ* 1L ,K* 1 ~0 0C}FINSERT BOTH DISKS, TYPE RETURNERROR - DRIVES INCOMPATIBLE., 1 ~038  , 1L D}, &*  Lz+, 0 , 1 ~0 + Y,0!,0 ,L+ ,mm  v,"ǭE}0Ξ, 05,Lt+L +,Hh` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNF}INSERT DESTINATION DISK,TYPE RETURN`    `L,8,0( rG}L1(`ߢ) 1* 1 ~0Y`hhL S SL1) 8`NAME OF FILE TO MOVE?- 0 0|DLtH}% A., 1 <0 0 .@L# .BJ 1  DEHIB V L1 ,5 1 <0,L. I} JB|,A#Pd#DE 1 HI BDEHHII 1 B 1 , 1 <0,0Lf- B VJ},A#P, 1 <0 0L#L ߢ) 1* 1 ~0Yj383}mm ݭK}}`8}``|* ? ɛ,`|:(|/ 1L `DESTINATION CANT L}BE DOS.SYS0 0H{ $22Δ $28/L /) $2 Π $2 0 ξM}hAΞB,0 J 1 BޝDEHI,HDE 1HIHIDELSAVE-N}GIVE FILE,START,END(,INIT,RUN)O X0 1`BDEPHI V` X0H 1 L O}0 0 1L0`PLEASE TYPE 1 LETTER,0`hhL <0 1L0LA1 ,;ɛ7,"ɛ:ݦ1ݥP}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{Q}NAME TOO LONG B VL ` L1I H1EӝDL1|mDiE` V0`8d/8 i:"2!22 1R} L ERROR- 128ɛ+,' 20*.. өw2 1``2TOO MANY DIGITSINVALIDS} HEXADECIMAL PARAMETER800 0 8 00`,0'D800H,ɛh`2L1NEED D1 THRU D4uT} HEXADECIMAL PARAMETER800 0 8 00`,0'D800H,ɛh`2L1NEED D1 THRU D4uLyHHحiUiVhh,FGX`E: S: 3=,3 Q%&`*) ` &&&` Q%& &, $*&x&&& X&[}& &WLi%A`&&)`!&)0 6&ɛ&)@ `!  ) }`&&) \}$ $) & &0!&- %}&&&& ݢ&` $&WLi%& %x}&&&& %&&&0  ]}Ҡ&X` Q%&)`&`Xx #%,H-H&,&-,&h-h,8&&& 3%X!&JJ)#& $)! ^}&& $!&)0 &` $  }&` Q%&&&&' @S i%& `&_}` Q%") J %H%H``&0`,&p`J`JJO* ()$&e(&%&e)&#` %i&%i&&i&&i`}& D%!&)&& &&  @X i%`xsҭ&Ҡ&҈ &% & &$a}&!&)  ҅&&X6&0`)`&" #! $B ]%A ]% $+&!&*` `Rb}&%ii& 1"`L,l&Hҥh@؊HH,H-H&,&- Ҡ,ҍ I)&&&hc}-h, 3% #% 3%&& & %hhh@؊HH&&ݞ&&) %}&& Ҽ& %&&)й %i d}i&& @`JJ`=&&I%*&&`&)&`Ș `8 `&&`&ݸ&`&ݷ&` %i #% &&e}&&`!`hh`* + PLY 3 l!{ "d"L#~####"!$$$f}g}h}R.i}j}.k}l}m}n}o}p}q}r}s}t}u}v}w}x}y}z}{}|}}}~}}}}HحiUiVhh,FGX`E: S: 3=,3104500 BCS GOTIT ; = key pressed4510 LDA PADDL4,Y ;C }heck 2nd col.4520 CMP #10 ; with paddles4530 LDA #2 ; 4&6. Val>104540 BCS GOTIT ; = key pressed }4550 LDA STRIG2,X ;Check 3rd col.4560 BNE LOOPEND ; w/STRIG 2,3.4570 LDA #3 ; 0 = keypress.4580 ;4590 };Have a key--register in P1,P24600 ;4610 GOTIT4620 CLC ;A = column(1-3)4630 ADC TEMP ;TEMP = 3 * row4 }640 STA P1,X ; + col=>(1-12)4650 ;4660 ;Decrement X,Y and loop for 2nd4670 ; keypad4680 ;4690 LOOPEND4700 DE }Y4710 DEY4720 DEX4730 BPL LOOP4740 ;4750 ;Keypads read for this row--4760 ; now exit unless all rows read4770 ;47 }80 LDA STAGE ;Return unless4790 CMP #3 ; all 4 rows4800 BNE EXIT ; were tested4810 ;4820 ;Loop fo }r numeric/control pads4830 ;4840 LDA #$FF ;Set TEMPCH to4850 STA TEMPCH ; 'null' key.4860 ;4870 LDY #1 } ;Start w/numeric4880 KLOOP4890 LDX P1,Y ;Get the key on4900 LDA NUMBER,X ; that keypad4910 CPY #1 } ; that was4920 BEQ KEYIN ; pressed4930 LDA CONTROL,X ; (if any)4940 ;4950 KEYIN4960 CMP #$FF ;Exit i }f no key4970 BEQ EXITK ; was pressed4980 CMP LAST,Y ;Different keys4990 BNE NEWKEY ; accepted imm.5000 } LDX DEBNCE,Y ;Ignore if not5010 BNE EXITK ; debounced.5020 CMP LASTIN,Y ;Treat as new5030 BNE NEWKEY ; }if not held.5040 LDX REPEAT,Y ;If repeat time5050 BNE EXITK ; is up, repeat5060 JMP STOREIT ; key.5070 NEW }KEY5080 STA LAST,Y ;Last keypress5090 PHA5100 LDA #8 ;Set debounce5110 STA DEBNCE,Y5120 LDA #30 };Init. repeat5130 STA REPEAT,Y ; delay 1/2 sec5140 PLA5150 STOREIT5160 STA KPRESS,Y ;Store keypress5170 LDX KBF }LAG,Y ; in TEMPCH if5180 BEQ EXITK ; the keypad5190 STA TEMPCH ; is enabled.5200 EXITK5210 STA LASTIN,Y } ;Set last READ5220 DEY ;Branch back for5230 BPL KLOOP ; CONTROL keyp.5240 ;5250 ;Now store TEMPCH in } CH5260 ;5270 LDA CH ;Exit if key on5280 CMP #$FF ; main keyboard5290 BNE EXIT ; pressed.5300 }LDA GAME ;Exit if game5310 BNE EXIT ; flag is set5320 LDA TEMPCH ;Put character5330 STA CH ; }in CH.5340 ;5350 EXIT5360 LDX STAGE ;Bump counter to5370 INX ; next VBLANK5380 TXA ; sta }ge.5390 AND #35400 STA STAGE5410 BNE CONT1 ;Are we in stage5420 LDA #0 ; 3? If so,5430 STA P1 } ; reset keyb.5440 STA P2 ; pointers5450 CONT15460 LDX #15470 CONT1A5480 LDA DEBNCE,X ;Debounce timer54 }90 BEQ CONT2 ; decremented5500 DEC DEBNCE,X ; if not zero5510 CONT25520 LDA REPEAT,X ;Repeat timer5530 BEQ } CONT3 ; decremented5540 DEC REPEAT,X ; if not zero5550 CONT35560 DEX5570 BPL CONT1A5580 JMP (THRU)5590 ; }5600 ;Data section5610 ;5620 STROBE .BYTE 238,221,187,1195630 ;5640 ;CONTROL keys--internal codes for (null,+,up,down,-,l }eft,right,*,DC,IC,/,^,RET)5650 ;5660 CONTROL .BYTE $FF,$06,$8E,$8F5670 .BYTE $0E,$86,$875680 .BYTE $07,$B4,$B75690 .B }YTE $26,$47,$0C5700 ;5710 ;NUMERIC keys--internal codes for (null,7,8,9,4,5,6,1,2,3,0,",",".")5720 ;5730 NUMBER .BYTE $FF },$33,$35,$305740 .BYTE $18,$1D,$1B5750 .BYTE $1F,$1E,$1A5760 .BYTE $32,$22,$205770 DEBNCE .BYTE $00 ;Debounce5780 } .BYTE $005790 LAST .BYTE $FF ;Last READ5800 .BYTE $FF5810 LASTIN .BYTE $FF ;Last KEY5820 .BY }TE $FF5830 REPEAT .BYTE $00 ;Auto-repeat5840 .BYTE $005850 TEMPCH .BYTE $FF ;New CH val.5860 P1 .BYTE $0 }0 ;==>CONTROL5870 P2 .BYTE $00 ;==>NUMBER5880 STAGE .BYTE $00 ;Row counter5890 TEMP .BYTE $00 ;Row offs }et5900 TEMP2 .BYTE $00 ;Temp. stor.5910 THRU .BYTE 0,0 ;Exit vector5920 ;5930 END = *5940 .END00 ;Row offs n1000 ;KEYPAD CONTROLLER--REVISION 2.01010 ;1020 ;This revision: May 21, 19821030 ;1040 ;1050 ;CONTROL--Press } and a1060 ; digit from to to slow1070 ; down or speed up listings1080 ;1090 ;(c) Thomas D. Newton, 11/7/1981110}0 ;1110 ;1120 ;Operating System equates1130 ;1140 ATRACT = $004D ;TV prot. timer1150 KBCODE = $D209 ;POKEY KB reg.116}0 KEYDEL = $02F1 ;Debounce timer1170 SRTIMR = $022B ;Repeat timer1180 CH = $02FC ;Keyboard FIFO1190 CH1 = $02F2 } ;Last keypress1200 SSFLAG = $02FF ;Start/stop flag1210 ICPTL = $0346 ;Put character1220 ICPTH = $0347 ; vector12}30 VVBLKD = $0224 ;VBLANK vector1240 VKEYBD = $0208 ;Keyboard vector1250 MEMLO = $02E7 ;Memory start1260 HATABS = $031}A ;Device Table1270 DOSVEC = $000A ;DOS util vect.1280 DOSINI = $000C ;DOS init vect.1290 ;1300 POINT = $E0 ;Zero-}page ptr1310 ;1320 ;1330 ;Use $8000 for the starting1340 ;address because it is easily1350 ;cancelled out when the relo-}1360 ;cation is done.1370 ;1380 START = $8000 ;Low memory here1390 *= START1400 ;1410 ;1420 INIT1430 1440 L1 = *}+11450 H1 = *+21460 1470 LDA RES ;Check which1480 BNE WSTART ; init.....1490 ;1500 LDA DOSINI ;If c}old start,1510 1520 L2 = *+11530 H2 = *+21540 1550 STA JSRVEC ; set vector in1560 LDA DOSINI+1 ; init. prog} to1570 1580 L3 = *+11590 H3 = *+21600 1610 STA JSRVEC+1 ; point to DOS.1620 ;1630 LDA VVBLKD ;Also save th}e1640 1650 L4 = *+11660 H4 = *+21670 1680 STA THRU ; VVBLKD vector1690 LDA VVBLKD+1 ; that was in1700 }1710 L5 = *+11720 H5 = *+21730 1740 STA THRU+1 ; place at LOAD1750 ;1760 LDA VKEYBD ;Also save the1770 17}80 L5A = *+11790 H5A = *+21800 1810 STA KBSAVE ; keyboard IRQ1820 LDA VKEYBD+1 ; vector (so it1830 1840 L5B} = *+11850 H5B = *+21860 1870 STA KBSAVE+1 ; can be rest.)1880 ;1890 LDA DOSVEC ;Save addr of1900 1910 L5C }= *+11920 H5C = *+21930 1940 STA DOSSAV ; disk utility1950 LDA DOSVEC+1 ; package (it1960 1970 L5D = *+119}80 H5D = *+21990 2000 STA DOSSAV+1 ; will be used)2010 ;2020 LDA #$FF ;Set warm start2030 2040 L6 = *+120}50 H6 = *+22060 2070 STA RES ; flag2080 2090 L7 = *+12100 H7 = *+22110 2120 JMP WSTART22130 ;2140 WSTAR}T2150 JSRVEC = *+12160 JSR *-* ;Repl. w/DOS adr2170 ;2180 WSTART22190 SEI ;Disable IRQs2200 2210 }L8 = *+12220 2230 LDA #INIT&$FF ;Set DOSINI to2240 STA DOSINI ; point to this2250 2260 H8 = *+12270 2280 L}DA #INIT/256 ; init. routine2290 STA DOSINI+12300 ;2310 2320 L9 = *+12330 2340 LDA #END&$FF ;Reserve memory235}0 STA MEMLO ; again so that2360 2370 H9 = *+12380 2390 LDA #END/256 ; SYSTEM RESET2400 STA MEMLO+1 ; d}oes no harm.2410 ;2420 2430 L10 = *+12440 2450 LDA #KEYPAD&$FF ;Reset VBLANK2460 STA VVBLKD ; vector to247}0 2480 H10 = *+12490 2500 LDA #KEYPAD/256 ; scan kpads2510 STA VVBLKD+12520 ;2530 2540 L11 = *+12550 2560 L}DA #KEYIRQ&$FF ;Reset data2570 STA VKEYBD ; key IRQ2580 2590 H11 = *+12600 2610 LDA #KEYIRQ/256 ; vector2}620 STA VKEYBD+12630 ;2640 2650 L11A = *+12660 2670 LDA #NEWDOS&$FF ;Reset DOS2680 STA DOSVEC ; utility}2690 2700 H11A = *+12710 2720 LDA #NEWDOS/256 ; package2730 STA DOSVEC+1 ; vector2740 ;2750 LDA #0 } ;Reset keypad2760 2770 L12 = *+12780 H12 = *+22790 2800 STA STAGE ; reading logic2810 2820 L13 = *+12830 }H13 = *+22840 2850 STA P1 ; and set print2860 2870 L14 = *+12880 H14 = *+22890 2900 STA P2 ; sp}eed to the2910 2920 L15 = *+12930 H15 = *+22940 2950 STA DELAY ; maximum2960 ;2970 ;Find Screen Editor entry,}2980 ; copy vector table, and2990 ; change PUTBYTE vector3000 ; to delay routine.3010 ;3020 LDX #0 ;Init off }set3030 LDA #'E ;Search value3040 INITL3050 CMP HATABS,X ;Get offset to3060 BEQ INITF ; Screen Editor3 }070 INX ; in HATABS in3080 INX ; register X3090 INX3100 3110 L16 = *+13120 H16 = *+23130  }3140 JMP INITL3150 INITF3160 3170 L16A = *+13180 H16A = *+23190 3200 STX EDOFFS ;Save offset3210 LDA POINT  } ;Keep content3220 PHA ; of zero-3230 LDA POINT+1 ; page3240 PHA ; pointer3250 } ;3260 LDA HATABS+1,X ;Save pointer3270 STA POINT ; to Editor3280 LDA HATABS+2,X ; vector3290 STA POINT+}1 ; tables3300 ;3310 3320 H17 = *+13330 3340 CMP #VECTOR/256 ;If already3350 BNE ICONT ; set, don't}3360 LDA POINT ; create an3370 3380 L17 = *+13390 3400 CMP #VECTOR&$FF ; infinite3410 BEQ INITF2 ; } GOSUB loop3420 ;3430 ICONT3440 LDY #153450 INITL23460 LDA (POINT),Y ;Copy Editor3470 3480 L18 = *+13490 H18 = }*+23500 3510 STA VECTOR,Y ; vectors to3520 DEY ; user VECTOR3530 BPL INITL2 ; table3540 ;}3550 CLC3560 CLD3570 3580 L19 = *+13590 H19 = *+23600 3610 LDA VECTOR+6 ;Tell delay3620 ADC #1 ; rout}ine the3630 3640 L20 = *+13650 H20 = *+23660 3670 STA PUTBYTE ; address of3680 3690 L21 = *+13700 H21 = *+23}710 3720 LDA VECTOR+7 ; the normal3730 ADC #0 ; Editor PUT3740 3750 L22 = *+13760 H22 = *+23770 3780 } STA PUTBYTE+1 ; BYTE routine3790 ;3800 INITF23810 PLA ;Restore content3820 STA POINT+1 ; of zero-page}3830 PLA ; pointer3840 STA POINT3850 ;3860 3870 L23 = *+13880 3890 LDA #VECTOR&$FF ;Reset Editor390}0 STA HATABS+1,X ; entry in3910 3920 H23 = *+13930 3940 LDA #VECTOR/256 ; the Device3950 STA HATABS+2,X ; T}able3960 ;3970 3980 L24 = *+13990 4000 LDA #PREDIT&$FF ;Set delay4010 4020 L25 = *+14030 H25 = *+24040 4050 }STA VECTOR+6 ; address in4060 STA ICPTL ; user vector4070 4080 H24 = *+14090 4100 LDA #PREDIT/256 ; t}able and4110 4120 L26 = *+14130 H26 = *+24140 4150 STA VECTOR+7 ; Screen Edit4160 STA ICPTH ; ICPT vec}tor4170 ;4180 CLI4190 CLC4200 RTS4210 ;4220 ;Data for INIT routine4230 RES .BYTE $00 ;Is this RESET??4240 ED .BY}TE 'E,':,324250 SC .BYTE 'S,':,324260 VECTOR *= *+164270 KBSAVE .BYTE 0,0 ;VKEYBD value4280 DOSSAV .BYTE 0,0 ;DOSVEC va}lue4290 EDOFFS .BYTE 0 ;Editor entry4300 ;4310 ;4320 ;New DOS utility package vector4330 ;4340 NEWDOS4350 SEI } ;Disable IRQs4360 ;4370 4380 L26A = *+14390 H26A = *+24400 4410 LDA KBSAVE ;Reset keyboard4420 STA VKEY}BD ; interrupt4430 4440 L26B = *+14450 H26B = *+24460 4470 LDA KBSAVE+1 ; vector to4480 STA VKEYBD+1 ; o }riginal val.4490 ;4500 4510 L26C = *+14520 H26C = *+24530 4540 LDX EDOFFS ;Reset Screen4550 LDA #$00 ; !}Editor vector4560 STA HATABS+1,X ; to original4570 STA ICPTL ; value ($E400)4580 LDA #$E4 ; and change45"}90 STA HATABS+2,X ; IOCB no. 04600 STA ICPTH4610 ;4620 4630 L26D = *+14640 H26D = *+24650 4660 LDA THRU ;R#}estore orig.4670 STA VVBLKD ; VVLBKD vector4680 4690 L26E = *+14700 H26E = *+24710 4720 LDA THRU+14730 STA V$}VBLKD+14740 ;4750 CLI ;Enable IRQs4760 ;4770 4780 L26F = *+14790 H26F = *+24800 4810 JMP (DOSSAV) ;N%}OW go to DOS4820 ;4830 ;4840 ;New Editor PUTBYTE routine4850 ;4860 PREDIT4870 BRK ;CIO 'not open'4880 PHP&} ;Save all 65024890 4900 L27 = *+14910 H27 = *+24920 4930 STA TEMPA ; registers4940 4950 L28 = *+'}14960 H28 = *+24970 4980 STX TEMPX ; for the4990 5000 L29 = *+15010 H29 = *+25020 5030 STY TEMPY ; S(}creen Editor5040 5050 L30 = *+15060 H30 = *+25070 5080 LDX DELAY ;Get delay--if5090 BEQ GOEDIT ; none PUT)} char5100 DELLOOP5110 LDY #$FF5120 DELLOOP25130 DEY5140 BNE DELLOOP25150 DEX5160 BNE DELLOOP5170 GOEDIT5180 5*}190 L31 = *+15200 H31 = *+25210 5220 LDY TEMPY ;Restore 65025230 5240 L32 = *+15250 H32 = *+25260 5270 LDX +}TEMPX ; registers5280 5290 L33 = *+15300 H33 = *+25310 5320 LDA TEMPA ; for the5330 PLP ; S,}creen Editor5340 5350 L33A = *+15360 H33A = *+25370 5380 JMP (PUTBYTE) ;Go to it!!!5390 ;5400 ;CONTROL Data sectio-}n5410 ;5420 DELAY .BYTE $005430 TEMPA .BYTE $005440 TEMPX .BYTE $005450 TEMPY .BYTE $005460 PUTBYTE .WORD $005470 ;54.}80 ;5490 ;New data key IRQ serv. routine5500 ;5510 ; toggles the5520 ; editing keypad (port #3)5530 /};5540 ; toggles the5550 ; numeric keypad (port #4)5560 ;5570 ; # toggles speed5580 ;550}90 KEYIRQ5600 LDA KBCODE ;Get keypress5610 CMP CH1 ;Accept if not5620 BNE CHOK ; last keypress5630 1}LDA KEYDEL ; or debounce5640 BNE RETURN ; time is up5650 CHOK5660 LDA KBCODE ;Get keypress5670 CMP #$9F 2} ; = CTRL 1?5680 BNE CHECK ;If not, jump5690 LDA SSFLAG ;Toggle display5700 EOR #$FF ; start/stop3}5710 STA SSFLAG ; flag5720 5730 L34 = *+15740 H34 = *+25750 5760 JMP RETURN5770 CHECK5780 CMP #$EA ;T4}oggle editing5790 BNE CHECK2 ; keypad (#3)?5800 5810 L35 = *+15820 H35 = *+25830 5840 LDA KBFLAG ; Do it 5}if key=5850 EOR #$FF ; --ś5860 5870 L36 = *+15880 H36 = *+25890 5900 STA KBFLAG5910 5920 L37 = *6}+15930 H37 = *+25940 5950 JMP RETURN5960 CHECK25970 CMP #$E3 ;Toggle numeric5980 BNE CHECK3 ; keypad (#47})?5990 6000 L38 = *+16010 H38 = *+26020 6030 LDA KBFLAG+1 ; Do it if key=6040 EOR #$FF ; --Λ6058}0 6060 L39 = *+16070 H39 = *+26080 6090 STA KBFLAG+16100 6110 L40 = *+16120 H40 = *+26130 6140 JMP RETURN61509} CHECK36160 6170 L41 = *+16180 H41 = *+26190 6200 STX TEMPX26210 LDX #96220 CHECKL6230 6240 L42 = *+16250 H42 :}= *+26260 6270 CMP SPKEY,X ;Check to see if6280 BEQ CHECKF ; request to6290 DEX ; change speed63;}00 BPL CHECKL ; of printing6310 6320 L43 = *+16330 H43 = *+26340 6350 LDX TEMPX26360 6370 L44 = *+16380 H44<} = *+26390 6400 JMP STOREIT26410 CHECKF6420 6430 L45 = *+16440 H45 = *+26450 6460 LDA SPDEL,X ;Get new delay=}6470 6480 L46 = *+16490 H46 = *+26500 6510 STA DELAY ; and save it6520 6530 L47 = *+16540 H47 = *+26550 6>}560 LDA SPKEY,X6570 6580 L48 = *+16590 H48 = *+26600 6610 LDX TEMPX26620 6630 L49 = *+16640 H49 = *+26650 666?}0 JMP RETURN6670 STOREIT26680 STA CH ;Keyboard FIFO6690 STA CH1 ;Prior KB code6700 LDA #$03 ;Set@} debounce6710 STA KEYDEL ; time6720 LDA #$00 ;Reset ATRACT6730 STA ATRACT ; flag6740 RETURN6750 LDA A}#$30 ;Set autorepeat6760 STA SRTIMR ; timer=1/2 sc6770 PLA6780 RTI6790 ;6800 ;Data secion for KB IRQ6810 B};6820 TEMPX2 .BYTE $006830 ;6840 ;Table SPKEY holds the codes for the keys: 1,2,3,4,5,6,7,8,9, and 0.6850 SPKEY .BYTE $DC}F,$DE,$DA,$D8,$DD6860 .BYTE $DB,$F3,$F5,$F0,$F26870 ;6880 ;Table SPDEL holds the delay values that correspond to keys in D}SPKEY.6890 SPDEL .BYTE $90,$80,$70,$60,$506900 .BYTE $40,$30,$20,$10,$006910 ;6920 ;6930 ;KEYPAD routine follows. . .6E}940 ;6950 GAME .BYTE 0 ;Game use=$FF6960 KPRESS .BYTE $FF ;Keys pressed6970 .BYTE $FF6980 KBFLAG .BYTE 0,0 F};Keypad flags6990 ;7000 ;7010 ;KEYPAD--Allows use of the Atari7020 ; keypads for control and7030 ; numeric functionsG}.7040 ;7050 ;(c) Thomas D. Newton, 10/5/19817060 ;7070 ;7080 ;Operating System equates7090 ;7100 PBCTL = $D303 ;PortH} B control7110 PORTB = $D301 ;Port B I/O adr7120 STRIG2 = $0286 ; = STRIG(2)7130 PADDL4 = $0274 ; = PADDLE(4)7140 PADI}DL5 = $0275 ; = PADDLE(5)7150 ;7160 ;7170 ;7180 ;VBLANK handler for keypad7190 ;7200 KEYPAD7210 LDA #56 ;PORTJ}B = data7220 STA PBCTL ; direction7230 7240 L50 = *+17250 H50 = *+27260 7270 LDA KBFLAG ;Set joysticks72K}80 7290 L51 = *+17300 H51 = *+27310 7320 ORA KBFLAG+1 ; 3&4 = input7330 7340 L52 = *+17350 H52 = *+27360 737L}0 ORA GAME ; or output7380 STA PORTB7390 PHP ;Save flag7400 ;7410 LDA #60 ;PORTB = data7420M} STA PBCTL ; I/O register7430 ;7440 PLP ;Exit if keypads7450 BNE KEYPADON ; turned off &7460 747N}0 L53 = *+17480 H53 = *+27490 7500 JMP (THRU) ; GAME not set7510 ;7520 KEYPADON7530 7540 L54 = *+17550 H54 = O}*+27560 7570 LDX STAGE ;Select 1 of 47580 7590 L55 = *+17600 H55 = *+27610 7620 LDA STROBE,X ; keypad rowP}s7630 STA PORTB ; to check7640 DEX ;TEMP := 3*J,7650 TXA ; where J is7660 AND #3 Q} ; the row # for7670 7680 L56 = *+17690 H56 = *+27700 7710 STA TEMP ; last VBLANK's7720 CLC ; kR}eypad strobe7730 CLD7740 7750 L57 = *+17760 H57 = *+27770 7780 ADC TEMP7790 7800 L58 = *+17810 H58 = *+27820 S}7830 ADC TEMP7840 7850 L59 = *+17860 H59 = *+27870 7880 STA TEMP7890 ;7900 ;Check keypads for input7910 ;7920 T}LDX #17930 LDY #27940 LOOP7950 7960 L60 = *+17970 H60 = *+27980 7990 LDA P1,X ;Jump if key has8000 BNE LOOU}PEND ; been found8010 LDA PADDL5,Y ;Check first col8020 CMP #10 ; with paddles8030 LDA #1 ; 5&7.V} Val>108040 BCS GOTIT ; = key pressed8050 LDA PADDL4,Y ;Check 2nd col.8060 CMP #10 ; with paddles8070W} LDA #2 ; 4&6. Val>108080 BCS GOTIT ; = key pressed8090 LDA STRIG2,X ;Check 3rd col.8100 BNE LOOPENDX} ; w/STRIG 2,3.8110 LDA #3 ; 0 = keypress.8120 ;8130 ;Have a key--register in P1,P28140 ;8150 GOTIT8160 Y}CLC ;A = column(1-3)8170 8180 L61 = *+18190 H61 = *+28200 8210 ADC TEMP ;TEMP = 3 * row8220 8230 Z}L62 = *+18240 H62 = *+28250 8260 STA P1,X ; + col=>(1-12)8270 ;8280 ;Decrement X,Y and loop for 2nd8290 ; ke[}ypad8300 ;8310 LOOPEND8320 DEY8330 DEY8340 DEX8350 BPL LOOP8360 ;8370 ;Keypads read for this row--8380 ; now ex\}it unless all rows read8390 ;8400 8410 L63 = *+18420 H63 = *+28430 8440 LDA STAGE ;Return unless8450 CMP #3 ]} ; all 4 rows8460 BNE EXIT ; were tested8470 ;8480 ;Loop for numeric/control pads8490 ;8500 LDA #$FF ^} ;Set TEMPCH to8510 8520 L64 = *+18530 H64 = *+28540 8550 STA TEMPCH ; 'null' key.8560 ;8570 LDY #1 _} ;Start w/numeric8580 KLOOP8590 8600 L65 = *+18610 H65 = *+28620 8630 LDX P1,Y ;Get the key on8640 8650 L66`} = *+18660 H66 = *+28670 8680 LDA NUMBER,X ; that keypad8690 CPY #1 ; that was8700 BEQ KEYIN ; prea}ssed8710 8720 L67 = *+18730 H67 = *+28740 8750 LDA CONTROL,X ; (if any)8760 ;8770 KEYIN8780 CMP #$FF ;Exib}t if no key8790 BEQ EXITK ; was pressed8800 8810 L68 = *+18820 H68 = *+28830 8840 CMP LAST,Y ;Different kc}eys8850 BNE NEWKEY ; accepted imm.8860 8870 L69 = *+18880 H69 = *+28890 8900 LDX DEBNCE,Y ;Ignore if not891d}0 BNE EXITK ; debounced.8920 8930 L70 = *+18940 H70 = *+28950 8960 CMP LASTIN,Y ;Treat as new8970 BNE NEWKe}EY ; if not held.8980 8990 L71 = *+19000 H71 = *+29010 9020 LDX REPEAT,Y ;If repeat time9030 BNE EXITK f}; is up, repeat9040 9050 L72 = *+19060 H72 = *+29070 9080 JMP STOREIT ; key.9090 NEWKEY9100 9110 L73 = *+19g}120 H73 = *+29130 9140 STA LAST,Y ;Last keypress9150 PHA9160 LDA #8 ;Set debounce9170 9180 L74 = *+19q}_B'DOS SYSB*+DUP SYSCUMEM SAVBgTAPEPROGSRCBDISKREL SRCBrDISKPROGSRCBTAPEPROGOBJB;DCHANGE BASB"=TCHANGE BASB_OBJTOBASBASBgAUTORUN SYSBpDISKNAMEDATAUTORUN SYS190 H74 = *+29200 9210 STA DEBNCE,Y9220 LDA #30 ;Init. repeat9230 9240 L75 = *+19250 H75 = *+29260 9270 r}STA REPEAT,Y ; delay 1/2 sec9280 PLA9290 STOREIT9300 9310 L76 = *+19320 H76 = *+29330 9340 STA KPRESS,Y ;Stors}e keypress9350 9360 L77 = *+19370 H77 = *+29380 9390 LDX KBFLAG,Y ; in TEMPCH if9400 BEQ EXITK ; the keypat}d9410 9420 L78 = *+19430 H78 = *+29440 9450 STA TEMPCH ; is enabled.9460 EXITK9470 9480 L79 = *+19490 H79 =u} *+29500 9510 STA LASTIN,Y ;Set last READ9520 DEY ;Branch back for9530 BPL KLOOP ; CONTROL keyp.9v}540 ;9550 ;Now store TEMPCH in CH9560 ;9570 LDA CH ;Exit if key on9580 CMP #$FF ; main keyboard9590 BNw}E EXIT ; pressed.9600 9610 L80 = *+19620 H80 = *+29630 9640 LDA GAME ;Exit if game9650 BNE EXIT x}; flag is set9660 9670 L81 = *+19680 H81 = *+29690 9700 LDA TEMPCH ;Put character9710 STA CH ; in CH.y}9720 ;9730 EXIT9740 9750 L82 = *+19760 H82 = *+29770 9780 LDX STAGE ;Bump counter to9790 INX ; nz}ext VBLANK9800 TXA ; stage.9810 AND #39820 9830 L83 = *+19840 H83 = *+29850 9860 STA STAGE9870 BNE {}CONT1 ;Are we in stage9880 LDA #0 ; 3? If so,9890 9900 L84 = *+19910 H84 = *+29920 9930 STA P1 |} ; reset keyb.9940 9950 L85 = *+19960 H85 = *+29970 9980 STA P2 ; pointers9990 CONT1010000 LDX #10100}}10 CONT1A010020 010030 L86 = *+1010040 H86 = *+2010050 010060 LDA DEBNCE,X ;Debounce timer010070 BEQ CONT2 ;~} decremented010080 010090 L87 = *+1010100 H87 = *+2010110 010120 DEC DEBNCE,X ; if not zero010130 CONT2010140 }010150 L88 = *+1010160 H88 = *+2010170 010180 LDA REPEAT,X ;Repeat timer010190 BEQ CONT3 ; decremented010200} 010210 L89 = *+1010220 H89 = *+2010230 010240 DEC REPEAT,X ; if not zero010250 CONT3010260 DEX010270 BPL CONT}1A010280 010290 L90 = *+1010300 H90 = *+2010310 010320 JMP (THRU)010330 ;010340 ;Data section010350 ;010360 STROB}E .BYTE 238,221,187,119010370 ;010380 ;CONTROL keys--internal codes for (null,+,up,down,-,left,right,*,DC,IC,/,^,RET)01039}0 ;010400 CONTROL .BYTE $FF,$06,$8E,$8F010410 .BYTE $0E,$86,$87010420 .BYTE $07,$B4,$B7010430 .BYTE $26,$47,$0C010440} ;010450 ;NUMERIC keys--internal codes for (null,7,8,9,4,5,6,1,2,3,0,",",".")010460 ;010470 NUMBER .BYTE $FF,$33,$35,$300}10480 .BYTE $18,$1D,$1B010490 .BYTE $1F,$1E,$1A010500 .BYTE $32,$22,$20010510 DEBNCE .BYTE $00 ;Debounce010520 } .BYTE $00010530 LAST .BYTE $FF ;Last READ010540 .BYTE $FF010550 LASTIN .BYTE $FF ;Last KEY010560 } .BYTE $FF010570 REPEAT .BYTE $00 ;Auto-repeat010580 .BYTE $00010590 TEMPCH .BYTE $FF ;New CH val.010600 P1 } .BYTE $00 ;==>CONTROL010610 P2 .BYTE $00 ;==>NUMBER010620 STAGE .BYTE $00 ;Row counter010630 TEMP .BYT}E $00 ;Row offset010640 TEMP2 .BYTE $00 ;Temp. stor.010650 THRU .BYTE 0,0 ;Exit vector010660 ;010670 END = *}010680 .END offset010640 TEMP2 .BYTE $00 ;Temp. stor.010650 THRU .BYTE 0,0 ;Exit vector010660 ;010670 END = * 1000 ;KEYPAD CONTROLLER--REVISION 2.01010 ;1020 ;This revision: May 21, 19821030 ;1040 ;1050 ;CONTROL--Press } and a1060 ; digit from to to slow1070 ; down or speed up listings1080 ;1090 ;(c) Thomas D. Newton, 11/7/1981110}0 ;1110 ;1120 ;Operating System equates1130 ;1140 ATRACT = $004D ;TV prot. timer1150 KBCODE = $D209 ;POKEY KB reg.116}0 KEYDEL = $02F1 ;Debounce timer1170 SRTIMR = $022B ;Repeat timer1180 CH = $02FC ;Keyboard FIFO1190 CH1 = $02F2 } ;Last keypress1200 SSFLAG = $02FF ;Start/stop flag1210 ICPTL = $0346 ;Put character1220 ICPTH = $0347 ; vector12}30 VVBLKD = $0224 ;VBLANK vector1240 VKEYBD = $0208 ;Keyboard vector1250 MEMLO = $02E7 ;Memory start1260 HATABS = $031}A ;Device Table1270 DOSVEC = $000A ;DOS util vect.1280 DOSINI = $000C ;DOS init vect.1290 ;1300 POINT = $E0 ;Zero-}page ptr1310 ;1320 ;1330 ;Use $8000 for the starting1340 ;address because it is easily1350 ;cancelled out when the relo-}1360 ;cation is done.1370 ;1380 START = $8000 ;Low memory here1390 *= START1400 ;1410 ;1420 INIT1430 LDA RES } ;Check which1440 BNE WSTART ; init.....1450 ;1460 LDA DOSINI ;If cold start,1470 STA JSRVEC ; set vec}tor in1480 LDA DOSINI+1 ; init. prog to1490 STA JSRVEC+1 ; point to DOS.1500 ;1510 LDA VVBLKD ;Also save the}1520 STA THRU ; VVBLKD vector1530 LDA VVBLKD+1 ; that was in1540 STA THRU+1 ; place at LOAD1550 ;1560 } LDA VKEYBD ;Also save the1570 STA KBSAVE ; keyboard IRQ1580 LDA VKEYBD+1 ; vector (so it1590 STA KBSAVE+1 } ; can be rest.)1600 ;1610 LDA DOSVEC ;Save address of1620 STA DOSSAV ; disk utility1630 LDA DOSVEC+1 ; }package (it1640 STA DOSSAV+1 ; will be used)1650 ;1660 LDA #$FF ;Set warm start1670 STA RES ; flag16}80 JMP WSTART21690 ;1700 WSTART1710 JSRVEC = *+11720 JSR *-* ;Repl. w/DOS adr1730 ;1740 WSTART21750 SEI } ;Disable IRQs1760 LDA #INIT&$FF ;Set DOSINI to1770 STA DOSINI ; point to this1780 LDA #INIT/256 ; init. }routine1790 STA DOSINI+11800 ;1810 LDA #END&$FF ;Reserve memory1820 STA MEMLO ; again so that1830 LDA #END/2}56 ; SYSTEM RESET1840 STA MEMLO+1 ; does no harm.1850 ;1860 LDA #KEYPAD&$FF ;Reset VBLANK1870 STA VVBLKD } ; vector to1880 LDA #KEYPAD/256 ; scan kpads1890 STA VVBLKD+11900 ;1910 LDA #KEYIRQ&$FF ;Reset data1920 STA VKE}YBD ; key IRQ1930 LDA #KEYIRQ/256 ; vector1940 STA VKEYBD+11950 ;1960 LDA #NEWDOS&$FF ;Reset DOS1970 STA D}OSVEC ; utility1980 LDA #NEWDOS/256 ; package1990 STA DOSVEC+1 ; vector2000 ;2010 LDA #0 ;Reset }keypad2020 STA STAGE ; reading logic2030 STA P1 ; and set print2040 STA P2 ; speed to the2050 } STA DELAY ; maximum2060 ;2070 ;Find Screen Editor entry,2080 ; copy vector table, and2090 ; change PUTBYTE vecto}r2100 ; to delay routine.2110 ;2120 LDX #0 ;Init offset2130 LDA #'E ;Search value2140 INITL2150 CMP }HATABS,X ;Get offset to2160 BEQ INITF ; Screen Editor2170 INX ; in HATABS in2180 INX ; }register X2190 INX2200 JMP INITL2210 INITF2220 STX EDOFFS ;Save offset2230 LDA POINT ;Keep content2240} PHA ; of zero-2250 LDA POINT+1 ; page2260 PHA ; pointer2270 ;2280 LDA HATABS+1,X } ;Save pointer2290 STA POINT ; to Editor2300 LDA HATABS+2,X ; vector2310 STA POINT+1 ; tables2320 ;2}330 CMP #VECTOR/256 ;If already2340 BNE ICONT ; set, don't2350 LDA POINT ; create an2360 CMP #VECTOR&}$FF ; infinite2370 BEQ INITF2 ; GOSUB loop2380 ;2390 ICONT2400 LDY #152410 INITL22420 LDA (POINT),Y ;Cop}y Editor2430 STA VECTOR,Y ; vectors to2440 DEY ; user VECTOR2450 BPL INITL2 ; table2460 ;24}70 CLC2480 CLD2490 LDA VECTOR+6 ;Tell delay2500 ADC #1 ; routine the2510 STA PUTBYTE ; address of252}0 LDA VECTOR+7 ; the normal2530 ADC #0 ; Editor PUT2540 STA PUTBYTE+1 ; BYTE routine2550 ;2560 INITF225}70 PLA ;Restore content2580 STA POINT+1 ; of zero-page2590 PLA ; pointer2600 STA POINT2610} ;2620 LDA #VECTOR&$FF ;Reset Editor2630 STA HATABS+1,X ; entry in2640 LDA #VECTOR/256 ; the Device2650 STA HAT}ABS+2,X ; Table2660 ;2670 LDA #PREDIT&$FF ;Set delay2680 STA VECTOR+6 ; address in2690 STA ICPTL ; us}er vector2700 LDA #PREDIT/256 ; table and2710 STA VECTOR+7 ; Screen Edit2720 STA ICPTH ; ICPT vector273}0 ;2740 CLI2750 CLC2760 RTS2770 ;2780 ;Data for INIT routine2790 RES .BYTE $00 ;Is this RESET??2800 ED .BYTE 'E,'}:,322810 SC .BYTE 'S,':,322820 VECTOR *= *+162830 KBSAVE .BYTE 0,0 ;VKEYBD value2840 DOSSAV .BYTE 0,0 ;DOSVEC value2}850 EDOFFS .BYTE 0 ;Editor entry2860 ;2870 ;2880 ;New DOS utility package vector2890 ;2900 NEWDOS2910 SEI } ;Disable IRQs2920 ;2930 LDA KBSAVE ;Reset keyboard2940 STA VKEYBD ; interrupt2950 LDA KBSAVE+1 ; vector} to2960 STA VKEYBD+1 ; original val.2970 ;2980 LDX EDOFFS ;Reset Screen2990 LDA #$00 ; Editor vector300}0 STA HATABS+1,X ; to original3010 STA ICPTL ; value ($E400)3020 LDA #$E4 ; and change3030 STA HATABS+2,}X ; IOCB no. 03040 STA ICPTH3050 ;3060 LDA THRU ;Restore orig.3070 STA VVBLKD ; VVBLKD vector3080 LDA TH}RU+13090 STA VVBLKD+13100 ;3110 CLI ;Enable IRQs3120 ;3130 JMP (DOSSAV) ;NOW go to DOS3140 ;3150 ;316}0 ;New Editor PUTBYTE routine3170 ;3180 PREDIT3190 BRK ;CIO 'not open'3200 PHP ;Save all 6502321}0 STA TEMPA ; registers3220 STX TEMPX ; for the3230 STY TEMPY ; Screen Editor3240 LDX DELAY ;Ge}t delay--if3250 BEQ GOEDIT ; none PUT char3260 DELLOOP3270 LDY #$FF3280 DELLOOP23290 DEY3300 BNE DELLOOP23310} DEX3320 BNE DELLOOP3330 GOEDIT3340 LDY TEMPY ;Restore 65023350 LDX TEMPX ; registers3360 LDA TEMPA } ; for the3370 PLP ; Screen Editor3380 JMP (PUTBYTE) ;Go to it!!!3390 ;3400 ;CONTROL Data section3410 ;}3420 DELAY .BYTE $003430 TEMPA .BYTE $003440 TEMPX .BYTE $003450 TEMPY .BYTE $003460 PUTBYTE .WORD $003470 ;3480 ;3490} ;New data key IRQ serv. routine3500 ;3510 ; toggles the3520 ; editing keypad (port #3)3530 ;3540 ; } toggles the3550 ; numeric keypad (port #4)3560 ;3570 ; # toggles speed3580 ;3590 KEYIRQ}3600 LDA KBCODE ;Get keypress3610 CMP CH1 ;Accept if not3620 BNE CHOK ; last keypress3630 LDA KEYDE}L ; or debounce3640 BNE RETURN ; time is up3650 CHOK3660 LDA KBCODE ;Get keypress3670 CMP #$9F ; }= CTRL 1?3680 BNE CHECK ;If not, jump3690 LDA SSFLAG ;Toggle display3700 EOR #$FF ; start/stop3710 ST}A SSFLAG ; flag3720 JMP RETURN3730 CHECK3740 CMP #$EA ;Toggle editing3750 BNE CHECK2 ; keypad (#3)?37}60 LDA KBFLAG ; Do it if key=3770 EOR #$FF ; --ś3780 STA KBFLAG3790 JMP RETURN3800 CHECK23810 }CMP #$E3 ;Toggle numeric3820 BNE CHECK3 ; keypad (#4)?3830 LDA KBFLAG+1 ; Do it if key=3840 EOR #$FF } ; --Λ3850 STA KBFLAG+13860 JMP RETURN3870 CHECK33880 STX TEMPX23890 LDX #93900 CHECKL3910 CMP SPKEY,X} ;Check to see if3920 BEQ CHECKF ; request to3930 DEX ; change speed3940 BPL CHECKL ; of print}ing3950 LDX TEMPX23960 JMP STOREIT23970 CHECKF3980 LDA SPDEL,X ;Get new delay3990 STA DELAY ; and save it4}000 LDA SPKEY,X4010 LDX TEMPX24020 JMP RETURN4030 STOREIT24040 STA CH ;Keyboard FIFO4050 STA CH1 ;Pr}ior KB code4060 LDA #$03 ;Set debounce4070 STA KEYDEL ; time4080 LDA #$00 ;Reset ATRACT4090 STA ATRA}CT ; flag4100 RETURN4110 LDA #$30 ;Set autorepeat4120 STA SRTIMR ; timer=1/2 sc4130 PLA4140 RTI4150} ;4160 ;Data secion for KB IRQ4170 ;4180 TEMPX2 .BYTE $004190 ;4200 ;Table SPKEY holds the codes for the keys: 1,2,3,4,}5,6,7,8,9, and 0.4210 SPKEY .BYTE $DF,$DE,$DA,$D8,$DD4220 .BYTE $DB,$F3,$F5,$F0,$F24230 ;4240 ;Table SPDEL holds the del}ay values that correspond to keys in SPKEY.4250 SPDEL .BYTE $90,$80,$70,$60,$504260 .BYTE $40,$30,$20,$10,$004270 ;4280 };4290 ;KEYPAD routine follows. . .4300 ;4310 GAME .BYTE 0 ;Game use=$FF4320 KPRESS .BYTE $FF ;Keys pressed4330 } .BYTE $FF4340 KBFLAG .BYTE 0,0 ;Keypad flags4350 ;4360 ;4370 ;KEYPAD--Allows use of the Atari4380 ; keypads for c}ontrol and4390 ; numeric functions.4400 ;4410 ;(c) Thomas D. Newton, 10/5/19814420 ;4430 ;4440 ;Operating System equa}tes4450 ;4460 PBCTL = $D303 ;Port B control4470 PORTB = $D301 ;Port B I/O adr4480 STRIG2 = $0286 ; = STRIG(2)4490 P}ADDL4 = $0274 ; = PADDLE(4)4500 PADDL5 = $0275 ; = PADDLE(5)4510 ;4520 ;4530 ;4540 ;VBLANK handler for keypad4550 ;4}560 KEYPAD4570 LDA #56 ;PORTB = data4580 STA PBCTL ; direction4590 LDA KBFLAG ;Set joysticks4600 ORA} KBFLAG+1 ; 3&4 = input4610 ORA GAME ; or output4620 STA PORTB4630 PHP ;Save flag4640 ;4650 LDA} #60 ;PORTB = data4660 STA PBCTL ; I/O register4670 ;4680 PLP ;Exit if keypads4690 BNE KEYPADO}N ; turned off &4700 JMP (THRU) ; GAME not set4710 ;4720 KEYPADON4730 LDX STAGE ;Select 1 of 44740 LDA S}TROBE,X ; keypad rows4750 STA PORTB ; to check4760 DEX ;TEMP := 3*J,4770 TXA ; where J }is4780 AND #3 ; the row # for4790 STA TEMP ; last VBLANK's4800 CLC ; keypad strobe4810 CL}D4820 ADC TEMP4830 ADC TEMP4840 STA TEMP4850 ;4860 ;Check keypads for input4870 ;4880 LDX #14890 LDY #24900 LOO}P4910 LDA P1,X ;Jump if key has4920 BNE LOOPEND ; been found4930 LDA PADDL5,Y ;Check first col4940 CMP #1}0 ; with paddles4950 LDA #1 ; 5&7. Val>104960 BCS GOTIT ; = key pressed4970 LDA PADDL4,Y ;Che}ck 2nd col.4980 CMP #10 ; with paddles4990 LDA #2 ; 4&6. Val>105000 BCS GOTIT ; = key pressed5}010 LDA STRIG2,X ;Check 3rd col.5020 BNE LOOPEND ; w/STRIG 2,3.5030 LDA #3 ; 0 = keypress.5040 ;5050 ;H}ave a key--register in P1,P25060 ;5070 GOTIT5080 CLC ;A = column(1-3)5090 ADC TEMP ;TEMP = 3 * row510}0 STA P1,X ; + col=>(1-12)5110 ;5120 ;Decrement X,Y and loop for 2nd5130 ; keypad5140 ;5150 LOOPEND5160 DEY}5170 DEY5180 DEX5190 BPL LOOP5200 ;5210 ;Keypads read for this row--5220 ; now exit unless all rows read5230 ;5240} LDA STAGE ;Return unless5250 CMP #3 ; all 4 rows5260 BNE EXIT ; were tested5270 ;5280 ;Loop for }numeric/control pads5290 ;5300 LDA #$FF ;Set TEMPCH to5310 STA TEMPCH ; 'null' key.5320 ;5330 LDY #1 } ;Start w/numeric5340 KLOOP5350 LDX P1,Y ;Get the key on5360 LDA NUMBER,X ; that keypad5370 CPY #1 }; that was5380 BEQ KEYIN ; pressed5390 LDA CONTROL,X ; (if any)5400 ;5410 KEYIN5420 CMP #$FF ;Exit if }no key5430 BEQ EXITK ; was pressed5440 CMP LAST,Y ;Different keys5450 BNE NEWKEY ; accepted imm.5460 L}DX DEBNCE,Y ;Ignore if not5470 BNE EXITK ; debounced.5480 CMP LASTIN,Y ;Treat as new5490 BNE NEWKEY ; if} not held.5500 LDX REPEAT,Y ;If repeat time5510 BNE EXITK ; is up, repeat5520 JMP STOREIT ; key.5530 NEWKE}Y5540 STA LAST,Y ;Last keypress5550 PHA5560 LDA #8 ;Set debounce5570 STA DEBNCE,Y5580 LDA #30 ;I}nit. repeat5590 STA REPEAT,Y ; delay 1/2 sec5600 PLA5610 STOREIT5620 STA KPRESS,Y ;Store keypress5630 LDX KBFLA}G,Y ; in TEMPCH if5640 BEQ EXITK ; the keypad5650 STA TEMPCH ; is enabled.5660 EXITK5670 STA LASTIN,Y };Set last READ5680 DEY ;Branch back for5690 BPL KLOOP ; CONTROL keyp.5700 ;5710 ;Now store TEMPCH in C}H5720 ;5730 LDA CH ;Exit if key on5740 CMP #$FF ; main keyboard5750 BNE EXIT ; pressed.5760 LD}A GAME ;Exit if game5770 BNE EXIT ; flag is set5780 LDA TEMPCH ;Put character5790 STA CH ; in} CH.5800 ;5810 EXIT5820 LDX STAGE ;Bump counter to5830 INX ; next VBLANK5840 TXA ; stage}.5850 AND #35860 STA STAGE5870 BNE CONT1 ;Are we in stage5880 LDA #0 ; 3? If so,5890 STA P1 }; reset keyb.5900 STA P2 ; pointers5910 CONT15920 LDX #15930 CONT1A5940 LDA DEBNCE,X ;Debounce timer5950} BEQ CONT2 ; decremented5960 DEC DEBNCE,X ; if not zero5970 CONT25980 LDA REPEAT,X ;Repeat timer5990 BEQ C}ONT3 ; decremented6000 DEC REPEAT,X ; if not zero6010 CONT36020 DEX6030 BPL CONT1A6040 JMP (THRU)6050 ;60}60 ;Data section6070 ;6080 STROBE .BYTE 238,221,187,1196090 ;6100 ;CONTROL keys--internal codes for (null,+,up,down,-,lef}t,right,*,DC,IC,/,^,RET)6110 ;6120 CONTROL .BYTE $FF,$06,$8E,$8F6130 .BYTE $0E,$86,$876140 .BYTE $07,$B4,$B76150 .BYT}E $26,$47,$0C6160 ;6170 ;NUMERIC keys--internal codes for (null,7,8,9,4,5,6,1,2,3,0,",",".")6180 ;6190 NUMBER .BYTE $FF,$}33,$35,$306200 .BYTE $18,$1D,$1B6210 .BYTE $1F,$1E,$1A6220 .BYTE $32,$22,$206230 DEBNCE .BYTE $00 ;Debounce6240 } .BYTE $006250 LAST .BYTE $FF ;Last READ6260 .BYTE $FF6270 LASTIN .BYTE $FF ;Last KEY6280 .BYTE} $FF6290 REPEAT .BYTE $00 ;Auto-repeat6300 .BYTE $006310 TEMPCH .BYTE $FF ;New CH val.6320 P1 .BYTE $00 } ;==>CONTROL6330 P2 .BYTE $00 ;==>NUMBER6340 STAGE .BYTE $00 ;Row counter6350 TEMP .BYTE $00 ;Row offset}6360 TEMP2 .BYTE $00 ;Temp. stor.6370 THRU .BYTE 0,0 ;Exit vector6380 ;6390 END = *6400 .END00 ;Row offsetl <ӭ$ % x $%  ELRHHɽ}حiihh੽͍FGX`E: S: (l} a ɟ ILf ILf ILfm n mLWxnmLfM0+h@}p`P@0 8ӭ  <(l ʊ) m m  u t  m ֭} a   1١  '٣  L2 H  h    )  } ޟ ޥ l ݻw&G 3502"  ELRHHɽD&'KYCOMEMBASPAROAFRELYADEN} $$KEYPAD CONTROLLER REVISION 2.0$$(c) Thomas D. Newton, 11/29/81($$(T}his revision: May 21, 1982)2dD;@$,$-@@$("667<,.>:,: D A0nQQ6,142,143,14,134,}135,7,180,183,38,71,12,51,53,48,24,29,27,31,30,26,50,34,32x(-@@%  ($3 +3 !KEYPAD CO}NTROLLER -- REVISION 2.0U U JUsing this program you can change the keypad layouts and save the changes.2 2 '}Y- %  Y '| + |  |  | || | 7 | 8 | 9 | }Y- % || Y '| - |  |  | || | 4 | 5 | 6 |Y- % ||  }Y '| * |  |  | || | 1 | 2 | 3 |W- % || W %| / | ^ || ||  }| 0 | . | , |Z- % || Z (   A A  }N* "Which keypad do you want to changeN (1=exit, 2=control, 3=numeric)//@*@*@A }$"@A$Quit prog.-$@@  A@ A '' What row do you want to cha}nge99@*@*@*@A@?!-$@@%@$? >:@0%+"@,,}, A A 6** !What column do you want to change@//@*@*@AJ3+-@$}%+&@,$@$@3 h7 A 7 %Please press the key that you want tor++ #put on the keypad. You d}o not need| to press .==-@$%+&@,$@$&@@%@$AdAU&6-F}:Ad,&"AUA""@` " A%""A$ " A%""A " }A%""AT " A%E&+&@d$P:'@d,,"@26-@; E A%E&+&@d}$P:'@d,,"@926-@9; E A%L#@@K:0)@;@L  >:,} QAdAUC6-@$+&@,%@$+&@,%Q67<,.>:,C-$@@  <-$@}@%@$C  <+-@$%+&@,$@$@2  < A;@, A ** }"Do you want to save the changes to&& diskette for future use (Y/N)&6!0Y*0y*0*0) Bye3 B}60:Set up AUTORUN.SYS fileDN ;A, Holds programS Load F$TXII67@<@F,..}4 : ;$%  bII67@G<@,..L< x $%[lII67}@<A8,..  UEL}vII67A9<A,..HHɀ}حiYII67A<A0,..iZhh0FGX`EII67A1<Av,..: S: }x II67Aw<A",..FG$%XlVWXUII67A#<A}h,..XWV(lY a ɟ II67Ai<A,..ILɁ ILɁ ILɁЁ} II67A<A`,..с ЁLہUсЁLɁM0II67Aa<A,..+h@p`P@0 }8ӭ 偍II67A<AR,..<(l 䂍ʊ)mm II67AS<A,.. } u t  m ֭ II67A<AD,..a  1'LII67!}AE<A,..Hh恾  II67A<A6,..  )  "}II67A7<A,..lݻw&G 3502 67A<A,. ##67#}Ai<Ai,.>:@4,Now change the bytes that hold the keypad layouts*4##GAME is $1E5 bytes f$}rom start>!!CONTROL is $2E8 " " "H!!NUMBER is $2F5 " " "R\5+67AF<AW,.7@<@,%}5CONTROLf4+67AY<Ap,.7@<@$,4NUMBERpz""See if the user wants normaluse or game-playin&}g use. A 0 }0 "Do you want to use the keypads for0  (1) normal use, or0  (2) game use'}01*02A 0K 42+67A<A,.>:AU,KSet flag for game-playing use A p%6-At (}%Default DOS 2 value. . #Do you want to relocate the program-- %(You should only answer Y for special s)}ituations) (Y/N)))0Y*0y*0N*0nA4N)4nAP A0J # What is the new a*}ddress'3 Ag@ Too low.J A@Q B 6 !Please wait a few seconds while IQ customize the progra+}m.$.Now relocate program8B #A L-@@V"`CC6-@:7%@<%@,,%AV$,}@:7%@<%@,,j6-&B'h%t,,67%@<%@,.>:P:'AV,,~6667%@<%@,.>:&AV-}$P:'AV,, -@@ "CC6-@:7%@<%@,,%AV$@:7%@<%@,,.}6-&B'h%,,67%@<%@,.>:P:'AV,,6667%@<%@,.>:&AV$P:'AV,, /} Relocation done..now write program out to disk....... A - - "Put your disk in drive 1 and0} press,, $any key to write the new AUTORUN.SYS" file. "AdAU( F:Ad,"AUA 2A1}dAU<..@@ D:AUTORUN.SYSF)*@AU)*@AUP%%*@&AV$P2}:'AV,Z*@P:'AV,d6-%AEnd prog.n%%*@&AV$P:'AV,x*@P:'A3}V,! @!write programAutorun.Sys INIT address)*@A&)*@@)*@4}A')*@@%%*@&AV$P:'AV,*@P:'AV,Copy the AUTORUN.5}SYS file that loads the 850 handlergg @V8K8P?@     Y` 6} Y0 l `8@. . #Your diskette now has a copy of the-- %KEYPAD CONTROLLER program. To use7} it,** "boot up with the diskette when you turn the computer on.  Bye.l@v- - "An e8}rror has occurred while trying++ #to write AUTORUN.SYS. Please check((  your diskette and disk drive and  try 9}again.Data for relocation1,8,13,19,25,31,37,42,4752,55,110,113,116,119,134137,170,178,183:},186,191212,220,258,264,270,289 295,302,307,310,313,316329,332,335,339,376,383 388,391,398,403,406,409;}*414,422,425,428,431,4344437,440,496,499,502,517>520,523,533,538,541,544H551,582,585,593,602,607R610,<}617,624,629,634,639\644,647,653,658,662,665f670,673,686,691,697,704p711,714,719,724,727,732z 738n}XOdKYCOMEMBASPAROA $$KEYPAD CONTROLLER ">}REVISION 2.0$$(c) Thomas D. Newton, 11/29/81($$(This revision: May 21, 1982)2dD;@$,$-@"?}@$("667<,.>:,: D A0nQQ6,142,143,14,134,135,7,180,183,38,71,12,51,53,48,24,29,27,31,30,26,50,34,32x("@}-@@%  ($3 +3 !KEYPAD CONTROLLER -- REVISION 2.0U U JUsing this program you can c"A}hange the keypad layouts and save the changes.2 2 'Y- % "B} Y '| + |  |  | || | 7 | 8 | 9 |Y- % || Y '| - |  |  |"C} || | 4 | 5 | 6 |Y- % || Y '| * |  |  | || | 1 | 2 | 3 |W- %"D} || W %| / | ^ || || | 0 | . | , |Z- % || Z ("E}   A A N* "Which keypad do you want to changeN (1=exit, 2=cont"F}rol, 3=numeric)//@*@*@A$"@A$Quit prog.-$@@ "G} A@ A '' What row do you want to change99@*@*@*@A@"H}?!-$@@%@$? >:@0%+"@,,, A A 6** !What column do you want to change"I}@//@*@*@AJ3+-@$%+&@,$@$@3 h7 A 7 %Please p"J}ress the key that you want tor++ #put on the keypad. You do not need| to press .==-@$%+&@,$"K}@$&@@%@$AdAU&6-F:Ad,&"AUA""@` " A%"L}""A$ " A%""A " A%""AT " A%E&+&@d$P:'@"M}d,,"@26-@; E A%E&+&@d$P:'@d,,"@926-@9; E A%L#@"N}@K:0)@;@L  >:, QAdAUC6-@$+&@,%@$+&@"O},%Q67<,.>:,C-$@@  <-$@@%@$C  <+-@$%+&@,$@$"P}@2  < A;@, A ** "Do you want to save the changes to&& cassette for future"Q} use (Y/N)&6!0Y*0y*0*0) Bye3 B60:""See if the user wants normalDuse or game-pl"R}aying use.NX Ab0 }0 "Do you want to use the keypads forl0  (1) normal use, or0  (2) game use"S}v01*02A 416.>:, 426.>:AU,Write program to tape "T}  ** "Place a blank cassette in the tape++ #recorder. Then press . When((  the buzzer rings, press "U} and  and press .AdAU F:Ad,"AUA@AdAU##@"V}@A(C:bb @P<ӭ$ % x $%  bb "W}@PELRHHɽحiihh੽bb @P͍F"X}GX`E: S: (lbb @P a ɟ ILf "Y}ILf ILfm n TT @BmLWxnmLfM0+h@p`P@0 -"Z} @- @ 8ӭ $bb @P <(l ʊ) m m  u t"[}  .bb @Pm ֭ a   1١  '٣  L2 H 8bb @"\}P h    )   ޟ ޥ lBU @ ݻwU @7@"]}<@,>:AU,7@<@$,L"" @V@`* * Your tape now has a c"^}opy of thej"" KEYPAD CONTROLLER program.t B~ D:TCHANGE.BAS $$KEYPAD CONTROLLER U  <yFABYT@ length = 786 from $8000 on that is 17 lin&`}es of length 46 each + 1 line of len 4.$9A<@,$6-@(--@@ D:OBJE&a}CT.LSTd-@nvv @A%@$ F$(@F$%@,@F$+%@,&@B$+"@&b},)=>:@4,x++-@E&@B$+"@,z6-F:B'h%@F$%,}l"AU)"@4 &c}068<@,-A68<@,-R68<@,-^6-l6-%@ @>:,  @>:@4&d}, Line completed "@&-@&@ @Ap%@$ F$(@F$&e}8<@,%8<@,%@,@F$8<@,%8<@,%@)=CHR$(8<@,)  Line fixed.&f} @&D:OBJTOBAS.BAS@ length = 786 from $8000 on that is 17 lin$2 4 6 7$ %    L8 x   $%W     *h}QELyHHحiUiVhh,FGX`E: S: *i}x FG $ %XlRSTQTSR(lU a ɟ *j}IL IL IL  LQLM0+h@p`P@0 8*k}ӭ  <(l ʊ) m m  u t  m  ֭ a  *l}1 '  L H h     )     l ݻw*m}&G 3502" 8K8P?@     Y`  Y0 l*o}Data for sep. LOW/HIGH62,66,70,75,80,85,90,95100,104,162,156,200,205 210,218D2:DCHANGE.BAS| `8&G 3502" 8K8P?@     Y`  Y0 l( APX-20106KEYPAD CONTROLLER 2.0THOMAS D. NEWTON06/28/8285ROCESS COMPLETEDD2:TITLE! INPUT MASTER DISK TO N,=