[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/11/99 21:43:10 SYS12 - LS-DOS 6.2 Page 00001 00001 ;SYS12/ASM - LS-DOS 6.2 00003 ; 000D 00004 CR EQU 13 00005 *LIST OFF ;Get SYS0/EQU 00321 *LIST ON 0000 00322 *GET COPYCOM:3 ;Copyright message 00323 ; COPYCOM - File for Copyright COMment block 00324 ; 0000 00325 *GET BUILDVER/ASM:3 00326 ; 00327 ; Buildver/asm is a bit of a kludge since not all utilities can load 00328 ; equates from LDOS60 and still compile. LOWCORE and everybody else 00329 ; relies on this setting, and it eventually ends up in LDOS60/EQU 00330 ; for programs that can use that. 00331 ; FFFF 00332 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B) 00333 ; These switches activate patches made since the 1B release. 00334 ; It is important that all earlier patches be enabled when a higher 00335 ; patch is enabled. 00336 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the 00337 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.) FFFF 00338 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI) FFFF 00339 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR) FFFF 00340 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT) FFFF 00341 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL) 00342 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19. FFFF 00343 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *) FFFF 00344 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY) 00345 ; 00346 ;End of BUILDVER/ASM 00347 IF @BLD631 00349 ELSE 00350 COM '<*(C) 1982,3,4,6 by LSI*>' 00351 ENDIF 00352 ; 1E00 00353 ORG 1E00H 00354 ; 1E00 E670 00355 SYS12 AND 70H ;Strip bit 7 1E02 C8 00356 RET Z ;Back on zero entry 1E03 FE30 00357 CP 30H ;Locate module address? 1E05 CAAD20 00358 JP Z,GTMOD 1E08 FE20 00359 CP 20H ;Mini dir? 1E0A CAF01E 00360 JP Z,MDIR 1E0D FE10 00361 CP 10H ;RAMDIR? 1E0F C0 00362 RET NZ ;Ret if any other entry 00363 ; 00364 ; RAMDIR interfacing 00365 ; HL = user buffer area 00366 ; B = drive # 00367 ; C = 0 for entire directory 00368 ; C = 1-254 for selected DEC-1 (02-FF) 00369 ; C = 255 for disk space; in use/free 00370 ; 1E10 3E07 00371 RAMDIR LD A,7 ;Ck on valid drive # 1E12 B8 00372 CP B 1E13 3E20 00373 LD A,32 ;Init "illegal drive 1E15 D8 00374 RET C 1E16 CD6615 00375 CALL LNKFCB@ ;Save regs 1E19 78 00376 LD A,B ;Get drive where needed 1E1A 41 00377 LD B,C ;Xfer DEC to B 1E1B 4F 00378 LD C,A ; & drive to C 1E1C F630 00379 OR '0' ;Make it ASCII 1E1E 321620 00380 LD (DSTDRV+1),A ;Stuff for STUFBUF 1E21 CD0B21 00381 CALL CKDRV ;Be sure disk is there 1E24 C0 00382 RET NZ 1E25 04 00383 INC B ;Test 0, 1-254, 255 1E26 2019 00384 JR NZ,DIRINFO ;Go if directory req 00385 ; 00386 ; Get FREE SPACE info 00387 ; 1E28 E5 00388 PUSH HL ;Save buffer pointer 1E29 CD3620 00389 CALL SPACE ;Get our info 1E2C 46 00390 LD B,(HL) ;P/u free space in K 1E2D 2B 00391 DEC HL ; into BC 1E2E 4E 00392 LD C,(HL) 1E2F 2B 00393 DEC HL 1E30 7E 00394 LD A,(HL) ;Get total space in K 1E31 2B 00395 DEC HL ; into HL 1E32 6E 00396 LD L,(HL) 1E33 67 00397 LD H,A 1E34 ED52 00398 SBC HL,DE ;Calc "in use" (CF=0) 1E36 EB 00399 EX DE,HL ;Xfer to DE 1E37 E1 00400 POP HL ;Rcvr user buf ptr 1E38 73 00401 LD (HL),E ;Stuff "in use" 1E39 23 00402 INC HL 1E3A 72 00403 LD (HL),D 1E3B 23 00404 INC HL 1E3C 71 00405 LD (HL),C ;Stuff "free to use" 1E3D 23 00406 INC HL 1E3E 70 00407 LD (HL),B 1E3F AF 00408 XOR A ;Show no error 1E40 C9 00409 RET 00410 ; 00411 ; Do RAMDIR directory info 00412 ; 1E41 05 00413 DIRINFO DEC B ;If DEC=0, do it all 1E42 286C 00414 JR Z,DOALL ;Go if all of it 1E44 04 00415 INC B ;1=>2, 2=>3, ..., FE=>FF 00416 ; 00417 ; Calculate the number of directory sectors 00418 ; = (#sectors x #heads) - 2 for GAT & HIT 00419 ; 1E45 3E07 00420 LD A,7 ;Get highest # sector 1E47 CD2B1A 00421 CALL @DCTBYT 1E4A 57 00422 LD D,A ;Store heads & sectors 1E4B E61F 00423 AND 1FH ;Rake off # sectors 1E4D 5F 00424 LD E,A ; & stuff into E 1E4E 1C 00425 INC E ;Bump for 0 offset 1E4F AA 00426 XOR D ;Recover # heads 1E50 07 00427 RLCA ; into bits 0-2 1E51 07 00428 RLCA 1E52 07 00429 RLCA 1E53 3C 00430 INC A ;Bump for 0 offset 1E54 CD0A19 00431 CALL @MUL8 ;Multiply sectors x heads 1E57 5F 00432 LD E,A ;Now check double bit 1E58 3E04 00433 LD A,4 1E5A CD2B1A 00434 CALL @DCTBYT 1E5D CB6F 00435 BIT 5,A ;Set if 2-sided 1E5F 7B 00436 LD A,E 1E60 2801 00437 JR Z,ONESID ;Go if not set else 1E62 87 00438 ADD A,A ; double value 1E63 D602 00439 ONESID SUB 2 ;Reduce for GAT & HIT 1E65 57 00440 LD D,A ;D => # dir sectors 1E66 78 00441 LD A,B ;Get requested DEC 1E67 E61F 00442 AND 1FH 1E69 BA 00443 CP D ;See if in range 1E6A 3804 00444 JR C,DIRINF1 ;Go if so 1E6C 3E10 00445 LD A,16 ;"Illegal logical file # 1E6E B7 00446 OR A ;Return out of range error 1E6F C9 00447 RET 00448 ; 1E70 E5 00449 DIRINF1 PUSH HL ;Save buffer ptr 1E71 CDBB18 00450 CALL @DIRRD ;Get its directory record 1E74 D1 00451 POP DE ;Rcvr buf ptr 1E75 C0 00452 RET NZ ;Back on an error 1E76 7E 00453 LD A,(HL) ;Get attributes 1E77 E6D8 00454 AND 0D8H ;Only if in use & VIS 1E79 EE10 00455 XOR 10H ;Flip state so NZ=no 1E7B 3E19 00456 LD A,25 ;Init file access denied 1E7D C0 00457 RET NZ ;Back on no file, SYS, INV 1E7E E5 00458 GETSTUF PUSH HL ;Save DIR ptr 1E7F CDE11F 00459 CALL STUFBUF ;Stuff the filespec 1E82 E1 00460 POP HL 1E83 7E 00461 LD A,(HL) 1E84 E607 00462 AND 7 ;Keep the access level 1E86 12 00463 LD (DE),A 1E87 13 00464 INC DE 1E88 2C 00465 INC L ;Go up to EOF offset 1E89 2C 00466 INC L 1E8A 2C 00467 INC L 1E8B EDA0 00468 LDI ;Move in the offset & LRL 1E8D EDA0 00469 LDI 1E8F 7D 00470 LD A,L ;Bump to ERN 1E90 C60F 00471 ADD A,15 1E92 6F 00472 LD L,A 1E93 7E 00473 LD A,(HL) ;P/u ERN 1E94 12 00474 LD (DE),A ; and xfer it 1E95 2C 00475 INC L 1E96 13 00476 INC DE 1E97 66 00477 LD H,(HL) 1E98 6F 00478 LD L,A ;# sectors to HL 1E99 EB 00479 EX DE,HL ; hence to DE 1E9A 72 00480 LD (HL),D ;Stuff ERN High-order 1E9B 23 00481 INC HL ;Bump buf ptr 1E9C 13 00482 INC DE ;Adjust for rounding 1E9D 13 00483 INC DE 1E9E 13 00484 INC DE 1E9F CB3A 00485 SRL D ;Divide by 4 to calc K 1EA1 CB1B 00486 RR E 1EA3 CB3A 00487 SRL D 1EA5 CB1B 00488 RR E 1EA7 73 00489 LD (HL),E ;Xfer result into buffer 1EA8 23 00490 INC HL 1EA9 72 00491 LD (HL),D 1EAA 23 00492 INC HL 1EAB 362B 00493 LD (HL),'+' ;Stuff buffer terminator 1EAD EB 00494 EX DE,HL 1EAE AF 00495 XOR A 1EAF C9 00496 RET 00497 ; 00498 ; RAMDIR - Do all of the directory 00499 ; 1EB0 EB 00500 DOALL EX DE,HL ;Buffer pointer to DE 1EB1 CD9B20 00501 CALL HITRD1 ;Read in the HIT 1EB4 C0 00502 RET NZ ;Exit if read error 1EB5 1811 00503 JR DOALL3 00504 ; 1EB7 C1 00505 DOALL1 POP BC ;Recover HIT pointer lo 1EB8 2623 00506 LD H,DIRBUF$<-8 1EBA 68 00507 LD L,B ;Advance to next dir 1EBB 7D 00508 DOALL2 LD A,L ; record of this sector 1EBC C620 00509 ADD A,32 1EBE 6F 00510 LD L,A 1EBF 3007 00511 JR NC,DOALL3 ;Bypass if still same 1EC1 2C 00512 INC L ; else point to next one 1EC2 CB6D 00513 BIT 5,L ;Finished with 1EC4 2802 00514 JR Z,DOALL3 ; this drive? 1EC6 AF 00515 XOR A 1EC7 C9 00516 RET 00517 ; 1EC8 7E 00518 DOALL3 LD A,(HL) ;P/u HIT entry 1EC9 B7 00519 OR A 1ECA 28EF 00520 JR Z,DOALL2 ;Jump if spare 1ECC 45 00521 LD B,L ;Save DEC in regB 1ECD C5 00522 PUSH BC ; & to stack 1ECE 7D 00523 LD A,L ;Pt to dir record for 1ECF E6E0 00524 AND 0E0H ; this DEC 1ED1 6F 00525 LD L,A ;Get the dir sector for 1ED2 A8 00526 XOR B ; this DEC 1ED3 FEFF 00527 DOALL4 CP 0FFH ;Same as one in core? 1ED5 2809 00528 JR Z,DOALL5 ;Jump if so else 1ED7 32D41E 00529 LD (DOALL4+1),A ; update one we have and 1EDA CDBB18 00530 CALL @DIRRD ; read it into buffer 1EDD C2C11F 00531 JP NZ,MDIR12 ;Jump on read error 1EE0 261D 00532 DOALL5 LD H,SBUFF$<-8 ;Sysbuf hi order 1EE2 7E 00533 LD A,(HL) ;P/u attributes 1EE3 E6D8 00534 AND 0D8H ;Test FXDE & in-use 1EE5 EE10 00535 XOR 10H ;If not used or FXDE 1EE7 20CE 00536 JR NZ,DOALL1 ; then back to DOALL1 1EE9 E5 00537 PUSH HL 1EEA CD7E1E 00538 CALL GETSTUF ;Get the dir info 1EED E1 00539 POP HL 1EEE 18C7 00540 JR DOALL1 00541 ; 00542 ; Routine to display a mini directory 00543 ; C => drive number in binary (0-7) 00544 ; B => option, 0 = display, 1 = buffer stuff 00545 ; 2 = display /EXT, 3 = buffer /EXT 00546 ; 4 = space into buffer 00547 ; HL => address of buffer to stuff dir info & EXT 00548 ; Z <= set on valid conclusion 00549 ; NZ <= set on any error 00550 ; 1EF0 3E07 00551 MDIR LD A,7 ;Test for bad drive # 1EF2 B9 00552 CP C 1EF3 3E20 00553 LD A,32 ;Init "illegal drive... 1EF5 D8 00554 RET C 1EF6 CD0B21 00555 CALL CKDRV ;Be sure disk is there 1EF9 C0 00556 RET NZ 1EFA CD6615 00557 CALL LNKFCB@ ;Save the regs 1EFD 78 00558 LD A,B ;Stuff the option 1EFE 326B1F 00559 LD (TSTOPT+1),A 1F01 FE04 00560 CP 4 ;If option 4, go get 1F03 CA2420 00561 JP Z,SPACE0 ; space info 1F06 3E2B 00562 LD A,43 ;Init "SVC parm error 1F08 D0 00563 RET NC ;Back if option > 4 1F09 E5 00564 PUSH HL ;Save possible buffer 1F0A C5 00565 PUSH BC 1F0B 11B321 00566 LD DE,LILBUF ;Save possible /EXT 1F0E 010300 00567 LD BC,3 1F11 EDB0 00568 LDIR 1F13 C1 00569 POP BC 1F14 79 00570 LD A,C ;Get drive # and 1F15 F630 00571 OR '0' ; make it ASCII 1F17 321620 00572 LD (DSTDRV+1),A 1F1A 3E05 00573 LD A,5 ;Init to 5 files/line 1F1C 329F1F 00574 LD (MDIR11+1),A 1F1F 3E17 00575 LD A,23 ; & 23 lines/page 1F21 32B01F 00576 LD (CKPAGE+1),A 1F24 CD9B20 00577 CALL HITRD1 ;Read in the HIT 1F27 D1 00578 POP DE ;Rcvr possible buffer 1F28 C0 00579 RET NZ ;Exit if read error 1F29 1822 00580 JR MDIR3 1F2B C1 00581 MDIR1 POP BC ;Recover HIT pointer lo 1F2C 2623 00582 LD H,DIRBUF$<-8 1F2E 68 00583 LD L,B ;Advance to next dir 1F2F 7D 00584 MDIR2 LD A,L ; record of this sector 1F30 C620 00585 ADD A,32 1F32 6F 00586 LD L,A 1F33 3018 00587 JR NC,MDIR3 ;Bypass if still same 1F35 2C 00588 INC L ; else point to next one 1F36 CB6D 00589 BIT 5,L ;Finished with 1F38 2813 00590 JR Z,MDIR3 ; this drive? 1F3A 3A6B1F 00591 LD A,(TSTOPT+1) ;If option 1 or 3, 1F3D E601 00592 AND 1 ; must stuff buffer end 1F3F 2007 00593 JR NZ,CLSBUF 1F41 3E0D 00594 LD A,CR ; else do a blank line 1F43 CD4206 00595 CALL @DSP 1F46 AF 00596 XOR A 1F47 C9 00597 RET 00598 ; 1F48 3EFF 00599 CLSBUF LD A,0FFH ;Put in buffer terminator 1F4A 12 00600 LD (DE),A 1F4B AF 00601 XOR A 1F4C C9 00602 RET 00603 ; 1F4D 7E 00604 MDIR3 LD A,(HL) ;P/u HIT entry 1F4E B7 00605 OR A 1F4F 28DE 00606 JR Z,MDIR2 ;Jump if spare 1F51 45 00607 LD B,L ;Save DEC in reg B 1F52 C5 00608 PUSH BC ; & to stack 1F53 7D 00609 LD A,L ;Pt to dir record for 1F54 E6E0 00610 AND 0E0H ; this DEC 1F56 6F 00611 LD L,A ;Get the dir sector for 1F57 A8 00612 XOR B ; this DEC 1F58 FEFF 00613 MDIR4 CP 0FFH ;Same as one in core? 1F5A 2808 00614 JR Z,MDIR5 ;Jump if so 1F5C 32591F 00615 LD (MDIR4+1),A ;Else update one we have 1F5F CDBB18 00616 CALL @DIRRD ; and read it into buf 1F62 205D 00617 JR NZ,MDIR12 ;Jump on read error 1F64 261D 00618 MDIR5 LD H,SBUFF$<-8 ;Sysbuf hi order 1F66 012B1F 00619 LD BC,MDIR1 ;Set up the return addr 1F69 C5 00620 PUSH BC 1F6A 3E00 00621 TSTOPT LD A,0 ;P/u option number 1F6C E5 00622 PUSH HL 1F6D D5 00623 PUSH DE 1F6E CDC31F 00624 CALL TSTSAM ;Check for extension match 1F71 D1 00625 POP DE 1F72 E1 00626 POP HL 1F73 C0 00627 RET NZ ;Back to MDIR1 1F74 3A6B1F 00628 LD A,(TSTOPT+1) 1F77 0F 00629 RRCA ;Test option 1 or 3 1F78 7E 00630 LD A,(HL) 1F79 3013 00631 JR NC,DSPLYIT ;Go if 0 or 2 1F7B E690 00632 AND 90H ;Test FXDE & in-use 1F7D EE10 00633 XOR 10H ;If not used, FXDE 1F7F C0 00634 RET NZ ;Back to MDIR1 1F80 011000 00635 LD BC,16 1F83 EDB0 00636 LDIR ;User's buffer 1F85 2C 00637 INC L ;Bypass stored passwords 1F86 2C 00638 INC L 1F87 2C 00639 INC L 1F88 2C 00640 INC L 1F89 0E02 00641 LD C,2 ; and xfer ERN 1F8B EDB0 00642 LDIR 1F8D C9 00643 RET ;Back to MDIR1 00644 ; 1F8E E6D8 00645 DSPLYIT AND 0D8H ;Test if we want this 1F90 EE10 00646 XOR 10H ;Only if in-use & VIS 1F92 C0 00647 RET NZ ;Back to MDIR1 1F93 11B621 00648 LD DE,LILBUF+3 1F96 D5 00649 PUSH DE 1F97 CDE11F 00650 CALL STUFBUF ;Move filespec to buffer 1F9A E1 00651 POP HL ;Rcvr LILBUF ptr 1F9B CD2D05 00652 CALL @DSPLY ;Display the file 1F9E 3E00 00653 MDIR11 LD A,0 ;Count down 5-across 1FA0 3D 00654 DEC A 1FA1 329F1F 00655 LD (MDIR11+1),A ;Update count 1FA4 C0 00656 RET NZ ;Loop if more to go 1FA5 3E05 00657 LD A,5 ; else re-init 1FA7 329F1F 00658 LD (MDIR11+1),A 1FAA 3E0D 00659 LD A,CR 1FAC CD4206 00660 CALL @DSP ;New line 1FAF 3E00 00661 CKPAGE LD A,0 ;P/u display count 1FB1 3D 00662 DEC A 1FB2 32B01F 00663 LD (CKPAGE+1),A 1FB5 C0 00664 RET NZ 1FB6 3E17 00665 LD A,23 1FB8 32B01F 00666 LD (CKPAGE+1),A ;Reset for max 1FBB CD2806 00667 CALL @KEY ;Wait for keyboard input 1FBE C34505 00668 JP @CLS ;Clear screen and ret 00669 ; 1FC1 C1 00670 MDIR12 POP BC 1FC2 C9 00671 RET 00672 ; 1FC3 CB4F 00673 TSTSAM BIT 1,A ;Ck if /EXT option 1FC5 C8 00674 RET Z ;Ret with Z if 1FC6 010D00 00675 LD BC,13 ; option <> /EXT 1FC9 09 00676 ADD HL,BC ;Else point to /EXT 1FCA 0603 00677 LD B,3 ; field of dir record 1FCC 11B321 00678 LD DE,LILBUF ; & check for match 1FCF 1A 00679 TSTS1 LD A,(DE) 1FD0 FE24 00680 CP '$' ;'$' matches with all 1FD2 2808 00681 JR Z,TSTS2 1FD4 FE41 00682 CP 'A' ;If numeric, don't cvrt 1FD6 3802 00683 JR C,$+4 ; to upper case 1FD8 CBAF 00684 RES 5,A ;Cvrt to UC if lc 1FDA BE 00685 CP (HL) 1FDB C0 00686 RET NZ ;Ret on no match 1FDC 23 00687 TSTS2 INC HL 1FDD 13 00688 INC DE 1FDE 10EF 00689 DJNZ TSTS1 ;Loop for 3 chars 1FE0 C9 00690 RET 00691 ; 00692 ; Routine to construct the filespec field 00693 ; 1FE1 7D 00694 STUFBUF LD A,L 1FE2 C605 00695 ADD A,5 ;Pt to start of filename 1FE4 6F 00696 LD L,A 1FE5 0E0D 00697 LD C,13 ;Init for 15 (-2) chars 1FE7 0608 00698 LD B,8 ;Filename 1FE9 7E 00699 STUFB1 LD A,(HL) 1FEA 23 00700 INC HL 1FEB FE20 00701 CP ' ' ;Exit on 1st space 1FED 2807 00702 JR Z,STUFB2 1FEF 12 00703 LD (DE),A ;Stuff the char 1FF0 13 00704 INC DE 1FF1 0D 00705 DEC C ;String count down 1FF2 10F5 00706 DJNZ STUFB1 ;Field loop 1FF4 1804 00707 JR STUFB3 ;Bypass ext calculation 1FF6 7D 00708 STUFB2 LD A,L ;Calculate start of 1FF7 80 00709 ADD A,B ;EXT field in dir record 1FF8 3D 00710 DEC A 1FF9 6F 00711 LD L,A 1FFA 7E 00712 STUFB3 LD A,(HL) ;Display EXT if present 1FFB FE20 00713 CP ' ' 1FFD 2812 00714 JR Z,STUFB5 ;Exit if no EXT 1FFF 3E2F 00715 LD A,'/' ;Display slash 2001 12 00716 LD (DE),A ;Stuff the char 2002 13 00717 INC DE 2003 0D 00718 DEC C ;Dsplay char countdown 2004 0603 00719 LD B,3 ;3 chars max for EXT 2006 7E 00720 STUFB4 LD A,(HL) 2007 23 00721 INC HL 2008 FE20 00722 CP ' ' 200A 2805 00723 JR Z,STUFB5 ;Exit on 1st blank 200C 12 00724 LD (DE),A ; else stuff the char 200D 13 00725 INC DE 200E 0D 00726 DEC C 200F 10F5 00727 DJNZ STUFB4 ;Loop 3 chars 2011 3E3A 00728 STUFB5 LD A,':' ;Stuff a drive sep 2013 12 00729 LD (DE),A ;Reg C already accounted 2014 13 00730 INC DE ; for in the init 2015 3E00 00731 DSTDRV LD A,0 ;P/u drive # 2017 12 00732 LD (DE),A 2018 13 00733 INC DE 2019 3E20 00734 STUFB6 LD A,' ' ;Stuff a space 201B 12 00735 LD (DE),A 201C 13 00736 INC DE 201D 0D 00737 DEC C ;Count down 201E 20F9 00738 JR NZ,STUFB6 ;Display trailing spaces 2020 3E03 00739 LD A,3 ;Stuff the ETX 2022 12 00740 LD (DE),A 2023 C9 00741 RET 00742 ; 00743 ; Routine to get the free space info 00744 ; 2024 E5 00745 SPACE0 PUSH HL ;Save buf start 2025 111000 00746 LD DE,16 ;Index for space 2028 D5 00747 PUSH DE 2029 19 00748 ADD HL,DE 202A CD3620 00749 CALL SPACE ;Get the space data 202D C1 00750 POP BC ; name & date 202E D1 00751 POP DE ;Now shift in the 202F 21D023 00752 LD HL,DIRBUF$+0D0H ; disk name and date 2032 EDB0 00753 LDIR 2034 AF 00754 XOR A 2035 C9 00755 RET 00756 ; 2036 CD7418 00757 SPACE CALL @GATRD ;Read GAT 2039 C0 00758 RET NZ ;Ret on GAT read error 203A FDE5 00759 PUSH IY 203C CD1E1A 00760 CALL @GTDCT ;Get DCT vector 203F EB 00761 EX DE,HL ;User buf ptr to DE 2040 2600 00762 LD H,0 ;P/u highest # cylinder 2042 FD6E06 00763 LD L,(IY+6) ; & adjust for 0 offset 2045 23 00764 INC HL 2046 FD7E08 00765 LD A,(IY+8) ;P/u # of sectors/granule 2049 E61F 00766 AND 1FH 204B 3C 00767 INC A ;Adjust for zero offset 204C F5 00768 PUSH AF ;Save # of sectors/gran 204D D5 00769 PUSH DE ;Save user buf ptr 204E 5F 00770 LD E,A 204F FD7E08 00771 LD A,(IY+8) ;P/u # of granules/cyl 2052 E6E0 00772 AND 0E0H 2054 07 00773 RLCA ; & shift to bits 0-2 2055 07 00774 RLCA 2056 07 00775 RLCA 2057 3C 00776 INC A ;Adjust for zero offset 2058 CD0A19 00777 CALL @MUL8 ;Calc # of sectors/cyl 205B FDCB046E 00778 BIT 5,(IY+4) ;Double sided? 205F 2801 00779 JR Z,$+3 ;Bypass if one-sided 2061 87 00780 ADD A,A ; else double the count 2062 C1 00781 POP BC ;Rcvr user buf ptr 2063 CD8620 00782 CALL DOMUL16 ;Calculate total sectors 2066 23 00783 INC HL ;Bump to next buf pos 2067 E5 00784 PUSH HL ; & save pointer 2068 210023 00785 LD HL,DIRBUF$ ;Pt to start of GAT 206B 110000 00786 LD DE,0 ;Init gran counter 206E 3ACC23 00787 LD A,(DIRBUF$+0CCH) ;P/u cyl excess 2071 C623 00788 ADD A,35 ;Add base 2073 47 00789 LD B,A ;Set loop counter 2074 7E 00790 PUGAT LD A,(HL) ;P/u GAT byte 2075 37 00791 KEEP7 SCF ;Keep bit 7 set 2076 1F 00792 RRA ;Slide gran bit to carry 2077 3801 00793 JR C,BYTEND? ;Ignore if in use 2079 13 00794 INC DE ;Free, bump gran counter 207A FEFF 00795 BYTEND? CP 0FFH ;End of byte? 207C 20F7 00796 JR NZ,KEEP7 ;Loop if not 207E 2C 00797 INC L ;Bump GAT byte pointer 207F 10F3 00798 DJNZ PUGAT ;Loop for # cyls 2081 EB 00799 EX DE,HL ;# free grans -> HL 2082 C1 00800 POP BC ;Pop user buf ptr 2083 F1 00801 POP AF ;Rcvr # of sectors/gran 2084 FDE1 00802 POP IY 2086 CDC906 00803 DOMUL16 CALL @MUL16 ;Calc # of free sectors 2089 60 00804 LD H,B ;Cvrt # of free sectors 208A 55 00805 LD D,L 208B 69 00806 LD L,C ;To free space in K by 208C 5F 00807 LD E,A 208D 13 00808 INC DE ; dividing the # by 4 208E 13 00809 INC DE ;Round up adjustment 208F CB3A 00810 SRL D ;Divide 16-bit reg by 2 2091 CB1B 00811 RR E 2093 CB3A 00812 SRL D ; & divide again 2095 CB1B 00813 RR E 2097 73 00814 LD (HL),E ;Stuff the value 2098 23 00815 INC HL 2099 72 00816 LD (HL),D 209A C9 00817 RET 00818 ; 00819 ; Read the hash index table 00820 ; 209B 210023 00821 HITRD1 LD HL,DIRBUF$ ;Pt to buffer 209E C5 00822 PUSH BC 209F D5 00823 PUSH DE 20A0 CDF718 00824 CALL @DIRCYL ;Dir cyl to reg D 20A3 1E01 00825 LD E,1 ;Sector one 20A5 CDD818 00826 CALL @RDSSC 20A8 D1 00827 POP DE 20A9 C1 00828 POP BC 20AA 3E16 00829 LD A,22 ;"HIT read error" 20AC C9 00830 RET 00831 ; 00832 ; Routine to locate the address of a module 00833 ; DE => pointer to module name 00834 ; HL <= address of module start if found 00835 ; DE <= address of end-of-module name + 1 if found 00836 ; Z <= if found, else NZ & A = 8 00837 ; 20AD C5 00838 GTMOD PUSH BC ;Save this reg pair 20AE 0EFF 00839 LD C,0FFH ;Init length counter 20B0 D5 00840 PUSH DE ;Save name start 20B1 0C 00841 GTM1 INC C ;Bump counter 20B2 1A 00842 LD A,(DE) ;Search for end-of-name 20B3 13 00843 INC DE 20B4 FE21 00844 CP ' '+1 20B6 30F9 00845 JR NC,GTM1 20B8 D1 00846 POP DE 00847 ; 00848 ; Start search at system core 00849 ; 20B9 21F008 00850 LD HL,@$SYS ;Pointer to driver start 00851 ; 00852 ; Loop through core searching names 00853 ; 20BC 7C 00854 GTM2 LD A,H ;Are we currently 00855 IF @BLD631 20BD FE14 00856 CP @BYTEIO<-8+1 ;<631>the driver zone? (<1400H) 00857 ELSE 00858 CP @BYTEIO<-8 ; the driver zone ? 00859 ENDIF 20BF 300D 00860 JR NC,GTM2A ;No - check himem 00861 ; 00862 ; In the Driver zone - is it allocated ? 00863 ; 20C1 C5 00864 PUSH BC ;Save BC 20C2 ED4B0602 00865 LD BC,(DVRHI$) ;P/u next available 20C6 B7 00866 OR A ; addr in Driver zone. 20C7 E5 00867 PUSH HL ;Is this module 20C8 ED42 00868 SBC HL,BC ; accounted for in 20CA E1 00869 POP HL ; the driver zone ? 20CB C1 00870 POP BC ; 20CC 3038 00871 JR NC,GTM8 ;No - get out of d/z 00872 ; 00873 ; Does this module have a legal header ? 00874 ; 20CE 7E 00875 GTM2A LD A,(HL) ;Ck for "JR xx" 20CF FE18 00876 CP 18H 20D1 202E 00877 JR NZ,GTM7 ;Exit on non-JR 20D3 E5 00878 PUSH HL ;Save pointer to start 20D4 23 00879 INC HL ;Advance to length/name 20D5 23 00880 INC HL 20D6 23 00881 INC HL 20D7 23 00882 INC HL 20D8 7E 00883 LD A,(HL) ;P/u length field 20D9 E60F 00884 AND 0FH ;Strip flags 20DB B9 00885 CP C ;Lengths match? 20DC 2012 00886 JR NZ,GTM5 20DE 23 00887 INC HL ;Point to start of name 20DF 47 00888 LD B,A ;Set loop counter 20E0 D5 00889 PUSH DE ;Save user's name pointer 20E1 1A 00890 GTM3 LD A,(DE) ;Compare the name strings 20E2 BE 00891 CP (HL) 20E3 200A 00892 JR NZ,GTM4 ;Go if no match 20E5 23 00893 INC HL 20E6 13 00894 INC DE 20E7 10F8 00895 DJNZ GTM3 20E9 EB 00896 EX DE,HL ;Name+1 to DE 00897 ; 00898 ; Found a match - exit with info 00899 ; 20EA E1 00900 POP HL ;Keep DE to name end+1 20EB E1 00901 POP HL ;Module start address 20EC C1 00902 POP BC ;Reg restoral 20ED AF 00903 XOR A ;Set Z-flag for return 20EE C9 00904 RET 00905 ; 00906 ; No match - loop to next module 00907 ; 20EF D1 00908 GTM4 POP DE 20F0 E1 00909 GTM5 POP HL 20F1 23 00910 INC HL ;Point to last byte used 20F2 23 00911 INC HL 20F3 7E 00912 LD A,(HL) ;P/u low-order 20F4 23 00913 INC HL 20F5 66 00914 LD H,(HL) ;P/u high-order 20F6 6F 00915 LD L,A 20F7 23 00916 GTM5A INC HL ;Bump to next address 20F8 7C 00917 LD A,H ;Ck for wrap to zero 20F9 B5 00918 OR L 20FA 20C0 00919 JR NZ,GTM2 ;Loop if not through 20FC C1 00920 GTM6 POP BC ;Restore reg 20FD 3E08 00921 LD A,8 ;Set "device not avail... 20FF B7 00922 OR A 2100 C9 00923 RET 00924 ; 00925 ; Found non-JR - Advance to high memory? 00926 ; 2101 7C 00927 GTM7 LD A,H ;Past driver core? 2102 FE13 00928 CP @BYTEIO<-8 2104 30F6 00929 JR NC,GTM6 ;Exit with "not found" 2106 2A0E04 00930 GTM8 LD HL,(HIGH$) ; else p/u himem pointer 2109 18EC 00931 JR GTM5A ; & hop to it if in use 00932 ; 00933 ; Check a drive for availability 00934 ; 210B FDE5 00935 CKDRV PUSH IY ;We use IY in disk I/O 210D CD1E1A 00936 CALL @GTDCT ;Get driver routine addr 2110 FD7E00 00937 LD A,(IY+0) ;P/u drive vector 2113 FEC3 00938 CP 0C3H ;Ck for enabled 2115 3E20 00939 LD A,32 ;Drive not ready 2117 C29F21 00940 JP NZ,CKDR5 ;Bypass if disabled 211A E5 00941 PUSH HL 211B D5 00942 PUSH DE 211C FD7E06 00943 LD A,(IY+6) ;Make sure that the current 211F FDBE05 00944 CP (IY+5) ; cylinder count is in range 2122 D22B21 00945 JP NC,CKDRV1 ;Go if in range 2125 CDC819 00946 CALL @RSTOR ;Restore drive 2128 C2AE21 00947 JP NZ,CKDR7A ;Go if error 00948 ; 212B FD5605 00949 CKDRV1 LD D,(IY+5) ;P/u current track 212E 1E00 00950 LD E,0 ;Set for sector 0 2130 CDD019 00951 CALL @SEEK ;Set track info to FDC 2133 2079 00952 JR NZ,CKDR7A ;Go if error 2135 CDD419 00953 CALL @RSLCT ;Wait until not busy 2138 2074 00954 JR NZ,CKDR7A ;Not there - ret NZ 213A FDCB035E 00955 BIT 3,(IY+3) ;If hard drive, bypass 213E 2055 00956 JR NZ,CKDR3A ; GAT data update 2140 FDCB0466 00957 BIT 4,(IY+4) ;If "ALIEN" by pass 2144 202C 00958 JR NZ,CKDR2B ; test of index pulses 00959 IF @MOD4 2146 3A0E00 00960 LD A,(FDDINT$) ;Check 'SMOOTH' state 2149 B7 00961 OR A 214A 3E09 00962 LD A,09 ;Set MSB of count down 214C 2803 00963 JR Z,INTRON ;Go if not SMOOTH 214E CB3F 00964 SRL A ;Divide the count by two 2150 F3 00965 DI 00966 ENDIF 00967 IF @MOD2 00968 LD A,20 00969 ENDIF 2151 326321 00970 INTRON LD (CDCNT+1),A ;Store in 'LD H' instruction 2154 212000 00971 LD HL,0020H ;Set up count (short) 00972 ; 00973 ; Test for diskette in drive & rotating 00974 ; 2157 CDA221 00975 CKDR1 CALL INDEX ;Test index pulse 215A 20FB 00976 JR NZ,CKDR1 ;Jump on index 215C FDCB047E 00977 BIT 7,(IY+4) ;Check CKDRV inhibit bit 2160 2010 00978 JR NZ,CKDR2B ; if on skip index test 2162 2600 00979 CDCNT LD H,00H ;CKDRV counter (long) 00980 ;Count set from above 2164 CDA221 00981 CKDR2 CALL INDEX ;Test index pulse 2167 28FB 00982 JR Z,CKDR2 ;Jump on no index 00983 IF @MOD4 2169 FB 00984 EI ;OK for INTs now 00985 ENDIF 216A 212000 00986 LD HL,0020H ;Index off wait (short) 216D CDA221 00987 CKDR2A CALL INDEX 2170 20FB 00988 JR NZ,CKDR2A ;Jump on index 00989 ; 00990 ; Diskette is rotating 00991 ; 2172 F5 00992 CKDR2B PUSH AF ;Save FDC status 2173 CDF718 00993 CALL @DIRCYL ;Get directory track in D 2176 21001D 00994 LD HL,SBUFF$ ;Point to HIT buffer 2179 5D 00995 LD E,L ;Sector 0 for GAT 217A CDD818 00996 CALL @RDSSC ;Read the GAT 217D 202E 00997 JR NZ,CKDR7 ;Jump on error 217F 2ACC1D 00998 LD HL,(SBUFF$+0CCH) ;P/u excess tracks 2182 3E22 00999 LD A,22H ;Add offset 2184 85 01000 ADD A,L 2185 FD7706 01001 LD (IY+6),A ;Max track # to DCT 2188 FDCB04AE 01002 RES 5,(IY+4) ;Set to side 0 218C CB6C 01003 BIT 5,H ;Test double sided 218E 2804 01004 JR Z,CKDR3 ;Jump if only single 2190 FDCB04EE 01005 SET 5,(IY+4) ;Set for side 2 2194 F1 01006 CKDR3 POP AF ;Recover FDC status 2195 07 01007 CKDR3A RLCA ;Shift write prot to 7 2196 FDB603 01008 OR (IY+3) ;Merge Soft WP bit 2199 E680 01009 AND 80H ;Strip all but 7 219B 87 01010 ADD A,A ;Write prot to carry flg 01011 ; 219C 01012 CKDR4 EQU $ 219C FB 01013 EI 219D D1 01014 POP DE 219E E1 01015 POP HL 219F FDE1 01016 CKDR5 POP IY 21A1 C9 01017 RET 01018 ; 21A2 7C 01019 INDEX LD A,H ;Check countdown timer 21A3 B5 01020 OR L 21A4 2807 01021 JR Z,CKDR7 ;Err exit if 0 21A6 2B 01022 DEC HL 21A7 CDD419 01023 CALL @RSLCT ;Check for index pulse 21AA CB4F 01024 BIT 1,A ;Test index 21AC C9 01025 RET 01026 ; 21AD F1 01027 CKDR7 POP AF 21AE 3E08 01028 CKDR7A LD A,8 ;Set Device not avail 21B0 B7 01029 OR A ;Set NZ ret 21B1 18E9 01030 JR CKDR4 ;Exit 01031 ; 01032 IF @BLD631 21B3 01033 LAST EQU $ ;<631> 21B3 01034 LILBUF DS 18 ;<631> 01035 ELSE 01036 LILBUF DS 18 01037 LAST EQU $ 01038 ENDIF 01039 IFGT $,DIRBUF$ 01040 ERR 'Module too big' 01041 ENDIF 23FE 01042 ORG MAXCOR$-2 23FE B303 01043 DW LAST-SYS12 ;Overlay size 01044 ; 1E00 01045 END SYS12 1E00 is the transfer address 00000 Total errors
[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]