1000 * RECDOS2.M65 1010 .PAGE "OPEN" 1020 * 1030 * DFMOPN - file open execution entry point 1040 * 1050 DFMOPN JSR SETUP do FCB set up 1060 JSR FNDCODE go decode file name 1070 LDA ICAUX1,X get aux1 (open type codes) 1080 STA FCBOTC,X put into FCB 1090 AND #OPDIR is this list directory? 1100 BEQ OPN1 br if not 1110 JMP LISTDIR goto dir list code 1120 OPN1 JSR SFDIR go search file dir 1130 PHP stack result 1140 LDA FCBOTC,X get open type code 1150 CMP #OPIN input 1160 BEQ DFOIN 1170 CMP #OPOUT output 1180 BEQ DFOOUT 1190 CMP #OPIN+OPOUT update 1200 BEQ DFOUPD 1210 CMP #OPOUT+OPAPND append 1220 BEQ DFOAPN 1230 GOERD JSR ERROR error: device cmd invalid 1240 .BYTE $A8 (error # 168) 1250 * 1260 * DFOIN - open for input 1270 * 1280 DFOIN PLP get search flag 1290 BCS OPNER1 error if not found 1300 BCC DFOUI 1310 * 1320 * DFOUPD - open for update 1330 * 1340 DFOUPD PLP get search flag 1350 BCS OPNER1 br not found 1360 JSR TSTLOCK test lock 1370 DFOUI JSR DFRDSU set up for read 1380 JMP GREAT done 1390 OPNER1 JSR ERROR file not found 1400 .BYTE $AA (error # 170) 1410 * 1420 * DFOAPN - open for append 1430 * 1440 DFOAPN PLP get read status 1450 BCS OPNER1 br not found 1460 LDY CDIRD get file flag 1470 LDA FILDIR+DFDFL1,Y 1480 STA FCBSPR,X save flag 1490 AND #DFDNLD if old file type then error 1500 BEQ APOER 1510 JSR TSTLOCK test locked 1520 JSR OPVTOC read VTOC (insure not write protected) 1530 JSR GETSECTOR get a new sector 1540 STA FCBSSN+1,X move sector # to link sector # 1550 LDA FCBLSN,X 1560 STA FCBSSN,X 1570 JMP DHFOX2 continue as open 1580 APOER JSR ERROR attempt append to old type file 1590 .BYTE $AC (error # 172) 1600 * 1610 * DFOOUT - open for output 1620 * 1630 DFOOUT PLP get search flag 1640 BCS DFOX1 1650 JSR XDEL0 delete the file or files 1660 LDY CDIRD 1670 JMP OPN1A 1680 * make a new entry in the directory 1690 DFOX1 LDA DHOLES was there a hole 1700 BMI OPNER2 br if no hole 1710 STA CDIRS save hole sector as current dir sec 1720 JSR RDDIR go read current dir sector 1730 LDA DHOLED move hole displ to current dir displ 1740 STA CDIRD 1750 LDA DHFNUM move hole FN to current 1760 STA SFNUM 1770 JSR OPVTOC 1780 LDY CDIRD 1790 LDX #10 1800 LDA #$20 1810 OPN1B STA FILDIR+DFDPFN,Y blank fill file entry for file name 1820 INY 1830 DEX 1840 BPL OPN1B 1850 * allocate data sector, prepare & write dir entry 1860 OPN1A LDX CURFCB 1870 LDA #DFDINU+DFDNLD set dir flag in use 1880 STA FCBSPR,X 1890 JSR GETSECTOR get a sector 1900 LDY CDIRD get dir displ 1910 STA FILDIR+DFDSSN+1,Y put sector into dir rec 1920 LDA FCBLSN,X 1930 STA FILDIR+DFDSSN,Y 1940 LDA #DFDINU+DFDOUT+DFDNLD set dir entry in use, open for output 1950 STA FILDIR+DFDFL1,Y 1960 LDA #0 1970 STA FILDIR+DFDCNT+1,Y set count = 0 1980 STA FILDIR+DFDCNT,Y 1990 LDX #0 2000 OPN2 LDA FNAME,X move file name 2010 CMP #'? if wild card 2020 BEQ OPN2A change to blank 2030 STA FILDIR+DFDPFN,Y to directory 2040 OPN2A INY 2050 INX 2060 CPX #11 2070 BCC OPN2 2080 JSR WRTDIR go write directory 2090 * finish open output/append 2100 DHFOX2 JSR SETFCB 2110 JSR WRTN6 fix up as if write 2120 LDA #FCBFAS set new file 2130 STA FCBFLG,X 2140 * was DOS file opened? 2150 JSR TSTDOS if not DOS 2160 BNE DHFOX3 br 2170 JMP WRTDOS else write DOS.SYS file 2180 DHFOX3 JMP GREAT 2190 OPNER2 JSR ERROR directory full 2200 .BYTE $A9 (error # 169) 2210 * setup FCB 2220 SETFCB LDA #0 clear 2230 STA FCBFLG,X flag 2240 LDA SFNUM move file number to FCB 2250 ASL A 2260 ASL A 2270 STA FCBFNO,X 2280 LDA #0 2290 STA FCBDLN,X data length 2300 STA FCBCNT,X set count = 0 2310 STA FCBCNT+1,X 2320 RTS 2330 * set up for read 2340 DFRDSU JSR SETFCB setup FCB 2350 LDY CDIRD move start sector to link 2360 LDA DFDFL1+FILDIR,Y 2370 STA FCBSPR,X get file flag 2380 AND #DFDNLD set new sector flag 2390 STA FCBSLT,X 2400 LDA FILDIR+DFDSSN,Y move start sector 2410 STA FCBLSN,X 2420 LDA FILDIR+DFDSSN+1,Y 2430 STA FCBLSN+1,X 2440 JMP RDNSO read 1st sector and rtn 2450 .PAGE "PUT BYTE" 2460 * 2470 * DFMPUT - put a file byte 2480 * 2490 DFMPUT STA SVDBYT 2500 LDA ICDNO,X 2510 STA ICDNOZ 2520 JSR SETUP 2530 LDY ENTSTK chk to see if entry wasn't for CIO 2540 LDA STAK,Y if hi byte rts is not in o.s. addr 2550 CMP #OSBTM space then a non-CIO entry 2560 BCS FRMCIO br if from CIO 2570 LDA #0 else prevent from doing burst i/o 2580 STA ICCOMZ 2590 FRMCIO LDA FCBOTC,X if not open 2600 AND #OPOUT output 2610 BEQ PUTER error 2620 LDY FCBDLN,X get data length 2630 TYA 2640 CMP FCBMLN,X if sector not full 2650 BCC PUT1 then br 2660 JSR WRTNXS else write full sector 2670 BCS PEOF br if EOF 2680 JSR WTBUR test burst 2690 LDY #0 2700 BCS PUT1 br if not burst 2710 LDA (ICBALZ),Y put next byte 2720 STA SVDBYT after burst area 2730 PUT1 INC FCBDLN,X inc data len 2740 LDA SVDBYT get data byte 2750 STA (ZSBA),Y and put in sector buffer 2760 LDA #FCBFSM indicate sector modified 2770 ORA FCBFLG,X 2780 STA FCBFLG,X 2790 JMP GREAT done 2800 PUTER JMP GOERD device command invalid 2810 PEOF JSR ERROR end of file error 2820 .BYTE $88 (error # 136) 2830 .PAGE "BURST I/O" 2840 .LOCAL 2850 * 2860 * Test burst i/o and do if possible 2870 * 2880 * burst i/o operates by reading or writing data sectors 2890 * directly into the user buffer instead of transferring 2900 * only one byte each time CIO is called 2910 * 2920 WTBUR LDA FCBFLG,X if not aquiring sectors then update and no burst 2930 BMI TBURST 2940 SEC indicate no burst 2950 RTS 2960 * 2970 RTBUR LDA #0 set read type 2980 * 2990 TBURST STA BURTYP set burst type 3000 LDA #1 assume no burst 3010 STA BURFLG flag stays 1 if no burst 3020 LDA ICCOMZ if cmd 3030 AND #2 is text mode 3040 BEQ NOBURST then no burst 3050 BNE BBINC otherwise, test buffer length 3060 * do burst i/o 3070 NXTBUR ASL BURFLG shift to indicate burst did occure 3080 LDA BURTYP get burst type 3090 BMI WRBUR minus, so write 3100 JSR RDNXTS otherwise, do sector read 3110 BCS NOBURST br if eof 3120 LDY #0 otherwise, move data etc. 3130 :LABT3 LDA (ZSBA),Y move data bytes 3140 STA (ICBALZ),Y to user buffer 3150 INY 3160 TYA 3170 CMP FCBMLN,X end of sector data bytes? 3180 BCC :LABT3 loop if less 3190 JSR INCBA incr user buff ptr by number of bytes moved 3200 JMP :LABT4 adjust buffer length and test for another try 3210 WRBUR JSR MVDAT move data for write 3220 JSR WRTNXS do sector write 3230 :LABT4 SEC 3240 LDA ICBLLZ dec user buffer len by 3250 SBC FCBMLN,X actual data len got or put 3260 STA ICBLLZ 3270 BCS BBINC 3280 DEC ICBLHZ 3290 * enough bytes for at least a full sector? 3300 BBINC LDA ICBLLZ if lo buff len >= $80 3310 BMI NXTBUR do burst 3320 LDA ICBLHZ if hi buff len > 0 3330 BNE NXTBUR do burst 3340 * no (more) burst 3350 NOBURST LSR BURFLG set carry if no burst at all 3360 RTS and rtn 3370 * move data for write 3380 MVDAT LDY #0 3390 :MV2 LDA (ICBALZ),Y move data bytes from user buffer 3400 STA (ZSBA),Y to sector buffer 3410 INY 3420 TYA 3430 CMP FCBMLN,X end of sector data bytes? 3440 BCC :MV2 loop if less 3450 STA FCBDLN,X save in current sector buff data len 3460 JMP INCBA incr buff ptr and rtn 3470 .PAGE "GET BYTE" 3480 * 3490 * DFMGET - get a file byte 3500 * 3510 DFMGET JSR SETUP go set up 3520 LDA FCBOTC,X if open for dir read 3530 AND #OPDIR 3540 BEQ GET1 3550 JMP GDCHAR then go to get next dir char & rtn 3560 GET1 LDA FCBDLN,X get data len 3570 CMP FCBMLN,X test empty sector 3580 BCC GET2 br if not empty 3590 JSR RTBUR do burst if possible 3600 JSR RDNXTS get next sector 3610 BCC GET1 br if not eof 3620 JMP PEOF else eof error 3630 GET2 TAY 3640 LDA (ZSBA),Y get data byte 3650 STA SVDBYT save the byte 3660 INY 3670 TYA 3680 STA FCBDLN,X and set new value 3690 LDY FCBLSN,X do eof look ahead 3700 BNE GET3 if lsn not zero 3710 LDY FCBLSN+1,X then 3720 BNE GET3 not eof 3730 CMP FCBMLN,X if lsn=0 then check for last byte 3740 BCC GET3 3750 LDA #3 if last byte then rts with impending eof code 3760 JMP RETURN 3770 GET3 JMP GREAT 3780 .PAGE "CLOSE" 3790 * 3800 * DFMCLS - close a file 3810 * 3820 DFMCLS JSR SETUP 3830 LDA FCBOTC,X get open code 3840 AND #OPOUT if not output 3850 BEQ CLDONE then done 3860 ROL FCBFLG,X if not acquiring sectors 3870 BCC CLUPDT then is update 3880 JSR WRTLSEC write last sector 3890 JSR RRDIR go get directory 3900 LDA FCBCNT+1,X get cnt of sectors 3910 PHA 3920 LDA FCBCNT,X 3930 PHA 3940 LDA FCBOTC,X get open code 3950 AND #OPAPND if not append 3960 BEQ CLOUT br 3970 LDA FCBSPR,X else stack file flag 3980 PHA 3990 JSR DFRDSU set up for read 4000 PLA restore file flag 4010 STA FCBSPR,X 4020 APP1 JSR RDNXTS read to eof 4030 BCC APP1 4040 LDA FCBSSN,X move start sector 4050 STA FCBLSN,X to eof link sector 4060 LDA FCBSSN+1,X 4070 STA FCBLSN+1,X 4080 JSR WRTN2 then write as not eof 4090 CLOUT LDY CDIRD get dir displ 4100 CLC update sector count 4110 PLA 4120 ADC FILDIR+DFDCNT,Y 4130 STA FILDIR+DFDCNT,Y 4140 PLA 4150 ADC FILDIR+DFDCNT+1,Y 4160 STA FILDIR+DFDCNT+1,Y 4170 LDA FCBSPR,X set entry to in use 4180 STA FILDIR+DFDFL1,Y 4190 JSR WRTDIR write dir 4200 JSR WRTVTOC write VTOC 4210 CLDONE LDA #0 clear open code 4220 STA FCBOTC,X 4230 JMP FGREAT 4240 * 4250 CLUPDT ROL FCBFLG,X if sector not modified 4260 BCC CLDONE then done 4270 JSR WRCSIO else write it 4280 JMP CLDONE then done 4290 .PAGE " " 4300 * 4310 * re-read dir record 4320 * 4330 RRDIR LDA FCBFNO,X get file number (in 6 leftmost bits) 4340 LSR A 4350 LSR A 4360 STA SFNUM 4370 JSR FNSHFT set accu = file no/8 4380 STA CDIRS to get dir sector 4390 JSR FNSHFT move low nibble of file number to high 4400 JSR FNSHF1 4410 ASL A 4420 STA CDIRD to get dir displ 4430 JMP RDDIR 4440 * 4450 FNSHFT LDA #0 4460 FNSHF1 LDY #3 shift 3 bits of file no into accu 4470 FNSHF2 ASL FCBFNO,X 4480 ROL A 4490 DEY 4500 BNE FNSHF2 4510 RTS 4520 .PAGE "DEVICE DEPENDENT COMMAND" 4530 .LOCAL 4540 * 4550 * DFMDDC -- device dependent cmd execution 4560 * 4570 DFMDDC JSR SETUP set up for execution 4580 LDA ICCOM,X get command 4590 CMP #254 is it format (try enhanced & single)? 4600 BEQ XFV br if 4610 CMP #253 other format (forced single/enh)? 4620 BEQ XFVS br if 4630 CMP #MAXDDC test range 4640 BCS DVDCER br out of range 4650 SEC 4660 SBC #$20 subtract base of cmds 4670 BCC DVDCER br out of range 4680 ASL A 4690 TAY 4700 LDA DVDCVT,Y 4710 PHA push execution addr 4720 LDA DVDCVT+1,Y 4730 PHA 4740 RTS execute 4750 * device dependent command vector table 4760 DVDCVT 4770 .DBYTE XRENAME-1 20-rename 4780 .DBYTE XDELETE-1 21-delete 4790 .DBYTE DVDCER-1 invalid cmd 4800 .DBYTE XLOCK-1 23-lock 4810 .DBYTE XUNLOCK-1 24-unlock 4820 .DBYTE XPOINT-1 25-point 4830 .DBYTE XNOTE-1 26-note 4840 MAXDDC = $27 max DVDC+1 4850 DVDCER JMP GOERD error 4860 .PAGE "FORMAT" 4870 * 4880 * format a diskette 4890 * 4900 * table contains: length of VTOC, type code, 4910 * total # of sectors, # of sectors mapped in sector $168 4920 * 4930 :TABLE .BYTE $64,$02 single 4940 .WORD $02C3,$02C3 (707) 4950 .BYTE $8A,$02 enhanced 4960 .WORD $03F2,$02C3 (1010/707) 4970 .BYTE $4A,$02 ramdisk 4980 .WORD $01F3,$01F3 (499) 4990 * format in a forced mode 5000 XFVS LDA ICAUX1,X get aux as cmd 5010 BNE :LBL1 5020 LDA #DCBCFS format single if aux = 0 5030 :LBL1 LDX #0 indicate format mode = forced 5040 BEQ :LBL2 (always) 5050 * format, try enhanced but if impossible, do single 5060 XFV LDA #DCBCFE format enhanced 5070 TAX indicate 'try it' mode 5080 :LBL2 STX TEMP1 save format mode (0 = forced sd/md) 5090 :LBL2A STA DCBCMD command to DCB 5100 LDA ICDNOZ get drive # 5110 LDX #12 offset in table, assume ramdisk 5120 CMP #8 5130 BEQ XF1 skip physical formating if D8: 5140 * do physical formating 5150 LDA ZDRVA+1 move VTOC buf adr 5160 STA DCBBUF+1 to DCB 5170 LDA ZDRVA 5180 STA DCBBUF 5190 LDY #$40 tell SIO receiving data 5200 LDA DSKTIM get format time out value 5210 JSR DSIO2 goto local disk handler, then SIO 5220 BPL XF0 if no errors cont 5230 * act upon error 5240 CPY #$8B device NAK? 5250 BNE :LBL4 5260 LDX TEMP1 recall format mode 5270 BEQ XFERR error if forced mode 5280 LDA #DCBCFS otherwise set cmd to format single 5290 CMP DCBCMD actual cmd already single? 5300 BNE :LBL2A no, have another try 5310 XFERR JMP RETURN do error exit 5320 :LBL4 CPY #$90 ck for device done error 5330 BNE XFERR no, then error exit 5340 LDY #0 else ck for bad sector info 5350 LDA #$FF returned by controller 5360 CMP (ZDRVA),Y 5370 BNE XFBAD bad sectors ret err msg 5380 INY 5390 CMP (ZDRVA),Y 5400 BEQ XFERR not bad sec err, req err exit 5410 XFBAD JSR ERROR return with error #173 5420 .BYTE $AD (bad format) 5430 * recall density, set X as offset in table 5440 XF0 LDX #0 assume single 5450 LDA DCBCMD ck cmd 5460 CMP #DCBCFS 5470 BEQ XF1 br if is 5480 LDX #6 if not, must be enhanced 5490 * do logical formating 5500 XF1 LDA #0 zero VTOC buffer 5510 LDY #$8F 144 bytes long 5520 XF2 STA (ZDRVA),Y 5530 DEY 5540 BNE XF2 5550 LDA :TABLE,X move length of VTOC 5560 STA DRVTYP 5570 XF3 INX 5580 LDA :TABLE,X move entries 5590 STA (ZDRVA),Y to VTOC buffer 5600 INY 5610 CPY #5 5620 BNE XF3 5630 * write VTOC sector(s) 5640 LDY #DVDSMP get start of bit map 5650 LDA #$0F deallocate 1st 4 sectors for boot 5660 XF4 STA (ZDRVA),Y 5670 LDA #$FF set sector map to all ones 5680 INY 5690 CPY DRVTYP ck for end of VTOC 5700 BNE XF4 5710 LDY #DVDSMP+45 deallocate middle 9 5720 LDA #0 5730 STA (ZDRVA),Y for VTOC and file dir 5740 INY 5750 LDA #$7F 5760 STA (ZDRVA),Y 5770 LDX DRVTYP more to do? 5780 BPL XF5 br if not enhanced 5790 LDY #DVDSMP+90 deallocate sector 720 5800 STA (ZDRVA),Y 5810 LDY #DVDESA get end of VTOC for enh sector count 5820 LDA # <$012F tell 303 more sectors available 5830 STA (ZDRVA),Y 5840 INY 5850 LDA # >$012F 5860 STA (ZDRVA),Y 5870 XF5 JSR WRTVTOC write the VTOC 5880 * write empty directory sectors 5890 LDA #0 zero filler dir sectors 5900 TAY 5910 XF6 STA FILDIR,Y use file dir buffer 5920 INY 5930 BPL XF6 5940 LDA #7 write to all 8 dir sectors 5950 STA CDIRS 5960 XF7 JSR WRTDIR write the file dir 5970 DEC CDIRS 5980 BPL XF7 5990 JSR DELDOS set no DOS 6000 JMP FGREAT done