1 2 ;CPMLDR.ASM DISASSEMBLY OF CPMLDR.COM 3 ;28 MAY 85 RHP 4 5 ; THIS PROGRAM READS THE FILE 'CPM3.SYS' OFF OF THE DISK 6 ; AND RELOCATES THE FILE TO THE OPERATING POSITION. 7 8 9 ;BIOS JUMP TABLE 10 ; 11 0B00 = BIOS$START EQU 0B00H 12 ; 13 0B00 = ?BOOT EQU BIOS$START + 000H ;COLD BOOT 14 0B0C = ?CONOT EQU BIOS$START + 00CH ;CONSOLE OUT 15 0B18 = ?HOME EQU BIOS$START + 018H ;HOME TO TRACK 0 16 0B1B = ?SLDSK EQU BIOS$START + 01BH ;SELECT DISK 17 0B1E = ?STTRK EQU BIOS$START + 01EH ;SET TRACK 18 0B21 = ?STSEC EQU BIOS$START + 021H ;SET SECTOR 19 0B24 = ?STDMA EQU BIOS$START + 024H ;SET DMA ADDRESS 20 0B27 = ?READ EQU BIOS$START + 027H ;READ A SECTOR 21 0B30 = ?SCTRN EQU BIOS$START + 030H ;TRANSLATE A PHYSICAL SECTOR 22 0B4B = ?MOV EQU BIOS$START + 04BH ;MOVE BETWEEN BANKS 23 ; 24 ; BDOS CALL FUNCTIONS 25 ; 26 0009 = PRINT$STRING EQU 009H ;DE=STRING ADDRESS 27 000D = DISK$RESET EQU 00DH ;NO PARAMETERS 28 000F = SRCH$FIRST EQU 00FH ;DE=FCB ADDR, A=DIR CODE 29 0014 = READ$SEQUENT EQU 014H ;DE=FCB ADDR, A=ERROR CODE 30 001A = SET$DMA$ADDR EQU 01AH ;DE=DMA ADDRESS 31 ; 32 005C = FCB EQU 0005CH 33 0080 = TBUFF EQU 00080H 34 ; 35 0100 ORG 00100H 36 ; 37 ; 38 0100 318102 LXI SP,STACK1 ;SET UP THE STACK 39 0103 CD000B CALL ?BOOT ;COLD BOOT 40 ; 41 0106 0E0D MVI C,DISK$RESET ;RESET DISK 42 0108 CD8D02 CALL BDOS ; 43 ; 44 010B 0E09 MVI C,PRINT$STRING ;PRINT STRING 45 010D 112502 LXI D,MSBANR ;SIGN ON BANNER 46 0110 CD8D02 CALL BDOS 47 ; 48 0113 0E0F MVI C,SRCH$FIRST ;LOCATE FILE ON DISK 49 0115 11AB01 LXI D,FCBT 50 0118 CD8D02 CALL BDOS 51 ; 52 011B FEFF CPI 0FFH ;CHECK FOR ERROR 53 011D 11CF01 LXI D,MSOPEN ;OPEN ERROR MESSAGE 54 0120 CAA201 JZ QUITS ;HALT 55 ; 56 0123 118000 LXI D,TBUFF ;POINT TO TEMP BUFFER 57 0126 CD8F01 CALL DMASET ;IDENTIFY AS DMA ADDR 58 0129 CD9501 CALL READSECT 59 012C 218000 LXI H,TBUFF ;POINT TO TEMP BUFFER 60 012F 118102 LXI D,HEDR1 ;POINT TO NEW STORAGE 61 0132 0E06 MVI C,006H ;MOVE 6 BYTES 62 ; 63 0134 7E MOVER: MOV A,M ;MOVE MEMORY BLOCK 64 0135 12 STAX D 65 0136 13 INX D 66 0137 23 INX H 67 0138 0D DCR C 68 0139 C23401 JNZ MOVER 69 ; 70 013C CD9501 CALL READSECT ;PUT SECTOR INTO TEMP BUFFER 71 013F 0E09 MVI C,PRINT$STRING ;PRINT OUT THE CONTENTS OF 72 0141 118000 LXI D,TBUFF ;THE STRING JUST READ 73 0144 CD8D02 CALL BDOS 74 ; 75 0147 3A8202 LDA HEDR2 ;GET 2ND GYTE OF HEADER 76 014A 67 MOV H,A ;PUT IN H 77 014B 3A8102 LDA HEDR1 ;GET FIRST BYTE OF HEADER 78 014E CD7301 CALL READFILE 79 ; 80 0151 3A8402 LDA HEDR4 ;GET 4TH BYTE OF HEADER 81 0154 B7 ORA A ;SET FLAGS 82 0155 CA5F01 JZ SKIPRD ;SKIP IF EMPTY 83 0158 67 MOV H,A 84 0159 3A8302 LDA HEDR3 85 015C CD7301 CALL READFILE 86 ; 87 015F 215D00 SKIPRD: LXI H,FCB+1 ;1ST CHAR OF FILENAME 88 0162 7E MOV A,M ;GET IT 89 0163 FE24 CPI 024H ;IS IT A $? 90 0165 C26F01 JNZ SKIP2 ;IF NOT THEN SKIP 91 0168 23 INX H ;2ND CHAR OF FILENAME 92 0169 7E MOV A,M ;GET IT 93 016A FE42 CPI 042H ;IS IT A 'B'? 94 016C CCA901 CZ REBOOT ;THEN GO TO REBOOT 95 016F 318502 SKIP2: LXI SP,HEDR5 ;ELSE JUMP TO ADDRESS OF 96 0172 C9 RET ; BYTES 5,6 OF HEADER 97 98 READFILE: 99 0173 B7 ORA A ;SET FLAGS 100 0174 57 MOV D,A ;FIRST BYTE TO D 101 0175 1E00 MVI E,000H ;E=0 102 0177 7C MOV A,H ;SECOND BYTE TO A 103 0178 17 RAL ;X2 104 0179 67 MOV H,A ;BACK TO H 105 READLOOP: 106 017A EB XCHG ;SWAP DE,HL 107 017B 0180FF LXI B,0FF80H ; -80 108 017E 09 DAD B ;SUBTRACT 80 FROM 2ND BYTE 109 017F EB XCHG ;SWAP AGAIN 110 0180 D5 PUSH D ;SAVE REGISTERS 111 0181 E5 PUSH H 112 0182 CD8F01 CALL DMASET ;POINT TO NEW ADDRESS 113 0185 CD9501 CALL READSECT ;READ DISK INTO THERE 114 0188 E1 POP H ;RESTORE REGISTERS 115 0189 D1 POP D 116 018A 25 DCR H ;H-1 117 018B C27A01 JNZ READLOOP ;LOOP TIL H=0 118 018E C9 RET 119 120 018F 0E1A DMASET: MVI C,SET$DMA$ADDR 121 0191 CD8D02 CALL BDOS 122 0194 C9 RET 123 124 READSECT: 125 0195 0E14 MVI C,READ$SEQUENT 126 0197 11AB01 LXI D,FCBT ;POINT TO FILE CONTROL BLOCK 127 019A CD8D02 CALL BDOS 128 ; 129 019D B7 ORA A ;SET FLAGS 130 019E 11FA01 LXI D,MSREAD ;READ ERROR MESSAGE 131 01A1 C8 RZ ;NO ERROR 132 01A2 0E09 QUITS: MVI C,PRINT$STRING ;ELSE PRINT ERROR MSG 133 01A4 CD8D02 CALL BDOS 134 ; 135 01A7 F3 DI ;KILL INTERRUPTS 136 01A8 76 HLT ;FREEZE 137 ; 138 01A9 FF REBOOT: RST 07 139 01AA C9 RET 140 ; 141 01AB 00 FCBT: DB 000H 142 01AC 43504D3320 DB 'CPM3 SYS' 143 01B7 0000000000 DB 0,0,0,0,0,0,0,0 144 01BF 0000000000 DB 0,0,0,0,0,0,0,0 145 01C7 0000000000 DB 0,0,0,0,0,0,0,0 146 ; 147 01CF 0D0A MSOPEN: DB 00DH,00AH 148 01D1 43504D4C44 DB 'CPMLDR error: failed to open CPM3.SYS' 149 01F7 0D0A DB 00DH,00AH 150 01F9 24 DB '$' 151 ; 152 01FA 0D0A MSREAD: DB 00DH,00AH 153 01FC 43504D4C44 DB 'CPMLDR error: failed to read CPM3.SYS' 154 0222 0D0A DB 00DH,00AH 155 0224 24 DB '$' 156 ; 157 0225 0D MSBANR: DB 00DH 158 0226 0A0A0A0A0A DB 00AH,00AH,00AH,00AH,00AH,00AH 159 022C 0A0A0A0A0A DB 00AH,00AH,00AH,00AH,00AH,00AH 160 0232 0A0A0A0A0A DB 00AH,00AH,00AH,00AH,00AH,00AH 161 0238 0A0A0A0A0A DB 00AH,00AH,00AH,00AH,00AH,00AH 162 023E 43502F4D20 DB 'CP/M V3.0 Loader' 163 024E 0D0A DB 00DH,00AH 164 0250 436F707972 DB 'Copyright (C) 1982, Digital Research' 165 0274 0D0A DB 00DH,00AH 166 0276 24 DB '$' 167 0277 3032313138 DB '021182' 168 027D 00000000 DB 0,0,0,0 169 STACK1: ;STACK WALKS OVER THE BANNER 170 ; 171 0281 00 HEDR1: DB 000H 172 173 0282 00 HEDR2: DB 000H 174 175 0283 00 HEDR3: DB 000H 176 177 0284 00 HEDR4: DB 000H 178 179 0285 0000000000HEDR5: DB 0,0,0,0,0,0,0,0 180 ; 181 028D EB BDOS: XCHG ;MSG POINTER IN HL 182 028E 22DF09 SHLD INFO ;STORE MSG LOCATION 183 0291 EB XCHG ;MSG POINTER BACK TO DE 184 0292 79 MOV A,C 185 0293 FE0E CPI 00EH 186 0295 DAA502 JC BDOS1 187 0298 32E209 STA SAVEC ;SAVE # IN C 188 029B AF XRA A ;CLEAR ACCUMULATOR 189 029C 32B709 STA ZERO3 ;SET TO FALSE 190 029F 32DE09 STA CURDSK 191 02A2 32BE09 STA ZERO4 192 02A5 7B BDOS1: MOV A,E ;GET LO BYTE OF MEM ADDRESS 193 02A6 32BA09 STA LINFO ;SAVE IT 194 02A9 210000 LXI H,00000H ;CLEAR HL 195 02AC 220904 SHLD ARET ;RETURN VALUE DEFAULTS TO 0000 196 02AF 22E109 SHLD FCBDSK ; SAVE USERS STACK PTR, SET TO LOCAL STACK 197 02B2 39 DAD SP ;MOVE SP TO HL 198 02B3 224003 SHLD ENTSP ;ENTSP=STACK POINTER 199 02B6 319203 LXI SP,LSTACK ;POINT STACK TO END OF C7 TABLE 200 02B9 214E09 LXI H,GOBACK ;RETURN HERE AFTER ALL FUNCTIONS 201 02BC E5 PUSH H ;JUMP GOBACK EQUIV TO RETURN 202 02BD 79 MOV A,C 203 02BE FE32 CPI 032H ;NUMBER OF FUNCTIONS 204 02C0 D2CA02 JNC BDOS2 ;INVALID NUMBER 205 02C3 4B MOV C,E ;POSSIBLE OUTPUT CHAR. TO C 206 02C4 21DC02 LXI H,FUNCTAB ;POINT TO FUNCTION TABLE 207 02C7 C3CF02 JMP BDOS3 208 ; 209 02CA DE64 BDOS2: SBI 064H 210 02CC DA9B07 JC SEARCH$FIN 211 02CF 5F BDOS3: MOV E,A ;E GETS A 212 02D0 1600 MVI D,000H ;DE=FUNCTION, HL=.CIOTAR 213 02D2 19 DAD D ;ADD DE, HL 214 02D3 19 DAD D ;ADD DE, HL 215 02D4 5E MOV E,M ;MEMORY WORD TO DE 216 02D5 23 INX H 217 02D6 56 MOV D,M ;DE=FUNCTION ARGUMENT 218 02D7 2ADF09 LHLD INFO ;POINT TO MESSAGE WITH HL 219 02DA EB XCHG ;DE POINTS MSG, HL TO DEST. 220 02DB E9 PCHL ;JUMP TO ROUTINE 221 ; 222 02DC E803 FUNCTAB:DW FNC$RET ;FUNCTION 0= 223 02DE E803 DW FNC$RET ;FUNCTION 1= 224 02E0 BB03 DW FUNCT02 ;FUNCTION 2=CONSOLE OUTPUT 225 02E2 E803 DW FNC$RET ;FUNCTION 3= 226 02E4 E803 DW FNC$RET ;FUNCTION 4= 227 02E6 E803 DW FNC$RET ;FUNCTION 5= 228 02E8 E803 DW FNC$RET ;FUNCTION 6= 229 02EA E803 DW FNC$RET ;FUNCTION 7= 230 02EC E803 DW FNC$RET ;FUNCTION 8= 231 02EE DF03 DW FUNCT09 ;FUNCTION 9=PRINT STRING 232 02F0 E803 DW FNC$RET ;FUNCTION A= 233 02F2 E803 DW FNC$RET ;FUNCTION B= 234 02F4 E803 DW FNC$RET ;FUNCTION C= 235 02F6 0009 DW FUNCT0D ;FUNCTION D=RESET DISK 236 02F8 1709 DW FUNCT0E ;FUNCTION E=SELECT DISK 237 02FA 1D09 DW FUNCT0F ;FUNCTION F=OPEN FILE 238 02FC E803 DW FNC$RET ;FUNCTION 10= 239 02FE E803 DW FNC$RET ;FUNCTION 11= 240 0300 E803 DW FNC$RET ;FUNCTION 12= 241 0302 E803 DW FNC$RET ;FUNCTION 13= 242 0304 3B09 DW FUNCT14 ;FUNCTION 14=READ SEQUENTIAL 243 0306 E803 DW FNC$RET ;FUNCTION 15= 244 0308 E803 DW FNC$RET ;FUNCTION 16= 245 030A E803 DW FNC$RET ;FUNCTION 17= 246 030C E803 DW FNC$RET ;FUNCTION 18= 247 030E 4109 DW FUNCT19 ;FUNCTION 19=RETURN CURRENT DISK 248 0310 4709 DW FUNCT1A ;FUNCTION 1A=SET DMA ADDRESS 249 0312 E803 DW FNC$RET ;FUNCTION 1B= 250 0314 E803 DW FNC$RET ;FUNCTION 1D= 251 0316 E803 DW FNC$RET ;FUNCTION 1E= 252 0318 E803 DW FNC$RET ;FUNCTION 1F= 253 031A E803 DW FNC$RET ;FUNCTION 20= 254 031C E803 DW FNC$RET ;FUNCTION 21= 255 031E E803 DW FNC$RET ;FUNCTION 22= 256 0320 E803 DW FNC$RET ;FUNCTION 23= 257 0322 E803 DW FNC$RET ;FUNCTION 24= 258 0324 E803 DW FNC$RET ;FUNCTION 25= 259 0326 E803 DW FNC$RET ;FUNCTION 26= 260 0328 E803 DW FNC$RET ;FUNCTION 27= 261 032A E803 DW FNC$RET ;FUNCTION 28= 262 032C E803 DW FNC$RET ;FUNCTION 29= 263 032E E803 DW FNC$RET ;FUNCTION 2A= 264 0330 E803 DW FNC$RET ;FUNCTION 2B= 265 0332 E803 DW FNC$RET ;FUNCTION 2C= 266 0334 E803 DW FNC$RET ;FUNCTION 2D= 267 0336 E803 DW FNC$RET ;FUNCTION 2E= 268 0338 E803 DW FNC$RET ;FUNCTION 2F= 269 033A E803 DW FNC$RET ;FUNCTION 30= 270 033C E803 DW FNC$RET ;FUNCTION 31= 271 033E E803 DW FNC$RET ;FUNCTION 32= 272 ; 273 0340 0000 ENTSP: DB 0,0 274 ; 275 0342 DS 80 276 LSTACK: 277 ; 278 ; COMPUTE CHARACTER POSITION/WRITE CONSOLE 279 ; CHARACTER FROM C 280 ; COMPCOL = TRUE IF COMPUTING COLUMN POSITION 281 ; 282 0392 3AEE03 CONOUT: LDA COMPCOL 283 0395 B7 ORA A 284 0396 C29E03 JNZ COMPOUT ;WRT CHAR FROM C, THEN COMP COL. 285 0399 C5 PUSH B 286 039A CD0C0B CALL ?CONOT ;PRINT CHARACTER ON CONSOLE 287 039D C1 POP B 288 039E 79 COMPOUT:MOV A,C ;RECALL CHAR & COMPUTE COL POSIT 289 039F 21DA09 LXI H,COLUMN ;A=CHAR, HL=.COLUMN 290 03A2 FE7F CPI 07FH ;RUBOUT? 291 03A4 C8 RZ ;NO COL CHANGE IF NULLS 292 03A5 34 INR M ;NEXT COLUMN 293 03A6 FE20 CPI 020H ;SPACE? 294 03A8 D0 RNC ;RETURN IF GRAPHIC,ELSE RESET COL. 295 03A9 35 DCR M ;NEXT COLUMN 296 03AA 7E MOV A,M 297 03AB B7 ORA A 298 03AC C8 RZ ;RET IF ZERO, ELSE MAYBE BS OR EOL 299 03AD 79 MOV A,C ;CHAR IN A 300 03AE FE08 CPI 008H ;CTL H? 301 03B0 C2B503 JNZ NOTBACKSP ;ELSE BACKSPACE 302 03B3 35 DCR M ;NEXT COLUMN 303 03B4 C9 RET 304 ; 305 ; NOT A BACKSPACE CHARACTER, EOL? 306 ; 307 NOTBACKSP: 308 03B5 FE0A CPI 00AH ;LINEFEED? 309 03B7 C0 RNZ 310 03B8 3600 MVI M,000H ;END OF LINE, COL=0 311 03BA C9 RET 312 ; 313 ; CONSOLE OUTPUT E=ASCII CHARACTER 314 ; 315 03BB 79 FUNCT02:MOV A,C 316 03BC FE09 CPI 009H ;TAB? 317 03BE C29203 JNZ CONOUT ;IF NO TAB, DIRECT TO CONOUT 318 03C1 0E20 TAB0: MVI C,020H ;ELSE CHANGE TO SPACE 319 03C3 CD9203 CALL CONOUT 320 03C6 3ADA09 LDA COLUMN 321 03C9 E607 ANI 007H ;COLUMN MOD 8 = 0 7 322 03CB C2C103 JNZ TAB0 ;BACK FOR ANOTHER IF NOT 323 03CE C9 RET 324 ; 325 ; PRINT MESSAGE UNTIL M(BC) = $ 326 ; 327 03CF 21DB09 PRINT: LXI H,DOLLAR 328 03D2 0A LDAX B 329 03D3 BE CMP M ;$? 330 03D4 C8 RZ ;STOP ON $, ELSE MORE TO PRINT 331 03D5 03 INX B 332 03D6 C5 PUSH B 333 03D7 4F MOV C,A ;CHAR IN C 334 03D8 CDBB03 CALL FUNCT02 ;PRINT CHAR ON CONSOLE 335 03DB C1 POP B 336 03DC C3CF03 JMP PRINT 337 ; 338 ; PRINT STRING DE=STRING ADDRESS, ENDS IN $ 339 ; 340 03DF EB FUNCT09:XCHG ;WAS LHLD INFO 341 03E0 4D MOV C,L 342 03E1 44 MOV B,H ;BC=STRING ADDRESS 343 03E2 C3CF03 JMP PRINT ;OUT TO CONSOLE 344 ; 345 ; STORE THE REGISTER TO ARET 346 ; 347 03E5 320904 STA$RET:STA ARET 348 ; 349 ; JMP GOBACK (POP STACK FOR NON CPM FUNCTIONS) 350 ; 351 03E8 C9 FNC$RET:RET 352 ; 353 03E9 3E01 DISKEOF:MVI A,001H ;SET LRET=1 354 03EB C3E503 JMP STA$RET 355 ; 356 ; STORAGE LOCATIONS AND MESSAGES 357 ; 358 03EE 00 COMPCOL:DB 000H 359 360 03EF 0D0A MSBDOS: DB 00DH,00AH 361 03F1 42444F5320 DB 'BDOS ERR: $' 362 363 03FC 53656C6563MSSLCT: DB 'Select$' 364 365 0403 5065726D2EMSPERM: DB 'Perm.$' 366 367 0409 0000 ARET: DW 0000H 368 369 SEL$ERROR: 370 040B 01EF03 LXI B,MSBDOS ;BDOS ERROR MESSAGE 371 040E CDCF03 CALL PRINT 372 0411 01FC03 LXI B,MSSLCT ;SELECT MSG 373 0414 C32004 JMP QUIT2 374 ; 375 0417 01EF03 PERMSG: LXI B,MSBDOS ;BDOS ERROR MESSAGE 376 041A CDCF03 CALL PRINT 377 041D 010304 LXI B,MSPERM ;PERMANENT MSG 378 0420 CDCF03 QUIT2: CALL PRINT 379 ; 380 0423 F3 DI ;KILL INTERRUPTS 381 0424 76 HLT ;FREEZE 382 ; 383 0425 7B SUBDH: MOV A,E ;SUBTRACT HL = DE-HL 384 0426 95 SUB L 385 0427 5F MOV E,A 386 0428 7A MOV A,D 387 0429 9C SBB H 388 042A 57 MOV D,A 389 042B D0 RNC 390 042C 05 DCR B 391 042D C9 RET 392 ; 393 042E 7B ADDEHL: MOV A,E ;ADD HL AND DE 394 042F 85 ADD L 395 0430 5F MOV E,A 396 0431 7A MOV A,D 397 0432 8C ADC H 398 0433 57 MOV D,A 399 0434 D0 RNC 400 0435 04 INR B 401 0436 C9 RET 402 ; 403 0437 0C ATRAN0: INR C 404 0438 0D ATRAN1: DCR C 405 0439 C8 RZ 406 043A 29 DAD H 407 043B 8F ADC A 408 043C C33804 JMP ATRAN1 409 ; 410 043F 1A RECOK8: LDAX D ;A GETS MEMORY POINTED BY DE 411 0440 BE CMP M ;COMPARE TO MEMORY POINTED BY HL 412 0441 C0 RNZ ;QUIT IF DIFFERENT 413 0442 23 INX H ;NEXT HL 414 0443 13 INX D ;NEXT DE 415 0444 0D DCR C ;TIL COUNT IN C 416 0445 C8 RZ ; DROPS TO ZERO 417 0446 C33F04 JMP RECOK8 ;ELSE TRY AGAIN 418 ; 419 ; MOVE DATA OF LENGTH C FROM DE TO HL 420 ; 421 0449 0C MOVE: INR C ;IN CASE IT IS ZERO 422 044A 0D MOVE0: DCR C ;FOR COUNT IN C 423 044B C8 RZ ;DONE? 424 044C 1A LDAX D ;MEMORY POINTED BY DE TO A 425 044D 77 MOV M,A ;MOVE TO MEMORAY POINTED BY HL 426 044E 13 INX D ;NEXT DE 427 044F 23 INX H ;NEXT HL 428 0450 C34A04 JMP MOVE0 ;KEEP LOOPING TIL C=0 429 ; 430 ; SELECT DISK DRIVE AT CURDSK, FILL THE BASE ADDRESS 431 ; CURTKA-ALLOCA, THEN FILL VALUES IN DISK PARAMETER BLOCK 432 ; 433 SELECTDISK: 434 0453 4A MOV C,D ;CURRENT DISK TO C 435 ;LSB OF C=0 IF NOT YET LOGGED IN 436 0454 CD1B0B CALL ?SLDSK ;SELECT DISK, SETS HL 437 0457 7C MOV A,H 438 0458 B5 ORA L 439 0459 C8 RZ ;HL=0 FOR ERROR ELSE DISK HEADER 440 045A 5E MOV E,M 441 045B 23 INX H 442 045C 56 MOV D,M 443 045D 23 INX H ;DE=.TRAN 444 045E 23 INX H 445 045F 23 INX H ;.CDRMAX 446 0460 229009 SHLD CURTRKA 447 0463 23 INX H 448 0464 23 INX H ;HL=.CURREC 449 0465 229209 SHLD CURRECA 450 0468 23 INX H 451 0469 23 INX H 452 046A 23 INX H 453 046B 23 INX H 454 046C 23 INX H 455 046D 23 INX H 456 046E EB XCHG 457 046F 22B809 SHLD TRANV ;.TRAN VECTOR 458 0472 219809 LXI H,BUFFB ;DE=SOURCE, HL=DEST FOR MOVE 459 0475 0E0D MVI C,00DH ;ADDLIST 460 0477 CD4904 CALL MOVE ;ADDLIST FILLED 461 047A 2A9809 LHLD BUFFB ;NOW FILL DPB 462 047D EB XCHG ;DE IS SOURCE 463 047E 21A509 LXI H,SECTPT ;HL IS DEST. 464 0481 0E11 MVI C,011H ;DPBLIST 465 0483 CD4904 CALL MOVE ;DATA FILLED 466 0486 2AAA09 LHLD MAXALL ;LARGEST ALLOC NUMBER 467 0489 7C MOV A,H ;00 INDICATES <255 468 048A 21BD09 LXI H,SINGLE 469 048D 36FF MVI M,0FFH ;FF=TRUE, ASSUME A=00 470 048F B7 ORA A 471 0490 CA9504 JZ RETSELECT 472 0493 3600 MVI M,000H ;M=FALSE 473 RETSELECT: ;HIGH ORDER OF MAXALL NOT 0 474 ; USE DOUBLE DM 475 0495 37 STC 476 0496 C9 RET 477 ; 478 ; MOVE TO TRACK 0 479 ; 480 0497 CD180B HOME: CALL ?HOME ;HOME THE DISK 481 049A AF XRA A ;ZERO THE ACCCUM 482 049B 2A9009 LHLD CURTRKA 483 049E 77 MOV M,A 484 049F 23 INX H 485 04A0 77 MOV M,A ;CURTRAK=0000 486 04A1 2A9209 LHLD CURRECA 487 04A4 77 MOV M,A 488 04A5 23 INX H 489 04A6 77 MOV M,A ;CURREC=0000 490 04A7 23 INX H 491 04A8 77 MOV M,A 492 04A9 C9 RET 493 ; 494 ; 495 RDBUFF1: 496 04AA 21C309 LXI H,ARECORD 497 04AD 5E MOV E,M 498 04AE 23 INX H 499 04AF 56 MOV D,M 500 04B0 23 INX H 501 04B1 46 MOV B,M 502 04B2 C9 RET 503 ; 504 ; 505 ; 506 04B3 CDAA04 RDBUFF: CALL RDBUFF1 507 04B6 CD270B CALL ?READ ;READ A SECTOR 508 04B9 B7 ORA A ;SET FLAGS 509 04BA C8 RZ ;OK 510 04BB 4F MOV C,A ;SAVE ERROR 511 04BC FE03 CPI 003H ;CHECK ERROR 512 04BE DA1704 JC PERMSG ;PERMANENT BDOS ERROR 513 04C1 0E01 MVI C,001H ;ELSE CHANGE ERROR FLAG 514 04C3 C31704 JMP PERMSG ;PERMANENT BDOS ERROR 515 516 ; 517 ; SEEK RECORD CONTAINING THE CURRENT DIRECTORY ENTRY 518 ; 519 04C6 2AE309 SEEKDIR:LHLD DCNT ;DIRECTORY COUNTER TO COUNTER 520 04C9 0E02 MVI C,002H ;DSKSHF 521 04CB CD2606 CALL HLROTR ;VALUE TO HL 522 04CE 0600 MVI B,000H 523 04D0 EB XCHG 524 04D1 21C309 LXI H,ARECORD 525 04D4 73 MOV M,E ;STORE ARECORD 526 04D5 23 INX H 527 04D6 72 MOV M,D ;STORE DREC 528 04D7 23 INX H 529 04D8 70 MOV M,B 530 04D9 C9 RET 531 ; 532 ; SEEK THE TRACK GIVEN BY ARECORD (ACTUAL RECORD) 533 ; 534 04DA 2A9009 SEEK: LHLD CURTRKA 535 04DD 4E MOV C,M 536 04DE 23 INX H 537 04DF 46 MOV B,M 538 04E0 C5 PUSH B 539 04E1 2A9209 LHLD CURRECA 540 04E4 5E MOV E,M 541 04E5 23 INX H 542 04E6 56 MOV D,M 543 04E7 23 INX H 544 04E8 46 MOV B,M 545 04E9 2AC309 LHLD ARECORD 546 04EC 3AC509 LDA SHIFTED 547 04EF 4F MOV C,A 548 04F0 7D SEEK0: MOV A,L ;LOOP WHILE ARECORD < CURREC 549 04F1 93 SUB E 550 04F2 7C MOV A,H 551 04F3 9A SBB D 552 04F4 79 MOV A,C 553 04F5 98 SBB B 554 04F6 E5 PUSH H 555 04F7 D20705 JNC SEEK1 ;SKIP IF ARECORD >= CURREC 556 04FA 2AA509 LHLD SECTPT ;CURREC = SECTPT 557 04FD CD2504 CALL SUBDH ;SUBTRACT HL FROM DE 558 0500 E1 POP H 559 0501 E3 XTHL 560 0502 2B DCX H ;CURTRK = CURTRK-1 561 0503 E3 XTHL 562 0504 C3F004 JMP SEEK0 ;FOR ANOTHER TRY 563 ; 564 0507 2AA509 SEEK1: LHLD SECTPT ;LOOK WHILE ARECORD >= (T:CURREC+SECTP) 565 050A CD2E04 CALL ADDEHL ;ADD DE AND HL 566 050D E1 POP H 567 050E 7D MOV A,L 568 050F 93 SUB E 569 0510 7C MOV A,H 570 0511 9A SBB D 571 0512 79 MOV A,C 572 0513 98 SBB B 573 0514 DA1E05 JC SEEK2 ;SKIP IF T>ARECORD, CURREC=T, 574 0517 E3 XTHL ; CURTRK=CURTRK+1 575 0518 23 INX H 576 0519 E3 XTHL 577 051A E5 PUSH H 578 051B C30705 JMP SEEK1 ;FOR ANOTHER TRY 579 ; 580 051E E3 SEEK2: XTHL 581 051F E5 PUSH H 582 0520 2AA509 LHLD SECTPT 583 0523 CD2504 CALL SUBDH ;SUBTRACT HL FROM DE 584 0526 E1 POP H ;ARRIVE HERE WITH UPDATED VALUES 585 ; IN EACH REGISTER 586 0527 D5 PUSH D 587 0528 C5 PUSH B 588 0529 E5 PUSH H ;TO STACK FOR LATER 589 ;STACK=BC=ARECORD, DE=CURREC, HL=CURTRK 590 052A EB XCHG 591 052B 2AB209 LHLD OFFSET 592 052E 19 DAD D ;HL=CURTRK+OFFSET 593 052F 44 MOV B,H 594 0530 4D MOV C,L 595 0531 22CE09 SHLD TRACK 596 0534 CD1E0B CALL ?STTRK ;TRACK SET UP. NOTE THAT BC-CURTRK 597 ; IS DIFFERENCE TO MOVE IN BIOS 598 0537 D1 POP D ;RECALL CURTRK 599 0538 2A9009 LHLD CURTRKA 600 053B 73 MOV M,E 601 053C 23 INX H 602 053D 72 MOV M,D ;CURTRK UPDATED 603 ; NOW COMPUTE SECTOR AS ARECORD-CURREC 604 053E C1 POP B 605 053F D1 POP D ;RECALL CURREC 606 0540 2A9209 LHLD CURRECA 607 0543 73 MOV M,E 608 0544 23 INX H 609 0545 72 MOV M,D 610 0546 23 INX H 611 0547 70 MOV M,B 612 0548 C1 POP B ;BC=ARECORD, DE=CURREC 613 0549 79 MOV A,C 614 054A 93 SUB E 615 054B 6F MOV L,A 616 054C 78 MOV A,B 617 054D 9A SBB D 618 054E 67 MOV H,A 619 054F CD6B05 CALL SEEK3 620 0552 44 MOV B,H 621 0553 4D MOV C,L 622 0554 2AB809 LHLD TRANV 623 0557 EB XCHG ;BC=SECTOR#, DE=.TRAN 624 0558 CD300B CALL ?SCTRN ;HL=TRAN (SECTOR) 625 055B 4D MOV C,L 626 055C 44 MOV B,H 627 055D 22D009 SHLD SAVSEC 628 0560 CD210B CALL ?STSEC ;SECTOR SELECTED 629 0563 2A8A09 LHLD DMAADDR 630 0566 4D MOV C,L 631 0567 44 MOV B,H 632 0568 C3240B JMP ?STDMA ;SET DMA 633 ; 634 056B 3AB409 SEEK3: LDA ZERO1 635 056E 4F MOV C,A 636 056F C32606 JMP HLROTR 637 ; 638 ; COMPUTE DISK MAP POSITION FOR VRECORD TO HL 639 ; 640 DM$POSITION: 641 0572 21A709 LXI H,BLKSHF 642 0575 4E MOV C,M ;SHIFT COUNT TO C 643 0576 3AC109 LDA VRECORD ;CURRENT VIRTUAL RECORD TO A 644 0579 B7 DMPOS0: ORA A 645 057A 1F RAR 646 057B 0D DCR C 647 057C C27905 JNZ DMPOS0 ;A=SBR(VRECORD,BLKSHF)= 648 ; VRECORD/2**(SEC/BLOCK) 649 057F 47 MOV B,A ;SAVE IT FOR LATER ADDITION 650 0580 3E08 MVI A,008H 651 0582 96 SUB M ;8-BLKSHF TO ACCUMULATOR 652 0583 4F MOV C,A ;EXTENT SHIFT COUNT IN REGISTER C 653 0584 3AC009 LDA EXTVAL ;EXTENT VALUE ANI EXTMASK 654 ; 655 ; BLKSHF=3,4,5,6,7, C=5,4,3,2,1 656 ; SHIFT IS 4,3,2,1,0 657 ; 658 0587 0D DMPOS1: DCR C 659 0588 CA9005 JZ DMPOS2 660 058B B7 ORA A 661 058C 17 RAL 662 058D C38705 JMP DMPOS1 663 ; 664 ; ARRIVE HERE WITH A=SHL(EXT AND EXTMSK), 7-BLKSHF) 665 ; 666 0590 80 DMPOS2: ADD B ;ADD THE PREVIOUS SHR(VRECORD,BLKSHF) 667 ;VALUE. A IS ONE OF THE VALUES, 668 ;DEPENDING ON ALLOC BKS BLKSHF 669 ;1K 3 V/8+EXTVAL*16 670 ;2K 4 V/16+EXTVAL*8 671 ;4K 5 V/32+EXTVAL*4 672 ;8K 6 V/64+EXTVAL*2 673 ;16K 7 V/128+EXTVAL*1 674 0591 C9 RET ;WITH DM$POSITION IN A 675 ; 676 0592 2ADF09 GETDM1: LHLD INFO ;BASE ADDRESS OF FCB 677 0595 111000 LXI D,00010H ;DSKMAP 678 0598 19 DAD D ;HL=.DSKMAP 679 0599 C9 RET 680 ; 681 ; GET DISK MAP VALUE FROM POSITION GIVEN BY BC 682 ; 683 059A CD9205 GETDM: CALL GETDM1 ;POINT TO 16TH CHAR IN INFO 684 059D 09 DAD B ;INDEX BY SINGLE BYTE VALUE 685 059E 3ABD09 LDA SINGLE ;SINGLE BYTE/MAP ENTRY? 686 05A1 B7 ORA A 687 05A2 CAA805 JZ GETDMD ;GET DISK MAP SINGLE BYTE 688 05A5 6E MOV L,M 689 05A6 60 MOV H,B 690 05A7 C9 RET ;WITH HL=00BB 691 ; 692 05A8 09 GETDMD: DAD B ;HL=.FCB(DM+I*2) 693 ; DOUBLE PRECISION VALUE RETURNED 694 05A9 7E MOV A,M 695 05AA 23 INX H 696 05AB 66 MOV H,M 697 05AC 6F MOV L,A 698 05AD C9 RET 699 ; 700 ; COMPUTE DISK BLOCK NUMBER FROM CURRENT FCB 701 ; 702 05AE CD7205 INDEX: CALL DM$POSITION ;0....15 IN REGISTER A 703 05B1 32BB09 STA DMPOS 704 05B4 4F MOV C,A 705 05B5 0600 MVI B,000H 706 05B7 CD9A05 CALL GETDM ;VALUE TO HL 707 05BA 22C309 SHLD ARECORD 708 05BD 7D MOV A,L 709 05BE B4 ORA H 710 05BF C9 RET 711 ; 712 ; COMPUTE ACTUAL RECORD ADDRESS, ASSUMING INDEX CALLED 713 ; 714 05C0 3AA709 ATRAN: LDA BLKSHF ;SHIFT COUNT TO REG A 715 05C3 4F MOV C,A 716 05C4 2AC309 LHLD ARECORD 717 05C7 AF XRA A 718 05C8 CD3704 CALL ATRAN0 719 05CB 22C309 SHLD ARECORD 720 05CE 32C509 STA SHIFTED 721 05D1 22C609 SHLD SHAREC 722 05D4 3AA809 LDA BLKMSK 723 05D7 4F MOV C,A ;MASK VALUE TO C 724 05D8 3AC109 LDA VRECORD 725 05DB A1 ANA C ;MASKED VALUE IN A 726 05DC 47 MOV B,A 727 05DD 32B609 STA MSKVREC 728 05E0 21C309 LXI H,ARECORD ;ARECORD=HL OR (VRECORD AND BLKMSK) 729 05E3 B6 ORA M 730 05E4 77 MOV M,A 731 05E5 C9 RET 732 ; 733 ; GET CURRENT EXTENT FIELD ADDRESS TO A 734 ; 735 05E6 2ADF09 GETEXTA:LHLD INFO 736 05E9 110C00 LXI D,0000CH ;EXTNUM 737 05EC 19 DAD D ;HL=.FCB(EXTNUM) 738 05ED C9 RET 739 740 05EE 2ADF09 GETFCBB: LHLD INFO 741 05F1 110F00 LXI D,0000FH 742 05F4 19 DAD D 743 05F5 C9 RET 744 ; 745 ; COMPUTE RECCNT AND NXTREC ADDRESSES FOR GET/SETFCB 746 ; 747 05F6 CDEE05 GETFCBA:CALL GETFCBB 748 05F9 EB XCHG ;DE=.FCB(NXTREC) 749 05FA 211100 LXI H,00011H ;NXTREC-RECC 750 05FD 19 DAD D ;HL=.FCB(NXTREC) 751 05FE C9 RET 752 ; 753 ; SET VARIABLES FROM CURRENTLY ADDRESSED FCB 754 ; 755 05FF CDF605 GETFCB: CALL GETFCBA ;ADDRESSES IN DE, HL 756 0602 7E MOV A,M 757 0603 32C109 STA VRECORD ;VRECORD=FCB(NXTREC) 758 0606 EB XCHG 759 0607 7E MOV A,M 760 0608 32BF09 STA RCOUNT ;RCOUNT=FCB(RECCNT) 761 060B CDE605 CALL GETEXTA ;HL=.FCB(EXTNUM) 762 060E 3AA909 LDA EXTMSK ;EXTENT MASK TO A 763 0611 A6 ANA M ;FCB(EXTNUM) AND EXTMASK 764 0612 32C009 STA EXTVAL 765 0615 C9 RET 766 ; 767 ; PLACE VALUES BACK IN CURRENT FCB 768 ; 769 0616 CDF605 SETFCB: CALL GETFCBA ;ADDRESSES TO DE, HL 770 0619 0E01 MVI C,001H 771 061B 3AC109 LDA VRECORD 772 061E 81 ADD C 773 061F 77 MOV M,A ;FCB(NXTREC)=VRECORD+SEQIO 774 0620 EB XCHG 775 0621 3ABF09 LDA RCOUNT 776 0624 77 MOV M,A ;FCB(RECCNT)=RCOUNT 777 0625 C9 RET 778 ; 779 ; HL ROTATE RIGHT BY AMOUNT C 780 ; 781 0626 0C HLROTR: INR C ;IN CASE 0 782 0627 0D HLROTR0:DCR C 783 0628 C8 RZ ;RETURN WHEN C=0 784 0629 7C MOV A,H 785 062A B7 ORA A 786 062B 1F RAR 787 062C 67 MOV H,A ;HIGH BYTE 788 062D 7D MOV A,L 789 062E 1F RAR 790 062F 6F MOV L,A ;LOW BYTE 791 0630 C32706 JMP HLROTR0 792 ; 793 ; ROTATE THE MASK IN HL BY THE AMOUNT IN C 794 ; 795 0633 0C HLROTL: INR C ;MAY BE ZERO 796 0634 0D HLROTL0:DCR C 797 0635 C8 RZ ;RETURN WHEN C=0 798 0636 29 DAD H 799 0637 C33406 JMP HLROTL0 800 ; 801 ; SET A "1" VALUE IN CURDSK POSITION OF BC 802 ; 803 SET$DISK: 804 063A 3ADE09 LDA CURDSK 805 063D C5 PUSH B ;SAVE INPUT PARAMETER 806 063E 4F MOV C,A ;READY PARAMETER FOR SHIFT 807 063F 210100 LXI H,00001H 808 0642 CD3306 CALL HLROTL ;HL=MASK TO INTEGRATE 809 0645 C1 POP B ;ORIGINAL MASK 810 0646 79 MOV A,C 811 0647 B5 ORA L 812 0648 6F MOV L,A 813 0649 78 MOV A,B 814 064A B4 ORA H 815 064B 67 MOV H,A ;HL=MASK OR ROL(1,CURDSK) 816 064C C9 RET 817 ; 818 ; RETURN TRUE IF DIR CHECKSUM 819 ; 820 064D 3ADE09 NOWRITE:LDA CURDSK 821 0650 4F MOV C,A 822 0651 CD2606 CALL HLROTR 823 0654 7D MOV A,L 824 0655 E601 ANI 001H 825 0657 C9 RET ;NOW 0 IF NOWRITE 826 ; 827 ; COMPUTE THE ADDRESS OF A DIRECTORY ELEMENT AT 828 ; POSITION DPTR IN THE BUFFER 829 ; 830 GETDPTRA: 831 0658 2A8C09 LHLD BUFFA 832 065B 3AC909 LDA DPTR 833 065E 85 ADD L ;HL=HL+A 834 065F 6F MOV L,A 835 0660 D0 RNC ;OVERFLOW TO H 836 0661 24 INR H 837 0662 C9 RET 838 ; 839 0663 CDE605 RSEL3: CALL GETEXTA 840 0666 7E MOV A,M 841 0667 E61F ANI 01FH 842 0669 77 MOV M,A 843 066A C9 RET 844 ; 845 066B 7B READDIR1: MOV A,E 846 066C 95 SUB L 847 066D 6F MOV L,A 848 066E 7A MOV A,D 849 066F 9C SBB H 850 0670 67 MOV H,A 851 0671 C9 RET 852 ; 853 0672 D5 RDDIR2: PUSH D 854 0673 110A00 LXI D,0000AH 855 0676 19 DAD D 856 0677 5E MOV E,M 857 0678 23 INX H 858 0679 56 MOV D,M 859 067A EB XCHG 860 067B D1 POP D 861 067C C9 RET 862 ; 863 067D CDC604 READDIR3: CALL SEEKDIR 864 0680 3AB509 LDA ZERO2 865 0683 B7 ORA A 866 0684 CA8F06 JZ RD$DIR 867 0687 3E03 MVI A,003H 868 0689 CDE809 CALL READDIR4 869 068C C39B06 JMP SETDATA 870 ; 871 ; READ A DIRECTORY ENTRY INTO THE DIRECTORY BUFFER 872 ; 873 068F CDA106 RD$DIR: CALL RDDIR1 874 0692 228C09 SHLD BUFFA 875 0695 CDDA04 CALL SEEK 876 0698 CDB304 CALL RDBUFF ;DIRECTORY ENTRY LOADED 877 ; 878 ; SET DATA DMA ADDRESS 879 ; 880 069B 2ADC09 SETDATA:LHLD DMAAD 881 069E C3A706 JMP SETDMA 882 ; 883 06A1 2A9E09 RDDIR1: LHLD ALLOCA 884 06A4 CD7206 CALL RDDIR2 885 ; 886 ; HL=ADDRESS TO SET (I.E., BUFFA OR DMAAD) 887 ; 888 06A7 228A09 SETDMA: SHLD DMAADDR 889 06AA C9 RET 890 ; 891 ; RETURN ZERO FLAG IF AT END OF DIRECTORY, NON ZERO 892 ; IF NOT AT END (END OF DIR IF DCNT=0FFFFH) 893 ; 894 06AB 21E309 END$OF$DIR: LXI H,DCNT 895 06AE 7E MOV A,M ;MAY BE 0FFH 896 06AF 23 INX H 897 06B0 BE CMP M ;LOW(DCNT)=HIGH(DCNT)? 898 06B1 C0 RNZ ;NOW ZERO RETURNED IF DIFFERENT 899 ;HIGH AND LOW THE SAME,=0FFH? 900 06B2 3C INR A ;0FFH BECOMES 00 IF SO 901 06B3 C9 RET 902 ; 903 ; SET DCNT TO THE END OF THE DIRECTORY 904 ; 905 SET$END$DIR: 906 06B4 21FFFF LXI H,0FFFFH ;(ENDDIR) 907 06B7 22E309 SHLD DCNT 908 06BA C9 RET 909 ; 910 READ$DIR: 911 06BB 2AAC09 LHLD DIRMAX 912 06BE EB XCHG 913 06BF 2AE309 LHLD DCNT 914 06C2 23 INX H 915 06C3 22E309 SHLD DCNT 916 06C6 CD6B06 CALL READDIR1 917 06C9 DAB406 JC SET$END$DIR 918 06CC 3AE309 LDA DCNT 919 06CF E603 ANI 003H 920 06D1 0605 MVI B,005H 921 READDIR2: 922 06D3 87 ADD A 923 06D4 05 DCR B 924 06D5 C2D306 JNZ READDIR2 925 06D8 32C909 STA DPTR 926 06DB B7 ORA A 927 06DC C0 RNZ 928 06DD C5 PUSH B 929 06DE CD7D06 CALL READDIR3 930 06E1 C1 POP B 931 06E2 C9 RET 932 ; 933 ; COMPARE EXTENT# IN A TO THAT IN C, RETURN NONZERO 934 ; IF NO MATCH 935 ; 936 COMPEXT: 937 06E3 C5 PUSH B ;SAVE C'S ORIGINAL VALUE 938 06E4 F5 PUSH PSW 939 06E5 3AA909 LDA EXTMSK 940 06E8 2F CMA 941 06E9 47 MOV B,A ;B HAS NEGATED FORM OF EXTENT MASK 942 06EA 79 MOV A,C 943 06EB A0 ANA B 944 06EC 4F MOV C,A ;LOW BITS REMOVED FROM C 945 06ED F1 POP PSW 946 06EE A0 ANA B ;LOW BITS REMOVED FROM A 947 06EF 91 SUB C 948 06F0 E61F ANI 01FH ;(MAXEXT) SET FLAGS 949 06F2 C1 POP B ;RESTORE ORIGINAL VALUES 950 06F3 C9 RET 951 ; 952 06F4 CDF605 OPENER: CALL GETFCBA 953 06F7 0E10 MVI C,010H 954 06F9 41 MOV B,C 955 06FA 0C INR C 956 06FB C5 PUSH B 957 OPENER1: 958 06FC C1 POP B 959 06FD 0D DCR C 960 06FE AF XRA A 961 OPENER2: 962 06FF 2B DCX H 963 0700 05 DCR B 964 0701 BE CMP M 965 0702 C20907 JNZ OPENER3 966 0705 0D DCR C 967 0706 C2FF06 JNZ OPENER2 968 OPENER3: 969 0709 79 MOV A,C 970 070A 32BB09 STA DMPOS 971 070D 3ABD09 LDA SINGLE 972 0710 B7 ORA A 973 0711 78 MOV A,B 974 0712 C21607 JNZ OPENER4 975 0715 1F RAR 976 OPENER4: 977 0716 C5 PUSH B 978 0717 E5 PUSH H 979 0718 6F MOV L,A 980 0719 2600 MVI H,000H 981 071B 3AA709 LDA BLKSHF 982 071E 57 MOV D,A 983 071F 3E07 MVI A,007H 984 0721 92 SUB D 985 0722 4F MOV C,A 986 0723 CD2606 CALL HLROTR 987 0726 45 MOV B,L 988 0727 3AA909 LDA EXTMSK 989 072A B8 CMP B 990 072B E1 POP H 991 072C DAFC06 JC OPENER1 992 072F CDE605 CALL GETEXTA 993 0732 4E MOV C,M 994 0733 2F CMA 995 0734 E61F ANI 01FH 996 0736 A1 ANA C 997 0737 B0 ORA B 998 0738 C1 POP B 999 0739 C9 RET 1000 ; 1001 ; SEARCH FOR DIRECTORY ELEMENT OF LENGTH C AT INFO 1002 ; 1003 073A 2ADF09 SEARCH: LHLD INFO 1004 073D 22E509 SHLD SEARCHA ;SEARCHA=INFO 1005 0740 79 MOV A,C 1006 0741 32E709 STA SEARCHL 1007 0744 CDB406 CALL SET$END$DIR ;DCNT=ENDIR 1008 0747 CD9704 CALL HOME ;TO START AT THE BEGINNING 1009 ;(DROP THROUGH TO SEARCHN) 1010 ; 1011 SEARCHN: ;SEARCH FOR THE NEXT DIRECTORY 1012 ;ELEMENT, ASSUMING A PREVIOUS 1013 ;CALL ON SEARCH WHICH SETS 1014 ;SEARCHA AND SEARCHL 1015 074A 0E00 MVI C,000H ;(FALSE) 1016 074C CDBB06 CALL READ$DIR ;READ NEXT DIRECTORY ELEMENT 1017 074F CDAB06 CALL END$OF$DIR 1018 0752 CA9B07 JZ SEARCH$FIN ;SKIP TO END IF SO 1019 ;NOT END OF DIRECTORY, SCAN FOR MATCH 1020 0755 2AE509 LHLD SEARCHA 1021 0758 EB XCHG 1022 0759 CD5806 CALL GETDPTRA ;HL=BUFFA+DPTR 1023 075C 3AE709 LDA SEARCHL 1024 075F 4F MOV C,A ;LENGTH OF SEARCH TO C 1025 0760 0600 MVI B,000H ;B COUNTS UP, C COUNTS DOWN 1026 0762 7E MOV A,M 1027 0763 FEE5 CPI 0E5H ;(EMPTY) 1028 0765 CA4A07 JZ SEARCHN 1029 SEARCHLOOP: 1030 0768 79 MOV A,C 1031 0769 B7 ORA A 1032 076A CA9407 JZ ENDSEARCH 1033 076D 78 MOV A,B 1034 076E FE0D CPI 00DH ;(UBYTES) 1035 0770 CA8D07 JZ SEARCHOK ; 1036 ;NOT THE UBYTES FIELD, EXTENT FIELD? 1037 0773 FE0C CPI 00CH ;(EXTNUM) MAY BE EXTENT FIELD 1038 0775 CA8207 JZ SEARCHEXT ;SKIP TO SEARCH EXTENT 1039 0778 1A LDAX D ;FCB CHARACTER 1040 0779 96 SUB M 1041 077A E67F ANI 07FH ;MASK-OUT FLAGS/EXTENT MODULE 1042 077C C24A07 JNZ SEARCHN ;SKIP IF NOT MATCHED 1043 077F C38D07 JMP SEARCHOK ;MATCHED CHARACTER 1044 1045 SEARCHEXT: ;A HAS FCB CHARACTER 1046 ;ATTEMPT AN EXTENT # MATCH 1047 0782 1A LDAX D 1048 0783 C5 PUSH B ;SAVE COUNTERS 1049 0784 4E MOV C,M ;DIRECTORY CHARACTER TO C 1050 0785 CDE306 CALL COMPEXT ;COMPARE USER/DIR CHAR 1051 0788 C1 POP B ;RECALL COUNTERS 1052 0789 B7 ORA A 1053 078A C24A07 JNZ SEARCHN ;SKIP IF NO MATCH 1054 ; 1055 SEARCHOK: ;CURRENT CHARACTER MATCHES 1056 078D 13 INX D 1057 078E 23 INX H 1058 078F 04 INR B 1059 0790 0D DCR C 1060 0791 C36807 JMP SEARCHLOOP 1061 ; 1062 ENDSEARCH: 1063 0794 AF XRA A 1064 0795 320904 STA ARET 1065 0798 47 MOV B,A 1066 0799 04 INR B 1067 079A C9 RET 1068 ; 1069 ; END OF DIRECTORY OR EMPTY NAME 1070 ; 1071 SEARCH$FIN: 1072 079B 3EFF MVI A,0FFH 1073 079D 47 MOV B,A 1074 079E 04 INR B 1075 079F C3E503 JMP STA$RET 1076 ; 1077 ; SEARCH FOR THE DIRECTORY ENTRY, COPY TO FCB 1078 ; 1079 07A2 0E0F OPEN: MVI C,00FH ;NAMLEN 1080 07A4 CD3A07 CALL SEARCH 1081 07A7 C8 RZ ;RETURN WITH ARET=255 IF END 1082 ;NOT END OF DIRECTORY. COPY FCB 1083 ;INFORMATION (REFERENCED BELOW 1084 ;TO COPY FCB INFO) 1085 OPEN$COPY: 1086 07A8 CDE605 CALL GETEXTA 1087 07AB 7E MOV A,M 1088 07AC F5 PUSH PSW 1089 07AD CD5806 CALL GETDPTRA 1090 07B0 EB XCHG ;DE=.BUFF(DPTR) 1091 07B1 2ADF09 LHLD INFO ;HL=.FCB(0) 1092 07B4 0E20 MVI C,020H ;(NXTREC) LENGTH OF MOVE OPERATION 1093 07B6 CD4904 CALL MOVE ;FROM .BUFF(DPTR) TO .FCB(0) 1094 ;NOTE THAT ENTIRE FCB IS COPIED, 1095 ; INCLUDING INDICATORS 1096 07B9 CDF406 CALL OPENER 1097 07BC 4F MOV C,A 1098 07BD F1 POP PSW 1099 07BE 77 MOV M,A 1100 OPEN$COPY1: 1101 07BF 0600 MVI B,000H 1102 07C1 EB XCHG 1103 07C2 210300 LXI H,00003H 1104 07C5 19 DAD D 1105 07C6 1A LDAX D 1106 07C7 91 SUB C 1107 07C8 CAD807 JZ OPEN$COPY2 1108 07CB 78 MOV A,B 1109 07CC D2D207 JNC OPEN$RCNT ;USER IS LARGER 1110 07CF 3E80 MVI A,080H ;DIRECTORY IS LARGER 1111 07D1 46 MOV B,M 1112 OPEN$RCNT: ;A HAS RECORD COUNT TO FILL 1113 07D2 77 MOV M,A 1114 07D3 78 MOV A,B 1115 07D4 32BC09 STA RECCNT 1116 07D7 C9 RET 1117 1118 OPEN$COPY2: 1119 07D8 32BC09 STA RECCNT 1120 07DB 7E MOV A,M 1121 07DC B7 ORA A 1122 07DD C0 RNZ 1123 07DE 3ABB09 LDA DMPOS 1124 07E1 B7 ORA A 1125 07E2 C8 RZ 1126 07E3 3AE209 LDA SAVEC 1127 07E6 FE0F CPI 00FH 1128 07E8 C8 RZ 1129 07E9 3680 MVI M,080H 1130 07EB C9 RET 1131 ; 1132 OPEN$REEL3: 1133 07EC E5 PUSH H 1134 07ED 3ABC09 LDA RECCNT 1135 07F0 B7 ORA A 1136 07F1 CAFD07 JZ OPEN$REEL4 1137 07F4 110300 LXI D,00003H 1138 07F7 19 DAD D 1139 07F8 77 MOV M,A 1140 07F9 AF XRA A 1141 07FA 32BC09 STA RECCNT 1142 OPEN$REEL4: 1143 07FD E1 POP H 1144 07FE C9 RET 1145 ; 1146 ; CLOSE THE CURRENT EXTENT, AND OPEN THE NEXT ONE 1147 ; IF POSSIBLE. RMF IS TRUE IF IN READ MODE 1148 ; 1149 OPEN$REEL: 1150 07FF CDE605 CALL GETEXTA 1151 0802 7E MOV A,M 1152 0803 4F MOV C,A 1153 0804 0C INR C 1154 0805 CDE306 CALL COMPEXT 1155 0808 CA2108 JZ OPEN$REEL1 1156 080B 3E1F MVI A,01FH 1157 080D A1 ANA C 1158 080E 77 MOV M,A 1159 080F 0E0F MVI C,00FH 1160 0811 CD3A07 CALL SEARCH 1161 0814 CDA807 CALL OPEN$COPY 1162 OPEN$REEL0: 1163 0817 CDFF05 CALL GETFCB 1164 081A AF XRA A 1165 081B 32C109 STA VRECORD 1166 081E C3E503 JMP STA$RET 1167 1168 OPEN$REEL1: 1169 0821 34 INR M 1170 0822 CDF406 CALL OPENER 1171 0825 4F MOV C,A 1172 0826 BE CMP M 1173 0827 D22E08 JNC OPEN$REEL2 1174 082A 35 DCR M 1175 082B C3E903 JMP DISKEOF 1176 ; 1177 OPEN$REEL2: 1178 082E CDEC07 CALL OPEN$REEL3 1179 0831 CDBF07 CALL OPEN$COPY1 1180 0834 C31708 JMP OPEN$REEL0 1181 ; 1182 ; SEQUENTIAL DISK READ OPERATION 1183 ; 1184 SEQDISKREAD: 1185 0837 CDFF05 CALL GETFCB ;SETS PARAMETERS FOR THE READ 1186 083A 3AC109 LDA VRECORD 1187 083D 21BF09 LXI H,RCOUNT 1188 0840 BE CMP M ;VRECORD-RCOUNT,SKIP IF RCOUNT>VRECORD 1189 0841 DA5308 JC RECORDOK ;NOT ENOUGH RECORDS IN THE EXTENT, 1190 ; RECORD COUNT MUST BE 128 TO CONTINUE 1191 0844 FE80 CPI 080H ;VRECORD=128 1192 0846 C2E903 JNZ DISKEOF ;SKIP IF VRECORD<>128 1193 0849 CDFF07 CALL OPEN$REEL ;GO TO NEXT EXTENT IF SO 1194 084C 3A0904 LDA ARET 1195 084F B7 ORA A 1196 0850 C2E903 JNZ DISKEOF ;STOP AT EOF 1197 ; 1198 ; ARRIVE WITH FCB ADDRESSING A RECORD TO READ 1199 ; 1200 RECORDOK: 1201 0853 CDAE05 CALL INDEX ;ERROR 2 IF READING UNWRITTEN DATA 1202 ; (RETURNS 1 TO BE COMPATABLE WITH 1.4) 1203 0856 CAE903 JZ DISKEOF ;RECORD HAS BEEN ALLOCATED, READ IT 1204 0859 CDC005 CALL ATRAN ;ARECORD NOW A DISK ADDRESS 1205 085C 3AB509 LDA ZERO2 1206 085F B7 ORA A 1207 0860 C2D209 JNZ RECORDOK1 1208 0863 CD9B06 CALL SETDATA 1209 0866 CDDA04 CALL SEEK ;TO PROPER TRACK, SECTOR 1210 0869 CDB304 CALL RDBUFF ;TO DMA ADDRESS 1211 086C C31606 JMP SETFCB ;REPLACE PARAMETER 1212 1213 086F 3ADE09 SELECT: LDA CURDSK 1214 0872 3C INR A 1215 0873 CA0B04 JZ SEL$ERROR 1216 0876 3D DCR A 1217 0877 21C209 LXI H,SELSTR 1218 087A BE CMP M 1219 087B C8 RZ ;SKIP IN LINFO=CURDSK 1220 087C 77 MOV M,A 1221 087D 57 MOV D,A 1222 087E 2A8809 LHLD DLOG 1223 0881 CD4D06 CALL NOWRITE 1224 0884 5F MOV E,A 1225 0885 D5 PUSH D 1226 0886 CD5304 CALL SELECTDISK 1227 0889 E1 POP H ;RECALL DLOG VECTOR 1228 088A D20B04 JNC SEL$ERROR 1229 088D 2D DCR L 1230 088E C8 RZ 1231 088F 2A8809 LHLD DLOG 1232 0892 4D MOV C,L 1233 0893 44 MOV B,H ;CALL READY 1234 0894 CD3A06 CALL SET$DISK 1235 0897 228809 SHLD DLOG 1236 089A C9 RET 1237 ; 1238 CURSELECT: 1239 089B 3ABA09 LDA LINFO 1240 089E 32DE09 STA CURDSK 1241 08A1 C9 RET 1242 ; 1243 CLRMODNUM: 1244 08A2 AF XRA A 1245 08A3 32C809 STA MODNUM 1246 08A6 C3D208 JMP RSEL1 1247 ; 1248 ; CHECK CURRENT FCB TO SEE IF RESELECTION NECESSARY 1249 ; 1250 RESELECT: 1251 08A9 3E80 MVI A,080H 1252 08AB 47 MOV B,A 1253 08AC 3D DCR A 1254 08AD 4F MOV C,A 1255 08AE 2ADF09 LHLD INFO 1256 08B1 110700 LXI D,00007H 1257 08B4 EB XCHG 1258 08B5 19 DAD D 1259 08B6 7E MOV A,M 1260 08B7 A0 ANA B 1261 08B8 7E MOV A,M 1262 08B9 A1 ANA C 1263 08BA 77 MOV M,A 1264 08BB 23 INX H 1265 08BC 7E MOV A,M 1266 08BD A0 ANA B 1267 08BE 32C809 STA MODNUM 1268 08C1 7E MOV A,M 1269 08C2 A1 ANA C 1270 08C3 77 MOV M,A 1271 08C4 CD6306 CALL RSEL3 1272 08C7 CDEE05 CALL GETFCBB 1273 08CA 7E MOV A,M 1274 08CB A0 ANA B 1275 08CC CAD208 JZ RSEL1 1276 08CF 7E MOV A,M 1277 08D0 A1 ANA C 1278 08D1 70 MOV M,B 1279 08D2 32BC09 RSEL1: STA RECCNT 1280 08D5 210000 LXI H,00000H 1281 08D8 22CA09 SHLD OLDDSK 1282 08DB 3EFF MVI A,0FFH 1283 08DD 32E109 STA FCBDSK 1284 08E0 2ADF09 LHLD INFO 1285 08E3 7E MOV A,M 1286 08E4 E61F ANI 01FH 1287 08E6 3D DCR A 1288 08E7 32BA09 STA LINFO 1289 08EA FEFF CPI 0FFH 1290 08EC CAF608 JZ RSEL2 1291 08EF 7E MOV A,M 1292 08F0 32CA09 STA OLDDSK 1293 08F3 CD9B08 CALL CURSELECT 1294 08F6 CD6F08 RSEL2: CALL SELECT 1295 08F9 3E00 MVI A,000H 1296 08FB 2ADF09 LHLD INFO 1297 08FE 77 MOV M,A 1298 08FF C9 RET 1299 ; 1300 ; RESET DISK SYSTEM TO DISK 0 SEVERAL PARAMETERS RETURNED 1301 ; 1302 0900 210000 FUNCT0D:LXI H,00000H 1303 0903 228809 SHLD DLOG 1304 0906 AF XRA A 1305 0907 32DE09 STA CURDSK ;NOTE THAT USER CODE IS UNCHANGED 1306 090A 3D DCR A 1307 090B 32C209 STA SELSTR 1308 090E 218000 LXI H,TBUFF 1309 0911 22DC09 SHLD DMAAD ;DMAAD=TBUFF 1310 0914 C39B06 JMP SETDATA ;TO DATA DMA ADDR 1311 ; 1312 ; SELECT DISK E=DISK NUMBER 1313 ; 1314 0917 CD9B08 FUNCT0E:CALL CURSELECT 1315 091A C36F08 JMP SELECT 1316 ; 1317 ; OPEN FILE DE=FCB ADDRESS A=DIRECTORY CODE 1318 ; 1319 091D CDA208 FUNCT0F:CALL CLRMODNUM ;(CLRMODNUM) 1320 0920 CDA207 CALL OPEN 1321 0923 CD2709 CALL OPENX 1322 0926 C9 RET 1323 ; 1324 0927 CDAB06 OPENX: CALL END$OF$DIR 1325 092A C8 RZ 1326 092B CDF605 CALL GETFCBA 1327 092E 7E MOV A,M 1328 092F 3C INR A 1329 0930 C23709 JNZ OPENX1 1330 0933 1B DCX D 1331 0934 1B DCX D 1332 0935 1A LDAX D 1333 0936 77 MOV M,A 1334 0937 E1 OPENX1: POP H 1335 0938 0E40 MVI C,040H 1336 093A C9 RET 1337 ; 1338 ; READ SEQUENTIAL DE=FCB A=ERROR CODE 1339 ; 1340 093B CDA908 FUNCT14:CALL RESELECT 1341 093E C33708 JMP SEQDISKREAD 1342 ; 1343 ; RETURN CURRENT DISK HL=CURRENT DISK NUMBER 1344 ; 1345 0941 3ADE09 FUNCT19:LDA CURDSK 1346 0944 C3E503 JMP STA$RET 1347 ; 1348 ; SET DMA ADDRESS DE=DMA ADDRESS 1349 ; SET SUBSEQUENT DMA ADDRESS TO INFO 1350 ; 1351 0947 EB FUNCT1A:XCHG ;WAS LHLD INFO 1352 0948 22DC09 SHLD DMAAD ;DMAAD=INFO 1353 094B C39B06 JMP SETDATA ;TO DATA DMA ADDRESS 1354 ; 1355 ; ARRIVE HERE AT END OF PROCESSING TO RETURN TO USER 1356 ; 1357 094E 3AE209 GOBACK: LDA SAVEC 1358 0951 FE0F CPI 00FH 1359 0953 DA7E09 JC RETMON ;RESELECTION MAY HAVE TAKEN PLACE 1360 0956 3ABE09 LDA ZERO4 1361 0959 32DE09 STA CURDSK 1362 095C 3AE109 LDA FCBDSK 1363 095F B7 ORA A 1364 0960 CA7E09 JZ RETMON ;RESTORE DISK NUMBER 1365 0963 2ADF09 LHLD INFO 1366 0966 3600 MVI M,000H ;FCB(0)=0 1367 0968 3ACA09 LDA OLDDSK 1368 096B B7 ORA A 1369 096C CA7009 JZ GOBACK1 1370 096F 77 MOV M,A ;FCB(0)=FCBDSK 1371 0970 23 GOBACK1:INX H 1372 0971 3AC809 LDA MODNUM 1373 0974 B6 ORA M 1374 0975 77 MOV M,A 1375 0976 CDEE05 CALL GETFCBB 1376 0979 3ABC09 LDA RECCNT 1377 097C B6 ORA M 1378 097D 77 MOV M,A 1379 ; 1380 ; RETURN FROM THE DISK MONITOR 1381 ; 1382 097E 2A4003 RETMON: LHLD ENTSP ;GET OLD STACK POINTER 1383 0981 F9 SPHL ;RESTORE THE STACK 1384 0982 2A0904 LHLD ARET 1385 0985 7D MOV A,L 1386 0986 44 MOV B,H ;BA=HL=ARET 1387 0987 C9 RET 1388 1389 0988 0000 DLOG: DW 0000H 1390 1391 098A 0000 DMAADDR:DW 0000H 1392 1393 098C 0000 BUFFA: DW 0000H 1394 1395 098E 0000 DW 0000H 1396 1397 0990 0000 CURTRKA:DW 0000H 1398 1399 0992 0000 CURRECA:DW 0000H 1400 1401 0994 0000 DW 0000H 1402 1403 0996 0000 DW 0000H 1404 1405 0998 0000 BUFFB: DW 0000H 1406 1407 099A 0000 DW 0000H 1408 1409 099C 0000 DW 0000H 1410 1411 099E 0000 ALLOCA: DW 0000H 1412 1413 09A0 0000000000ZERO5: DB 0,0,0,0,0 1414 1415 09A5 0000 SECTPT: DW 0000H 1416 1417 09A7 00 BLKSHF: DB 000H 1418 1419 09A8 00 BLKMSK: DB 000H 1420 1421 09A9 00 EXTMSK: DB 000H 1422 1423 09AA 0000 MAXALL: DW 0000H 1424 1425 09AC 0000 DIRMAX: DW 0000H 1426 1427 09AE 0000 DW 0000H 1428 1429 09B0 0000 DW 0000H 1430 1431 09B2 0000 OFFSET: DW 0000H 1432 1433 09B4 00 ZERO1: DB 000H 1434 1435 09B5 00 ZERO2: DB 000H 1436 1437 09B6 00 MSKVREC:DB 000H 1438 1439 09B7 00 ZERO3: DB 000H 1440 1441 09B8 0000 TRANV: DW 0000H 1442 1443 09BA 00 LINFO: DB 000H 1444 1445 09BB 00 DMPOS: DB 000H 1446 1447 09BC 00 RECCNT: DB 000H 1448 1449 09BD 00 SINGLE: DB 000H 1450 1451 09BE 00 ZERO4: DB 000H 1452 1453 09BF 00 RCOUNT: DB 000H 1454 1455 09C0 00 EXTVAL: DB 000H 1456 1457 09C1 00 VRECORD:DB 000H 1458 1459 09C2 FF SELSTR: DB 0FFH 1460 1461 09C3 0000 ARECORD:DW 0000H 1462 1463 09C5 00 SHIFTED:DB 000H 1464 1465 09C6 0000 SHAREC: DW 0000H 1466 1467 09C8 00 MODNUM: DB 000H 1468 1469 09C9 00 DPTR: DB 000H 1470 1471 09CA 00 OLDDSK: DB 000H 1472 1473 09CB 00 SOMREC: DB 000H 1474 1475 09CC 0000 RECADR: DW 0000H 1476 1477 09CE 0000 TRACK: DW 0000H 1478 1479 09D0 0000 SAVSEC: DW 0000H 1480 1481 RECORDOK1: 1482 09D2 3E01 MVI A,001H 1483 09D4 CDEE09 CALL RECORDOK2 1484 09D7 C31606 JMP SETFCB 1485 1486 09DA 00 COLUMN: DB 000H ;COLUMN NUMBER 1487 1488 09DB 24 DOLLAR: DB 024H ;$ 1489 1490 09DC 8000 DMAAD: DB 080H,000H ;DMA ADDRESS 1491 1492 09DE 00 CURDSK: DB 000H ;CURRENT DISK 1493 1494 09DF 0000 INFO: DW 0000H ;MESSAGE LOCATION 1495 1496 09E1 00 FCBDSK: DB 000H 1497 1498 09E2 00 SAVEC: DB 000H 1499 1500 09E3 0000 DCNT: DW 0000H 1501 1502 09E5 0000 SEARCHA:DW 0000H 1503 1504 09E7 00 SEARCHL:DB 000H 1505 1506 READDIR4: 1507 09E8 2A9E09 LHLD ALLOCA 1508 09EB C3F109 JMP READDIR5 1509 1510 RECORDOK2: 1511 09EE 2AA009 LHLD ZERO5 1512 READDIR5: 1513 09F1 F5 PUSH PSW 1514 09F2 CD540A CALL RECOK1 1515 09F5 3AC309 LDA ARECORD 1516 09F8 5F MOV E,A 1517 09F9 A0 ANA B 1518 09FA 32CB09 STA SOMREC 1519 09FD 7B MOV A,E 1520 09FE A1 ANA C 1521 09FF 32C309 STA ARECORD 1522 0A02 22CC09 SHLD RECADR 1523 0A05 CD7206 CALL RDDIR2 1524 0A08 228A09 SHLD DMAADDR 1525 0A0B CD5B0A CALL RECOK5 1526 0A0E F1 POP PSW 1527 0A0F F5 PUSH PSW 1528 0A10 FE04 CPI 004H 1529 0A12 D21C0A JNC RECOK2 1530 0A15 CD3F04 CALL RECOK8 1531 0A18 CA2C0A JZ RECOK3 1532 0A1B AF XRA A 1533 0A1C CD640A RECOK2: CALL RECOK6 1534 0A1F 3E02 MVI A,002H 1535 0A21 CD6C0A CALL RECOK7 1536 0A24 CD5B0A CALL RECOK5 1537 0A27 CD4904 CALL MOVE 1538 0A2A 3600 MVI M,000H 1539 0A2C 3ACB09 RECOK3: LDA SOMREC 1540 0A2F 3C INR A 1541 0A30 118000 LXI D,TBUFF 1542 0A33 2180FF LXI H,0FF80H 1543 0A36 19 RECOK4: DAD D 1544 0A37 3D DCR A 1545 0A38 C2360A JNZ RECOK4 1546 0A3B EB XCHG 1547 0A3C 2A8A09 LHLD DMAADDR 1548 0A3F 19 DAD D 1549 0A40 F1 POP PSW 1550 0A41 FE03 CPI 003H 1551 0A43 C24A0A JNZ BNKMOV 1552 0A46 228C09 SHLD BUFFA 1553 0A49 C9 RET 1554 ; 1555 0A4A EB BNKMOV: XCHG 1556 0A4B 2ADC09 LHLD DMAAD 1557 0A4E 018000 LXI B,TBUFF 1558 0A51 C34B0B JMP ?MOV ;MOVE BETWEEN BANKS 1559 ; 1560 0A54 3AB509 RECOK1: LDA ZERO2 1561 0A57 47 MOV B,A 1562 0A58 2F CMA 1563 0A59 4F MOV C,A 1564 0A5A C9 RET 1565 ; 1566 0A5B 2ACC09 RECOK5: LHLD RECADR 1567 0A5E 11C209 LXI D,SELSTR 1568 0A61 0E04 MVI C,004H 1569 0A63 C9 RET 1570 ; 1571 0A64 110400 RECOK6: LXI D,00004H 1572 0A67 2ACC09 LHLD RECADR 1573 0A6A 19 DAD D 1574 0A6B C9 RET 1575 ; 1576 0A6C F5 RECOK7: PUSH PSW 1577 0A6D CDDA04 CALL SEEK 1578 0A70 F1 POP PSW 1579 0A71 3D DCR A 1580 0A72 F4B304 CP RDBUFF 1581 0A75 CD640A CALL RECOK6 1582 0A78 23 INX H 1583 0A79 23 INX H 1584 0A7A 11CE09 LXI D,TRACK 1585 0A7D 0E04 MVI C,004H 1586 0A7F C34904 JMP MOVE 1587 ; 1588 0A82 DS 126D ;F1LL OUT TO THE END OF THE BLOCK 1589 ; 1590 0B00 END ADDEHL 042E 393# 565 ALLOCA 099E 883 1411# 1507 ARECORD 09C3 496 524 545 707 716 719 728 1461# 1515 1521 ARET 0409 195 347 367# 1064 1194 1384 ATRAN 05C0 714# 1204 ATRAN0 0437 403# 718 ATRAN1 0438 404# 408 BDOS 028D 42 46 50 73 121 127 133 181# BDOS1 02A5 186 192# BDOS2 02CA 204 209# BDOS3 02CF 207 211# BIOSSTART 0B00 11# 13 14 15 16 17 18 19 20 21 22 BLKMSK 09A8 722 1419# BLKSHF 09A7 641 714 981 1417# BNKMOV 0A4A 1551 1555# BUFFA 098C 831 874 1393# 1552 BUFFB 0998 458 461 1405# CLRMODNUM 08A2 1243# 1319 COLUMN 09DA 289 320 1486# COMPCOL 03EE 282 358# COMPEXT 06E3 936# 1050 1154 COMPOUT 039E 284 288# CONOUT 0392 282# 317 319 CURDSK 09DE 190 804 820 1213 1240 1305 1345 1361 1492# CURRECA 0992 449 486 539 606 1399# CURSELECT 089B 1238# 1293 1314 CURTRKA 0990 446 482 534 599 1397# DCNT 09E3 519 894 907 913 915 918 1500# DIRMAX 09AC 911 1425# DISKEOF 03E9 353# 1175 1192 1196 1203 DISKRESET 000D 27# 41 DLOG 0988 1222 1231 1235 1303 1389# DMAAD 09DC 880 1309 1352 1490# 1556 DMAADDR 098A 629 888 1391# 1524 1547 DMASET 018F 57 112 120# DMPOS 09BB 703 970 1123 1445# DMPOS0 0579 644# 647 DMPOS1 0587 658# 662 DMPOS2 0590 659 666# DMPOSITION 0572 640# 702 DOLLAR 09DB 327 1488# DPTR 09C9 832 925 1469# ENDOFDIR 06AB 894# 1017 1324 ENDSEARCH 0794 1032 1062# ENTSP 0340 198 273# 1382 EXTMSK 09A9 762 939 988 1421# EXTVAL 09C0 653 764 1455# FCB 005C 32# 87 FCBDSK 09E1 196 1283 1362 1496# FCBT 01AB 49 126 141# FNCRET 03E8 222 223 225 226 227 228 229 230 232 233 234 238 239 240 241 243 244 245 246 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 351# FUNCT02 03BB 224 315# 334 FUNCT09 03DF 231 340# FUNCT0D 0900 235 1302# FUNCT0E 0917 236 1314# FUNCT0F 091D 237 1319# FUNCT14 093B 242 1340# FUNCT19 0941 247 1345# FUNCT1A 0947 248 1351# FUNCTAB 02DC 206 222# GETDM 059A 683# 706 GETDM1 0592 676# 683 GETDMD 05A8 687 692# GETDPTRA 0658 830# 1022 1089 GETEXTA 05E6 735# 761 839 992 1086 1150 GETFCB 05FF 755# 1163 1185 GETFCBA 05F6 747# 755 769 952 1326 GETFCBB 05EE 740# 747 1272 1375 GOBACK 094E 200 1357# GOBACK1 0970 1369 1371# HEDR1 0281 60 77 171# HEDR2 0282 75 173# HEDR3 0283 84 175# HEDR4 0284 80 177# HEDR5 0285 95 179# HLROTL 0633 795# 808 HLROTL0 0634 796# 799 HLROTR 0626 521 636 781# 822 986 HLROTR0 0627 782# 791 HOME 0497 480# 1008 INDEX 05AE 702# 1201 INFO 09DF 182 218 676 735 740 1003 1091 1255 1284 1296 1365 1494# LINFO 09BA 193 1239 1288 1443# LSTACK 0392 199 276# MAXALL 09AA 466 1423# MODNUM 09C8 1245 1267 1372 1467# MOVE 0449 421# 460 465 1093 1537 1586 MOVE0 044A 422# 428 MOVER 0134 63# 68 MSBANR 0225 45 157# MSBDOS 03EF 360# 370 375 MSKVREC 09B6 727 1437# MSOPEN 01CF 53 147# MSPERM 0403 365# 377 MSREAD 01FA 130 152# MSSLCT 03FC 363# 372 NOTBACKSP 03B5 301 307# NOWRITE 064D 820# 1223 OFFSET 09B2 591 1431# OLDDSK 09CA 1281 1292 1367 1471# OPEN 07A2 1079# 1320 OPENCOPY 07A8 1085# 1161 OPENCOPY1 07BF 1100# 1179 OPENCOPY2 07D8 1107 1118# OPENER 06F4 952# 1096 1170 OPENER1 06FC 957# 991 OPENER2 06FF 961# 967 OPENER3 0709 965 968# OPENER4 0716 974 976# OPENRCNT 07D2 1109 1112# OPENREEL 07FF 1149# 1193 OPENREEL0 0817 1162# 1180 OPENREEL1 0821 1155 1168# OPENREEL2 082E 1173 1177# OPENREEL3 07EC 1132# 1178 OPENREEL4 07FD 1136 1142# OPENX 0927 1321 1324# OPENX1 0937 1329 1334# PERMSG 0417 375# 512 514 PRINT 03CF 327# 336 343 371 376 378 PRINTSTRING 0009 26# 44 71 132 QUIT2 0420 373 378# QUITS 01A2 54 132# RCOUNT 09BF 760 775 1187 1453# RDBUFF 04B3 506# 876 1210 1580 RDBUFF1 04AA 495# 506 RDDIR 068F 866 873# RDDIR1 06A1 873 883# RDDIR2 0672 853# 884 1523 READDIR 06BB 910# 1016 READDIR1 066B 845# 916 READDIR2 06D3 921# 924 READDIR3 067D 863# 929 READDIR4 09E8 868 1506# READDIR5 09F1 1508 1512# READFILE 0173 78 85 98# READLOOP 017A 105# 117 READSECT 0195 58 70 113 124# READSEQUENT 0014 29# 125 REBOOT 01A9 94 138# RECADR 09CC 1475# 1522 1566 1572 RECCNT 09BC 1115 1119 1134 1141 1279 1376 1447# RECOK1 0A54 1514 1560# RECOK2 0A1C 1529 1533# RECOK3 0A2C 1531 1539# RECOK4 0A36 1543# 1545 RECOK5 0A5B 1525 1536 1566# RECOK6 0A64 1533 1571# 1581 RECOK7 0A6C 1535 1576# RECOK8 043F 410# 417 1530 RECORDOK 0853 1189 1200# RECORDOK1 09D2 1207 1481# RECORDOK2 09EE 1483 1510# RESELECT 08A9 1250# 1340 RETMON 097E 1359 1364 1382# RETSELECT 0495 471 473# RSEL1 08D2 1246 1275 1279# RSEL2 08F6 1290 1294# RSEL3 0663 839# 1271 SAVEC 09E2 187 1126 1357 1498# SAVSEC 09D0 627 1479# SEARCH 073A 1003# 1080 1160 SEARCHA 09E5 1004 1020 1502# SEARCHEXT 0782 1038 1045# SEARCHFIN 079B 210 1018 1071# SEARCHL 09E7 1006 1023 1504# SEARCHLOOP 0768 1029# 1060 SEARCHN 074A 1011# 1028 1042 1053 SEARCHOK 078D 1035 1043 1055# SECTPT 09A5 463 556 564 582 1415# SEEK 04DA 534# 875 1209 1577 SEEK0 04F0 548# 562 SEEK1 0507 555 564# 578 SEEK2 051E 573 580# SEEK3 056B 619 634# SEEKDIR 04C6 519# 863 SELECT 086F 1213# 1294 1315 SELECTDISK 0453 433# 1226 SELERROR 040B 369# 1215 1228 SELSTR 09C2 1217 1307 1459# 1567 SEQDISKREAD 0837 1184# 1341 SETDATA 069B 869 880# 1208 1310 1353 SETDISK 063A 803# 1234 SETDMA 06A7 881 888# SETDMAADDR 001A 30# 120 SETENDDIR 06B4 905# 917 1007 SETFCB 0616 769# 1211 1484 SHAREC 09C6 721 1465# SHIFTED 09C5 546 720 1463# SINGLE 09BD 468 685 971 1449# SKIP2 016F 90 95# SKIPRD 015F 82 87# SOMREC 09CB 1473# 1518 1539 SRCHFIRST 000F 28# 48 STACK1 0281 38 169# STARET 03E5 347# 354 1075 1166 1346 SUBDH 0425 383# 557 583 TAB0 03C1 318# 322 TBUFF 0080 33# 56 59 72 1308 1541 1557 TRACK 09CE 595 1477# 1584 TRANV 09B8 457 622 1441# VRECORD 09C1 643 724 757 771 1165 1186 1457# ZERO1 09B4 634 1433# ZERO2 09B5 864 1205 1435# 1560 ZERO3 09B7 189 1439# ZERO4 09BE 191 1360 1451# ZERO5 09A0 1413# 1511 ?BOOT 0B00 13# 39 ?CONOT 0B0C 14# 286 ?HOME 0B18 15# 480 ?MOV 0B4B 22# 1558 ?READ 0B27 20# 507 ?SCTRN 0B30 21# 624 ?SLDSK 0B1B 16# 436 ?STDMA 0B24 19# 632 ?STSEC 0B21 18# 628 ?STTRK 0B1E 17# 596