1 2 ;LOADSYS.ASM REASSEMBLY OF CPMLDR.COM 3 ;28 MAY 85 RHP 4 5 ; THIS PROGRAM READS THE FILE 'SYSTEM.FIL' OFF OF THE DISK 6 ; AND RELOCATES THE FILE TO THE OPERATING POSITION. 7 ; 8 ;APPEND A TRUNKATED BIOS THAT NEED ONLY DO CONSOLE WRITE, AND DISK 9 ; READ FUNCTIONS. 10 ; 11 ;THIS PROGRAM MAY BE RESIDENT ON THE SYSTEM TRACKS OR RUN 12 ; AS A TRANSIENT PROGRAM. 13 14 ;BIOS JUMP TABLE 15 ; 16 0B00 = BIOSS EQU 0B00H 17 ; 18 0B00 = @BOOT EQU BIOSS + 000H ;COLD BOOT 19 0B0C = @CONOT EQU BIOSS + 00CH ;CONSOLE OUT 20 0B18 = @HOME EQU BIOSS + 018H ;HOME TO TRACK 0 21 0B1B = @SLDSK EQU BIOSS + 01BH ;SELECT DISK 22 0B1E = @STTRK EQU BIOSS + 01EH ;SET TRACK 23 0B21 = @STSEC EQU BIOSS + 021H ;SET SECTOR 24 0B24 = @STDMA EQU BIOSS + 024H ;SET DMA ADDRESS 25 0B27 = @READ EQU BIOSS + 027H ;READ A SECTOR 26 0B30 = @SCTRN EQU BIOSS + 030H ;TRANSLATE A PHYSICAL SECTOR 27 0B4B = @MOV EQU BIOSS + 04BH ;MOVE BETWEEN BANKS 28 ; 29 ; BDOS CALL FUNCTIONS 30 ; 31 0000 = PRINT$STRING EQU 000H ;DE=STRING ADDRESS 32 0001 = DISK$RESET EQU 001H ;NO PARAMETERS 33 0002 = SEL$DISK EQU 002H ; WAS FUNCT E 34 0003 = SRCH$FIRST EQU 003H ;DE=FCB ADDR, A=DIR CODE 35 0004 = READ$SEQUENT EQU 004H ;DE=FCB ADDR, A=ERROR CODE 36 0005 = RETURN$CUR$DSK EQU 005H ; WAS FUNCT 19 37 0006 = SET$DMA$ADDR EQU 006H ;DE=DMA ADDRESS 38 ; 39 005C = FCB EQU 0005CH 40 0080 = TBUFF EQU 00080H 41 ; 42 0100 ORG 00100H 43 ; 44 ; 45 0100 315509 LXI SP,STACK1 ;SET UP THE STACK 46 0103 CD000B CALL @BOOT ;COLD BOOT 47 ; 48 0106 0E01 MVI C,DISK$RESET ;RESET DISK 49 0108 CDAB01 CALL BDOS ; 50 ; 51 010B 0E00 MVI C,PRINT$STRING ;PRINT STRING 52 010D 11F908 LXI D,MSBANR ;SIGN ON BANNER 53 0110 CDAB01 CALL BDOS 54 ; 55 0113 0E03 MVI C,SRCH$FIRST ;LOCATE FILE ON DISK 56 0115 117F08 LXI D,FCBT 57 0118 CDAB01 CALL BDOS 58 ; 59 011B FEFF CPI 0FFH ;CHECK FOR ERROR 60 011D 11A308 LXI D,MSOPEN ;OPEN ERROR MESSAGE 61 0120 CAA201 JZ QUITS ;HALT 62 ; 63 0123 118000 LXI D,TBUFF ;POINT TO TEMP BUFFER 64 0126 CD8F01 CALL DMASET ;IDENTIFY AS DMA ADDR 65 0129 CD9501 CALL READSECT 66 012C 218000 LXI H,TBUFF ;POINT TO TEMP BUFFER 67 012F 115509 LXI D,HEDR1 ;POINT TO NEW STORAGE 68 0132 0E06 MVI C,006H ;MOVE 6 BYTES 69 ; 70 0134 7E MOVER: MOV A,M ;MOVE MEMORY BLOCK 71 0135 12 STAX D 72 0136 13 INX D 73 0137 23 INX H 74 0138 0D DCR C 75 0139 C23401 JNZ MOVER 76 ; 77 013C CD9501 CALL READSECT ;PUT SECTOR INTO TEMP BUFFER 78 013F 0E00 MVI C,PRINT$STRING ;PRINT OUT THE CONTENTS OF 79 0141 118000 LXI D,TBUFF ;THE STRING JUST READ 80 0144 CDAB01 CALL BDOS 81 ; 82 0147 3A5609 LDA HEDR2 ;GET 2ND GYTE OF HEADER 83 014A 67 MOV H,A ;PUT IN H 84 014B 3A5509 LDA HEDR1 ;GET FIRST BYTE OF HEADER 85 014E CD7301 CALL READFILE 86 ; 87 0151 3A5809 LDA HEDR4 ;GET 4TH BYTE OF HEADER 88 0154 B7 ORA A ;SET FLAGS 89 0155 CA5F01 JZ SKIPRD ;SKIP IF EMPTY 90 0158 67 MOV H,A 91 0159 3A5709 LDA HEDR3 92 015C CD7301 CALL READFILE 93 ; 94 015F 215D00 SKIPRD: LXI H,FCB+1 ;1ST CHAR OF FILENAME 95 0162 7E MOV A,M ;GET IT 96 0163 FE24 CPI 024H ;IS IT A $? 97 0165 C26F01 JNZ SKIP2 ;IF NOT THEN SKIP 98 0168 23 INX H ;2ND CHAR OF FILENAME 99 0169 7E MOV A,M ;GET IT 100 016A FE42 CPI 042H ;IS IT A 'B'? 101 016C CCA901 CZ REBOOT ;THEN GO TO REBOOT 102 016F 315909 SKIP2: LXI SP,HEDR5 ;ELSE JUMP TO ADDRESS OF 103 0172 C9 RET ; BYTES 5,6 OF HEADER 104 105 READFILE: 106 0173 B7 ORA A ;SET FLAGS 107 0174 57 MOV D,A ;FIRST BYTE TO D 108 0175 1E00 MVI E,000H ;E=0 109 0177 7C MOV A,H ;SECOND BYTE TO A 110 0178 17 RAL ;X2 111 0179 67 MOV H,A ;BACK TO H 112 READLOOP: 113 017A EB XCHG ;SWAP DE,HL 114 017B 0180FF LXI B,0FF80H ; -80 115 017E 09 DAD B ;SUBTRACT 80 FROM 2ND BYTE 116 017F EB XCHG ;SWAP AGAIN 117 0180 D5 PUSH D ;SAVE REGISTERS 118 0181 E5 PUSH H 119 0182 CD8F01 CALL DMASET ;POINT TO NEW ADDRESS 120 0185 CD9501 CALL READSECT ;READ DISK INTO THERE 121 0188 E1 POP H ;RESTORE REGISTERS 122 0189 D1 POP D 123 018A 25 DCR H ;H-1 124 018B C27A01 JNZ READLOOP ;LOOP TIL H=0 125 018E C9 RET 126 127 018F 0E06 DMASET: MVI C,SET$DMA$ADDR 128 0191 CDAB01 CALL BDOS 129 0194 C9 RET 130 131 READSECT: 132 0195 0E04 MVI C,READ$SEQUENT 133 0197 117F08 LXI D,FCBT ;POINT TO FILE CONTROL BLOCK 134 019A CDAB01 CALL BDOS 135 ; 136 019D B7 ORA A ;SET FLAGS 137 019E 11CE08 LXI D,MSREAD ;READ ERROR MESSAGE 138 01A1 C8 RZ ;NO ERROR 139 01A2 0E00 QUITS: MVI C,PRINT$STRING ;ELSE PRINT ERROR MSG 140 01A4 CDAB01 CALL BDOS 141 ; 142 01A7 F3 DI ;KILL INTERRUPTS 143 01A8 76 HLT ;FREEZE 144 ; 145 01A9 FF REBOOT: RST 07 146 01AA C9 RET 147 ; 148 01AB EB BDOS: XCHG ;MSG POINTER IN HL 149 01AC 22AA09 SHLD INFO ;STORE MSG LOCATION 150 01AF EB XCHG ;MSG POINTER BACK TO DE 151 01B0 79 MOV A,C 152 01B1 FE0E CPI 00EH 153 01B3 DAC301 JC BDOS1 154 01B6 32AD09 STA SAVEC ;SAVE # IN C 155 01B9 AF XRA A ;CLEAR ACCUMULATOR 156 01BA 328A09 STA ZERO3 ;SET TO FALSE 157 01BD 32A909 STA CURDSK 158 01C0 329109 STA ZERO4 159 01C3 7B BDOS1: MOV A,E ;GET LO BYTE OF MEM ADDRESS 160 01C4 328D09 STA LINFO ;SAVE IT 161 01C7 210000 LXI H,00000H ;CLEAR HL 162 01CA 227D08 SHLD ARET ;RETURN VALUE DEFAULTS TO 0000 163 01CD 22AC09 SHLD FCBDSK ; SAVE USERS STACK PTR, SET TO LOCAL STACK 164 01D0 39 DAD SP ;MOVE SP TO HL 165 01D1 226109 SHLD ENTSP ;ENTSP=STACK POINTER 166 01D4 31030A LXI SP,LSTACK ;POINT STACK TO END OF C7 TABLE 167 01D7 218907 LXI H,GOBACK ;RETURN HERE AFTER ALL FUNCTIONS 168 01DA E5 PUSH H ;JUMP GOBACK EQUIV TO RETURN 169 01DB 79 MOV A,C 170 01DC FE06 CPI 006H ;NUMBER OF FUNCTIONS 171 01DE D2E801 JNC BDOS2 ;INVALID NUMBER 172 01E1 4B MOV C,E ;POSSIBLE OUTPUT CHAR. TO C 173 01E2 21FA01 LXI H,FUNCTAB ;POINT TO FUNCTION TABLE 174 01E5 C3ED01 JMP BDOS3 175 ; 176 01E8 DE64 BDOS2: SBI 064H 177 01EA DAD605 JC SEARCH$FIN 178 01ED 5F BDOS3: MOV E,A ;E GETS A 179 01EE 1600 MVI D,000H ;DE=FUNCTION, HL=.CIOTAR 180 01F0 19 DAD D ;ADD DE, HL 181 01F1 19 DAD D ;ADD DE, HL 182 01F2 5E MOV E,M ;MEMORY WORD TO DE 183 01F3 23 INX H 184 01F4 56 MOV D,M ;DE=FUNCTION ARGUMENT 185 01F5 2AAA09 LHLD INFO ;POINT TO MESSAGE WITH HL 186 01F8 EB XCHG ;DE POINTS MSG, HL TO DEST. 187 01F9 E9 PCHL ;JUMP TO ROUTINE 188 ; 189 FUNCTAB: 190 01FA 3102 DW FUNCT00 ;FUNCTION 9=PRINT STRING 191 01FC 3F07 DW FUNCT01 ;FUNCTION D=RESET DISK 192 01FE 5607 DW FUNCT02 ;FUNCTION E=SELECT DISK 193 0200 5C07 DW FUNCT03 ;FUNCTION F=OPEN FILE 194 0202 7607 DW FUNCT04 ;FUNCTION 14=READ SEQUENTIAL 195 0204 7C07 DW FUNCT05 ;FUNCTION 19=RETURN CURRENT DISK 196 0206 8207 DW FUNCT06 ;FUNCTION 1A=SET DMA ADDRESS 197 ; 198 ; COMPUTE CHARACTER POSITION/WRITE CONSOLE 199 ; CHARACTER FROM C 200 ; COMPCOL = TRUE IF COMPUTING COLUMN POSITION 201 ; 202 0208 3A6208 CONOUT: LDA COMPCOL 203 020B B7 ORA A 204 020C C21402 JNZ COMPOUT ;WRT CHAR FROM C, THEN COMP COL. 205 020F C5 PUSH B 206 0210 CD0C0B CALL @CONOT ;PRINT CHARACTER ON CONSOLE 207 0213 C1 POP B 208 0214 79 COMPOUT:MOV A,C ;RECALL CHAR & COMPUTE COL POSIT 209 0215 21A509 LXI H,COLUMN ;A=CHAR, HL=.COLUMN 210 0218 FE7F CPI 07FH ;RUBOUT? 211 021A C8 RZ ;NO COL CHANGE IF NULLS 212 021B 34 INR M ;NEXT COLUMN 213 021C FE20 CPI 020H ;SPACE? 214 021E D0 RNC ;RETURN IF GRAPHIC,ELSE RESET COL. 215 021F 35 DCR M ;NEXT COLUMN 216 0220 7E MOV A,M 217 0221 B7 ORA A 218 0222 C8 RZ ;RET IF ZERO, ELSE MAYBE BS OR EOL 219 0223 79 MOV A,C ;CHAR IN A 220 0224 FE08 CPI 008H ;CTL H? 221 0226 C22B02 JNZ NOTBACKSP ;ELSE BACKSPACE 222 0229 35 DCR M ;NEXT COLUMN 223 022A C9 RET 224 ; 225 ; NOT A BACKSPACE CHARACTER, EOL? 226 ; 227 NOTBACKSP: 228 022B FE0A CPI 00AH ;LINEFEED? 229 022D C0 RNZ 230 022E 3600 MVI M,000H ;END OF LINE, COL=0 231 0230 C9 RET 232 ; 233 ; PRINT STRING DE=STRING ADDRESS, ENDS IN $ 234 ; 235 0231 EB FUNCT00:XCHG ;WAS LHLD INFO 236 0232 4D MOV C,L 237 0233 44 MOV B,H ;BC=STRING ADDRESS 238 ; 239 ; PRINT MESSAGE UNTIL M(BC) = $ 240 ; 241 0234 21A609 PRINT: LXI H,DOLLAR 242 0237 0A LDAX B 243 0238 BE CMP M ;$? 244 0239 C8 RZ ;STOP ON $, ELSE MORE TO PRINT 245 023A 03 INX B 246 023B C5 PUSH B 247 023C 4F MOV C,A 248 023D 79 MOV A,C 249 023E FE09 CPI 009H ;TAB? 250 0240 C20802 JNZ CONOUT ;IF NO TAB, DIRECT TO CONOUT 251 0243 0E20 TAB0: MVI C,020H ;ELSE CHANGE TO SPACE 252 0245 CD0802 CALL CONOUT 253 0248 3AA509 LDA COLUMN 254 024B E607 ANI 007H ;COLUMN MOD 8 = 0 7 255 024D C24302 JNZ TAB0 ;BACK FOR ANOTHER IF NOT 256 0250 C1 POP B 257 0251 C33402 JMP PRINT 258 ; 259 0254 3E01 DISKEOF:MVI A,001H ;SET LRET=1 260 0256 327D08 STA$RET:STA ARET ;STORE THE REGISTER TO ARET 261 0259 C9 FNC$RET:RET ;JMP GOBACK (POP STACK FOR NON CPM FUNCTIONS) 262 ; 263 SEL$ERROR: 264 025A 016308 LXI B,MSBDOS ;BDOS ERROR MESSAGE 265 025D CD3402 CALL PRINT 266 0260 017008 LXI B,MSSLCT ;SELECT MSG 267 0263 C36F02 JMP QUIT2 268 ; 269 0266 016308 PERMSG: LXI B,MSBDOS ;BDOS ERROR MESSAGE 270 0269 CD3402 CALL PRINT 271 026C 017708 LXI B,MSPERM ;PERMANENT MSG 272 026F CD3402 QUIT2: CALL PRINT 273 ; 274 0272 F3 DI ;KILL INTERRUPTS 275 0273 76 HLT ;FREEZE 276 ; 277 0274 7B SUBDH: MOV A,E ;SUBTRACT HL = DE-HL 278 0275 95 SUB L 279 0276 5F MOV E,A 280 0277 7A MOV A,D 281 0278 9C SBB H 282 0279 57 MOV D,A 283 027A D0 RNC 284 027B 05 DCR B 285 027C C9 RET 286 ; 287 027D 1A RECOK8: LDAX D ;A GETS MEMORY POINTED BY DE 288 027E BE CMP M ;COMPARE TO MEMORY POINTED BY HL 289 027F C0 RNZ ;QUIT IF DIFFERENT 290 0280 23 INX H ;NEXT HL 291 0281 13 INX D ;NEXT DE 292 0282 0D DCR C ;TIL COUNT IN C 293 0283 C8 RZ ; DROPS TO ZERO 294 0284 C37D02 JMP RECOK8 ;ELSE TRY AGAIN 295 ; 296 ; MOVE DATA OF LENGTH C FROM DE TO HL 297 ; 298 0287 0C MOVE: INR C ;IN CASE IT IS ZERO 299 0288 0D MOVE0: DCR C ;FOR COUNT IN C 300 0289 C8 RZ ;DONE? 301 028A 1A LDAX D ;MEMORY POINTED BY DE TO A 302 028B 77 MOV M,A ;MOVE TO MEMORAY POINTED BY HL 303 028C 13 INX D ;NEXT DE 304 028D 23 INX H ;NEXT HL 305 028E C38802 JMP MOVE0 ;KEEP LOOPING TIL C=0 306 ; 307 ; SELECT DISK DRIVE AT CURDSK, FILL THE BASE ADDRESS 308 ; CURTKA-ALLOCA, THEN FILL VALUES IN DISK PARAMETER BLOCK 309 ; 310 SELECTDISK: 311 0291 4A MOV C,D ;CURRENT DISK TO C 312 ;LSB OF C=0 IF NOT YET LOGGED IN 313 0292 CD1B0B CALL @SLDSK ;SELECT DISK, SETS HL 314 0295 7C MOV A,H 315 0296 B5 ORA L 316 0297 C8 RZ ;HL=0 FOR ERROR ELSE DISK HEADER 317 0298 5E MOV E,M 318 0299 23 INX H 319 029A 56 MOV D,M 320 029B 23 INX H ;DE=.TRAN 321 029C 23 INX H 322 029D 23 INX H ;.CDRMAX 323 029E 226B09 SHLD CURTRKA 324 02A1 23 INX H 325 02A2 23 INX H ;HL=.CURREC 326 02A3 226D09 SHLD CURRECA 327 02A6 23 INX H 328 02A7 23 INX H 329 02A8 23 INX H 330 02A9 23 INX H 331 02AA 23 INX H 332 02AB 23 INX H 333 02AC EB XCHG 334 02AD 228B09 SHLD TRANV ;.TRAN VECTOR 335 02B0 216F09 LXI H,BUFFB ;DE=SOURCE, HL=DEST FOR MOVE 336 02B3 0E0D MVI C,00DH ;ADDLIST 337 02B5 CD8702 CALL MOVE ;ADDLIST FILLED 338 02B8 2A6F09 LHLD BUFFB ;NOW FILL DPB 339 02BB EB XCHG ;DE IS SOURCE 340 02BC 217C09 LXI H,SECTPT ;HL IS DEST. 341 02BF 0E11 MVI C,011H ;DPBLIST 342 02C1 CD8702 CALL MOVE ;DATA FILLED 343 02C4 2A8109 LHLD MAXALL ;LARGEST ALLOC NUMBER 344 02C7 7C MOV A,H ;00 INDICATES <255 345 02C8 219009 LXI H,SINGLE 346 02CB 36FF MVI M,0FFH ;FF=TRUE, ASSUME A=00 347 02CD B7 ORA A 348 02CE CAD302 JZ RETSELECT 349 02D1 3600 MVI M,000H ;M=FALSE 350 RETSELECT: ;HIGH ORDER OF MAXALL NOT 0 351 ; USE DOUBLE DM 352 02D3 37 STC 353 02D4 C9 RET 354 ; 355 ; MOVE TO TRACK 0 356 ; 357 02D5 CD180B HOME: CALL @HOME ;HOME THE DISK 358 02D8 AF XRA A ;ZERO THE ACCCUM 359 02D9 2A6B09 LHLD CURTRKA 360 02DC 77 MOV M,A 361 02DD 23 INX H 362 02DE 77 MOV M,A ;CURTRAK=0000 363 02DF 2A6D09 LHLD CURRECA 364 02E2 77 MOV M,A 365 02E3 23 INX H 366 02E4 77 MOV M,A ;CURREC=0000 367 02E5 23 INX H 368 02E6 77 MOV M,A 369 02E7 C9 RET 370 ; 371 ; 372 RDBUFF1: 373 02E8 219609 LXI H,ARECORD 374 02EB 5E MOV E,M 375 02EC 23 INX H 376 02ED 56 MOV D,M 377 02EE 23 INX H 378 02EF 46 MOV B,M 379 02F0 C9 RET 380 ; 381 ; 382 ; 383 02F1 CDE802 RDBUFF: CALL RDBUFF1 384 02F4 CD270B CALL @READ ;READ A SECTOR 385 02F7 B7 ORA A ;SET FLAGS 386 02F8 C8 RZ ;OK 387 02F9 4F MOV C,A ;SAVE ERROR 388 02FA FE03 CPI 003H ;CHECK ERROR 389 02FC DA6602 JC PERMSG ;PERMANENT BDOS ERROR 390 02FF 0E01 MVI C,001H ;ELSE CHANGE ERROR FLAG 391 0301 C36602 JMP PERMSG ;PERMANENT BDOS ERROR 392 393 ; 394 ; SEEK RECORD CONTAINING THE CURRENT DIRECTORY ENTRY 395 ; 396 0304 2AAE09 SEEKDIR:LHLD DCNT ;DIRECTORY COUNTER TO COUNTER 397 0307 0E02 MVI C,002H ;DSKSHF 398 0309 CD6D04 CALL HLROTR ;VALUE TO HL 399 030C 0600 MVI B,000H 400 030E EB XCHG 401 030F 219609 LXI H,ARECORD 402 0312 73 MOV M,E ;STORE ARECORD 403 0313 23 INX H 404 0314 72 MOV M,D ;STORE DREC 405 0315 23 INX H 406 0316 70 MOV M,B 407 0317 C9 RET 408 ; 409 ; SEEK THE TRACK GIVEN BY ARECORD (ACTUAL RECORD) 410 ; 411 0318 2A6B09 SEEK: LHLD CURTRKA 412 031B 4E MOV C,M 413 031C 23 INX H 414 031D 46 MOV B,M 415 031E C5 PUSH B 416 031F 2A6D09 LHLD CURRECA 417 0322 5E MOV E,M 418 0323 23 INX H 419 0324 56 MOV D,M 420 0325 23 INX H 421 0326 46 MOV B,M 422 0327 2A9609 LHLD ARECORD 423 032A 3A9809 LDA SHIFTED 424 032D 4F MOV C,A 425 032E 7D SEEK0: MOV A,L ;LOOP WHILE ARECORD < CURREC 426 032F 93 SUB E 427 0330 7C MOV A,H 428 0331 9A SBB D 429 0332 79 MOV A,C 430 0333 98 SBB B 431 0334 E5 PUSH H 432 0335 D24503 JNC SEEK1 ;SKIP IF ARECORD >= CURREC 433 0338 2A7C09 LHLD SECTPT ;CURREC = SECTPT 434 033B CD7402 CALL SUBDH ;SUBTRACT HL FROM DE 435 033E E1 POP H 436 033F E3 XTHL 437 0340 2B DCX H ;CURTRK = CURTRK-1 438 0341 E3 XTHL 439 0342 C32E03 JMP SEEK0 ;FOR ANOTHER TRY 440 ; 441 0345 2A7C09 SEEK1: LHLD SECTPT ;LOOK WHILE ARECORD >= (T:CURREC+SECTP) 442 0348 7B MOV A,E ;ADD HL AND DE 443 0349 85 ADD L 444 034A 5F MOV E,A 445 034B 7A MOV A,D 446 034C 8C ADC H 447 034D 57 MOV D,A 448 034E D0 RNC 449 034F 04 INR B 450 0350 E1 POP H 451 0351 7D MOV A,L 452 0352 93 SUB E 453 0353 7C MOV A,H 454 0354 9A SBB D 455 0355 79 MOV A,C 456 0356 98 SBB B 457 0357 DA6103 JC SEEK2 ;SKIP IF T>ARECORD, CURREC=T, 458 035A E3 XTHL ; CURTRK=CURTRK+1 459 035B 23 INX H 460 035C E3 XTHL 461 035D E5 PUSH H 462 035E C34503 JMP SEEK1 ;FOR ANOTHER TRY 463 ; 464 0361 E3 SEEK2: XTHL 465 0362 E5 PUSH H 466 0363 2A7C09 LHLD SECTPT 467 0366 CD7402 CALL SUBDH ;SUBTRACT HL FROM DE 468 0369 E1 POP H ;ARRIVE HERE WITH UPDATED VALUES 469 ; IN EACH REGISTER 470 036A D5 PUSH D 471 036B C5 PUSH B 472 036C E5 PUSH H ;TO STACK FOR LATER 473 ;STACK=BC=ARECORD, DE=CURREC, HL=CURTRK 474 036D EB XCHG 475 036E 2A8509 LHLD OFFSET 476 0371 19 DAD D ;HL=CURTRK+OFFSET 477 0372 44 MOV B,H 478 0373 4D MOV C,L 479 0374 22A109 SHLD TRACK 480 0377 CD1E0B CALL @STTRK ;TRACK SET UP. NOTE THAT BC-CURTRK 481 ; IS DIFFERENCE TO MOVE IN BIOS 482 037A D1 POP D ;RECALL CURTRK 483 037B 2A6B09 LHLD CURTRKA 484 037E 73 MOV M,E 485 037F 23 INX H 486 0380 72 MOV M,D ;CURTRK UPDATED 487 ; NOW COMPUTE SECTOR AS ARECORD-CURREC 488 0381 C1 POP B 489 0382 D1 POP D ;RECALL CURREC 490 0383 2A6D09 LHLD CURRECA 491 0386 73 MOV M,E 492 0387 23 INX H 493 0388 72 MOV M,D 494 0389 23 INX H 495 038A 70 MOV M,B 496 038B C1 POP B ;BC=ARECORD, DE=CURREC 497 038C 79 MOV A,C 498 038D 93 SUB E 499 038E 6F MOV L,A 500 038F 78 MOV A,B 501 0390 9A SBB D 502 0391 67 MOV H,A 503 0392 CDAE03 CALL SEEK3 504 0395 44 MOV B,H 505 0396 4D MOV C,L 506 0397 2A8B09 LHLD TRANV 507 039A EB XCHG ;BC=SECTOR#, DE=.TRAN 508 039B CD300B CALL @SCTRN ;HL=TRAN (SECTOR) 509 039E 4D MOV C,L 510 039F 44 MOV B,H 511 03A0 22A309 SHLD SAVSEC 512 03A3 CD210B CALL @STSEC ;SECTOR SELECTED 513 03A6 2A6509 LHLD DMAADDR 514 03A9 4D MOV C,L 515 03AA 44 MOV B,H 516 03AB C3240B JMP @STDMA ;SET DMA 517 ; 518 03AE 3A8709 SEEK3: LDA ZERO1 519 03B1 4F MOV C,A 520 03B2 C36D04 JMP HLROTR 521 ; 522 ; COMPUTE DISK MAP POSITION FOR VRECORD TO HL 523 ; 524 DM$POSITION: 525 03B5 217E09 LXI H,BLKSHF 526 03B8 4E MOV C,M ;SHIFT COUNT TO C 527 03B9 3A9409 LDA VRECORD ;CURRENT VIRTUAL RECORD TO A 528 03BC B7 DMPOS0: ORA A 529 03BD 1F RAR 530 03BE 0D DCR C 531 03BF C2BC03 JNZ DMPOS0 ;A=SBR(VRECORD,BLKSHF)= 532 ; VRECORD/2**(SEC/BLOCK) 533 03C2 47 MOV B,A ;SAVE IT FOR LATER ADDITION 534 03C3 3E08 MVI A,008H 535 03C5 96 SUB M ;8-BLKSHF TO ACCUMULATOR 536 03C6 4F MOV C,A ;EXTENT SHIFT COUNT IN REGISTER C 537 03C7 3A9309 LDA EXTVAL ;EXTENT VALUE ANI EXTMASK 538 ; 539 ; BLKSHF=3,4,5,6,7, C=5,4,3,2,1 540 ; SHIFT IS 4,3,2,1,0 541 ; 542 03CA 0D DMPOS1: DCR C 543 03CB CAD303 JZ DMPOS2 544 03CE B7 ORA A 545 03CF 17 RAL 546 03D0 C3CA03 JMP DMPOS1 547 ; 548 ; ARRIVE HERE WITH A=SHL(EXT AND EXTMSK), 7-BLKSHF) 549 ; 550 03D3 80 DMPOS2: ADD B ;ADD THE PREVIOUS SHR(VRECORD,BLKSHF) 551 ;VALUE. A IS ONE OF THE VALUES, 552 ;DEPENDING ON ALLOC BKS BLKSHF 553 ;1K 3 V/8+EXTVAL*16 554 ;2K 4 V/16+EXTVAL*8 555 ;4K 5 V/32+EXTVAL*4 556 ;8K 6 V/64+EXTVAL*2 557 ;16K 7 V/128+EXTVAL*1 558 03D4 C9 RET ;WITH DM$POSITION IN A 559 ; 560 ; GET DISK MAP VALUE FROM POSITION GIVEN BY BC 561 ; 562 GETDM: ;POINT TO 16TH CHAR IN INFO 563 03D5 2AAA09 LHLD INFO ;BASE ADDRESS OF FCB 564 03D8 111000 LXI D,00010H ;DSKMAP 565 03DB 19 DAD D ;HL=.DSKMAP 566 03DC 09 DAD B ;INDEX BY SINGLE BYTE VALUE 567 03DD 3A9009 LDA SINGLE ;SINGLE BYTE/MAP ENTRY? 568 03E0 B7 ORA A 569 03E1 CAE703 JZ GETDMD ;GET DISK MAP SINGLE BYTE 570 03E4 6E MOV L,M 571 03E5 60 MOV H,B 572 03E6 C9 RET ;WITH HL=00BB 573 ; 574 03E7 09 GETDMD: DAD B ;HL=.FCB(DM+I*2) 575 ; DOUBLE PRECISION VALUE RETURNED 576 03E8 7E MOV A,M 577 03E9 23 INX H 578 03EA 66 MOV H,M 579 03EB 6F MOV L,A 580 03EC C9 RET 581 ; 582 ; COMPUTE DISK BLOCK NUMBER FROM CURRENT FCB 583 ; 584 03ED CDB503 INDEX: CALL DM$POSITION ;0....15 IN REGISTER A 585 03F0 328E09 STA DMPOS 586 03F3 4F MOV C,A 587 03F4 0600 MVI B,000H 588 03F6 CDD503 CALL GETDM ;VALUE TO HL 589 03F9 229609 SHLD ARECORD 590 03FC 7D MOV A,L 591 03FD B4 ORA H 592 03FE C9 RET 593 ; 594 ; COMPUTE ACTUAL RECORD ADDRESS, ASSUMING INDEX CALLED 595 ; 596 03FF 3A7E09 ATRAN: LDA BLKSHF ;SHIFT COUNT TO REG A 597 0402 4F MOV C,A 598 0403 2A9609 LHLD ARECORD 599 0406 AF XRA A 600 0407 CD2504 CALL ATRAN0 601 040A 229609 SHLD ARECORD 602 040D 329809 STA SHIFTED 603 0410 229909 SHLD SHAREC 604 0413 3A7F09 LDA BLKMSK 605 0416 4F MOV C,A ;MASK VALUE TO C 606 0417 3A9409 LDA VRECORD 607 041A A1 ANA C ;MASKED VALUE IN A 608 041B 47 MOV B,A 609 041C 328909 STA MSKVREC 610 041F 219609 LXI H,ARECORD ;ARECORD=HL OR (VRECORD AND BLKMSK) 611 0422 B6 ORA M 612 0423 77 MOV M,A 613 0424 C9 RET 614 ; 615 0425 0C ATRAN0: INR C 616 0426 0D ATRAN1: DCR C 617 0427 C8 RZ 618 0428 29 DAD H 619 0429 8F ADC A 620 042A C32604 JMP ATRAN1 621 ; 622 ; GET CURRENT EXTENT FIELD ADDRESS TO A 623 ; 624 042D 2AAA09 GETEXTA:LHLD INFO 625 0430 110C00 LXI D,0000CH ;EXTNUM 626 0433 19 DAD D ;HL=.FCB(EXTNUM) 627 0434 C9 RET 628 629 0435 2AAA09 GETFCBB: LHLD INFO 630 0438 110F00 LXI D,0000FH 631 043B 19 DAD D 632 043C C9 RET 633 ; 634 ; COMPUTE RECCNT AND NXTREC ADDRESSES FOR GET/SETFCB 635 ; 636 043D CD3504 GETFCBA:CALL GETFCBB 637 0440 EB XCHG ;DE=.FCB(NXTREC) 638 0441 211100 LXI H,00011H ;NXTREC-RECC 639 0444 19 DAD D ;HL=.FCB(NXTREC) 640 0445 C9 RET 641 ; 642 ; SET VARIABLES FROM CURRENTLY ADDRESSED FCB 643 ; 644 0446 CD3D04 GETFCB: CALL GETFCBA ;ADDRESSES IN DE, HL 645 0449 7E MOV A,M 646 044A 329409 STA VRECORD ;VRECORD=FCB(NXTREC) 647 044D EB XCHG 648 044E 7E MOV A,M 649 044F 329209 STA RCOUNT ;RCOUNT=FCB(RECCNT) 650 0452 CD2D04 CALL GETEXTA ;HL=.FCB(EXTNUM) 651 0455 3A8009 LDA EXTMSK ;EXTENT MASK TO A 652 0458 A6 ANA M ;FCB(EXTNUM) AND EXTMASK 653 0459 329309 STA EXTVAL 654 045C C9 RET 655 ; 656 ; PLACE VALUES BACK IN CURRENT FCB 657 ; 658 045D CD3D04 SETFCB: CALL GETFCBA ;ADDRESSES TO DE, HL 659 0460 0E01 MVI C,001H 660 0462 3A9409 LDA VRECORD 661 0465 81 ADD C 662 0466 77 MOV M,A ;FCB(NXTREC)=VRECORD+SEQIO 663 0467 EB XCHG 664 0468 3A9209 LDA RCOUNT 665 046B 77 MOV M,A ;FCB(RECCNT)=RCOUNT 666 046C C9 RET 667 ; 668 ; HL ROTATE RIGHT BY AMOUNT C 669 ; 670 046D 0C HLROTR: INR C ;IN CASE 0 671 046E 0D HLROTR0:DCR C 672 046F C8 RZ ;RETURN WHEN C=0 673 0470 7C MOV A,H 674 0471 B7 ORA A 675 0472 1F RAR 676 0473 67 MOV H,A ;HIGH BYTE 677 0474 7D MOV A,L 678 0475 1F RAR 679 0476 6F MOV L,A ;LOW BYTE 680 0477 C36E04 JMP HLROTR0 681 ; 682 ; ROTATE THE MASK IN HL BY THE AMOUNT IN C 683 ; 684 047A 0C HLROTL: INR C ;MAY BE ZERO 685 047B 0D HLROTL0:DCR C 686 047C C8 RZ ;RETURN WHEN C=0 687 047D 29 DAD H 688 047E C37B04 JMP HLROTL0 689 ; 690 ; SET A "1" VALUE IN CURDSK POSITION OF BC 691 ; 692 SET$DISK: 693 0481 3AA909 LDA CURDSK 694 0484 C5 PUSH B ;SAVE INPUT PARAMETER 695 0485 4F MOV C,A ;READY PARAMETER FOR SHIFT 696 0486 210100 LXI H,00001H 697 0489 CD7A04 CALL HLROTL ;HL=MASK TO INTEGRATE 698 048C C1 POP B ;ORIGINAL MASK 699 048D 79 MOV A,C 700 048E B5 ORA L 701 048F 6F MOV L,A 702 0490 78 MOV A,B 703 0491 B4 ORA H 704 0492 67 MOV H,A ;HL=MASK OR ROL(1,CURDSK) 705 0493 C9 RET 706 ; 707 ; RETURN TRUE IF DIR CHECKSUM 708 ; 709 0494 3AA909 NOWRITE:LDA CURDSK 710 0497 4F MOV C,A 711 0498 CD6D04 CALL HLROTR 712 049B 7D MOV A,L 713 049C E601 ANI 001H 714 049E C9 RET ;NOW 0 IF NOWRITE 715 ; 716 ; COMPUTE THE ADDRESS OF A DIRECTORY ELEMENT AT 717 ; POSITION DPTR IN THE BUFFER 718 ; 719 GETDPTRA: 720 049F 2A6709 LHLD BUFFA 721 04A2 3A9C09 LDA DPTR 722 04A5 85 ADD L ;HL=HL+A 723 04A6 6F MOV L,A 724 04A7 D0 RNC ;OVERFLOW TO H 725 04A8 24 INR H 726 04A9 C9 RET 727 ; 728 04AA D5 RDDIR2: PUSH D 729 04AB 110A00 LXI D,0000AH 730 04AE 19 DAD D 731 04AF 5E MOV E,M 732 04B0 23 INX H 733 04B1 56 MOV D,M 734 04B2 EB XCHG 735 04B3 D1 POP D 736 04B4 C9 RET 737 ; 738 04B5 CD0403 READDIR3: CALL SEEKDIR 739 04B8 3A8809 LDA ZERO2 740 04BB B7 ORA A 741 04BC CAC704 JZ RD$DIR 742 04BF 3E03 MVI A,003H 743 04C1 CDCB07 CALL READDIR4 744 04C4 C3D304 JMP SETDATA 745 ; 746 ; READ A DIRECTORY ENTRY INTO THE DIRECTORY BUFFER 747 ; 748 04C7 CDD904 RD$DIR: CALL RDDIR1 749 04CA 226709 SHLD BUFFA 750 04CD CD1803 CALL SEEK 751 04D0 CDF102 CALL RDBUFF ;DIRECTORY ENTRY LOADED 752 ; 753 ; SET DATA DMA ADDRESS 754 ; 755 04D3 2AA709 SETDATA:LHLD DMAAD 756 04D6 C3DF04 JMP SETDMA 757 ; 758 04D9 2A7509 RDDIR1: LHLD ALLOCA 759 04DC CDAA04 CALL RDDIR2 760 ; 761 ; HL=ADDRESS TO SET (I.E., BUFFA OR DMAAD) 762 ; 763 04DF 226509 SETDMA: SHLD DMAADDR 764 04E2 C9 RET 765 ; 766 ; RETURN ZERO FLAG IF AT END OF DIRECTORY, NON ZERO 767 ; IF NOT AT END (END OF DIR IF DCNT=0FFFFH) 768 ; 769 04E3 21AE09 END$OF$DIR: LXI H,DCNT 770 04E6 7E MOV A,M ;MAY BE 0FFH 771 04E7 23 INX H 772 04E8 BE CMP M ;LOW(DCNT)=HIGH(DCNT)? 773 04E9 C0 RNZ ;NOW ZERO RETURNED IF DIFFERENT 774 ;HIGH AND LOW THE SAME,=0FFH? 775 04EA 3C INR A ;0FFH BECOMES 00 IF SO 776 04EB C9 RET 777 ; 778 ; SET DCNT TO THE END OF THE DIRECTORY 779 ; 780 SET$END$DIR: 781 04EC 21FFFF LXI H,0FFFFH ;(ENDDIR) 782 04EF 22AE09 SHLD DCNT 783 04F2 C9 RET 784 ; 785 READ$DIR: 786 04F3 2A8309 LHLD DIRMAX 787 04F6 EB XCHG 788 04F7 2AAE09 LHLD DCNT 789 04FA 23 INX H 790 04FB 22AE09 SHLD DCNT 791 04FE 7B MOV A,E 792 04FF 95 SUB L 793 0500 6F MOV L,A 794 0501 7A MOV A,D 795 0502 9C SBB H 796 0503 67 MOV H,A 797 0504 DAEC04 JC SET$END$DIR 798 0507 3AAE09 LDA DCNT 799 050A E603 ANI 003H 800 050C 0605 MVI B,005H 801 READDIR2: 802 050E 87 ADD A 803 050F 05 DCR B 804 0510 C20E05 JNZ READDIR2 805 0513 329C09 STA DPTR 806 0516 B7 ORA A 807 0517 C0 RNZ 808 0518 C5 PUSH B 809 0519 CDB504 CALL READDIR3 810 051C C1 POP B 811 051D C9 RET 812 ; 813 ; COMPARE EXTENT# IN A TO THAT IN C, RETURN NONZERO 814 ; IF NO MATCH 815 ; 816 COMPEXT: 817 051E C5 PUSH B ;SAVE C'S ORIGINAL VALUE 818 051F F5 PUSH PSW 819 0520 3A8009 LDA EXTMSK 820 0523 2F CMA 821 0524 47 MOV B,A ;B HAS NEGATED FORM OF EXTENT MASK 822 0525 79 MOV A,C 823 0526 A0 ANA B 824 0527 4F MOV C,A ;LOW BITS REMOVED FROM C 825 0528 F1 POP PSW 826 0529 A0 ANA B ;LOW BITS REMOVED FROM A 827 052A 91 SUB C 828 052B E61F ANI 01FH ;(MAXEXT) SET FLAGS 829 052D C1 POP B ;RESTORE ORIGINAL VALUES 830 052E C9 RET 831 ; 832 052F CD3D04 OPENER: CALL GETFCBA 833 0532 0E10 MVI C,010H 834 0534 41 MOV B,C 835 0535 0C INR C 836 0536 C5 PUSH B 837 OPENER1: 838 0537 C1 POP B 839 0538 0D DCR C 840 0539 AF XRA A 841 OPENER2: 842 053A 2B DCX H 843 053B 05 DCR B 844 053C BE CMP M 845 053D C24405 JNZ OPENER3 846 0540 0D DCR C 847 0541 C23A05 JNZ OPENER2 848 OPENER3: 849 0544 79 MOV A,C 850 0545 328E09 STA DMPOS 851 0548 3A9009 LDA SINGLE 852 054B B7 ORA A 853 054C 78 MOV A,B 854 054D C25105 JNZ OPENER4 855 0550 1F RAR 856 OPENER4: 857 0551 C5 PUSH B 858 0552 E5 PUSH H 859 0553 6F MOV L,A 860 0554 2600 MVI H,000H 861 0556 3A7E09 LDA BLKSHF 862 0559 57 MOV D,A 863 055A 3E07 MVI A,007H 864 055C 92 SUB D 865 055D 4F MOV C,A 866 055E CD6D04 CALL HLROTR 867 0561 45 MOV B,L 868 0562 3A8009 LDA EXTMSK 869 0565 B8 CMP B 870 0566 E1 POP H 871 0567 DA3705 JC OPENER1 872 056A CD2D04 CALL GETEXTA 873 056D 4E MOV C,M 874 056E 2F CMA 875 056F E61F ANI 01FH 876 0571 A1 ANA C 877 0572 B0 ORA B 878 0573 C1 POP B 879 0574 C9 RET 880 ; 881 ; SEARCH FOR DIRECTORY ELEMENT OF LENGTH C AT INFO 882 ; 883 0575 2AAA09 SEARCH: LHLD INFO 884 0578 22B009 SHLD SEARCHA ;SEARCHA=INFO 885 057B 79 MOV A,C 886 057C 32B209 STA SEARCHL 887 057F CDEC04 CALL SET$END$DIR ;DCNT=ENDIR 888 0582 CDD502 CALL HOME ;TO START AT THE BEGINNING 889 ;(DROP THROUGH TO SEARCHN) 890 ; 891 SEARCHN: ;SEARCH FOR THE NEXT DIRECTORY 892 ;ELEMENT, ASSUMING A PREVIOUS 893 ;CALL ON SEARCH WHICH SETS 894 ;SEARCHA AND SEARCHL 895 0585 0E00 MVI C,000H ;(FALSE) 896 0587 CDF304 CALL READ$DIR ;READ NEXT DIRECTORY ELEMENT 897 058A CDE304 CALL END$OF$DIR 898 058D CAD605 JZ SEARCH$FIN ;SKIP TO END IF SO 899 ;NOT END OF DIRECTORY, SCAN FOR MATCH 900 0590 2AB009 LHLD SEARCHA 901 0593 EB XCHG 902 0594 CD9F04 CALL GETDPTRA ;HL=BUFFA+DPTR 903 0597 3AB209 LDA SEARCHL 904 059A 4F MOV C,A ;LENGTH OF SEARCH TO C 905 059B 0600 MVI B,000H ;B COUNTS UP, C COUNTS DOWN 906 059D 7E MOV A,M 907 059E FEE5 CPI 0E5H ;(EMPTY) 908 05A0 CA8505 JZ SEARCHN 909 SEARCHLOOP: 910 05A3 79 MOV A,C 911 05A4 B7 ORA A 912 05A5 CACF05 JZ ENDSEARCH 913 05A8 78 MOV A,B 914 05A9 FE0D CPI 00DH ;(UBYTES) 915 05AB CAC805 JZ SEARCHOK ; 916 ;NOT THE UBYTES FIELD, EXTENT FIELD? 917 05AE FE0C CPI 00CH ;(EXTNUM) MAY BE EXTENT FIELD 918 05B0 CABD05 JZ SEARCHEXT ;SKIP TO SEARCH EXTENT 919 05B3 1A LDAX D ;FCB CHARACTER 920 05B4 96 SUB M 921 05B5 E67F ANI 07FH ;MASK-OUT FLAGS/EXTENT MODULE 922 05B7 C28505 JNZ SEARCHN ;SKIP IF NOT MATCHED 923 05BA C3C805 JMP SEARCHOK ;MATCHED CHARACTER 924 925 SEARCHEXT: ;A HAS FCB CHARACTER 926 ;ATTEMPT AN EXTENT # MATCH 927 05BD 1A LDAX D 928 05BE C5 PUSH B ;SAVE COUNTERS 929 05BF 4E MOV C,M ;DIRECTORY CHARACTER TO C 930 05C0 CD1E05 CALL COMPEXT ;COMPARE USER/DIR CHAR 931 05C3 C1 POP B ;RECALL COUNTERS 932 05C4 B7 ORA A 933 05C5 C28505 JNZ SEARCHN ;SKIP IF NO MATCH 934 ; 935 SEARCHOK: ;CURRENT CHARACTER MATCHES 936 05C8 13 INX D 937 05C9 23 INX H 938 05CA 04 INR B 939 05CB 0D DCR C 940 05CC C3A305 JMP SEARCHLOOP 941 ; 942 ENDSEARCH: 943 05CF AF XRA A 944 05D0 327D08 STA ARET 945 05D3 47 MOV B,A 946 05D4 04 INR B 947 05D5 C9 RET 948 ; 949 ; END OF DIRECTORY OR EMPTY NAME 950 ; 951 SEARCH$FIN: 952 05D6 3EFF MVI A,0FFH 953 05D8 47 MOV B,A 954 05D9 04 INR B 955 05DA C35602 JMP STA$RET 956 ; 957 ; SEARCH FOR THE DIRECTORY ENTRY, COPY TO FCB 958 ; 959 05DD 0E0F OPEN: MVI C,00FH ;NAMLEN 960 05DF CD7505 CALL SEARCH 961 05E2 C8 RZ ;RETURN WITH ARET=255 IF END 962 ;NOT END OF DIRECTORY. COPY FCB 963 ;INFORMATION (REFERENCED BELOW 964 ;TO COPY FCB INFO) 965 OPEN$COPY: 966 05E3 CD2D04 CALL GETEXTA 967 05E6 7E MOV A,M 968 05E7 F5 PUSH PSW 969 05E8 CD9F04 CALL GETDPTRA 970 05EB EB XCHG ;DE=.BUFF(DPTR) 971 05EC 2AAA09 LHLD INFO ;HL=.FCB(0) 972 05EF 0E20 MVI C,020H ;(NXTREC) LENGTH OF MOVE OPERATION 973 05F1 CD8702 CALL MOVE ;FROM .BUFF(DPTR) TO .FCB(0) 974 ;NOTE THAT ENTIRE FCB IS COPIED, 975 ; INCLUDING INDICATORS 976 05F4 CD2F05 CALL OPENER 977 05F7 4F MOV C,A 978 05F8 F1 POP PSW 979 05F9 77 MOV M,A 980 OPEN$COPY1: 981 05FA 0600 MVI B,000H 982 05FC EB XCHG 983 05FD 210300 LXI H,00003H 984 0600 19 DAD D 985 0601 1A LDAX D 986 0602 91 SUB C 987 0603 CA1306 JZ OPEN$COPY2 988 0606 78 MOV A,B 989 0607 D20D06 JNC OPEN$RCNT ;USER IS LARGER 990 060A 3E80 MVI A,080H ;DIRECTORY IS LARGER 991 060C 46 MOV B,M 992 OPEN$RCNT: ;A HAS RECORD COUNT TO FILL 993 060D 77 MOV M,A 994 060E 78 MOV A,B 995 060F 328F09 STA RECCNT 996 0612 C9 RET 997 998 OPEN$COPY2: 999 0613 328F09 STA RECCNT 1000 0616 7E MOV A,M 1001 0617 B7 ORA A 1002 0618 C0 RNZ 1003 0619 3A8E09 LDA DMPOS 1004 061C B7 ORA A 1005 061D C8 RZ 1006 061E 3AAD09 LDA SAVEC 1007 0621 FE0F CPI 00FH 1008 0623 C8 RZ 1009 0624 3680 MVI M,080H 1010 0626 C9 RET 1011 ; 1012 OPEN$REEL3: 1013 0627 E5 PUSH H 1014 0628 3A8F09 LDA RECCNT 1015 062B B7 ORA A 1016 062C CA3806 JZ OPEN$REEL4 1017 062F 110300 LXI D,00003H 1018 0632 19 DAD D 1019 0633 77 MOV M,A 1020 0634 AF XRA A 1021 0635 328F09 STA RECCNT 1022 OPEN$REEL4: 1023 0638 E1 POP H 1024 0639 C9 RET 1025 ; 1026 ; CLOSE THE CURRENT EXTENT, AND OPEN THE NEXT ONE 1027 ; IF POSSIBLE. RMF IS TRUE IF IN READ MODE 1028 ; 1029 OPEN$REEL: 1030 063A CD2D04 CALL GETEXTA 1031 063D 7E MOV A,M 1032 063E 4F MOV C,A 1033 063F 0C INR C 1034 0640 CD1E05 CALL COMPEXT 1035 0643 CA5C06 JZ OPEN$REEL1 1036 0646 3E1F MVI A,01FH 1037 0648 A1 ANA C 1038 0649 77 MOV M,A 1039 064A 0E0F MVI C,00FH 1040 064C CD7505 CALL SEARCH 1041 064F CDE305 CALL OPEN$COPY 1042 OPEN$REEL0: 1043 0652 CD4604 CALL GETFCB 1044 0655 AF XRA A 1045 0656 329409 STA VRECORD 1046 0659 C35602 JMP STA$RET 1047 1048 OPEN$REEL1: 1049 065C 34 INR M 1050 065D CD2F05 CALL OPENER 1051 0660 4F MOV C,A 1052 0661 BE CMP M 1053 0662 D26906 JNC OPEN$REEL2 1054 0665 35 DCR M 1055 0666 C35402 JMP DISKEOF 1056 ; 1057 OPEN$REEL2: 1058 0669 CD2706 CALL OPEN$REEL3 1059 066C CDFA05 CALL OPEN$COPY1 1060 066F C35206 JMP OPEN$REEL0 1061 ; 1062 ; SEQUENTIAL DISK READ OPERATION 1063 ; 1064 SEQDISKREAD: 1065 0672 CD4604 CALL GETFCB ;SETS PARAMETERS FOR THE READ 1066 0675 3A9409 LDA VRECORD 1067 0678 219209 LXI H,RCOUNT 1068 067B BE CMP M ;VRECORD-RCOUNT,SKIP IF RCOUNT>VRECORD 1069 067C DA8E06 JC RECORDOK ;NOT ENOUGH RECORDS IN THE EXTENT, 1070 ; RECORD COUNT MUST BE 128 TO CONTINUE 1071 067F FE80 CPI 080H ;VRECORD=128 1072 0681 C25402 JNZ DISKEOF ;SKIP IF VRECORD<>128 1073 0684 CD3A06 CALL OPEN$REEL ;GO TO NEXT EXTENT IF SO 1074 0687 3A7D08 LDA ARET 1075 068A B7 ORA A 1076 068B C25402 JNZ DISKEOF ;STOP AT EOF 1077 ; 1078 ; ARRIVE WITH FCB ADDRESSING A RECORD TO READ 1079 ; 1080 RECORDOK: 1081 068E CDED03 CALL INDEX ;ERROR 2 IF READING UNWRITTEN DATA 1082 ; (RETURNS 1 TO BE COMPATABLE WITH 1.4) 1083 0691 CA5402 JZ DISKEOF ;RECORD HAS BEEN ALLOCATED, READ IT 1084 0694 CDFF03 CALL ATRAN ;ARECORD NOW A DISK ADDRESS 1085 0697 3A8809 LDA ZERO2 1086 069A B7 ORA A 1087 069B C2C307 JNZ RECORDOK1 1088 069E CDD304 CALL SETDATA 1089 06A1 CD1803 CALL SEEK ;TO PROPER TRACK, SECTOR 1090 06A4 CDF102 CALL RDBUFF ;TO DMA ADDRESS 1091 06A7 C35D04 JMP SETFCB ;REPLACE PARAMETER 1092 1093 06AA 3AA909 SELECT: LDA CURDSK 1094 06AD 3C INR A 1095 06AE CA5A02 JZ SEL$ERROR 1096 06B1 3D DCR A 1097 06B2 219509 LXI H,SELSTR 1098 06B5 BE CMP M 1099 06B6 C8 RZ ;SKIP IN LINFO=CURDSK 1100 06B7 77 MOV M,A 1101 06B8 57 MOV D,A 1102 06B9 2A6309 LHLD DLOG 1103 06BC CD9404 CALL NOWRITE 1104 06BF 5F MOV E,A 1105 06C0 D5 PUSH D 1106 06C1 CD9102 CALL SELECTDISK 1107 06C4 E1 POP H ;RECALL DLOG VECTOR 1108 06C5 D25A02 JNC SEL$ERROR 1109 06C8 2D DCR L 1110 06C9 C8 RZ 1111 06CA 2A6309 LHLD DLOG 1112 06CD 4D MOV C,L 1113 06CE 44 MOV B,H ;CALL READY 1114 06CF CD8104 CALL SET$DISK 1115 06D2 226309 SHLD DLOG 1116 06D5 C9 RET 1117 ; 1118 CURSELECT: 1119 06D6 3A8D09 LDA LINFO 1120 06D9 32A909 STA CURDSK 1121 06DC C9 RET 1122 ; 1123 CLRMODNUM: 1124 06DD AF XRA A 1125 06DE 329B09 STA MODNUM 1126 06E1 C31107 JMP RSEL1 1127 ; 1128 ; CHECK CURRENT FCB TO SEE IF RESELECTION NECESSARY 1129 ; 1130 RESELECT: 1131 06E4 3E80 MVI A,080H 1132 06E6 47 MOV B,A 1133 06E7 3D DCR A 1134 06E8 4F MOV C,A 1135 06E9 2AAA09 LHLD INFO 1136 06EC 110700 LXI D,00007H 1137 06EF EB XCHG 1138 06F0 19 DAD D 1139 06F1 7E MOV A,M 1140 06F2 A0 ANA B 1141 06F3 7E MOV A,M 1142 06F4 A1 ANA C 1143 06F5 77 MOV M,A 1144 06F6 23 INX H 1145 06F7 7E MOV A,M 1146 06F8 A0 ANA B 1147 06F9 329B09 STA MODNUM 1148 06FC 7E MOV A,M 1149 06FD A1 ANA C 1150 06FE 77 MOV M,A 1151 06FF CD2D04 CALL GETEXTA 1152 0702 7E MOV A,M 1153 0703 E61F ANI 01FH 1154 0705 77 MOV M,A 1155 0706 CD3504 CALL GETFCBB 1156 0709 7E MOV A,M 1157 070A A0 ANA B 1158 070B CA1107 JZ RSEL1 1159 070E 7E MOV A,M 1160 070F A1 ANA C 1161 0710 70 MOV M,B 1162 0711 328F09 RSEL1: STA RECCNT 1163 0714 210000 LXI H,00000H 1164 0717 229D09 SHLD OLDDSK 1165 071A 3EFF MVI A,0FFH 1166 071C 32AC09 STA FCBDSK 1167 071F 2AAA09 LHLD INFO 1168 0722 7E MOV A,M 1169 0723 E61F ANI 01FH 1170 0725 3D DCR A 1171 0726 328D09 STA LINFO 1172 0729 FEFF CPI 0FFH 1173 072B CA3507 JZ RSEL2 1174 072E 7E MOV A,M 1175 072F 329D09 STA OLDDSK 1176 0732 CDD606 CALL CURSELECT 1177 0735 CDAA06 RSEL2: CALL SELECT 1178 0738 3E00 MVI A,000H 1179 073A 2AAA09 LHLD INFO 1180 073D 77 MOV M,A 1181 073E C9 RET 1182 ; 1183 ; RESET DISK SYSTEM TO DISK 0 SEVERAL PARAMETERS RETURNED 1184 ; 1185 073F 210000 FUNCT01:LXI H,00000H 1186 0742 226309 SHLD DLOG 1187 0745 AF XRA A 1188 0746 32A909 STA CURDSK ;NOTE THAT USER CODE IS UNCHANGED 1189 0749 3D DCR A 1190 074A 329509 STA SELSTR 1191 074D 218000 LXI H,TBUFF 1192 0750 22A709 SHLD DMAAD ;DMAAD=TBUFF 1193 0753 C3D304 JMP SETDATA ;TO DATA DMA ADDR 1194 ; 1195 ; SELECT DISK E=DISK NUMBER 1196 ; 1197 0756 CDD606 FUNCT02:CALL CURSELECT 1198 0759 C3AA06 JMP SELECT 1199 ; 1200 ; OPEN FILE DE=FCB ADDRESS A=DIRECTORY CODE 1201 ; 1202 075C CDDD06 FUNCT03:CALL CLRMODNUM 1203 075F CDDD05 CALL OPEN 1204 0762 CDE304 CALL END$OF$DIR 1205 0765 C8 RZ 1206 0766 CD3D04 CALL GETFCBA 1207 0769 7E MOV A,M 1208 076A 3C INR A 1209 076B C27207 JNZ OPENX1 1210 076E 1B DCX D 1211 076F 1B DCX D 1212 0770 1A LDAX D 1213 0771 77 MOV M,A 1214 0772 E1 OPENX1: POP H 1215 0773 0E40 MVI C,040H 1216 0775 C9 RET 1217 ; 1218 ; READ SEQUENTIAL DE=FCB A=ERROR CODE 1219 ; 1220 0776 CDE406 FUNCT04:CALL RESELECT 1221 0779 C37206 JMP SEQDISKREAD 1222 ; 1223 ; RETURN CURRENT DISK HL=CURRENT DISK NUMBER 1224 ; 1225 077C 3AA909 FUNCT05:LDA CURDSK 1226 077F C35602 JMP STA$RET 1227 ; 1228 ; SET DMA ADDRESS DE=DMA ADDRESS 1229 ; SET SUBSEQUENT DMA ADDRESS TO INFO 1230 ; 1231 0782 EB FUNCT06:XCHG ;WAS LHLD INFO 1232 0783 22A709 SHLD DMAAD ;DMAAD=INFO 1233 0786 C3D304 JMP SETDATA ;TO DATA DMA ADDRESS 1234 ; 1235 ; ARRIVE HERE AT END OF PROCESSING TO RETURN TO USER 1236 ; 1237 0789 3AAD09 GOBACK: LDA SAVEC 1238 078C FE0F CPI 00FH 1239 078E DAB907 JC RETMON ;RESELECTION MAY HAVE TAKEN PLACE 1240 0791 3A9109 LDA ZERO4 1241 0794 32A909 STA CURDSK 1242 0797 3AAC09 LDA FCBDSK 1243 079A B7 ORA A 1244 079B CAB907 JZ RETMON ;RESTORE DISK NUMBER 1245 079E 2AAA09 LHLD INFO 1246 07A1 3600 MVI M,000H ;FCB(0)=0 1247 07A3 3A9D09 LDA OLDDSK 1248 07A6 B7 ORA A 1249 07A7 CAAB07 JZ GOBACK1 1250 07AA 77 MOV M,A ;FCB(0)=FCBDSK 1251 07AB 23 GOBACK1:INX H 1252 07AC 3A9B09 LDA MODNUM 1253 07AF B6 ORA M 1254 07B0 77 MOV M,A 1255 07B1 CD3504 CALL GETFCBB 1256 07B4 3A8F09 LDA RECCNT 1257 07B7 B6 ORA M 1258 07B8 77 MOV M,A 1259 ; 1260 ; RETURN FROM THE DISK MONITOR 1261 ; 1262 07B9 2A6109 RETMON: LHLD ENTSP ;GET OLD STACK POINTER 1263 07BC F9 SPHL ;RESTORE THE STACK 1264 07BD 2A7D08 LHLD ARET 1265 07C0 7D MOV A,L 1266 07C1 44 MOV B,H ;BA=HL=ARET 1267 07C2 C9 RET 1268 ; 1269 RECORDOK1: 1270 07C3 3E01 MVI A,001H 1271 07C5 CDD107 CALL RECORDOK2 1272 07C8 C35D04 JMP SETFCB 1273 ; 1274 READDIR4: 1275 07CB 2A7509 LHLD ALLOCA 1276 07CE C3D407 JMP READDIR5 1277 1278 RECORDOK2: 1279 07D1 2A7709 LHLD ZERO5 1280 READDIR5: 1281 07D4 F5 PUSH PSW 1282 07D5 3A8809 LDA ZERO2 1283 07D8 47 MOV B,A 1284 07D9 2F CMA 1285 07DA 4F MOV C,A 1286 07DB 3A9609 LDA ARECORD 1287 07DE 5F MOV E,A 1288 07DF A0 ANA B 1289 07E0 329E09 STA SOMREC 1290 07E3 7B MOV A,E 1291 07E4 A1 ANA C 1292 07E5 329609 STA ARECORD 1293 07E8 229F09 SHLD RECADR 1294 07EB CDAA04 CALL RDDIR2 1295 07EE 226509 SHLD DMAADDR 1296 07F1 2A9F09 LHLD RECADR 1297 07F4 119509 LXI D,SELSTR 1298 07F7 0E04 MVI C,004H 1299 07F9 F1 POP PSW 1300 07FA F5 PUSH PSW 1301 07FB FE04 CPI 004H 1302 07FD D20708 JNC RECOK2 1303 0800 CD7D02 CALL RECOK8 1304 0803 CA2008 JZ RECOK3 1305 0806 AF XRA A 1306 RECOK2: 1307 0807 110400 LXI D,00004H 1308 080A 2A9F09 LHLD RECADR 1309 080D 19 DAD D 1310 080E 3E02 MVI A,002H 1311 0810 CD4808 CALL RECOK7 1312 0813 2A9F09 LHLD RECADR 1313 0816 119509 LXI D,SELSTR 1314 0819 0E04 MVI C,004H 1315 081B CD8702 CALL MOVE 1316 081E 3600 MVI M,000H 1317 0820 3A9E09 RECOK3: LDA SOMREC 1318 0823 3C INR A 1319 0824 118000 LXI D,TBUFF 1320 0827 2180FF LXI H,0FF80H 1321 082A 19 RECOK4: DAD D 1322 082B 3D DCR A 1323 082C C22A08 JNZ RECOK4 1324 082F EB XCHG 1325 0830 2A6509 LHLD DMAADDR 1326 0833 19 DAD D 1327 0834 F1 POP PSW 1328 0835 FE03 CPI 003H 1329 0837 C23E08 JNZ BNKMOV 1330 083A 226709 SHLD BUFFA 1331 083D C9 RET 1332 ; 1333 083E EB BNKMOV: XCHG 1334 083F 2AA709 LHLD DMAAD 1335 0842 018000 LXI B,TBUFF 1336 0845 C34B0B JMP @MOV ;MOVE BETWEEN BANKS 1337 ; 1338 0848 F5 RECOK7: PUSH PSW 1339 0849 CD1803 CALL SEEK 1340 084C F1 POP PSW 1341 084D 3D DCR A 1342 084E F4F102 CP RDBUFF 1343 0851 110400 LXI D,00004H 1344 0854 2A9F09 LHLD RECADR 1345 0857 19 DAD D 1346 0858 23 INX H 1347 0859 23 INX H 1348 085A 11A109 LXI D,TRACK 1349 085D 0E04 MVI C,004H 1350 085F C38702 JMP MOVE 1351 ; 1352 ; STORAGE LOCATIONS AND MESSAGES 1353 ; 1354 0862 00 COMPCOL:DB 000H 1355 1356 0863 0D0A MSBDOS: DB 00DH,00AH 1357 0865 42444F5320 DB 'BDOS ERR: $' 1358 1359 0870 53656C6563MSSLCT: DB 'Select$' 1360 1361 0877 5065726D2EMSPERM: DB 'Perm.$' 1362 1363 087D 0000 ARET: DW 0000H 1364 1365 ; 1366 087F 00 FCBT: DB 000H 1367 0880 43504D3320 DB 'CPM3 SYS' 1368 088B 0000000000 DB 0,0,0,0,0,0,0,0 1369 0893 0000000000 DB 0,0,0,0,0,0,0,0 1370 089B 0000000000 DB 0,0,0,0,0,0,0,0 1371 ; 1372 08A3 0D0A MSOPEN: DB 00DH,00AH 1373 08A5 43504D4C44 DB 'CPMLDR error: failed to open CPM3.SYS' 1374 08CB 0D0A DB 00DH,00AH 1375 08CD 24 DB '$' 1376 ; 1377 08CE 0D0A MSREAD: DB 00DH,00AH 1378 08D0 43504D4C44 DB 'CPMLDR error: failed to read CPM3.SYS' 1379 08F6 0D0A DB 00DH,00AH 1380 08F8 24 DB '$' 1381 ; 1382 08F9 0D MSBANR: DB 00DH 1383 08FA 0A0A0A0A0A DB 00AH,00AH,00AH,00AH,00AH,00AH 1384 0900 0A0A0A0A0A DB 00AH,00AH,00AH,00AH,00AH,00AH 1385 0906 0A0A0A0A0A DB 00AH,00AH,00AH,00AH,00AH,00AH 1386 090C 0A0A0A0A0A DB 00AH,00AH,00AH,00AH,00AH,00AH 1387 0912 43502F4D20 DB 'CP/M V3.0 Loader' 1388 0922 0D0A DB 00DH,00AH 1389 0924 436F707972 DB 'Copyright (C) 1982, Digital Research' 1390 0948 0D0A DB 00DH,00AH 1391 094A 24 DB '$' 1392 094B 3032313138 DB '021182' 1393 0951 00000000 DB 0,0,0,0 1394 STACK1: ;STACK WALKS OVER THE BANNER 1395 ; 1396 0955 00 HEDR1: DB 000H 1397 1398 0956 00 HEDR2: DB 000H 1399 1400 0957 00 HEDR3: DB 000H 1401 1402 0958 00 HEDR4: DB 000H 1403 1404 0959 0000000000HEDR5: DB 0,0,0,0,0,0,0,0 1405 1406 0961 0000 ENTSP: DB 0,0 1407 1408 0963 0000 DLOG: DW 0000H 1409 1410 0965 0000 DMAADDR:DW 0000H 1411 1412 0967 0000 BUFFA: DW 0000H 1413 1414 0969 0000 DW 0000H 1415 1416 096B 0000 CURTRKA:DW 0000H 1417 1418 096D 0000 CURRECA:DW 0000H 1419 1420 096F 0000 BUFFB: DW 0000H 1421 1422 0971 0000 DW 0000H 1423 1424 0973 0000 DW 0000H 1425 1426 0975 0000 ALLOCA: DW 0000H 1427 1428 0977 0000000000ZERO5: DB 0,0,0,0,0 1429 1430 097C 0000 SECTPT: DW 0000H 1431 1432 097E 00 BLKSHF: DB 000H 1433 1434 097F 00 BLKMSK: DB 000H 1435 1436 0980 00 EXTMSK: DB 000H 1437 1438 0981 0000 MAXALL: DW 0000H 1439 1440 0983 0000 DIRMAX: DW 0000H 1441 1442 0985 0000 OFFSET: DW 0000H 1443 1444 0987 00 ZERO1: DB 000H 1445 1446 0988 00 ZERO2: DB 000H 1447 1448 0989 00 MSKVREC:DB 000H 1449 1450 098A 00 ZERO3: DB 000H 1451 1452 098B 0000 TRANV: DW 0000H 1453 1454 098D 00 LINFO: DB 000H 1455 1456 098E 00 DMPOS: DB 000H 1457 1458 098F 00 RECCNT: DB 000H 1459 1460 0990 00 SINGLE: DB 000H 1461 1462 0991 00 ZERO4: DB 000H 1463 1464 0992 00 RCOUNT: DB 000H 1465 1466 0993 00 EXTVAL: DB 000H 1467 1468 0994 00 VRECORD:DB 000H 1469 1470 0995 FF SELSTR: DB 0FFH 1471 1472 0996 0000 ARECORD:DW 0000H 1473 1474 0998 00 SHIFTED:DB 000H 1475 1476 0999 0000 SHAREC: DW 0000H 1477 1478 099B 00 MODNUM: DB 000H 1479 1480 099C 00 DPTR: DB 000H 1481 1482 099D 00 OLDDSK: DB 000H 1483 1484 099E 00 SOMREC: DB 000H 1485 1486 099F 0000 RECADR: DW 0000H 1487 1488 09A1 0000 TRACK: DW 0000H 1489 1490 09A3 0000 SAVSEC: DW 0000H 1491 1492 09A5 00 COLUMN: DB 000H ;COLUMN NUMBER 1493 1494 09A6 24 DOLLAR: DB 024H ;$ 1495 1496 09A7 8000 DMAAD: DB 080H,000H ;DMA ADDRESS 1497 1498 09A9 00 CURDSK: DB 000H ;CURRENT DISK 1499 1500 09AA 0000 INFO: DW 0000H ;MESSAGE LOCATION 1501 1502 09AC 00 FCBDSK: DB 000H 1503 1504 09AD 00 SAVEC: DB 000H 1505 1506 09AE 0000 DCNT: DW 0000H 1507 1508 09B0 0000 SEARCHA:DW 0000H 1509 1510 09B2 00 SEARCHL:DB 000H 1511 1512 ; 1513 09B3 DS 80 1514 LSTACK: 1515 ; 1516 0A03 DS 134D ;F1LL OUT TO THE END OF THE BLOCK 1517 ; 1518 0A89 END ALLOCA 0975 758 1275 1426# ARECORD 0996 373 401 422 589 598 601 610 1286 1292 1472# ARET 087D 162 260 944 1074 1264 1363# ATRAN 03FF 596# 1084 ATRAN0 0425 600 615# ATRAN1 0426 616# 620 BDOS 01AB 49 53 57 80 128 134 140 148# BDOS1 01C3 153 159# BDOS2 01E8 171 176# BDOS3 01ED 174 178# BIOSS 0B00 16# 18 19 20 21 22 23 24 25 26 27 BLKMSK 097F 604 1434# BLKSHF 097E 525 596 861 1432# BNKMOV 083E 1329 1333# BUFFA 0967 720 749 1330 1412# BUFFB 096F 335 338 1420# CLRMODNUM 06DD 1123# 1202 COLUMN 09A5 209 253 1492# COMPCOL 0862 202 1354# COMPEXT 051E 816# 930 1034 COMPOUT 0214 204 208# CONOUT 0208 202# 250 252 CURDSK 09A9 157 693 709 1093 1120 1188 1225 1241 1498# CURRECA 096D 326 363 416 490 1418# CURSELECT 06D6 1118# 1176 1197 CURTRKA 096B 323 359 411 483 1416# DCNT 09AE 396 769 782 788 790 798 1506# DIRMAX 0983 786 1440# DISKEOF 0254 259# 1055 1072 1076 1083 DISKRESET 0001 32# 48 DLOG 0963 1102 1111 1115 1186 1408# DMAAD 09A7 755 1192 1232 1334 1496# DMAADDR 0965 513 763 1295 1325 1410# DMASET 018F 64 119 127# DMPOS 098E 585 850 1003 1456# DMPOS0 03BC 528# 531 DMPOS1 03CA 542# 546 DMPOS2 03D3 543 550# DMPOSITION 03B5 524# 584 DOLLAR 09A6 241 1494# DPTR 099C 721 805 1480# ENDOFDIR 04E3 769# 897 1204 ENDSEARCH 05CF 912 942# ENTSP 0961 165 1262 1406# EXTMSK 0980 651 819 868 1436# EXTVAL 0993 537 653 1466# FCB 005C 39# 94 FCBDSK 09AC 163 1166 1242 1502# FCBT 087F 56 133 1366# FNCRET 0259 261# FUNCT00 0231 190 235# FUNCT01 073F 191 1185# FUNCT02 0756 192 1197# FUNCT03 075C 193 1202# FUNCT04 0776 194 1220# FUNCT05 077C 195 1225# FUNCT06 0782 196 1231# FUNCTAB 01FA 173 189# GETDM 03D5 562# 588 GETDMD 03E7 569 574# GETDPTRA 049F 719# 902 969 GETEXTA 042D 624# 650 872 966 1030 1151 GETFCB 0446 644# 1043 1065 GETFCBA 043D 636# 644 658 832 1206 GETFCBB 0435 629# 636 1155 1255 GOBACK 0789 167 1237# GOBACK1 07AB 1249 1251# HEDR1 0955 67 84 1396# HEDR2 0956 82 1398# HEDR3 0957 91 1400# HEDR4 0958 87 1402# HEDR5 0959 102 1404# HLROTL 047A 684# 697 HLROTL0 047B 685# 688 HLROTR 046D 398 520 670# 711 866 HLROTR0 046E 671# 680 HOME 02D5 357# 888 INDEX 03ED 584# 1081 INFO 09AA 149 185 563 624 629 883 971 1135 1167 1179 1245 1500# LINFO 098D 160 1119 1171 1454# LSTACK 0A03 166 1514# MAXALL 0981 343 1438# MODNUM 099B 1125 1147 1252 1478# MOVE 0287 298# 337 342 973 1315 1350 MOVE0 0288 299# 305 MOVER 0134 70# 75 MSBANR 08F9 52 1382# MSBDOS 0863 264 269 1356# MSKVREC 0989 609 1448# MSOPEN 08A3 60 1372# MSPERM 0877 271 1361# MSREAD 08CE 137 1377# MSSLCT 0870 266 1359# NOTBACKSP 022B 221 227# NOWRITE 0494 709# 1103 OFFSET 0985 475 1442# OLDDSK 099D 1164 1175 1247 1482# OPEN 05DD 959# 1203 OPENCOPY 05E3 965# 1041 OPENCOPY1 05FA 980# 1059 OPENCOPY2 0613 987 998# OPENER 052F 832# 976 1050 OPENER1 0537 837# 871 OPENER2 053A 841# 847 OPENER3 0544 845 848# OPENER4 0551 854 856# OPENRCNT 060D 989 992# OPENREEL 063A 1029# 1073 OPENREEL0 0652 1042# 1060 OPENREEL1 065C 1035 1048# OPENREEL2 0669 1053 1057# OPENREEL3 0627 1012# 1058 OPENREEL4 0638 1016 1022# OPENX1 0772 1209 1214# PERMSG 0266 269# 389 391 PRINT 0234 241# 257 265 270 272 PRINTSTRING 0000 31# 51 78 139 QUIT2 026F 267 272# QUITS 01A2 61 139# RCOUNT 0992 649 664 1067 1464# RDBUFF 02F1 383# 751 1090 1342 RDBUFF1 02E8 372# 383 RDDIR 04C7 741 748# RDDIR1 04D9 748 758# RDDIR2 04AA 728# 759 1294 READDIR 04F3 785# 896 READDIR2 050E 801# 804 READDIR3 04B5 738# 809 READDIR4 07CB 743 1274# READDIR5 07D4 1276 1280# READFILE 0173 85 92 105# READLOOP 017A 112# 124 READSECT 0195 65 77 120 131# READSEQUENT 0004 35# 132 REBOOT 01A9 101 145# RECADR 099F 1293 1296 1308 1312 1344 1486# RECCNT 098F 995 999 1014 1021 1162 1256 1458# RECOK2 0807 1302 1306# RECOK3 0820 1304 1317# RECOK4 082A 1321# 1323 RECOK7 0848 1311 1338# RECOK8 027D 287# 294 1303 RECORDOK 068E 1069 1080# RECORDOK1 07C3 1087 1269# RECORDOK2 07D1 1271 1278# RESELECT 06E4 1130# 1220 RETMON 07B9 1239 1244 1262# RETSELECT 02D3 348 350# RETURNCURDSK 0005 36# RSEL1 0711 1126 1158 1162# RSEL2 0735 1173 1177# SAVEC 09AD 154 1006 1237 1504# SAVSEC 09A3 511 1490# SEARCH 0575 883# 960 1040 SEARCHA 09B0 884 900 1508# SEARCHEXT 05BD 918 925# SEARCHFIN 05D6 177 898 951# SEARCHL 09B2 886 903 1510# SEARCHLOOP 05A3 909# 940 SEARCHN 0585 891# 908 922 933 SEARCHOK 05C8 915 923 935# SECTPT 097C 340 433 441 466 1430# SEEK 0318 411# 750 1089 1339 SEEK0 032E 425# 439 SEEK1 0345 432 441# 462 SEEK2 0361 457 464# SEEK3 03AE 503 518# SEEKDIR 0304 396# 738 SELDISK 0002 33# SELECT 06AA 1093# 1177 1198 SELECTDISK 0291 310# 1106 SELERROR 025A 263# 1095 1108 SELSTR 0995 1097 1190 1297 1313 1470# SEQDISKREAD 0672 1064# 1221 SETDATA 04D3 744 755# 1088 1193 1233 SETDISK 0481 692# 1114 SETDMA 04DF 756 763# SETDMAADDR 0006 37# 127 SETENDDIR 04EC 780# 797 887 SETFCB 045D 658# 1091 1272 SHAREC 0999 603 1476# SHIFTED 0998 423 602 1474# SINGLE 0990 345 567 851 1460# SKIP2 016F 97 102# SKIPRD 015F 89 94# SOMREC 099E 1289 1317 1484# SRCHFIRST 0003 34# 55 STACK1 0955 45 1394# STARET 0256 260# 955 1046 1226 SUBDH 0274 277# 434 467 TAB0 0243 251# 255 TBUFF 0080 40# 63 66 79 1191 1319 1335 TRACK 09A1 479 1348 1488# TRANV 098B 334 506 1452# VRECORD 0994 527 606 646 660 1045 1066 1468# ZERO1 0987 518 1444# ZERO2 0988 739 1085 1282 1446# ZERO3 098A 156 1450# ZERO4 0991 158 1240 1462# ZERO5 0977 1279 1428# @BOOT 0B00 18# 46 @CONOT 0B0C 19# 206 @HOME 0B18 20# 357 @MOV 0B4B 27# 1336 @READ 0B27 25# 384 @SCTRN 0B30 26# 508 @SLDSK 0B1B 21# 313 @STDMA 0B24 24# 516 @STSEC 0B21 23# 512 @STTRK 0B1E 22# 480