@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@W!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr 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?  LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `1  ɐ     `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.D1:MEM.SAV Uԅ֩שբ w؅բ w F`$}ԩՠH Uh F``?<0LV`@ʆ v sI FΞ0A l i/DE  Uԅ%}ש w FL  @  Uօԩשբ `E:D1:DUP.SYS w FΝL fXpԩ `xԍҭ)Lk&} ` `֑` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` Uԅ֩թע w؅ע w (}F` BLV nB,DE JLV B V BLVDEIʩ BꭝLu } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED262 FREE SECTORS COPYING---D2:DOSMANOCMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 128ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8u1000 REM ***************************1010 REM * 80: CONFIGURER *1020 REM * ----------------------- *1030 REM * BT}Y SIMON TREW, 1989. *1040 REM * ----------------------- *1050 REM * This ATARI BASIC prog *1060 REM * enables anybody tU}o con- *1070 REM * struct their own custom *1080 REM * 80: device from a menu *1090 REM * operated system. *1100 V}REM * *1110 REM ***************************1120 TRAP 14301130 REM 1140 REM ΠW}1150 REM 1160 DIM LINE$(40),HX$(2),OPT$(1)1170 DIM NAME$(1),FILE$(40),RFILE$(40)1180 DIM ADDR$(2),HEXVAL$(16)1190 HEXX}VAL$="0123456789ABCDEF"1200 NAME$="8":BYTE=PEEK(744)+11210 GOSUB 1950:ADDR$=HX$1220 FILE$="D:AUTORUN.SYS":RFILE$=""1230 RY}MARGIN=791240 POKE 709,0:POKE 710,12:POKE 712,121250 GOSUB 16501260 HX$=ADDR$:GOSUB 1990:ADDR=BYTE1270 CLOSE #1:OPEN #1,8Z},0,FILE$1280 RESTORE :PRINT :GOSUB 15301290 IF RFILE$="" THEN 13401300 IF LEN(RFILE$)<14 THEN RFILE$(LEN(RFILE$)+1)=CHR$(1[}55):GOTO 13001310 GOSUB 15301320 FOR N=1 TO 14:PUT #1,ASC(RFILE$(N,N)):NEXT N1330 GOSUB 15301340 ? 1350 ? "The program w\}as successful."1360 ? "The binary file should now"1370 ? "be executable as ";FILE$;"."1380 ? 1390 END 1400 REM 1410 REM]} Ҡ1420 REM 1430 ? "An error has occured that"1440 ? "prevents the successful"1450 ? "completion of the program.^}"1460 ? "Please check that the"1470 ? "options are valid, then"1480 ? "re-RUN the program."1490 END 1500 REM 1510 REM _}Šؠ̠ؠ1520 REM 1530 READ LINE$1540 FOR N=1 TO LEN(LINE$) STEP 21550 HX$=LINE$(N,N+1)1560 IF HX$="" THEN`} POP :RETURN 1570 GOSUB 19901580 PUT #1,BYTE1590 NEXT N1600 PRINT ".";1610 GOTO 15301620 REM 1630 REM Ӡ16a}40 REM 1650 POKE 82,2:? "}The 80: configurer, by S. Trew 1989."1660 CLOSE #1:OPEN #1,4,0,"K:"1670 ? 1680 ? "1. Start pageb}..... $";ADDR$1690 ? "2. Filename....... ";FILE$1700 ? "3. Device name.... ";NAME$;":"1710 ? "4. Right margin... ";RMARGINc}1720 ? "5. Foreground"1730 ? "6. Background (&)"1740 ? "7. Border (')"1750 ? "8. DOS 2.x File... ";RFILE$1760 ? :? "d}G. GO!":? :? "Which? "1770 GET #1,KEY:OPT$=CHR$(KEY)1780 IF OPT$="G" OR OPT$="g" THEN RETURN 1790 IF OPT$="1" THEN ? "Addre}: $";:INPUT #16,ADDR$:HX$=ADDR$:GOSUB 1990:ON (BYTE<256)+1 GOTO 1430,16501800 IF OPT$="2" THEN ? "File: ";:INPUT #16,FILE$:Gf}OTO 16501810 IF OPT$="3" THEN ? "Name: ";:INPUT #16,NAME$:GOTO 16501820 IF OPT$="4" THEN ? "Marg: ";:INPUT #16,RMARGIN:GOTOg} 16501830 IF OPT$="5" THEN POKE 709,PEEK(709)+2-256*(PEEK(709)>253):GOTO 17701840 IF OPT$="6" THEN POKE 710,PEEK(710)+16-25h}6*(PEEK(710)>239):GOTO 17701850 IF OPT$="7" THEN POKE 712,PEEK(712)+16-256*(PEEK(712)>239):GOTO 17701860 IF OPT$="&" THEN Pi}OKE 710,PEEK(710)+2-256*(PEEK(710)>253):GOTO 17701870 IF OPT$="'" THEN POKE 712,PEEK(712)+2-256*(PEEK(712)>253):GOTO 177018j}80 IF OPT$="8" THEN ? "BinF: ";:INPUT #16,RFILE$1890 IF LEN(RFILE$)>13 THEN RFILE$=RFILE$(1,13)1900 IF OPT$="8" THEN 16501k}910 GOTO 17701920 REM 1930 REM àϠؠ1940 REM 1950 HI=INT(BYTE/16):LO=BYTE-16*HI:HX$=HEXVAL$(HI+1,HI+1):HX$(2)=l}HEXVAL$(LO+1,LO+1):RETURN 1960 REM 1970 REM ؠӠϠà1980 REM 1990 IF HX$>"FF" THEN GOTO 20102000 BYTE=m}16*(ASC(HX$)-48-7*(HX$>"9F"))+(ASC(HX$(2))-48-7*(HX$(2)>"9")):RETURN 2010 IF HX$="" THEN BYTE=RMARGIN:RETURN 2020 IF HX$=n}"" THEN BYTE=PEEK(709):RETURN 2030 IF HX$="" THEN BYTE=PEEK(710):RETURN 2040 IF HX$="" THEN BYTE=PEEK(712):RETURN 20o}50 IF HX$="" THEN BYTE=ASC(NAME$):RETURN 2060 BYTE=16*(ASC(HX$)-176-7*(HX$>""))+(ASC(HX$(2))-176-7*(HX$(2)>""))+ADDR:REp}TURN 2970 REM 2980 REM ؠҠ͠2990 REM 3000 DATA FFFF80FF0404040404003010 DATA 0400AAAAAE0A0E0A0A0q}0406A3020 DATA 824424C84A0044A4A440B0A03030 DATA 5000284444444444280000A43040 DATA 44EE44A400000000000E00403050 DATA 4080r}000202040448480044AC3060 DATA A4E4A4A44E004CA2224482823070 DATA EC008EA8A8EC22222C004E823080 DATA C2A4A8A8480044AAAA4AA6A2s}3090 DATA 4400000044440044440800203095 REM 3100 DATA 4E80402E0000048A4A2244803110 DATA 0400007F44AAAAAE8A8A3120 DATAt} 6A00C4AAA8C8A8AAC400CEA83130 DATA A8ACA8A8CE00E48A88CA8A8A3140 DATA 8600AEA4A4E4A4A4AE002A2A3150 DATA 2A2C2A2ACA008A8E8E8u}E8A8A3160 DATA EA00C4AAAAAAAAAAA400C4AA3170 DATA AAAACA848200C6A8A8C4A2A23180 DATA AC00EA4A4A4A4A4A4E00AAAA3190 DATA AAAEv}AE4E4A00AAAAAA44A4A43195 REM 3200 DATA A400EE2828488888EE000E823210 DATA 824242222E00004040A0A0003220 DATA 0E00007F06w}A6E6E7E7463230 DATA 46061616161E1E10101060603240 DATA 60EEEE6666661818242442423250 DATA 8181101030307373F3F383833260 DATAx} C3C3E0E0F0F0CFCFC0C000003270 DATA 0000000000000C0CFCFC00403280 DATA 40E7A746E606060606FFFF063290 DATA 0606000060F0FFFF6F0y}F80803295 REM 3300 DATA 808F8F8686866C6C6CFCFC0C3310 DATA 0C0C6C686C787E04060000443320 DATA E4E44E4E4400002466FF66243330z} DATA 000080FF00404CE2E64A3340 DATA 4E008080C6A8A8A8C60020203350 DATA 64AAAEA86600608086CA8A863360 DATA 820C8480CCA4A4{}A4AE0028083370 DATA 6A2A2C2AAA40C040444E4E4A3380 DATA EA000000C4AAAAAAA40000003390 DATA C6AAAAC68282000046A884823395 REM |}3400 DATA 8C008080EA8A8AAA4E0000003410 DATA AAAAAE4E4A000000AAAA4AA63420 DATA A20C0004E42E4E84EE00606E3430 DATA 6C6A6A626}}26000286CEE6C283440 DATA 0000FFFF0017585858583450 DATA 585858581806F526F66048183460 DATA A5F565F785F5A5F665F885F63470~} DATA 686000008D1F4898488A483480 DATA AD1FAA2901F002A9FF8D1E3490 DATA 188A297E85F5A90085F6203495 REM 3500 DATA 08}200818A90085F7A93510 DATA 85F8200EA007B1F5CD1E3520 DATA B005290F4C634A4A4A4AE03530 DATA 809002490F99008810E468}3540 DATA AA68A86860488A4818AD10E43550 DATA 69018D92AD11E469008D933560 DATA A90C852AA908852B20FFFF3570 DATA 68AA68604}898488A489885F53580 DATA A90085F62008A5F585F7A53590 DATA F685F82008200818200E3595 REM 3600 DATA A005200888D0FA8}A4A853610 DATA F7A90085F8200EA55885F73620 DATA A55985F8200E68AA68A8683630 DATA 6020204898488A4820983640 DATA 8A4A}B02DA200A000A92885F73650 DATA A90085F8BD000A0A0A0A9D3660 DATA 00B1F5290F1D0091F5203670 DATA 0EE8E008D0E568AA68A868}3680 DATA 60A200A000A92885F7A900853690 DATA F8B1F529F01D0091F5200E3695 REM 3700 DATA E8E008D0EFF0DB4898488A3710 DATA} 48A2002098A8A5F585F9A53720 DATA F685FA2098A000B1F991F53730 DATA C8D0F9E6FAE6F6B1F991F5C83740 DATA C040D0F768AA68A8686}0488A3750 DATA 489848A20020988AA891F53760 DATA C8D0FBE6F691F5C8C040D0F93770 DATA 68A868AA6860488A489848AA3780 DATA C820}38C8E8E01790F7A0173790 DATA 206A68A868AA686000488A3795 REM 3800 DATA 488CA5A017A218CCA5F03810 DATA 0888CA20384C}B0206A3820 DATA 68AA68600020984898488A3830 DATA 482901AAA9008DC4A000B13840 DATA F5E001D005290F4CE64A4A3850 DATA} 4A4AACC4990018A928653860 DATA F585F5A90065F685F6C88CC43870 DATA C008D0D468AA68A86860483880 DATA 8A48E04FF00CE820C5}CA203890 DATA E0E84C0AA92020DD683895 REM 3900 DATA AA686000488E23E04FF0103910 DATA A24FCA20C5E820E0CAEC3920} DATA 23D0F268AE2320DD603930 DATA 5858585858585858585858583940 DATA 58585858000020C58A48983950 DATA 48A2008E548E}558E1E3960 DATA 86F8A90085F5A985F6A9083970 DATA 85F7A007B900994C0A0A3980 DATA 0A0A99440D548D54883990 DATA} 10EAAD54D004A920D01FA03995 REM 4000 DATA 07AD1ED00BB1F529F0D9444010 DATA D01BF009B1F5290FD94C4020 DATA D0108810E}48A8D4C68A8684030 DATA AAAD4C1860E88A2901D0034040 DATA 200E8D1EE000F027E0804050 DATA D0C1A007B94C490F994C4060} DATA B94449F099448810EDA94070 DATA 0085F5A985F6386E55904080 DATA 9E68A868AA386020C548984090 DATA 48A007B90049}0F9900884095 REM 4100 DATA 10F568A8684CE0FFFF184110 DATA C1000000BD4A0320A9204120 DATA 30A00160489848A557C908}4130 DATA F02D2075C08090056868684140 DATA 6860A98553A98DC502A94150 DATA 8DC602A98DC802A900854160 DATA 568D1A8}D19A5528555684170 DATA A86860AC1984236020274180 DATA 8A48207A68AAAD189D4A4190 DATA 03852A60BD4203C911F007C94195} REM 4200 DATA 12D05900000048AD19F04C4210 DATA A5538D86A5528D85BD424220 DATA 03C911B00C2904D004A006D04230 DATA 06A0}04D002A00A18B910E4694240 DATA 018DC0B911E469008DC14250 DATA 6820FFFFC080900784F520624260 DATA A4F548AD868553AD85}4270 DATA 85526860A0916860C926D0124280 DATA A5549D4E03A5559D4C03A5564290 DATA 9D4D03A00160C927D01EAD194295 REM 4300 DATA} D0DDBC4A03C018B00FBD4B4310 DATA 03AAE018B0072038A001D04320 DATA 02A08D60C928D015AD19D04330 DATA BBBC4A03C018B006206}AA04340 DATA 0160A08D60C929D012AD194350 DATA D0A2BC4A03C018B0ED208A4360 DATA A00160C92AD015AD19D08C4370 DATA BC4A}03C018B0D720A6A0014380 DATA 60000000C92BD01AAD19494390 DATA 018D19A202B554BC5B944395 REM 4400 DATA 549D5BCA10F3}A00160C92C4410 DATA D020AD19F0034CDABC4B4420 DATA 03C018B00EBD4A03AAE050B04430 DATA 0620FFA001604C13C92D4440 DATA} D01BA001BD4A03C90C900DC94450 DATA 0FB0099D4A03852A8D18604460 DATA A90C4CB1A09260FFFFC24470 DATA 5C20FFFFA200BD1A0}3F00B4480 DATA CD5AF006E8E8E84CC7AD4490 DATA 5A9D1A03A92D9D1B03A94495 REM 4500 DATA 9D1C03ADE802C99009D0114510} DATA ADE702C9AEB00AA98DE8024520 DATA A9AE8DE702AD5AC945D0244530 DATA A200A90C9D42032056E4A95A4540 DATA 9D4403A99D45}03A90C9D4A4550 DATA 039D4B03A9039D42032056E44560 DATA 601A41FA3C60664570 DATA 4C2C002027AC19F04580 DATA} 0A48A9099D4203684C88A44590 DATA 11F007ACFF02D0F7F0088CFF4595 REM 4600 DATA 02A0804CA48E3CA656D04610 DATA 3FA655E05}0B039A454C018B04620 DATA 3348C99BF034ADA2020DFE024630 DATA F02C6820DDE8E453F010904640 DATA 0EA652C8C018D007A000208A4650} DATA A017865584540EA202A40B4660 DATA AE3C602011A08D6068C94670 DATA 1BD008A9808DA2024CA2C94680 DATA 1CD00CA4548810}02A01784544690 DATA 4CA2C91DD00EA454C8C0184695 REM 4700 DATA D002A00084544CA2C91ED04710 DATA 10A455883004C452B002A453}4720 DATA 84554CA2C91FD010A455C84730 DATA C4539004F002A45284554CA24740 DATA C97DD015A017206A88104750 DATA FAA000845}48456A45284554C4760 DATA A2C97ED019A455C452F0104770 DATA 8A48A920A655CA8655A454204780 DATA DD68AA4CA2C97FD010184790} DATA A555690AC5539002A55385554795 REM 4800 DATA 4CA2C99BD01AA5528555A44810 DATA 54C8C018D007A000208AA04820 DATA 1784}540EA2024CA2C99CD04830 DATA 0CA454208AA45284554CA24840 DATA C99DD008A45420A64C764850 DATA C99ED007A45284554CA2}4860 DATA C99FD01238A555E90A3004C54870 DATA 52B002A55285554CA2C9FD4880 DATA D02520B44CA24898488A4890 DATA 48A02020C}78810FA68AA684895 REM 4900 DATA A86860A27F8E1FD08E0AD4CA4910 DATA 10F760C9FED00C8AA655A4544920 DATA 2007AA4CA2C9FFF}0034C4930 DATA 838A48A920A655A45420244940 DATA 68AA4CA2002027AC194950 DATA F0034C88A556D035A5554960 DATA C553}9002D02DA554C918B0274970 DATA BD4A0329021D4903D027BD484980 DATA 03C902B0208EFAA655A4544990 DATA 20569004A090D002A001AE}4995 REM 5000 DATA FA602011A08DD0F500005010 DATA 00AD1AF011AC46B95D5020 DATA CE1AEE46A0016000008E5030 DATA} FAA001844C8411A5548D5E5040 DATA A5558D5DBD4A03C90DF05050 DATA 6618AD24E469018D9EAD255060 DATA E469008D9FBD4A03C}90EF05070 DATA 0CADF002D007A655A45420FF5080 DATA 20FFFFC08090034C2CBC5090 DATA 4A03C00ED00160A655A454485095 REM 5100} DATA ADF002D00320FF68C99BF05110 DATA 0F204FA655E048D00320B45120 DATA 4C91A454CC5EF008A65130 DATA 528E5D8C5E}AE5DE0535140 DATA 9005F0034C02AC5E20565150 DATA B00FAE1A9D5DEE1A5160 DATA EE5D4CDFAE1AF00CBD5170 DATA} 5CC920D005CE1AD0EFA95180 DATA 9BAE1A9D5DEE1AA2005190 DATA 8E46204FAEFA4C495195 REM 5200 DATA A9008D1A}8D468DFF02985210 DATA 48A655A454BD4A0329020DF05220 DATA 02D00320FFA99B204FA95230 DATA 008DF00268A8AEFA60453A5240} DATA 9BAE01A50C8DC3A50D5250 DATA 8DC4A9C2850CA9850D205260 DATA C5A200A9E29D4403A99D5270 DATA 4503A91D9D4803}A9009D49035280 DATA A90B9D42032056E4609B38305290 DATA 3A20646576696365206279205295 REM 5300 DATA 532E20547265772031393839}5310 DATA 2E9B3A9BE202E302AEE05320 DATA 02E102E1؛5330 DATA FFFF054FA90CA2109D425340 DATA 032056E43021A9039D420}3A95350 DATA 429D4403A99D4503A9049D5360 DATA 4A03A9009D4B032056E430035370 DATA 203CA90CA2109D42034C565380 DATA E4A900}484CC815؛5390 DATA E002E10205؛9D5360 DATA 4A03A9009D4B032056E430035370 DATA 203CA90CA2109D42034C565380 DATA E4A900$$$  @jD$JD@P(DDDDD(DD@@HHD䤤NL"D"",N¤HDJDDDDD N@. }J"D%%DjĪȨΨ䊈ʊ䤤***,**ĪĪʄƨĢJJJJJNNJD((H }BB".@@$$FF```fff$$BB00ss @@F`olll l }hlx~DNND$ff$%%@LJNƨ df`ʊ ̤(j*,*@@DNNJĪƪƂFꊊNNJ }J .N`nljjbb`(ll(JNƨ df`ʊ ̤(j*,*@@DNNJĪƪƂFꊊNNJ 1000 ; ***************************1010 ; * 80: BASICS *1020 ; * ----------------------- *1030 ; * BY SIMON }TREW, 1989. *1040 ; * ----------------------- *1050 ; * *1060 ; * These routines are the *1070 }; * backbone of the fast 80:*1080 ; * driver and include basic*1090 ; * screen read, write and *1100 ; * manipulate. They} do not *1110 ; * provide any CIO inter- *1120 ; * face, handled by 80CIO. *1130 ; * *1140 ; ***}************************1150 ;1160 CHSET =$24001170 TEMP1 =$F51180 TEMP2 =$F71190 TEMP3 =$F91200 ;1210 *= $26}001220 ;1230 BUFP .BYTE "XXXXXXXX"1240 ;1250 ; ٠б٠Ϡ1260 ;1270 MULT1280 CLC1290 ASL TEMP11300} ROL TEMP1+11310 RTS1320 ;1330 ; Šббв1340 ;1350 ADD1360 PHA1370 CLC1380 LDA TEMP11390 ADC }TEMP21400 STA TEMP11410 LDA TEMP1+11420 ADC TEMP2+11430 STA TEMP1+11440 PLA1450 RTS1460 ;1470 ; ŠҠ}ĠΠî1480 ;1490 ODDFLG .BYTE 01500 TEMPAS .BYTE 01510 STORE1520 STA TEMPAS A=char to store1530 PHA St}ore accumulator1540 TYA and index regs.1550 PHA1560 TXA1570 PHA1580 LDA TEMPAS Reload A after PUSHs1590} TAX X holds real value1600 AND #$01 all the time.1610 BEQ EVEN1620 LDA #$FF1630 EVEN1640 STA ODDFLG } Store FF=odd, 0=even1650 CLC1660 TXA in ODDFLG1670 AND #$7E Get rid of inverse1680 STA TEMP1 and rou}nd down odds1690 LDA #0 Temp1 holds the1700 STA TEMP1+1 offset into chset.1710 JSR MULT Multiplied by }21720 JSR MULT Multiplied by 41730 CLC1740 LDA #CHSET&255 Get the offset1750 STA TEMP2 into the charset17}60 LDA #CHSET/256 and then add to1770 STA TEMP2+1 the beginning of1780 JSR ADD the Charset1790 LDY #7 } Get 8 bytes1800 LOOP11810 LDA (TEMP1),Y Get byte to store1820 CMP ODDFLG Odd flag set?1830 BCS EVENZ1840 AND }#$0F yes, strip top 41850 JMP CHECKINV1860 EVENZ1870 LSR A Even, rotate into1880 LSR A low 4 b}its (thus1890 LSR A setting top 4 to1900 LSR A zero)1910 CHECKINV1920 CPX #$80 If char to get }is1930 BCC NOTINV more than 127 then1940 EOR #$0F invert character.1950 NOTINV1960 STA BUFP,Y and store }in buf1970 DEY next byte1980 BPL LOOP11990 PLA Get back Accum.2000 TAX and index reg}s.2010 PLA2020 TAY2030 PLA2040 RTS2050 ;2060 ; ԠРӠ2070 ;2080 ZIOCB=$202090 GRAVEC=$E4102100 GR8}SET2110 PHA2120 TXA2130 PHA Save regs.2140 CLC Get (address-1) of2150 LDA GRAVEC CIO's screen s}etting2160 ADC #1 Up routine, and add2170 STA GOCIO+1 1 to it for a JSR2180 LDA GRAVEC+1 through the S: OPEN219}0 ADC #0 vector.2200 STA GOCIO+22210 LDA #$0C Screen Read/Write2220 STA ZIOCB+102230 LDA #$08 Screen m}ode (8)2240 STA ZIOCB+112250 GOCIO2260 JSR $FFFF (Changed!)2270 PLA2280 TAX Restore regs.2290 PLA } (not Y which holds2300 RTS the error code).2310 ;2320 ; îԠŠƠήԠ2330 ; ج٠Ġ}ŠΠб2340 ;2350 SCRADR =$582360 CALCXY2370 PHA2380 TYA2390 PHA2400 TXA2410 PHA2420 TYA2430 STA TEMP12}440 LDA #02450 STA TEMP1+12460 JSR MULT Multiply Y by 22470 LDA TEMP12480 STA TEMP22490 LDA TEMP1+1 Store x2 to} add to x82500 STA TEMP2+1 to get x102510 JSR MULT Multiply Y by 42520 JSR MULT Multiply Y by 82530 CLC2540 J}SR ADD Add Yx2 to Yx8 =Y*102550 LDY #$5 Multiply Y*10 By 2^52560 LOOP22570 JSR MULT Total= Y*3202580 DEY25}90 BNE LOOP22600 TXA2610 LSR A2620 STA TEMP2 Add on X2630 LDA #02640 STA TEMP2+12650 JSR ADD2660 LDA SCRADR } Add to address of2670 STA TEMP2 first byte of screen2680 LDA SCRADR+12690 STA TEMP2+12700 JSR ADD2710 PLA2720} TAX2730 PLA2740 TAY2750 PLA Thats it!2760 RTS2770 ;2780 ; ԠҠΠԠήج٠2790 ;2800 PUTCHR}2810 JSR STORE Get character2820 STORE82830 PHA2840 TYA2850 PHA Store regs.2860 TXA2870 PHA2880 }JSR CALCXY Get posn.2890 TXA Find out if X is2900 LSR A odd or even2910 BCS ODDX2920 LDX #$0 } Put 8 bytes2930 LDY #$0 Dummy for indexing2940 LDA #40 Next line=40 bytes2950 STA TEMP2 away2960 L}DA #02970 STA TEMP2+12980 LOOP32990 LDA BUFP,X3000 ASL A3010 ASL A3020 ASL A3030 ASL A3040 STA BUFP,X3050 LD}A (TEMP1),Y3060 AND #$0F3070 ORA BUFP,X3080 STA (TEMP1),Y3090 JSR ADD Next line=40 bytes3100 INX aw}ay3110 CPX #$83120 BNE LOOP33130 FINCHR3140 PLA3150 TAX3160 PLA3170 TAY3180 PLA3190 RTS3200 ODDX3210 LDX }#$0 Put 8 bytes3220 LDY #$0 Dummy for indexing3230 LDA #40 Next line=40 bytes3240 STA TEMP2 away}3250 LDA #03260 STA TEMP2+13270 LOOP43280 LDA (TEMP1),Y3290 AND #$F03300 ORA BUFP,X3310 STA (TEMP1),Y3320 JSR A}DD Next line=40 bytes3330 INX away3340 CPX #$83350 BNE LOOP43360 BEQ FINCHR3370 ;3380 ; ŠŠ}٠ϠŠؠ3390 ;3400 MOVEYX3410 PHA3420 TYA3430 PHA3440 TXA3450 PHA3460 LDX #$00 X=0 to get address of3470} JSR CALCXY first byte on line Y3480 TAY Y=orig. value of X so3490 LDA TEMP1 can CALCXY again for3500 STA TEMP}3 the X line address3510 LDA TEMP1+1 (after we store the3520 STA TEMP3+1 result of the first)3530 JSR CALCXY3540 LDY} #0 First 256 bytes3550 LOOP5A3560 LDA (TEMP3),Y3570 STA (TEMP1),Y3580 INY3590 BNE LOOP5A3600 INC TEMP3+1 Mov}e up one page to3610 INC TEMP1+1 move the next lot of3620 LOOP5B3630 LDA (TEMP3),Y ; (320-256) bytes3640 STA (TEMP1),Y}3650 INY3660 CPY #320-256 Done all of that?3670 BNE LOOP5B3680 PLA Finished!3690 TAX3700 PLA3710 TAY3}720 PLA3730 RTS3740 ;3750 ; ҠŠ٠3760 ;3770 CLEARY3780 PHA3790 TXA3800 PHA3810 TYA3820 PHA3830 LD}X #$03840 JSR CALCXY Get first byte to3850 TXA clear, and make A&Y3860 TAY both equal to 03870 LOO}P6A3880 STA (TEMP1),Y Clear first page3890 INY3900 BNE LOOP6A3910 INC TEMP1+1 Next page3920 LOOP6B3930 STA (TE}MP1),Y Clear bytes 256 to3940 INY 319 then done3950 CPY #320-2563960 BNE LOOP6B3970 PLA Finish}ed!3980 TAY3990 PLA4000 TAX4010 PLA4020 RTS4030 ;4040 ; ̠Р͠Š٠4050 ;4060 SCROLU4070 PHA4080} TXA4090 PHA4100 TYA4110 PHA4120 TAX Store Y in X and4130 INY add 1 so move line4140 LOOP7}4150 JSR MOVEYX4160 INY4170 INX4180 CPX #23 X=Last line?4190 BCC LOOP74200 LDY #23 Clear last line4}210 JSR CLEARY4220 PLA Finished!4230 TAY4240 PLA4250 TAX4260 PLA4270 RTS4280 ;4290 ; ̠Π}͠Š٠4300 ;4310 YVAL .BYTE 04320 SCROLD4330 PHA4340 TXA4350 PHA4360 STY YVAL4370 LDY #234380 LDX #24439}0 LOOP84400 CPY YVAL4410 BEQ BLANKD4420 DEY4430 DEX4440 JSR MOVEYX4450 JMP LOOP84460 BLANKD4470 JSR CLEARY448}0 PLA4490 TAX4500 PLA4510 RTS4520 ;4530 ; ŠҠԠج٠ΠР4540 ;4550 VALGET .BYTE 04560 GETCHR4570 J}SR CALCXY4580 PHA4590 TYA4600 PHA4610 TXA4620 PHA4630 AND #14640 TAX x=1 odd, 0 even4650 LDA #0 } Zero the number4660 STA VALGET of bytes put.4670 LOOPG4680 LDY #0 Used for indirect4690 LDA (TEMP1),Y Ge}t byte4700 CPX #1 Odd half or even?4710 BNE EVENG4720 AND #$0F Odd=mask even part4730 JMP STORVAL4740 EV}ENG4750 LSR A Even=shift odd part4760 LSR A4770 LSR A4780 LSR A4790 STORVAL4800 LDY VALGET Which byte?}4810 STA BUFP,Y4820 CLC Next byte=40 away4830 LDA #40 So add 40 on4840 ADC TEMP14850 STA TEMP14860 } LDA #0 (with carry)4870 ADC TEMP1+14880 STA TEMP1+14890 INY Increment number4900 STY VALGET of }bytes done4910 CPY #8 8=finished4920 BNE LOOPG4930 PLA Restore regs4940 TAX4950 PLA4960 TAY4970} PLA4980 RTS4990 ;5000 ; ŠҠŠŠР5010 ;5020 DELETE5030 PHA Save X and A (Y is5040 TXA } unchanged)5050 PHA5060 LOOPDT5070 CPX #79 End of line yet?5080 BEQ EXITDT5090 INX Get the charac}ter5100 JSR GETCHR next up the line and5110 DEX move it one col left5120 JSR STORE85130 INX Then pre}pare for next5140 JMP LOOPDT char.5150 EXITDT5160 LDA #32 Store SPACE at 79,y5170 JSR PUTCHR5180 PLA5190 TAX}5200 PLA5210 RTS5220 ;5230 ; ԠҮԠج٠5240 ;5250 XINS .BYTE 05260 INSERT5270 PHA Save A and X528}0 STX XINS5290 CPX #795300 BEQ FININS5310 LDX #795320 LOOPIN5330 DEX Move each character5340 JSR GETCHR }one character to the5350 INX right, then prepare5360 JSR STORE8 for the next char5370 DEX5380 CPX XINS5390 } BNE LOOPIN5400 FININS5410 PLA Store character5420 LDX XINS5430 JSR PUTCHR5440 RTS5450 ;5460 ; Š}ҠԠج٠Ϡ5470 ; ĠҠ٠ƠĠ5480 ;5490 EVNBUF .BYTE "XXXXXXXX"5500 ODDBUF .BYTE "XXXXXXXX"5510 ALL}BLK .BYTE 0 Totally blank?5520 INVFLG .BYTE 0 Testing inverse?5530 ;5540 LOCATE5550 JSR GETCHR Get the bit image5560} TXA Save X and Y5570 PHA on the stack (the5580 TYA accum is the char5590 PHA }on return).5600 LDX #0 Character number5610 STX ALLBLK also reset inverse5620 STX INVFLG and blank and Odd }5630 STX ODDFLG flags.5640 STX TEMP2+1 Get the TEMP regs5650 LDA #CHSET&255 ready for indexing5660 STA TEMP1  } the character set.5670 LDA #CHSET/2565680 STA TEMP1+15690 LDA #8 Each character is5700 STA TEMP2 8 bytes  }high.5710 LDY #7 Transfer the bitmap5720 LOCLOOP5730 LDA BUFP,Y to ODDBUF, with the5740 STA ODDBUF,Y low ny }bble set, and5750 ASL A to EVNBUF, with the5760 ASL A high nybble set.5770 ASL A This avoids sl }ow5780 ASL A shifts each time.5790 STA EVNBUF,Y Check also that the5800 ORA ALLBLK character is all5810 S}TA ALLBLK blanks (a space).5820 DEY5830 BPL LOCLOOP5840 LDA ALLBLK If it is all blanks5850 BNE MNLOOP then a}ssume a5860 LDA #32 space character.5870 BNE XITOK5880 MNLOOP5890 LDY #75900 EACHCH5910 LDA ODDFLG If it i}s an odd5920 BNE ODDLOC character, compare5930 LDA (TEMP1),Y the low order5940 AND #$F0 nybbles, otherwise5950} CMP EVNBUF,Y the high nybbles.5960 BNE NOTOK If not the same,5970 BEQ CMPOK do the next char.5980 ODDLOC5990} LDA (TEMP1),Y Do the same as6000 AND #$F above, for the odd6010 CMP ODDBUF,Y This separation6020 BNE NOTOK } makes it quicker.6030 CMPOK6040 DEY Compared OK - check6050 BPL EACHCH next byte. If all6060 TXA } OK, a=character.6070 XITOK6080 STA ODDBUF regs (storing A in6090 PLA a temporary locn.)6100 TAY } and then reset the6110 PLA carry flag to6120 TAX indicate success.6130 LDA ODDBUF6140 CLC615}0 RTS6160 NOTOK6170 INX Failed to compare6180 TXA Try next character6190 AND #1 and increa}se index.6200 BNE NOADD if necessary to get6210 JSR ADD next 2 chars. Set6220 NOADD6230 STA ODDFLG flags }as nec.6240 CPX #0 If done all chars6250 BEQ FAILED then not valid.6260 CPX #$80 Otherwise if trying627}0 BNE MNLOOP inverse then invert6280 LDY #$7 the compare buffers6290 LOOPIV6300 LDA ODDBUF,Y so that can comp}are6310 EOR #$F each character with6320 STA ODDBUF,Y -out having to6330 LDA EVNBUF,Y invert each buffer6340 E}OR #$F0 every time.6350 STA EVNBUF,Y6360 DEY6370 BPL LOOPIV6380 LDA #CHSET&255 Get the indexes6390 STA TEMP1 } prepared again6400 LDA #CHSET/2566410 STA TEMP1+16420 SEC Set INVFLG to $806430 ROR INVFLG6440 BCC MN}LOOP (Unconditional)6450 FAILED6460 PLA Restore registers,6470 TAY it doesn't matter6480 PLA } what A is since6490 TAX carry is set to6500 SEC indicate failure6510 RTS6520 ;6530 ; }ԠҠԠج٠6540 ;6550 INVERT6560 JSR GETCHR Get char to invert6570 PHA Save registers6580 TYA6590  } PHA6600 LDY #7 Invert 8 bytes6610 LOOPINV6620 LDA BUFP,Y Get each byte6630 EOR #$F invert it6640 ST!}A BUFP,Y6650 DEY Next byte6660 BPL LOOPINV6670 PLA Restore regs6680 TAY6690 PLA6700 JMP STORE"}8 Place char on scn. Next byte6660 BPL LOOPINV6670 PLA Restore regs6680 TAY6690 PLA6700 JMP STORE1000 ; ***************************1010 ; * 80: BASICS *1020 ; * ----------------------- *1030 ; * BY SIMON $}TREW, 1989. *1040 ; * ----------------------- *1050 ; * *1060 ; * These routines are the *1070 %}; * backbone of the fast 80:*1080 ; * driver and include basic*1090 ; * screen read, write and *1100 ; * manipulate. They&} do not *1110 ; * provide any CIO inter- *1120 ; * face, handled by 80CIO. *1130 ; * *1140 ; ***'}************************1150 ;1160 BASICS =$26001170 RUNAD =$2E0 DOS Run address1180 IOCB =$340 IOCB adresses1190(} ICCOM =$3421200 ICBAL =$3441210 ICBAH =$3451220 ICAX1 =$34A1230 ICAX2 =$34B1240 OPEN =$3 CIO commands1250 C)}LOSE =$C1260 INPUT =$41270 CIOV =$E456 CIO vector1280 ;1290 *=BASICS+$9051300 ;1310 START1320 LDA #CLOSE Firs*}t close chan1330 LDX #$10 1 (the channel1340 STA ICCOM,X used to load a1350 JSR CIOV binary file).1360 BM+}I NOFUN1370 LDA #OPEN If OK, then open1380 STA ICCOM,X the file for1390 LDA #FILE&255 input, using chan1400 STA,} ICBAL,X 1, with the file1410 LDA #FILE/256 name specified by1420 STA ICBAH,X the user (loaded1430 LDA #INPUT in-}to FILE by1440 STA ICAX1,X the configuration1450 LDA #0 program).1460 STA ICAX2,X1470 JSR CIOV1480 BMI NOF.}UN1490 JSR GODOS Do the binary load1500 NOFUN1510 LDA #CLOSE That's all folks,1520 LDX #$10 so close the I/}OCB1530 STA ICCOM,X and return to1540 JMP CIOV DOS.1550 GODOS1560 LDA #0 Push a parameter1570 PHA 0} to the stack (a1580 JMP 5576 BASIC USR does).1590 ;1600 FILE1610 .BYTE "D:XXXXXXXXXXXX"1620 ;1630 *=RUNAD1} Set run vector1640 .WORD START BASIC USR does).1590 ;1600 FILE1610 .BYTE "D:XXXXXXXXXXXX"1620 ;1630 *=RUNAD(1000 ; ***************************1010 ; * 80: CIO *1020 ; * ----------------------- *1030 ; * BY SIMON 3}TREW, 1989. *1040 ; * ----------------------- *1050 ; * *1060 ; * These routines handle *1070 4}; * the CIO functions for *1080 ; * PUT and GET, the CIO *1090 ; * tables, reset processes *1100 ; * and transient DO5}S code. *1110 ; * *1120 ; ***************************1130 ;1140 ; ӠӠΠӠ1156}0 ;1160 BASICS = $26001170 TEMP1 = $F51180 BUFP = BASICS+$00001190 GR8SET = BASICS+$00751200 PUTCHR = BASIC7}S+$00DD1210 CLEARY = BASICS+$016A1220 SCROLU = BASICS+$018A1230 SCROLD = BASICS+$01A61240 DELETE = BASICS+$020718}250 INSERT = BASICS+$02241260 LOCATE = BASICS+$02561270 INVERT = BASICS+$02FF1280 ;1290 ; ӠӠΠӠ9}1300 ;1310 MODE = BASICS+$03181320 TEXTFLAG = BASICS+$03191330 BUFLEN = BASICS+$031A1340 OPEN = BASICS+$031B1:}350 CLOSE = BASICS+$04421360 CHECK8 = BASICS+$03271370 GETSTAT = BASICS+$03611380 SPECIAL = BASICS+$03671390 DRAWL;}N = BASICS+$03881400 ;1410 *= BASICS+$04C21420 ;1430 ; ϠҠ1440 ;1450 DOSINI = $C Reset vector1460 <}MEMLO = $02E7 Low memory pointer1470 HATABS = $31A Handler table1480 IOCB = $340 IOCB variables1490 ICCOM = $342=}1500 ICAX1 = $34A1510 ICAX2 = $34B1520 ICAX3 = $34C1530 ICAX4 = $34D1540 ICAX5 = $34E1550 ROWCRS = $54 Cursor ro>}w (y)1560 COLCRS = $55 Cursor column (x)1570 LMARGN = $52 Left margin1580 RMARGN = $53 Right margin1590 CSRINH =?} $2F0 Cursor inhibit.1600 CIOV = $E456 CIO Vector1610 CR = $9B Carriage Return1620 SPACE = $20 ASCII Space@}.1630 ;1640 WARMST1650 JSR $FFFF Jump to old DOS1660 CIOHND1670 LDX #$0 vector first.1680 CIOLOOP1690 LA}DA HATABS,X Insert the device1700 BEQ INS8 device at the end1710 CMP DEVNAM or at an entry1720 BEQ INS8 B} with the same name1730 INX as this device1740 INX1750 INX1760 JMP CIOLOOP1770 INS81780 LDA DEVNAM C} driver name1790 STA HATABS,X1800 LDA #NEWTAB&2551810 STA HATABS+1,X1820 LDA #NEWTAB/2561830 STA HATABS+2,X1840 D}LDA MEMLO+1 If MEMLO has1850 CMP #NEWLO/256 changed to1860 BCC NOTOK less than end1870 BNE MEMOK Of thE}e 8: device1880 LDA MEMLO then set it to1890 CMP #NEWLO&255 the end of the1900 BCS MEMOK 8: device. This1F}910 NOTOK1920 LDA #NEWLO/256 allows MEMLO to1930 STA MEMLO+1 be highered by1940 LDA #NEWLO&255 other drivers1950G} STA MEMLO1960 MEMOK1970 LDA DEVNAM If the device is1980 CMP #'E called E: then1990 BNE NOTED closH}e channel 02000 LDX #0 and re-open it2010 LDA #$C to the new E:.2020 STA ICCOM,X2030 JSR CIOV2040 I}LDA #DEVNAM&255 Open E:2050 STA IOCB+4,X2060 LDA #DEVNAM/2562070 STA IOCB+5,X2080 LDA #12 Open for mode 1220J}90 STA ICAX1,X2100 STA ICAX2,X2110 LDA #3 OPEN command2120 STA ICCOM,X2130 JSR CIOV2140 NOTED2150 RTS21K}60 NEWTAB2170 .WORD OPEN-1 new table2180 .WORD CLOSE-12190 .WORD GETBYTE-12200 .WORD PUTBYTE-1 The JMP below is22L}10 .WORD GETSTAT-1 reserved by OS to2220 .WORD SPECIAL-1 initialise but is2230 JMP NOTED currently unused2240 ;2M}250 ; ԠҠԠŠ2260 ;2270 SAVEX .BYTE 02280 ESCFLG = $2A22290 DSPFLG = $2FE2300 PLOTVEC = $E4162310 N};2320 PUTBYTE2330 JSR CHECK8 Mode 8 on screen?2340 LDY TEXTFLAG Use text?2350 BEQ TEXTPUT Yes.2360 PHA2370 LO}DA #9 Make sure ICCOM is2380 STA ICCOM,X PUT command, in2390 PLA case of non-CIO put2400 JMP DRAWLN P} put (eg Basic put).2410 ;2420 TEXTPUT2430 CTRL12440 LDY 17 Wait if Ctrl-12450 BEQ BREAK pressed, and breQ}ak2460 LDY 767 not pressed.2470 BNE CTRL12480 BEQ DOCHR2490 BREAK2500 STY 767 Untoggle Ctrl-1.2510 LDYR} #128 "Break" error.2520 JMP EXITPUT2530 DOCHR2540 STX SAVEX Save X register2550 LDX COLCRS+1 Check X coordS}2560 BNE ERR141C Out of range2570 LDX COLCRS2580 CPX #80 is nonzero or the2590 BCS ERR141C low byte >= 8026T}00 LDY ROWCRS Check Y coord is in2610 CPY #24 the range 0..792620 BCS ERR141C2630 PHA Check ESCFLG U}and2640 CMP #CR DISPFLG (or Return2650 BEQ SPEKEY key regardless) for2660 LDA ESCFLG the "Special" cont-26V}70 ORA DSPFLG rol codes functions2680 BEQ SPEKEY2690 PLA2700 NOTSPEK2710 JSR PUTCHR Put the character2720 INXW} Move cursor &2730 CPX RMARGN scroll if nec.2740 BEQ NOTCR2750 BCC NOTCR2760 LDX LMARGN Have to wrap X}cursor2770 INY2780 CPY #24 Scroll screen?2790 BNE NOTCR2800 LDY #02810 JSR SCROLU2820 LDY #232830 NOTCR28Y}40 STX COLCRS Save cursor posn.2850 STY ROWCRS2860 ASL ESCFLG Set ESCFLG to 02870 SUCCESS2880 LDY 11 SucZ}cess, If Break2890 EXITPUT2900 LDX SAVEX Restore X register2910 RTS2920 ERR141C2930 JSR CSHOME Home (cursor ou[}t of2940 LDY #141 range so place in2950 RTS range next time).2960 ;2970 ; ̠ӠǠ2980 \};2990 SPEKEY3000 PLA Get code value3010 CMP #27 Escape?3020 BNE NOTESC3030 LDA #$803040 STA ESCFLG]}3050 JMP SUCCESS3060 NOTESC3070 CMP #28 Cursor up?3080 BNE NOTUP3090 LDY ROWCRS Get row3100 DEY ^} Move cursor up3110 BPL WRAPUP Less than 0?3120 LDY #233130 WRAPUP3140 STY ROWCRS3150 JMP SUCCESS3160 NOTUP3170_} CMP #29 Down?3180 BNE NOTDWN3190 LDY ROWCRS3200 INY Move cursor down3210 CPY #24 If more than`} 233220 BNE WRAPDN then set it to 03230 LDY #03240 WRAPDN3250 STY ROWCRS than 233260 JMP SUCCESS3270 NOTDWN3a}280 CMP #30 Left?3290 BNE NOTLFT3300 LDY COLCRS3310 DEY3320 BMI PASTLT Wrap cursor special3330 CPY LMARGNb} case if X=255 (-1)3340 BCS WRAPLT Wrap cursor around3350 PASTLT3360 LDY RMARGN3370 WRAPLT3380 STY COLCRS3390 c} JMP SUCCESS3400 NOTLFT3410 CMP #31 Right?3420 BNE NOTRGT3430 LDY COLCRS3440 INY3450 CPY RMARGN Wrap cursd}or around3460 BCC WRAPRT3470 BEQ WRAPRT3480 LDY LMARGN3490 WRAPRT3500 STY COLCRS3510 JMP SUCCESS3520 NOTRGT3530 e} CMP #125 Clear screen?3540 BNE NOTCLR23550 LDY #23 Clear every line3560 LOOPCLR3570 JSR CLEARY from 23 f}down to3580 DEY zero, then set up3590 BPL LOOPCLR the cursor.3600 CSHOME3610 LDY #03620 STY ROWCRS3630 g} STY COLCRS+13640 LDY LMARGN3650 STY COLCRS3660 JMP SUCCESS3670 NOTCLR23680 CMP #126 Backspace3690 BNE NOTBSPq}?b%DOS SYSb*)DUP SYSbcSCONFIG80BASb80CHAR OBJbh80BASICS b#80DOSLD b280CIO bG80XIOS bDISK CATC80DOC2 TXTBAUTORUN SYS3700 LDY COLCRS If column 0, then3710 CPY LMARGN3720 BEQ DONEBS do nothing.3730 TXA3740 PHA3750 LDA #SPACE r} Move the cursor3760 LDX COLCRS back one space and3770 DEX then place a space3780 STX COLCRS in that s}position.3790 LDY ROWCRS3800 JSR PUTCHR3810 PLA Get X register back3820 TAX3830 DONEBS3840 JMP SUCCESS3t}850 NOTBSP3860 CMP #127 Tab?3870 BNE NOTTAB3880 CLC3890 LDA COLCRS Shift maximum of3900 ADC #10 10 chu}aracters over3910 CMP RMARGN3920 BCC TBEXIT3930 LDA RMARGN Have hit right mrgn3940 TBEXIT3950 STA COLCRS3960 JMv}P SUCCESS3970 NOTTAB3980 CMP #CR3990 BNE NOTRET4000 LDA LMARGN Set COLCRS to left4010 STA COLCRS margin4020 w}LDY ROWCRS4030 INY bottom of screen?4040 CPY #244050 BNE NOSCRL4060 LDY #0 Yes, scroll up4070 JSR x}SCROLU4080 LDY #234090 NOSCRL4100 STY ROWCRS Store new cursor Y4110 ASL ESCFLG Make ESCFLG=04120 JMP SUCCESS4y}130 NOTRET4140 CMP #156 Shift-Delete?4150 BNE NOTSDL4160 LDY ROWCRS4170 JSR SCROLU scroll up.4180 SETMGN419z}0 LDY LMARGN Set column to left4200 STY COLCRS margin4210 JMP SUCCESS4220 NOTSDL4230 CMP #157 Shift-Insert{}?4240 BNE NOTSIN4250 LDY ROWCRS insert a line4260 JSR SCROLD at Y and scroll dn.4270 JMP SETMGN Set cursor t|}o left.4280 NOTSIN4290 CMP #158 Control-Tab?4300 BNE NOTCTB4310 LDY LMARGN Set cursor to left4320 STY COLCRS}} margin4330 JMP SUCCESS4340 NOTCTB4350 CMP #159 Shift-Tab?4360 BNE NOTSTB4370 SEC Shift maximum of~}4380 LDA COLCRS 10 characters over4390 SBC #104400 BMI MARGSET Make sure have not4410 CMP LMARGN gone past le}ft4420 BCS TBEXIT2 margin.4430 MARGSET4440 LDA LMARGN Have hit left marg.4450 TBEXIT24460 STA COLCRS4470 JMP S}UCCESS4480 NOTSTB4490 CMP #253 Buzzer?4500 BNE NOTBUZ4510 JSR BUZZLN4520 JMP SUCCESS4530 BUZZLN4540 PHA } BUZZLN emulates the4550 TYA editor's buzzer4560 PHA routine which is4570 TXA at no }fixed abode4580 PHA in the OS ROM. It4590 LDY #$20 interferes with4600 BELL14610 JSR CLICK the WSYN}C timer.4620 DEY Note that the4630 BPL BELL1 keyboard click is4640 PLA generated using4650 TA}X just 1 cycle of4660 PLA this routine4670 TAY rather than 20.4680 PLA4690 RTS4700 ;4}710 WSYNC = $D40A4720 CONSOL = $D01F4730 CLICK4740 LDX #$7F This is the replica4750 CLICK14760 STX CONSOL of t}he OS routine4770 STX WSYNC to click the key-4780 DEX board and, looping,4790 BPL CLICK1 to sound the }buzzer4800 RTS4810 NOTBUZ4820 CMP #254 Control-Delete?4830 BNE NOTCDL4840 TXA4850 LDX COLCRS Delete char a}t X,Y4860 LDY ROWCRS4870 JSR DELETE4880 TAX4890 JMP SUCCESS4900 NOTCDL4910 CMP #255 Ctrl-Insert?4920 BEQ CT}RLIN If not, process as4930 JMP NOTSPEK a normal key.4940 CTRLIN4950 TXA4960 PHA4970 LDA #SPACE4980 LDX COLCR}S Insert a space at4990 LDY ROWCRS X,Y5000 JSR INSERT5010 PLA5020 TAX5030 JMP SUCCESS5040 ;5050 ; Š}Ӡ5060 ;5070 GETSAVX .BYTE 05080 DSTAT = $4C Keyboard Status5090 GETVEC = $E4145100 GETBYTE5110 JSR CHECK8 } Mode 8 on screen?5120 LDY TEXTFLAG Use text?5130 BEQ TEXTGET Yes.5140 JMP DRAWLN5150 TEXTGET5160 LDA COLCRS+1 }Check ranges of X5170 BNE ERR141D and Y and Return.5180 LDA COLCRS5210 CMP RMARGN5220 BCC RMAROK5230 BNE ERR141D}5240 RMAROK5250 LDA ROWCRS5260 CMP #245270 BCS ERR141D5280 LDA ICAX1,X If using mode 14, or5290 AND #2 getti}ng more than5300 ORA IOCB+9,X one byte, then do5310 BNE RECALN key input, else do5320 LDA IOCB+8,X locate (get char.}5330 CMP #2 at cursor).5340 BCS RECALN5350 ;5360 ; ŠźŠ5370 ;5380 STX GETSAVX5390 LDX COLCRS} Get character at5400 LDY ROWCRS ROWCRS, COLCRS5410 JSR LOCATE5420 BCC VALID Was character OK?5430 ERR1445440 } LDY #144 no, device done err5450 BNE NVALID5460 VALID5470 LDY #1 Character is valid5480 NVALID5490 LDX GET}SAVX5500 RTS5510 ERR141D5520 JSR CSHOME Cursor was out of5530 LDY #141 range, place in5540 BNE NVALID range }for next time.5550 ;5560 ; ٠ӠҠŠԠ5570 ;5580 LASTCH .BYTE 05590 KEYGET .WORD 05600 KEYVEC = $E42}45610 ;5620 RECALN5630 LDA BUFLEN Is buffer empty?5640 BEQ NEWBUF Yes, get new line.5650 LDY LASTCH Get next ch}aracter5660 LDA BUFFER,Y and decrement number5670 DEC BUFLEN left in buffer5680 INC LASTCH Next character.5690 LD}Y #1 Success!5700 RTS5710 ;5720 STARTX .BYTE 0 Starting X and Y5730 STARTY .BYTE 0 coords (used for5740 ; } margins, etc.)5750 NEWBUF5760 STX GETSAVX Store index to IOCB5770 LDY #1 Reset DSTAT and5780 STY DS}TAT Break Key flag5790 STY $11 before keyboard inp5800 LDA ROWCRS Store starting5810 STA STARTY cursor posi}tion, so5820 LDA COLCRS we can read just5830 STA STARTX parts of lines.5840 LDA ICAX1,X Get input mode5850 CMP #}13 Return-key mode?5860 BEQ LOOPGT5870 CLC Get a character5880 LDA KEYVEC from the keyboard5890 ADC #}1 GETCH routine5900 STA GOKEY+15910 LDA KEYVEC+15920 ADC #05930 STA GOKEY+25940 LDA ICAX1,X Get 1 key withou}t5950 CMP #14 printing it, or if5960 BEQ NOCURS CSRINH is non-zero,5970 AGAIN5980 LDA CSRINH then don't print} the5990 BNE NOCURS cursor.6000 LDX COLCRS6010 LDY ROWCRS Otherwise do INVERT6020 JSR INVERT to turn cursor on.}6030 NOCURS6040 GOKEY6050 JSR $FFFF Keyboard Get Subr.6060 CPY #$80 Is "error" < 128?6070 BCC KEYOK Yes, Ke}y is OK6080 JMP OOPS otherwise return.6090 KEYOK6100 LDY ICAX1,X Just get 1 key?6110 CPY #14 Yes, so get the}6120 BNE MOREKY value and exit.6130 RTS6140 MOREKY6150 LDX COLCRS (X and Y are changed6160 LDY ROWCRS by KEYGE}T subr.)6170 PHA Save the char. value6180 LDA CSRINH If we turned cursor6190 BNE NOCRON on, then we'd bett}er6200 JSR INVERT turn cursor off.6210 NOCRON6220 PLA Get the char value6230 CMP #CR If it is Return,}6240 BEQ RETKEY don't print it yet.6250 JSR TEXTPUT Put char on screen6260 LDX COLCRS Check cursor and6270 CPX #7}2 buzz for Near-EOL if6280 BNE NOBUZZ necessary, regard-6290 JSR BUZZLN less of RMARGN6300 NOBUZZ6310 JMP AGA}IN Get another key.6320 RETKEY6330 LDY ROWCRS Return pressed on 6340 CPY STARTY the line we started6350 BEQ LOO}PGT on? If not, start6360 LDX LMARGN INPUT at the left6370 STX STARTX margin, otherwise6380 STY STARTY at the s}tart column.6390 LOOPGT6400 LDX STARTX Get each character6410 CPX #RMARGN making sure it is as6420 BCC GETOK wit}hin the margins6430 BEQ GETOK otherwise exit the6440 JMP ENDGT loop - all done.6450 GETOK6460 LDY STARTY use t}he LOCATE6470 JSR LOCATE 80basic routine.6480 BCS ENDGT Stop if not char6490 LDX BUFLEN Store char in buf6500 }STA BUFFER,X And increment buf6510 INC BUFLEN length and next6520 INC STARTX character posn.6530 JMP LOOPGT6540 EN}DGT6550 LDX BUFLEN Remove trailing6560 BEQ ADDCR blanks from line6570 LDA BUFFER-1,X by decreasing the6580 CMP #}SPACE buffer length by 16590 BNE ADDCR and trying again6600 DEC BUFLEN6610 BNE ENDGT6620 ADDCR6630 LDA #CR } Store Return key6640 LDX BUFLEN into the end of the6650 STA BUFFER,X buffer, incrementing6660 INC BUFLEN buffer le}ngth by 1.6670 LDX #0 No chars got from6680 STX LASTCH buffer yet.6690 JSR TEXTPUT Print CR.6700 LDX GETSAVX} Get back X register6710 JMP RECALN and get first char6720 ;6730 ; ˠҠƺŠנŠ6740 ;6750 OOPS67}60 LDA #06770 STA BUFLEN Clear keyboard6780 STA LASTCH buffer6790 STA 767 Clear CTRL-16800 TYA } Save the error ie6810 PHA 128 or 136.6820 LDX COLCRS Unless the cursor6830 LDY ROWCRS is "off", or the}6840 LDA ICAX1,X error occured doing6850 AND #2 a single-byte GET6860 ORA CSRINH from the device,6870 BNE} NOTCSR remove the cursor6880 JSR INVERT from the screen.6890 NOTCSR6900 LDA #CR6910 JSR TEXTPUT Force new lin}e6920 LDA #06930 STA CSRINH Set cursor on6940 PLA Get registers back6950 TAY6960 LDX GETSAVX6970 RTS}6980 ;6990 ; Devnam is the device name. This7000 ; may be changed to any device.7010 ;7020 DEVNAM .BYTE "E:",CR7030 ;7}040 BUFFER *=*+817050 ;7060 ; ӠΠԩ7070 ;7080 NEWLO=*7090 INIT807100 LDA DOSINI first hav}e to7110 STA WARMST+1 trap Reset and7120 LDA DOSINI+1 reroute through7130 STA WARMST+2 our routine to7140 LD}A #WARMST&255 insert handler.7150 STA DOSINI (this part from7160 LDA #WARMST/256 INIT80 on is7170 STA DOSINI+1 }transient.)7180 JSR CIOHND Initialise 80:7190 LDX #0 Print a little7200 LDA #MESAGE&255 message for the7}210 STA IOCB+4,X viewers back7220 LDA #MESAGE/256 home, to the7230 STA IOCB+5,X editor (channel7240 LDA #LENGTH&}255 zero).7250 STA IOCB+8,X7260 LDA #LENGTH/2567270 STA IOCB+9,X7280 LDA #11 Block PUT cmd.7290 STA ICCOM,X}7300 JSR CIOV7305 GORET7310 RTS7320 ;7330 MESAGE7340 .BYTE CR,"80: dev"7350 .BYTE "ice by S"7360 .BYTE ". Trew 1}"7370 .BYTE "989.",CR7380 LENGTH = *-MESAGE7390 EMESG7400 .BYTE "E:",CR7410 ;7420 *=$2E27430 .WORD INIT807440 *=}$2E07450 .WORD GORET7380 LENGTH = *-MESAGE7390 EMESG7400 .BYTE "E:",CR7410 ;7420 *=$2E27430 .WORD INIT807440 *=1000 ; ***************************1010 ; * 80: XIOS *1020 ; * ----------------------- *1030 ; * BY SIMON }TREW, 1989. *1040 ; * ----------------------- *1050 ; * *1060 ; * These routines provide *1070 }; * all the special XIOS, *1080 ; * the OPEN, CLOSE and STA *1090 ; * -TUS, and the Graphics *1100 ; * 8 checking. They} handle *1110 ; * all calls to the S: rom *1120 ; * handler device. *1130 ; * *1140 ; ***}************************1150 ;1160 ; ӠӠΠӠ1170 ;1180 BASICS = $26001190 TEMP1 = $F51200 BUFP} = BASICS+$00001210 GR8SET = BASICS+$00751220 PUTCHR = BASICS+$00DD1230 MOVEYX = BASICS+$01381240 CLEARY = BA}SICS+$016A1250 SCROLU = BASICS+$018A1260 SCROLD = BASICS+$01A61270 GETCHR = BASICS+$01C51280 DELETE = BASICS+$020}71290 INSERT = BASICS+$02241300 LOCATE = BASICS+$02561310 INVERT = BASICS+$02FF1320 ;1330 *= BASICS+$03181340 ;}1350 MODE .BYTE 0 Open screen mode1360 TEXTFLAG .BYTE 0 Text/Graphics1370 BUFLEN .BYTE 0 Input buffer length1380 ROWCRS }= $54 Cursor row (y)1390 COLCRS = $55 Cursor column (x)1400 LMARGN = $52 Left margin1410 RMARGN = $53 Right margin}1420 GRMODE = $57 Display mode1430 FOREG = $2C5 Foreground colour1440 BACKG = $2C6 Background colour1450 BORDER = $}2C8 Border colour1460 IOCB = $340 IOCB variables1470 ICCOM = $3421480 ICAX1 = $34A1490 ICAX2 = $34B1500 ICAX3 = }$34C1510 ICAX4 = $34D1520 ICAX5 = $34E1530 ;1540 ; ϠέŠӠ1550 ;1560 OPEN1570 LDA ICAX1,X Fir}st save the OPEN1580 JSR SETINP mode, then attempt1590 JSR OPEN8 to open the screen.1600 LDY #1 Success!}1610 NOTOK1620 RTS1630 ;1640 ; ˠŠӠǠĠ1650 ;1660 CHECK81670 PHA1680 TYA1690 PHA1700 LDA GR}MODE Make sure we're1710 CMP #8 using mode 81720 BEQ OKMOD8 Otherwise attempt1730 OPEN81740 JSR GR8SET } to open.1750 CPY #1281760 BCC OPENOK Can't open, do not1770 PLA return to parent,1780 PLA ret}urn to grand-1790 PLA parent instead.1800 PLA This avoids more1810 RTS checking by parent}.1820 OPENOK1830 LDA #79 If OK, set defaults1840 STA RMARGN The user can change1850 LDA #0 these on co}nfig so1860 STA FOREG they each have a1870 LDA #12 separate LDA even1880 STA BACKG though they may be189}0 LDA #12 the same.1900 STA BORDER1910 LDA #0 Set left margin1920 STA COLCRS+1 (as graphics may1930 ST}A BUFLEN set it to 0) and1940 STA TEXTFLAG place in TEXT mode,1950 LDA LMARGN input mode 12.1960 STA COLCRS1970} OKMOD81980 PLA Then restore regs1990 TAY and return control2000 PLA to parent.2010 RTS}2020 ;2030 ; ԠӠƠǠ2040 ;2050 GETSTAT2060 LDY TEXTFLAG Status of TEXTFLAG2070 STY $23 exactl}y as XIOd.2080 RTS and store in IOCB.2090 ;2100 ; ̠Ӡ2110 ;2120 SPECIAL2130 JSR CHECK8 }Check using mode 82140 TXA Store X for later2150 PHA2160 JSR DOSPEC Do special oper.2170 PLA G}et back X reg.2180 TAX and use to reset2190 LDA MODE Input Mode back to2200 STA ICAX1,X its last value}, in2210 STA $2A ZIOCB also.2220 RTS2230 DOSPEC2240 LDA ICCOM,X Standard OS drawto2250 CMP #$11 or Fill} command?2260 BEQ DRAWLN2270 CMP #$122280 BNE NOTDRW No, skip over2290 ;2300 ; ӠӠŠӺũ231}0 ;2320 OLDLM .BYTE 02330 OLDRM .BYTE 02340 BPUT .BYTE 02350 DRAWV = $E4102360 DRAWLN2370 PHA2380 LDA TEXTFLAG Chec}k OK screen2390 BEQ BADMODE (not textmode)2400 LDA 83 Save margins as2410 STA OLDRM as the graphics2420 }LDA 82 routines may2430 STA OLDLM change them.2440 LDA ICCOM,X If doing a SPECIAL2450 CMP #$11 then u}se the SPEC.2460 BCS NOTPLT vector. If doing2470 AND #4 a GET then use the2480 BNE GETCMD GET vector else}2490 LDY #6 use the PUT vector.2500 BNE SKIPPL This is so that the2510 GETCMD2520 LDY #4 PLOT and LOCA}TE2530 BNE SKIPPL graphics command2540 NOTPLT2550 LDY #$A handlers can use2560 SKIPPL2570 CLC this} routine for2580 LDA DRAWV,Y their graphics,2590 ADC #1 as well as the2600 STA GODRAW+1 SPECIAL handler for2}610 LDA DRAWV+1,Y the DRAW and FILL.2620 ADC #02630 STA GODRAW+22640 PLA2650 GODRAW2660 JSR $FFFF2670 CPY #128 } If an error occ-2680 BCC NOTDER urred then set the2690 STY TEMP1 TEXT mode, to allow2700 JSR SWAPTT Basic }etc. to print2710 LDY TEMP1 the error.2720 NOTDER2730 PHA2740 LDA OLDRM Reset the margins2750 STA RMARGN }as they may have2760 LDA OLDLM been changed by2770 STA LMARGN the S: device.2780 PLA2790 RTS2800 BADMODE2810} LDY #145 Bad screen mode2820 PLA2830 RTS2840 ;2850 ; ŠԠҠΩ2860 ;2870 NOTDRW2880 CMP #$26 } NOTE command?2890 BNE NOTNOTE2900 LDA ROWCRS Put coords in the2910 STA ICAX5,X params of NOTE.2920 LDA COLC}RS This avoids the2930 STA ICAX3,X need for PEEKS to2940 LDA COLCRS+1 adresses which look2950 STA ICAX4,X crypt}ic and defy2960 LDY #1 the point of CIO.2970 RTS2980 ;2990 ; ŠŠ3000 ;3010 NOTNOTE3020 CMP #$27 } MOVE LINE command?3030 BNE NOTMOVE3040 LDA TEXTFLAG Check text mode is3050 BNE BADMODE not graphics3060 LDY ICAX1},X Load lines to move3070 CPY #24 Out of range?3080 BCS ERR1413090 LDA ICAX2,X have to use A and3100 TAX } transfer since cant3110 CPX #24 LDX indexed X !3120 BCS ERR1413130 JSR MOVEYX Do Move Line3140 LDY #}13150 BNE POPREGS3160 ERR1413170 LDY #141 Cursor out of range3180 POPREGS3190 RTS3200 ;3210 ; ҠŠ322}0 ;3230 NOTMOVE3240 CMP #$28 Clear line ICAX13250 BNE NOTCLR3260 LDA TEXTFLAG Check text mode is3270 BNE BADMO}DE not graphics3280 LDY ICAX1,X Cursor out of3290 CPY #24 range?3300 BCS ERR141B3310 JSR CLEARY No, do C}LEARY3320 LDY #13330 RTS3340 ERR141B3350 LDY #141 Cursor out of range3360 RTS3370 ;3380 ; ̠Р3390 ;}3400 NOTCLR3410 CMP #$293420 BNE NOTSCRU3430 LDA TEXTFLAG Check text mode is3440 BNE BADMODE not graphics3450 LD}Y ICAX1,X is the line out of3460 CPY #24 range?3470 BCS ERR141B3480 JSR SCROLU No, do SCROLU3490 CLOSE3500} LDY #1 This operation will3510 RTS do nice for CLOSE.3520 ;3530 ; ̠Π3540 ;3550 NOTSCRU35}60 CMP #$2A Scroll down ICAX1?3570 BNE CHGTEXT3580 LDA TEXTFLAG Check text mode is3590 BNE BADMODE not graphic}s3600 LDY ICAX1,X Cursor out of3610 CPY #24 range?3620 BCS ERR141B3630 JSR SCROLD No, do SCROLD3640 LDY }#13650 RTS3660 ;3670 ; ŠŠΠǠ3680 ;3690 OLDROW .BYTE 03700 OLDCOL .WORD 03710 CHGTEXT3720 CMP #}$2B Change value3730 BNE NOTTEXT3740 SWAPTT3750 LDA TEXTFLAG Toggle Textflag3760 EOR #13770 STA TEXTFLAG3}780 LDX #23790 SWLOOP3800 LDA ROWCRS,X Switch the two3810 LDY OLDROW,X cursors, so that3820 STY ROWCRS,X swi}tching between3830 STA OLDROW,X text and graphics3840 DEX does not require3850 BPL SWLOOP setting p}osition.3860 LDY #13870 RTS3880 ;3890 ; ԠҠΠΠ3900 ;3910 NOTTEXT3920 CMP #$2C Invert?3930 } BNE NOTINV3940 LDA TEXTFLAG Check text mode is3950 BEQ GOODMDE not graphics3960 JMP BADMODE3970 GOODMDE3980 LDY }ICAX2,X Load char To invert3990 CPY #24 Out of range?4000 BCS ERR141D4010 LDA ICAX1,X have to use A and4020 } TAX transfer since cant4030 CPX #80 load X indexed X!4040 BCS ERR141D4050 JSR INVERT Do Invert Char}4060 LDY #14070 RTS4080 ERR141D4090 JMP ERR1414100 ;4110 ; ŠԠŠ4120 ;4130 NOTINV4140 CMP #$2D } Input change?4150 BNE NOTIMPL If so, set Y=1 now,4160 LDY #1 as OPEN may call the4170 LDA ICAX1,X below routin}e when4180 SETINP4190 CMP #12 Y<>1, an invalid4200 BCC NOTOKI Open. Check mode4210 CMP #15 is either 12,13},144220 BCS NOTOKI else set it to 12.4230 OKINP4240 STA ICAX1,X Store in IOCB and4250 STA $2A in ZIOCB locn, a}s4260 STA MODE well as MODE of4270 RTS course!4280 NOTOKI4290 LDA #12 If out of range,4300 JMP OKI}NP set to 12.4310 ;4320 ; ԠĠ4330 ;4340 NOTIMPL4350 LDY #146 Function not imple-4360 RTS } mented. 12.4310 ;4320 ; ԠĠ4330 ;4340 NOTIMPL4350 LDY #146 Function not imple-4360 RTS  D2:DISK.CAT0064AР ,Š ,Š ,Š ,Ӡ ,TOUS ENRGTS D1:CATALOG,53,58,59,61&^^ˠ   @jD$JD@P(DDDDD(DD@@HHD䤤NL"D"",N¤HDJDDDDD N@.* }J"DDjĪȨΨ䊈ʊ(DD@@HHD䤤NL"D"",N¤HDJDDDDD N@.(,