1001     .PAGE "--- Copyright and Author Notice ---"
1002 ;-------------------------------------------------------------------------
1003 ;COPYRIGHT (C) 1978,1979,1980,1982
1004 ;OPTIMIZED SYSTEMS SOFTWARE,              
1005 ;CUPERTINO, CA.                           
1006 ;                                         
1007 ;THIS PROGRAM MAY NOT BE REPRODUCED,
1008 ;STORED IN A RETRIEVAL SYSTEM, OR         
1009 ;TRANSMITTED IN WHOLE OR IN PART,         
1010 ;IN ANY FORM, OR BY ANY MEANS, BE IT      
1011 ;ELECTRONIC, MECHANICAL, PHOTOCOPYING,    
1012 ;RECORDING, OR OTHERWISE WITHOUT THE      
1013 ;PRIOR WRITTEN PERMISSION OF:             
1014 ;                                         
1015 ;  OPTIMIZED SYSTEMS SOFTWARE, INC.       
1016 ;  10379 LANSDALE AVENUE                  
1017 ;  CUPERTINO, CALIFORNIA 95014 (U.S.A.)   
1018 ;  PHONE: (408) 446-3099
1019 ;
1020 ;-------------------------------------------------------------------------
1021 ;PROGRAMMER: PAUL LAUGHTON                                                 
1023 ;UPDATED:    19-AUG-80                                                     
1024 ;------------------------------------------------------------------------- 
1025 ;SCANNED:    MR.ATARI   JAN-2004                                           
1026 ;------------------------------------------------------------------------- 
1027 ;EDITED:     UNIXCOFFEE 16-JUN-2011 (PRETTY PRINTED & FIXED ALL COMMENTS)
1028 ;-------------------------------------------------------------------------
1029     .PAGE "SYSTEM EQUATES"
1030 ;=========================================================================
1031 ;SYSTEM EQUATES
1032 ;=========================================================================
1033 ;
1034 FMSORG = $0700
1035 FMSZPG = $43
1036 IOCBORG = $0340
1037 LMASK = 3                     ;LINK MASK
1038 DCBORG = $0300
1039 DHADR = $E453
1040 EOL =   $9B
1041 DEVTAB = $031A
1042 ZICB =  $20
1043 LMADR = $02E7
1044 DUPINIT = $1540               ;INIT ADDR FOR DUP
1045 STAK =  $0102                 ;STACK LOC FOR PUT BYTE
1046 OSBTM = $DF                   ;HI BYTE OF ADDR LESS THAN OS SPACE
1047 DSKTIM = $0246                ;ADDR OF OS WORST CASE DISK TIME OUT
1048 TIMOUT = 15                   ;TIME OUT VALUE OF 15 SECS.
1049     .PAGE "IOCB"
1050     *=  IOCBORG
1051 ;=========================================================================
1052 ;IOCB - I/O CONTROL BLOCK
1053 ;=========================================================================
1054 ;THERE ARE 8 I/O CONTROL BLOCKS 1 IOCB IS REQUIRED FOR EACH CURRENTLY OPEN
1055 ;DEVICE OR FILE
1056 ;-------------------------------------------------------------------------
1057 IOCB
1058 ICHID *= *+1                  ;DEVICE NUMBER
1059 ICDNO *= *+1                  ;DEVICE HANDLER
1060 ICCOM *= *+1                  ;I/O COMMAND
1061 ICSTA *= *+1                  ;I/O STATUS
1062 ICBAL *= *+1
1063 ICBAH *= *+1                  ;BUFFER ADR (H,L)
1064 ICPUT *= *+2                  ;PUT CHAR DH ADDR
1065 ICBLL *= *+1
1066 ICBLH *= *+1                  ;BUFFER LEN (H,L)
1067 ICAUX1 *= *+1                 ;AUX 1
1068 ICAUX2 *= *+1                 ;AUX 2
1069 ICAUX3 *= *+1                 ;AUX 3
1070 ICAUX4 *= *+1                 ;AUX 4
1071 ICAUX5 *= *+1                 ;AUX 5
1072 ICAUX6 *= *+1                 ;AUX 6
1073 ICLEN = *-IOCB
1074 ;-------------------------------------------------------------------------
1075     *=  *+ICLEN*7             ;SPACE FOR 7 MORE IOCB'S
1076 ;=========================================================================
1077 ;ICCOM VALUE EQUATES
1078 ;=========================================================================
1079 ICOIN = $01                   ;OPEN INPUT
1080 ICOOUT = $02                  ;OPEN OUTPUT
1081 ICIO =  $03                   ;OPEN IN/OUT
1082 ICGBR = $04                   ;GET BINARY RECORD
1083 ICGTR = $05                   ;GET TEXT RECORD
1084 ICGBC = $06                   ;GET BINARY CHAR
1085 ICGTC = $07                   ;GET TEXT CHAR
1086 ICPBR = $08                   ;GET BINARY RECORD
1087 ICPTR = $09                   ;PUT TEXT RECORD
1088 ICPBC = $0A                   ;PUT BINARY CHAR
1089 ICPTC = $0B                   ;PUT TEXT CHAR
1090 ICCLOSE = $0C                 ;CLOSE FILE
1091 ICSTAT = $0D                  ;GET STATUS
1092 ICDDC = $0E                   ;DEVICE DEPENDENT
1093 ICMAX = $0E                   ;MAX VALUE
1094 ICFREE = $0F                  ;IOCB FREE INDICATOR
1095 ;=========================================================================
1096 ;ICSTA VALUE EQUATES
1097 ;=========================================================================
1098 ICSOK = $01                   ;STATUS GOOD, NO ERRORS
1099 ICSTR = $02                   ;TRUNCATATED RECORD
1100 ICSEOF = $03                  ;END OF FILE
1101 ICSBRK = $80                  ;BREAK KEY ABORT
1102 ICSDNR = $81                  ;DEVICE NOT READY
1103 ICSNED = $82                  ;NON-EXISTENT DEVICE
1104 ICSDER = $83                  ;DATA ERROR
1105 ICSIVC = $84                  ;INVALID COMMAND
1106 ICSNOP = $85                  ;DEVICE/FILE NOT OPEN
1107 ICSIVN = $86                  ;INVALID IOCB #
1108 ICSWPC = $87                  ;WRITE PROTECT
1109 ;-------------------------------------------------------------------------
1110 ;ZERO PAGE IOCB LABELS
1111 ;-------------------------------------------------------------------------
1112 ICDNOZ = ICDNO-IOCB+ZICB
1113 ICBLLZ = ICBLL-IOCB+ZICB      ;BUF LEN
1114 ICBLHZ = ICBLH-IOCB+ZICB
1115 ICBALZ = ICBAL-IOCB+ZICB      ;BUF ADDR
1116 ICBAHZ = ICBAH-IOCB+ZICB
1117 ICCOMZ = ICCOM-IOCB+ZICB
1118 ICPUTZ = ICPUT-IOCB+ZICB      ;PUT RTN ADDR
1119     .PAGE " DCB"
1120     *=  DCBORG
1121 ;=========================================================================
1122 ;DCB - DATA CONTROL BLOCK
1123 ;=========================================================================
1124 ;THE DCB IS AN IOCB LIKE CONTROL BLOCK 
1125 ;USED TO INTERFACE THE DISK FILE MANAGEMENT
1126 ;SYSTEM TO THE DISK HANDLER
1127 ;-------------------------------------------------------------------------
1128 DCB
1129 DCBSBI *= *+1                 ;SERIAL BUS ID
1130 DCBDRV *= *+1                 ;DISK DRIVE #
1131 DCBCMD *= *+1                 ;COMMAND
1132 DCBSTA *= *+1                 ;I/O STATUS
1133 DCBBUF *= *+2                 ;I/O BUFFER ADDR (H,L)
1134 DCBTO *= *+2                  ;TIME OUT COUNT
1135 DCBCNT *= *+2                 ;I/O BYTE COUNT
1136 DCBSEC *= *+2                 ;I/O SECTOR NUMBER
1137 ;-------------------------------------------------------------------------
1138 ;DCBCMD VALUE EQUATES
1139 ;-------------------------------------------------------------------------
1140 DCBCRS = 'R                   ;READ SECTOR ($52)
1141 DCBCWS = 'P                   ;PUT  SECTOR ($50)
1142 DCBCST = 'S                   ;STATUS REQUEST  ($53)
1143 DCBCFD = '!                   ;FORMAT DISKETTE ($21)
1144 ;-------------------------------------------------------------------------
1145 ;*** SPECIAL NOTE:
1146 ;-------------------------------------------------------------------------
1147 ;DCBCWS may be changed to 'W ($57)
1148 ;if desired to have disk perform      
1149 ;a verifying read after each write.   
1150 ;Disk write ('W) operations will take 
1151 ;longer, but will be more reliable.
1152 ;-------------------------------------------------------------------------
1153 ;DCBSTA VALUE EQUATES
1154 ;-------------------------------------------------------------------------
1155 DCBSOK = $01                  ;STATUS NORMAL
1156 DCBDNR = $81                  ;DEVICE NOT READY
1157 DCBCNR = $82                  ;CONTROLLER NOT READY
1158 DCBDER = $83                  ;DATA ERROR
1159 DCBIVC = $84                  ;INVALID COMMAND
1160 DCBWPR = $87                  ;WRITE PROTECT
1161     .PAGE " ZERO PAGE"
1162     *=  FMSZPG
1163 ;-------------------------------------------------------------------------
1164 ZBUFP *= *+2                  ;BUFFER PTR
1165 ZDRVA *= *+2                  ;ZERO PG DRIVE PTR
1166 ZSBA *= *+2                   ;ZERO PG SECTOR BUF PTR
1167 ERRNO *= *+1                  ;ERROR NUMBER
1168 ;
1169 ;-------------------------------------------------------------------------
2000     .PAGE "BOOT RECORD"
2001     *=  FMSORG
2002 ;=========================================================================
2003 ;BOOT RECORD - THE FOLLOWING BYTES ARE STORED ON DISK SECTOR 0
2004 ;=========================================================================
2005 ;THEY COMPRISE THE BOOT LOAD RECORD
2006 ;-------------------------------------------------------------------------
2007 BFLG .BYTE 0                  ;BOOT FLAG UNUSED=0
2008 BRCNT .BYTE 3                 ;NO.CONSECTIVE BOOT RECORDS TO READ
2009 BLDADR .WORD FMSORG           ;BOOT LOAD ADDR
2010 BINTADR .WORD DUPINIT         ;INIT ADDR
2011 BCONT JMP XBCONT              ;BOOT READ CONT PT
2012 ;-------------------------------------------------------------------------
2013 ;THE FOLLOWING BYTES ARE SET BY 
2014 ;THE CONSOLE PROCESSOR. THEY ARE
2015 ;ACTED UPON DURING FMS INIT ONLY.
2016 ;THEY ARE PART OF THE BOOT RECORD
2017 ;THUS DEFINING THE DEFAULT
2018 ;INITIALIZATION PARMS
2019 ;-------------------------------------------------------------------------
2020 SABYTE .BYTE 3                ;MAX # CONCURRENT OPEN FILES
2021 DRVBYT .BYTE 1                ;DRIVE BITS
2022 SAFBFW .BYTE 0                ;STORAGE ALLOCATION DIR SW
2023 SASA .WORD ENDFMS             ;STORAGE ALLOCATION START ADDR 
2024 ;-------------------------------------------------------------------------
2025 ;THE FOLLOWING CODE READS THE FMS
2026 ;AND CONSOLE PROCESSOR (DOS) FROM
2027 ;THE DOS.SYS FILE
2028 ;-------------------------------------------------------------------------
2029 DFSFLG .BYTE 0  ;DOS FLAG
2030 ;-------------------------------------------------------------------------
2031 ;00 NO DOS FILE
2032 ;01 128 BYTE SECTOR DISK 
2033 ;02 256 BYTE SECTOR DISK
2034 ;-------------------------------------------------------------------------
2035 DFLINK .BYTE 0,0              ;DOS FILE START SECTOR NUMBER
2036 BLDISP .BYTE 125              ;DISPL TO SECTOR LINK
2037 DFLADR .WORD DFMSDH           ;ADDR START OF DOS.SYS FILE
2038 ;-------------------------------------------------------------------------
2039 XBCONT
2040     LDY DFSFLG                ;GET DOS FLAG
2041     BEQ BFAIL                 ;BR IF NO DOS.SYS FILE
2042 ;-------------------------------------------------------------------------
2043     LDA DFLADR                ;MOVE LOAD START ADDR
2044     STA ZBUFP                 ;TO ZERO PAGE PTR
2045     STA DCBBUF                ;AND TO DCB
2046     LDA DFLADR+1
2047     STA ZBUFP+1
2048     STA DCBBUF+1
2049 ;
2050 ;-------------------------------------------------------------------------
2051     LDA DFLINK+1              ;GET 1ST SECTOR #
2052     LDY DFLINK
2053 XBC1 CLC 
2054     LDX DFSFLG                ;LOAD DISK TYPE CODE
2055     JSR BSIO                  ;GO READ BOOT SECTOR
2056     BMI BFAIL
2057 ;-------------------------------------------------------------------------
2058     LDY BLDISP                ;POINT TO LINK
2059     LDA (ZBUFP),Y             ;GET LINK HI
2060     AND #LMASK                ;MASK TO LINK BITS
2061     PHA 
2062     INY 
2063     ORA (ZBUFP),Y
2064     BEQ BGOOD
2065     LDA (ZBUFP),Y             ;GET LINK LOW
2066     TAY 
2067     JSR INCBA                 ;GO INCREMENT BUF ADR
2068 ;-------------------------------------------------------------------------
2069     PLA                       ;RESTORE LINK HI
2070     JMP XBC1                  ;GO READ NEXT SECTOR
2071 ;-------------------------------------------------------------------------
2072 BFAIL LDA #$C0                ;SET FOR CARRY SET
2073     BNE XBRTN                 ;ANY P,Y = $80
2074 ;-------------------------------------------------------------------------
2075 BGOOD PLA                     ;SET FOR CARRY CLEAR
2076 ;-------------------------------------------------------------------------
2077 XBRTN ASL A
2078     TAY 
2079     RTS 
2080 ;-------------------------------------------------------------------------
2081 INCBA CLC 
2082     LDA ZBUFP                 ;INC BUFFER PTR
2083     ADC BLDISP                ;BY DATA LINK (125)
2084     STA DCBBUF
2085     STA ZBUFP
2086     LDA ZBUFP+1
2087     ADC #0
2088     STA DCBBUF+1
2089     STA ZBUFP+1
2090     RTS 
2091 ;-------------------------------------------------------------------------
2092     .PAGE "SECTOR I/O"
2093 ;=========================================================================
2094 ;BSIO - DO SECTOR I/O
2095 ;-------------------------------------------------------------------------
2096 BSIO =  *
2097 ;-------------------------------------------------------------------------
2098     STA DCBSEC+1              ;SET SECTOR HI
2099     STY DCBSEC                ;SECTOR LO
2100 ;-------------------------------------------------------------------------
2101 BSIOR LDA #DCBCRS             ;ASSUME READ SECTOR
2102     LDY #$40                  ;AND GET DATA
2103     BCC DSIO1                 ;BR IF READ
2104 ;-------------------------------------------------------------------------
2105     LDA #DCBCWS               ;ELSE LOAD WRITE SECTOR
2106     LDY #$80                  ;AND PUT DATA
2107 ;-------------------------------------------------------------------------
2108 DSIO1
2109     STA DCBCMD                ;SET COMMAND
2110     STY DCBSTA                ;AND SIO CMD
2111 ;
2112     LDA #$31                  ;DISK SERIAL BUS ID
2113     LDY #TIMOUT               ;TIMEOUT DEFAULT LOADED
2114 ;-------------------------------------------------------------------------
2115 DSIO2
2116     STA DCBSBI                ;SET ID
2117     STY DCBTO                 ;SET TIME OUT
2118 ;.........................................................................
2119     LDA #3                    ;SET RETRY COUNT
2120     STA RETRY
2121 ;.........................................................................
2122     LDA #0                    ;ASSUME 128 BYTE
2123     LDY #$80                  ;SECTOR DISK
2124     DEX 
2125     BEQ DSIO3                 ;SO BR
2126 ;.........................................................................
2127     LDA #1                    ;ELSE IS 256
2128     LDY #0
2129 ;-------------------------------------------------------------------------
2130 DSIO3 STA DCBCNT+1            ;SET I/O BYTE CNT
2131     STY DCBCNT
2132 ;-------------------------------------------------------------------------
2133 DSIO4
2134     JSR $E459                 ;CALL SERIAL I/O
2135     BPL DSIO5                 ;IF GOOD I/O THEN RTS
2136 ;.........................................................................
2137     DEC RETRY                 ;TST IF ANOTHER RETRY AVAIL
2138     BMI DSIO5                 ;NO THEN RTS WITH ERROR
2139 ;.........................................................................
2140     LDX #$40                  ;DO RETRY-RESET TYPE ACTION
2141     LDA #DCBCRS               ;ASSUME READ-CK IF IS
2142     CMP DCBCMD                ;IF COMMAND GET SECTOR
2143     BEQ STRTYP                ;YES THEN STORE GETSECTOR IN 0
2144     LDA #DCBCFD               ;TEST IF FORMAT CMD
2145     CMP DCBCMD                ;IT ALSO RECIEVES DATA
2146     BEQ STRTYP                ;YES THEN SET AS GET DATA
2147     LDX #$80                  ;ELSE STORE PUTSECTOR
2148 STRTYP STX DCBSTA
2149 ;-------------------------------------------------------------------------
2150     JMP DSIO4                 ;RETRY THE I/O
2151 ;-------------------------------------------------------------------------
2152 DSIO5 LDX CURFCB              ;RELOAD CURRENT FCB
2153     LDA DCBSTA                ;AND I/O STATUS SET FLAGS 
2154     RTS 
2155 ;-------------------------------------------------------------------------
2156     .PAGE "FILE MANGER ENTRY POINT"
2157 ;=========================================================================
2158 ;DFMSDH - DISK FILE MANAGEMENT DISK
2159 ;HANDLER ENTRY POINT
2160 ;=========================================================================
2161 DFMSDH
2162     .WORD DFMOPN-1            ;OPEN FILE
2163     .WORD DFMCLS-1            ;CLOSE FILE
2164     .WORD DFMGET-1            ;GET FILE
2165     .WORD DFMPUT-1            ;PUT BYTE
2166     .WORD DFMSTA-1            ;STATUS
2167     .WORD DFMDDC-1            ;DEVICE DEPENDENT CMD
2168 ;=========================================================================
2169 ;INITIALIZATION CODE
2170 ;=========================================================================
2171 ;GIVE ROOM FOR BOOT EXPANSION !!!
2172 ;-------------------------------------------------------------------------
2173     *=  $07E0
2174 DINIT = *
2175 ;=========================================================================
2176 ;SET UP DRIVE INFO
2177 ;=========================================================================
2178 ;DRVTBL - 8 BYTES-ONE FOR EACH POSSIBLE DRIVE 
2179 ;-------------------------------------------------------------------------
2180 ;0 = NO DRIVE
2181 ;1 = 128 BYTE SECTOR DRIVE 
2182 ;2 = 256 BYTE SECTOR DRIVE
2183 ;-------------------------------------------------------------------------
2184 ;DBUFA(L,H) 8 TWO BYTE ENTRYS THE
2185 ;DRIVE (VTOC) BUFFER ADR FOR A DRIVE
2186 ;-------------------------------------------------------------------------
2187     LDA SASA                  ;MOVE START OF ALLOC
2188     STA ZBUFP                 ;AREA TO ZBUFP
2189     LDA SASA+1
2190     STA ZBUFP+1
2191 ;.........................................................................
2192     LDA DRVBYT                ;TEMP 1 IS DRIVE
2193     STA TEMP1                 ;EXCESS BITS FROM BOOT
2194 ;.........................................................................
2195     LDX #7                    ;TEMP 2 IS
2196 ;-------------------------------------------------------------------------
2197 DIA STX TEMP2                 ;DR # MINUS 1
2198     ASL TEMP1                 ;SHIFT DR BIT TO CARRY
2199     BCS DIHAVE                ;BR IF DR EXISTS
2200 ;.........................................................................
2201     LDA #0                    ;DRVTBL,X ;SET NO DRIVE
2202     STA DRVTBL,X
2203     STA DBUFAL,X
2204     STA DBUFAH,X
2205     BEQ DIDDEC                ;GO DEC DRIVE #
2206 ;-------------------------------------------------------------------------
2207 DIHAVE
2208     LDY #DVDWRQ               ;SET WRITE READ OFF
2209     LDA #0
2210     STA (ZBUFP),Y             ;IN THE DRIVE BUFFER
2211 ;.........................................................................
2212     INX                       ;PUT DR # IN DCB
2213     STX DCBDRV
2214     LDA #DCBCST               ;GET DRIVE STATUS
2215     STA DCBCMD
2216     JSR DHADR
2217 ;.........................................................................
2218     LDY #2                    ;ASSUME 256 BYTE DRIVE
2219     LDA $02EA                 ;GET STATUS BYTE
2220     AND #$20
2221     BNE DI256                 ;BR IF 256
2222     DEY
2223 ;-------------------------------------------------------------------------
2224 DI256 TYA 
2225     LDX TEMP2                 ;SET DR TYPE INTO
2226     STA DRVTBL,X              ;TBL AT DRIVE DISPL
2227     LDA ZBUFP                 ;MOVE CURRENT ALLOC
2228     STA DBUFAL,X              ;ADDR TO DBUFA
2229     LDA ZBUFP+1               ;AND INC ALLOC
2230     STA DBUFAH,X              ;BY 128 BYTES
2231     JSR DINCBP                ;VIA DINCBP
2232 ;.........................................................................
2233     DEY                       ;IF DR WAS A
2234     BEQ DIDDEC                ;128 BYTES THEN DONE
2235 ;-------------------------------------------------------------------------
2236     JSR DINCBP                ;ELSE INC PTR BY 128
2237 ;-------------------------------------------------------------------------
2238 DIDDEC DEX                    ;DEC DRIVE
2239     BPL DIA                   ;BR IF MORE TO TEST
2240 ;=========================================================================
2241 ;SET UP SECTOR ALLOCATION TABLE
2242 ;=========================================================================
2243 ;THE SECTOR ALLOCATION TABLE (SECTBL)
2244 ;WAS 16 ONE BYTE ENTRIES ONE FOR
2245 ;EACH POSSIBLE 128 BYTE BUFFER SABYTE
2246 ;IN THE BOOT RECORD DETERMINES THE
2247 ;NUMBER OF ENTRYS TO ALLOCATE
2248 ;NON-ALLOCATED BYTE ARE MINUS
2249 ;-------------------------------------------------------------------------
2250 ;SABUF(L,H) CONTAINS THE ADDR OF THE SECTOR BUFFER
2251 ;
2252     LDY SABYTE                ;GET AND SAVE COUNT
2253     LDX #0
2254 ;-------------------------------------------------------------------------
2255 DINXTS LDA #0                 ;ASSUME ALLOCATE
2256     DEY                       ;DEC COUNT OF ALLOCATED
2257     BPL DISETS                ;IF PLUS STILL ALLOCATE
2258     TYA                       ;ELSE DE-ALLOCATE
2259 ;-------------------------------------------------------------------------
2260 DISETS STA SECTBL,X           ;SET ALLOCATE BYTE
2261     TYA                       ;IF NO ALLOCATED
2262     BMI DISNI                 ;THEN DON'T ALLOCATE BUF
2263 ;.........................................................................
2264     LDA ZBUFP                 ;MOVE BUFFER ADDR
2265     STA SABUFL,X              ;TO SECTOR BUF PTR
2266     LDA ZBUFP+1
2267     STA SABUFH,X
2268     JSR DINCBP                ;INC SECTOR ADDR
2269 ;-------------------------------------------------------------------------
2270 DISNI INX                     ;INC BUF #
2271     CPX #16                   ;IF NOT ALL 16
2272     BNE DINXTS                ;DO AGAIN
2273 ;-------------------------------------------------------------------------
2274 ;SET LOW MEM
2275 ;-------------------------------------------------------------------------
2276     LDA ZBUFP                 ;MOVE FINAL ADDR
2277     STA LMADR                 ;TO LOW MEM PTR
2278     LDA ZBUFP+1
2279     STA LMADR+1
2280 ;-------------------------------------------------------------------------
2281     JMP CLRFCB                ;CONT INIT
2282 ;=========================================================================
2283 ;DINCBP - INC ZBUFP BY 128
2284 ;=========================================================================
2285 DINCBP CLC 
2286     LDA ZBUFP
2287     ADC #128
2288     STA ZBUFP
2289     LDA ZBUFP+1
2290     ADC #0
2291     STA ZBUFP+1
2292     RTS 
2293 ;=========================================================================
2294 ;CLEAR FCBS TO ZERO
2295 ;=========================================================================
2296 CLRFCB = *
2297     LDY #$7F                  ;128 OF FCB
2298     LDA #0
2299 CFCBX STA FCB,Y               ;TO BE CLEARED
2300     DEY 
2301     BNE CFCBX
2302 ;-------------------------------------------------------------------------
2303     .PAGE 
2304 ;-------------------------------------------------------------------------
2305     LDY #0
2306 ADI1 LDA DEVTAB,Y             ;FIND AH
2307     BEQ ADI2                  ;UNUSED
2308     CMP #'D                   ;OR DISK
2309     BEQ ADI2                  ;EMPTY
2310     INY 
2311     INY 
2312     INY 
2313     CPY #30
2314     BNE ADI1
2315     BRK                       ;ELSE BREAK
2316 ;-------------------------------------------------------------------------
2317 ADI2 LDA #'D                  ;SET DISK
2318     STA DEVTAB,Y
2319     LDA #DFMSDH&255           ;SET FMS ADDR
2320     STA DEVTAB+1,Y
2321     LDA #DFMSDH/256
2322     STA DEVTAB+2,Y
2323 ;-------------------------------------------------------------------------
2324     RTS 
2325     .PAGE "OPEN"
2326 ;=========================================================================
2327 ;DFMOPN - FILE OPEN EXECUTION ENTRY PT
2328 ;=========================================================================
2329 DFMOPN
2330     JSR SETUP                 ;DO FCB SET UP
2331     JSR FNDCODE               ;GO DECODE FILE NAME
2332     LDA ICAUX1,X              ;GET AUX1 (OPEN TYPE CODES)
2333     STA FCBOTC,X              ;PUT INTO FCB
2334     AND #OPDIR                ;IS THIS LIST DIRECTORY
2335     BEQ OPN1                  ;BR IF NOT
2336     JMP LISTDIR               ;GOTO DIR LIST CODE
2337 ;-------------------------------------------------------------------------
2338 OPN1 JSR SFDIR                ;GO SEARCH FILE DIR
2339     PHP 
2340 ;-------------------------------------------------------------------------
2341     LDA FCBOTC,X              ;GET OPEN TYPE CODE
2342     CMP #OPIN                 ;INPUT
2343     BEQ DFOIN
2344     CMP #OPOUT                ;OUTPUT
2345     BEQ DFOOUT
2346     CMP #OPIN+OPOUT           ;UPDATE
2347     BEQ DFOUPD
2348     CMP #OPOUT+OPAPND         ;APPEND
2349     BEQ DFOAPN
2350     JMP ERDVDC                ;ERROR
2351 ;=========================================================================
2352 ;DFOIN - OPEN FOR INPUT
2353 ;=========================================================================
2354 DFOIN = *
2355     PLP                       ;GET SEARCH FLAG
2356     BCS OPNER1                ;ERROR IF NOT FOUND
2357     BCC DFOUI
2358 ;=========================================================================
2359 ;DFOUPD - OPEN FOR UPDATA
2360 ;=========================================================================
2361 DFOUPD = *
2362     PLP                       ;GET SEARCH FLAG
2363     BCS OPNER1                ;BR NOT FOUND
2364     JSR TSTLOCK               ;TEST LOCK
2365 ;-------------------------------------------------------------------------
2366 DFOUI = *
2367     JSR DFRDSU                ;SET UP FOR READ
2368     JMP GREAT                 ;DONE
2369 ;-------------------------------------------------------------------------V
2370 OPNER1 JMP ERFNF              ;FILE NOT FOUND
2371     .PAGE 
2372 ;=========================================================================
2373 ;DFOAPN - OPEN APPEND
2374 ;=========================================================================
2375 DFOAPN = *
2376     PLP                       ;GET READ STATUS
2377     BCS OPNER1                ;BR NOT FOUND
2378     LDY CDIRD                 ;IF OLD.
2379     LDA FILDIR+DFDFL1,Y       ;FILE TYPE
2380     AND #DFDNLD               ;THEN
2381     BEQ APOER                 ;ERROR
2382     JSR TSTLOCK               ;TEST LOCKED
2383     JSR OPVTOC                ;READ VTOC
2384     JSR GETSECTOR             ;GET A SECTOR
2385     STA FCBSSN+1,X            ;MOVE START SECTOR #
2386     LDA FCBLSN,X              ;TO START SECTOR #
2387     STA FCBSSN,X
2388     JMP DHFOX2                ;CONTINUE AS OPEN
2389 APOER JMP ERAPO
2390 ;=========================================================================
2391 ;DFOOUT - OPEN FOR OUTPUT
2392 ;=========================================================================
2393 DFOOUT = *
2394     PLP                       ;GET SEARCH FLAG
2395     BCS DFOX1
2396 ;.........................................................................
2397     JSR XDEL0                 ;DELETE THE FILE OR FILES
2398     LDY CDIRD
2399     JMP OPN1A
2400 ;-------------------------------------------------------------------------
2401 DFOX1 = *
2402     LDA DHOLES                ;WAS THERE A HOLE
2403     BMI OPNER2                ;BR IF NO HOLE
2404     STA CDIRS                 ;SAVE HOLE SECTOR AS CURRENT DIR SEC
2405     JSR RDDIR                 ;GO READ CURRENT DIR SECTOR
2406     LDA DHOLED                ;MOVE HOLE DISPL TO
2407     STA CDIRD                 ;CUR DIR DISPL
2408     LDA DHFNUM                ;MOVE HOLE FN
2409     STA SFNUM                 ;TO CURRENT
2410     JSR OPVTOC
2411     LDY CDIRD
2412     LDX #10
2413     LDA #$20
2414 OPN1B STA FILDIR+DFDPFN,Y     ;BLANK FILL FILE ENTRY FOR FILE NAME
2415     INY 
2416     DEX 
2417     BPL OPN1B
2418     LDX CURFCB
2419 ;-------------------------------------------------------------------------
2420 OPN1A = *
2421     JSR GETSECTOR             ;GET A SECTOR
2422     LDY CDIRD                 ;GET DIR DISPL
2423     STA FILDIR+DFDSSN+1,Y     ;PUT SECTOR INTO DIR REC
2424     LDA FCBLSN,X
2425     STA FILDIR+DFDSSN,Y
2426 ;.........................................................................
2427     LDA #DFDINU+DFDOUT+DFDNLD ;SET DIR ENTRY IN USE 
2428     STA FILDIR+DFDFL1,Y
2429     LDA #0                    ;SET NOT LOCKED
2430     STA FILDIR+DFDCNT+1,Y     ;SET COUNT = 0
2431     STA FILDIR+DFDCNT,Y
2432 ;-------------------------------------------------------------------------
2433     LDX #0
2434 OPN2 LDA FNAME,X              ;MOVE FILE NAME
2435     CMP #'?                   ;IF WILD CARD
2436     BEQ OPN2A                 ;CHANGE TO BLANK
2437     STA FILDIR+DFDPFN,Y       ;TO DIRECTORY
2438 OPN2A = *
2439     INY 
2440     INX 
2441     CPX #11
2442     BCC OPN2
2443 ;-------------------------------------------------------------------------
2444     LDX CURFCB                ;RESTORE X REG
2445     JSR WRTDIR                ;GO WRITE DIRECTORY
2446 DHFOX2 = *
2447     JSR SETFCB
2448     JSR WRTN6                 ;FIX UP AS IF WRITE
2449 OPN3 LDA #FCBFAS              ;SET NEW FILE
2450     STA FCBFLG,X
2451     JSR TSTDOS                ;IF NOT DOS
2452     BNE DHFOX3                ;BR
2453     JMP WRTDOS                ;ELSE DO IT
2454 DHFOX3 = *
2455     JMP GREAT
2456 ;-------------------------------------------------------------------------
2457 OPNER2 JSR ERDFULL            ;DIRECTORY FULL
2458 ;
2459 ;-------------------------------------------------------------------------
2460 SETFCB = *
2461     LDA #0                    ;CLEAR
2462     STA FCBFLG,X ;FLAG
2463 OPNF1 LDA SFNUM               ;MOVE FILE NUM TO FCB
2464     ASL A
2465     ASL A
2466     STA FCBFNO,X
2467     LDA #0
2468     STA FCBDLN,X              ;DATA LENGTH
2469     STA FCBCNT,X              ;SET CNT = 0
2470     STA FCBCNT+1,X
2471     RTS 
2472 DFRDSU JSR SETFCB             ;SET UP FCB
2473     LDY CDIRD                 ;MOVE START SECTOR TO LINK
2474     LDA DFDFL1+FILDIR,Y       ;SET NEW
2475     AND #DFDNLD               ;SECTOR
2476     STA FCBSLT,X ;FLAG
2477     LDA FILDIR+DFDSSN,Y
2478     STA FCBLSN,X
2479     LDA FILDIR+DFDSSN+1,Y
2480     STA FCBLSN+1,X
2481     JSR RDNSO                 ;READ 1ST SECTOR
2482     RTS 
3000     .PAGE "PUT BYTE"
3001 ;=========================================================================
3002 ;DFMPUT - PUT A FILE BYTE
3003 ;=========================================================================
3004 DFMPUT
3005     STA SVDBYT
3006     LDA ICDNO,X
3007     STA ICDNO-IOCB+ZICB
3008     JSR SETUP
3009     LDY ENTSTK                ;CHK TO SEE IF ENTRY WASN'T FROM CIO
3010     LDA STAK,Y                ;IF HI BYTE RTS IS NOT IN OS ADDR
3011     CMP #OSBTM                ;SPACE THEN A NON-CIO ENTRY
3012     BCS FRMCIO                ;BR IF FROM CIO
3013     LDA #0                    ;ELSE PREVENT FROM DOING BURST I/O
3014     STA ICCOMZ
3015 FRMCIO LDA FCBOTC,X           ;IF NOT OPEN
3016     AND #OPOUT                ;OUTPUT
3017     BEQ PUTER                 ;ERROR
3018     LDY FCBDLN,X              ;GET DATA LENGTH
3019     TYA 
3020     CMP FCBMLN,X              ;IF SECTOR NOT FULL
3021     BCC PUT1                  ;THEN BR
3022     JSR WRTNXS                ;ELSE WRITE FULL SECTOR
3023     BCS PEOF                  ;BR IF EOF
3024     JSR WTBUR                 ;TEST BURST
3025     LDY #0
3026     BCS PUT1                  ;BR IF NOT BURST
3027     LDA (ICBALZ),Y            ;PUT NEXT BYTE
3028     STA SVDBYT                ;AFTER BURST AREA
3029 ;-------------------------------------------------------------------------
3030 PUT1 INC FCBDLN,X             ;INC DATA LEN
3031     LDA SVDBYT                ;GET DATA BYTE
3032     STA (ZSBA),Y              ;AND PUT IN SECTOR BUFFER
3033 ;.........................................................................
3034     LDA #FCBFSM               ;INDICATE SECTOR MODIFIED
3035     ORA FCBFLG,X
3036     STA FCBFLG,X
3037 ;-------------------------------------------------------------------------
3038     JMP GREAT                 ;DONE
3039 ;-------------------------------------------------------------------------
3040 PUTER JMP ERDVDC
3041 PEOF JMP ERREOF
3042     .PAGE "BURST I/O"
3043 ;=========================================================================
3044 ;TEST BURST I/O AND DO IF POSSIBLE
3045 ;=========================================================================
3046 WTBUR LDA FCBFLG,X            ;IF NOT AQUIRING SECTORS
3047     BPL NOBURST               ;THEN UPDATE AND
3048     BMI TBURST                ;NO BURST
3049 ;-------------------------------------------------------------------------
3050 RTBUR LDA #0                  ;SET READ TYPE
3051 ;-------------------------------------------------------------------------
3052 TBURST STA BURTYP             ;SET BURST TYPE
3053     LDA ICCOMZ                ;IF CMD
3054     AND #2                    ;IS TEXT MODE
3055     BEQ NOBURST               ;THEN NO BURST
3056 ;.........................................................................
3057     JSR TBLEN                 ;IF USER BUFFER LESS
3058     BCS NOBURST               ;THEN SECTOR, NO BURST
3059 ;.........................................................................
3060     LDA ICBALZ                ;MOVE USER BUFFER
3061     STA ZSBA                  ;ADDR TO SECTPOR
3062     LDA ICBAHZ                ;BUFFER PTR
3063     STA ZSBA+1
3064 ;-------------------------------------------------------------------------
3065 NXTBUR LDA BURTYP             ;GET I/O TYPE
3066     BMI WRBUR                 ;BR IF WRITE
3067 ;.........................................................................
3068     JSR RDNXTS                ;DO SECTOR READ
3069     BCC BBINC                 ;BR IF EOF
3070     BCS BUREOF                ;BR RD EOF
3071 ;-------------------------------------------------------------------------
3072 NOBURST SEC                   ;INDICATE NO BURST
3073     RTS 
3074 ;-------------------------------------------------------------------------
3075 WRBUR LDA DRVMDL              ;WRITE FULL SECTOR
3076     STA FCBDLN,X              ;DATA COUNT
3077 ;.........................................................................
3078     TAY 
3079     LDA (ZSBA),Y              ;SAVE DATA TO BE
3080     STA SVD1                  ;TO BE CLOBBERED
3081     INY 
3082     LDA (ZSBA),Y              ;BY WRTNXT
3083     STA SVD2
3084     INY 
3085     LDA (ZSBA),Y
3086     STA SVD3
3087 ;-------------------------------------------------------------------------
3088     JSR WRTNXS                ;WRITE SECTOR
3089 ;-------------------------------------------------------------------------
3090     LDY DRVMDL                ;RESTORE CLOBBERED DATA
3091     LDA SVD1
3092     STA (ZSBA),Y
3093     INY 
3094     LDA SVD2
3095     STA (ZSBA),Y
3096     INY 
3097     LDA SVD3
3098     STA (ZSBA),Y
3099 ;
3100 ;-------------------------------------------------------------------------
3101 BBINC CLC 
3102     LDA ZSBA                  ;INC SECTOR
3103     ADC FCBMLN,X              ;BUFFER ADDR BY
3104     STA ZSBA                  ;ACTUAL DATA LEN
3105     LDA ZSBA+1                ;GOT OT PUT
3106     ADC #0
3107     STA ZSBA+1
3108 ;.........................................................................
3109     SEC 
3110     LDA ICBLLZ                ;DEC USER
3111     SBC FCBMLN,X              ;BUFFER LEN BY
3112     STA ICBLLZ                ;ACTUAL DATA LEN
3113     LDA ICBLHZ                ;GOT OR PUT
3114     SBC #0
3115     NOP 
3116     STA ICBLHZ
3117 ;.........................................................................
3118     JSR TBLEN                 ;IF USER BUF LEN
3119     BCC NXTBUR                ;NOW >= SECTOR, DO AGAIN
3120 ;-------------------------------------------------------------------------
3121 BUREOF = *                    ;END OF BURSTING
3122     LDA ZSBA                  ;MOVE FINAL ADDR BACK
3123     STA ICBALZ                ;TO USER BUF PTR
3124     LDA ZSBA+1
3125     STA ICBAHZ
3126 ;.........................................................................
3127     LDY FCBBUF,X              ;RESTORE ZSBA
3128     DEY 
3129     JSR SSBA
3130 ;-------------------------------------------------------------------------
3131 BURST CLC 
3132     RTS 
3133 ;=========================================================================
3134 ;TEST USER BUF LEN FOR BURST
3135 ;=========================================================================
3136 TBLEN = *
3137     LDA DRVTYP                ;IF DRIVE NOT
3138     CMP #1                    ;128 BYTE SECTOR TYPE
3139     BNE TBL256                ;THEN DO 256 BYTE TEST
3140 ;.........................................................................
3141     LDA ICBLLZ
3142     BMI BURST
3143 ;-------------------------------------------------------------------------
3144 TBL256 LDA ICBLHZ             ;IF BUF LEN HI >= 256
3145     BNE BURST                 ;THEN CAN BURST
3146     SEC 
3147     RTS 
3148     .PAGE "GET BYTE"
3149 ;
3150 ;=========================================================================
3151 ;DFMGET - GET A FILE BYTE
3152 ;=========================================================================
3153 DFMGET = *
3154     JSR SETUP                 ;GO SET UP
3155     LDA FCBOTC,X              ;IF OPEN FOR
3156     AND #OPDIR                ;DIR CNT
3157     BEQ GET1
3158     JMP GDCHAR                ;THEN GO TO DIR RTN
3159 ;-------------------------------------------------------------------------
3160 GET1 LDA FCBDLN,X             ;GET DATA LEN
3161     CMP FCBMLN,X              ;TEST EMPTY SECTOR
3162     BCC GET2                  ;BR IF NOT EMPTY
3163     JSR RTBUR                 ;DO BURST IF POSSIBLE
3164     JSR RDNXTS                ;GET NEXT SECTOR
3165     BCC GET1                  ;BR IF NOT EOF
3166 GEOF =  *
3167     JMP ERREOF                ;ELSE EOF ERROR
3168 ;-------------------------------------------------------------------------
3169 GET2 TAY 
3170     LDA (ZSBA),Y              ;GET DATA BYTE
3171     STA SVDBYT                ;SAVE THE BYTE
3172     INY 
3173     TYA 
3174     STA FCBDLN,X              ;AND SET NEW VALUE
3175 EFLOOK = *
3176     LDY FCBLSN,X              ;DO EOF LOOK AHEAD
3177     BNE GET3                  ;IF LSN NOT ZERO
3178     LDY FCBLSN+1,X            ;THEN
3179     BNE GET3                  ;NOT EOF
3180     CMP FCBMLN,X              ;IF LSN=0 THEN CHECK FOR
3181     BCC GET3                  ;LAST BYTE
3182     LDA #$03                  ;IF LAST BYTE THEN RTS
3183     JMP RETURN
3184 ;-------------------------------------------------------------------------
3185 GET3 JMP GREAT
3186     .PAGE "STATUS"
3187 ;=========================================================================
3188 ;DFMSTA - GET A FILE STATUS
3189 ;=========================================================================
3190 DFMSTA
3191     JSR SETUP                 ;SETUP
3192     JSR FNDCODE               ;DECODE FILE NAME
3193     JSR SFDIR                 ;SEARCH FOR FILE
3194     BCS SFNF                  ;BR NOT FOUND
3195     JSR TSTLOCK               ;TEST LOCKED
3196     JMP GREAT                 ;FILE EXISTS AND UNLOCKED
3197 ;-------------------------------------------------------------------------
3198 SFNF JMP ERFNF
3199     .PAGE "CLOSE"
3200 ;=========================================================================
3201 ;DFMCLOSE - CLOSE A FILE
3202 ;=========================================================================
3203 DFMCLS
3204     JSR SETUP
3205     LDA FCBOTC,X              ;GET OPEN CODE
3206     AND #OPOUT                ;IF NOT OUTPUT
3207     BEQ CLDONE                ;THEN DONE
3208 ;.........................................................................
3209     ROL FCBFLG,X              ;IF NOT ACQUIRING SECTORS
3210     BCC CLUPDT                ;THEN IS UPDATE
3211 ;-------------------------------------------------------------------------
3212     JSR WRTLSEC               ;WRITE LAST SECTOR
3213 ;-------------------------------------------------------------------------
3214     JSR RRDIR                 ;GO GET DIRECTORY
3215     LDA FCBCNT+1,X            ;GET CNT OF SECTORS
3216     PHA 
3217     LDA FCBCNT,X
3218     PHA 
3219 ;.........................................................................
3220     LDA FCBOTC,X              ;GET OPEN CODE
3221     AND #OPAPND               ;IF NOT APPEND
3222     BEQ CLOUT                 ;BR
3223 ;-------------------------------------------------------------------------
3224     JSR DFRDSU                ;ELSE SET UP FOR READ
3225 APP1 JSR RDNXTS               ;READ TO EOF
3226     BCC APP1
3227 ;.........................................................................
3228     LDA FCBSSN,X              ;MOVE START SECTOR
3229     STA FCBLSN,X              ;TO EOF LINK SECTOR
3230     LDA FCBSSN+1,X
3231     STA FCBLSN+1,X
3232     JSR WRTN2                 ;THEN WRITE AS NOT EOF
3233 ;------------------------------------------------------------------------- 
3234 CLOUT LDY CDIRD               ;GET DIR DISPL
3235     CLC 
3236     PLA 
3237     ADC FILDIR+DFDCNT,Y
3238     STA FILDIR+DFDCNT,Y
3239     PLA 
3240     ADC FILDIR+DFDCNT+1,Y
3241     STA FILDIR+DFDCNT+1,Y
3242 ;.........................................................................
3243     LDA #DFDINU+DFDNLD        ;SET ENTRY TO IN USE
3244     STA FILDIR+DFDFL1,Y
3245     JSR WRTDIR                ;WRITE DIR
3246     JSR WRTVTOC ;WRITE VTOC
3247 ;-------------------------------------------------------------------------
3248 CLDONE LDA #0                 ;CLEAR OPEN CODE
3249     STA FCBOTC,X
3250     JMP FGREAT
3251 ;-------------------------------------------------------------------------
3252 CLUPDT = *
3253     ROL FCBFLG,X              ;IF SECTOR NOT MODIFIED
3254     BCC CLDONE                ;THEN DONE
3255     JSR WRCSIO                ;ELSE WRITE IT
3256     JMP CLDONE                ;THEN DONE
3257 ;-------------------------------------------------------------------------
3258     .PAGE 
3259 ;-------------------------------------------------------------------------
3260 ;RE-READ DIR RECORD
3262 RRDIR = *
3263     LDA FCBFNO,X              ;GET FILE NUMBER
3264     LSR A
3265     LSR A
3266     STA SFNUM
3267 ;
3268 ;.........................................................................
3269     JSR FNSHFT                ;SET ACU=FILE NO/64
3270     STA CDIRS                 ;TO GET DIR SECTOR
3271     JSR FNSHFT                ;SET ACU TO REM=16
3272     JSR FNSHF1
3273     ASL A
3274     STA CDIRD                 ;TO GET DIR DISPL
3275 ;-------------------------------------------------------------------------
3276     JMP RDDIR
3277 FNSHFT LDA #0
3278 FNSHF1 LDY #3                 ;SHIFT 3 BITS OF
3279 FNSHF2 ASL FCBFNO,X           ;FILE NO INTO ACU
3280     ROL A
3281     DEY 
3282     BNE FNSHF2
3283     RTS 
3284     .PAGE "DEVICE DEPENDENT COMMAND"
3285 ;=========================================================================
3286 ;DFMDDC - DEVICE DEPENDENT CMD EXECUTION 
3287 ;=========================================================================
3288 DFMDDC
3289     JSR SETUP                 ;SET UP FOR EXECUTION
3290     LDA ICCOM,X               ;GET COMMAND
3291     CMP #254                  ;IS IT FORMAT
3292     BEQ XFV                   ;BR IF
3293     CMP #MAXDDC               ;TEST RANGE
3294     BCS DVDCER                ;BR OUT OF RANGE
3295     SEC 
3296     SBC #$20                  ;SUBTRACT BASE OF CMDS
3297     BCC DVDCER                ;BR OUT OF RANGE
3298     ASL A
3299     TAY 
3300     LDA DVDCVT,Y
3301     PHA                       ;PUSH EXECUTION ADDR
3302     LDA DVDCVT+1,Y
3303     PHA 
3304     RTS 
3305 ;-------------------------------------------------------------------------
3306 DVDCVT
3307     .DBYTE XRENAME-1          ;20-RENAME
3308     .DBYTE XDELETE-1          ;21-DELETE
3309     .DBYTE DVDCER-1           ;INVALID CMD
3310     .DBYTE XLOCK-1            ;23-LOCK
3311     .DBYTE XUNLOCK-1          ;24-UNLOCK
3312     .DBYTE XPOINT-1           ;25-POINT
3313     .DBYTE XNOTE-1            ;26-NOTE
3314 ;-------------------------------------------------------------------------
3315 MAXDDC = $27                  ;MAX DVDC+1
3316 ;-------------------------------------------------------------------------
3317 DVDCER JMP ERDVDC
3318 XFV JMP XFORMAT               ;FORMAT VECTOR
3319     .PAGE "RENAME"
3320 ;=========================================================================
3321 ;XRENAME - RENAME A FILE OR FILES
3322 ;=========================================================================
3323 XRENAME
3324     JSR FNDCODE               ;DECODE FILE NAME 
3325     STY TEMP2                 ;SAVE FNAME INDEX
3326     JSR SFDIR                 ;GO FINE FILE IN DIR
3327     BCC XRN1                  ;BR IF FOUND
3328     JMP ERFNF
3329 ;-------------------------------------------------------------------------
3330 XRN1 JSR TSTLOCK              ;TEST LOCK
3331     JSR TSTDOS                ;IF NOT DOS
3332     BNE XRN1A                 ;THEN
3333     JSR DELDOS                ;DON'T CHANGE SO
3334 XRN1A
3335     LDY TEMP2                 ;GET INDEX FOR END FN1
3336     JSR FNDCNX                ;GO DECODE NEXT FILE NAME
3337     JSR TSTDOS                ;IF NOT DOS
3338     BNE XRN1B                 ;THEN
3339     LDY CDIRD
3340     LDA FILDIR+DFDSSN+1,Y
3341     PHA 
3342     LDA FILDIR+DFDSSN,Y
3343     TAY                       ;A, Y NEW DOS
3344     PLA 
3345     JSR SETDSO                ;GO WRITE SECTOR ZERO
3346 ;-------------------------------------------------------------------------
3347 XRN1B
3348     LDX #0
3349     LDY CDIRD
3350 ;-------------------------------------------------------------------------
3351 XRN2 LDA FNAME,X              ;MOVE FILE NAME
3352     CMP #'?                   ;FROM FNAME TO DIR ENT
3353     BEQ XRN3                  ;BUT DON'T CHANGE WILD CARD
3354     STA FILDIR+DFDPFN,Y       ;CHARS INDICATED IN FNAME
3355 XRN3 INY 
3356     INX 
3357     CPX #11
3358     BCC XRN2
3359     LDX CURFCB                ;RESTORE X-REG
3360 ;-------------------------------------------------------------------------
3361     JSR WRTDIR                ;GO WRITE CIR DIR RECORD
3362 ;-------------------------------------------------------------------------
3363     JSR FNDCODE               ;GET OLD FILENAME AGAIN
3364     JSR CSFDIR                ;CONTINUE SEARCH OF DIR
3365     BCC XRN1                  ;BR IF FOUND ANOTHER
3366 ;-------------------------------------------------------------------------
3367     JMP FGREAT                ;GO TO GOOD ENDING
3368     .PAGE "DELETE"
3369 ;=========================================================================
3370 ;XDELETE - DELETE ALL FILENAMES THAT MATCH 
3371 ;=========================================================================
3372 XDELETE
3373     JSR FNDCODE               ;GO DECODE FILENAME
3374     JSR SFDIR                 ;SEARCH DIR FOR FILENAME
3375     BCS DFNF                  ;BR NOT FOUND
3376 XDELX = *
3377     JSR XDEL0
3378     JSR TSTDOS
3379     BNE XDELY
3380     JSR DELDOS
3381 XDELY
3382 ;-------------------------------------------------------------------------
3383 XDEL3 JSR WRTDIR              ;WRITE DIR ENTRY
3384     JSR CSFDIR                ;LOOK FOR NEXT MATCH
3385     BCC XDELX                 ;BR IF FOUND
3386     JSR WRTVTOC
3387     JMP FGREAT
3388 ;-------------------------------------------------------------------------
3389 XDEL0 JSR OPVTOC
3390 ;-------------------------------------------------------------------------
3391 XDEL1 LDY CDIRD               ;GET DIR DISPL
3392     JSR TSTLOCK               ;GO TEST LOCK
3393     LDA #DFDEDE               ;LOAD DELETED FLAG
3394     STA FILDIR+DFDFL1,Y       ;DELETE FILE
3395 ;-------------------------------------------------------------------------
3396     JSR DFRDSU
3397     JMP XDEL2A
3398 ;-------------------------------------------------------------------------
3399 XDEL2 JSR RDNXTS              ;READ NEXT SECTOR
3400     BCS XDEL4
3401 XDEL2A = *
3402     JSR FRESECT               ;FREE CURRENT SECTOR
3403     JMP XDEL2
3404 ;-------------------------------------------------------------------------
3405 XDEL4 = *
3406     LDY #DVDWRQ               ;TURN ON WRITE REQ'D
3407     LDA #$FF
3408     STA (ZDRVA),Y
3409     RTS 
3410 ;-------------------------------------------------------------------------
3411 DFNF JMP ERFNF                ;FILE NOT FOUND
3412     .PAGE "LOCK AND UNLOCK"
3413 ;=========================================================================
3414 ;XLOCK   - LOCK A FILE
3415 ;XUNLOCK - UNLOCK A FILE
3416 ;=========================================================================
3417 XLOCK
3418     LDA #DFDLOC               ;SET LOCK
3419     STA TEMP4
3420     BNE XLCOM                 ;GO TO COMMON
3421 XUNLOCK
3422     LDA #0                    ;SET UNLOCK
3423     STA TEMP4
3424 ;-------------------------------------------------------------------------
3425 XLCOM JSR FNDCODE             ;DECODE FILE NAME
3426     JSR SFDIR                 ;FIND 1ST MATCH
3427     BCC XLC1                  ;BR MATCH FOUND
3428     JMP ERFNF                 ;BR NOT FOUND
3429 ;-------------------------------------------------------------------------
3430 XLC1 LDY CDIRD                ;GET CURRENT DISPL
3431     LDA FILDIR+DFDFL1,Y       ;GET LOCK BYTE
3432     AND #$DF                  ;TURN OFF LOCK
3433     ORA TEMP4                 ;OR IN LOCK/UNLOCK
3434     STA FILDIR+DFDFL1,Y       ;SET NEW LOCK BYTE
3435     JSR WRTDIR                ;GO WRITE
3436 ;-------------------------------------------------------------------------
3437     JSR CSFDIR                ;LOOK FOR NEXT MATCH
3438     BCC XLC1                  ;BR FOUND
3439     JMP FGREAT                ;ELSE DONE
3440 ;=========================================================================
3441 ;TSTLOCK - TEST FILE LOCKED
3442 ;=========================================================================
3443 TSTLOCK
3444     LDY CDIRD                 ;GET DIR DISPL
3445     LDA FILDIR+DFDFL1,Y       ;LOAD LOCK BYTE
3446     AND #DFDLOC               ;MASK LOCK BIT
3447     BNE TLF                   ;BR IF LOCKED
3448     RTS 
3449 ;-------------------------------------------------------------------------
3450 TLF JMP ERFLOCK
3451     .PAGE "POINT"
3452 ;=========================================================================
3453 ;XPOINT - POINT REQUEST
3454 ;=========================================================================
3455 XPOINT
3456     LDA FCBFLG,X              ;IF ARQ SECTORS
3457     BMI PERR1                 ;POINT INVALID
3458     LDA ICAUX4,X              ;IF REQUEST IS NOT
3459     CMP FCBCSN+1,X            ;SAME AS CURRENT
3460     BNE XP1                   ;THEN BR
3461     LDA ICAUX3,X
3462     CMP FCBCSN,X
3463     BEQ XP2                   ;ELSE NO NEED TO CHANGE
3464 ;-------------------------------------------------------------------------
3465 XP1 LDA FCBFLG,X              ;IF NOT MODIFIED
3466     BEQ XP1A                  ;BR
3467     JSR WRCSIO                ;ELSE WRITE IT
3468     LDA #0
3469     STA FCBFLG,X
3470 XP1A =  *
3471     LDA ICAUX4,X
3472     STA FCBLSN+1,X
3473     LDA ICAUX3,X
3474     STA FCBLSN,X
3475     JSR RDNSO                 ;READ REQ SECTOR
3476     BCS XPERR
3477 ;-------------------------------------------------------------------------
3478 XP2 LDA ICAUX5,X              ;TEST REQ DATA LEN
3479     CMP FCBMLN,X              ;LESS THEN MAX
3480     BCC XP3
3481     BEQ XP3
3482 XPERR = *
3483     JMP ERRPDL                ;IF NOT THEN ERROR
3484 ;-------------------------------------------------------------------------
3485 XP3 STA FCBDLN,X              ;SET NEW DATA LEN
3486     JMP GREAT
3487 ;-------------------------------------------------------------------------
3488 PERR1 JMP ERRPOT
3489     .PAGE "NOTE"
3490 ;=========================================================================
3491 ;XNOTE - EXECUTE NOTE REQUEST
3492 ;=========================================================================
3493 XNOTE
3494     LDA FCBDLN,X              ;DATA LENGTH VALUE
3495     STA ICAUX5,X              ;TO AUX 2
3496     LDA FCBCSN,X              ;CUR SEC NO (LO)
3497     STA ICAUX3,X              ;TO AUX 3
3498     LDA FCBCSN+1,X            ;CUR SEC NO (HI)
3499     STA ICAUX4,X              ;TO AUX 4
3500     JMP GREAT
3501     .PAGE "FORMAT"
3502 ;=========================================================================
3503 ;XFORMAT - FORMAT A DISKETTE
3504 ;=========================================================================
3505 XFORMAT
3506     LDA ZSBA+1                ;MOVE VTOC BUF ADR
3507     STA DCBBUF+1              ;TO DCB
3508     LDA ZSBA
3509     STA DCBBUF
3510     LDA #DCBCFD               ;FORMAT
3511     STA DCBCMD                ;TO DCB
3512     LDA #$40                  ;TELL SIO RECEIVING DATA
3513     STA DCBSTA
3514     LDX DRVTYP                ;GET DR TYPE 128 OR 256
3515     LDA #$31                  ;BUS I.D.
3516     LDY DSKTIM                ;GET FORMAT TIME OUT VALUE
3517     JSR DSIO2                 ;GOTO LOCAL DISK HANDLER THEN SIO
3518 ;-------------------------------------------------------------------------
3519     BPL XF0                   ;IF NO ERRORS CONT FORMATING
3520     CPY #$90                  ;ELSE CK FOR DEVICE DONE ERROR
3521     BNE XFERR                 ;NO, THEN ERROR EXIT
3522 ;-------------------------------------------------------------------------
3523 TSTFMT = *                    ;ELSE CK FOR BAD SECTOR INFO
3524     LDY #0                    ;RETURNED BY CONTROLLER
3525     LDA (ZSBA),Y
3526     CMP #$FF
3527     BNE XFBAD                 ;BAD SECTORS RET ERR MSG
3528     INY 
3529     LDA (ZSBA),Y
3530     CMP #$FF
3531     BEQ XFERR                 ;NOT BAD SEC ERR, REQ ERR EXIT
3532 XFBAD JMP ERDBAD
3533 ;-------------------------------------------------------------------------
3534 XFERR JMP RETURN              ;DO ERROR EXIT
3535 ;-------------------------------------------------------------------------
3536 XF0
3537     LDA #0
3538     TAY 
3539 XF1 STA (ZDRVA),Y
3540     INY 
3541     BPL XF1
3542 ;.........................................................................
3543     LDY #0                    ;SET
3544     LDA #2                    ;TYPE = 2
3545     STA (ZDRVA),Y
3546     INY 
3547     LDA #$C3                  ;SET MSN AND
3548     STA (ZDRVA),Y             ;NSA=107=2C3
3549     INY 
3550     INY 
3551     STA (ZDRVA),Y
3552     LDA #$02
3553     DEY 
3554     STA (ZDRVA),Y
3555     INY 
3556     INY 
3557     STA (ZDRVA),Y
3558 ;-------------------------------------------------------------------------
3559     LDY #DVDSMP
3560     LDA #$FF                  ;SET SECTOR MAP TO
3561 XF2 STA (ZDRVA),Y             ;ALL ONES
3562     INY 
3563     CPY #DVDSMP+90
3564     BNE XF2
3565 ;-------------------------------------------------------------------------
3566     LDA #$0F                  ;DEALOCATE 1ST 4 SECTORS
3567     LDY #DVDSMP               ;FOR BOOT
3568     STA (ZDRVA),Y
3569 ;.........................................................................
3570     LDY #DVDSMP+45            ;DEALLOCATE MIDDLE 9
3571     LDA #0
3572     STA (ZDRVA),Y             ;FOR
3573     INY                       ;VTOC AND FILE DIR
3574     LDA #$7F
3575     STA (ZDRVA),Y
3576 ;-------------------------------------------------------------------------
3577     JSR WRTVTOC               ;WRITE THE VTOC
3578 ;-------------------------------------------------------------------------
3579     LDA #0                    ;0 FILLE DIR SECTORS
3580     TAY 
3581 XF3 STA FILDIR,Y              ;USE FILE DIR BUFFER
3582     INY 
3583     BPL XF3
3584 ;-------------------------------------------------------------------------
3585     LDA #7                    ;WRITE TO ALL 8 DIR SECTORS
3586     STA CDIRS
3587 XF4 JSR WRTDIR
3588     DEC CDIRS
3589     BPL XF4
3590 ;-------------------------------------------------------------------------
3591     JSR DELDOS                ;SET NO DOS
3592 ;-------------------------------------------------------------------------
3593     JMP FGREAT                ;DONE
3594     .PAGE "LIST DIRECTORY"
3595 ;=========================================================================
3596 ;LISTDIR - LIST THE DIRECTORY
3597 ;-------------------------------------------------------------------------
3598 ;GDCHAR  - GET NEXT DIR CHARACTER
3599 ;=========================================================================
3600 ;THE DIRECTORY IS LISTED VIA OPEN LIST DIRECTORY
3601 ;FUNCTION. EACH DIR ENTRY THAT MATCHES THE
3602 ;FILE SPEC IS CONVERTED TO A PRINTABLE FORMAT 
3603 ;INTO A SECTOR BUFFER. THE GET BYTE ENTRY IS
3604 ;USED TO GET THE PRINTABLE CHARACTERS ONE
3605 ;AT A TIME. THE LAST LINE PRINTED IS ALWAYS
3606 ;A COUNT OF THE NUMBET OF SECTORS IN USE
3607 ;AND THE NUMBER REMAINING AVAILABLE SECTORS 
3608 ;-------------------------------------------------------------------------
3609 LISTDIR
3610     LDA #0
3611     STA TEMP4
3612     JSR SFDIR                 ;SEARCH FOR A FILE NAME
3613     BCC LDENT1                ;BR IF FOUND
3614     BCS LDCNT                 ;BR IF NOT FOUND
3615 ;-------------------------------------------------------------------------
3616 GDCHAR
3617     BIT TEMP4                 ;TEST FLAG
3618     BMI LDDONE                ;BR IF ALL DONE
3619 ;-------------------------------------------------------------------------
3620     LDY TEMP4                 ;GET COUNT OF CHARS SENT
3621     LDA (ZSBA),Y              ;GET NEXT CHAR
3622     STA SVDBYT                ;IN SVDBYT
3623     INC TEMP4                 ;INC COUNT
3624     CMP #EOL                  ;TEST IF EOL DONE
3625     BNE GDCRTN                ;BR NOT EOL
3626     CPY #17                   ;WAS THIS AN ENTRY
3627     BCS LDENT                 ;BR IF IT WAS
3628     LDA #$80                  ;ELSE INDICATE END
3629     STA TEMP4                 ;IN TEMP4
3630 ;-------------------------------------------------------------------------
3631 GDCRTN JMP GREAT              ;DONE
3632 ;-------------------------------------------------------------------------
3633 LDENT LDA #0                  ;CLEAR CHAR COUNTER
3634     STA TEMP4
3635     JSR CSFDIR                ;SEARCH FOR NEXT MATCH
3636     BCS LDCNT                 ;BR NO MORE MATCHES
3637 LDENT1
3638     JSR FDENT                 ;FORMAT ENTRY
3639     JMP GREAT                 ;DONE
3640 ;-------------------------------------------------------------------------
3641 LDCNT JSR RDVTOC              ;READ VTOC
3642     LDY #DVDNSA+1             ;GET # SECTOR AVR
3643     LDA (ZDRVA),Y
3644     PHA 
3645     DEY 
3646     LDA (ZDRVA),Y
3647     TAY 
3648     PLA 
3649 ;-------------------------------------------------------------------------
3650     JSR CVDX                  ;AND CONVERT
3651 ;-------------------------------------------------------------------------
3652     LDY #3                    ;SET EOL
3653     LDX #FSCML-1              ;PUT IN CUTE
3654 MVFSCM LDA FSCM,X ;MSG
3655     STA (ZSBA),Y
3656     INY 
3657     DEX 
3658     BPL MVFSCM
3659     JSR CVDY
3660 ;-------------------------------------------------------------------------
3661     LDA #0                    ;SET CHAR CNT
3662     STA TEMP4
3663     JMP FGREAT
3664 ;-------------------------------------------------------------------------
3665 LDDONE
3666     JMP ERREOF                ;END OF FILE
3667 ;-------------------------------------------------------------------------
3668 FSCM .BYTE "SROTCES EERF "
3669 FSCML = *-FSCM
4000     .PAGE 
4001 ;=========================================================================
4002 ;FORMAT DIR ENTRY INTO A SECTOR BUFFER
4003 ;=========================================================================
4004 FDENT
4005     LDY #0                    ;START AT DISPL ZERO
4006     LDA #$20                  ;START WITH A BLANK
4007     STA (ZSBA),Y
4008     LDX CDIRD
4009     LDA FILDIR+DFDFL1,X
4010     AND #DFDLOC               ;BUT IF FILE LOCKED
4011     BEQ LD1
4012     LDA #'*                   ;CHANGE TO AST
4013     STA (ZSBA),Y
4014 LD1 INY 
4015     LDA #$20                  ;FOLLOWED BY A BLANK
4016     STA (ZSBA),Y
4017     INY 
4018 ;-------------------------------------------------------------------------
4019 LD2 LDA FILDIR+DFDPFN,X       ;MOVE THE 12 CHAR
4020     STA (ZSBA),Y              ;FILE NAME
4021     INX 
4022     INY 
4023     CPY #13
4024     BCC LD2
4025 ;.........................................................................
4026     LDA #$20                  ;FOLLOWED BY A BLANK
4027     STA (ZSBA),Y
4028     INY 
4029     STY TEMP4                 ;SAVE INDEX = 15
4030 ;.........................................................................
4031     LDX CDIRD
4032     LDY FILDIR+DFDCNT,X       ;SET A,Y
4033     LDA FILDIR+DFDCNT+1,X     ;=SECTOR COUNT
4034 ;-------------------------------------------------------------------------
4035 CVDX
4036     LDX #100                  ;CONVERT AND MOVE
4037     JSR CVDIGIT               ;100S DIGIT
4038     LDX #10
4039     JSR CVDIGIT               ;10S DIGIT
4040     TYA 
4041     JSR STDIGIT               ;lS DIGIT
4042 ;-------------------------------------------------------------------------
4043     LDY #17                   ;THEN PUT OUT
4044 CVDY LDA #EOL                 ;AND EOL
4045     STA (ZSBA),Y
4046     LDY #0
4047     STY TEMP4                 ;SET CHAR CNT = 0
4048     RTS 
4049 ;-------------------------------------------------------------------------
4050 CVDIGIT STX TEMP3             ;SAVE DIGIT VALUE
4051     LDX #$FF
4052 ;-------------------------------------------------------------------------
4053 CVD1 STA TEMP2                ;SAVE CURR VALUE HI
4054     STY TEMP1                 ;AND LOW
4055     INX                       ;INC DIGIT COUNTER
4056     SEC                       ;SUBRTACT DIGIT VALUE
4057     LDA TEMP1                 ;FROM CUR VALUE
4058     SBC TEMP3
4059     TAY 
4060     LDA TEMP2
4061     SBC #0
4062     BCS CVD1                  ;IF NOT GONE MINUS, DO AGAIN
4063 ;-------------------------------------------------------------------------
4064     TXA                       ;DIGIT TO ACU
4065 STDIGIT ORA #$30              ;PLUS ASCII ZERO
4066     LDY TEMP4                 ;GET OUTPUT INDEX
4067     STA (ZSBA),Y              ;AND SET DIGIT
4068     INC TEMP4                 ;INC OUTPUT INDEX
4069     LDA TEMP2                 ;LOAD VALUE HI
4070     LDY TEMP1                 ;AND VALUE LO
4071     RTS 
4072     .PAGE "FILE NAME DECODE"
4073 ;=========================================================================
4074 ;FNDCODE - DECODE A FILE NAME
4075 ;=========================================================================
4076 ;THE USER FILENAME IS POINTED TO BY 
4077 ;ZBUFP, IT IS ON THE FORM P.X WHERE P
4078 ;IS THE PRIMARY FILE NAME (I TO 8 CHARS)
4079 ;AND X IS THE EXTENDED FILE NAME
4080 ;(0 TO 4 CHARS). THE PERIOD IS OPTIONAL
4081 ;(IF NOT PRESENT, THEN NO EXTENSION).
4082 ;THE DECODED FILENAME WILL BE 12 CHARS
4083 ;IN LENGTH. THE P FIELD WILL BE
4084 ;LEFT JUSTIFIED IN THE 1ST 8 BYTES.
4085 ;THE X FIELD WILL BE LEFT JUSTIFIED IN
4086 ;THE LAST 4 BYTES. BLANKS ARE USED
4087 ;TO PAD THE FIELDS TO FULL SIZE.
4088 ;IF THE USER SPECIFIED P OR X FILEDS
4089 ;CONTAIN MORE THAN 8 OR 4 CHARS, THEN THE 
4090 ;EXTRA CHARS ARE IGNORED. THE '*'
4091 ;WILD CARD CHAR WILL CAUSE THE REST
4092 ;OF THE FIELDS TO FILLED WITH THE
4093 ;'?' WILD CARD CHAR. ANY NON-ALPHANUMERIC 
4094 ;CHAR TERMINATES THE FILENAME.
4095 ;-------------------------------------------------------------------------
4096 FNDCODE
4097     LDA ICBAL,X
4098     STA ZBUFP
4099     LDA ICBAH,X
4100     STA ZBUFP+1
4101     LDY #2                    ;FIND THE 'D'
4102 FD0A LDA (ZBUFP),Y
4103     DEY 
4104     BMI FNDERR                ;BR IF 256 CHARS SEEN
4105     CMP #':
4106     BNE FD0A
4107 FD0B
4108     INY 
4109 ;-------------------------------------------------------------------------
4110 FNDCNX
4111     LDX #11                   ;CLEAR FILENAME TO BLANKS
4112     LDA #$20
4113 FD0 STA FNAME,X
4114     DEX 
4115     BPL FD0
4116 ;.........................................................................
4117     LDX #0                    ;SET FNAME CHAR CNT TO 0
4118     STX EXTSW                 ;SET NOT IN EXTENSION
4119 ;
4120 ;-------------------------------------------------------------------------
4121 FD1 INY                       ;INC ZBUFP INDEX
4122     LDA (ZBUFP),Y             ;GET BUF CHAR
4123 ;.........................................................................
4124     CMP #'*                   ;TEST FOR WILD CARDS
4125     BNE FD3                   ;BR NOT WILD CARD
4126 ;-------------------------------------------------------------------------
4127 FD2 LDA #'?                   ;LOAD ? WILD CARD
4128     JSR FDSCHAR               ;GO STORE IT
4129     BCC FD2                   ;BR IF PORX NOT FULL
4130     BPL FD1                   ;BR IF AT START OF X
4131     BMI FDEND                 ;BR IF AT X END
4132 ;-------------------------------------------------------------------------
4133 FD3 CMP #'.                   ;WAS CHAR FIELD SEPERATOR
4134     BNE FD4                   ;BR IF NOT
4135     BIT EXTSW                 ;WAS THERE ALREADY 1 CHAR
4136     BMI FDEND                 ;BR IF WAS END
4137     LDX #8                    ;ADV FNAME INDEX TO XFIELD
4138     ROR EXTSW                 ;SET EXTSW - MINUS
4139     BCC FD1                   ;CONT WITH NEXT CHAR
4140 ;-------------------------------------------------------------------------
4141 FD4 CMP #'?                   ;WAS IT WILD CARD
4142     BEQ FD6                   ;BR IF WILD CARD
4143 ;-------------------------------------------------------------------------
4144     CMP #'A                   ;IS CHAR ALPHA
4145     BCC FD5                   ;BR NOT ALPHA
4146     CMP #$5B                  ;TEXT HI ALPHA
4147     BCC FD6                   ;BR IF NOT APLHA
4148 ;-------------------------------------------------------------------------
4149 FD5 CPX #0                    ;IF FIRST CHAR NOT
4150     BEQ FNDERR                ;ALPHA THEN ERROR
4151 ;.........................................................................
4152     CMP #$30                  ;IS CHAR NUMERIC
4153     BCC FDEND                 ;BR NOT NUMERIC (END OF NAME)
4154     CMP #$3A                  ;TEST NUMERIC HI
4155     BCS FDEND                 ;BR NO NUMBER
4156 ;-------------------------------------------------------------------------
4157 FD6 JSR FDSCHAR               ;STORE THE CHAR
4158     JMP FD1                   ;AND CONTINUE WITH NEXT
4159 ;-------------------------------------------------------------------------
4160 FDEND LDX CURFCB              ;RESTORE X REG
4161     RTS 
4162 ;-------------------------------------------------------------------------
4163 FNDERR JMP ERRFN              ;INDICATE FILENAME ERROR
4164     .PAGE 
4165 ;=========================================================================
4166 ;FDSCHAR - STORE FILENAME CHAR
4167 ;=========================================================================
4168 ;ON ENTRY 
4169 ;A = CHAR
4170 ;X = NEXT FN POSITION
4171 ;
4172 ;ON EXIT
4173 ;CARRY - SET IF FIELD FULL
4174 ;MINUS - IF START OF EXECUTION
4175 ;PLUS  - IF END OF EXECUTION
4176 ;-------------------------------------------------------------------------
4177 FDSCHAR
4178     CPX #8                    ;AT EXECUTION
4179     BCC FDSC2                 ;BR IF NOT
4180     BEQ FDSC1                 ;BR IF 1ST CHAR OF
4181 ;-------------------------------------------------------------------------
4182     CPX #12                   ;AT END OF EXIT
4183     BCC FDSC2                 ;BR NOT AT END
4184     RTS 
4185 ;-------------------------------------------------------------------------
4186 FDSC1 BIT EXTSW               ;DO NOT STORE CHAR UNLESS
4187     BMI FDSC2                 ;PERIOD WAS SEEN
4188     RTS 
4189 ;-------------------------------------------------------------------------
4190 FDSC2 STA FNAME,X             ;SET CHAR INTO NAME
4191     INX                       ;INCTONEXTCHAR
4192     CLC 
4193     RTS 
4194     .PAGE "DIRECTORY SEARCH"
4195 ;=========================================================================
4196 ;SFDIR  - SEARCH FILE DIRECTORY
4197 ;CSFDIR - FILE DIRECTORY SEARCH
4198 ;=========================================================================
4199 ;THE FILE DIRECTORY IS SEARCHED FOR THE 
4200 ;FILENAME IN FNAME. THE SEARCH STARTS
4201 ;AT THE CENTRAL SECTOR+1 AND WILL CONTINUE 
4202 ;FOR UP TO A TOTAL OF 8 SECTORS. WHEN
4203 ;TESTING FOR FNAME MATCH, '?' FNAME
4204 ;CHARS WILL ALWAYS MATCH THE CORESPONDING 
4205 ;DIR FILENAME CHAR. IF A MATCH IS FOUND
4206 ;CDIRS CONTAINS THE RELATIVE DIRECTORY SECTOR 
4207 ;NUMBER (0-7) AND CDIRD (AND THE Y REG)
4208 ;CONTAINS THE DISPLACEMENT OF THE ENTRY.
4209 ;AFTER A MATCH HAS BEEN FOUND, THE DIRECTORY CAN
4210 ;BE SEARCHED FOR ANOTHER MATCH VIA THE CSFDIR 
4211 ;ENTRY POINT. IF A MATCH HAS NOT BEEN FOUND 
4212 ;THEN DHOLES AND DHOLED WILL POINT TO A
4213 ;DIRECTORY HOLE THAT CAN BE USED.
4214 ;IF DHOLED = FF THEN THE DIRECTORY IS FULL.
4215 ;THE CARRY IS RETURNED CLEAR IF FILE FOUND, 
4216 ;SET IF FILE NOT FOUND.
4217 ;-------------------------------------------------------------------------
4218 SFDIR
4219     LDA #$FF                  ;INIT TO -1
4220     STA DHOLES                ;DIR HOLE SECTOR
4221     STA CDIRS                 ;CUR DIR SECTOR
4222     STA SFNUM                 ;FILE NUMBER
4223     LDA #$70                  ;INIT TO -16 (-ENTRY LENGTH)
4224     STA CDIRD                 ;CUR DIR DISPL
4225 ;-------------------------------------------------------------------------
4226 CSFDIR
4227     INC SFNUM
4228     CLC 
4229     LDA CDIRD                 ;CDIRD=CDIRD+ENTRY LEN
4230     ADC #DFDELN
4231     BPL SFD2                  ;IF RESULT <128 THEN BR
4232 ;ELSE AT END OF DIR SECT
4233     INC CDIRS                 ;INC TO NEXT DIR SECTOR
4234     LDA #8                    ;TEST END OF DIR
4235     CMP CDIRS
4236     BCC SFD1                  ;BR NOT END
4237     BEQ SDRTN
4238 ;-------------------------------------------------------------------------
4239 SFD1 JSR RDDIR                ;READ THE NEXT DIR RECORD
4240     LDA #0                    ;SET DIR DISPL = 0
4241 ;-------------------------------------------------------------------------
4242 SFD2 STA CDIRD                ;SET NEW DIR DISPL
4243     TAY                       ;PUT DISPL IN Y AS INDEX
4244 ;-------------------------------------------------------------------------
4245     LDA FILDIR+DFDFL1,Y ;GET FLAG 1
4246     BEQ SFDSH                 ;BR IF UNUSED (END OF USED ENTRIES)
4247     BMI SFDSH                 ;BR IF DELETED
4248     AND #DFDOUT               ;IF OPEN OUTPUT
4249     BNE CSFDIR                ;DON'T FIND IT
4250 ;-------------------------------------------------------------------------
4251 ;ENTRY IN USE, TEST FOR MATCH
4252     LDX #0                    ;TEST MATCH ON 12 CHARS
4253 SFD3 LDA FNAME,X              ;FILE NAME CHAR
4254     CMP #'?                   ;IS FNC WILD CARD
4255     BEQ SFD4                  ;THEN IT MATCHES
4256     CMP FILDIR+DFDPFN,Y       ;ELSE IT MUST MATCH FO
4257     BNE CSFDIR                ;IF NOT MATCH THEN TRY NEXT
4258 SFD4 INX                      ;INC CHAR CNT
4259     INY 
4260     CPX #11                   ;TEST ALL
4261     BNE SFD3                  ;AND CONTINUE CHECK
4262 ;-------------------------------------------------------------------------
4263     CLC                       ;WE HAVE A MATCH
4264     BCC SDRTN
4265 ;-------------------------------------------------------------------------
4266 SFDSH
4267     LDA DHOLES                ;IF DHOLES NOT MINUS
4268     BPL SFDSH1                ;THEN ALREADY HAVE A GOOD HO
4269 ;-------------------------------------------------------------------------
4270 ;ELSE
4271 ;
4272     LDA CDIRS                 ;MOVE CURR DISPL SECTOR
4273     STA DHOLES                ;AND CURRENT DIR DISPL
4274     LDA CDIRD                 ;TO HOLE SECTOR AND DISPL
4275     STA DHOLED
4276     LDA SFNUM                 ;SAVE HOLE
4277     STA DHFNUM                ;FILE NUMBER
4278 ;
4279 SFDSH1 LDA FILDIR+DFDFL1,Y    ;IF HOLE WAS A DELETED
4280     BMI CSFDIR                ;ENTRY THEN CONTINUE
4281 ;-------------------------------------------------------------------------
4282 ;ELSE WE ARE AT END OF
4283 ;
4284     SEC                       ;USED ENTRIES THUS FILE NOT FOUND
4285 SDRTN LDX CURFCB              ;RESTORE X REG
4286     RTS 
4287     .PAGE "WRITE DATA SECTOR"
4288 ;-------------------------------------------------------------------------
4289 ;WRTNXS - WRITE NEXT SECTOR
4290 ;-------------------------------------------------------------------------
4291 WRTNXS
4292     LDA FCBFLG,X              ;IF ACQUIRING SECTORS
4293     BMI WRTN1                 ;THEN NOT UPDATE
4294 ;-------------------------------------------------------------------------
4295     ASL A                     ;IF SECTOR NOT MODIFIED
4296     BPL WRU1                  ;THEN DON'T IT
4297 ;-------------------------------------------------------------------------
4298     ASL A
4299     STA FCBFLG,X              ;TURN OFF FLAG BITS
4300     JSR WRCSIO                ;WRITE CURRENT SECTOR
4301     BMI WRNERR                ;BR IF BAD I/O
4302 WRU1 JMP RDNXTS               ;ELSE READ NEXT SECTOR
4303 ;-------------------------------------------------------------------------
4304 WRTN1 JSR GETSECTOR           ;GET A NEW SECTOR
4305 ;-------------------------------------------------------------------------
4306 WRTLSEC LDA FCBDLN,X          ;GET DATA LEN
4307 WRTLS1 LDY DRVLBT             ;INTO LAST BYTE
4308     STA (ZSBA),Y              ;OF SECTOR
4309 ;-------------------------------------------------------------------------
4310 WRTN2 LDA FCBLSN+1,X          ;MOVE LINK SECTOR
4311     ORA FCBFNO,X              ;PLUS FILE NUM
4312     LDY DRVMDL                ;TO BYTES 126,127
4313     STA (ZSBA),Y              ;OF SECTOR BUFF
4314     INY 
4315     LDA FCBLSN,X
4316     STA (ZSBA),Y
4317 ;-------------------------------------------------------------------------
4318     JSR WRCSIO                ;WRITE SECTOR
4319     BPL WRTN5                 ;BR NOT ERROR
4320 ;-------------------------------------------------------------------------
4321 WRNERR LDA DCBSTA             ;SAVE ERROR STATUS
4322     STA TEMP4
4323     LDA #0                    ;CLOSE FILE
4324     STA FCBOTC,X
4325     LDA TEMP4                 ;RECOVER ERROR CODE
4326     JMP RETURN
4327 ;-------------------------------------------------------------------------
4328 WRTN5
4329     INC FCBCNT,X              ;INC SECTOR CNT
4330     BNE WRTN6
4331     INC FCBCNT+1,X
4332 WRTN6
4333     JSR MVLSN                 ;LINK TO CUR
4334     LDA #0
4335     STA FCBLSN,X              ;LINK= 0
4336     STA FCBLSN+1,X
4337     STA FCBDLN,X              ;DLN = 0
4338     LDA DRVMDL
4339     STA FCBMLN,X
4340 WRNRTS
4341     CLC 
4342     RTS 
4343 ;-------------------------------------------------------------------------
4344 WRCSIO SEC                    ;WRITE CUR SECTOR
4345 RWCSIO LDA FCBCSN+1,X
4346     LDY FCBCSN,X
4347     JMP DSIO
4348 ;-------------------------------------------------------------------------
4349 MVLSN LDA FCBLSN,X            ;MOVE LINK
4350     STA FCBCSN,X
4351     LDA FCBLSN+1,X
4352     STA FCBCSN+1,X
4353     RTS 
4354 ;-------------------------------------------------------------------------
5000     .PAGE "READ DATA SECTOR"
5001 ;=========================================================================
5002 ;RDNXTS - READ NEXT SECTOR
5003 ;=========================================================================
5004 RDNXTS
5005     LDA FCBFLG,X              ;IF NOT UPD MODE
5006     BEQ RDNSO                 ;BR
5007     JMP WRTNXS                ;ELSE WRITE FIRST
5008 RDNSO = *
5009     LDA FCBLSN,X              ;IF LSN NOT
5010     ORA FCBLSN+1,X            ;ZERO
5011     BNE RDNS1                 ;BR
5012     SEC                       ;ELSE EOF
5013     RTS 
5014 RDNS1 JSR MVLSN               ;MOVE LINK TO CURRENT
5015     CLC                       ;READ
5016     JSR RWCSIO                ;CURRENT SECTOR
5017     BMI RDIOER                ;BR IF OK READ
5018 ;=========================================================================
5019 ;ELSE GOTO I/O ERROR
5020 ;=========================================================================
5021     LDY DRVMDL
5022     LDA (ZSBA),Y              ;TEST FOR SAME
5023     AND #$FC                  ;FILE NO
5024     CMP FCBFNO,X
5025     BNE RDFNMM                ;IF NOT THEN ERROR
5026 ;-------------------------------------------------------------------------
5027     LDA (ZSBA),Y              ;MOVE LINK SECTOR
5028     AND #$03
5029     STA FCBLSN+1,X
5030     INY 
5031     LDA (ZSBA),Y
5032     STA FCBLSN,X
5033 ;.........................................................................
5034     INY                       ;INC TO LEN BYTE
5035     LDA (ZSBA),Y              ;GET LEN BYTE
5036     PHA                       ;SAVE IT
5037     LDA FCBSLT,X              ;GET SECTOR LEN TYPE
5038     BNE RDNS3                 ;BR IF NEW TYPE
5039 ;-------------------------------------------------------------------------
5040     PLA                       ;GET LEN
5041     BMI RDNS2                 ;BR IF OLD SHORT SECTOR
5042     LDA #125                  ;ELSE SET FULL SECTOR
5043 RDNS2 AND #$7F                ;TURN OFF MSB
5044     PHA                       ;BALANCE STACK
5045 ;-------------------------------------------------------------------------
5046 RDNS3 PLA 
5047     STA FCBMLN,X              ;SET MAX LEN
5048 ;-------------------------------------------------------------------------
5049     LDA #0                    ;SET CUR DATA LEN = 0
5050     STA FCBDLN,X
5051     CLC 
5052     RTS 
5053 RDIOER JSR ERRIO              ;1/0 ERROR
5054 RDFNMM = *                    ;FILE NUMBER MISMATCH
5055     LDA ICCOM,X
5056     CMP #$21                  ;WAS THIS DELETE
5057     BEQ RDDELE                ;BR IF DELETE
5058     JSR ERFNMM                ;BR NOT DELETE
5059 RDDELE SEC                    ;INDICATE EOF TO DELETE
5060     RTS 
5061 ;-------------------------------------------------------------------------
5062     .PAGE "READ/WRITE DIR"
5063 ;=========================================================================
5064 ;RDDIR/WRDIR READ/WRITE DIRECTORY
5065 ;=========================================================================
5066 RDDIR CLC                     ;SET READ
5067     BCC DIRIO
5068 ;-------------------------------------------------------------------------
5069 WRTDIR SEC                    ;SET WRITE
5070 ;-------------------------------------------------------------------------
5071 DIRIO PHP                     ;SAVE READ WRITE
5072     LDA #FILDIR/256           ;MOVE BUF ADDR
5073     STA DCBBUF+1              ;TO DCB
5074     LDA #FILDIR&255
5075     STA DCBBUF
5076 ;.........................................................................
5077     CLC 
5078     LDA CDIRS                 ;CDIRS+
5079     ADC #$69                  ;(40*18)/2)+1
5080     TAY                       ;INTO A,Y
5081     LDA #1                    ;IS DIR SECTOR NUMBER
5082     ADC #0
5083 ;-------------------------------------------------------------------------
5084     JMP DSYSIO                ;GO DO SYSTEM I/O
5085 ;-------------------------------------------------------------------------
5086     .PAGE "READ/WRITE VTOC"
5087 ;=========================================================================
5088 ;RDVTOC/WRCTOC - READ/WRITE VTOC
5089 ;=========================================================================
5090 RDVTOC
5091     LDY #DVDWRQ               ;IF WRITE REOD
5092     LDA (ZDRVA),Y
5093     BEQ RDVGO
5094     RTS 
5095 RDVGO CLC                     ;SET READ
5096     BCC VTIO
5097 ;-------------------------------------------------------------------------
5098 WRTVTOC
5099 WRVTOC LDY #DVDWRQ            ;TURN OFF
5100     LDA #0                    ;WRITE READ
5101     STA (ZDRVA),Y
5102     SEC
5103 ;
5104 ;-------------------------------------------------------------------------
5105 VTIO PHP                      ;SAVE R/W
5106     LDA ZDRVA+1               ;MOVE BUF ADDR
5107     STA DCBBUF+1              ;TO DCB
5108     LDA ZDRVA
5109     STA DCBBUF
5110 ;.........................................................................
5111     LDY #$68                  ;READ SECTOR
5112     LDA #1                    ;(40 * 18 ) /2
5113 ;-------------------------------------------------------------------------
5114 DSYSIO
5115     PLP 
5116 DSYSIA
5117     LDX DRVTYP                ;LOAD DRIVE TYPE
5118     JSR BSIO                  ;GO DO I/O
5119     BMI DSIOER                ;BR IF ERROR
5120     RTS                       ;RETURN
5121 ;
5122 ;-------------------------------------------------------------------------
5123 DSIOER CMP #DCBDER            ;WAS IT DATA ERROR
5124     BEQ DEAD                  ;BR IF WAS
5125     JMP ERRIO                 ;ELSE USER PROBLEM
5126 ;-------------------------------------------------------------------------
5127 DEAD JMP ERRSYS               ;FATAL ERROR
5128 ;-------------------------------------------------------------------------
5129 ;OPEN VTOC
5130 ;-------------------------------------------------------------------------
5131 OPVTOC
5132     JSR RDVTOC                ;READ IT
5133     JMP WRTVTOC               ;THEN WRITE IT
5134 ;-------------------------------------------------------------------------
5135 ;INSURES NOT PROTECTED
5136 ;-------------------------------------------------------------------------
5137     .PAGE "FREE SECTOR"
5138 ;=========================================================================
5139 ;FRESECT - FREE CURRENT SECTOR
5141 FRESECT
5142     LDA FCBCSN,X
5143     ORA FCBCSN+1,X
5144     BEQ FSRTS
5145     LDA #0
5146     LDY #3                    ;DIVIDE SECTOR #
5147 FS1 LSR FCBCSN+1,X            ;BY 3 TO GET BYTE NO
5148     ROR FCBCSN,X              ;WITH REM IN ACU
5149     ROR A
5150     DEY 
5151     BNE FS1
5152 ;-------------------------------------------------------------------------
5153     LDY #5
5154 FS2 ROR A                     ;TO FOR BYT BIT NO
5155     DEY 
5156     BNE FS2
5157 ;-------------------------------------------------------------------------
5158     TAY                       ;BIT NO (0-7) INTO Y
5159     LDA #0
5160     SEC                       ;SHIFT IN' A BIT
5161 FS3 ROR A                     ;TO PROPER LOCATION
5162     DEY 
5163     BPL FS3
5164     PHA                       ;SAVE MASK
5165     LDA FCBCSN,X              ;GET BYTE NO
5166     ADC #DVDSMP               ;ADD OFFSET TO SMAP
5167     TAY                       ;RESULT IS VTOC INDEX
5168 ;.........................................................................
5169     PLA                       ;GET BIT MASK
5170     ORA (ZDRVA),Y             ;OF BIT TO BIT MAP
5171     STA (ZDRVA),Y             ;AND SET RESULTS
5172 ;.........................................................................
5173     LDY #DVDNSA               ;INC NO OF SECTORS AVAIL
5174     LDA (ZDRVA),Y
5175     CLC 
5176     ADC #1
5177     STA (ZDRVA),Y
5178     INY 
5179     LDA (ZDRVA),Y
5180     ADC #0
5181     STA (ZDRVA),Y
5182 ;-------------------------------------------------------------------------
5183 FSRTS = *
5184     RTS 
5185 ;-------------------------------------------------------------------------
5186     .PAGE "GET SECTOR"
5188 ;=========================================================================
5189 ;GET SECTOR - GET A FREE SECTOR FOR USE IN FCB AT X REG.
5190 ;=========================================================================
5191 ;THE SECTOR NUMBER IS PLACED IN FCBLSN
5192 ;THE SEARCH FOR A FREE SECTOR STARTS
5193 ;AT THE DVDSMP BYTE. SECTORS ARE
5194 ;NUMBERED SEQUENTIALLY FROM ZERO TO
5195 ;MAXSM WITH THE LEFT BIT OF THE DVDSMP
5196 ;BEING WITH ZERO.
5197 ;-------------------------------------------------------------------------
5198 GETSECTOR
5199     LDY #DVDSMP-1             ;SET Y TO START MAP-l
5200 ;-------------------------------------------------------------------------
5201 GS1 INY                       ;INC SMAP INDEX
5202     CPY #90+DVDSMP            ;AT END OF MAP?
5203     BCS GSERR                 ;BR IF AT END
5204     LDA (ZDRVA),Y             ;GET A MAP BYTE
5205     BEQ GS1                   ;BR NO FREE SECTOR IN BYTE
5206 ;-------------------------------------------------------------------------
5207     STY TEMP1                 ;SAVE MAP INDEX
5208     PHA                       ;DEC NO OF SECTORS AVAIL
5209     SEC
5210     LDY #DVDNSA
5211     LDA (ZDRVA),Y
5212     SBC #1
5213     STA (ZDRVA),Y
5214     INY 
5215     LDA (ZDRVA),Y
5216     SBC #0
5217     STA (ZDRVA),Y
5218 ;.........................................................................
5219     INY                       ;SET READ REQD
5220     LDA #$FF
5221     STA (ZDRVA),Y
5222 ;.........................................................................
5223     PLA 
5224     LDY #$FF                  ;SET BIT COUNTER =-1
5225 ;-------------------------------------------------------------------------
5226 GS2 INY                       ;SHIFT MAP BYTE
5227     ASL A                     ;UNTIL A FREE SECTOR
5228     BCC GS2                   ;FOUND
5229     STY TEMP2                 ;SAVE BIT NUMBER
5230 GS3 LSR A                     ;AND SHIFT BYTE
5231     DEY                       ;BACKS TO ITS ORIGINAL
5232     BPL GS3                   ;POSITION AND PUT IT
5233     LDY TEMP1                 ;BACK INTO THE MAP
5234     STA (ZDRVA),Y
5235 ;
5236 ;-------------------------------------------------------------------------
5237     SEC                       ;SECTOR NAP BYTE
5238     LDA TEMP1                 ;=DISPL-DVDSMP
5239     SBC #DVDSMP
5240 ;.........................................................................
5241     LDY #0
5242     STY TEMP1                 ;CLEAR SECT NO HI
5243 ;-------------------------------------------------------------------------
5244 GS4 ASL A                     ;MULT REL SECTOR MAP
5245     ROL TEMP1
5246     INY 
5247     CPY #3
5248     BCC GS4
5249 ;.........................................................................
5250     CLC 
5251     ADC TEMP2                 ;ADD BIT NO TO
5252     STA FCBLSN,X              ;SECTOR #
5253     LDA TEMP1                 ;AND PUT INTO
5254     ADC #0                    ;FCBLSN
5255     STA FCBLSN+1,X
5256 ;-------------------------------------------------------------------------
5257     RTS 
5258 ;-------------------------------------------------------------------------
5259 GSERR JMP ERRNSA              ;NO SECTOR AVAIL
5260 ;-------------------------------------------------------------------------
5261     .PAGE "SETUP ROUTINE"
5262 ;=========================================================================
5263 ;SETUP - A ROUTINE USED FOR ALL COMMANDS 
5264 ;=========================================================================
5265 ;TO SET UP FMS CONTROL CELLS TO ACCESS A PARTICULAR FILE.
5266 ;-------------------------------------------------------------------------
5267 SETUP
5268     LDA #$9F                  ;INIT ERROR CODE
5269     STA ERRNO                 ;TO ZERO
5270     STX CURFCB                ;SAVE FCB
5271 ;.........................................................................
5272     TSX 
5273     INX 
5274     INX 
5275     STX ENTSTK
5276 ;.........................................................................
5277     LDX CURFCB                ;GET CURRENT FCB
5278     LDY ICDNOZ                ;MOVE DRIVE NO
5279     STY DCBDRV                ;TO DCB
5280     DEY                       ;DEC FOR ACCESS TO TABLES
5281     LDA DBUFAL,Y              ;MOVE WRITE BUFFER
5282     STA ZDRVA                 ;ADD TO ZERO PAGE PTR
5283     LDA DBUFAH,Y
5284     STA ZDRVA+1
5285 ;.........................................................................
5286     LDA DRVTBL,Y              ;GET DRIVE TYPE
5287     BEQ DERR1                 ;BR IF NOT EXISTS
5288     STA DRVTYP                ;SAVE TYPE
5289 ;.........................................................................
5290     TAY                       ;MOVE MAX DATA LEN
5291     LDA DRVMDL,Y              ;AND LAST SECTOR BYTE
5292     STA DRVMDL                ;DISPL TO LAST OF
5293     LDA DRVLBT,Y              ;TABLES
5294     STA DRVLBT
5295 ;.........................................................................
5296     LDY FCBBUF,X              ;GET SECTOR BUF #
5297     DEY                       ;DEC TO ACCESS TBL
5298     BPL SSBA                  ;BR IF ONE IS ALLOCATED
5299 ;.........................................................................
5300     LDY #0                    ;IF NON ALLOCATED
5301 GSB1 LDA SECTBL,Y             ;TRY TO FIND ONE
5302     BEQ GSB4                  ;BR ONE FOUND
5303 GSB2 INY                      ;DEC TRY COUNT
5304     CPY #16
5305     BCC GSB1                  ;BR MORE TO TRY
5306 ;-------------------------------------------------------------------------
5307 GSB3 JMP ERRNSB               ;NO SECTOR BUFFERS AVAIL
5308 ;-------------------------------------------------------------------------
5309 GSB4 LDA DRVTYP               ;FOUND ONE IF 256 BYTES
5310     LSR A                     ;DRIVE NEEDED TO CONT
5311     BCS GSB5                  ;BR NOT 256 BYTES
5312     INY                       ;ELSE TRY NEXT CONTIG
5313     CPY #16                   ;TEST END OF BUFFERS
5314     BCS GSB3                  ;AND BR IF NO MORE
5315     LDA SECTBL,Y              ;ELSE SEE IF ITS THREE
5316     BNE GSB2                  ;BR NOT FREE
5317     DEY 
5318 ;.........................................................................
5319     LDA #$80                  ;ALLOCATE SECOND OF 2
5320     STA SECTBL+1,Y
5321 ;-------------------------------------------------------------------------
5322 GSB5 LDA #$80                 ;ALLOCATE FIRST OR ONLY
5323     STA SECTBL,Y
5324     TYA 
5325     STA FCBBUF,X              ;PUT BUF NO INTO FCB
5326     INC FCBBUF,X              ;INC BUF NO SO NOT ZERO
5327 ;-------------------------------------------------------------------------
5328 SSBA LDA SABUFL,Y             ;MOVE BUFFER ADDR
5329     STA ZSBA                  ;TO ZERO PAGE PTR
5330     LDA SABUFH,Y
5331     STA ZSBA+1
5332 ;
5333 ;-------------------------------------------------------------------------
5334     RTS 
5335 ;-------------------------------------------------------------------------
5336 DERR1 JMP ERRDNO ;BAD DRIVE NO
5337     .PAGE 
5338 ;=========================================================================
5339 ;FREE SECTOR BUFFERS
5340 ;=========================================================================
5341 FRESBUF = 7
5342     LDY FCBBUF,X              ;GET BUF NO
5343     BEQ FSBR                  ;BR IF NONE
5344     DEY                       ;DEC FOR TBL ACCESS
5345     LDA #0                    ;FREE
5346     STA FCBBUF,X              ;IN FCR
5347     STA SECTBL,Y              ;AND TABLE
5348     LDA DRVTYP                ;IF 128 BYTES
5349     LSR A                     ;DRIVE
5350     BCS FSBR                  ;FREE ONLY ONE
5351     LSR A                     ;ELSE
5352     STA SECTBL+1,Y            ;FREE 2
5353 FSBR RTS 
5354 ;-------------------------------------------------------------------------
5355     .PAGE "DATA SECTOR I/O"
5356 ;=========================================================================
5357 ;DSIO - DATA SECTOR I/O
5358 ;=========================================================================
5359 DSIO
5360     PHA                       ;SAVE ACU DATA
5361     LDA ZSBA                  ;WRITE SECTOR BUF
5362     STA DCBBUF                ;ADR MOVED TO
5363     LDA ZSBA+1                ;DCB
5364     STA DCBBUF+1
5365     PLA                       ;RESTORE ACU
5366 ;-------------------------------------------------------------------------
5367     LDX DRVTYP
5368     JSR BSIO                  ;DO THE I/O
5369     RTS 
5370 ;-------------------------------------------------------------------------
5371     .PAGE "WRITE DOS"
5372 ;=========================================================================
5373 ;WRTDOS - WRITE DOS TO DISK
5374 ;=========================================================================
5375 WRTDOS
5376     LDY FCBCSN,X              ;MOVE START ADDR
5377     LDA FCBCSN+1,X
5378     JSR SETDSO                ;WRITE SECTOR 0
5379     JSR WD0                   ;WRITE DOS
5380     JMP GREAT
5381 ;-------------------------------------------------------------------------
5382 DELDOS
5383     LDA #0                    ;SET FILE NOT EXISTS
5384 DD1
5385     STA DFSFLG
5386 ;-------------------------------------------------------------------------
5387 WRTSCO
5388     LDA #FMSORG/256           ;MOVE FMS START
5389     STA DCBBUF+1              ;ADDR TO DCB
5390     LDA #FMSORG&255
5391     STA DCBBUF
5392 ;.........................................................................
5393     LDA #0                    ;CLEAR SECTOR NO TO ZERO
5394     STA DCBSEC
5395     STA DCBSEC+1
5396 ;-------------------------------------------------------------------------
5397 WRNBS INC DCBSEC              ;INC SECTOR NO
5398     LDX #1                    ;GET DRIVE TYPE
5399     SEC 
5400     JSR BSIOR                 ;DO THE WRITE
5401 ;
5402 ;.........................................................................
5403     CLC 
5404     LDA DCBBUF                ;INC SECT ADDR
5405     ADC #128
5406     STA DCBBUF
5407     LDA DCBBUF+1
5408     ADC #0
5409     STA DCBBUF+1
5410 ;.........................................................................
5411     LDA DCBSEC                ;TEST FOR WRITE
5412     CMP BRCNT                 ;OF ALL BOOT SECTORS
5413     BNE WRNBS                 ;BR NOT ALL
5414 ;-------------------------------------------------------------------------
5415     RTS 
5416 ;-------------------------------------------------------------------------
5417 SETDSO STY DFLINK             ;SET LINK START
5418     STA DFLINK+1
5419     LDA DRVTYP
5420     STA DFSFLG
5421     LDY DRVMDL
5422     STY BLDISP
5423     BNE DD1                   ;GO WRITE SECTOR 0
5424 ;-------------------------------------------------------------------------
5425     .PAGE 
5426 WD0 LDA DFLADR                ;MOVE FILE START ADDR
5427     STA ZBUFP                 ;TO ZBUFP
5428     LDA DFLADR+1
5429     STA ZBUFP+1
5430 ;-------------------------------------------------------------------------
5431 WD1 LDY #0                    ;MOVE 125
5432 WD2 LDA (ZBUFP),Y             ;BYTES OF DOS
5433     STA (ZSBA),Y              ;TO SECTOR BUFFER
5434     INY 
5435     CPY DRVMDL
5436     BCC WD2
5437     TYA 
5438     STA FCBDLN,X              ;SET DATA LEN
5439 ;.........................................................................
5440     JSR INCBA                 ;INC ZBUFP BY 125
5441     CMP SASA+1                ;IF NOT END OR
5442     BCC WD3                   ;PAST END OF DOS
5443     BNE WD4                   ;THEN WRTNXS
5444     LDA ZBUFP                 ;ELSE
5445     CMP SASA                  ;DONE
5446     BCC WD3
5447     BNE WD4
5448 ;-------------------------------------------------------------------------
5449 WD3 JSR WRTNXS                ;WRITE NEXT SECTOR
5450     JMP WD1
5451 ;-------------------------------------------------------------------------
5452 WD4 RTS                       ;RETURN, CLOSE WILL WRITE FINAL SECTOR
5453 ;AND RETURN
5454 ;-------------------------------------------------------------------------
5455     .PAGE "TEST DOS FILE NAME"
5456 ;=========================================================================
5457 ;TSTDOS - TEST FOR DOS SYS FILE NAME;
5458 ;=========================================================================
5459 TSTDOS
5460     LDY #11                   ;LOOK AT 12 CHARS
5461 TDF1 LDA FNAME-1,Y            ;TEST DECODE FILENAME CHAR
5462     CMP DFN-1,Y               ;WITH DOS FILENAME CHAR
5463     BNE TDFR                  ;BR NOT MATCH
5464     DEY 
5465     BNE TDF1                  ;BR IF MORE, ELSE RTN EQ
5466 TDFR RTS 
5467 ;-------------------------------------------------------------------------
5468 DFN .BYTE "DOS     SYS "
5469 ;=========================================================================
5470 ;ERROR ROUTINES
5471 ;=========================================================================
5472 ERDBAD INC ERRNO              ;BAD SECTOR AT FORMAT TIME
5473 ERAPO INC ERRNO               ;ATTEMPT APPEND TO OLD TYPE FILE
5474 ERRPOT INC ERRNO              ;POINT INVALID
5475 ERFNF INC ERRNO               ;FILE NOT FOUND
5476 ERDFULL INC ERRNO             ;DIRECTORY FULL
5477 ERDVDC INC ERRNO              ;DEVICE COMMAND INVALID
5478 ERFLOCK INC ERRNO             ;FILE LOCKED
5479 ERRPDL INC ERRNO              ;POINT DATA LENGTH
5480 ERRFN INC ERRNO               ;FILE NAME ERROR
5481 ERFNMM INC ERRNO              ;FILE NUMBER MISMATCH
5482 ERRSYS INC ERRNO              ;FATAL SYS DATA I/O ERROR
5483 ERRNSA INC ERRNO              ;NO SECTOR AVAIL
5484 ERRNSB INC ERRNO              ;NO SECTOR BUFFERS AVAIL
5485 ERRDNO INC ERRNO              ;DRIVE NO ERROR
5486 ;-------------------------------------------------------------------------
5487     LDA ERRNO                 ;GET ERROR NUMBER
5488 RETURN LDX CURFCB             ;GET CUR FCB NO
5489     STA ICSTA,X               ;PUT IN FCB
5490     LDX ENTSTK                ;GET ENTRY STACK PTR
5491     TXS                       ;AND RESTORE
5492     LDX CURFCB
5493     TAY 
5494     LDA SVDBYT                ;GET SAVED DATA BYTE
5495     RTS 
5496 ;-------------------------------------------------------------------------
5497 ERRIO LDA DCBSTA              ;GET I/O ERROR CODE
5498     BMI RETURN
5499 ;-------------------------------------------------------------------------
5500 FGREAT LDX CURFCB
5501     JSR FRESBUF               ;FREE SECTOR BUFFER
5502 GREAT LDA #1                  ;SET ALL OK
5503     BNE RETURN
5504 ERREOF LDA #$88               ;SET EOF CODE
5505     BMI RETURN
5506 ;-------------------------------------------------------------------------
5507     .PAGE "MISC STORAGE"
5508 ;=========================================================================
5509 ;MISC NON-ZERO-PAGE STORAGE AREA
5510 ;=========================================================================
5511 DRVMDL .BYTE 0                ;MAX DATA LEN
5512     .BYTE 125                 ;128 BYTE SECTOR
5513     .BYTE 253                 ;256 BYTE SECTOR
5514 ;-------------------------------------------------------------------------
5515 DRVLBT .BYTE 0                ;DISPL TO LAST SECTOR BYTE
5516     .BYTE 127                 ;128 BYTE SECTOR
5517     .BYTE 255                 ;256 BYTE SECTOR
5518 DRVTYP *= *+1                 ;DRIVE TYPE
5519 RETRY *= *+1                  ;1/0 RETRY COUNTER
5520 ENTSTK *= *+1                 ;ENTRY STACK LEVEL
5521 CURFCB *= *+1                 ;CURRENT FCB (IOCB ALSO)
5522 DHOLES *= *+1                 ;DIR HOLE SECTOR
5523 DHOLED *= *+1                 ;DIR HOLE DISPL
5524 DHFNUM *= *+1                 ;DIR HOLE FILE NO
5525 CDIRD *= *+1                  ;CURRENT DIR DISPL
5526 CDIRS *= *+1                  ;CURRENT DIR SECTOR
5527 SFNUM *= *+1                  ;FILE NUMBER
5528 SVDBYT *= *+1                 ;SAVED OUTPUT DATA BYTE
5529 SVD1 *= *+1                   ;SAVE DATA BYTES
5530 SVD2 *= *+1                   ;FOR WRITE BURST
5531 SVD3 *= *+1
5532 EXTSW
5533 TEMP1 *= *+1                  ;TEMP1
5534 TEMP2 *= *+1                  ;TEMP2
5535 TEMP3 *= *+1                  ;TEMP3
5536 TEMP4 *= *+1                  ;TEMP4
5537 BURTYP *= *+1                 ;BURST I/O TYPE
5538 ;.........................................................................
5539 DRVTBL *= *+8                 ;DRIVE TABLE
5540 SECTBL *= *+16
5541 DBUFAL *= *+8                 ;VTOC BUFFER
5542 DBUFAH *= *+8                 ;PTR FOR DRIVE N
5543 SABUFL *= *+16                ;SECTOR BUFFER
5544 SABUFH *= *+16                ;FOR SECTOR N
5545 FNAME *= *+12                 ;FILE NAME
5546 AFNAME *= *+12                ;AUXILLARY FILE NAME
5547 ;.........................................................................
5548 MDRV *= *+1                   ;MAX DR NO
5549 ;.........................................................................
5550 Z   =   *                     ;PUT ON SAME BOUNDRY AS PRODUCTION
5551     *=  $1381                 ;VERSION
5552     .PAGE "FILE CONTROL BLOCKS"
5553 ;=========================================================================
5554 ;FILE CONTROL BLOCK
5555 ;=========================================================================
5556 ;ONE FILE CONTROL BLOCK IS USED FOR EACH OPEN FILE. 
5557 ;THE RELATIVE FCB USED RELATES DIRECTLY TO THE IOCB #
5558 ;THAT OPENED THE FILE. THUS THERE ARE 8 FCBS.
5559 ;  
5560 ;THE FCB ARE (CONVIENTLY) THE SAME SIZE AS IOCBS. 
5561 ;EACH FCB CONTAINS ALL THE INFORMATION REQUIRED
5562 ;TO CONTROL THE PROCESSING ON AN OPEN FILE
5563 ;-------------------------------------------------------------------------
5564 ;
5565 FCB
5566 FCBFNO *= *+1                 ;FILE # LEFT JUSTIFIED
5567 FCBOTC *= *+1                 ;OPEN TYPE CODE
5568     *=  *+1                   ;SPARE
5569 FCBSLT *= *+1                 ;FLAG FOR NEW SECTOR LEN TYPE
5570 FCBFLG *= *+1                 ;WORKING FLAG
5571 FCBMLN *= *+1                 ;MAX SECTOR DATA LEN
5572 FCBDLN *= *+1                 ;CUR SECTOR BUF DATA LEN
5573 FCBBUF *= *+1                 ;SECTOR BUF NO
5574 FCBCSN *= *+2                 ;CUR SECTOR #
5575 FCBLSN *= *+2                 ;LINK/ALLOCATE SECTOR #
5576 FCBSSN *= *+2                 ;CUR FILE RELATIVE SECTOR #
5577 FCBCRS
5578 FCBCNT *= *+2                 ;SECTOR COUNT
5579 FCBLEN = *-FCB                ;FCB LEN
5580 ;-------------------------------------------------------------------------
5581     *=  FCBLEN*7+* ;ALLOCATE 7 MORE FCBS 
5582 ;-------------------------------------------------------------------------
5583 ;OPEN CODE BITS
5584 ;USED IN IOCB AUX1
5585 ;- AND FCBOTC
5586 ;-------------------------------------------------------------------------
5587 OPIN =  $04                   ;INPUT
5588 OPOUT = $08                   ;OUTPUT
5589 OPDIR = $02                   ;LIST DIRECTORY
5590 OPAPND = $01                  ;APPEND
5591 ;-------------------------------------------------------------------------
5592 FCBFAS = $80                  ;FCBFLG - ACQ SECTORS
5593 FCBFSM = $40                  ;FCBFLG - SECTOR MODIFIED
5594     .PAGE "FILE DIRECTORY"
5595 ;=========================================================================
5596 ;DISK FILE DIRECTORY
5597 ;=========================================================================
5598 ;THE FILE DIRECTORY OCCUPIES 8 CONSECUTIVE 
5599 ;SECTORS STARTING AT THE CENTRAL SECTOR+1. 
5600 ;EACH FILE DIRECTORY SECTOR CONTAINS 8 ENTRIES. 
5601 ;THERE IS 1 ENTRY FOR EACH NAMED FILE.
5602 ;
5603 ;THERE ARE A TOTAL OF 64 NAMED FILES PER VOLUME
5604 ;
5605 ;THE FILE NUMBER IS USED THROUGH THE 
5606 ;THE SYSTEM IS THE RELATIVE (TO ONE)
5607 ;FILE DIRECTORY ENTRY NUMBER.
5608 ;
5609 ;THE EQUATES BELOW ARE FOR A SINCE NAMED
5610 ;FILE ENTRY
5611 ;-------------------------------------------------------------------------
5612 DFDFL1 = 0                    ;FLAG1 (1)
5613 DFDCNT = 1                    ;SECTOR COUNTER (LOW)
5614 DFDSSN = 3                    ;START SECTOR NO (2)
5615 DFDPFN = 5                    ;PRIMARY FILE NAME (8)
5616 DFDXFN = 13                   ;EXTENDED FILE NAME (4)
5617 DFDELN = 16                   ;ENTRY LENGTH
5618 ;-------------------------------------------------------------------------
5619 ;DFDFL1 VALUE EQUATES
5620 ;-------------------------------------------------------------------------
5621 DFDEUU = 0                    ;ENTRY UNUSED
5622 DFDEDE = $80                  ;ENTRY DELETED
5623 DFDINU = $40                  ;ENTRY IN USE
5624 DFDOUT = $01                  ;FILE OPEN FOR OUTPUT
5625 DFDLOC = $20                  ;ENTRY LOCKED
5626 DFDNLD = $02                  ;FILE HAS NEW TYPE SECTOR LEN BYTE
5627 ;-------------------------------------------------------------------------
5628 FILDIR *= *+256               ;RESUME FILE DIR SPACE
5629 ;-------------------------------------------------------------------------
5630     .PAGE "VOLUME DIRECTORY"
5631 ;=========================================================================
5632 ;DISK VOLUME DIRECTORY
5633 ;=========================================================================
5634 ;THE VOLUME DIRECTORY OCCUPIES THE CENTRAL VOLUME
5635 ;SECTOR. THE VOLUME DIRECTORY CONTAINS INFORMATION
5636 ;PERTAINING TO THE ENTIRE DISKETTE VOLUME.
5637 ;-------------------------------------------------------------------------
5638 ;THE LABELS BELOW, MAP THE VOLUME
5639 ;DIRECTORY SECTOR.
5640 ;-------------------------------------------------------------------------
5641 DVDTCD = 0                    ;VOLUME DIRECTORY TYEP CODE (1)
5642 ;-------------------------------------------------------------------------
5643 ;USED TO DELI NATE MAJOR (1)
5644 ;FMS SYSTEM FORMAT CHANGES
5645 ;-------------------------------------------------------------------------
5646 DVDMSN = 1                    ;MAX SECTOR NUMBER (1)
5647 DVDNSA = 3                    ;NO SECTORS AVAIL
5648 ;-------------------------------------------------------------------------
5649 DVDWRQ = 5                    ;WRITE REQUIRED
5650 DVDSMP = 10                   ;SECTOR MAP START
5651 ;-------------------------------------------------------------------------
5652 ;EACH BIT REPRESENTS A SECTOR
5653 ;IF THE BIT IS ON THEN THE SECTOR
5654 ;IS FREE AND AVAILABLE. IF THE
5655 ;BIT IS OFF, THE SECTOR IS IN
5656 ;USE OR BAD. THE MOST SIGNIFICANT
5657 ;BIT OF THE FIRST BYTE IS SECTOR ZERO.
5658     .PAGE "END OF FMS"
5659 ;-------------------------------------------------------------------------
5660 ENDFMS = *