@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@W!( L(1   Y I`  d  Ld M * @  $ % CC$$) BFDEI!H TU VTLThe New Atari Classics Vol 4/No.1 d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `8  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D8:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D8:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu } xx*}?')GO-K?i?B B ?H? H@Ѐ?+} A @ P?x!K X!?:Cp'GҎ 8Bx|?>,}')OD!B~!~?J oO->K|?@' OB!?B ?  B_-}!?H?Ą C?x?>!?.}|?????/}??O????K?0}? q??H_pA??%p??1}?O?????_?2}???>??>??H3}A?>??> H??4}?H_? ?_5} ? ? <' O 6}9A? :!I? 1B? 7}2!pH 9Cp <`! H 8}? H??? ? @ā9}@@/$E`@:}˩N̩@_@˙N@`R@@S@`_@@ɛ_@`HH`@˝̝hh`? "Loading.":RUN "D:M;}ENU"@̩@_@˙N@`R@@S@`_@@ɛ_@`HH`@˝̝hh`? "Loading.":RUN "D:M  X; Rutine for AUTORUN.SYSHATABS TEMP(@2X;Modify the Handler table<MAINFQ>;;turn off anticP=}P/;;and set theZQ>;;screen color.d P;;n P;;x$>$ELOOPQHATABS9R> E FCHANGE000 IELOOP>} CHANGE2 &EDEX QHATABS9 PTEMP Q>4NEWTAB PHATABS92 QHATABS9" PTEMP, Q>5NEWTAB6 PHATABS9@X?};Move Rom to RamJ%>T 'YSAV^XLOOPQ@TEMP7h PNEWTAB8r3|)> DXLOOPQ>4NEWGET PGETBYTEQ>5NEWGET@}PGETBYTE:X;Handler table NEWTAB OPEN  CLOSE GETBYTE PUTBYTE  STATUS SPECIAL A}JUMP == =& YSAV 0 EDEX :X;New Getbyte rutineD NEWGETN %YSAVX QCMDLIN8bR>l FDONEv #YB}SAV%>:DONE5A5 $EDEX QTEMP PHATABS92 QTEMP PHATABS97> 7%> :*X;The cC}ommand line4 CMDLIN> A? A="=ALoading.A="H A:RUN A="=AD:MENUA="R \X;fp MAIN7%> :*X;The cg)* * BUFFERJSRDHADDBUFHBUFLDCSECTOSECTORHSECTORLDUMMBUFANSMESSAGECOLOULU E}  F}******************BOOT SECTORS**** WITH **** MESSAGE. **** G} **** p.kirton****************** 11;A(,;@,;@,;@8,467@,. H} %67A(,. 467@,. AP AAR@#@@--@@")67<,. I}>:,- (104,32,83,228,962/ 6-C:,6-P:'AV,/6-&+$AV,<S6-Ah#%@@7%@ J}@E%@S%@FI%@@+%@@?%@I APKa#67@< K}@,.>:,C67@ <@ ,.>:@,W%@@a APP+%@@+%@U L}467@,. %67A(,. 467@,.ZI%@@+%@5 A? API Ap M}6-?:C:,,$AR@4 (} (((4( Modification complete+( (+( Disk will N}boot with A'-@&+P:B:,'@,,@ A(>:@4,>:@4,"("( displayed( (AR O}*&(Personalise another... [Y/N] *&0Y*0y A&%D:MENU% +S (}- P}@@A(!Enter your message (36 chars max)SA>-@@>($____________________________ Q}________+-@@+A@dG-@B:,!7<,4_$'=6.7@<&@,G A  R} ;-@@7(Enter screen colour [0 to 15];0 )!@&(>:AS,0 A =-@ S}@9(Enter screen luminance [0 to 4]=0 )!@&(>:AS,0 A 6-$@%$K T}AR@(}(!($(K(" INSERT FORMATTED DISK IN DRIVE 1)()( Press when ready...  F:B2y U},@AeAR$,5 #A !-@@p%"167,.>:,5 1467B:,%@,.467B: V},%@,.>:AU,6 67@$<@$,.>:B:,,8?6-@@&B:,%6-P:'@,?67@8<@8,.>:,;67 W}@)<@),.>:,>$@@@162,0,169,11,157,66,3,169,70,157,68,3,169,8,157,69,3,169,0B<<157,73,3,169,31,157,72,3,169 X},0,141,198,2,169,10,133,84DPP169,5,133,85,169,1,141,240,2,32,86,228,169,0,133,84,169,0,141,240,2,169,20F##141,7,7,169,7 Y},141,8,7,76,20,7D:CUSTBOOT.BAS -6. Atari Computer Enthusuasts....______`.______` Z}__` 4-@_` zCUSTOM BOOT.CUSTBOOT.BAS allows you topersonalise your disks with amessage of up to 36 characterswhich displays while DO\}S.SYS isloading. When the program is RUN,you are asked to insert theformatted disk which is to carrythe message, and pre]}ss .Then enter your message on the lineshown and press RETURN. Do notexceed the length of the line(36 characters)^}. The programdefaults to lower case, so useshift as usual if upper casecharacters are desired. Themessage loads into se_}ctor 3, andeffectively takes no disk space!shift as usual if upper casecharacters are desired. Themessage loads into se.AAwgxwwwwvfTTEVfwwwxxa}dB "34Vy˪wwwwxwwfD32"""33C4UUEVffw˖0#4Vx˩eD3334Vx˹eD234DVgweC2!!"#b}3EVgwd!"5fy˨vTDCDDEVxܺvUD33DEUfwxwwfUDD33D4DUVffgwwv2"4UxʘvTC334EVxc}vTC334EVwwfUD333DEUffwwxxd"EFʘeC3#3EVyʇeC2#3EVwwfUUDDDDUffwwwwwwwC!#Dgd}ܨvC2"4VyʆT3"#4UgwveUTDDDEUfwxwwxT1"4WܹS"#EgܹeDD4DVgxwfUTC333EUfwwe}uC #ExܹvS"!#5g˘vTC3DUgwxxwfeTDDDDUVfwwwwwxvT2"3EgxʘuTDDUfwʘvUEEUVfgggwwvvfeUUf}UUUUeUfgweD2!"#Eg̪fEeVʘwwwgffeVUVUffwgwgfUUUTEUVwvS "#5xʆC!#Exxxug}UDEVgffUfwvdUUfffVfxم0"$h x|̶0%wSyxfzu1W@#3g`"\ݫDgwCkVuh}TEۦ"6hwz4HTwh@"g 'T&d@ha&hw4gE̢W̢d'""_'3[ܭ i} 0VE:r#7fhK{`"S"#<]b";!杀F~ɨ 3Wf}eg!4#}&{̩SFRj}h6zDCW['5eT7T[٫5A3Q+쨨B6w} kAzdt :W[e7glu{T[U"7t!Rډk}h36~ن`~hbYyݺv4UG{G"he#2'۬%t1{þ{44D{VRAwe4YSiCmXۄiD2#߯x#EUCl}AEJtB5ݛs6U#kjyVGiXd3B)̉xqIeQ2gE{d̀J5d3ۖQYfHf7Uyc5wvewWyA"h#DUhm}wY5Ad7zyvWWtE7Dgv4Wywa5ygvtCjD!#5ݹc27̷ɅHEzeJ݆26yu13ExyvWvxgxUEgye3xn}xT!$hܺfW˹yUXR4x۸T4h2%WVUyfwEFWvfeVfhzXy{۩ufTC3X̩TWʪڨgfT7UxڙfvixvfTDo}FgxxUEVE6wwwDFuWhhyiYwfeT4YܺxgVxb2DVWښxvyxVEUddFyvueWxwxxFEWvywdTfgVIixUp}B25Ewz̶fXt3Vwyew˖SSEDTueED4x˙hxeD3VttwgjgwfgjWD4VxWxwwyUwܘUFwfwxvgwgxq}WUuexyuSgyDFWxugyTDvکfUwvueje$w˸vwXwxܨwuDggyfz˺uV4E4CzeDUVgwjTFgD6yiyvARkfurur}wwuwyɧhWvSWfeUfhwhhfghyfYYJ'VfwfgWxwvxtdXygyvRDfEFgw۹gw˺dUVhvuuvfeyxxes}vGYgvfGxywVvwuR6eVvڨvfvvevwɩgewiighgfhvxwvfwfxvSfuffeuggvhwhyxwgxt}ggueUfwxvwx˺4EgfefUgxxugxwVFWfweVyvxwfggfvfwwvfxeVwwevfwEhywexu}veWefvwxegwfxxwxfVwxfwxwgwxwwgwwwwwwwxfwwwwvgxwxwwxwvfgxxwwwwxwwv}fwwwvwwwxwwwwwwwwxwwegxwwwxwfgwwwxxwwvgxwfxwwwwwxwwwwwxxwwxwwwfxwxw}wfwwwxwwwxwwwwwwwwwxsdifyb5TiWfyfvxwgvywxwvwwgwxvwwfgwwwfUjɄwfgx}Ux`UWticXwViugwwyuhf%̦WT6w9ۄni"7b7W̦DYS7c7uFWvxvit5zezWfWGVy}wEwVxvgCizV7ygFWzvۈhBVfhwtUZehyigwygfXwheyfxVuWwxhxxVxUVfR1W5yz}yșeWXUGXUxd:5fXWU[hwvxGvyUV2KyXzWFwyifyxE{$yfzXGZvWvy7kgEgcJid{}i\59b7jGhi\:[y x46V{X&f[؉0 @WtUڹYjxvgVyUWgGeDgUtCj[c7Ff5';ȅv4yf|}v7xdgfheuywxSUVy޻ewVwTEvvdweUtcgefyd#VeTg˪sgYfUGXwxyw}}xtuWwUWxffufHxxgzxvvyeXӅw٨@ 3ʗuTV˻eUgefggfxwwvfwfxxxxwgvTEFfUwFXxvgvfwi~}2"Gx˸wvfxefwUlfEggwwgxwvxwwgeEvfT4WguFwggddfuWHhyB"Fwyw%8z۩}gxxwyeVwxvWgxfVVUTWvveVVwwwvegfvxweiggxgxwgwDxeEUxwUfdgxwwxww}wwuwfVyeUgvwxeUfvwfyfgvfgwxvffwffwwwxwwfwvwwwxvVyfwwxwwwfg}wxwgxvgwvvwwwwwwwxwwwwwwwxwxvgwwwwwwwwwwyxwwxwwxxwwwwgwwwwwwwwxwx}wwwxwwwwwwxwwvwwgxxxwwxwwwwwwxwwwwxwwwwwxwwwwwwwwwxwwvvwgxxvvvxwgg}xwxwwxwwxxxwwwxxxwxwwwxxwxwxvwvwfwvwwwvvfwfgwwxwwxxgfgwwxwwgww}wxvfwwvfwfffwffhxgxxwwxwfxwvfxwwxxwwwxxwwxxwwxxxwvgxxxwwwwwgxwwxwwwfVfwfgwxwxw}wwgwxvgwxwwwwgfffffwvwfwwgwwwwwxxxwwwxxxywwxwgffffwwwwffgwxwxvfwwveV}UfvfgxwwvfvvwvegxgwvgfVfffUUVfxwxwxwwwwvwwxwxwwwwvegfgffwvgwffg}xwgwxwxxwfwwwwwwwwwwwegxwwwwwwgwfwwffwwgwxwxwwwwwxwxxwvx}gwfwwwwwwwwwwxwwwxwwwxwxxwwvwwvfwwvgwwwwwwxxwxwwxwwxwwwwwwwxwxwwwwwfgwvxxd P6ACODFFNSAYLYF2FILEOUROSOUTIFCOLIOCBAAAHAALSSHSSLLLOGODL8DL56DUDKST}SPNOPHE4CPLAYSTRNSYNCHA } } !"#$%&'()*}+,-./01234567 Ac Menu by} Nir Dary";@,"AAll6.bhhh`hhhhhhhhhhѥ`HJJJJ Jh JL}$)  ԘѝҦ`(\-@@-A5%@:7<,,1 \@@ D:WELCOME.SMP2}AI@'AP@9ARKAS@]AV@poAW@ AX@6}-?:C:hLV,,@7oAY!6-B-6-BV96-E6-@d6-?:A6<<<@ <<},o@<11;@,;Ap,;@,;@Q,F==6.3hhhhhhhѠEёΦІϥ`P}@ AA2AADAR@VA0@h@zAY}@@D:*.*6-(}Z. 6-C:,.6-F:@,%F:@,$AVd]BEA'BF}A9BG@yKBH]BIADnA-@@R+BI%@/ AB@f}x&&B&+P:'AV,$AV,BP:'AV,e-@@ +B%@/ AB }SB"AeB#A]B$@'B%@39B&ARKA`@3]Aa}AR;@;7@<@,0 )"@0A??7@<@,4000)7@<@,4---}A`C-@!$+'@P:'@,,%@P:'@,%@X(7@<@,}67B:,%@,.7@<}@,6-%@ A`=)6-P:+@&P:'@,,'@,="A!6-!AdAU}h-@@D(*Use key: ,,,. To Load press RETURNVAY@4hAU 6-+'@"P:}'@,,.6-%@C6-%P:'@,&I6-U6-::6-?:<%$@@%$@!%@<@<A(,}06-F:Ad,!6-F:A2,06-F:AD,!!"@)"A@!!"AU*"@A@::6-?:<%}$@@%$@!%@<@<A(,-"@)"@-6-&@%+","-"@)"@-6-%@}&+",,3"@)"@36-&@%+",63"@)"@36-%@&+"@,@)"*"@}*")6-JAdAU A0TJ6-@$+&&@,%J6.7$@%@<$@%}@,^: 6.D: -@@-7<,4 0': Aph 67B:,%@,.7<, r>67B:,%@,..>6}7B:,%@,.7@ <@,| A@& +@@&( 4 D:DOS.SYS.)%7@ <@},4BAS)4 )%XX7@ <@,4DOC)7@ <@,4TXT)7@ <@,4ME Aqq7@ }<@,4COM)7@ <@,4OBJ)7@ <@,4SYS)7@ <@,4EXEA`&&7@ <@,4}BINA` @+@+@@ 6-?:C:hji jL,,9AR@'}@9A@#@@# AP4"@@S4A@9}AR@2@@9(}@(@E"F:@,"@#*"4Ad}AU> ApE(} A &)AdAU Ap) @0=("(Error! while reading...6-@}A: =%: F:Ad,"@(@D33F:Ad,"AU*F:AD,"@ApN$D2:MENU.}hh`hh=%: F:Ad,"@(@D33F:Ad,"AU*F:AD,"@ApN$D2:MENU. 1 REM ATARIWRITER+ FONT PUTTER2 REM by: PAUL V. ALHART3 REM 4 REM 10 TRAP 18020 OPEN #1,12,0,"D:AP.OBJ"30 FOR I=1 TO 19}:GET #1,A:NEXT I40 GET #1,A:GET #1,B:IF A<>255 OR B<>39 THEN ? "NEED AtariWriter+ (48K VERSION)":GOTO 18050 NOTE #1,E,R60 }FOR I=1 TO 256:GET #1,A:NEXT I70 OPEN #2,4,0,"D:AWP.FNT"80 FOR I=1 TO 512:GET #2,A:PUT #1,A:NEXT I90 NOTE #2,Q,W100 FOR I}=1 TO 256:GET #2,A:NEXT I110 FOR I=1 TO 256:GET #2,A:PUT #1,A:NEXT I120 POINT #2,Q,W130 FOR I=1 TO 4:GET #1,A:NEXT I140 F}OR I=1 TO 256:GET #2,A:PUT #1,A:NEXT I150 NOTE #1,T,Y160 POINT #1,E,R:POINT #2,Q,W170 FOR I=1 TO 256:GET #2,A:PUT #1,A:NEX}T I180 CLOSE #1:CLOSE #2 #1,A:NEXT I150 NOTE #1,T,Y160 POINT #1,E,R:POINT #2,Q,W170 FOR I=1 TO 256:GET #2,A:PUT #1,A:NEX1 REM ATARIWRITER+ FONT GETTER2 REM by: PAUL V. ALHART3 REM 4 REM 10 TRAP 13020 OPEN #1,4,0,"D:AP.OBJ"30 FOR I=1 TO 277 }:GET #1,A:NEXT I40 OPEN #2,8,0,"D:AWP.FNT"50 FOR I=1 TO 512:GET #1,A:PUT #2,A:NEXT I60 NOTE #1,Q,W70 FOR I=1 TO 260:GET # }1,A:NEXT I80 FOR I=1 TO 256:GET #1,A:PUT #2,A:NEXT I90 NOTE #1,E,R100 POINT #1,Q,W110 FOR I=1 TO 256:GET #1,A:PUT #2,A:NE }XT I120 POINT #1,E,R130 CLOSE #1:CLOSE #2,A:NEXT I90 NOTE #1,E,R100 POINT #1,Q,W110 FOR I=1 TO 256:GET #1,A:PUT #2,A:NE ,  RK_ATARIWRITER+ FONT PUTTER$}by: PAUL V. ALHART A))@@D:AP.OBJ(-@@$)@$}( (a)@)@3AU)@9W(NEED AtariWriter+ (48K VERSION)a A2@<($}-@AV$)@( F**@@ D:AWP.FNTP5-@A$)@1*@$}5 Z@d(-@AV$)@( n5-@AV$)@1*@5 x@$}(-@@$)@( 5-@AV$)@1*@5 @!$}@!@5-@AV$)@1*@5 @@ D1:AWPUT.BA$}S@!@5-@AV$)@1*@5 @@ D1:AWPUT.BA$7)=ATARIWRITER+ FONT GETTERby: PAUL V. ALHART(} A0))@@D:AP.OBJ(-@Aw$)@( (**@@(} D:AWP.FNT25-@A$)@1*@5 <@F(-@A`$)@(}( P5-@AV$)@1*@5 Z@d@n5-@AV$)@(}1*@5 x@@@ D1:AWGET.BASn5-@AV$)@(W1 REM *******************************2 REM * *3 REM * STATUS LINE SUBROUTINES *4 REM * ,} by *5 REM * Algie Gray *6 REM * *7 REM * For Atari Cl,}assic 1993 *8 REM * *9 REM *******************************100 DIM SL$(80)105 GOSUB 900011,}0 SL$=" THESE TOP TWO LINES ARE TO"115 SL$(28)="TALLY IMMUNE TO SCRO"120 SL$(51)="LLING. PRESS A KEY TO L"125 SL$(74)=",}IST. "130 GOSUB 9500135 POKE 764,255140 IF PEEK(764)=255 THEN GOTO 140145 LIST :FOR N=1 TO 1000:NEXT N150 SL$=" AND TH,}AT IS ALL THERE IS T"155 SL$(28)="O IT. HOPE THAT YOU "160 SL$(51)="FIND THESE SUBROUTINES "165 SL$(74)="HANDY. "170 G,}OSUB 9500175 END 9000 REM ****************************9010 REM * SET UP THE STATUS LINE *9020 REM *********************,}*******9030 POKE 106,PEEK(740)-29040 DL=(PEEK(106)+1)*2569050 GRAPHICS 09060 FOR N=0 TO 369070 READ D9080 POKE DL+N,D9,}090 NEXT N9100 POKE DL+9,PEEK(88)9110 POKE DL+10,PEEK(89)9120 POKE DL+4,DL/2569130 POKE DL+5,509140 POKE DL+35,DL/25691,}50 POKE 561,DL/256:POKE 560,09160 RETURN 9500 REM ****************************9510 REM * PRINT TO STATUS LINE *9520 R,}EM ****************************9530 TLC1=PEEK(88):TLC2=PEEK(89)9540 POKE 82,0:POKE 83,409550 POKE 88,DL/256:POKE 89,50956,}0 ? CHR$(125):POSITION 0,09570 ? SL$9580 POKE 88,TLC1:POKE 89,TLC29590 ? CHR$(125):POSITION 0,09600 RETURN 9990 REM ****,}************************9991 DATA 112,0,0,66,0,0,2,0,66,0,09992 DATA 2,2,2,2,2,2,2,2,2,2,2,2,29993 DATA 2,2,2,2,2,2,2,2,2,,}2,65,0,09994 REM ****************************,0,2,0,66,0,09992 DATA 2,2,2,2,2,2,2,2,2,2,2,2,29993 DATA 2,2,2,2,2,2,2,2,2,,/@SLDTLCTLC%%*******************************%%* 0} *%%* STATUS LINE SUBROUTINES *%%* by *%%* Algie Gray0} *%%* *%%* For Atari Classic 1993 *%%* * 0}%%*******************************d;@,i An%%6. THESE TOP TWO LINES ARE TOs**67@(,.TALLY0} IMMUNE TO SCROx**67@Q,.LLING. PRESS A KEY TO L}67@t,.IST.  AAdAU"0}F:Ad,"AU" A@-@A %%6. AND THAT IS ALL THERE IS T**67@(,.O IT. HOP0}E THAT YOU **67@Q,.FIND THESE SUBROUTINES 67@t,.HANDY.  A(#""*******************0}*********2#""* SET UP THE STATUS LINE *<#""****************************F# AF:A@,&@P#$$6-+F:A0},%@,$AVZ# +d#-@6n#"x# %# #%@ F:@,#%@F:0}@,#%@'AV#%@@P#%@5'AV#)Aa'AV)A`#0}$%""****************************&%""* PRINT TO STATUS LINE *0%""****************************:%!6-F:@,!0}6-F:@,D%'@'@@@N%)@'AV)@@PX%"(>:A%,"-0}b%(l%@@v%"(>:A%,"-%$'""****************************'112,0,0,60}6,0,0,2,0,66,0,0'2,2,2,2,2,2,2,2,2,2,2,2,2 ' 2,2,2,2,2,2,2,2,2,2,65,0,0 '""**************************** D1:S0}TATUS.BAS66,0,0'2,2,2,2,2,2,2,2,2,2,2,2,2 ' 2,2,2,2,2,2,2,2,2,2,65,0,0 '""**************************** D1:S0 0100 ;%%%%%%%%%%0110 ;%0120 ;% BASIC OFF . ASM0130 ;%0140 ;% by Joseph R. Chiko0150 ;% during July and August 19940160 4};%0170 ;% This program was designed to turn0180 ;% the BASIC cartridge off on a0190 ;% XL/XE. The program works for both4}0200 ;% Atari DOS 2.5 and SpartaDOS 3.2d.0210 ;% It may work the SpartaDOS 2.3? or0220 ;% the new release by FTE of 3.2g,04}230 ;% but as of August 10, 1994, I have0240 ;% not had the time or desire to test0250 ;% this. Perhaps at some future dat4}e0260 ;% I will, but for now I am0270 ;% satisified with this program's0280 ;% capabilities.0290 ;%0300 DOSVEC = $0A0314}0 SAVMSC = $580320 RAMTOP = $6A0330 SDMCTL = $022F0340 SDLSTL = $02300350 COLOR2 = $02C60360 COLOR4 = $02C80370 RUNAD =4} $02E00380 INITAD = $02E20390 MEMTOP = $02E50400 ;%%%%%%%%%%0410 ;%0420 ;% I/O Control Blocks0430 ;% 7 blocks starting4} at $03400440 ;% X points to the 1st byte in block0450 ;%0460 ICHID = $0340 ; index to device name0470 ICDNO = $0341 4} ; device number0480 ICCOM = $0342 ; command0490 ICSTA = $0343 ; status0500 ICBAL = $0344 ; buffer address0510 ICPT4}L = $0346 ; put one-byte address0520 ICBLL = $0348 ; buffer length0530 ICAX1 = $034A ; aux byte 10540 ICAX2 = $034B 4} ; aux byte 20550 ICAX3 = $034C ; aux byte 3/4 points0560 ; to disk sector0570 ICAX5 = $034E ; aux by4}te 5 points0580 ; to byte in sector0590 ICAX6 = $034F ; aux byte 60600 BASICF = $03F80610 BFLG = $07004} ; boot flag0620 SDOS = $0700 ; SpartaDOS0630 BRCNT = $0701 ; # of boot sectors0640 SDOSVER = $0701 ; SpartaDOS ver4}sion0650 PBCOPY = $0774 ; portb Copy0660 CRTAIN = $BFFC ; cart a inserted?0670 RESET = $C2AA0680 PORTB = $D3010690 WSY4}NC = $D40A0700 CIOV = $E4560710 *=$06700720 IOCB .BYTE 00730 EDITOR .BYTE "E:",1550740 SPARTADOS .BYTE "S"0750 ENTERB4}ASICOFF0760 CLD 0770 ; % is BASIC already off0780 LDA PORTB0790 AND #$020800 CMP #$0208104} BEQ EXITBASICOFF0820 TURNBASICOFF0830 LDA PORTB0840 ORA #$020850 STA PORTB0860 ; % do the4} same to basicf0870 LDA #$010880 STA BASICF0890 ; % ensure that carta isn't inserted0900 STA CR4}TAIN0910 ; % adjust ramtop0920 LDA #$C00930 STA RAMTOP0940 ; % test for SpartaDOS0954}0 LDA SDOS0960 CMP SPARTADOS0970 BNE TURNEDITOROFF0980 ; % test for version 3.20990 LDA SDO4}SVER1000 CMP #$321010 BNE TURNEDITOROFF1020 ; % SpartaDOS 3.2d keeps the last 81030 ; 4} % values of PORTD starting at1040 ; % $0774, so I am going to ORA all1050 ; % 81060 LDX #4}$FF1070 ORPORTBCOPY1080 INX 1090 LDA PBCOPY,X1100 ORA #$021110 STA PBCOPY,X1120 CPX #$071130 B4}NE ORPORTBCOPY1140 TURNEDITOROFF1150 LDX IOCB1160 LDA #$0C1170 STA ICCOM,X1180 JSR CIOV1190 BPL TUR4}NEDITORON1200 JMP RESET1210 TURNEDITORON1220 LDX IOCB1230 LDA #$031240 STA ICCOM,X1250 LDA #EDITOR&4}$00FF1260 STA ICBAL,X1270 LDA #EDITOR/2561280 STA ICBAL+1,X1290 LDA #$0C1300 STA ICAX1,X1310 LD4}A #$001320 STA ICAX2,X1330 JSR CIOV1340 BPL CHANGECOLORS1350 JMP RESET ; on CIOV error RESET1360 CHANG4}ECOLORS1370 ; % change the background color1380 LDA #$041390 STA COLOR21400 ; % chang4}e the border color1410 LDA #$B21420 STA COLOR41430 ; % code used when testing BASICOFF1440 ; 4} % to see if I was on the right1450 ; % track1460 ; LDA SDOS1470 ; CMP Sp4}artaDOS1480 ; BNE exitBASICOff1490 ; JMP (dosvec)1500 EXITBASICOFF1510 RTS 1520 *=INITA4}D1530 .WORD ENTERBASICOFF1540 .END 1490 ; JMP (dosvec)1500 EXITBASICOFF1510 RTS 1520 *=INITA4. X;%%%%%%%%%%X;%X;% BASIC OFF . ASM(X;%2X;% by Joseph R. Chiko<"X;% during July and August 1994FX;%P(X;% 9}This program was designed to turnZ#X;% the BASIC cartridge off on ad)X;% XL/XE. The program works for bothn(X;% Atari DOS9} 2.5 and SpartaDOS 3.2d.x(X;% It may work the SpartaDOS 2.3? or&X;% the new release by FTE of 3.2g,(X;% but as of August9} 10, 1994, I have)X;% not had the time or desire to test)X;% this. Perhaps at some future dateX;% I will, but for now9} I am%X;% satisified with this program'sX;% capabilities.X;% DOSVEC SAVMSCX RAMTOPjSDMCTL/9}SDLSTL0COLOR2COLOR4 RUNAD"INITAD,MEMTOP6X;%%%%%%%%%%@X;%JX;% I/O Control Blocks9}T"X;% 7 blocks starting at $0340^)X;% X points to the 1st byte in blockhX;%r$ICHID@;; index to device name|ICDN9}OA;; device numberICCOMB;; commandICSTAC;; statusICBALD;; buffer address$ICPTLF;; put one-byte 9}addressICBLLH;; buffer lengthICAX1J;; aux byte 1ICAX2K;; aux byte 2#ICAX3L;; aux byte 3/4 points9};to disk sector!ICAX5N;; aux byte 5 points;to byte in sectorICAX6O;; aux byte 6BASICFBFLG;9 }; boot flagSDOS;; SpartaDOS!BRCNT;; # of boot sectors&#SDOSVER;; SpartaDOS version0PBCOPYt;; portb9 } Copy:!CRTAIN;; cart a inserted?D RESETN PORTBX WSYNC b CIOVVl X* = $0670v IOCB EDITOR A9 }E:A=SPARTADOS ASAENTERBASICOFF-;% is BASIC already off QPORTBM>R>FEXITBASICOFFTURNBAS9 }ICOFF QPORTBL> PPORTB;% do the same to basicf Q> PBASICF ';% ensure that carta isn't inserted* PCRT9 }AIN4;% adjust ramtop>Q>H PRAMTOPR;% test for SpartaDOS\ QSDOSfRSPARTADOSpHTURNEDITOROFFz;% test for ve9}rsion 3.2 QSDOSVERR>2HTURNEDITOROFF&;% SpartaDOS 3.2d keeps the last 8";% values of PORTD starting at&;% 9}$0774, so I am going to ORA all;% 8$>ORPORTBCOPY2 QPBCOPY9L> PPBCOPY9(>HORPORTBCOPYTU9}RNEDITOROFF$ $IOCB.Q> 8 PICCOM9B CIOVLITURNEDITORONV !RESET`TURNEDITORONj $IOCBtQ>~ PICCOM9 Q>4E9}DITOR PICBAL9 Q>5EDITORPICBAL9Q>  PICAX19Q> PICAX29 CIOVICHANGECOLORS !RESET;; on CIOV9} error RESETCHANGECOLORS";% change the background color Q> PCOLOR2;% change the border color(Q>2 PCOL9}OR4<&;% code used when testing BASICOFFF#;% to see if I was on the rightP ;% trackZ ;LDA SDOSd;CMP SpartaDOSn;B9}NE exitBASICOffx;JMP (dosvec)EXITBASICOFF:X* = initad ENTERBASICOFFZ ;LDA SDOSd;CMP SpartaDOSn;B8XPQzOOGSUMCOLCARDCLTLRPSHSSRCRPAUTBRGYZLPNXBBCTTHHMHMVVMVMXM=}XXMHHMHMVVMVMXMXXMCOVPSHASHASHASHASHASHASHASHASHA1SHA1GGAMCFLAERAMTOCHBAADDCHAPOPAGPMSHA=}SHA2SHA3SHA4SHA5SHA6SHA7SHA8SHA9SHA10SHA11PAMPMBASTALKCOVLIANIIOCADADNMNMC@@@=}@ =} !"=}#$%&'()*+,-./01=}23456789:;<=>?@A=}BCDEFGHIJKLMNOP=}QRSTUVWXYZ[\]^_`=}abcdefghijklmnop=}qrstuvw%%%%| TV BINGO by Spaghett= }i Head |%%| -------------------------- |%%| digitized speech version |%%| with COVOX.SYS & BINGO.DAT |%%=!}| -------------------------- |%%| New Atari Classics |%% dhD9@u="},9@,9@,9@<@,;@,P6-@$\6-ADh6-Af6. h! +=#} A P! APj##l~%6-P:H:,$A,%@PA2@@=$}U-@@Y {2~$n= -@w6@62@: =$t=%}q-APAU32@@7 K-@@Pm2AU@@q vg -A=&}6@>2@'@`2d g$x##֮z='}, @6-%Av)6-A`,$|C6-P:'@,$6-&$@26-%Av@6-%AvC$~##=(}."@$.6-?:<@<<@<<,."@r.6-?:<@<<@<<,T:=)},"$1""@*T:@,".6-@1$1F:@,@$6-@''1 Ax33R:=*},"@*R:@,"@A2##-----------------------------*R:,"@**6-%@*R:@=+},"@**6-%@*R:,"@**6-&@*R:@,"@**6-&@##----=,}-------------------------DR:,"@**6-%@6"@dD6-%@*R:@,"@**6=-}-%@DR:,"@**6-&@6"@dD6-&@*R:@,"@**6-&@ =.} A(##Ϡ*6-&@" '* AB=%"@)+"@*@,9=/}-@A= 1"@*"@%6-@16-@$##Π*-@=0}@u&68,-* *-@@&68,-* )@w)"@uAF"@=1}A"%%6-P:H:,$@,%@8,"@A68,-8,%@6-$@6-&@=2}%%6-%P:+&%@,$H:,,"8,A$ 68,-6-%@$ A"3!@`6-@)6=3}-&@X3 A3!@E6-@)6-&@C3 A3!@06-@ )6-&@(3 A=4}3!@6-@)6-&@3 A6-@6-%@ -(>:,>:,#"@ A#=5} A - @( ( A 6-6-6-##ˠK"@=6}6-Ah'6-@@3"@?6-AhK6-@="@)"@+@=@ =7}"@6-6-%6-@6-@% A(' @d6-@'6-1!@d)"@%=8}6-@16-@'"@6-6-!6-'6--6-+'@,&@-6-+'@,&8<,"=9}Ax'6-8<,"8,6-' A"8<,AxD68<,- 6-,6-86-=:}D6----+'@,&@+'@,&@(>:,>:, A##Ϡ=;}"6-%@"@6-%@!!"@$)"@$AV!!"@*!@A""=<}@Adk"@*8@<@%,%8@<@%,%8@<@%,%8@<@%,"w6==}-@ӛ~X8<@%,%8<@%,%8<@%,%8<@%,%8<@%,"f6-%@t6=>}-%@~ӛqN8@<,%8@<,%8@<,%8@<,%8@<,"\6-%@j6-%@=?}qӛg"&*8@<@%,%8@<@%,%8@<@%,%8@<@%,"u6-%@=@}6-%@ܛ o%&"@*8@<@%,%8@<@%,%8@<@%,%8@<@%,"=A}}6-%@6-%@ !!"*"Ax##----------------------"6-=B}%!"@6-%! A"A#6-%@"@#6-"@6-"=C}A#6-%@"@#6-"@6- 1"@6-%@%"&16-@")"=D}@*%&"@)6-@$ A&"A(#6-%@"@#6-*"@6-=E},"A.#6-%@"@#6-0"@6-21"@6-%@%"&16-@=F}4)"@*%&"@)6-@6"@AV8)"@*!@6-) AV:)"@*=G}!@6-) AV<--"@*+"@)"@,AV> Ax@##î--------------------B-=H}@@@D-@%@%F,6-8<, 6-@%,6-@H  A@J-=I}@@L##-@%@%@N,6-8<, 6-@%,6-@P  A@R A=J}VT!!")"@AxV6-@ A"X##ĠZ-@@(=K}(\+-@@+(Sorry, you missed^( a number...` A ABb##ϡ-----------------------d=L}.6-?:<@<<<<,Y6-?:<@<<<<,6-?:<@<<<<=M},6-?:<@<<<<,f//6-?:C:,<@<@<@<@4,h"6-j=N}"@6-@Hl!@A2n/6-@6-@/"@Ap##ͱ-----------------------=O}---r"@<6-?:<@<<@6<AD<@$%,i6-?:<@<<@6<A<@$%,u! A=P}ft}!"&*+"@)"@,H6-?:<<<@ <AD<@$%,o6-?:<<<@<Ah<@H%,y A=Q}d}ܛv)%&"@*+"@)"@,P6-?:<<<@ <AD<@@%,w6-?:<<<@<Ah<@$=R}%, Adxe"@)"@86-?:<<<@<AD<,W6-?:<<<@<Ah<,a Adețzi=S}"@)"@D6-?:<@<<<<,e6-?:<<<@6<<@$%,i֛| AB~##Ͳ-----=T}---------------------"@Au!*"@@6-?:<<<@ <AD<@$%,g6-?:<<<@=U}<Ah<@H%,q Aduܛu!*"@@6-?:<<<@ <AD<@@%,g6-?:<<<@<Ah=V}<@$%,q Adu Au!*"@@6-?:<<<@ <AD<@$%,g6-?:<<<@=W}<Ah<@H%,q Aduܛu!*"@@6-?:<<<@ <AD<@@%,g6-?:<<<@<Ah=X}<@$%,q Adu!6- A A!6- A AO"6-?:<=Y}<<@<AD<,A6-?:<<<@<Ah<,K AdOț+"@6-!6-@+ A+"@=Z}6-!6-@+ A"@A!6- A  A"!6- A =[} A"2$6-?:<<<@6<<@$%,. Ad2֛"AB"@6-"@=\}6-8.6-?:<@<<<<,8 A ##ͳ------------------------i"@<6-?:<@=]}<<@6<AD<@$%,i6-?:<@<<@6<Ah<@$%,i"@<6-?:<@<<@<AV<=^}@$%,i6-?:<@<<@<AV<@V%,i"@<6-?:<@<<@6<AD<@$%,i6-?:<=_}@<<@6<A<@$%,"@<6-?:<@<<@6<AD<@$%,i6-?:<@<<@6<A=`}h<@$%,6-?:<@<<@6<A<@$%,##­'@@'-@=a}@!("@(|Gogo"(|Same%-@@"%( NewEnd|%=b}(%6-@.AR'-@@".(33T:,")T:@,"A=c}rC+R:,"@)R:@,"@96-%@C AdC+R:,"@)R:@,"@96-&@=d}C Ad AVC @!-@@"- @96-@C AV!"@!-@@"=e}C!@!-@@"-!@96-@C AV ( A AV AAR@=f}.6-?:<@<<<<,Y6-?:<@<<<<,6-?:<@<<<=g}<,6-?:<@<<<<,%-@@!((%(."@!B2w=q}B%DOS SYSB)AUTORUN SYSB<AUTORUN M65BDCUSTBOOTBASB[CUSTBOOTTXTB)`WELCOME SMPB"MENU BAWPUT LSTBAWGET LSTBAWPUT BASBAWGET BASBSTATUS LSTBSTATUS BASB BASICOFFASMBBASICOFFM65BBINGO BASBBINGO LSTBBINGO DATBKEYCODE3LISBVKEYCODE3COMBcgKEYCODE3M65BCOVOX SYS++."@APכ#"A#ůϛ%"@u6-@% A%6-%@=r}% @A##Π (}AR@)6-%@"@)6-@=s}6"@#-@@268,-6 %%6-P:H:,$@,%@"8,A 68,-=t} A%$@IAA'AA36-@P= AIίěJA@h'A=u}@h36-A0= AJίśLAA'AA36-A= ALůΛK=v}AA2'AA236-@= AKůכ3A@'A@36-)=w}-@%A%) ##Š6-6-'6-36-?6=x}-K6-W6-c6-o6-{6-6-6-6-6-6-=y}6-'6-36-?6-K6-W6-c6-o6-{6-6-=z}6-I 68@<@,-=68@<@,-I6- ?6-@6-@-@={}@?-@ H:,!?P(--(%   ɠΠǠ--(%| B I N G O| =|}  --(% | | | | | |--(%| | --(%| =}} | | | | | | |--(%| | --(%| | | | |[]| | |--=~}(%| | --(%| | | | | | | | --(%| | =}"--(%| | | | | | | |$--(%| | &--(%| | =} ɠΠǠ(--(%| | *--(%| | | | | | | |,--(%| =} | .--(%| | | | | | | |0--(%| | 2--(%=} | | |[]| | |4--(% 6--(% | | | | | |=}8--(% :--(% | | | | | |<..(& =}>6-@$6-@@*-@@u&68,-* B-@@D!!"@E*"@=}AF6-P:H:,$,%@H  &@)"8,AJ 68,-L""68'@<+'@,&,-N/=} @*"@%-@%/ AP -R(T6-%@ V'"@u6-%@' AX6=}-%@6-%@Z%"6-@% Ax\%"@6-@% Ax^"@A`=}6-@ Atb##Šd@@f-@@((h--@@=}!"@-6-@j7"@(%"@7-@ @l-"@(Any line-( or 4 corner=}sn"@( Two linesp"@(Letter Xr!"@!( Picture framet"@(Blackoutv!!=}")"@AtxA6z Ax|)"@*!@6-) AV~)"@*!@=}6-) AV--"@*+"@)"@,AV1"@6-@'6-1 A"--"@=}*+"@$)"@$,AV Ax##Π^6-!AR@3A=}AxEAW@@^(}&&(&&(| =} |&&(| TV BINGO |&&(| |&&(|----------------------------|&&(|=} No. of Players |&&(|  |&&(| 1  |  2 |&&(| =} |&&(| |&&(|----------------------------|&&(| =} |&&(| A. Any line or 4 corners |&&(| B. Two lines |&&(| C. Letter X |&=}&(| D. Picture frame |&&(| E. Blackout |&&(| F. Go-go |&&(| =} |&&(}7+R:,"@)R:@,"@,*@C6-@=}U-@ @ [(m-@'@ s(2} A}7+R:,"@)R:@,"@,*@C6-@=}U-@'@ [(m-@ @ s(1} A??*+T:,")T:@,",A=} A% A!-@@%% @@@ 'AR9-@ @@(6-@=}6-?+T:,")T:@,"5 A? AV7+R:,"@)R:@,"@,*=}@E6-%@L(V AV7+R:,"@)R:@,"@,*@E6-&@L(V A=} A0AR@!-@ 0(>:Ay%,56-&@"@)6-@56-@K"@=}6-A'6-36-?6-K6-3"@6-@V'6-@r36-A=}A.-@@!.(宮##ɠ;@@,#AD:=}6-F:A,&@&A,6-:6-$AVA-@@@"'67,.>:,+ A6-?:C:,<<@,!6=}-@Y!6-%+$@,)-@"%+%,) !6-@a!6-%+$@,)-@=}"%+%,) + +AV+AYSS104,104,133,207,104,133,206,104,104,133,212,169,0,133,204,16=}9,224,133,205,162PP1,160,0,177,204,145,206,200,208,249,230,205,230,207,232,228,212,208,240,96??255,242,242,242,226,13=}0,134,255,255,79,79,79,71,65,97,255##ԠRR;@H,;A,;@,;@,;@6=},;@6,;@ ,GG;@,;@ ,;@,;@6,;@6,;@6,9 6-C:,6-C:,6-C=}:,'6-C:,06-C:,96-C:,0 6-C:,6-C:,6-C:,'6-C:,06-C:,6-@@)67,.>:A,- 6=}қ6-@@)67,.>:A,- 6Ȯś> #A!-@@6%"167,.>:,5 >֮ś=}A #A!-@@6%"167,.>:,5 Aӛ A= #A"!-@@ %"167,.>:,=}5 =ܛ> #A8!-@@%"167,.>:,5 >ܛ= #A&!-@@ %"167,.>:,5=} =ԯ? #A2!-@@%"167,.>:,5 ?Ԡ > #A"!-@@6%"167,.>:,5 =}>Ԡ؛  A? #A2!-@@6%"167,.>:,5 ?Ԡ؛@ #AB!-@@6%"1=}67,.>:,5 @ԛ 6-C:,6-C:,= #AR!-@@H%"167,.>:,96-%=  AI=}6-#-@@p'"367,.>:,;6-%? I A=-@qA@"'67,.>:,/6-%3 = A=}3-AAA"'67,.>:,/6-%3 O BByF:A,&@=AF:A,&@OA=}@  +AV"-6-F:A,$AV-6-?:<<@,$/-@+B2V%@/ =}&CA#@'B2w@9AY@FC A(192,192,192,192,0,0,0,0*192,192,192,192,0,0,0,=}0,192,192,192,192,0,0,0,0.192,192,192,192,0,0,0,00192,192,192,192,0,0,0,020,0,0,0,0,0,0,0,0,0,0,040,=}0,0,0,0,0,0,0,0,0,0,06192,192,192,192,0,0,0,0824,24,24,24,0,0,0,0:3,3,3,3,0,0,0,0<24,24,24,24,0,0,0,0>=}192,192,192,192@3,3,3,3,0,0,0,0B24,24,24,24,0,0,0,0D0,0,0,0,0,0,0,0F24,24,24,24,0,0,0,0H 3,3,3,3J=}216,216,216,216,0,0,0,0L216,216,216,216,0,0,0,0N216,216,216,216,0,0,0,0P216,216,216,216,0,0,0,0R216,21=}6,216,216T104,201,2,240,16,133V206,162,0,228,206,208X1,96,104,104,232,169Z0,240,244,104,133,204\104,=}133,203,104,104,133^205,169,0,168,170,145`203,200,208,251,230,204b232,228,205,208,244,96d104,201,5,240,18=},141f0,4,162,0,236,0h4,208,1,96,104,104j232,169,0,240,243,104l104,201,9,144,9,104n104,104,104,104,10=}4,104p104,96,24,201,0,240r242,141,4,4,104,133t206,104,133,205,104,104v141,5,4,104,104,141x2,4,104,10=}4,141,3z4,174,4,4,173,2|4,157,255,207,224,5~176,2,144,5,169,0141,4,4,165,207,2012,240,28,165,106,2=}4105,3,109,4,4,133204,169,0,133,203,168145,203,200,208,251,1733,4,133,203,24,14465,165,106,24,1=}05,1133,204,169,128,133,203173,4,4,240,21,1620,165,203,24,105,128133,203,165,204,105,0133,204,2=}32,236,4,4208,237,160,0,152,145203,200,192,127,208,249173,3,4,201,128,1441,96,101,203,133,20316=}5,204,105,0,133,204160,0,204,5,4,2408,177,205,145,203,20024,144,243,96##Ԡ=}&&;A,;A8,;A,767A8,. %67A,. 76. D:BINGO.DAT7@7@@=} D:COVOX.SYS.6-@6-C:,$6-A8. A b- 6-C:,6-A" A b-@6-?:C:=},=1 A}THEN AUTO=2:POP :GOTO 190174 E=4:F=3:I=0:L=0175 FOR X=1 TO 75176 G(X)=0:G2(X)=0:NEXT X177 N=INT(RND(0)*75)+1178 IF I=75 A}THEN E=4:F=3:L=0:GOTO 183179 IF N=G(N) THEN 177180 G(N)=N:I=I+1:G2(I)=N181 IF I=16+L THEN E=E+3:F=3:L=L+15182 POSITION E,A}F:? "":F=F+1:GOTO 177183 FOR X=1 TO 75184 POSITION E,F:? " ":F=F+1186 IF X=15+L THEN E=E+3:F=3:L=L+15188 G(X)=0:NEXT X:IA}=0190 POKE 77,0:IF I=75 THEN 346192 IF AUTO=1 THEN 222194 I=I+1:N=G2(I):G(N)=N:GOSUB 122234 IF CARD(A,B)=0 THEN 190238 IA}F N<>CARD(A,B) THEN 190268 IF T=0 AND CC=0 THEN 190318 GOTO 190340 IF CK=0 OR K=5 THEN 190634 GOTO 190646 GOTO 190238 I@x@\KA[CU/@@Io,@#@'/@#@"9,@&@K/@&@"],@)@E}o/@)@"Jo,@2@'/@2@"9,@5@K/@5@"],@8@o/@8E}@#K7\C"!(3-@#7(L/-@@(G0f9v!Lb;f#<nE}dMd_a;ПF3;f, M0Ï?xq >0|q?xa?c?aE}?aC|`?|@~?1pw9G?{w=?`_E}?;~  ?0`?>?x~>~E}???? ????Dr10 ;KEYCODE3.M6520 ;Rewritten 11/87 by Bob Hardy30 ;from an original program40 ;by Bob Hardy50 ;60 ;Revision of 4/30/89I}70 ;80 ;90 .OPT OBJ0100 .OPT NO LIST0110 .INCLUDE #D8:SYSEQU.M650120 .INCLUDE #D8:MACROLIB.M650130 I} .INCLUDE #D8:GREQU.M650140 .INCLUDE #D8:GRAPHICS.M650150 ;0160 ;---------0170 ; Equates0180 ;---------0190 ;0200I} ;IOCB LOCATIONS0210 ;--------------0220 ;0230 ; The IOCBs are the Atari's I/O0240 ; channels. They are a 'safe'0250 ; I}way to do I/O in that they are0260 ; always compatible and always0270 ; 'legal'. The worst you can do0280 ; with IOCBs isI} an I/O error.0290 ; There are no 'illegal' calls.0300 ;0310 ;ICCOM = $0342 ;command0320 ;ICBAL = $0344 ;buf. adr., lI}o0330 ;ICBAH = $0345 ;buf. adr., hi0340 ;ICBLL = $0348 ;buf. len., lo0350 ;ICBLH = $0349 ;buf. len., hi0360 ;ICAX1 I}= $034A ;AUX10370 ;ICAX2 = $034B ;AUX20380 ;0390 ;OS REGISTERS, ETC.0400 ;------------------0410 ;0420 ; These are I}too complex to try0430 ; to document here. For details0440 ; see 'Mapping The Atari' from0450 ; COMPUTE! books.0460 ;04I}70 ;WARMST = $080480 BOOT? = $090490 POKMSK = $100500 ;LMARGN = $520510 ;SAVMSC = $580520 INVFLG = $02B60530 SHFLOK = $I}02BE0540 ;COLOR1 = $02C5 ;(709)0550 ;COLOR2 = $02C6 ;(710)0560 ;COLOR4 = $02C8 ;(712)0570 CRSINH = $02F00580 CH1 = I}$02F20590 CHREG = $02FC ;(764)0600 DSPFLG = $02FE0610 CONSOL = $D01F0620 IRQEN = $D20E0630 PUTBYTES = $0B0640 ;0650 I};VECTORS0660 ;-------0670 ;0680 COLDST = $02440690 KEYDEL = $02F10700 ;CIOV = $E4560710 WARMSV = $E4740720 ;0730 ;ZEI}RO-PAGE 2-BYTE POINTERS0740 ;-------------------------0750 ;0760 SCRPTR = $CB0770 TXPTR = $CD0780 ;0790 ;KEYPRESS VALUEI}S:0800 ;----------------0810 ;0820 ; CONSOLE KEYS0830 ;0840 SELECT = 50850 START = 60860 ;0870 ; ATASCII CHARI}ACTERS0880 ;0890 SPACE = $200900 ;EOL = $9B0910 ;0920 ; CHREG VALUES0930 ;0940 NOKEY = $FF0950 ;0960 ;0970 I} *= $40000980 ;0990 TOP1000 CLC 1010 CLD 1020 JSR NOBREAK ; Disable BREAK1030 LDA SAVMSC ; Store staI}rt1040 STA SCRPTR ; adr of screen1050 LDA SAVMSC+1 ;memory in ZPG1060 STA SCRPTR+1 ;screen pointer1070 JI}SR SETUP ; Print opening1080 ; message and1090 ; wait for1100 ; START keI}ypress1110 ;1120 RESTART1130 JSR NOBREAK ;Kill BREAK1140 LDA #0 ;Turn cursor1150 STA CRSINH ;on, normaI}l1160 STA DSPFLG ;CTRL chars1170 STA COLOR4 ;Black border1180 LDA #2 ;Left margin=21190 STA LMARGNI}1200 STA COLOR2 ;Gray backgrnd1210 LDA #$0A ;White letters1220 STA COLOR11230 LDX # MAINSCRN ;main scrn1250 LDA #901260 JSR PRINT1270 JSR OPENK ;OPEN K:1280 LDA #NOKEYI} ;Clear key reg1290 STA CHREG1300 LDA #0 ;Clear Inverse1310 STA INVFLG ;lock.1320 LDA #64 ;SetI} all CAPS1330 STA SHFLOK1340 JSR KEYCHK ;Wait for key-1350 JSR KEYIN ;press & get key1360 JSR CLOSE1 I};Close K:1370 LDA CH1 ;Get last key1380 STA KEYBUF ;accepted &1390 ; store it.1400 JSR MAI}KEINT ;ATASCII code1410 ; is converted1420 ; to internal1430 ; code and1440 I}; stored in1450 ; INTBUF1460 LDA KEYBUF ;Recover1470 ; keyboard code148I}0 JSR MAKEDEC ;Convert to1490 ; ATASCII digits1500 LDY #21510 ;1520 MOVKEYDEC1530 LDA ATAHUNSI},Y ;Move the1540 STA KEYBDEC,Y ;result to1550 DEY ; KEYBDEC1560 BPL MOVKEYDEC1570 LDA KEYBUF ;GI}et keyboard1580 JSR HEXCONV ;code and1590 LDY #2 ;convert to HEX1600 ;1610 MOVKEYHEX1620 LDA ATAHUNS,Y I};Move the1630 STA KEYBHEX,Y ;result to1640 DEY ; KEYBHEX1650 BPL MOVKEYHEX1660 LDA INTBUF ;Get I}internal1670 JSR MAKEDEC ;code & convert1680 LDY #2 ;to ATASCII1690 ;1700 MOVHARDEC1710 LDA ATAHUNS,Y ;I}Store the1720 STA HARDDEC,Y ;result in1730 DEY ; HARDDEC1740 BPL MOVHARDEC1750 LDA INTBUF ;Get I}internal1760 JSR HEXCONV ;code & convert1770 LDY #2 ;TO HEX1780 ;1790 MOVHARDHEX1800 LDA ATAHUNS,Y ;MovI}e the1810 STA HARDHEX,Y ;result to1820 DEY ; HARDHEX1830 BPL MOVHARDHEX1840 LDA ATBUF ;Get ATAI}SCII1850 JSR MAKEDEC ;charcode and1860 LDY #2 ;convert to DEC1870 ;1880 MOVATDEC1890 LDA ATAHUNS,Y ;StoI}re the1900 STA ATDEC,Y ; result in1910 DEY ; ATDEC1920 BPL MOVATDEC1930 LDA ATBUF ;Get ATASCII}I1940 JSR HEXCONV ;Convert to HEX1950 LDY #21960 ;1970 MOVATHEX1980 LDA ATAHUNS,Y ;and store the1990 STI}A ATHEX,Y ;result in ATHEX2000 DEY 2010 BPL MOVATHEX2020 LDA #1 ;Turn cursor off2030 STA CRSINH2040I} LDX # ATAMSG ;message2060 LDA #ATALEN ;msg. length2070 JSR PRINT2080 I} LDA SAVMSC ;Add $0170 to2090 CLC ;scrn ptr2100 ADC #$70 ;low byte...2110 STA SCRPTR2120 LDI}A SAVMSC+1 ;high byte...2130 ADC #12140 STA SCRPTR+12150 LDA INTBUF ;Get char &2160 LDY #0 ;poke itI} into2170 STA (SCRPTR),Y ;scrn RAM2180 LDX # KEYMSG ;ware message2200 LDAI} #KEYBLEN ;msg. length2210 JSR PRINT2220 JSR OPENK ;Clear any2230 LDA #NOKEY ;keypresses...2240 STA CHI}REG2250 BNE QUITS?2260 DONTQUIT2270 JMP NOQUIT2280 ;2290 ; Is the user finished?2300 ;2310 QUITS?2320 LDAI} CONSOL ;Select press?2330 CMP #SELECT2340 BNE DONTQUIT ;Nope.2350 LDX # QUITMI}SG ;Get user to2370 LDA #QMSGLEN ;confirm.2380 JSR PRINT2390 JSR KEYCHK ;Wait for key.2400 JSR KEYIN ;I}Get keypress.2410 LDA ATBUF2420 AND #$7F ;ASCII only2430 CMP #'Y ;Was it "Y"?2440 BEQ EXIT ;YupI}per!2450 JSR SCRPUT ;Nope. Print it2460 JSR CLOSE12470 LDA #EOL ;Print an EOL2480 JSR SCRPUT2490 I} JSR GR.0 ;purify screen2500 JMP RESTART ;and restart.2510 ALLDONE?2520 JMP QUITS?2530 NOQUIT2540 LDA CHJ}REG ;No...ANY key?2550 CMP #NOKEY2560 BEQ ALLDONE? ;No...2570 JSR KEYIN ;Yes!2580 JSR CLOSE1 ;CLOSE J}K:2590 LDA ATBUF ;Print the2600 JSR SCRPUT ;key pressed2610 JMP RESTART ;and restart.2620 ;2630 ; We're oJ}uta here.2640 ;2650 EXIT2660 JSR SCRPUT ;Print the key2670 JSR CLOSE1 ;Close K:2680 JSR CLOSE0 ;Close E:J}2690 LDA #NOKEY ;Clear CHREG2700 STA CHREG2710 LDA #$FF ;Normal RESET2720 STA WARMST ;status.2730 J} LDA #1 ;Tell OS disk2740 STA BOOT? ;boot was OK2750 LDA #0 ;and no reboot2760 STA COLDST ;on waJ}rmstart.2770 JSR GR.0 ;Purify screen.2780 JMP WARMSV ;Do warmstart.2790 ;2800 ;------------------------------J}-2810 ;2820 ; Subroutines -- what make the2830 ; flow of the program work.2840 ;2850 ;-------------------------------28J}60 ;2870 ;This is a general purpose2880 ;"Put bytes to E:"2890 ;subroutine.2900 ;2910 ;Text address lo,hi is stored2920J} ;upon entry in x,y.2930 ;Text length lo is stored2940 ;in A. Text length hi is2950 ;always assumed to be zero.2960 ;29J }70 PRINT2980 STX ICBAL ;Adrlo=X2990 LDX #0 ;IOCB#0 (E:)3000 STA ICBLL,X ;Lenlo=A3010 TXA ;J }Lenhi=03020 STA ICBLH,X3030 TYA ;Adrhi=Y3040 STA ICBAH,X3050 LDA #PUTBYTES ;Put cmnd.3060 STJ }A ICCOM,X3070 JSR CIOV3080 JMP NOBREAK3090 ;3100 ;This subroutine prints the3110 ;character stored in the3120 ;J }accumulator to the screen.3130 ;3140 SCRPUT3150 PHA ;Save A Reg.3160 LDX #0 ;IOCB #03170 TXA 3J }180 STA ICBLL,X ;LEN=03190 STA ICBLH,X3200 LDA #PUTBYTES ;Put cmnd.3210 STA ICCOM,X3220 PLA ;J}Restore A and3230 JMP CIOV ;print it.3240 ;3250 ; Do we or do we not have a3260 ; keypress? KEYCHK waits until32J}70 ; we get one.3280 ;3290 KEYCHK3300 LDA CHREG ;Any keypress?3310 CMP #NOKEY3320 BEQ KEYCHK ;Nope.3330 J} RTS ;Yep!3340 ;3350 ; We have a keypress. Let's3360 ; read it through IOCB #1.3370 ; (where the keyboard hapJ}pens3380 ; to already be open!)3390 ;3400 KEYIN3410 LDX #$10 ;IOCB #13420 LDA #7 ;Get bytes3430 STAJ} ICCOM,X3440 LDA #1 ;Lenlo=13450 STA ICBLL,X3460 LDA #0 ;Lenhi=03470 STA ICBLH,X3480 LDA #J} ATBUF3510 STA ICBAH,X3520 JMP CIOV3530 ;3540 ; OpeJ}n the keyboard. Nothing3550 ; visible happens, but you can3560 ; read from the keyboard now.3570 ;3580 OPENK3590 OJ}PEN 1,4,0,"K:"3600 RTS 3610 ;3620 ; Close IOCB #1. End-of-file.3630 ; We got our keypress. G'bye!3640 ;3650 CLOSJ}E13660 CLOSE 13670 RTS 3680 ;3690 ; Close IOCB #0. We're exiting.3700 ;3710 CLOSE03720 CLOSE 03730 J} RTS 3740 ;3750 ; Turn ATASCII keycode into3760 ; hardware (internal) code3770 ; and store the result in3780 ; INTBUF.J}3790 ;3800 MAKEINT3810 LDA ATBUF ;Get ATASCII3820 BMI FIXHI ;If inv, fix.3830 ;3840 LOKEY3850 CMP #32 J} ;Key>31?3860 BCS MIDKEY ;Yes.3870 CLC ;No - add 64.3880 ADC #643890 STA INTBUF ;ConversionJ}3900 RTS ;complete.3910 ;3920 MIDKEY3930 CMP #96 ;Key>95?3940 BCS HIKEY ;Yes - fix.3950 SEJ}C ;No - subtract3960 SBC #32 ;32 from key.3970 STA INTBUF ;Conversion3980 RTS ;complete.J}3990 ;4000 HIKEY4010 CMP #128 ;Key>127?4020 BCS FIXHI ;Yes.4030 STA INTBUF ;No - conversion4040 RTJ}S ;unnecessary.4050 ;4060 FIXHI4070 AND #$7F ;Clear bit 74080 JSR LOKEY ;Go do usual4090 ORA #$J}80 ;conversion,4100 STA INTBUF ;reset bit 7,4110 RTS ;and done.4120 ;4130 ; We don't want any BREAK eJ}rrors4140 ; crippling the program, so...4150 ;4160 NOBREAK4170 LDA POKMSK ;Disable the4180 AND #$7F ;BREAK kJ }ey4190 STA POKMSK4200 STA IRQEN4210 RTS 4220 ;4230 ; We want a nice display for the4240 ; user to look at, J!}and we want4250 ; the user to understand what is4260 ; going on. We'll dress up the4270 ; screen a bit and print out ourJ"}4280 ; explanatory message.4290 ;4300 SETUP4310 LDY #0 ;Black screen4320 STY COLOR2 ;and border4330 STJ#}Y COLOR44340 LDA #10 ;White text4350 STA COLOR14360 LDA # INTROTX4390 STA TXPTR+14400 ;4410 FASTPRNT4420 LDA (TXPTR),Y ;Get scrntext4430 CMPJ%} #128 ;Last char?4440 BEQ STARTPRS ;Yes-chk START4450 STA (SCRPTR),Y ;No, move4460 INY ;char to scrJ&}mem4470 BNE FASTPRNT4480 INC SCRPTR+1 ;Step up SCRPTR4490 INC TXPTR+1 ; and TXPTR4500 BNE FASTPRNT4510 ;J'}4520 STARTPRS4530 LDA CONSOL ; START pressed?4540 CMP #START4550 BNE STARTPRS ;Nope!4560 RTS ; J(}Yes!4570 ;4580 GR.0 ; Keep the macro4590 GRAPHICS 0 ;from needlessly4600 RTS ;being reassembleJ)}d4610 ;4620 ;-------------------------------4630 ;4640 ; Buffers, text & storage space4650 ;4660 ;---------------------J*}----------4670 ;4680 KEYBUF4690 .DS 14700 INTBUF4710 .DS 14720 ATBUF4730 .DS 14740 ;4750 MAINSCRN4760 J+} .BYTE 125,EOL,"Keycode Getter",EOL4770 .BYTE "Written by Bob Hardy with MAC/65",EOL,EOL4780 .BYTE "Press a key fJ,}or which you want codes:",EOL,EOL4790 ATAMSG4800 .BYTE EOL,EOL4810 .BYTE "ATASCII:",EOL4820 .BYTE "Char: "J-},EOL4830 .BYTE "Dec: "4840 ;4850 ATDEC4860 .BYTE " Hex: $"4870 ;4880 ATHEX4890 .BYTE " ",EOL,EOL490J.}0 ATALEN = *-ATAMSG4910 ;4920 KEYMSG4930 .BYTE "Hardware code:",EOL4940 .BYTE "Dec: "4950 HARDDEC4960 .BYTEJ/} " Hex: $"4970 ;4980 HARDHEX4990 .BYTE " ",EOL,EOL5000 ;5010 .BYTE "Keyboard code:",EOL5020 .BYTE "DeJ0}c: "5030 ;5040 KEYBDEC5050 .BYTE " Hex: $"5060 ;5070 KEYBHEX5080 .BYTE " ",EOL,EOL,EOL,EOL5090 .BYTEJ1} "Press to continue.",EOL5100 .BYTE "Press to exit.}Ԡ Keycode Getter? (Y/N)6H7HN^}8H 3Hd 8d6HLC 8 7HLC 88HL D6H 7D3Hȭ7H 7D3Hȭ8H 7D3H`i0` 3H)jjjj  kD 7D3H)N_}  kD 7D4H`i`+eycode'etterby"ob(ardy6ersN`}.otallkeystrokeswillworkwith+eycode'etter9ouwillnotbeNa}abletoread#42,  #42,  #42,  #onsolekeysor"2%!+9oucannotreadthe#42, 3()&4 #!03or)nverseNb}+eyswhenpressedalone)fyouusethe#!03or)nversekeys youmustpressthem!'!).forthenextkeyNc}+eyboard#odesarenotusuallyneeded9ou#!.findmanyusesforthe!4!Nd}3#))and(ardware#odesin"!3)#or!ssemblerprogramming)fyou$/need+eyboard#odes rememberthatthekeyNe}boarddoesntdistinguishbetweencapsandlower casekeys orbetweennormalandinverselettersNf}0ress34!24tocontinueK:@Lp/ X;KEYCODE3.M65!X;Rewritten 11/87 by Bob HardyX;from an original program(X;by Bob Hardy2X;<X;Revision of 4/3Rh}0/89FX;PX;ZFdEIn>D8:SYSEQU.M65x>D8:MACROLIB.M65>D8:GREQU.M65>D8:GRAPHICS.M65X;X;---------Ri} X; EquatesX;---------X;X;IOCB LOCATIONSX;--------------X;#X; The IOCBs are the Atari's I/O"X; channels. Rj}They are a 'safe'$X; way to do I/O in that they are"X; always compatible and always$X; 'legal'. The worst you can doRk}!X; with IOCBs is an I/O error."#X; There are no 'illegal' calls.,X;6X;ICCOM = $0342 ;command@#X;ICBAL = $0344 ;bufRl}. adr., loJ#X;ICBAH = $0345 ;buf. adr., hiT#X;ICBLL = $0348 ;buf. len., lo^#X;ICBLH = $0349 ;buf. len., hihX;ICAX1Rm} = $034A ;AUX1rX;ICAX2 = $034B ;AUX2|X;X;OS REGISTERS, ETC.X;------------------X;"X; These are too complexRn} to try$X; to document here. For details"X; see 'Mapping The Atari' fromX; COMPUTE! books.X;X;WARMST = $08 BRo}OOT?  POKMSKX;LMARGN = $52X;SAVMSC = $58INVFLGSHFLOKX;COLOR1 = $02C5 ;(709)&X;COLOR2 = $0Rp}2C6 ;(710)0X;COLOR4 = $02C8 ;(712):CRSINHD CH1NCHREG;;(764)XDSPFLGbCONSOLl IRQENvRq}PUTBYTES X; X;VECTORS X;-------X;COLDSTDKEYDELX;CIOV = $E456WARMSVtX;X;ZERO-PARr}GE 2-BYTE POINTERSX;-------------------------X; SCRPTR TXPTR X;X;KEYPRESS VALUES: X;----------------Rs}*X;4X; CONSOLE KEYS>X;H SELECTR START\X;fX; ATASCII CHARACTERSpX;z SPACE X;EOL = $9BRt}X;X; CHREG VALUESX; NOKEYX;X;@X;TOP,- NOBREAK;; Disable BREAKQSAVMSC;; StorRu}e startPSCRPTR;; adr of screenQSAVMSC;;memory in ZPG$PSCRPTR;;screen pointer. SETUP;; Print opening8!X; Rv} message andBX; wait forL$X; START keypressVX;` RESTARTj NOBREAK;;KiRw}ll BREAKtQ>;;Turn cursor~PCRSINH;;on, normalPDSPFLG;;CTRL charsPCOLOR4;;Black borderQ>;;Left margin=2 PRx}LMARGNPCOLOR2;;Gray backgrndQ> ;;White letters PCOLOR1$>4MAINSCRN;;Print the%>5MAINSCRN;;main scrnQ>ZRy} PRINT OPENK;;OPEN K:Q>NOKEY;;Clear key reg  PCHREGQ>;;Clear InversePINVFLG;;lock.(Q>@;;Set all CAPRz}S2 PSHFLOK< KEYCHK;;Wait for key-F KEYIN;;press & get keyP CLOSE1;;Close K:ZQCH1;;Get last keydPKEYBUF;;acceR{}pted &nX; store it.x MAKEINT;;ATASCII code!X; is converted X; to internR|}alX; code andX; stored inX; INTBUFQKEYBUF;;Recover"X; R}} keyboard code MAKEDEC;;Convert to#X; ATASCII digits%>X; MOVKEYDECQATAHUNS8;;Move theR~}PKEYBDEC8;;result to1;; KEYBDECIMOVKEYDEC"QKEYBUF;;Get keyboard, HEXCONV;;code and6%>;;convert to HEX@R}X;J MOVKEYHEXTQATAHUNS8;;Move the^PKEYBHEX8;;result toh1;; KEYBHEXrIMOVKEYHEX|QINTBUF;;Get internal MAKER}DEC;;code & convert%>;;to ATASCIIX; MOVHARDECQATAHUNS8;;Store thePHARDDEC8;;result in1;; HARDDECIMR}OVHARDECQINTBUF;;Get internal HEXCONV;;code & convert%>;;TO HEXX;MOVHARDHEXQATAHUNS8;;Move thePHAR}RDHEX8;;result to1;; HARDHEX&IMOVHARDHEX0QATBUF;;Get ATASCII: MAKEDEC;;charcode andD%>;;convert to DECNX;XR} MOVATDECbQATAHUNS8;;Store thelPATDEC8;; result inv 1;; ATDEC IMOVATDECQATBUF;;Get ATASCII HEXCONV;;ConR}vert to HEX%>X; MOVATHEXQATAHUNS8;;and store thePATHEX8;;result in ATHEX1 IMOVATHEXQ>;;Turn curR}sor off PCRSINH$>4ATAMSG;;Print ATASCII%>5ATAMSG;;message Q>ATALEN;;msg. length PRINT QSAVMSC;;Add $0170R} to*,;;scrn ptr4O>p;;low byte...> PSCRPTRHQSAVMSC;;high byte...RO>\PSCRPTRfQINTBUF;;Get char &p%>R};;poke it intozP@SCRPTR7;;scrn RAM$>4KEYMSG;;Print hard-%>5KEYMSG;;ware messageQ>KEYBLEN;;msg. length PRR}INT OPENK;;Clear anyQ>NOKEY;;keypresses... PCHREG HQUITS? DONTQUIT !NOQUITX;X; Is the user finishedR}?X; QUITS? QCONSOL;;Select press? R>SELECT$ HDONTQUIT;;Nope.. $>4QUITMSG;;Yes!8 %>5QUITMSG;;Get user toB QR}>QMSGLEN;;confirm.L PRINTV  KEYCHK;;Wait for key.`  KEYIN;;Get keypress.j QATBUFt M>;;ASCII only~ R> Y;;Was it R}"Y"? FEXIT;;Yupper!  SCRPUT;;Nope. Print it CLOSE1 Q>EOL;;Print an EOL SCRPUT  GR.0;;purify screen !RR}ESTART;;and restart. ALLDONE? !QUITS? NOQUIT QCHREG;;No...ANY key? R>NOKEY FALLDONE?;;No...  KEYIN;;Yes!R}  CLOSE1;;CLOSE K: QATBUF;;Print the(  SCRPUT;;key pressed2 !RESTART;;and restart.< X;F X; We're outa here.P X;ZR} EXITd  SCRPUT;;Print the keyn  CLOSE1;;Close K:x  CLOSE0;;Close E: Q>NOKEY;;Clear CHREG PCHREG Q>;;Normal R}RESET PWARMST;;status. Q>;;Tell OS disk PBOOT?;;boot was OK Q>;;and no reboot PCOLDST;;on warmstart.  GR.R}0;;Purify screen. !WARMSV;;Do warmstart. X; $X;------------------------------- X; "X; Subroutines -- what make the R}X; flow of the program work. X;" $X;-------------------------------, X;6 X;This is a general purpose@ X;"Put bytes to ER}:"J X;subroutine.T X;^ !X;Text address lo,hi is storedh X;upon entry in x,y.r X;Text length lo is stored| X;in A. Text R}length hi is X;always assumed to be zero. X; PRINT &ICBAL;;Adrlo=X $>;;IOCB#0 (E:) PICBLL9;;Lenlo=A A;;LenR}hi=0 PICBLH9 C;;Adrhi=Y PICBAH9 Q>PUTBYTES;;Put cmnd. PICCOM9 CIOV !NOBREAK X; X;This subroutine priR}nts the& X;character stored in the0 X;accumulator to the screen.: X;D SCRPUTN 5;;Save A Reg.X $>;;IOCB #0b Al PICR}BLL9;;LEN=0v PICBLH9 Q>PUTBYTES;;Put cmnd. PICCOM9 7;;Restore A and !CIOV;;print it. X; X; Do we or do we noR}t have a #X; keypress? KEYCHK waits until X; we get one. X; KEYCHK QCHREG;;Any keypress? R>NOKEY FKEYCHK;;NR}ope. :;;Yep! X; X; We have a keypress. Let's X; read it through IOCB #1.* !X; (where the keyboard happens4 X; to alR}ready be open!)> X;H KEYINR $>;;IOCB #1\ Q>;;Get bytesf PICCOM9p Q>;;Lenlo=1z PICBLL9 Q>;;Lenhi=0 PICBR}LH9 Q>4ATBUF;;Point to PICBAL9;; ATBUF Q>5ATBUF PICBAH9 !CIOV X; !X; Open the keyboard. Nothing "X; visibR}le happens, but you can !X; read from the keyboard now. X; OPENKOPEN ===AK:A:X;$"X; Close IOCB #1. R}End-of-file.."X; We got our keypress. G'bye!8X;B CLOSE1L CLOSE V:`X;j$X; Close IOCB #0. We're exiting.tX;~R} CLOSE0 CLOSE :X;X; Turn ATASCII keycode intoX; hardware (internal) codeX; and store the result in XR}; INTBUF.X; MAKEINTQATBUF;;Get ATASCIIGFIXHI;;If inv, fix.X; LOKEY R> ;;Key>31?EMIDKEY;;Yes.,;;R}No - add 64.(O>@2PINTBUF;;Conversion<:;;complete.FX;P MIDKEYZR>`;;Key>95?dEHIKEY;;Yes - fix.n;;;No - subtR}ractxS> ;;32 from key.PINTBUF;;Conversion:;;complete.X; HIKEYR>;;Key>127?EFIXHI;;Yes.PINTBUF;;NoR} - conversion:;;unnecessary.X; FIXHIM>;;Clear bit 7 LOKEY;;Go do usualL>;;conversion,PINTBUF;;reseR}t bit 7,:;;and done.X;"$X; We don't want any BREAK errors,"X; crippling the program, so...6X;@ NOBREAKJQPOKMSKR};;Disable theTM>;;BREAK key^ PPOKMSKh PIRQENr:|X;$X; We want a nice display for the"X; user to look at, and wR}e want$X; the user to understand what is#X; going on. We'll dress up the$X; screen a bit and print out ourX; explanR}atory message.X; SETUP%>;;Black screen'COLOR2;;and border 'COLOR4Q> ;;White text PCOLOR1Q>4INTROR}TX;;Point TXPTRPTXPTR;; at INTROTXQ>5INTROTX& PTXPTR0X;: FASTPRNTDQ@TXPTR7;;Get scrntextNR>;;Last cR}har?XFSTARTPRS;;Yes-chk STARTbP@SCRPTR7;;No, movel3;;char to scrmemv HFASTPRNT#SCRPTR;;Step up SCRPTR#TXR}PTR;; and TXPTR HFASTPRNTX; STARTPRSQCONSOL;; START pressed? R>STARTHSTARTPRS;;Nope! :;; Yes!X;R}GR.0;Keep the macro!GRAPHICS ;;from needlessly:;;being reassembledX; $X;-------------------------------X; R}#X; Buffers, text & storage space*X;4$X;------------------------------->X;H KEYBUFR\ INTBUFfp ATBUFzR}X; MAINSCRN" }=EOL=AKeycode GetterA=EOL1 AWritten by Bob Hardy with MAC/65A=EOL=EOL6 APress a key for wR}hich you want codes:A=EOL=EOL ATAMSG EOL=EOL AATASCII:A=EOL AChar: A=EOL ADec: AX; ATDEC R}A Hex: $AX; ATHEX A A=EOL=EOL$ATALEN ATAMSG.X;8 KEYMSGB AHardware code:A=EOLL ADec: AV R}HARDDEC` A Hex: $AjX;t HARDHEX~ A A=EOL=EOLX; AKeyboard code:A=EOL ADec: AX; KEYBDEC AR} Hex: $AX; KEYBHEX A A=EOL=EOL=EOL=EOL' APress to continue.A=EOL# APress