https://atariage.com/forums/topic/221538-dos-20s-dupsys-source-code/?do=findComment&comment=3705936 FMS - 128/256 BYTE SECTOR (2.0S) --- Copyright and Author Notice --- 0000 1001 .PAGE " --- Copyright and Author Notice ---" 1002 ; 1003 ; 1004 ;COPYRIGHT (C) 1978,1979,1980,1982 1005 ;OPTIMIZED SYSTEMS SOFTWARE, 1006 ;CUPERTINO, CA. 1007 ; 1008 ;THIS PROGRAM MAY NOT BE REPRODUCED, 1009 ;STORED IN A RETRIEVAL SYSTEM, OR 1010 ;TRANSMITTED IN WHOLE OR IN PART, 1011 ;IN ANY FORM, OR BY ANY MEANS, BE IT 1012 ;ELECTRONIC, MECHANICAL, PHOTOCOPYING, 1013 ;RECORDING, OR OTHERWISE WITHOUT THE 1014 ;PRIOR WRITTEN PERMISSION OF: 1015 ; OPTIMIZED SYSTEMS SOFTWARE, INC. 1016 ; 10379 LANSDALE AVENUE 1017 ; CUPERTINO, CALIFORNIA 95014 (U.S.A.) 1018 ; 1019 ; PHONE: (408) 446-3099 1020 ; 1021 ; 1022 ;*********************************** 1023 ; 1024 ; PROGRAMMER PAUL LAUGHTON 1025 ; UPDATED: 19-AUG-80 1026 ; 1027 ;*********************************** 1028 ; System equates 0000 1029 .PAGE " System equates" 1030 ;*********************************** 1031 ; 1032 ; 1033 ; 0700 1034 FMSORG = $0700 0043 1035 FMSZPG = $43 0340 1036 IOCBORG = $0340 0003 1037 LMASK = 03 ;LINK MASK 0300 1038 DCBORG = $0300 E453 1039 DHADR = $E453 009B 1040 EOL = $9B 031A 1041 DEVTAB = $031A 0020 1042 ZICB = $20 02E7 1043 LMADR = $02E7 1540 1044 DUPINIT = $1540 ;INIT ADDR FOR DUP 0102 1045 STAK = $0102 ;STACK LOC FOR PUT BYTE 00DF 1046 OSBTM = $DF ;HI BYTE OF ADDR LESS THAN OS SPACE 0246 1047 DSKTIM = $0246 ;ADDR OF OS WORST CASE DISK TIME OUT 000F 1048 TIMOUT = 15 ;TIME OUT VALUE OF 15 SECS. IOCB 0000 1049 .PAGE " IOCB" 0000 1050 *= IOCBORG 1051 ; 1052 ; IOCB - I/O CONTROL BLOCK 1053 ; THERE ARE 8 I/O CONTROL BLOCKS 1054 ; 1 IOCB IS REQUIRED FOR EACH 1055 ; CURRENTLY OPEN DEVICE OR FILE 1056 ; 1057 IOCB 0340 1058 ICHID *= *+1 ;DEVICE NUMBER 0341 1059 ICDNO *= *+1 ;DEVICE HANDLER 0342 1060 ICCOM *= *+1 ; I/O COMMAND 0343 1061 ICSTA *= *+1 ;I/O STATUS 0344 1062 ICBAL *= *+1 0345 1063 ICBAH *= *+1 ;BUFFER ADR (H,L) 0346 1064 ICPUT *= *+2 ;PUT CHAR DH ADDR 0348 1065 ICBLL *= *+1 0349 1066 ICBLH *= *+1 ;BUFFER LEN (H,L) 034A 1067 ICAUX1 *= *+1 ;AUX 1 034B 1068 ICAUX2 *= *+1 ;AUX 2 034C 1069 ICAUX3 *= *+1 ;AUX 3 034D 1070 ICAUX4 *= *+1 ;AUX 4 034E 1071 ICAUX5 *= *+1 ;AUX 5 034F 1072 ICAUX6 *= *+1 ;AUX 6 0010 1073 ICLEN = *-IOCB 1074 ; 1075 *= *+ICLEN*7 ;SPACE FOR 7 MORE IOCB'S 1076 ; 1077 ; ICCOM VALUE EQUATES 1078 ; 0001 1079 ICOIN = $01 ;OPEN INPUT 0002 1080 ICOOUT = $02 ;OPEN OUTPUT 0003 1081 ICIO = $03 ;OPEN IN/OUT 0004 1082 ICGBR = $04 ;GET BINARY RECORD 0005 1083 ICGTR = $05 ; GET TEXT RECORD 0006 1084 ICGBC = $06 ;GET BINARY CHAR 0007 1085 ICGTC = $07 ;GET TEXT CHAR 0008 1086 ICPBR = $08 ;GET BINARY RECORD 0009 1087 ICPTR = $09 ;PUT TEXT RECORD 000A 1088 ICPBC = $0A ;PUT BINARY CHAR 000B 1089 ICPTC = $0B ;PUT TEXT CHAR 000C 1090 ICCLOSE = $0C ;CLOSE FILE 000D 1091 ICSTAT = $0D ;GET STATUS 000E 1092 ICDDC = $0E ;DEVICE DEPENDENT 000E 1093 ICMAX = $0E ;MAX VALUE 000F 1094 ICFREE = $0F ;IOCB FREE INDICATOR 1095 ; 1096 ; ICSTA VALUE EQUATES 1097 ; 0001 1098 ICSOK = $01 ;STATUS GOOD, NO ERRORS 0002 1099 ICSTR = $02 ;TRUNCATATED RECORD IOCB 0003 1100 ICSEOF = $03 ;END OF FILE 0080 1101 ICSBRK = $80 ;BREAK KEY ABORT 0081 1102 ICSDNR = $81 ;DEVICE NOT READY 0082 1103 ICSNED = $82 ;NON-EXISTENT DEVICE 0083 1104 ICSDER = $83 ;DATA ERROR 0084 1105 ICSIVC = $84 ;INVALID COMMAND 0085 1106 ICSNOP = $85 ;DEVICE/FILE NOT OPEN 0086 1107 ICSIVN = $86 ;INVALID IOCB # 0087 1108 ICSWPC = $87 ;WRITE PROTECT 1109 ; 1110 ; ZERO PAGE IOCB LABELS 1111 ; 0021 1112 ICDNOZ = ICDNO-IOCB+ZICB 0028 1113 ICBLLZ = ICBLL-IOCB+ZICB ;BUF LEN 0029 1114 ICBLHZ = ICBLH-IOCB+ZICB 0024 1115 ICBALZ = ICBAL-IOCB+ZICB ;BUF ADDR 0025 1116 ICBAHZ = ICBAH-IOCB+ZICB 0022 1117 ICCOMZ = ICCOM-IOCB+ZICB 0026 1118 ICPUTZ = ICPUT-IOCB+ZICB ;PUT RTN ADDR DCB 17A0 1119 .PAGE " DCB" 17A0 1120 *= DCBORG 1121 ; 1122 ; DCB - DATA CONTROL BLOCK 1123 ; THE DCB IS AN IOCB LIKE CONTROL 1124 ; BLOCK USED TO INTERFACE THE DISK 1125 ; FILE MANAGEMENT SYSTEM TO THE 1126 ; DISK HANDLER 1127 ; 1128 DCB 0300 1129 DCBSBI *= *+1 ;SERIAL BUS ID 0301 1130 DCBDRV *= *+1 ;DISK DRIVE # 0302 1131 DCBCMD *= *+1 ;COMMAND 0303 1132 DCBSTA *= *+1 ;I/O STATUS 0304 1133 DCBBUF *= *+2 ;I/O BUFFER ADDR (H,L) 0306 1134 DCBTO *= *+2 ;TIME OUT COUNT 0308 1135 DCBCNT *= *+2 ;I/O BYTE COUNT 030A 1136 DCBSEC *= *+2 ;I/O SECTOR NUMBER 1137 ; 1138 ; DCBCMD VALUE EQUATES 1139 ; 0052 1140 DCBCRS = 'R ;Read sector ($52) 0050 1141 DCBCWS = 'P ;Put sector ($50) 0053 1142 DCBCST = 'S ;Status request ($53) 0021 1143 DCBCFD = '! ;FORMAT DISKETTE ($21) 1144 ; 1145 ; *** SPECIAL NOTE: 1146 ; DCBCWS may be changed to 'W ($57) 1147 ; if desired to have disk perform 1148 ; a verifying read after each write. 1149 ; Disk write ('W) operations will take 1150 ; longer, but will be more reliable. 1151 ; 1152 ; 1153 ; DCBSTA VALUE EQUATES 1154 ; 0001 1155 DCBSOK = $01 ;STATUS NORMAL 0081 1156 DCBDNR = $81 ;DEVICE NOT READY 0082 1157 DCBCNR = $82 ;CONTROLLER NOT READY 0083 1158 DCBDER = $83 ;DATA ERROR 0084 1159 DCBIVC = $84 ;INVALID COMMAND 0087 1160 DCBWPR = $87 ; WRITE PROTECT ZERO PAGE 030C 1161 .PAGE " ZERO PAGE" 030C 1162 *= FMSZPG 1163 ; 0043 1164 ZBUFP *= *+2 ;BUFFER PTR 0045 1165 ZDRVA *= *+2 ;ZERO PG DRIVE PTR 0047 1166 ZSBA *= *+2 ;ZERO PG SECTOR BUF PTR 0049 1167 ERRNO *= *+1 ;ERROR NUMBER 1168 ; 1169 ; 004A 15 .INCLUDE #E: 004A 20 .INCLUDE #D:ATFMS1.SRC BOOT RECORD 004A 2000 .PAGE "BOOT RECORD" 004A 2001 *= FMSORG 2002 ; 2003 ; THE FOLLOWING BYTES ARE STORED 2004 ; ON DISK SECTOR 0 THEY COMPRISE 2005 ; THE BOOT LOAD RECORD 2006 ; 0700 00 2007 BFLG .BYTE 0 ;BOOT FLAG UNUSED=0 0701 03 2008 BRCNT .BYTE 3 ;NO.CONSECTIVE BOOT RECORDS TO READ 0702 0007 2009 BLDADR .WORD FMSORG ;BOOT LOAD ADDR 0704 4015 2010 BINTADR .WORD DUPINIT ;INIT ADDR 0706 4C1407 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 ; 0709 03 2020 SABYTE .BYTE 3 ;MAX # CONCURRENT OPEN FILES 070A 01 2021 DRVBYT .BYTE 01 ;DRIVE BITS 070B 00 2022 SAFBFW .BYTE 0 ;STORAGE ALLOCATION DIR SW 070C 0115 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 ; 070E 00 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 ; 070F 00 2035 DFLINK .BYTE 0,0 ;DOS FILE START SECTOR NUMBER 0710 00 0711 7D 2036 BLDISP .BYTE 125 ;DISPL TO SECTOR LINK 0712 CB07 2037 DFLADR .WORD DFMSDH ;ADDR START OF DOS.SYS FILE 2038 ; 0714 2039 XBCONT 0714 AC0E07 2040 LDY DFSFLG ;GET DOS FLAG 0717 F036 2041 BEQ BFAIL ;BR IF NO DOS.SYS FILE 2042 ; 0719 AD1207 2043 LDA DFLADR ;MOVE LOAD START ADDR 071C 8543 2044 STA ZBUFP ;TO ZERO PAGE PTR 071E 8D0403 2045 STA DCBBUF ; AND TO DCB 0721 AD1307 2046 LDA DFLADR+1 0724 8544 2047 STA ZBUFP+1 0726 8D0503 2048 STA DCBBUF+1 2049 ; BOOT RECORD 2050 ; 0729 AD1007 2051 LDA DFLINK+1 ;GET 1ST SECTOR # 072C AC0F07 2052 LDY DFLINK 072F 18 2053 XBC1 CLC 0730 AE0E07 2054 LDX DFSFLG ;LOAD DISK TYPE CODE 0733 206C07 2055 JSR BSIO ;GO READ BOOT SECTOR 0736 3017 2056 BMI BFAIL 2057 ; 0738 AC1107 2058 LDY BLDISP ;POINT TO LINK 073B B143 2059 LDA (ZBUFP),Y ;GET LINK HI 073D 2903 2060 AND #LMASK ;MASK TO LINK BITS 073F 48 2061 PHA 0740 C8 2062 INY 0741 1143 2063 ORA (ZBUFP),Y 0743 F00E 2064 BEQ BGOOD 0745 B143 2065 LDA (ZBUFP),Y ;GET LINK LOW 0747 A8 2066 TAY 0748 205707 2067 JSR INCBA ;GO INCREMENT BUF ADR 2068 ; 074B 68 2069 PLA ;RESTORE LINK HI 074C 4C2F07 2070 JMP XBC1 ;GO READ NEXT SECTOR 2071 ; 074F A9C0 2072 BFAIL LDA #$C0 ;SET FOR CARRY SET 0751 D001 2073 BNE XBRTN ;ANY P,Y = $80 2074 ; 0753 68 2075 BGOOD PLA ;SET FOR CARRY CLEAR 2076 ; 0754 0A 2077 XBRTN ASL A 0755 A8 2078 TAY 0756 60 2079 RTS 2080 ; 0757 18 2081 INCBA CLC 0758 A543 2082 LDA ZBUFP ;INC BUFFER PTR 075A 6D1107 2083 ADC BLDISP ;BY DATA LINK (125) 075D 8D0403 2084 STA DCBBUF 0760 8543 2085 STA ZBUFP 0762 A544 2086 LDA ZBUFP+1 0764 6900 2087 ADC #0 0766 8D0503 2088 STA DCBBUF+1 0769 8544 2089 STA ZBUFP+1 076B 60 2090 RTS 2091 ; SECTOR I/O 076C 2092 .PAGE "SECTOR I/O" 2093 ; 2094 ; BSIO - DO SECTOR I/O 2095 ; 076C 2096 BSIO = * 2097 ; 076C 8D0B03 2098 STA DCBSEC+1 ; SET SECTOR HI 076F 8C0A03 2099 STY DCBSEC ;SECTOR LO 2100 ; 0772 A952 2101 BSIOR LDA #DCBCRS ;ASSUME READ SECTOR 0774 A040 2102 LDY #$40 ;AND GET DATA 0776 9004 2103 BCC DSIO1 ;BR IF READ 2104 ; 0778 A950 2105 LDA #DCBCWS ;ELSE LOAD WRITE SECTOR 077A A080 2106 LDY #$80 ;AND PUT DATA 2107 ; 077C 2108 DSIO1 077C 8D0203 2109 STA DCBCMD ;SET COMMAND 077F 8C0303 2110 STY DCBSTA ;AND SIO CMD 2111 ; 0782 A931 2112 LDA #$31 ;DISK SERIAL BUS ID 0784 A00F 2113 LDY #TIMOUT ;TIMEOUT DEFAULT LOADED 2114 ; 0786 2115 DSIO2 0786 8D0003 2116 STA DCBSBI ;SET ID 0789 8C0603 2117 STY DCBTO ;SET TIME OUT 2118 ; 078C A903 2119 LDA #3 ;SET RETRY COUNT 078E 8DFF12 2120 STA RETRY 2121 ; 0791 A900 2122 LDA #0 ;ASSUME 128 BYTE 0793 A080 2123 LDY #$80 ;SECTOR DISK 0795 CA 2124 DEX 0796 F004 2125 BEQ DSIO3 ;SO BR 2126 ; 0798 A901 2127 LDA #1 ;ELSE IS 256 079A A000 2128 LDY #0 2129 ; 079C 8D0903 2130 DSIO3 STA DCBCNT+1 ;SET I/O BYTE CNT 079F 8C0803 2131 STY DCBCNT 2132 ; 07A2 2133 DSIO4 07A2 2059E4 2134 JSR $E459 ;CALL SERIAL I/O 07A5 101D 2135 BPL DSIO5 ;IF GOOD I/O THEN RTS 2136 ; 07A7 CEFF12 2137 DEC RETRY ;TST IF ANOTHER RETRY AVAIL 07AA 3018 2138 BMI DSIO5 ;NO THEN RTS WITH ERROR 2139 ; 07AC A240 2140 LDX #$40 ;DO RETRY-RESET TYPE ACTION 07AE A952 2141 LDA #DCBCRS ;ASSUME READ-CK IF IS 07B0 CD0203 2142 CMP DCBCMD ;IF COMMAND GET SECTOR SECTOR I/O 07B3 F009 2143 BEQ STRTYP ;YES THEN STORE GETSECTOR IN 0 07B5 A921 2144 LDA #DCBCFD ;TEST IF FORMAT CMD 07B7 CD0203 2145 CMP DCBCMD ;IT ALSO RECIEVES DATA 07BA F002 2146 BEQ STRTYP ;YES THEN SET AS GET DATA 07BC A280 2147 LDX #$80 ;ELSE STORE PUTSECTOR 07BE 8E0303 2148 STRTYP STX DCBSTA 2149 ; 07C1 4CA207 2150 JMP DSIO4 ;RETRY THE I/O 2151 ; 07C4 AE0113 2152 DSIO5 LDX CURFCB ;RELOAD CURRENT FCB 07C7 AD0303 2153 LDA DCBSTA ;AND I/O STATUS SET FLAGS 07CA 60 2154 RTS 2155 ; FILE MANGER ENTRY POINT 07CB 2156 .PAGE "FILE MANGER ENTRY POINT" 2157 ; 2158 ; DFMSDH - DISK FILE MANAGEMENT DISK 2159 ; HANDLER ENTRY POINT 2160 ; 07CB 2161 DFMSDH 07CB AA08 2162 .WORD DFMOPN-1 ;OPEN FILE 07CD 140B 2163 .WORD DFMCLS-1 ;CLOSE FILE 07CF BE0A 2164 .WORD DFMGET-1 ;GET FILE 07D1 CB09 2165 .WORD DFMPUT-1 ;PUT BYTE 07D3 000B 2166 .WORD DFMSTA-1 ;STATUS 07D5 A60B 2167 .WORD DFMDDC-1 ;DEVICE DEPENDENT CMD 2168 ; 2169 ; INITIALIZATION CODE 2170 ; 2171 ; GIVE ROOM FOR BOOT EXPANSION !!! 2172 ; 07D7 2173 *= $07E0 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 ; 07E0 AD0C07 2187 LDA SASA ;MOVE START OF ALLOC 07E3 8543 2188 STA ZBUFP ;AREA TO ZBUFP 07E5 AD0D07 2189 LDA SASA+1 07E8 8544 2190 STA ZBUFP+1 2191 ; 07EA AD0A07 2192 LDA DRVBYT ;TEMP 1 IS DRIVE 07ED 8D0C13 2193 STA TEMP1 ;EXCESS BITS FROM BOOT 2194 ; 07F0 A207 2195 LDX #7 ;TEMP 2 IS 2196 ; 07F2 8E0D13 2197 DIA STX TEMP2 ;DR # MINUS 1 07F5 0E0C13 2198 ASL TEMP1 ;SHIFT DR BIT TO CARRY 07F8 B00D 2199 BCS DIHAVE ;BR IF DR EXISTS 2200 ; 07FA A900 2201 LDA #0 ;DRVTBL,X ;SET NO DRIVE 07FC 9D1113 2202 STA DRVTBL,X 07FF 9D2913 2203 STA DBUFAL,X 0802 9D3113 2204 STA DBUFAH,X 0805 F036 2205 BEQ DIDDEC ;GO DEC DRIVE # 2206 ; FILE MANGER ENTRY POINT 0807 2207 DIHAVE 0807 A005 2208 LDY #DVDWRQ ;SET WRITE READ OFF 0809 A900 2209 LDA #0 080B 9143 2210 STA (ZBUFP),Y ;IN THE DRIVE BUFFER 2211 ; 080D E8 2212 INX ;PUT DR # IN DCB 080E 8E0103 2213 STX DCBDRV 0811 A953 2214 LDA #DCBCST ;GET DRIVE STATUS 0813 8D0203 2215 STA DCBCMD 0816 2053E4 2216 JSR DHADR 2217 ; 0819 A002 2218 LDY #2 ;ASSUME 256 BYTE DRIVE 081B ADEA02 2219 LDA $02EA ;GET STATUS BYTE 081E 2920 2220 AND #$20 0820 D001 2221 BNE DI256 ;BR IF 256 0822 88 2222 DEY 2223 ; 0823 98 2224 DI256 TYA 0824 AE0D13 2225 LDX TEMP2 ;SET DR TYPE INTO 0827 9D1113 2226 STA DRVTBL,X ;TBL AT DRIVE DISPL 082A A543 2227 LDA ZBUFP ;MOVE CURRENT ALLOC 082C 9D2913 2228 STA DBUFAL,X ;ADDR TO DBUFA 082F A544 2229 LDA ZBUFP+1 ;AND INC ALLOC 0831 9D3113 2230 STA DBUFAH,X ;BY 128 BYTES 0834 207008 2231 JSR DINCBP ;VIA DINCBP 2232 ; 0837 88 2233 DEY ;IF DR WAS A 0838 F003 2234 BEQ DIDDEC ;128 BYTES THEN DONE 2235 ; 083A 207008 2236 JSR DINCBP ;ELSE INC PTR BY 128 2237 ; 083D CA 2238 DIDDEC DEX ;DEC DRIVE 083E 10B2 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 ; 0840 AC0907 2252 LDY SABYTE ;GET AND SAVE COUNT 0843 A200 2253 LDX #0 2254 ; 0845 A900 2255 DINXTS LDA #0 ;ASSUME ALLOCATE 0847 88 2256 DEY ;DEC COUNT OF ALLOCATED 0848 1001 2257 BPL DISETS ;IF PLUS STILL ALLOCATE 084A 98 2258 TYA ;ELSE DE ALLOCATE FILE MANGER ENTRY POINT 2259 ; 084B 9D1913 2260 DISETS STA SECTBL,X ;SET ALLOCATE BYTE 084E 98 2261 TYA ;IF NO ALLOCATED 084F 300D 2262 BMI DISNI ;THEN DON'T ALLOCATE BUF 2263 ; 0851 A543 2264 LDA ZBUFP ;MOVE BUFFER ADDR 0853 9D3913 2265 STA SABUFL,X ;TO SECTOR BUF PTR 0856 A544 2266 LDA ZBUFP+1 0858 9D4913 2267 STA SABUFH,X 085B 207008 2268 JSR DINCBP ;INC SECTOR ADDR 2269 ; 085E E8 2270 DISNI INX ;INC BUF # 085F E010 2271 CPX #16 ;IF NOT ALL 16 0861 D0E2 2272 BNE DINXTS ;DO AGAIN 2273 ; 2274 ; SET LOW MEM 2275 ; 0863 A543 2276 LDA ZBUFP ;MOVE FINAL ADDR 0865 8DE702 2277 STA LMADR ;TO LOW MEM PTR 0868 A544 2278 LDA ZBUFP+1 086A 8DE802 2279 STA LMADR+1 2280 ; 086D 4C7E08 2281 JMP CLRFCB ;CONT INIT 2282 ; 2283 ; DINCBP - INC ZBUFP BY 128 2284 ; 0870 18 2285 DINCBP CLC 0871 A543 2286 LDA ZBUFP 0873 6980 2287 ADC #128 0875 8543 2288 STA ZBUFP 0877 A544 2289 LDA ZBUFP+1 0879 6900 2290 ADC #0 087B 8544 2291 STA ZBUFP+1 087D 60 2292 RTS 2293 ; 2294 ; CLEAR FCBS TO ZERO 2295 ; 087E 2296 CLRFCB = * 087E A07F 2297 LDY #$7F ;128 OF FCB 0880 A900 2298 LDA #0 0882 998113 2299 CFCBX STA FCB,Y ;TO BE CLEARED 0885 88 2300 DEY 0886 D0FA 2301 BNE CFCBX 2302 ; FILE MANGER ENTRY POINT 0888 2303 .PAGE 2304 ; 0888 A000 2305 LDY #0 088A B91A03 2306 ADI1 LDA DEVTAB,Y ;FIND AH 088D F00C 2307 BEQ ADI2 ;UNUSED 088F C944 2308 CMP #'D ;OR DISK 0891 F008 2309 BEQ ADI2 ;EMPTY 0893 C8 2310 INY 0894 C8 2311 INY 0895 C8 2312 INY 0896 C01E 2313 CPY #30 0898 D0F0 2314 BNE ADI1 089A 00 2315 BRK ;ELSE BREAK 2316 ; 089B A944 2317 ADI2 LDA #'D ;SET DISK 089D 991A03 2318 STA DEVTAB,Y 08A0 A9CB 2319 LDA #DFMSDH&255 ;SET FMS ADDR 08A2 991B03 2320 STA DEVTAB+1,Y 08A5 A907 2321 LDA #DFMSDH/256 08A7 991C03 2322 STA DEVTAB+2,Y 2323 ; 08AA 60 2324 RTS OPEN 08AB 2325 .PAGE "OPEN" 2326 ; 2327 ; DFMOPN - FILE OPEN EXECUTION ENTRY PT 2328 ; 08AB 2329 DFMOPN 08AB 206411 2330 JSR SETUP ; DO FCB SET UP 08AE 209E0E 2331 JSR FNDCODE ;GO DECODE FILE NAME 08B1 BD4A03 2332 LDA ICAUX1,X ; GET AUX1 (OPEN TYPE CODES) 08B4 9D8213 2333 STA FCBOTC,X ;PUT INTO FCB 08B7 2902 2334 AND #OPDIR ; IS THIS LIST DIRECTORY 08B9 F003 2335 BEQ OPN1 ;BR IF NOT 08BB 4CAD0D 2336 JMP LISTDIR ;GOTO DIR LIST CODE 2337 ; 08BE 20210F 2338 OPN1 JSR SFDIR ;GO SEARCH FILE DIR 08C1 08 2339 PHP 2340 ; 08C2 BD8213 2341 LDA FCBOTC,X ;GET OPEN TYPE CODE 08C5 C904 2342 CMP #OPIN ;INPUT 08C7 F00F 2343 BEQ DFOIN 08C9 C908 2344 CMP #OPOUT ;OUTPUT 08CB F044 2345 BEQ DFOOUT 08CD C90C 2346 CMP #OPIN+OPOUT ;UPDATE 08CF F00C 2347 BEQ DFOUPD 08D1 C909 2348 CMP #OPOUT+OPAPND ;APPEND 08D3 F017 2349 BEQ DFOAPN 08D5 4CBF12 2350 JMP ERDVDC ;ERROR 2351 ; 2352 ; DFOIN - OPEN FOR INPUT 2353 ; 08D8 2354 DFOIN = * 08D8 28 2355 PLP ;GET SEARCH FLAG 08D9 B00E 2356 BCS OPNER1 ;ERROR IF NOT FOUND 08DB 9006 2357 BCC DFOUI 2358 ; 2359 ; DFOUPD - OPEN FOR UPDATA 2360 ; 08DD 2361 DFOUPD = * 08DD 28 2362 PLP ;GET SEARCH FLAG 08DE B009 2363 BCS OPNER1 ;BR NOT FOUND 08E0 20AC0C 2364 JSR TSTLOCK ;TEST LOCK 2365 ; 08E3 2366 DFOUI = * 08E3 20AE09 2367 JSR DFRDSU ;SET UP FOR READ 08E6 4CF012 2368 JMP GREAT ;DONE 2369 ; 08E9 4CBB12 2370 OPNER1 JMP ERFNF ;FILE NOT FOUND OPEN 08EC 2371 .PAGE 2372 ; 2373 ; DFOAPN - OPEN APPEND 2374 ; 08EC 2375 DFOAPN = * 08EC 28 2376 PLP ;GET READ STATUS 08ED B0FA 2377 BCS OPNER1 ;BR NOT FOUND 08EF AC0513 2378 LDY CDIRD ;IF OLD. 08F2 B90114 2379 LDA FILDIR+DFDFL1,Y ;FILE TYPE 08F5 2902 2380 AND #DFDNLD ;THEN 08F7 F015 2381 BEQ APOER ;ERROR 08F9 20AC0C 2382 JSR TSTLOCK ;TEST LOCKED 08FC 20BF10 2383 JSR OPVTOC ;READ VTOC 08FF 200611 2384 JSR GETSECTOR ;GET A SECTOR 0902 9D8E13 2385 STA FCBSSN+1,X ;MOVE START SECTOR # 0905 BD8B13 2386 LDA FCBLSN,X ;TO START SECTOR # 0908 9D8D13 2387 STA FCBSSN,X 090B 4C7C09 2388 JMP DHFOX2 ;CONTINUE AS OPEN 090E 4CB712 2389 APOER JMP ERAPO 2390 ; 2391 ; DFOOUT - OPEN FOR OUTPUT 2392 ; 0911 2393 DFOOUT = * 0911 28 2394 PLP ;GET SEARCH FLAG 0912 B009 2395 BCS DFOX1 2396 ; 0914 20530C 2397 JSR XDEL0 ;DELETE THE FILE OR FILES 0917 AC0513 2398 LDY CDIRD 091A 4C4809 2399 JMP OPN1A 2400 ; 091D 2401 DFOX1 = * 091D AD0213 2402 LDA DHOLES ;WAS THERE A HOLE 0920 3070 2403 BMI OPNER2 ;BR IF NO HOLE 0922 8D0613 2404 STA CDIRS ;SAVE HOLE SECTOR AS CURRENT DIR SEC 0925 206E10 2405 JSR RDDIR ;GO READ CURRENT DIR SECTOR 0928 AD0313 2406 LDA DHOLED ;MOVE HOLE DISPL TO 092B 8D0513 2407 STA CDIRD ;CUR DIR DISPL 092E AD0413 2408 LDA DHFNUM ;MOVE HOLE FN 0931 8D0713 2409 STA SFNUM ;TO CURRENT 0934 20BF10 2410 JSR OPVTOC 0937 AC0513 2411 LDY CDIRD 093A A20A 2412 LDX #10 093C A920 2413 LDA #$20 093E 990614 2414 OPN1B STA FILDIR+DFDPFN,Y ;BLANK FILL FILE ENTRY FOR FILE NAME 0941 C8 2415 INY 0942 CA 2416 DEX 0943 10F9 2417 BPL OPN1B 0945 AE0113 2418 LDX CURFCB 2419 ; 0948 2420 OPN1A = * 0948 200611 2421 JSR GETSECTOR ;GET A SECTOR OPEN 094B AC0513 2422 LDY CDIRD ;GET DIR DISPL 094E 990514 2423 STA FILDIR+DFDSSN+1,Y ;PUT SECTOR INTO DIR REC 0951 BD8B13 2424 LDA FCBLSN,X 0954 990414 2425 STA FILDIR+DFDSSN,Y 2426 ; 0957 A943 2427 LDA #DFDINU+DFDOUT+DFDNLD ;SET DIR ENTRY IN USE 0959 990114 2428 STA FILDIR+DFDFL1,Y 095C A900 2429 LDA #0 ;SET NOT LOCKED 095E 990314 2430 STA FILDIR+DFDCNT+1,Y ;SET COUNT = 0 0961 990214 2431 STA FILDIR+DFDCNT,Y 2432 ; 0964 A200 2433 LDX #0 0966 BD5913 2434 OPN2 LDA FNAME,X ;MOVE FILE NAME 0969 C93F 2435 CMP #'? ;IF WILD CARD 096B F003 2436 BEQ OPN2A ;CHANGE TO BLANK 096D 990614 2437 STA FILDIR+DFDPFN,Y ;TO DIRECTORY 0970 2438 OPN2A = * 0970 C8 2439 INY 0971 E8 2440 INX 0972 E00B 2441 CPX #11 0974 90F0 2442 BCC OPN2 2443 ; 0976 AE0113 2444 LDX CURFCB ;RESTORE X REG 0979 207110 2445 JSR WRTDIR ;GO WRITE DIRECTORY 097C 2446 DHFOX2 = * 097C 209509 2447 JSR SETFCB 097F 20E20F 2448 JSR WRTN6 ;FIX UP AS IF WRITE 0982 A980 2449 OPN3 LDA #FCBFAS ;SET NEW FILE 0984 9D8513 2450 STA FCBFLG,X 0987 209B12 2451 JSR TSTDOS ;IF NOT DOS 098A D003 2452 BNE DHFOX3 ;BR 098C 4C0A12 2453 JMP WRTDOS ;ELSE DO IT 098F 2454 DHFOX3 = * 098F 4CF012 2455 JMP GREAT 2456 ; 0992 20BD12 2457 OPNER2 JSR ERDFULL ;DIRECTORY FULL 2458 ; 2459 ; 0995 2460 SETFCB = * 0995 A900 2461 LDA #0 ;CLEAR 0997 9D8513 2462 STA FCBFLG,X ;FLAG 099A AD0713 2463 OPNF1 LDA SFNUM ;MOVE FILE NUM TO FCB 099D 0A 2464 ASL A 099E 0A 2465 ASL A 099F 9D8113 2466 STA FCBFNO,X 09A2 A900 2467 LDA #0 09A4 9D8713 2468 STA FCBDLN,X ;DATA LENGTH 09A7 9D8F13 2469 STA FCBCNT,X ;SET CNT = 0 09AA 9D9013 2470 STA FCBCNT+1,X 09AD 60 2471 RTS 09AE 209509 2472 DFRDSU JSR SETFCB ;SET UP FCB 09B1 AC0513 2473 LDY CDIRD ;MOVE START SECTOR TO LINK 09B4 B90114 2474 LDA DFDFL1+FILDIR,Y ;SET NEW 09B7 2902 2475 AND #DFDNLD ;SECTOR 09B9 9D8413 2476 STA FCBSLT,X ;FLAG 09BC B90414 2477 LDA FILDIR+DFDSSN,Y 09BF 9D8B13 2478 STA FCBLSN,X 09C2 B90514 2479 LDA FILDIR+DFDSSN+1,Y 09C5 9D8C13 2480 STA FCBLSN+1,X 09C8 201710 2481 JSR RDNSO ;READ 1ST SECTOR 09CB 60 2482 RTS 09CC 25 .INCLUDE #E: 09CC 30 .INCLUDE #D:ATFMS2.SRC PUT BYTE 09CC 3000 .PAGE "PUT BYTE" 3001 ; 3002 ; DFMPUT - PUT A FILE BYTE 3003 ; 09CC 3004 DFMPUT 09CC 8D0813 3005 STA SVDBYT 09CF BD4103 3006 LDA ICDNO,X 09D2 8521 3007 STA ICDNO-IOCB+ZICB 09D4 206411 3008 JSR SETUP 09D7 AC0013 3009 LDY ENTSTK ;CHK TO SEE IF ENTRY WASN'T FROM CIO 09DA B90201 3010 LDA STAK,Y ;IF HI BYTE RTS IS NOT IN OS ADDR 09DD C9DF 3011 CMP #OSBTM ;SPACE THEN A NON-CIO ENTRY 09DF B004 3012 BCS FRMCIO ;BR IF FROM CIO 09E1 A900 3013 LDA #0 ;ELSE PREVENT FROM DOING BURST I/O 09E3 8522 3014 STA ICCOMZ 09E5 BD8213 3015 FRMCIO LDA FCBOTC,X ;IF NOT OPEN 09E8 2908 3016 AND #OPOUT ;OUTPUT 09EA F02D 3017 BEQ PUTER ;ERROR 09EC BC8713 3018 LDY FCBDLN,X ;GET DATA LENGTH 09EF 98 3019 TYA 09F0 DD8613 3020 CMP FCBMLN,X ;IF SECTOR NOT FULL 09F3 9011 3021 BCC PUT1 ;THEN BR 09F5 20940F 3022 JSR WRTNXS ;ELSE WRITE FULL SECTOR 09F8 B022 3023 BCS PEOF ;BR IF EOF 09FA 201F0A 3024 JSR WTBUR ;TEST BURST 09FD A000 3025 LDY #0 09FF B005 3026 BCS PUT1 ;BR IF NOT BURST 0A01 B124 3027 LDA (ICBALZ),Y ;PUT NEXT BYTE 0A03 8D0813 3028 STA SVDBYT ;AFTER BURST AREA 3029 ; 0A06 FE8713 3030 PUT1 INC FCBDLN,X ;INC DATA LEN 0A09 AD0813 3031 LDA SVDBYT ;GET DATA BYTE 0A0C 9147 3032 STA (ZSBA),Y ;AND PUT IN SECTOR BUFFER 3033 ; 0A0E A940 3034 LDA #FCBFSM ;INDICATE SECTOR MODIFIED 0A10 1D8513 3035 ORA FCBFLG,X 0A13 9D8513 3036 STA FCBFLG,X 3037 ; 0A16 4CF012 3038 JMP GREAT ;DONE 3039 ; 0A19 4CBF12 3040 PUTER JMP ERDVDC 0A1C 4CF412 3041 PEOF JMP ERREOF BURST I/O 0A1F 3042 .PAGE "BURST I/O" 3043 ; 3044 ; TEST BURST I/O AND DO IF POSSIBLE 3045 ; 0A1F BD8513 3046 WTBUR LDA FCBFLG,X ;IF NOT AQUIRING SECTORS 0A22 1026 3047 BPL NOBURST ;THEN UPDATE AND 0A24 3002 3048 BMI TBURST ;NO BURST 3049 ; 0A26 A900 3050 RTBUR LDA #0 ;SET READ TYPE 3051 ; 0A28 8D1013 3052 TBURST STA BURTYP ;SET BURST TYPE 0A2B A522 3053 LDA ICCOMZ ;IF CMD 0A2D 2902 3054 AND #2 ;IS TEXT MODE 0A2F F019 3055 BEQ NOBURST ;THEN NO BURST 3056 ; 0A31 20AE0A 3057 JSR TBLEN ;IF USER BUFFER LESS 0A34 B014 3058 BCS NOBURST ;THEN SECTOR, NO BURST 3059 ; 0A36 A524 3060 LDA ICBALZ ;MOVE USER BUFFER 0A38 8547 3061 STA ZSBA ;ADDR TO SECTPOR 0A3A A525 3062 LDA ICBAHZ ;BUFFER PTR 0A3C 8548 3063 STA ZSBA+1 3064 ; 0A3E AD1013 3065 NXTBUR LDA BURTYP ;GET I/O TYPE 0A41 3009 3066 BMI WRBUR ;BR IF WRITE 3067 ; 0A43 200F10 3068 JSR RDNXTS ;DO SECTOR READ 0A46 9033 3069 BCC BBINC ;BR IF EOF 0A48 B053 3070 BCS BUREOF ;BR RD EOF 3071 ; 0A4A 38 3072 NOBURST SEC ;INDICATE NO BURST 0A4B 60 3073 RTS 3074 ; 0A4C ADF812 3075 WRBUR LDA DRVMDL ;WRITE FULL SECTOR 0A4F 9D8713 3076 STA FCBDLN,X ;DATA COUNT 3077 ; 0A52 A8 3078 TAY 0A53 B147 3079 LDA (ZSBA),Y ;SAVE DATA TO BE 0A55 8D0913 3080 STA SVD1 ;TO BE CLOBBERED 0A58 C8 3081 INY 0A59 B147 3082 LDA (ZSBA),Y ;BY WRTNXT 0A5B 8D0A13 3083 STA SVD2 0A5E C8 3084 INY 0A5F B147 3085 LDA (ZSBA),Y 0A61 8D0B13 3086 STA SVD3 3087 ; 0A64 20940F 3088 JSR WRTNXS ;WRITE SECTOR 3089 ; 0A67 ACF812 3090 LDY DRVMDL ;RESTORE CLOBBERED DATA 0A6A AD0913 3091 LDA SVD1 0A6D 9147 3092 STA (ZSBA),Y BURST I/O 0A6F C8 3093 INY 0A70 AD0A13 3094 LDA SVD2 0A73 9147 3095 STA (ZSBA),Y 0A75 C8 3096 INY 0A76 AD0B13 3097 LDA SVD3 0A79 9147 3098 STA (ZSBA),Y 3099 ; 3100 ; 0A7B 18 3101 BBINC CLC 0A7C A547 3102 LDA ZSBA ;INC SECTOR 0A7E 7D8613 3103 ADC FCBMLN,X ;BUFFER ADDR BY 0A81 8547 3104 STA ZSBA ;ACTUAL DATA LEN 0A83 A548 3105 LDA ZSBA+1 ;GOT OT PUT 0A85 6900 3106 ADC #0 0A87 8548 3107 STA ZSBA+1 3108 ; 0A89 38 3109 SEC 0A8A A528 3110 LDA ICBLLZ ;DEC USER 0A8C FD8613 3111 SBC FCBMLN,X ;BUFFER LEN BY 0A8F 8528 3112 STA ICBLLZ ;ACTUAL DATA LEN 0A91 A529 3113 LDA ICBLHZ ;GOT OR PUT 0A93 E900 3114 SBC #0 0A95 EA 3115 NOP 0A96 8529 3116 STA ICBLHZ 3117 ; 0A98 20AE0A 3118 JSR TBLEN ;IF USER BUF LEN 0A9B 90A1 3119 BCC NXTBUR ;NOW >= SECTOR, DO AGAIN 3120 ; 0A9D 3121 BUREOF = * ;END OF BURSTING 0A9D A547 3122 LDA ZSBA ;MOVE FINAL ADDR BACK 0A9F 8524 3123 STA ICBALZ ;TO USER BUF PTR 0AA1 A548 3124 LDA ZSBA+1 0AA3 8525 3125 STA ICBAHZ 3126 ; 0AA5 BC8813 3127 LDY FCBBUF,X ;RESTORE ZSBA 0AA8 88 3128 DEY 0AA9 20D011 3129 JSR SSBA 3130 ; 0AAC 18 3131 BURST CLC 0AAD 60 3132 RTS 3133 ; 3134 ; TEST USER BUF LEN FOR BURST 3135 ; 0AAE 3136 TBLEN = * 0AAE ADFE12 3137 LDA DRVTYP ;IF DRIVE NOT 0AB1 C901 3138 CMP #1 ;128 BYTE SECTOR TYPE 0AB3 D004 3139 BNE TBL256 ;THEN DO 256 BYTE TEST 3140 ; 0AB5 A528 3141 LDA ICBLLZ 0AB7 30F3 3142 BMI BURST 3143 ; 0AB9 A529 3144 TBL256 LDA ICBLHZ ;IF BUF LEN HI >= 256 BURST I/O 0ABB D0EF 3145 BNE BURST ;THEN CAN BURST 0ABD 38 3146 SEC 0ABE 60 3147 RTS GET BYTE 0ABF 3148 .PAGE "GET BYTE" 3149 ; 3150 ; 3151 ; DFMGET - GET A FILE BYTE 3152 ; 0ABF 3153 DFMGET = * 0ABF 206411 3154 JSR SETUP ;GO SET UP 0AC2 BD8213 3155 LDA FCBOTC,X ;IF OPEN FOR 0AC5 2902 3156 AND #OPDIR ;DIR CNT 0AC7 F003 3157 BEQ GET1 0AC9 4CB90D 3158 JMP GDCHAR ;THEN GO TO DIR RTN 3159 ; 0ACC BD8713 3160 GET1 LDA FCBDLN,X ;GET DATA LEN 0ACF DD8613 3161 CMP FCBMLN,X ;TEST EMPTY SECTOR 0AD2 900B 3162 BCC GET2 ;BR IF NOT EMPTY 0AD4 20260A 3163 JSR RTBUR ;DO BURST IF POSSIBLE 0AD7 200F10 3164 JSR RDNXTS ;GET NEXT SECTOR 0ADA 90F0 3165 BCC GET1 ;BR IF NOT EOF 0ADC 3166 GEOF = * 0ADC 4CF412 3167 JMP ERREOF ;ELSE EOF ERROR 3168 ; 0ADF A8 3169 GET2 TAY 0AE0 B147 3170 LDA (ZSBA),Y ;GET DATA BYTE 0AE2 8D0813 3171 STA SVDBYT ;SAVE THE BYTE 0AE5 C8 3172 INY 0AE6 98 3173 TYA 0AE7 9D8713 3174 STA FCBDLN,X ;AND SET NEW VALUE 0AEA 3175 EFLOOK = * 0AEA BC8B13 3176 LDY FCBLSN,X ;DO EOF LOOK AHEAD 0AED D00F 3177 BNE GET3 ;IF LSN NOT ZERO 0AEF BC8C13 3178 LDY FCBLSN+1,X ;THEN 0AF2 D00A 3179 BNE GET3 ;NOT EOF 0AF4 DD8613 3180 CMP FCBMLN,X ;IF LSN=0 THEN CHECK FOR 0AF7 9005 3181 BCC GET3 ;LAST BYTE 0AF9 A903 3182 LDA #$03 ;IF LAST BYTE THEN RTS 0AFB 4CD312 3183 JMP RETURN 3184 ; 0AFE 4CF012 3185 GET3 JMP GREAT STATUS 0B01 3186 .PAGE "STATUS" 3187 ; 3188 ; DFMSTA - GET A FILE STATUS 3189 ; 0B01 3190 DFMSTA 0B01 206411 3191 JSR SETUP ; SETUP 0B04 209E0E 3192 JSR FNDCODE ; DECODE FILE NAME 0B07 20210F 3193 JSR SFDIR ;SEARCH FOR FILE 0B0A B006 3194 BCS SFNF ;BR NOT FOUND 0B0C 20AC0C 3195 JSR TSTLOCK ;TEST LOCKED 0B0F 4CF012 3196 JMP GREAT ;FILE EXISTS AND UNLOCKED 3197 ; 0B12 4CBB12 3198 SFNF JMP ERFNF CLOSE 0B15 3199 .PAGE "CLOSE" 3200 ; 3201 ; DFMCLOSE - CLOSE A FILE 3202 ; 0B15 3203 DFMCLS 0B15 206411 3204 JSR SETUP 0B18 BD8213 3205 LDA FCBOTC,X ;GET OPEN CODE 0B1B 2908 3206 AND #OPOUT ;IF NOT OUTPUT 0B1D F04E 3207 BEQ CLDONE ;THEN DONE 3208 ; 0B1F 3E8513 3209 ROL FCBFLG,X ;IF NOT ACQUIRING SECTORS 0B22 9051 3210 BCC CLUPDT ;THEN IS UPDATE 3211 ; 0B24 20AB0F 3212 JSR WRTLSEC ;WRITE LAST SECTOR 3213 ; 0B27 20800B 3214 JSR RRDIR ;GO GET DIRECTORY 0B2A BD9013 3215 LDA FCBCNT+1,X ;GET CNT OF SECTORS 0B2D 48 3216 PHA 0B2E BD8F13 3217 LDA FCBCNT,X 0B31 48 3218 PHA 3219 ; 0B32 BD8213 3220 LDA FCBOTC,X ;GET OPEN CODE 0B35 2901 3221 AND #OPAPND ;IF NOT APPEND 0B37 F017 3222 BEQ CLOUT ;BR 3223 ; 0B39 20AE09 3224 JSR DFRDSU ;ELSE SET UP FOR READ 0B3C 200F10 3225 APP1 JSR RDNXTS ;READ TO EOF 0B3F 90FB 3226 BCC APP1 3227 ; 0B41 BD8D13 3228 LDA FCBSSN,X ;MOVE START SECTOR 0B44 9D8B13 3229 STA FCBLSN,X ;TO EOF LINK SECTOR 0B47 BD8E13 3230 LDA FCBSSN+1,X 0B4A 9D8C13 3231 STA FCBLSN+1,X 0B4D 20B30F 3232 JSR WRTN2 ;THEN WRITE AS NOT EOF 3233 ; 0B50 AC0513 3234 CLOUT LDY CDIRD ;GET DIR DISPL 0B53 18 3235 CLC 0B54 68 3236 PLA 0B55 790214 3237 ADC FILDIR+DFDCNT,Y 0B58 990214 3238 STA FILDIR+DFDCNT,Y 0B5B 68 3239 PLA 0B5C 790314 3240 ADC FILDIR+DFDCNT+1,Y 0B5F 990314 3241 STA FILDIR+DFDCNT+1,Y 3242 ; 0B62 A942 3243 LDA #DFDINU+DFDNLD ;SET ENTRY TO IN USE 0B64 990114 3244 STA FILDIR+DFDFL1,Y 0B67 207110 3245 JSR WRTDIR ;WRITE DIR 0B6A 209510 3246 JSR WRTVTOC ;WRITE VTOC 3247 ; 0B6D A900 3248 CLDONE LDA #0 ;CLEAR OPEN CODE 0B6F 9D8213 3249 STA FCBOTC,X CLOSE 0B72 4CEA12 3250 JMP FGREAT 3251 ; 0B75 3252 CLUPDT = * 0B75 3E8513 3253 ROL FCBFLG,X ;IF SECTOR NOT MODIFIED 0B78 90F3 3254 BCC CLDONE ;THEN DONE 0B7A 20F80F 3255 JSR WRCSIO ;ELSE WRITE IT 0B7D 4C6D0B 3256 JMP CLDONE ; THEN DONE 3257 ; CLOSE 0B80 3258 .PAGE 3259 ; 3260 ; RE-READ DIR RECORD 3261 ; 0B80 3262 RRDIR = * 0B80 BD8113 3263 LDA FCBFNO,X ;GET FILE NUMBER 0B83 4A 3264 LSR A 0B84 4A 3265 LSR A 0B85 8D0713 3266 STA SFNUM 3267 ; 3268 ; 0B88 209B0B 3269 JSR FNSHFT ;SET ACU=FILE NO/64 0B8B 8D0613 3270 STA CDIRS ;TO GET DIR SECTOR 0B8E 209B0B 3271 JSR FNSHFT ;SET ACU TO REM=16 0B91 209D0B 3272 JSR FNSHF1 0B94 0A 3273 ASL A 0B95 8D0513 3274 STA CDIRD ;TO GET DIR DISPL 3275 ; 0B98 4C6E10 3276 JMP RDDIR 0B9B A900 3277 FNSHFT LDA #0 0B9D A003 3278 FNSHF1 LDY #3 ;SHIFT 3 BITS OF 0B9F 1E8113 3279 FNSHF2 ASL FCBFNO,X ;FILE NO INTO ACU 0BA2 2A 3280 ROL A 0BA3 88 3281 DEY 0BA4 D0F9 3282 BNE FNSHF2 0BA6 60 3283 RTS DEVICE DEPENDENT COMMAND 0BA7 3284 .PAGE "DEVICE DEPENDENT COMMAND" 3285 ; 3286 ; DFMDDC - DEVICE DEPENDENT CMD EXECUTION 3287 ; 0BA7 3288 DFMDDC 0BA7 206411 3289 JSR SETUP ;SET UP FOR EXECUTION 0BAA BD4203 3290 LDA ICCOM,X ;GET COMMAND 0BAD C9FE 3291 CMP #254 ;IS IT FORMAT 0BAF F025 3292 BEQ XFV ;BR IF 0BB1 C927 3293 CMP #MAXDDC ;TEST RANGE 0BB3 B01E 3294 BCS DVDCER ;BR OUT OF RANGE 0BB5 38 3295 SEC 0BB6 E920 3296 SBC #$20 ;SUBTRACT BASE OF CMDS 0BB8 9019 3297 BCC DVDCER ;BR OUT OF RANGE 0BBA 0A 3298 ASL A 0BBB A8 3299 TAY 0BBC B9C50B 3300 LDA DVDCVT,Y 0BBF 48 3301 PHA ;PUSH EXECUTION ADDR 0BC0 B9C60B 3302 LDA DVDCVT+1,Y 0BC3 48 3303 PHA 0BC4 60 3304 RTS 3305 ; 0BC5 3306 DVDCVT 0BC5 0BD8 3307 .DBYTE XRENAME-1 ;20-RENAME 0BC7 0C31 3308 .DBYTE XDELETE-1 ;21-DELETE 0BC9 0BD2 3309 .DBYTE DVDCER-1 ;INVALID CMD 0BCB 0C7B 3310 .DBYTE XLOCK-1 ;23-LOCK 0BCD 0C82 3311 .DBYTE XUNLOCK-1 ;24-UNLOCK 0BCF 0CB9 3312 .DBYTE XPOINT-1 ;25-POINT 0BD1 0D02 3313 .DBYTE XNOTE-1 ;26-NOTE 3314 ; 0027 3315 MAXDDC = $27 ;MAX DVDC+1 3316 ; 0BD3 4CBF12 3317 DVDCER JMP ERDVDC 0BD6 4C180D 3318 XFV JMP XFORMAT ;FORMAT VECTOR RENAME 0BD9 3319 .PAGE "RENAME" 3320 ; 3321 ;XRENAME - RENAME A FILE OR FILES 3322 ; 0BD9 3323 XRENAME 0BD9 209E0E 3324 JSR FNDCODE ;DECODE FILE NAME 0BDC 8C0D13 3325 STY TEMP2 ;SAVE FNAME INDEX 0BDF 20210F 3326 JSR SFDIR ;GO FINE FILE IN DIR 0BE2 9003 3327 BCC XRN1 ;BR IF FOUND 0BE4 4CBB12 3328 JMP ERFNF 3329 ; 0BE7 20AC0C 3330 XRN1 JSR TSTLOCK ;TEST LOCK 0BEA 209B12 3331 JSR TSTDOS ; IF NOT DOS 0BED D003 3332 BNE XRN1A ;THEN 0BEF 201912 3333 JSR DELDOS ; DON'T CHANGE SO 0BF2 3334 XRN1A 0BF2 AC0D13 3335 LDY TEMP2 ;GET INDEX FOR END FN1 0BF5 20B40E 3336 JSR FNDCNX ;GO DECODE NEXT FILE NAME 0BF8 209B12 3337 JSR TSTDOS ;IF NOT DOS 0BFB D00F 3338 BNE XRN1B ;THEN 0BFD AC0513 3339 LDY CDIRD 0C00 B90514 3340 LDA FILDIR+DFDSSN+1,Y 0C03 48 3341 PHA 0C04 B90414 3342 LDA FILDIR+DFDSSN,Y 0C07 A8 3343 TAY ;A,Y NEW DOS 0C08 68 3344 PLA 0C09 205312 3345 JSR SETDSO ;GO WRITE SECTOR ZERO 3346 ; 0C0C 3347 XRN1B 0C0C A200 3348 LDX #0 0C0E AC0513 3349 LDY CDIRD 3350 ; 0C11 BD5913 3351 XRN2 LDA FNAME,X ;MOVE FILE NAME 0C14 C93F 3352 CMP #'? ;FROM FNAME TO DIR ENT 0C16 F003 3353 BEQ XRN3 ;BUT DON'T CHANGE WILD CARD 0C18 990614 3354 STA FILDIR+DFDPFN,Y ;CHARS INDICATED IN FNAME 0C1B C8 3355 XRN3 INY 0C1C E8 3356 INX 0C1D E00B 3357 CPX #11 0C1F 90F0 3358 BCC XRN2 0C21 AE0113 3359 LDX CURFCB ;RESTORE X-REG 3360 ; 0C24 207110 3361 JSR WRTDIR ;GO WRITE CIR DIR RECORD 3362 ; 0C27 209E0E 3363 JSR FNDCODE ;GET OLD FILENAME AGAIN 0C2A 20310F 3364 JSR CSFDIR ;CONTINUE SEARCH OF DIR 0C2D 90B8 3365 BCC XRN1 ;BR IF FOUND ANOTHER 3366 ; 0C2F 4CEA12 3367 JMP FGREAT ;GO TO GOOD ENDING DELETE 0C32 3368 .PAGE "DELETE" 3369 ; 3370 ; XDELETE - DELETE ALL FILENAMES THAT MATCH 3371 ; 0C32 3372 XDELETE 0C32 209E0E 3373 JSR FNDCODE ;GO DECODE FILENAME 0C35 20210F 3374 JSR SFDIR ;SEARCH DIR FOR FILENAME 0C38 B03F 3375 BCS DFNF ;BR NOT FOUND 0C3A 3376 XDELX = * 0C3A 20530C 3377 JSR XDEL0 0C3D 209B12 3378 JSR TSTDOS 0C40 D003 3379 BNE XDELY 0C42 201912 3380 JSR DELDOS 0C45 3381 XDELY 3382 ; 0C45 207110 3383 XDEL3 JSR WRTDIR ;WRITE DIR ENTRY 0C48 20310F 3384 JSR CSFDIR ;LOOK FOR NEXT MATCH 0C4B 90ED 3385 BCC XDELX ;BR IF FOUND 0C4D 209510 3386 JSR WRTVTOC 0C50 4CEA12 3387 JMP FGREAT 3388 ; 0C53 20BF10 3389 XDEL0 JSR OPVTOC 3390 ; 0C56 AC0513 3391 XDEL1 LDY CDIRD ;GET DIR DISPL 0C59 20AC0C 3392 JSR TSTLOCK ;GO TEST LOCK 0C5C A980 3393 LDA #DFDEDE ;LOAD DELETED FLAG 0C5E 990114 3394 STA FILDIR+DFDFL1,Y ;DELETE FILE 3395 ; 0C61 20AE09 3396 JSR DFRDSU 0C64 4C6C0C 3397 JMP XDEL2A 3398 ; 0C67 200F10 3399 XDEL2 JSR RDNXTS ;READ NEXT SECTOR 0C6A B006 3400 BCS XDEL4 0C6C 3401 XDEL2A = * 0C6C 20C510 3402 JSR FRESECT ;FREE CURRENT SECTOR 0C6F 4C670C 3403 JMP XDEL2 3404 ; 0C72 3405 XDEL4 = * 0C72 A005 3406 LDY #DVDWRQ ;TURN ON WRITE REQ'D 0C74 A9FF 3407 LDA #$FF 0C76 9145 3408 STA (ZDRVA),Y 0C78 60 3409 RTS 3410 ; 0C79 4CBB12 3411 DFNF JMP ERFNF ;FILE NOT FOUND LOCK AND UNLOCK 0C7C 3412 .PAGE "LOCK AND UNLOCK" 3413 ; 3414 ; XLOCK - LOCK A FILE 3415 ; XUNLOCK - UNLOCK A FILE 3416 ; 0C7C 3417 XLOCK 0C7C A920 3418 LDA #DFDLOC ; SET LOCK 0C7E 8D0F13 3419 STA TEMP4 0C81 D005 3420 BNE XLCOM ;GO TO COMMON 0C83 3421 XUNLOCK 0C83 A900 3422 LDA #0 ;SET UNLOCK 0C85 8D0F13 3423 STA TEMP4 3424 ; 0C88 209E0E 3425 XLCOM JSR FNDCODE ; DECODE FILE NAME 0C8B 20210F 3426 JSR SFDIR ;FIND 1ST MATCH 0C8E 9003 3427 BCC XLC1 ;BR MATCH FOUND 0C90 4CBB12 3428 JMP ERFNF ;BR NOT FOUND 3429 ; 0C93 AC0513 3430 XLC1 LDY CDIRD ;GET CURRENT DISPL 0C96 B90114 3431 LDA FILDIR+DFDFL1,Y ;GET LOCK BYTE 0C99 29DF 3432 AND #$DF ;TURN OFF LOCK 0C9B 0D0F13 3433 ORA TEMP4 ;OR IN LOCK/UNLOCK 0C9E 990114 3434 STA FILDIR+DFDFL1,Y ;SET NEW LOCK BYTE 0CA1 207110 3435 JSR WRTDIR ;GO WRITE 3436 ; 0CA4 20310F 3437 JSR CSFDIR ;LOOK FOR NEXT MATCH 0CA7 90EA 3438 BCC XLC1 ;BR FOUND 0CA9 4CEA12 3439 JMP FGREAT ;ELSE DONE 3440 ; 3441 ; TSTLOCK - TEST FILE LOCKED 3442 ; 0CAC 3443 TSTLOCK 0CAC AC0513 3444 LDY CDIRD ;GET DIR DISPL 0CAF B90114 3445 LDA FILDIR+DFDFL1,Y ;LOAD LOCK BYTE 0CB2 2920 3446 AND #DFDLOC ;MASK LOCK BIT 0CB4 D001 3447 BNE TLF ;BR IF LOCKED 0CB6 60 3448 RTS 3449 ; 0CB7 4CC112 3450 TLF JMP ERFLOCK POINT 0CBA 3451 .PAGE "POINT" 3452 ; 3453 ; XPOINT - POINT REQUEST 3454 ; 0CBA 3455 XPOINT 0CBA BD8513 3456 LDA FCBFLG,X ;IF ARQ SECTORS 0CBD 3041 3457 BMI PERR1 ;POINT INVALID 0CBF BD4D03 3458 LDA ICAUX4,X ;IF REQUEST IS NOT 0CC2 DD8A13 3459 CMP FCBCSN+1,X ;SAME AS CURRENT 0CC5 D008 3460 BNE XP1 ;THEN BR 0CC7 BD4C03 3461 LDA ICAUX3,X 0CCA DD8913 3462 CMP FCBCSN,X 0CCD F01E 3463 BEQ XP2 ;ELSE NO NEED TO CHANGE 3464 ; 0CCF BD8513 3465 XP1 LDA FCBFLG,X ;IF NOT MODIFIED 0CD2 F008 3466 BEQ XP1A ;BR 0CD4 20F80F 3467 JSR WRCSIO ;ELSE WRITE IT 0CD7 A900 3468 LDA #0 0CD9 9D8513 3469 STA FCBFLG,X 0CDC 3470 XP1A = * 0CDC BD4D03 3471 LDA ICAUX4,X 0CDF 9D8C13 3472 STA FCBLSN+1,X 0CE2 BD4C03 3473 LDA ICAUX3,X 0CE5 9D8B13 3474 STA FCBLSN,X 0CE8 201710 3475 JSR RDNSO ;READ REQ SECTOR 0CEB B00A 3476 BCS XPERR 3477 ; 0CED BD4E03 3478 XP2 LDA ICAUX5,X ;TEST REQ DATA LEN 0CF0 DD8613 3479 CMP FCBMLN,X ;LESS THEN MAX 0CF3 9005 3480 BCC XP3 0CF5 F003 3481 BEQ XP3 0CF7 3482 XPERR = * 0CF7 4CC312 3483 JMP ERRPDL ;IF NOT THEN ERROR 3484 ; 0CFA 9D8713 3485 XP3 STA FCBDLN,X ;SET NEW DATA LEN 0CFD 4CF012 3486 JMP GREAT 3487 ; 0D00 4CB912 3488 PERR1 JMP ERRPOT NOTE 0D03 3489 .PAGE "NOTE" 3490 ; 3491 ; XNOTE - EXECUTE NOTE REQUEST 3492 ; 0D03 3493 XNOTE 0D03 BD8713 3494 LDA FCBDLN,X ;DATA LENGTH VALUE 0D06 9D4E03 3495 STA ICAUX5,X ;TO AUX 2 0D09 BD8913 3496 LDA FCBCSN,X ;CUR SEC NO (LO) 0D0C 9D4C03 3497 STA ICAUX3,X ;TO AUX 3 0D0F BD8A13 3498 LDA FCBCSN+1,X ;CUR SEC NO (HI) 0D12 9D4D03 3499 STA ICAUX4,X ;TO AUX 4 0D15 4CF012 3500 JMP GREAT FORMAT 0D18 3501 .PAGE "FORMAT" 3502 ; 3503 ; XFORMAT - FORMAT A DISKETTE 3504 ; 0D18 3505 XFORMAT 0D18 A548 3506 LDA ZSBA+1 ;MOVE VTOC BUF ADR 0D1A 8D0503 3507 STA DCBBUF+1 ;TO DCB 0D1D A547 3508 LDA ZSBA 0D1F 8D0403 3509 STA DCBBUF 0D22 A921 3510 LDA #DCBCFD ;FORMAT 0D24 8D0203 3511 STA DCBCMD ;TO DCB 0D27 A940 3512 LDA #$40 ;TELL SIO RECEIVING DATA 0D29 8D0303 3513 STA DCBSTA 0D2C AEFE12 3514 LDX DRVTYP ;GET DR TYPE 128 OR 256 0D2F A931 3515 LDA #$31 ;BUS I.D. 0D31 AC4602 3516 LDY DSKTIM ;GET FORMAT TIME OUT VALUE 0D34 208607 3517 JSR DSIO2 ;GOTO LOCAL DISK HANDLER THEN SIO 3518 ; 0D37 1019 3519 BPL XF0 ;IF NO ERRORS CONT FORMATING 0D39 C090 3520 CPY #$90 ;ELSE CK FOR DEVICE DONE ERROR 0D3B D012 3521 BNE XFERR ;NO, THEN ERROR EXIT 3522 ; 0D3D 3523 TSTFMT = * ;ELSE CK FOR BAD SECTOR INFO 0D3D A000 3524 LDY #0 ;RETURNED BY CONTROLLER 0D3F B147 3525 LDA (ZSBA),Y 0D41 C9FF 3526 CMP #$FF 0D43 D007 3527 BNE XFBAD ;BAD SECTORS RET ERR MSG 0D45 C8 3528 INY 0D46 B147 3529 LDA (ZSBA),Y 0D48 C9FF 3530 CMP #$FF 0D4A F003 3531 BEQ XFERR ;NOT BAD SEC ERR, REQ ERR EXIT 0D4C 4CB512 3532 XFBAD JMP ERDBAD 3533 ; 0D4F 4CD312 3534 XFERR JMP RETURN ;DO ERROR EXIT 3535 ; 0D52 3536 XF0 0D52 A900 3537 LDA #0 0D54 A8 3538 TAY 0D55 9145 3539 XF1 STA (ZDRVA),Y 0D57 C8 3540 INY 0D58 10FB 3541 BPL XF1 3542 ; 0D5A A000 3543 LDY #0 ;SET 0D5C A902 3544 LDA #2 ;TYPE = 2 0D5E 9145 3545 STA (ZDRVA),Y 0D60 C8 3546 INY 0D61 A9C3 3547 LDA #$C3 ;SET MSN AND 0D63 9145 3548 STA (ZDRVA),Y ;NSA=107=2C3 0D65 C8 3549 INY 0D66 C8 3550 INY 0D67 9145 3551 STA (ZDRVA),Y FORMAT 0D69 A902 3552 LDA #$02 0D6B 88 3553 DEY 0D6C 9145 3554 STA (ZDRVA),Y 0D6E C8 3555 INY 0D6F C8 3556 INY 0D70 9145 3557 STA (ZDRVA),Y 3558 ; 0D72 A00A 3559 LDY #DVDSMP 0D74 A9FF 3560 LDA #$FF ;SET SECTOR MAP TO 0D76 9145 3561 XF2 STA (ZDRVA),Y ;ALL ONES 0D78 C8 3562 INY 0D79 C064 3563 CPY #DVDSMP+90 0D7B D0F9 3564 BNE XF2 3565 ; 0D7D A90F 3566 LDA #$0F ;DEALOCATE 1ST 4 SECTORS 0D7F A00A 3567 LDY #DVDSMP ;FOR BOOT 0D81 9145 3568 STA (ZDRVA),Y 3569 ; 0D83 A037 3570 LDY #DVDSMP+45 ;DEALLOCATE MIDDLE 9 0D85 A900 3571 LDA #0 0D87 9145 3572 STA (ZDRVA),Y ;FOR 0D89 C8 3573 INY ;VTOC AND FILE DIR 0D8A A97F 3574 LDA #$7F 0D8C 9145 3575 STA (ZDRVA),Y 3576 ; 0D8E 209510 3577 JSR WRTVTOC ;WRITE THE VTOC 3578 ; 0D91 A900 3579 LDA #0 ;0 FILLE DIR SECTORS 0D93 A8 3580 TAY 0D94 990114 3581 XF3 STA FILDIR,Y ;USE FILE DIR BUFFER 0D97 C8 3582 INY 0D98 10FA 3583 BPL XF3 3584 ; 0D9A A907 3585 LDA #7 ;WRITE TO ALL 8 DIR SECTORS 0D9C 8D0613 3586 STA CDIRS 0D9F 207110 3587 XF4 JSR WRTDIR 0DA2 CE0613 3588 DEC CDIRS 0DA5 10F8 3589 BPL XF4 3590 ; 0DA7 201912 3591 JSR DELDOS ;SET NO DOS 3592 ; 0DAA 4CEA12 3593 JMP FGREAT ;DONE LIST DIRECTORY 0DAD 3594 .PAGE "LIST DIRECTORY" 3595 ; 3596 ; LISTDIR - LIST THE DIRECTORY 3597 ; GDCHAR - GET NEXT DIR CHARACTER 3598 ; THE DIRECTORY IS LISTED VIA OPEN 3599 ; LIST DIRECTORY FUNCTION EACH DIR 3600 ; ENTRY THAT MATCHES THE FILE SPEC 3601 ; IS CONVERTED TO A PRINTABLE FORMAT 3602 ; INTO A SECTOR BUFFER. THE GET BYTE 3603 ; ENTRY IS USED TO GET THE PRINTABLE 3604 ; CHARACTERS ONE AT A TIME. THE 3605 ; LAST LINE PRINTED IS ALWAYS A 3606 ; COUNT OF THE NUMBET OF SECTORS IN USE 3607 ; AND THE NUMBER REMAINING AVAILABLE SECTORS 3608 ; 0DAD 3609 LISTDIR 0DAD A900 3610 LDA #0 0DAF 8D0F13 3611 STA TEMP4 0DB2 20210F 3612 JSR SFDIR ;SEARCH FOR A FILE NAME 0DB5 902C 3613 BCC LDENT1 ;BR IF FOUND 0DB7 B030 3614 BCS LDCNT ;BR IF NOT FOUND 3615 ; 0DB9 3616 GDCHAR 0DB9 2C0F13 3617 BIT TEMP4 ;TEST FLAG 0DBC 3053 3618 BMI LDDONE ;BR IF ALL DONE 3619 ; 0DBE AC0F13 3620 LDY TEMP4 ;GET COUNT OF CHARS SENT 0DC1 B147 3621 LDA (ZSBA),Y ;GET NEXT CHAR 0DC3 8D0813 3622 STA SVDBYT ; IN SVDBYT 0DC6 EE0F13 3623 INC TEMP4 ;INC COUNT 0DC9 C99B 3624 CMP #EOL ;TEST IF EOL DONE 0DCB D009 3625 BNE GDCRTN ;BR NOT EOL 0DCD C011 3626 CPY #17 ;WAS THIS AN ENTRY 0DCF B008 3627 BCS LDENT ;BR IF IT WAS 0DD1 A980 3628 LDA #$80 ;ELSE INDICATE END 0DD3 8D0F13 3629 STA TEMP4 ;IN TEMP4 3630 ; 0DD6 4CF012 3631 GDCRTN JMP GREAT ;DONE 3632 ; 0DD9 A900 3633 LDENT LDA #0 ;CLEAR CHAR COUNTER 0DDB 8D0F13 3634 STA TEMP4 0DDE 20310F 3635 JSR CSFDIR ;SEARCH FOR NEXT MATCH 0DE1 B006 3636 BCS LDCNT ;BR NO MORE MATCHES 0DE3 3637 LDENT1 0DE3 20210E 3638 JSR FDENT ;FORMAT ENTRY 0DE6 4CF012 3639 JMP GREAT ;DONE 3640 ; 0DE9 208B10 3641 LDCNT JSR RDVTOC ;READ VTOC 0DEC A004 3642 LDY #DVDNSA+1 ;GET # SECTOR AVR 0DEE B145 3643 LDA (ZDRVA),Y 0DF0 48 3644 PHA LIST DIRECTORY 0DF1 88 3645 DEY 0DF2 B145 3646 LDA (ZDRVA),Y 0DF4 A8 3647 TAY 0DF5 68 3648 PLA 3649 ; 0DF6 20570E 3650 JSR CVDX ;AND CONVERT 3651 ; 0DF9 A003 3652 LDY #3 ;SET EOL 0DFB A20C 3653 LDX #FSCML-1 ;PUT IN CUTE 0DFD BD140E 3654 MVFSCM LDA FSCM,X ; MSG 0E00 9147 3655 STA (ZSBA),Y 0E02 C8 3656 INY 0E03 CA 3657 DEX 0E04 10F7 3658 BPL MVFSCM 0E06 20670E 3659 JSR CVDY 3660 ; 0E09 A900 3661 LDA #0 ; SET CHAR CNT 0E0B 8D0F13 3662 STA TEMP4 0E0E 4CEA12 3663 JMP FGREAT 3664 ; 0E11 3665 LDDONE 0E11 4CF412 3666 JMP ERREOF ;END OF FILE 3667 ; 0E14 53 3668 FSCM .BYTE "SROTCES EERF " 0E15 52 0E16 4F 0E17 54 0E18 43 0E19 45 0E1A 53 0E1B 20 0E1C 45 0E1D 45 0E1E 52 0E1F 46 0E20 20 000D 3669 FSCML = *-FSCM 0E21 35 .INCLUDE #E: 0E21 40 .INCLUDE #D:ATFMS3.SRC LIST DIRECTORY 0E21 4000 .PAGE 4001 ; 4002 ; FORMAT DIR ENTRY INTO A SECTOR BUFFER 4003 ; 0E21 4004 FDENT 0E21 A000 4005 LDY #0 ;START AT DISPL ZERO 0E23 A920 4006 LDA #$20 ;START WITH A BLANK 0E25 9147 4007 STA (ZSBA),Y 0E27 AE0513 4008 LDX CDIRD 0E2A BD0114 4009 LDA FILDIR+DFDFL1,X 0E2D 2920 4010 AND #DFDLOC ;BUT IF FILE LOCKED 0E2F F004 4011 BEQ LD1 0E31 A92A 4012 LDA #'* ;CHANGE TO AST 0E33 9147 4013 STA (ZSBA),Y 0E35 C8 4014 LD1 INY 0E36 A920 4015 LDA #$20 ;FOLLOWED BY A BLANK 0E38 9147 4016 STA (ZSBA),Y 0E3A C8 4017 INY 4018 ; 0E3B BD0614 4019 LD2 LDA FILDIR+DFDPFN,X ;MOVE THE I2 CHAR 0E3E 9147 4020 STA (ZSBA),Y ;FILE NAME 0E40 E8 4021 INX 0E41 C8 4022 INY 0E42 C00D 4023 CPY #13 0E44 90F5 4024 BCC LD2 4025 ; 0E46 A920 4026 LDA #$20 ;FOLLOWED BY A BLANK 0E48 9147 4027 STA (ZSBA),Y 0E4A C8 4028 INY 0E4B 8C0F13 4029 STY TEMP4 ;SAVE INDEX = 15 4030 ; 0E4E AE0513 4031 LDX CDIRD 0E51 BC0214 4032 LDY FILDIR+DFDCNT,X ;SET A,Y 0E54 BD0314 4033 LDA FILDIR+DFDCNT+1,X ;=SECTOR COUNT 4034 ; 0E57 4035 CVDX 0E57 A264 4036 LDX #100 ;CONVERT AND MOVE 0E59 20710E 4037 JSR CVDIGIT ;100S DIGIT 0E5C A20A 4038 LDX #10 0E5E 20710E 4039 JSR CVDIGIT ;10S DIGIT 0E61 98 4040 TYA 0E62 208D0E 4041 JSR STDIGIT ;1S DIGIT 4042 ; 0E65 A011 4043 LDY #17 ;THEN PUT OUT 0E67 A99B 4044 CVDY LDA #EOL ;AND EOL 0E69 9147 4045 STA (ZSBA),Y 0E6B A000 4046 LDY #0 0E6D 8C0F13 4047 STY TEMP4 ;SET CHAR CNT = 0 0E70 60 4048 RTS 4049 ; 0E71 8E0E13 4050 CVDIGIT STX TEMP3 ;SAVE DIGIT VALUE LIST DIRECTORY 0E74 A2FF 4051 LDX #$FF 4052 ; 0E76 8D0D13 4053 CVD1 STA TEMP2 ;SAVE CURR VALUE HI 0E79 8C0C13 4054 STY TEMP1 ;AND LOW 0E7C E8 4055 INX ; INC DIGIT COUNTER 0E7D 38 4056 SEC ;SUBRTACT DIGIT VALUE 0E7E AD0C13 4057 LDA TEMP1 ;FROM CUR VALUE 0E81 ED0E13 4058 SBC TEMP3 0E84 A8 4059 TAY 0E85 AD0D13 4060 LDA TEMP2 0E88 E900 4061 SBC #0 0E8A B0EA 4062 BCS CVD1 ;IF NOT GONE MINUS, DO AGAIN 4063 ; 0E8C 8A 4064 TXA ;DIGIT TO ACU 0E8D 0930 4065 STDIGIT ORA #$30 ;PLUS ASCII ZERO 0E8F AC0F13 4066 LDY TEMP4 ;GET OUTPUT INDEX 0E92 9147 4067 STA (ZSBA),Y ;AND SET DIGIT 0E94 EE0F13 4068 INC TEMP4 ; INC OUTPUT INDEX 0E97 AD0D13 4069 LDA TEMP2 ;LOAD VALUE HI 0E9A AC0C13 4070 LDY TEMP1 ;AND VALUE LO 0E9D 60 4071 RTS FILE NAME DECODE 0E9E 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 ; 0E9E 4096 FNDCODE 0E9E BD4403 4097 LDA ICBAL,X 0EA1 8543 4098 STA ZBUFP 0EA3 BD4503 4099 LDA ICBAH,X 0EA6 8544 4100 STA ZBUFP+1 0EA8 A002 4101 LDY #2 ;FIND THE 'D' 0EAA B143 4102 FD0A LDA (ZBUFP),Y 0EAC 88 4103 DEY 0EAD 3058 4104 BMI FNDERR ;BR IF 256 CHARS SEEN 0EAF C93A 4105 CMP #': 0EB1 D0F7 4106 BNE FD0A 0EB3 4107 FD0B 0EB3 C8 4108 INY 4109 ; 0EB4 4110 FNDCNX 0EB4 A20B 4111 LDX #11 ;CLEAR FILENAME TO BLANKS 0EB6 A920 4112 LDA #$20 0EB8 9D5913 4113 FD0 STA FNAME,X 0EBB CA 4114 DEX 0EBC 10FA 4115 BPL FD0 4116 ; 0EBE A200 4117 LDX #0 ;SET FNAME CHAR CNT TO 0 0EC0 8E0C13 4118 STX EXTSW ;SET NOT IN EXTENSION 4119 ; 4120 ; 0EC3 C8 4121 FD1 INY ;INC ZBUFP INDEX 0EC4 B143 4122 LDA (ZBUFP),Y ;GET BUF CHAR FILE NAME DECODE 4123 ; 0EC6 C92A 4124 CMP #'* ;TEST FOR WILD CARDS 0EC8 D00B 4125 BNE FD3 ;BR NOT WILD CARD 4126 ; 0ECA A93F 4127 FD2 LDA #'? ;LOAD ? WILD CARD 0ECC 200A0F 4128 JSR FDSCHAR ;GO STORE IT 0ECF 90F9 4129 BCC FD2 ;BR IF PORX NOT FULL 0ED1 10F0 4130 BPL FD1 ; BR IF AT START OF X 0ED3 302E 4131 BMI FDEND ;BR IF AT X END 4132 ; 0ED5 C92E 4133 FD3 CMP #'. ;WAS CHAR FIELD SEPERATOR 0ED7 D00C 4134 BNE FD4 ;BR IF NOT 0ED9 2C0C13 4135 BIT EXTSW ;WAS THERE ALREADY 1 CHAR 0EDC 3025 4136 BMI FDEND ;BR IF WAS END 0EDE A208 4137 LDX #8 ;ADV FNAME INDEX TO XFIELD 0EE0 6E0C13 4138 ROR EXTSW ;SET EXTSW - MINUS 0EE3 90DE 4139 BCC FD1 ;CONT WITH NEXT CHAR 4140 ; 0EE5 C93F 4141 FD4 CMP #'? ;WAS IT WILD CARD 0EE7 F014 4142 BEQ FD6 ;BR IF WILD CARD 4143 ; 0EE9 C941 4144 CMP #'A ;IS CHAR ALPHA 0EEB 9004 4145 BCC FD5 ;BR NOT ALPHA 0EED C95B 4146 CMP #$5B ;TEXT HI ALPHA 0EEF 900C 4147 BCC FD6 ;BR IF NOT APLHA 4148 ; 0EF1 E000 4149 FD5 CPX #0 ;IF FIRST CHAR NOT 0EF3 F012 4150 BEQ FNDERR ;ALPHA THEN ERROR 4151 ; 0EF5 C930 4152 CMP #$30 ;IS CHAR NUMERIC 0EF7 900A 4153 BCC FDEND ;BR NOT NUMERIC (END OF NAME) 0EF9 C93A 4154 CMP #$3A ;TEST NUMERIC HI 0EFB B006 4155 BCS FDEND ; BR NO NUMBER 4156 ; 0EFD 200A0F 4157 FD6 JSR FDSCHAR ;STORE THE CHAR 0F00 4CC30E 4158 JMP FD1 ;AND CONTINUE WITH NEXT 4159 ; 0F03 AE0113 4160 FDEND LDX CURFCB ;RESTORE X REG 0F06 60 4161 RTS 4162 ; 0F07 4CC512 4163 FNDERR JMP ERRFN ;INDICATE FILENAME ERROR FMS - 128/256 BYTE SECTOR (2.0S) FILE NAME DECODE 0F0A 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 ; 0F0A 4177 FDSCHAR 0F0A E008 4178 CPX #8 ;AT EXECUTION 0F0C 900D 4179 BCC FDSC2 ;BR IF NOT 0F0E F005 4180 BEQ FDSC1 ;BR IF 1ST CHAR OF 4181 ; 0F10 E00C 4182 CPX #12 ;AT END OF EXIT 0F12 9007 4183 BCC FDSC2 ;BR NOT AT END 0F14 60 4184 RTS 4185 ; 0F15 2C0C13 4186 FDSC1 BIT EXTSW ;DO NOT STORE CHAR UNLESS 0F18 3001 4187 BMI FDSC2 ;PERIOD WAS SEEN 0F1A 60 4188 RTS 4189 ; 0F1B 9D5913 4190 FDSC2 STA FNAME,X ;SET CHAR INTO NAME 0F1E E8 4191 INX ;INC TO NEXT CHAR 0F1F 18 4192 CLC 0F20 60 4193 RTS DIRECTORY SEARCH 0F21 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 ; 0F21 4218 SFDIR 0F21 A9FF 4219 LDA #$FF ;INIT TO -1 0F23 8D0213 4220 STA DHOLES ;DIR HOLE SECTOR 0F26 8D0613 4221 STA CDIRS ;CUR DIR SECTOR 0F29 8D0713 4222 STA SFNUM ;FILE NUMBER 0F2C A970 4223 LDA #$70 ;INIT TO -16 (-ENTRY LENGTH) 0F2E 8D0513 4224 STA CDIRD ;CUR DIR DISPL 4225 ; 0F31 4226 CSFDIR 0F31 EE0713 4227 INC SFNUM 0F34 18 4228 CLC 0F35 AD0513 4229 LDA CDIRD ;CDIRD=CDIRD+ENTRY LEN 0F38 6910 4230 ADC #DFDELN 0F3A 1011 4231 BPL SFD2 ;IF RESULT <128 THEN BR 4232 ; ELSE AT END OF DIR SECT 0F3C EE0613 4233 INC CDIRS ;INC TO NEXT DIR SECTOR 0F3F A908 4234 LDA #8 ;TEST END OF DIR 0F41 CD0613 4235 CMP CDIRS 0F44 9002 4236 BCC SFD1 ;BR NOT END 0F46 F048 4237 BEQ SDRTN 4238 ; 0F48 206E10 4239 SFD1 JSR RDDIR ;READ THE NEXT DIR RECORD 0F4B A900 4240 LDA #0 ;SET DIR DISPL = 0 4241 ; 0F4D 8D0513 4242 SFD2 STA CDIRD ;SET NEW DIR DISPL 0F50 A8 4243 TAY ;PUT DISPL IN Y AS INDEX 4244 ; DIRECTORY SEARCH 0F51 B90114 4245 LDA FILDIR+DFDFL1,Y ;GET FLAG 1 0F54 F01D 4246 BEQ SFDSH ;BR IF UNUSED (END OF USED ENTRIES) 0F56 301B 4247 BMI SFDSH ;BR IF DELETED 0F58 2901 4248 AND #DFDOUT ;IF OPEN OUTPUT 0F5A D0D5 4249 BNE CSFDIR ;DON'T FIND IT 4250 ; 4251 ; ENTRY IN USE, TEST FOR MATCH 0F5C A200 4252 LDX #0 ;TEST MATCH ON 12 CHARS 0F5E BD5913 4253 SFD3 LDA FNAME,X ;FILE NAME CHAR 0F61 C93F 4254 CMP #'? ;IS FNC WILD CARD 0F63 F005 4255 BEQ SFD4 ;THEN IT MATCHES 0F65 D90614 4256 CMP FILDIR+DFDPFN,Y ;ELSE IT MUST MATCH FOR REAC 0F68 D0C7 4257 BNE CSFDIR ;IF NOT MATCH THEN TRY NEXT 0F6A E8 4258 SFD4 INX ;INC CHAR CNT 0F6B C8 4259 INY 0F6C E00B 4260 CPX #11 ;TEST ALL 0F6E D0EE 4261 BNE SFD3 ;AND CONTINUE CHECK 4262 ; 0F70 18 4263 CLC ;WE HAVE A MATCH 0F71 901D 4264 BCC SDRTN 4265 ; 0F73 4266 SFDSH 0F73 AD0213 4267 LDA DHOLES ;IF DHOLES NOT MINUS 0F76 1012 4268 BPL SFDSH1 ;THEN ALREADY HAVE A GOOD HOLE 4269 ; 4270 ; ELSE 4271 ; 0F78 AD0613 4272 LDA CDIRS ;MOVE CURR DISPL SECTOR 0F7B 8D0213 4273 STA DHOLES ;AND CURRENT DIR DISPL 0F7E AD0513 4274 LDA CDIRD ;TO HOLE SECTOR AND DISPL 0F81 8D0313 4275 STA DHOLED 0F84 AD0713 4276 LDA SFNUM ;SAVE HOLE 0F87 8D0413 4277 STA DHFNUM ;FILE NUMBER 4278 ; 0F8A B90114 4279 SFDSH1 LDA FILDIR+DFDFL1,Y ;IF HOLE WAS A DELETED 0F8D 30A2 4280 BMI CSFDIR ;ENTRY THEN CONTINUE 4281 ; 4282 ; ELSE WE ARE AT END OF 4283 ; 0F8F 38 4284 SEC ;USED ENTRIES THUS FILE NOT FOUND 0F90 AE0113 4285 SDRTN LDX CURFCB ;RESTORE X REG 0F93 60 4286 RTS WRITE DATA SECTOR 0F94 4287 .PAGE "WRITE DATA SECTOR" 4288 ; 4289 ; WRTNXS - WRITE NEXT SECTOR 4290 ; 0F94 4291 WRTNXS 0F94 BD8513 4292 LDA FCBFLG,X ;IF ACQUIRING SECTORS 0F97 300F 4293 BMI WRTN1 ;THEN NOT UPDATE 4294 ; 0F99 0A 4295 ASL A ;IF SECTOR NOT MODIFIED 0F9A 1009 4296 BPL WRU1 ;THEN DON'T IT 4297 ; 0F9C 0A 4298 ASL A 0F9D 9D8513 4299 STA FCBFLG,X ;TURN OFF FLAG BITS 0FA0 20F80F 4300 JSR WRCSIO ;WRITE CURRENT SECTOR 0FA3 3024 4301 BMI WRNERR ;BR IF BAD I/O 0FA5 4C0F10 4302 WRU1 JMP RDNXTS ;ELSE READ NEXT SECTOR 4303 ; 0FA8 200611 4304 WRTN1 JSR GETSECTOR ;GET A NEW SECTOR 4305 ; 0FAB BD8713 4306 WRTLSEC LDA FCBDLN,X ;GET DATA LEN 0FAE ACFB12 4307 WRTLS1 LDY DRVLBT ;INTO LAST BYTE 0FB1 9147 4308 STA (ZSBA),Y ;OF SECTOR 4309 ; 0FB3 BD8C13 4310 WRTN2 LDA FCBLSN+1,X ;MOVE LINK SECTOR 0FB6 1D8113 4311 ORA FCBFNO,X ;PLUS FILE NUM 0FB9 ACF812 4312 LDY DRVMDL ;TO BYTES 126,127 0FBC 9147 4313 STA (ZSBA),Y ;OF SECTOR BUFF 0FBE C8 4314 INY 0FBF BD8B13 4315 LDA FCBLSN,X 0FC2 9147 4316 STA (ZSBA),Y 4317 ; 0FC4 20F80F 4318 JSR WRCSIO ;WRITE SECTOR 0FC7 1011 4319 BPL WRTN5 ;BR NOT ERROR 4320 ; 0FC9 AD0303 4321 WRNERR LDA DCBSTA ;SAVE ERROR STATUS 0FCC 8D0F13 4322 STA TEMP4 0FCF A900 4323 LDA #0 ;CLOSE FILE 0FD1 9D8213 4324 STA FCBOTC,X 0FD4 AD0F13 4325 LDA TEMP4 ;RECOVER ERROR CODE 0FD7 4CD312 4326 JMP RETURN 4327 ; 0FDA 4328 WRTN5 0FDA FE8F13 4329 INC FCBCNT,X ;INC SECTOR CNT 0FDD D003 4330 BNE WRTN6 0FDF FE9013 4331 INC FCBCNT+1,X 0FE2 4332 WRTN6 0FE2 200210 4333 JSR MVLSN ;LINK TO CUR 0FE5 A900 4334 LDA #0 0FE7 9D8B13 4335 STA FCBLSN,X ;LINK = 0 0FEA 9D8C13 4336 STA FCBLSN+1,X 0FED 9D8713 4337 STA FCBDLN,X ;DLN = 0 WRITE DATA SECTOR 0FF0 ADF812 4338 LDA DRVMDL 0FF3 9D8613 4339 STA FCBMLN,X 0FF6 4340 WRNRTS 0FF6 18 4341 CLC 0FF7 60 4342 RTS 4343 ; 0FF8 38 4344 WRCSIO SEC ;WRITE CUR SECTOR 0FF9 BD8A13 4345 RWCSIO LDA FCBCSN+1,X 0FFC BC8913 4346 LDY FCBCSN,X 0FFF 4CF711 4347 JMP DSIO 4348 ; 1002 BD8B13 4349 MVLSN LDA FCBLSN,X ;MOVE LINK 1005 9D8913 4350 STA FCBCSN,X 1008 BD8C13 4351 LDA FCBLSN+1,X 100B 9D8A13 4352 STA FCBCSN+1,X 100E 60 4353 RTS 4354 ; 100F 45 .INCLUDE #E: 100F 50 .INCLUDE #D:ATFMS4.SRC READ DATA SECTOR 100F 5000 .PAGE "READ DATA SECTOR" 5001 ; 5002 ; RDNXTS - READ NEXT SECTOR 5003 ; 100F 5004 RDNXTS 100F BD8513 5005 LDA FCBFLG,X ;IF NOT UPD MODE 1012 F003 5006 BEQ RDNSO ;BR 1014 4C940F 5007 JMP WRTNXS ;ELSE WRITE FIRST 1017 5008 RDNSO = * 1017 BD8B13 5009 LDA FCBLSN,X ;IF LSN NOT 101A 1D8C13 5010 ORA FCBLSN+1,X ;ZERO 101D D002 5011 BNE RDNS1 ;BR 101F 38 5012 SEC ;ELSE EOF 1020 60 5013 RTS 1021 200210 5014 RDNS1 JSR MVLSN ;MOVE LINK TO CURRENT 1024 18 5015 CLC ;READ 1025 20F90F 5016 JSR RWCSIO ;CURRENT SECTOR 1028 3035 5017 BMI RDIOER ;BR IF OK READ 5018 ; 5019 ; ELSE GOTO I/O ERROR 5020 ; 102A ACF812 5021 LDY DRVMDL 102D B147 5022 LDA (ZSBA),Y ;TEST FOR SAME 102F 29FC 5023 AND #$FC ;FILE NO 1031 DD8113 5024 CMP FCBFNO,X 1034 D02C 5025 BNE RDFNMM ;IF NOT THEN ERROR 5026 ; 1036 B147 5027 LDA (ZSBA),Y ;MOVE LINK SECTOR 1038 2903 5028 AND #$03 103A 9D8C13 5029 STA FCBLSN+1,X 103D C8 5030 INY 103E B147 5031 LDA (ZSBA),Y 1040 9D8B13 5032 STA FCBLSN,X 5033 ; 1043 C8 5034 INY ;INC TO LEN BYTE 1044 B147 5035 LDA (ZSBA),Y ;GET LEN BYTE 1046 48 5036 PHA ;SAVE IT 1047 BD8413 5037 LDA FCBSLT,X ;GET SECTOR LEN TYPE 104A D008 5038 BNE RDNS3 ;BR IF NEW TYPE 5039 ; 104C 68 5040 PLA ;GET LEN 104D 3002 5041 BMI RDNS2 ;BR IF OLD SHORT SECTOR 104F A97D 5042 LDA #125 ;ELSE SET FULL SECTOR 1051 297F 5043 RDNS2 AND #$7F ;TURN OFF MSB 1053 48 5044 PHA ;BALANCE STACK 5045 ; 1054 68 5046 RDNS3 PLA 1055 9D8613 5047 STA FCBMLN,X ;SET MAX LEN 5048 ; 1058 A900 5049 LDA #0 ;SET CUR DATA LEN = 0 105A 9D8713 5050 STA FCBDLN,X READ DATA SECTOR 105D 18 5051 CLC 105E 60 5052 RTS 105F 20E512 5053 RDIOER JSR ERRIO ;I/O ERROR 1062 5054 RDFNMM = * ;FILE NUMBER MISMATCH 1062 BD4203 5055 LDA ICCOM,X 1065 C921 5056 CMP #$21 ;WAS THIS DELETE 1067 F003 5057 BEQ RDDELE ;BR IF DELETE 1069 20C712 5058 JSR ERFNMM ;BR NOT DELETE 106C 38 5059 RDDELE SEC ;INDICATE EOF TO DELETE 106D 60 5060 RTS 5061 ; READ/WRITE DIR 106E 5062 .PAGE "READ/WRITE DIR" 5063 ; 5064 ; RDDIR/WRDIR READ/WRITE DIRECTORY 5065 ; 106E 18 5066 RDDIR CLC ;SET READ 106F 9001 5067 BCC DIRIO 5068 ; 1071 38 5069 WRTDIR SEC ;SET WRITE 5070 ; 1072 08 5071 DIRIO PHP ;SAVE READ WRITE 1073 A914 5072 LDA #FILDIR/256 ;MOVE BUF ADDR 1075 8D0503 5073 STA DCBBUF+1 ;TO DCB 1078 A901 5074 LDA #FILDIR&255 107A 8D0403 5075 STA DCBBUF 5076 ; 107D 18 5077 CLC 107E AD0613 5078 LDA CDIRS ;CDIRS+ 1081 6969 5079 ADC #$69 ;((40*18)/2)+1 1083 A8 5080 TAY ;INTO A,Y 1084 A901 5081 LDA #1 ;IS DIR SECTOR NUMBER 1086 6900 5082 ADC #0 5083 ; 1088 4CAB10 5084 JMP DSYSIO ;GO DO SYSTEM I/O 5085 ; READ/WRITE VTOC 108B 5086 .PAGE "READ/WRITE VTOC" 5087 ; 5088 ; RDVTOC/WRCTOC - READ/WRITE VTOC 5089 ; 108B 5090 RDVTOC 108B A005 5091 LDY #DVDWRQ ;IF WRITE REQD 108D B145 5092 LDA (ZDRVA),Y 108F F001 5093 BEQ RDVGO 1091 60 5094 RTS 1092 18 5095 RDVGO CLC ;SET READ 1093 9007 5096 BCC VTIO 5097 ; 1095 5098 WRTVTOC 1095 A005 5099 WRVTOC LDY #DVDWRQ ;TURN OFF 1097 A900 5100 LDA #0 ;WRITE READ 1099 9145 5101 STA (ZDRVA),Y 109B 38 5102 SEC 5103 ; 5104 ; 109C 08 5105 VTIO PHP ;SAVE R/W 109D A546 5106 LDA ZDRVA+1 ;MOVE BUF ADDR 109F 8D0503 5107 STA DCBBUF+1 ;TO DCB 10A2 A545 5108 LDA ZDRVA 10A4 8D0403 5109 STA DCBBUF 5110 ; 10A7 A068 5111 LDY #$68 ;READ SECTOR 10A9 A901 5112 LDA #1 ;(40*18)/2 5113 ; 10AB 5114 DSYSIO 10AB 28 5115 PLP 10AC 5116 DSYSIA 10AC AEFE12 5117 LDX DRVTYP ;LOAD DRIVE TYPE 10AF 206C07 5118 JSR BSIO ;GO DO I/O 10B2 3001 5119 BMI DSIOER ;BR IF ERROR 10B4 60 5120 RTS ;RETURN 5121 ; 5122 ; 10B5 C983 5123 DSIOER CMP #DCBDER ;WAS IT DATA ERROR 10B7 F003 5124 BEQ DEAD ;BR IF WAS 10B9 4CE512 5125 JMP ERRIO ;ELSE USER PROBLEM 5126 ; 10BC 4CC912 5127 DEAD JMP ERRSYS ;FATAL ERROR 5128 ; 5129 ; OPEN VTOC 5130 ; 10BF 5131 OPVTOC 10BF 208B10 5132 JSR RDVTOC ;READ IT 10C2 4C9510 5133 JMP WRTVTOC ;THEN WRITE IT 5134 ; 5135 ; INSURES NOT PROTECTED 5136 ; FREE SECTOR 10C5 5137 .PAGE "FREE SECTOR" 5138 ; 5139 ; FRESECT - FREE CURRENT SECTOR 5140 ; 10C5 5141 FRESECT 10C5 BD8913 5142 LDA FCBCSN,X 10C8 1D8A13 5143 ORA FCBCSN+1,X 10CB F038 5144 BEQ FSRTS 10CD A900 5145 LDA #0 10CF A003 5146 LDY #3 ;DIVIDE SECTOR # 10D1 5E8A13 5147 FS1 LSR FCBCSN+1,X ;BY 3 TO GET BYTE NO 10D4 7E8913 5148 ROR FCBCSN,X ;WITH REM IN ACU 10D7 6A 5149 ROR A 10D8 88 5150 DEY 10D9 D0F6 5151 BNE FS1 5152 ; 10DB A005 5153 LDY #5 10DD 6A 5154 FS2 ROR A ;TO FOR BYT BIT NO 10DE 88 5155 DEY 10DF D0FC 5156 BNE FS2 5157 ; 10E1 A8 5158 TAY ;BIT NO (0-7) INTO Y 10E2 A900 5159 LDA #0 10E4 38 5160 SEC ;SHIFT IN A BIT 10E5 6A 5161 FS3 ROR A ;TO PROPER LOCATION 10E6 88 5162 DEY 10E7 10FC 5163 BPL FS3 10E9 48 5164 PHA ;SAVE MASK 10EA BD8913 5165 LDA FCBCSN,X ;GET BYTE NO 10ED 690A 5166 ADC #DVDSMP ;ADD OFFSET TO SMAP 10EF A8 5167 TAY ;RESULT IS VTOC INDEX 5168 ; 10F0 68 5169 PLA ;GET BIT MASK 10F1 1145 5170 ORA (ZDRVA),Y ;OF BIT TO BIT MAP 10F3 9145 5171 STA (ZDRVA),Y ;AND SET RESULTS 5172 ; 10F5 A003 5173 LDY #DVDNSA ;INC NO OF SECTORS AVAIL 10F7 B145 5174 LDA (ZDRVA),Y 10F9 18 5175 CLC 10FA 6901 5176 ADC #1 10FC 9145 5177 STA (ZDRVA),Y 10FE C8 5178 INY 10FF B145 5179 LDA (ZDRVA),Y 1101 6900 5180 ADC #0 1103 9145 5181 STA (ZDRVA),Y 5182 ; 1105 5183 FSRTS = * 1105 60 5184 RTS 5185 ; GET SECTOR 1106 5186 .PAGE "GET SECTOR" 5187 ; 5188 ; GET SECTOR - GET A FREE SECTOR FOR 5189 ; USE IN FCB AT X REG. THE SECTOR 5190 ;NUMBER IS PLACED IN FCBLSN 5191 ; 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 ; 1106 5198 GETSECTOR 1106 A009 5199 LDY #DVDSMP-1 ;SET Y TO START MAP-l 5200 ; 1108 C8 5201 GS1 INY ;INC SMAP INDEX 1109 C064 5202 CPY #90+DVDSMP ;AT END OF MAP? 110B B054 5203 BCS GSERR ;BR IF AT END 110D B145 5204 LDA (ZDRVA),Y ;GET A MAP BYTE 110F F0F7 5205 BEQ GS1 ;BR NO FREE SECTOR IN BYTE 5206 ; 1111 8C0C13 5207 STY TEMP1 ;SAVE MAP INDEX 1114 48 5208 PHA ;DEC NO OF SECTORS AVAIL 1115 38 5209 SEC 1116 A003 5210 LDY #DVDNSA 1118 B145 5211 LDA (ZDRVA),Y 111A E901 5212 SBC #1 111C 9145 5213 STA (ZDRVA),Y 111E C8 5214 INY 111F B145 5215 LDA (ZDRVA),Y 1121 E900 5216 SBC #0 1123 9145 5217 STA (ZDRVA),Y 5218 ; 1125 C8 5219 INY ;SET READ REQD 1126 A9FF 5220 LDA #$FF 1128 9145 5221 STA (ZDRVA),Y 5222 ; 112A 68 5223 PLA 112B A0FF 5224 LDY #$FF ;SET BIT COUNTER =-1 5225 ; 112D C8 5226 GS2 INY ;SHIFT MAP BYTE 112E 0A 5227 ASL A ;UNTIL A FREE SECTOR 112F 90FC 5228 BCC GS2 ;FOUND 1131 8C0D13 5229 STY TEMP2 ;SAVE BIT NUMBER 1134 4A 5230 GS3 LSR A ;AND SHIFT BYTE 1135 88 5231 DEY ;BACKS TO ITS ORIGINAL 1136 10FC 5232 BPL GS3 ;POSITION AND PUT IT 1138 AC0C13 5233 LDY TEMP1 ;BACK INTO THE MAP 113B 9145 5234 STA (ZDRVA),Y 5235 ; 5236 ; GET SECTOR 113D 38 5237 SEC ;SECTOR NAP BYTE 113E AD0C13 5238 LDA TEMP1 ;=DISPL-DVDSMP 1141 E90A 5239 SBC #DVDSMP 5240 ; 1143 A000 5241 LDY #0 1145 8C0C13 5242 STY TEMP1 ;CLEAR SECT NO HI 5243 ; 1148 0A 5244 GS4 ASL A ;MULT REL SECTOR MAP 1149 2E0C13 5245 ROL TEMP1 114C C8 5246 INY 114D C003 5247 CPY #3 114F 90F7 5248 BCC GS4 5249 ; 1151 18 5250 CLC 1152 6D0D13 5251 ADC TEMP2 ;ADD BIT NO TO 1155 9D8B13 5252 STA FCBLSN,X ;SECTOR # 1158 AD0C13 5253 LDA TEMP1 ;AND PUT INTO 115B 6900 5254 ADC #0 ;FCBLSN 115D 9D8C13 5255 STA FCBLSN+1,X 5256 ; 1160 60 5257 RTS 5258 ; 1161 4CCB12 5259 GSERR JMP ERRNSA ;NO SECTOR AVAIL 5260 ; SETUP ROUTINE 1164 5261 .PAGE "SETUP ROUTINE" 5262 ; 5263 ; SETUP - A ROUTINE USED FOR ALL COMMANDS 5264 ; TO SET UP FMS CONTROLL CELLS 5265 ; TO ACCESS A PARTICULAR FILE. 5266 ; 1164 5267 SETUP 1164 A99F 5268 LDA #$9F ;INIT ERROR CODE 1166 8549 5269 STA ERRNO ;TO ZERO 1168 8E0113 5270 STX CURFCB ;SAVE FCB 5271 ; 116B BA 5272 TSX 116C E8 5273 INX 116D E8 5274 INX 116E 8E0013 5275 STX ENTSTK 5276 ; 1171 AE0113 5277 LDX CURFCB ;GET CURRENT FCB 1174 A421 5278 LDY ICDNOZ ;MOVE DRIVE NO 1176 8C0103 5279 STY DCBDRV ;TO DCB 1179 88 5280 DEY ;DEC FOR ACCESS TO TABLES 117A B92913 5281 LDA DBUFAL,Y ;MOVE WRITE BUFFER 117D 8545 5282 STA ZDRVA ;ADD TO ZERO PAGE PTR 117F B93113 5283 LDA DBUFAH,Y 1182 8546 5284 STA ZDRVA+1 5285 ; 1184 B91113 5286 LDA DRVTBL,Y ;GET DRIVE TYPE 1187 F052 5287 BEQ DERR1 ;BR IF NOT EXISTS 1189 8DFE12 5288 STA DRVTYP ;SAVE TYPE 5289 ; 118C A8 5290 TAY ;MOVE MAX DATA LEN 118D B9F812 5291 LDA DRVMDL,Y ;AND LAST SECTOR BYTE 1190 8DF812 5292 STA DRVMDL ;DISPL TO LAST OF 1193 B9FB12 5293 LDA DRVLBT,Y ;TABLES 1196 8DFB12 5294 STA DRVLBT 5295 ; 1199 BC8813 5296 LDY FCBBUF,X ;GET SECTOR BUF # 119C 88 5297 DEY ;DEC TO ACCESS TBL 119D 1031 5298 BPL SSBA ;BR IF ONE IS ALLOCATED 5299 ; 119F A000 5300 LDY #0 ;IF NON ALLOCATED 11A1 B91913 5301 GSB1 LDA SECTBL,Y ;TRY TO FIND ONE 11A4 F008 5302 BEQ GSB4 ;BR ONE FOUND 11A6 C8 5303 GSB2 INY ;DEC TRY COUNT 11A7 C010 5304 CPY #16 11A9 90F6 5305 BCC GSB1 ;BR MORE TO TRY 5306 ; 11AB 4CCD12 5307 GSB3 JMP ERRNSB ;NO SECTOR BUFFERS AVAIL 5308 ; 11AE ADFE12 5309 GSB4 LDA DRVTYP ;FOUND ONE IF 256 BYTES 11B1 4A 5310 LSR A ;DRIVE NEEDED TO CONT 11B2 B010 5311 BCS GSB5 ;BR NOT 256 BYTES SETUP ROUTINE 11B4 C8 5312 INY ;ELSE TRY NEXT CONTIG 11B5 C010 5313 CPY #16 ;TEST END OF BUFFERS 11B7 B0F2 5314 BCS GSB3 ;AND BR IF NO MORE 11B9 B91913 5315 LDA SECTBL,Y ;ELSE SEE IF ITS THREE 11BC D0E8 5316 BNE GSB2 ;BR NOT FREE 11BE 88 5317 DEY 5318 ; 11BF A980 5319 LDA #$80 ;ALLOCATE SECOND OF 2 11C1 991A13 5320 STA SECTBL+1,Y 5321 ; 11C4 A980 5322 GSB5 LDA #$80 ;ALLOCATE FIRST OR ONLY 11C6 991913 5323 STA SECTBL,Y 11C9 98 5324 TYA 11CA 9D8813 5325 STA FCBBUF,X ;PUT BUF NO INTO FCB 11CD FE8813 5326 INC FCBBUF,X ;INC BUF NO SO NOT ZERO 5327 ; 11D0 B93913 5328 SSBA LDA SABUFL,Y ;MOVE BUFFER ADDR 11D3 8547 5329 STA ZSBA ;TO ZERO PAGE PTR 11D5 B94913 5330 LDA SABUFH,Y 11D8 8548 5331 STA ZSBA+1 5332 ; 5333 ; 11DA 60 5334 RTS 5335 ; 11DB 4CCF12 5336 DERR1 JMP ERRDNO ;BAD DRIVE NO SETUP ROUTINE 11DE 5337 .PAGE 5338 ; 5339 ; FREE SECTOR BUFFERS 5340 ; 11DE 5341 FRESBUF = * 11DE BC8813 5342 LDY FCBBUF,X ;GET BUF NO 11E1 F013 5343 BEQ FSBR ;BR IF NONE 11E3 88 5344 DEY ;DEC FOR TBL ACCESS 11E4 A900 5345 LDA #0 ;FREE 11E6 9D8813 5346 STA FCBBUF,X ;IN FCB 11E9 991913 5347 STA SECTBL,Y ;AND TABLE 11EC ADFE12 5348 LDA DRVTYP ;IF 128 BYTES 11EF 4A 5349 LSR A ;DRIVE 11F0 B004 5350 BCS FSBR ;FREE ONLY ONE 11F2 4A 5351 LSR A ;ELSE 11F3 991A13 5352 STA SECTBL+1,Y ;FREE 2 11F6 60 5353 FSBR RTS 5354 ; DATA SECTOR I/O 11F7 5355 .PAGE "DATA SECTOR I/O" 5356 ; 5357 ; DSIO - DATA SECTOR I/O 5358 ; 11F7 5359 DSIO 11F7 48 5360 PHA ;SAVE ACU DATA 11F8 A547 5361 LDA ZSBA ;WRITE SECTOR BUF 11FA 8D0403 5362 STA DCBBUF ;ADR MOVED TO 11FD A548 5363 LDA ZSBA+1 ;DCB 11FF 8D0503 5364 STA DCBBUF+1 1202 68 5365 PLA ;RESTORE ACU 5366 ; 1203 AEFE12 5367 LDX DRVTYP 1206 206C07 5368 JSR BSIO ;DO THE I/O 1209 60 5369 RTS 5370 ; WRITE DOS 120A 5371 .PAGE "WRITE DOS" 5372 ; 5373 ; WRTDOS - WRITE DOS TO DISK 5374 ; 120A 5375 WRTDOS 120A BC8913 5376 LDY FCBCSN,X ;MOVE START ADDR 120D BD8A13 5377 LDA FCBCSN+1,X 1210 205312 5378 JSR SETDSO ;WRITE SECTOR 0 1213 206712 5379 JSR WD0 ;WRITE DOS 1216 4CF012 5380 JMP GREAT 5381 ; 1219 5382 DELDOS 1219 A900 5383 LDA #0 ;SET FILE NOT EXISTS 121B 5384 DD1 121B 8D0E07 5385 STA DFSFLG 5386 ; 121E 5387 WRTSCO 121E A907 5388 LDA #FMSORG/256 ;MOVE FMS START 1220 8D0503 5389 STA DCBBUF+1 ;ADDR TO DCB 1223 A900 5390 LDA #FMSORG&255 1225 8D0403 5391 STA DCBBUF 5392 ; 1228 A900 5393 LDA #0 ;CLEAR SECTOR NO TO ZERO 122A 8D0A03 5394 STA DCBSEC 122D 8D0B03 5395 STA DCBSEC+1 5396 ; 1230 EE0A03 5397 WRNBS INC DCBSEC ;INC SECTOR NO 1233 A201 5398 LDX #1 ;GET DRIVE TYPE 1235 38 5399 SEC 1236 207207 5400 JSR BSIOR ;DO THE WRITE 5401 ; 5402 ; 1239 18 5403 CLC 123A AD0403 5404 LDA DCBBUF ;INC SECT ADDR 123D 6980 5405 ADC #128 123F 8D0403 5406 STA DCBBUF 1242 AD0503 5407 LDA DCBBUF+1 1245 6900 5408 ADC #0 1247 8D0503 5409 STA DCBBUF+1 5410 ; 124A AD0A03 5411 LDA DCBSEC ;TEST FOR WRITE 124D CD0107 5412 CMP BRCNT ;OF ALL BOOT SECTORS 1250 D0DE 5413 BNE WRNBS ;BR NOT ALL 5414 ; 1252 60 5415 RTS 5416 ; 1253 8C0F07 5417 SETDSO STY DFLINK ;SET LINK START 1256 8D1007 5418 STA DFLINK+1 1259 ADFE12 5419 LDA DRVTYP 125C 8D0E07 5420 STA DFSFLG 125F ACF812 5421 LDY DRVMDL WRITE DOS 1262 8C1107 5422 STY BLDISP 1265 D0B4 5423 BNE DD1 ;GO WRITE SECTOR 0 5424 ; WRITE DOS 1267 5425 .PAGE 1267 AD1207 5426 WD0 LDA DFLADR ;MOVE FILE START ADDR 126A 8543 5427 STA ZBUFP ;TO ZBUFP 126C AD1307 5428 LDA DFLADR+1 126F 8544 5429 STA ZBUFP+1 5430 ; 1271 A000 5431 WD1 LDY #0 ;MOVE 125 1273 B143 5432 WD2 LDA (ZBUFP),Y ;BYTES OF DOS 1275 9147 5433 STA (ZSBA),Y ;TO SECTOR BUFFER 1277 C8 5434 INY 1278 CCF812 5435 CPY DRVMDL 127B 90F6 5436 BCC WD2 127D 98 5437 TYA 127E 9D8713 5438 STA FCBDLN,X ;SET DATA LEN 5439 ; 1281 205707 5440 JSR INCBA ;INC ZBUFP BY 125 1284 CD0D07 5441 CMP SASA+1 ;IF NOT END OR 1287 900B 5442 BCC WD3 ;PAST END OF DOS 1289 D00F 5443 BNE WD4 ;THEN WRTNXS 128B A543 5444 LDA ZBUFP ;ELSE 128D CD0C07 5445 CMP SASA ; DONE 1290 9002 5446 BCC WD3 1292 D006 5447 BNE WD4 5448 ; 1294 20940F 5449 WD3 JSR WRTNXS ;WRITE NEXT SECTOR 1297 4C7112 5450 JMP WD1 5451 ; 129A 60 5452 WD4 RTS ;RETURN, CLOSE WILL WRITE FINAL SECTOR 5453 ; AND RETURN 5454 ; TEST DOS FILE NAME 129B 5455 .PAGE "TEST DOS FILE NAME" 5456 ; 5457 ; TSTDOS - TEST FOR DOS SYS FILE NAME; 5458 ; 129B 5459 TSTDOS 129B A00B 5460 LDY #11 ;LOOK AT 12 CHARS 129D B95813 5461 TDF1 LDA FNAME-1,Y ;TEST DECODE FILENAME CHAR 12A0 D9A812 5462 CMP DFN-1,Y ;WITH DOS FILENAME CHAR 12A3 D003 5463 BNE TDFR ;BR NOT MATCH 12A5 88 5464 DEY 12A6 D0F5 5465 BNE TDF1 ;BR IF MORE, ELSE RTN EQ 12A8 60 5466 TDFR RTS 5467 ; 12A9 44 5468 DFN .BYTE "DOS SYS " 12AA 4F 12AB 53 12AC 20 12AD 20 12AE 20 12AF 20 12B0 20 12B1 53 12B2 59 12B3 53 12B4 20 5469 ; 5470 ; ERROR ROUTINES 5471 ; 12B5 E649 5472 ERDBAD INC ERRNO ;BAD SECTOR AT FORMAT TIME 12B7 E649 5473 ERAPO INC ERRNO ;ATTEMPT APPEND TO OLD TYPE FILE 12B9 E649 5474 ERRPOT INC ERRNO ;POINT INVALID 12BB E649 5475 ERFNF INC ERRNO ;FILE NOT FOUND 12BD E649 5476 ERDFULL INC ERRNO ;DIRECTORY FULL 12BF E649 5477 ERDVDC INC ERRNO ;DEVICE COMMAND INVALID 12C1 E649 5478 ERFLOCK INC ERRNO ;FILE LOCKED 12C3 E649 5479 ERRPDL INC ERRNO ;POINT DATA LENGTH 12C5 E649 5480 ERRFN INC ERRNO ;FILE NAME ERROR 12C7 E649 5481 ERFNMM INC ERRNO ;FILE NUMBER MISMATCH 12C9 E649 5482 ERRSYS INC ERRNO ;FATAL SYS DATA I/O ERROR 12CB E649 5483 ERRNSA INC ERRNO ;NO SECTOR AVAIL 12CD E649 5484 ERRNSB INC ERRNO ;NO SECTOR BUFFERS AVAIL 12CF E649 5485 ERRDNO INC ERRNO ;DRIVE NO ERROR 5486 ; 12D1 A549 5487 LDA ERRNO ;GET ERROR NUMBER 12D3 AE0113 5488 RETURN LDX CURFCB ;GET CUR FCB NO 12D6 9D4303 5489 STA ICSTA,X ;PUT IN FCB 12D9 AE0013 5490 LDX ENTSTK ;GET ENTRY STACK PTR 12DC 9A 5491 TXS ;AND RESTORE 12DD AE0113 5492 LDX CURFCB 12E0 A8 5493 TAY 12E1 AD0813 5494 LDA SVDBYT ;GET SAVED DATA BYTE TEST DOS FILE NAME 12E4 60 5495 RTS 5496 ; 12E5 AD0303 5497 ERRIO LDA DCBSTA ;GET I/O ERROR CODE 12E8 30E9 5498 BMI RETURN 5499 ; 12EA AE0113 5500 FGREAT LDX CURFCB 12ED 20DE11 5501 JSR FRESBUF ;FREE SECTOR BUFFER 12F0 A901 5502 GREAT LDA #1 ;SET ALL OK 12F2 D0DF 5503 BNE RETURN 12F4 A988 5504 ERREOF LDA #$88 ;SET EOF CODE 12F6 30DB 5505 BMI RETURN 5506 ; MISC STORAGE 12F8 5507 .PAGE "MISC STORAGE" 5508 ; 5509 ; MISC NON-ZERO-PAGE STORAGE AREA 5510 ; 12F8 00 5511 DRVMDL .BYTE 0 ;MAX DATA LEN 12F9 7D 5512 .BYTE 125 ;128 BYTE SECTOR 12FA FD 5513 .BYTE 253 ;256 BYTE SECTOR 5514 ; 12FB 00 5515 DRVLBT .BYTE 0 ;DISPL TO LAST SECTOR BYTE 12FC 7F 5516 .BYTE 127 ;128 BYTE SECTOR 12FD FF 5517 .BYTE 255 ;256 BYTE SECTOR 12FE 5518 DRVTYP *= *+1 ;DRIVE TYPE 12FF 5519 RETRY *= *+1 ;I/O RETRY COUNTER 1300 5520 ENTSTK *= *+1 ;ENTRY STACK LEVEL 1301 5521 CURFCB *= *+1 ;CURRENT FCB (IOCB ALSO) 1302 5522 DHOLES *= *+1 ;DIR HOLE SECTOR 1303 5523 DHOLED *= *+1 ;DIR HOLE DISPL 1304 5524 DHFNUM *= *+1 ;DIR HOLE FILE NO 1305 5525 CDIRD *= *+1 ;CURRENT DIR DISPL 1306 5526 CDIRS *= *+1 ;CURRENT DIR SECTOR 1307 5527 SFNUM *= *+1 ;FILE NUMBER 1308 5528 SVDBYT *= *+1 ;SAVED OUTPUT DATA BYTE 1309 5529 SVD1 *= *+1 ;SAVE DATA BYTES 130A 5530 SVD2 *= *+1 ;FOR WRITE BURST 130B 5531 SVD3 *= *+1 130C 5532 EXTSW 130C 5533 TEMP1 *= *+1 ;TEMP1 130D 5534 TEMP2 *= *+1 ;TEMP2 130E 5535 TEMP3 *= *+1 ;TEMP3 130F 5536 TEMP4 *= *+1 ;TEMP4 1310 5537 BURTYP *= *+1 ;BURST I/O TYPE 5538 ; 1311 5539 DRVTBL *= *+8 ;DRIVE TABLE 1319 5540 SECTBL *= *+16 ; 1329 5541 DBUFAL *= *+8 ;VTOC BUFFER 1331 5542 DBUFAH *= *+8 ;PTR FOR DRIVE N 1339 5543 SABUFL *= *+16 ;SECTOR BUFFER 1349 5544 SABUFH *= *+16 ;FOR SECTOR N 1359 5545 FNAME *= *+12 ;FILE NAME 1365 5546 AFNAME *= *+12 ;AUXILLARY FILE NAME 5547 ; 1371 5548 MDRV *= *+1 ;MAX DR NO 5549 ; 1372 5550 Z = * ;PUT ON SAME BOUNDRY AS PRODUCTION 1372 5551 *= $1381 ;VERSION FILE CONTROL BLOCKS 1381 5552 .PAGE "FILE CONTROL BLOCKS" 5553 ; 5554 ; FILE CONTROL BLOCK 5555 ; ONE FILE CONTROL BLOCK IS USED FOR EACH 5556 ; OPEN FILE. THE RELATIVE FCB USED 5557 ; RELATES DIRECTLY TO THE IOCB # 5558 ; THAT OPENED THE FILE. THUS THERE ARE 5559 ; 8 FCBS. THE FCB ARE (CONVIENTLY) 5560 ; THE SAME SIZE AS IOCBS. EACH FCB 5561 ; CONTAINS ALL THE INFORMATION REQUIRED 5562 ; TO CONTROL THE PROCESSING ON 5563 ; AN OPEN FILE 5564 ; 1381 5565 FCB 1381 5566 FCBFNO *= *+1 ;FILE # LEFT JUSTIFIED 1382 5567 FCBOTC *= *+1 ;OPEN TYPE CODE 1383 5568 *= *+1 ;SPARE 1384 5569 FCBSLT *= *+1 ;FLAG FOR NEW SECTOR LEN TYPE 1385 5570 FCBFLG *= *+1 ;WORKING FLAG 1386 5571 FCBMLN *= *+1 ;MAX SECTOR DATA LEN 1387 5572 FCBDLN *= *+1 ;CUR SECTOR BUF DATA LEN 1388 5573 FCBBUF *= *+1 ;SECTOR BUF NO 1389 5574 FCBCSN *= *+2 ;CUR SECTOR # 138B 5575 FCBLSN *= *+2 ;LINK/ALLOCATE SECTOR # 138D 5576 FCBSSN *= *+2 ;CUR FILE RELATIVE SECTOR # 138F 5577 FCBCRS 138F 5578 FCBCNT *= *+2 ;SECTOR COUNT 0010 5579 FCBLEN = *-FCB ;FCB LEN 5580 ; 1391 5581 *= FCBLEN*7+* ;ALLOCATE 7 MORE FCBS 5582 ; 5583 ; OPEN CODE BITS 5584 ; USED IN IOCB AUX1 5585 ; - AND FCBOTC 5586 ; 0004 5587 OPIN = $04 ;INPUT 0008 5588 OPOUT = $08 ;OUTPUT 0002 5589 OPDIR = $02 ;LIST DIRECTORY 0001 5590 OPAPND = $01 ;APPEND 5591 ; 0080 5592 FCBFAS = $80 ;FCBFLG - ACQ SECTORS 0040 5593 FCBFSM = $40 ;FCBFLG - SECTOR MODIFIED FILE DIRECTORY 1401 5594 .PAGE "FILE DIRECTORY" 5595 ; 5596 ; DISK FILE DIRECTORY 5597 ; 5598 ; THE FILE DIRECTORY OCCUPIES 8 5599 ;CONSECUTIVE SECTORS STARTING AT THE 5600 ; CENTRAL SECTOR+1. EACH FILE DIRECTORY 5601 ; SECTOR CONTAINS 8 ENTRIES. THERE 5602 ; IS 1 ENTRY FOR EACH NAMED FILE. THE 5603 ; THERE ARE A TOTAL OF 64 NAMED FILES 5604 ; PER VOLUME 5605 ; 5606 ; THE FILE NUMBER IS USED THROUGH THE 5607 ; THE SYSTEM IS THE RELATIVE (TO ONE) 5608 ; FILE DIRECTORY ENTRY NUMBER. 5609 ; 5610 ; THE EQUATES BELOW ARE FOR A SINCE NAMED 5611 ; FILE ENTRY 5612 ; 0000 5613 DFDFL1 = 0 ;FLAG1 (1) 0001 5614 DFDCNT = 1 ;SECTOR COUNTER (LOW) 0003 5615 DFDSSN = 3 ;START SECTOR NO (2) 0005 5616 DFDPFN = 5 ;PRIMARY FILE NAME (8) 000D 5617 DFDXFN = 13 ;EXTENDED FILE NAME (4) 0010 5618 DFDELN = 16 ;ENTRY LENGTH 5619 ; 5620 ; DFDFL1 VALUE EQUATES 5621 ; 0000 5622 DFDEUU = 0 ;ENTRY UNUSED 0080 5623 DFDEDE = $80 ;ENTRY DELETED 0040 5624 DFDINU = $40 ;ENTRY IN USE 0001 5625 DFDOUT = $01 ;FILE OPEN FOR OUTPUT 0020 5626 DFDLOC = $20 ;ENTRY LOCKED 0002 5627 DFDNLD = $02 ;FILE HAS NEW TYPE SECTOR LEN BYTE 5628 ; 1401 5629 FILDIR *= *+256 ;RESUME FILE DIR SPACE 5630 ; VOLUME DIRECTORY 1501 5631 .PAGE "VOLUME DIRECTORY" 5632 ; 5633 ; DISK VOLUME DIRECTORY 5634 ; THE VOLUME DIRECTORY OCCUPIES THE CENTRAL 5635 ; VOLUME SECTOR. THE VOLUME DIRECTORY 5636 ; CONTAINS INFORMATION PERTAINING TO 5637 ; THE ENTIRE DISKETTE VOLUME. 5638 ; 5639 ; THE LABELS BELOW, MAP THE VOLUME 5640 ; DIRECTORY SECTOR. 5641 ; 0000 5642 DVDTCD = 0 ;VOLUME DIRECTORY TYEP CODE )1) 5643 ; 5644 ; USED TO DELINATE MAJOR (1) 5645 ; FMS SYSTEM FORMAT CHANGES 5646 ; 0001 5647 DVDMSN = 1 ;MAX SECTOR NUMBER (1) 0003 5648 DVDNSA = 3 ;NO SECTORS AVAIL 5649 ; 0005 5650 DVDWRQ = 5 ;WRITE REQUIRED 000A 5651 DVDSMP = 10 ;SECTOR MAP START 5652 ; 5653 ; EACH BIT REPRESENTS A SECTOR 5654 ; IF THE BIT IS ON THEN THE SECTOR 5655 ; IS FREE AND AVAILABLE. IF THE 5656 ; BIT IS OFF, THE SECTOR IS IN 5657 ; USE OR BAD. THE MOST SIGNIFICANT 5658 ; BIT OF THE FIRST BYTE IS SECTOR ZERO. END OF FMS 1501 5659 .PAGE "END OF FMS" 5660 ; 1501 5661 ENDFMS = * 1501 60 .END END OF FMS =0700 FMSORG =0043 FMSZPG =0340 IOCBORG =0003 LMASK =0300 DCBORG =E453 DHADR =009B EOL =031A DEVTAB =0020 ZICB =02E7 LMADR =1540 DUPINIT =0102 STAR =00DF OSBTM =0246 DSKTIM =000F TIMOUT 0340 IOCB 0340 ICHID 0341 ICDNO 0342 ICCOM 0343 ICSTA 0344 ICBAL 0345 ICBAH 0346 ICPUT 0348 ICBLL 0349 ICBLH 034A ICAUX1 034B ICAUX2 034C ICAUX3 034D ICAUX4 034E ICAUX5 034F ICAUX6 =0010 ICLEN =0001 ICOIN =0002 ICOOUT =0003 ICIO =0004 ICGBR =0005 ICGTR =0006 ICGBC =0007 ICGTC =0008 ICPBR =0009 ICPTR =000A ICPBC =000B ICPTC =000C ICCLOSE =000D ICSTAT =000E ICDDC =000E ICMAX =000F ICFREE =0001 ICSOK =0002 ICSTR =0003 ICSEOF =0080 ICSBRK =0081 ICSDNR =0082 ICSNEP =0083 ICSDER =0084 ICSIVC =0085 ICSNOP =0086 ICSIVN =0087 ICSWPC =0021 ICDNOZ =0028 ICBLLZ =0029 ICBLHZ =0024 ICBALZ =0025 ICBAHZ =0022 ICCOMZ =0026 ICPUTZ 0300 DCB 0300 DCBSBI 0301 DCBDRV 0302 DCBCMD 0303 DCBSTA 0304 DCBBUF 0306 DCBTO 0308 DCBCNT 030A DCBSEC =0052 DCBCRS =0050 DCBCWS =0053 DCBCST =0021 DCBCFD =0001 DCBSOK =0081 DCBDNR =0082 DCBCNR =0083 DCBDER =0084 DCBIVC =0087 DCBWPR 0043 ZBUFP 0045 ZDRVA 0047 ZSBA 0049 ERRNO 0700 BFLG 0701 BRCNT 0702 BLDADR 0704 BINTADR 0706 BCONT 0714 XBCONT 0709 SABYTE 070A DRVBYT 070B SAFBFW 070C SASA =1501 ENDFMS 070E DFSFLG 070F DFLINK 0711 BLDISP 0712 DFLADR 07CB DFMSDH 074F BFAIL 072F XBC1 =076C BSIO 0753 BGOOD 0757 INCBA 0754 XBRTN 0772 BSIOR 077C DSIO1 0786 DSIO2 12FF RETRY 079C DSIO3 07A2 DSIO4 07C4 DSIO5 07BE STRTYP 1301 CURFCB 08AB DFMOPN 0B15 DFMCLS =0ABF DFMGET 09CC DFMPUT 0B01 DFMSTA 0BA7 DFMDDC =07E0 DINIT 130C TEMP1 07F2 DIA 130D TEMP2 0807 DIHAVE 1311 DRVTBL 1329 DBUFAL 1331 DBUFAH 083D DIDDEC =0005 DVDWRQ 0823 DI256 0870 DINCBP 0845 DINXTS 084B DISETS 1319 SECTBL 085E DISNI 1339 SABUFL 1349 SABUFH =087E CLRFCB 0882 CFCBX 1381 FCB 088A ADI1 089B ADI2 1164 SETUP 0E9E FNDCODE 1382 FCBOTC =0002 OPDIR 08BE OPN1 0DAD LISTDIR 0F21 SPDIR =0004 OPIN =08D8 DFOIN =0008 OPOUT =0911 DFOOUT =08DD DFOUPD =0001 OPAPND =08EC DFOAPN 12BF ERDVDC 08E9 OPNER1 =08E3 DFOUI 0CAC TSTLOCK 09AE DFRDSU 12F0 GREAT 12BB ERFNF 1305 CDIRD 1401 FILDIR =0000 DFDFL1 =0002 DFDNLD 090E APOER 10BF OPVTOC 1106 GETSECTOR 138D FCBSSN 138B FCBLSN =097C DHF0X2 12B7 ERAPO =091D DFOX1 0C53 XDEL0 =0948 OPNIA 1302 DHOLES 0992 OPNER2 1306 CDIRS 106E RDDIR 1303 DHOLED 1304 DHFNUM 1307 SFNUM 093E OPNIB =0005 DFDPFN =0003 DFDSSN =0040 DFDINU =0001 DFDOUT =0001 DFDCNT 0966 OPN2 1359 FNAME =0970 OPN2A 1071 WRTDIR =0995 SETFCB 0FE2 WRTN6 0982 OPN3 =0080 FCBFAS 1385 FCBFLG 129B TSTDOS =098F DHF0X3 120A WRTDOS 12BD ERDFULL 099A OPNF1 1381 FCBFNO 1387 FCBDLN 138F FCBCNT 1384 FCBSLT =1017 RDNSO 1308 SVDBYT 1300 ENTSTK 09E5 FRMCIO 0A19 PUTER 1386 FCBMLN 0A06 PUT1 0F94 WRTNXS 0A1C PEOF 0A1F WTBUR =0040 FCBFSM 12F4 ERREOF 0A4A NOBURST 0A28 TBURST 0A26 RTBUR 1310 BURTYP =0AAE TBLEN 0A3E NXTBUR 0A4C WRBUR 100F RDNXTS 0A7B BBINC =0A9D BUREOF 12F8 DRVMDL 1309 SVD1 130A SVD2 130B SVD3 1388 FCBBUF 11D0 SSBA 0AAC BURST 12FE DRVTYP 0AB9 TBL256 0ACC GET1 0DB9 GDCHAR 0ADF GET2 =0ADC GEOF =0AEA EFLOOK 0AFE GET3 12D3 RETURN 0B12 SFNF 0B6D CLDONE =0B75 CLUPDT 0FAB WRTLSEC =0B80 RRDIR 0B50 CLOUT 0B3C APP1