@LF}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr 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 TEMP0}3 the X line address3510 LDA TEMP1+1 (after we store the3520 STA TEMP3+1 result of the first)3530 JSR CALCXY3540 LDY1} #0 First 256 bytes3550 LOOP5A3560 LDA (TEMP3),Y3570 STA (TEMP1),Y3580 INY3590 BNE LOOP5A3600 INC TEMP3+1 Mov2}e up one page to3610 INC TEMP1+1 move the next lot of3620 LOOP5B3630 LDA (TEMP3),Y ; (320-256) bytes3640 STA (TEMP1),Y3}3650 INY3660 CPY #320-256 Done all of that?3670 BNE LOOP5B3680 PLA Finished!3690 TAX3700 PLA3710 TAY34}720 PLA3730 RTS3740 ;3750 ; ҠŠ٠3760 ;3770 CLEARY3780 PHA3790 TXA3800 PHA3810 TYA3820 PHA3830 LD5}X #$03840 JSR CALCXY Get first byte to3850 TXA clear, and make A&Y3860 TAY both equal to 03870 LOO6}P6A3880 STA (TEMP1),Y Clear first page3890 INY3900 BNE LOOP6A3910 INC TEMP1+1 Next page3920 LOOP6B3930 STA (TE7}MP1),Y Clear bytes 256 to3940 INY 319 then done3950 CPY #320-2563960 BNE LOOP6B3970 PLA Finish8}ed!3980 TAY3990 PLA4000 TAX4010 PLA4020 RTS4030 ;4040 ; ̠Р͠Š٠4050 ;4060 SCROLU4070 PHA40809} 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 GeA}t byte4700 CPX #1 Odd half or even?4710 BNE EVENG4720 AND #$0F Odd=mask even part4730 JMP STORVAL4740 EVB}ENG4750 LSR A Even=shift odd part4760 LSR A4770 LSR A4780 LSR A4790 STORVAL4800 LDY VALGET Which byte?C}4810 STA BUFP,Y4820 CLC Next byte=40 away4830 LDA #40 So add 40 on4840 ADC TEMP14850 STA TEMP14860 D} LDA #0 (with carry)4870 ADC TEMP1+14880 STA TEMP1+14890 INY Increment number4900 STY VALGET of E}bytes done4910 CPY #8 8=finished4920 BNE LOOPG4930 PLA Restore regs4940 TAX4950 PLA4960 TAY4970F} PLA4980 RTS4990 ;5000 ; ŠҠŠŠР5010 ;5020 DELETE5030 PHA Save X and A (Y is5040 TXA G} unchanged)5050 PHA5060 LOOPDT5070 CPX #79 End of line yet?5080 BEQ EXITDT5090 INX Get the characH}ter5100 JSR GETCHR next up the line and5110 DEX move it one col left5120 JSR STORE85130 INX Then preI}pare for next5140 JMP LOOPDT char.5150 EXITDT5160 LDA #32 Store SPACE at 79,y5170 JSR PUTCHR5180 PLA5190 TAXJ}5200 PLA5210 RTS5220 ;5230 ; ԠҮԠج٠5240 ;5250 XINS .BYTE 05260 INSERT5270 PHA Save A and X528K}0 STX XINS5290 CPX #795300 BEQ FININS5310 LDX #795320 LOOPIN5330 DEX Move each character5340 JSR GETCHR L}one character to the5350 INX right, then prepare5360 JSR STORE8 for the next char5370 DEX5380 CPX XINS5390 M} BNE LOOPIN5400 FININS5410 PLA Store character5420 LDX XINS5430 JSR PUTCHR5440 RTS5450 ;5460 ; ŠN}ҠԠج٠Ϡ5470 ; ĠҠ٠ƠĠ5480 ;5490 EVNBUF .BYTE "XXXXXXXX"5500 ODDBUF .BYTE "XXXXXXXX"5510 ALLO}BLK .BYTE 0 Totally blank?5520 INVFLG .BYTE 0 Testing inverse?5530 ;5540 LOCATE5550 JSR GETCHR Get the bit image5560P} TXA Save X and Y5570 PHA on the stack (the5580 TYA accum is the char5590 PHA Q}on return).5600 LDX #0 Character number5610 STX ALLBLK also reset inverse5620 STX INVFLG and blank and OddR}5630 STX ODDFLG flags.5640 STX TEMP2+1 Get the TEMP regs5650 LDA #CHSET&255 ready for indexing5660 STA TEMP1 S} the character set.5670 LDA #CHSET/2565680 STA TEMP1+15690 LDA #8 Each character is5700 STA TEMP2 8 bytes T}high.5710 LDY #7 Transfer the bitmap5720 LOCLOOP5730 LDA BUFP,Y to ODDBUF, with the5740 STA ODDBUF,Y low nyU}bble set, and5750 ASL A to EVNBUF, with the5760 ASL A high nybble set.5770 ASL A This avoids slV}ow5780 ASL A shifts each time.5790 STA EVNBUF,Y Check also that the5800 ORA ALLBLK character is all5810 SW}TA ALLBLK blanks (a space).5820 DEY5830 BPL LOCLOOP5840 LDA ALLBLK If it is all blanks5850 BNE MNLOOP then aX}ssume a5860 LDA #32 space character.5870 BNE XITOK5880 MNLOOP5890 LDY #75900 EACHCH5910 LDA ODDFLG If it iY}s an odd5920 BNE ODDLOC character, compare5930 LDA (TEMP1),Y the low order5940 AND #$F0 nybbles, otherwise5950Z} 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 a}as nec.6240 CPX #0 If done all chars6250 BEQ FAILED then not valid.6260 CPX #$80 Otherwise if trying627b}0 BNE MNLOOP inverse then invert6280 LDY #$7 the compare buffers6290 LOOPIV6300 LDA ODDBUF,Y so that can compc}are6310 EOR #$F each character with6320 STA ODDBUF,Y -out having to6330 LDA EVNBUF,Y invert each buffer6340 Ed}OR #$F0 every time.6350 STA EVNBUF,Y6360 DEY6370 BPL LOOPIV6380 LDA #CHSET&255 Get the indexes6390 STA TEMP1 e} prepared again6400 LDA #CHSET/2566410 STA TEMP1+16420 SEC Set INVFLG to $806430 ROR INVFLG6440 BCC MNf}LOOP (Unconditional)6450 FAILED6460 PLA Restore registers,6470 TAY it doesn't matter6480 PLA g} what A is since6490 TAX carry is set to6500 SEC indicate failure6510 RTS6520 ;6530 ; h}ԠҠԠج٠6540 ;6550 INVERT6560 JSR GETCHR Get char to invert6570 PHA Save registers6580 TYA6590 i} PHA6600 LDY #7 Invert 8 bytes6610 LOOPINV6620 LDA BUFP,Y Get each byte6630 EOR #$F invert it6640 STj}A BUFP,Y6650 DEY Next byte6660 BPL LOOPINV6670 PLA Restore regs6680 TAY6690 PLA6700 JMP STOREk}8 Place char on scn.1000 ; ***************************1010 ; * 80: CIO *1020 ; * ----------------------- *1030 ; * BY SIMON m}TREW, 1989. *1040 ; * ----------------------- *1050 ; * *1060 ; * These routines handle *1070 n}; * the CIO functions for *1080 ; * PUT and GET, the CIO *1090 ; * tables, reset processes *1100 ; * and transient DOo}S code. *1110 ; * *1120 ; ***************************1130 ;1140 ; ӠӠΠӠ115p}0 ;1160 BASICS = $26001170 TEMP1 = $F51180 BUFP = BASICS+$00001190 GR8SET = BASICS+$00751200 PUTCHR = BASICq}S+$00DD1210 CLEARY = BASICS+$016A1220 SCROLU = BASICS+$018A1230 SCROLD = BASICS+$01A61240 DELETE = BASICS+$02071r}250 INSERT = BASICS+$02241260 LOCATE = BASICS+$02561270 INVERT = BASICS+$02FF1280 ;1290 ; ӠӠΠӠs}1300 ;1310 MODE = BASICS+$03181320 TEXTFLAG = BASICS+$03191330 BUFLEN = BASICS+$031A1340 OPEN = BASICS+$031B1t}350 CLOSE = BASICS+$04421360 CHECK8 = BASICS+$03271370 GETSTAT = BASICS+$03611380 SPECIAL = BASICS+$03671390 DRAWLu}N = BASICS+$03881400 ;1410 *= BASICS+$04C21420 ;1430 ; ϠҠ1440 ;1450 DOSINI = $C Reset vector1460 v}MEMLO = $02E7 Low memory pointer1470 HATABS = $31A Handler table1480 IOCB = $340 IOCB variables1490 ICCOM = $342w}1500 ICAX1 = $34A1510 ICAX2 = $34B1520 ICAX3 = $34C1530 ICAX4 = $34D1540 ICAX5 = $34E1550 ROWCRS = $54 Cursor rox}w (y)1560 COLCRS = $55 Cursor column (x)1570 LMARGN = $52 Left margin1580 RMARGN = $53 Right margin1590 CSRINH =y} $2F0 Cursor inhibit.1600 CIOV = $E456 CIO Vector1610 CR = $9B Carriage Return1620 SPACE = $20 ASCII Spacez}.1630 ;1640 WARMST1650 JSR $FFFF Jump to old DOS1660 CIOHND1670 LDX #$0 vector first.1680 CIOLOOP1690 L{}DA HATABS,X Insert the device1700 BEQ INS8 device at the end1710 CMP DEVNAM or at an entry1720 BEQ INS8 |} with the same name1730 INX as this device1740 INX1750 INX1760 JMP CIOLOOP1770 INS81780 LDA DEVNAM }} driver name1790 STA HATABS,X1800 LDA #NEWTAB&2551810 STA HATABS+1,X1820 LDA #NEWTAB/2561830 STA HATABS+2,X1840 ~}LDA MEMLO+1 If MEMLO has1850 CMP #NEWLO/256 changed to1860 BCC NOTOK less than end1870 BNE MEMOK Of th}e 8: device1880 LDA MEMLO then set it to1890 CMP #NEWLO&255 the end of the1900 BCS MEMOK 8: device. This1}910 NOTOK1920 LDA #NEWLO/256 allows MEMLO to1930 STA MEMLO+1 be highered by1940 LDA #NEWLO&255 other drivers1950} STA MEMLO1960 MEMOK1970 LDA DEVNAM If the device is1980 CMP #'E called E: then1990 BNE NOTED clos}e channel 02000 LDX #0 and re-open it2010 LDA #$C to the new E:.2020 STA ICCOM,X2030 JSR CIOV2040 }LDA #DEVNAM&255 Open E:2050 STA IOCB+4,X2060 LDA #DEVNAM/2562070 STA IOCB+5,X2080 LDA #12 Open for mode 1220}90 STA ICAX1,X2100 STA ICAX2,X2110 LDA #3 OPEN command2120 STA ICCOM,X2130 JSR CIOV2140 NOTED2150 RTS21}60 NEWTAB2170 .WORD OPEN-1 new table2180 .WORD CLOSE-12190 .WORD GETBYTE-12200 .WORD PUTBYTE-1 The JMP below is22}10 .WORD GETSTAT-1 reserved by OS to2220 .WORD SPECIAL-1 initialise but is2230 JMP NOTED currently unused2240 ;2}250 ; ԠҠԠŠ2260 ;2270 SAVEX .BYTE 02280 ESCFLG = $2A22290 DSPFLG = $2FE2300 PLOTVEC = $E4162310 };2320 PUTBYTE2330 JSR CHECK8 Mode 8 on screen?2340 LDY TEXTFLAG Use text?2350 BEQ TEXTPUT Yes.2360 PHA2370 L}DA #9 Make sure ICCOM is2380 STA ICCOM,X PUT command, in2390 PLA case of non-CIO put2400 JMP DRAWLN } put (eg Basic put).2410 ;2420 TEXTPUT2430 CTRL12440 LDY 17 Wait if Ctrl-12450 BEQ BREAK pressed, and bre}ak2460 LDY 767 not pressed.2470 BNE CTRL12480 BEQ DOCHR2490 BREAK2500 STY 767 Untoggle Ctrl-1.2510 LDY} #128 "Break" error.2520 JMP EXITPUT2530 DOCHR2540 STX SAVEX Save X register2550 LDX COLCRS+1 Check X coord}2560 BNE ERR141C Out of range2570 LDX COLCRS2580 CPX #80 is nonzero or the2590 BCS ERR141C low byte >= 8026}00 LDY ROWCRS Check Y coord is in2610 CPY #24 the range 0..792620 BCS ERR141C2630 PHA Check ESCFLG }and2640 CMP #CR DISPFLG (or Return2650 BEQ SPEKEY key regardless) for2660 LDA ESCFLG the "Special" cont-26}70 ORA DSPFLG rol codes functions2680 BEQ SPEKEY2690 PLA2700 NOTSPEK2710 JSR PUTCHR Put the character2720 INX} Move cursor &2730 CPX RMARGN scroll if nec.2740 BEQ NOTCR2750 BCC NOTCR2760 LDX LMARGN Have to wrap }cursor2770 INY2780 CPY #24 Scroll screen?2790 BNE NOTCR2800 LDY #02810 JSR SCROLU2820 LDY #232830 NOTCR28}40 STX COLCRS Save cursor posn.2850 STY ROWCRS2860 ASL ESCFLG Set ESCFLG to 02870 SUCCESS2880 LDY 11 Suc}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 NOTDWN3}280 CMP #30 Left?3290 BNE NOTLFT3300 LDY COLCRS3310 DEY3320 BMI PASTLT Wrap cursor special3330 CPY LMARGN} case if X=255 (-1)3340 BCS WRAPLT Wrap cursor around3350 PASTLT3360 LDY RMARGN3370 WRAPLT3380 STY COLCRS3390 } JMP SUCCESS3400 NOTLFT3410 CMP #31 Right?3420 BNE NOTRGT3430 LDY COLCRS3440 INY3450 CPY RMARGN Wrap curs}or around3460 BCC WRAPRT3470 BEQ WRAPRT3480 LDY LMARGN3490 WRAPRT3500 STY COLCRS3510 JMP SUCCESS3520 NOTRGT3530 } CMP #125 Clear screen?3540 BNE NOTCLR23550 LDY #23 Clear every line3560 LOOPCLR3570 JSR CLEARY from 23 }down to3580 DEY zero, then set up3590 BPL LOOPCLR the cursor.3600 CSHOME3610 LDY #03620 STY ROWCRS3630 } STY COLCRS+13640 LDY LMARGN3650 STY COLCRS3660 JMP SUCCESS3670 NOTCLR23680 CMP #126 Backspace3690 BNE NOTBSP}3700 LDY COLCRS If column 0, then3710 CPY LMARGN3720 BEQ DONEBS do nothing.3730 TXA3740 PHA3750 LDA #SPACE } Move the cursor3760 LDX COLCRS back one space and3770 DEX then place a space3780 STX COLCRS in that }position.3790 LDY ROWCRS3800 JSR PUTCHR3810 PLA Get X register back3820 TAX3830 DONEBS3840 JMP SUCCESS3}850 NOTBSP3860 CMP #127 Tab?3870 BNE NOTTAB3880 CLC3890 LDA COLCRS Shift maximum of3900 ADC #10 10 ch}aracters over3910 CMP RMARGN3920 BCC TBEXIT3930 LDA RMARGN Have hit right mrgn3940 TBEXIT3950 STA COLCRS3960 JM}P SUCCESS3970 NOTTAB3980 CMP #CR3990 BNE NOTRET4000 LDA LMARGN Set COLCRS to left4010 STA COLCRS margin4020 }LDY ROWCRS4030 INY bottom of screen?4040 CPY #244050 BNE NOSCRL4060 LDY #0 Yes, scroll up4070 JSR }SCROLU4080 LDY #234090 NOSCRL4100 STY ROWCRS Store new cursor Y4110 ASL ESCFLG Make ESCFLG=04120 JMP SUCCESS4}130 NOTRET4140 CMP #156 Shift-Delete?4150 BNE NOTSDL4160 LDY ROWCRS4170 JSR SCROLU scroll up.4180 SETMGN419}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 CIOV7310 RTS7320 ;7330 MESAGE7340 .BYTE CR,"80: dev"7350 .BYTE "ice by S"7360 .BYTE ". Trew 1"7370 .BY}TE "989.",CR7380 LENGTH = *-MESAGE7390 EMESG7400 .BYTE "E:",CR7410 ;7420 *=$2E27430 .WORD INIT80 module.u1000 ; ***************************1010 ; * 80: DOS LOAD *1020 ; * ----------------------- *1030 ; * BY SIMON }TREW, 1989. *1040 ; * ----------------------- *1050 ; * *1060 ; * This routine is used to *1070 }; * load another file after *1080 ; * the 80: device has been *1090 ; * loaded. It only works *1100 ; * under DOS 2.x an}d is *1110 ; * memory-transient. *1130 ; * *1140 ; ***************************1150 ;116}0 BASICS =$26001170 RUNAD =$2E0 DOS Run address1180 IOCB =$340 IOCB adresses1190 ICCOM =$3421200 ICBAL =$344121}0 ICBAH =$3451220 ICAX1 =$34A1230 ICAX2 =$34B1240 OPEN =$3 CIO commands1250 CLOSE =$C1260 INPUT =$41270 CIOV } =$E456 CIO vector1280 ;1290 *=BASICS+$9051300 ;1310 START1320 LDA #CLOSE First close chan1330 LDX #$10 1 }(the channel1340 STA ICCOM,X used to load a1350 JSR CIOV binary file).1360 BMI 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 L}DA #FILE/256 name specified by1420 STA ICBAH,X the user (loaded1430 LDA #INPUT into FILE by1440 STA ICAX1,X the }configuration1450 LDA #0 program).1460 STA ICAX2,X1470 JSR CIOV1480 BMI NOFUN1490 JSR GODOS Do the binar}y load1500 NOFUN1510 LDA #CLOSE That's all folks,1520 LDX #$10 so close the IOCB1530 STA ICCOM,X and return }to1540 JMP CIOV DOS.1550 GODOS1560 LDA #0 Push a parameter1570 PHA to the stack (a1580 JMP 557}6 BASIC USR does).1590 ;1600 FILE1610 .BYTE "D:XXXXXXXXXXXX"1620 ;1630 *=RUNAD Set run vector1640 .WORD S}TART1000 ; ***************************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 0}DE not graphics3280 LDY ICAX1,X Cursor out of3290 CPY #24 range?3300 BCS ERR141B3310 JSR CLEARY No, do C 1}LEARY3320 LDY #13330 RTS3340 ERR141B3350 LDY #141 Cursor out of range3360 RTS3370 ;3380 ; ̠Р3390 ; 2}3400 NOTCLR3410 CMP #$293420 BNE NOTSCRU3430 LDA TEXTFLAG Check text mode is3440 BNE BADMODE not graphics3450 LD 3}Y ICAX1,X is the line out of3460 CPY #24 range?3470 BCS ERR141B3480 JSR SCROLU No, do SCROLU3490 CLOSE3500 4} LDY #1 This operation will3510 RTS do nice for CLOSE.3520 ;3530 ; ̠Π3540 ;3550 NOTSCRU35 5}60 CMP #$2A Scroll down ICAX1?3570 BNE CHGTEXT3580 LDA TEXTFLAG Check text mode is3590 BNE BADMODE not graphic 6}s3600 LDY ICAX1,X Cursor out of3610 CPY #24 range?3620 BCS ERR141B3630 JSR SCROLD No, do SCROLD3640 LDY 7}#13650 RTS3660 ;3670 ; ŠŠΠǠ3680 ;3690 OLDROW .BYTE 03700 OLDCOL .WORD 03710 CHGTEXT3720 CMP # 8}$2B Change value3730 BNE NOTTEXT3740 SWAPTT3750 LDA TEXTFLAG Toggle Textflag3760 EOR #13770 STA TEXTFLAG3 9}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 A}e when4180 SETINP4190 CMP #12 Y<>1, an invalid4200 BCC NOTOKI Open. Check mode4210 CMP #15 is either 12,13 B},144220 BCS NOTOKI else set it to 12.4230 OKINP4240 STA ICAX1,X Store in IOCB and4250 STA $2A in ZIOCB locn, a C}s4260 STA MODE well as MODE of4270 RTS course!4280 NOTOKI4290 LDA #12 If out of range,4300 JMP OKI D}NP set to 12.4310 ;4320 ; ԠĠ4330 ;4340 NOTIMPL4350 LDY #146 Function not imple-4360 RTS E} mented. d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%G} DD˙`  }J)Lr J  ((  p L ()   JH}L= ( L 0q A    IB JC;? D W I} LL  ` W )LA!  ߰")-݆ p" J} $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ`K}$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H L}p h  hyhy D L> L JJ    ! LA*` BFM}7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!LN}EE !E^ ^ E E7EȩEdE/EȩE  DO} .L }  ;F d  ;?F7F? ( .   Z D LL d P} . D  L    p  E` , d)  D L) 0BM݊L݉Q} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ GR} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >GS} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISKa}.COMLu L1 L ;LHL  T`  `1  ɐ     `TU b} L ? .  t`GBJ ~DEHI B V0dVc}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEhd}DEL8HI4 0 HI,0 0  9 .G VLOe},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHIf} V0 0`B;DEL`?<0LV`$ʆ v s? F0Ξ05: [ BDEHIg} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO q}2Be80BASICSASMBl80CIO ASMB80DOSLD ASMBE80XIOS ASMB%FDOS SYSB*tDUP SYSSTILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -r}LLu ÝDEHILV 9 .l 9 .l  `` s$B BHs}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu } 3E:}DISK OPERATING SYSTEM II VERSION 2.5 COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDGu}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRESv}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N'w}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.5s, type Y Λx x}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECTy} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DLz}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD{}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.|}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC}}COPY--FROM, TO?OPTION NOT ALLOWED377 FREE SECTORS COPYING---D2:JT.PICCOMl# 0|D .L/%#~}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E }1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A}LLOWED IN DESTINATION 0 <.|K