[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/19/99 21:44:32 FORMAT - LS-DOS 6.3 Page 00001 00001 ;FORMAT1/ASM - Format Program 00004 ; 42E0 00005 PASSWORD EQU 42E0H 0063 00006 RLS EQU 63H 000A 00007 LF EQU 10 000D 00008 CR EQU 13 3C00 00009 CRT3 EQU 3C00H F800 00010 CRT4 EQU 0F800H 00011 ; 0000 00012 *GET SVCMAC:3 ;SVC Macro equivalents 00013 ;SVCMAC/ASM - LS-DOS Version VI 00014 *LIST OFF 00406 *LIST ON 0000 00408 *GET COPYCOM:3 ;Copyright message 00409 ; COPYCOM - File for Copyright COMment block 00410 ; 0000 00411 *GET BUILDVER/ASM:3 00412 ; 00413 ; Buildver/asm is a bit of a kludge since not all utilities can load 00414 ; equates from LDOS60 and still compile. LOWCORE and everybody else 00415 ; relies on this setting, and it eventually ends up in LDOS60/EQU 00416 ; for programs that can use that. 00417 ; FFFF 00418 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B) 00419 ; These switches activate patches made since the 1B release. 00420 ; It is important that all earlier patches be enabled when a higher 00421 ; patch is enabled. 00422 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the 00423 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.) FFFF 00424 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI) FFFF 00425 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR) FFFF 00426 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT) FFFF 00427 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL) 00428 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19. FFFF 00429 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *) FFFF 00430 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY) 00431 ; 00432 ;End of BUILDVER/ASM 00433 IF @BLD631 00435 ELSE 00436 COM '<*(C) 1982,3,4,6 by LSI*>' 00437 ENDIF 00438 *LIST ON 00439 ; 2600 00440 ORG 2600H 00441 ; 00442 IF @MOD4 2600 9D 00443 BOOTST$ DB 9DH ;Boot step rate offset 00444 ENDIF 00445 IF @MOD2 00446 BOOTST$ DB 03H 00447 ENDIF 00448 ; 2601 FDCB0466 00449 GOFMT BIT 4,(IY+4) ;Jump if alien controller 2605 C2C127 00450 JP NZ,HRDRV 2608 110000 00451 FMTTBL LD DE,0 ;P/u table pointer 260B 1A 00452 LD A,(DE) ;P/u # of sectors to fmt 260C 13 00453 INC DE ;Adj for zero offset 260D 32E52A 00454 LD (SECTRK),A 2610 47 00455 LD B,A 2611 FDCB046E 00456 BIT 5,(IY+4) ;Need twice as many 2615 2801 00457 JR Z,$+3 ; if 2-sided drive 2617 07 00458 RLCA 2618 32E42A 00459 LD (SECCYL),A 261B 210000 00460 SYSPRM LD HL,0 ;P/u system info parm 261E 7C 00461 LD A,H ;Don't format if system 261F B5 00462 OR L ; info only is req 2620 C29427 00463 JP NZ,MOVFREE 2623 1A 00464 LD A,(DE) ;P/u track skew 2624 13 00465 INC DE 2625 320327 00466 LD (TRKSKEW+1),A 2628 ED53A226 00467 LD (SECSKEW+1),DE ;Format sector skew 00468 ; 00469 ; Index past sector info 00470 ; 262C 3C 00471 INC A ;Add DE -> begin of sec # 262D 80 00472 ADD A,B ;B -> # of sectors/side 262E 83 00473 ADD A,E ; A+1 -> a code byte 262F 5F 00474 LD E,A 2630 8A 00475 ADC A,D 2631 93 00476 SUB E 2632 57 00477 LD D,A 2633 210031 00478 LD HL,FORMAT ;Buffer for format data 2636 010030 00479 LD BC,HITBUF ;Tempy ptrs to trk,sect info 00480 ; 00481 ; Create the formatting data without trk,sect info 00482 ; 2639 1A 00483 FMTDAT LD A,(DE) ;P/u table format byte 263A 13 00484 INC DE ;Bump table ptr 263B FEF1 00485 CP 0F1H ;Start of cylinder? 263D 282A 00486 JR Z,CODF1 263F FEF2 00487 CP 0F2H ;Start of track trailer? 2641 282D 00488 JR Z,CODF2 2643 FEF3 00489 CP 0F3H ;Start of track ID info? 2645 2833 00490 JR Z,CODF3 2647 FEF4 00491 CP 0F4H ;End of table parms? 2649 2837 00492 JR Z,CODF4 264B FEF5 00493 CP 0F5H ;Start of data? 264D C5 00494 PUSH BC 264E 200F 00495 JR NZ,CODE1 ;Go if not 00496 ; 00497 ; Write 2 byte data pattern to format buffer 00498 ; 2650 1A 00499 LD A,(DE) ;P/u length to write 2651 13 00500 INC DE ;Bump to 1st data byte 2652 47 00501 LD B,A ;Xfer length to B 2653 1A 00502 LD A,(DE) ;P/u a data byte 2654 13 00503 INC DE ;Bump again for 2nd byte 2655 4F 00504 LD C,A ;Xfer 1st byte 2656 1A 00505 LD A,(DE) ;P/u 2nd byte 2657 71 00506 CODF5 LD (HL),C ;Stuff into buf 2658 23 00507 INC HL 2659 77 00508 LD (HL),A 265A 23 00509 INC HL 265B 10FA 00510 DJNZ CODF5 ;Loop til xfered 265D 1806 00511 JR CODRET 00512 ; 00513 ; Xfer bytes to the format buffer area 00514 ; A => count to move 00515 ; DE=> data byte to duplicate 00516 ; 265F 47 00517 CODE1 LD B,A ;Count to B 2660 1A 00518 LD A,(DE) ;P/u data byte to move 2661 77 00519 CODE1A LD (HL),A ;Fill buf with byte 2662 23 00520 INC HL 2663 10FC 00521 DJNZ CODE1A ;Loop til done 2665 C1 00522 CODRET POP BC 2666 13 00523 INC DE ;Bump table ptr 2667 18D0 00524 JR FMTDAT ;Back for more 00525 ; 00526 ; Save the current table posn and the number of 00527 ; sectors per cylinder on the stack. 00528 ; 2669 3AE52A 00529 CODF1 LD A,(SECTRK) ;P/u # of sectors/side 266C D5 00530 CODF1A PUSH DE ;Save table pointer 266D F5 00531 PUSH AF ;Save value 266E 18C9 00532 JR FMTDAT 00533 ; 00534 ; Done with a sector. Are there more on this cyl? 00535 ; 2670 F1 00536 CODF2 POP AF ;Count down the # of 2671 3D 00537 DEC A ; sectors to format 2672 2803 00538 JR Z,CODF2A ;Go if last one done 2674 D1 00539 POP DE ;Recover table ptr 2675 18F5 00540 JR CODF1A ;Loop for more 00541 ; 2677 F1 00542 CODF2A POP AF ;Clean the stack 2678 18BF 00543 JR FMTDAT ; and finish off the cyl 00544 ; 00545 ; Build a table of the location in the format buffer of 00546 ; the track and sector ID bytes, to be filled in during 00547 ; the actual formatting. 00548 ; 267A 7D 00549 CODF3 LD A,L ;Stuff pointer to where 267B 02 00550 LD (BC),A ; track & sector info 267C 03 00551 INC BC ; is to be placed 267D 7C 00552 LD A,H 267E 02 00553 LD (BC),A 267F 03 00554 INC BC 2680 18B7 00555 JR FMTDAT 00556 ; 00557 ; Finished building format cyl info. Terminate the ID table 00558 ; with an extra 256 bytes in case of overrun. 00559 ; 2682 ED536527 00560 CODF4 LD (VERSKEW+1),DE ;Table posn of verify order 2686 AF 00561 XOR A ;Stuff two X'00's to 2687 02 00562 LD (BC),A ; indicate the end 2688 03 00563 INC BC ; of the ID posn table 2689 02 00564 LD (BC),A 268A 0600 00565 LD B,0 ;Stuff 256 FF's into the 268C 3EFF 00566 LD A,0FFH ; format buffer 268E 77 00567 LD (HL),A 268F 23 00568 INC HL 2690 10FC 00569 DJNZ $-2 00570 ; 00571 ; Begin the formatting 00572 ; 2692 00573 @@DSPLY FMTCYL$ ;"formatting clinder... 00574 IFEQ 01H,1 2692+21352C 00575 LD HL,FMTCYL$ 00576 ENDIF 2695+3E0A 00577 LD A,10 2697+EF 00578 RST 40 2698 FD7E05 00579 BGNFMT LD A,(IY+5) ;P/u cylinder position 269B CD4C2A 00580 CALL CVDEC ;Cvrt to decimal 269E CD852A 00581 CALL DSPCYL 26A1 010000 00582 SECSKEW LD BC,0 ;Begin of sector table 26A4 210030 00583 BFMT1 LD HL,HITBUF ;P/u ptr to ID posn table 00584 ; 00585 BFMT2 26A7 00586 @@CKBRKC ;Check for break 26A7+3E6A 00587 LD A,106 26A9+EF 00588 RST 40 26AA C2BC29 00589 JP NZ,BREAK ;Go if so 00590 ; 26AD 5E 00591 LD E,(HL) ;P/u positions having 26AE 23 00592 INC HL ; sector & cylinder 26AF 56 00593 LD D,(HL) ; info to be stuffed 26B0 23 00594 INC HL ; into format data 26B1 7A 00595 LD A,D ;Finished? 26B2 B3 00596 OR E 26B3 2820 00597 JR Z,BFMT4 26B5 FD7E05 00598 LD A,(IY+5) ;P/u cylinder # & stuff 26B8 12 00599 LD (DE),A ; into format data 26B9 13 00600 INC DE 26BA FD7E03 00601 LD A,(IY+3) ;Stuff the side-select 26BD E610 00602 AND 10H ; bit 26BF 0F 00603 RRCA 26C0 0F 00604 RRCA 26C1 0F 00605 RRCA 26C2 0F 00606 RRCA 26C3 12 00607 LD (DE),A ; into the format data 26C4 13 00608 INC DE 26C5 0A 00609 LD A,(BC) ;P/u the sector number 26C6 B7 00610 OR A 26C7 F2CF26 00611 JP P,BFMT3 ;Go if a good number 26CA 81 00612 ADD A,C ; else off the end, 26CB 4F 00613 LD C,A ; calculate the beginning 26CC 3801 00614 JR C,BFMT3 ; of the sector table 26CE 05 00615 DEC B 26CF 0A 00616 BFMT3 LD A,(BC) ;P/u the next sector # 26D0 12 00617 LD (DE),A ; and stuff in format data 26D1 13 00618 INC DE 26D2 03 00619 INC BC 26D3 18D2 00620 JR BFMT2 ;Loop until cylinder done 00621 ; 26D5 ED43A226 00622 BFMT4 LD (SECSKEW+1),BC ;Save end of sector table 26D9 FD5605 00623 LD D,(IY+5) ;P/u current cylinder 26DC 210031 00624 LD HL,FORMAT ;Pt to format data 26DF CDFF29 00625 CALL SELECT ;Drive select 26E2 C2A829 00626 JP NZ,IOERR ;Go on error 26E5 CD0F2A 00627 CALL WRCYL ;Cylinder write 26E8 C2A829 00628 JP NZ,IOERR 26EB FDCB046E 00629 BIT 5,(IY+4) ;Double sided? 26EF 280D 00630 JR Z,BFMT5 26F1 FDCB0366 00631 BIT 4,(IY+3) ;Flip bit for 2nd side 26F5 2007 00632 JR NZ,BFMT5 ; if not already on it, 26F7 FDCB03E6 00633 SET 4,(IY+3) ; else go to next 26FB 03 00634 INC BC ;Bump to start side 2 26FC 18A6 00635 JR BFMT1 ; at different sector # 26FE FDCB03A6 00636 BFMT5 RES 4,(IY+3) ;Turn off side 2 2702 3E00 00637 TRKSKEW LD A,0 ;P/u the track skew byte 2704 81 00638 ADD A,C ;Repoint to beginning 2705 4F 00639 LD C,A ; of sector table 2706 88 00640 ADC A,B ;Skew start of next track 2707 91 00641 SUB C 2708 47 00642 LD B,A 2709 ED43A226 00643 LD (SECSKEW+1),BC 270D FD7E05 00644 LD A,(IY+5) ;Finished? 2710 FDBE06 00645 CP (IY+6) 2713 2820 00646 JR Z,BGNVER ;Begin verify if so 2715 014200 00647 LD BC,1000/15 ;Approx 1 ms pause 2718 00648 @@PAUSE ; before STEPIN 2718+3E10 00649 LD A,16 271A+EF 00650 RST 40 271B CD072A 00651 CALL STEPIN ;Step in 271E C2A829 00652 JP NZ,IOERR ;Go on error 2721 019826 00653 LD BC,BGNFMT ;Place RET addr on stack 2724 CD0B2A 00654 CKWAIT CALL RSELCT ;Wait for idle FDC 2727 C2A829 00655 JP NZ,IOERR ;Go on error 272A C5 00656 PUSH BC ;Save RET addr 00657 ; 00658 ; WAIT parameter for time delay after STEPIN 00659 ; 272B 01C800 00660 WAITPRM LD BC,3000/15 ;Approx 3 ms delay 272E 78 00661 LD A,B ; after STEPIN 272F B1 00662 OR C 2730 C8 00663 RET Z ;Do next track if no wait 2731 00664 @@PAUSE ; else wait for count 2731+3E10 00665 LD A,16 2733+EF 00666 RST 40 2734 C9 00667 RET 00668 ; 00669 ; Begin the verification process 00670 ; 2735 0E0D 00671 BGNVER LD C,CR ;Posn to next dsply line 2737 00672 @@DSP 2737+3E02 00673 LD A,2 2739+EF 00674 RST 40 273A CD032A 00675 CALL RESTOR ;Restore to cyl 0 273D 206A 00676 JR NZ,BVER9 ;Go on error 273F 00677 @@DSPLY VERCYL$ ;"verifying cylinder... 00678 IFEQ 01H,1 273F+214D2C 00679 LD HL,VERCYL$ 00680 ENDIF 2742+3E0A 00681 LD A,10 2744+EF 00682 RST 40 2745 1600 00683 LD D,0 ;Init track count 00684 BVER1 2747 00685 @@CKBRKC ;Check for break 2747+3E6A 00686 LD A,106 2749+EF 00687 RST 40 274A C2BC29 00688 JP NZ,BREAK ; and abort if so 00689 ; 274D 6A 00690 LD L,D ;Pt to GAT byte for this 274E 262E 00691 LD H,GATBUF<-8 ; track & bypass verify 2750 7E 00692 LD A,(HL) ; if track not formatted 2751 3C 00693 INC A 2752 2836 00694 JR Z,BVER8 00695 ; 2754 7A 00696 LD A,D 2755 CD4C2A 00697 CALL CVDEC ;Convert cyl # to ASCII 2758 D5 00698 PUSH DE 2759 CD852A 00699 CALL DSPCYL ;Display the current cyl 275C D1 00700 POP DE 275D AF 00701 XOR A ;Initialize starting sector 275E 327227 00702 LD (BVER5+1),A 2761 326927 00703 LD (BVER4+1),A 2764 010000 00704 VERSKEW LD BC,0 ;P/u start of sector tbl 2767 0A 00705 BVER3 LD A,(BC) ;P/u sector # 2768 C600 00706 BVER4 ADD A,0 ;Add in a side's sectors 276A 5F 00707 LD E,A ; if on side 2 276B CD232A 00708 CALL VERSEC ;Sector verify 276E 2039 00709 JR NZ,BVER9 ;Go on error 2770 03 00710 INC BC ;Bump sector table ptr 2771 3E00 00711 BVER5 LD A,0 ;P/u sector # 2773 3C 00712 INC A ;Bump it up 2774 327227 00713 LD (BVER5+1),A ; and save new # 2777 5F 00714 LD E,A ;Xfer to sector register 2778 3AE42A 00715 LD A,(SECCYL) ;Is this = a cyl? 277B BB 00716 CP E 277C 280C 00717 JR Z,BVER8 ;Go if cyl done 277E 3AE52A 00718 LD A,(SECTRK) ;Is this a track's worth? 2781 BB 00719 CP E 2782 20E3 00720 JR NZ,BVER3 ;Loop if not 2784 326927 00721 LD (BVER4+1),A ;Update the add for side2 2787 03 00722 INC BC 2788 18DA 00723 JR VERSKEW 00724 ; 00725 ; Readjust for end of cylinder 00726 ; 278A 7A 00727 BVER8 LD A,D ;P/u current cyl position 278B 14 00728 INC D ;Bump to next cyl 278C FDBE06 00729 CP (IY+6) ;Cp to highest # cyl 278F 014727 00730 LD BC,BVER1 ;Go if more to verify 2792 2090 00731 JR NZ,CKWAIT ; after checking WAIT 00732 ; 00733 ; Shift the FREE table to LOCKOUT table 00734 ; 2794 21002E 00735 MOVFREE LD HL,GATBUF ;Ptr to allocation info 2797 11602E 00736 LD DE,GATBUF+60H ;Lockout table 279A 0600 00737 LD B,0 279C FD4E06 00738 LD C,(IY+6) ;P/u hi cyl 279F 0C 00739 INC C ;Offset from 0 27A0 EDB0 00740 LDIR ;Shift info to the lockout tbl 27A2 0E0D 00741 LD C,CR ;Print a newline 27A4 00742 @@DSP 27A4+3E02 00743 LD A,2 27A6+EF 00744 RST 40 27A7 185D 00745 JR CALCDIR ;Go finish DIR init 00746 ; 00747 ; Got verify error 00748 ; 27A9 FE05 00749 BVER9 CP 5 ;Data rec not found? 27AB 2805 00750 JR Z,BVER10 27AD FE04 00751 CP 4 ;Parity error? 27AF C2A829 00752 JP NZ,IOERR ;Quit on any other 27B2 D5 00753 BVER10 PUSH DE 27B3 00754 @@DSPLY STAR$ ;Show the * lockout 00755 IFEQ 01H,1 27B3+21652C 00756 LD HL,STAR$ 00757 ENDIF 27B6+3E0A 00758 LD A,10 27B8+EF 00759 RST 40 27B9 D1 00760 POP DE 27BA 6A 00761 LD L,D ;Pt to this cyl 27BB 262E 00762 LD H,GATBUF<-8 ; in the GAT 27BD 36FF 00763 LD (HL),0FFH ;Lockout this cylinder 27BF 18C9 00764 JR BVER8 ;Continue verifying 00765 ; 00766 ; Hard drive format - most work done by controller 00767 ; 27C1 216539 00768 HRDRV LD HL,LASTMSG ;Give one last chance to 27C4 FDCB035E 00769 BIT 3,(IY+3) ; abort before wiping 27C8 2809 00770 JR Z,AFLOP ; disk unless floppy 27CA CD592A 00771 CALL GET3 ;Is hard, get response 27CD 7E 00772 LD A,(HL) ;P/u 1st char of resp 27CE FE59 00773 CP 'Y' ;Must be yes to continue 27D0 C2BC29 00774 JP NZ,FMTABT 27D3 3A1C26 00775 AFLOP LD A,(SYSPRM+1) ;Bypass the formatting 27D6 B7 00776 OR A ; if system info only 27D7 200C 00777 JR NZ,HRDRV1 27D9 00778 @@DSPLY FMTG$ ;"formatting - be patient 00779 IFEQ 01H,1 27D9+216A2C 00780 LD HL,FMTG$ 00781 ENDIF 27DC+3E0A 00782 LD A,10 27DE+EF 00783 RST 40 27DF CD132A 00784 CALL FMTHD ;Format hard drive 27E2 C2A829 00785 JP NZ,IOERR 27E5 FD7E07 00786 HRDRV1 LD A,(IY+7) ;# of sectors/gran 27E8 57 00787 LD D,A ;-> reg E 27E9 E61F 00788 AND 1FH 27EB 5F 00789 LD E,A 27EC 1C 00790 INC E ;Bump for 0 offset 27ED AA 00791 XOR D 27EE 07 00792 RLCA ;Get # of heads 27EF 07 00793 RLCA ;Into reg D 27F0 07 00794 RLCA 27F1 3C 00795 INC A ;Adjust for zero offset 27F2 4F 00796 LD C,A 27F3 00797 @@MUL8 ;Multiply E x C 27F3+3E5A 00798 LD A,90 27F5+EF 00799 RST 40 27F6 FDCB046E 00800 BIT 5,(IY+4) ;2-sided? 27FA 2801 00801 JR Z,$+3 27FC 87 00802 ADD A,A ;Twice the number 27FD 32E42A 00803 LD (SECCYL),A 2800 FDCB035E 00804 BIT 3,(IY+3) ;Floppy? 2804 288E 00805 JR Z,MOVFREE ;Form lock table instead 00806 ; 00807 ; Routine to calculate the directory cylinder 00808 ; 2806 CD032A 00809 CALCDIR CALL RESTOR ;Step in 2809 C2A829 00810 JP NZ,IOERR ;Go on error 280C 262E 00811 LD H,GATBUF<-8 280E FD6E06 00812 LD L,(IY+6) ;P/u highest # cylinder 2811 010000 00813 DIRPARM LD BC,0000 ;P/U 'DIR=' parm 2814 79 00814 LD A,C ;Check if entered 2815 B0 00815 OR B 2816 2806 00816 JR Z,NODIR ;Calc one if not entered 2818 BD 00817 CP L ;Entered so check if 2819 3003 00818 JR NC,NODIR ; within cylinders 281B 6F 00819 LD L,A ;Is ok, use it 281C 1803 00820 JR DIRSET 281E 2C 00821 NODIR INC L ;Adj for zero offset 281F CB3D 00822 SRL L ;Divide by 2 to find 2821 0E00 00823 DIRSET LD C,0 ; disk midpoint 00824 ; 00825 ; Perform expanding binary search to find 00826 ; A cylinder available for the directory 00827 ; 2823 7E 00828 CALC1 LD A,(HL) ;Is this cylinder 2824 3C 00829 INC A ;Available or locked out? 2825 2019 00830 JR NZ,GENSYS ;Bypass if available 2827 0C 00831 INC C ;Bump C 2828 79 00832 LD A,C 2829 0F 00833 RRCA ;Test if odd or even 282A 7D 00834 LD A,L ;Get current test pos 282B 3009 00835 JR NC,CALC2 ;Jump if C was even 282D 81 00836 ADD A,C ;Add to previous pos 282E 6F 00837 LD L,A 282F FDBE06 00838 CP (IY+6) ;Go over the top? 2832 20EF 00839 JR NZ,CALC1 ;Loop if not 2834 1804 00840 JR CALC3 ;Else abort 2836 91 00841 CALC2 SUB C ;Try a lower cylinder # 2837 6F 00842 LD L,A 2838 20E9 00843 JR NZ,CALC1 ;At cylinder 0? 283A 21782C 00844 CALC3 LD HL,NOCYL$ ;"no dir space avail... 283D C3BC29 00845 JP FMTABT 00846 ; 00847 ; Generate the system initialization 00848 ; 2840 FD7509 00849 GENSYS LD (IY+9),L ;Stuff the dir cyl 2843 7D 00850 LD A,L 2844 CD4C2A 00851 CALL CVDEC ;Cvrt reg A to 2 dec digs 2847 ED43C22C 00852 LD (DIRASC$),BC ;Stuff into the message 284B 00853 @@DSPLY DIRCYL$ ;"dir will be placed... 00854 IFEQ 01H,1 284B+219D2C 00855 LD HL,DIRCYL$ 00856 ENDIF 284E+3E0A 00857 LD A,10 2850+EF 00858 RST 40 2851 00859 @@DSPLY IPLSYS$ ;"initializing... 00860 IFEQ 01H,1 2851+21C52C 00861 LD HL,IPLSYS$ 00862 ENDIF 2854+3E0A 00863 LD A,10 2856+EF 00864 RST 40 2857 21002E 00865 LD HL,GATBUF 285A 7E 00866 LD A,(HL) ;P/u GAT byte for 1st 285B F601 00867 OR 1 ; cylinder & show 1st 285D 77 00868 LD (HL),A ; gran in use for BOOTs 285E FD7E09 00869 LD A,(IY+9) ;Dir cyl # into DIR/SYS 2861 32CF2A 00870 LD (DIRDIR+16H),A 2864 6F 00871 LD L,A ;Show entire directory 2865 36FF 00872 LD (HL),0FFH ; cylinder used 00873 ; 00874 ; Update BOOT for DIR & step rate 00875 ; 2867 FD7E09 00876 LD A,(IY+9) ;Dir cyl into BOOT 286A 32022F 00877 LD (BOOT+2),A 286D 3A0026 00878 LD A,(BOOTST$) ;P/u offset 2870 6F 00879 LD L,A 2871 262F 00880 LD H,BOOT<-8 2873 3AE32A 00881 LD A,(STEPDFT) ;P/u boot step rate 00882 IF @MOD2 00883 OR 80H ;Create single byte opcod 00884 ENDIF 2876 77 00885 LD (HL),A ; & set into BOOT 2877 110000 00886 LD DE,0 ;Init for cyl 0, sect 0 287A CD232A 00887 CALL VERSEC ;Test if formatted 287D 21312D 00888 LD HL,NOTFMT$ ;"Can't, not formatted 2880 C2BF29 00889 JP NZ,EXTERR ;Error if not 2883 21002F 00890 LD HL,BOOT ;Pt to Data disk BOOT 2886 CD172A 00891 CALL WRSEC ; & write it 2889 CC402A 00892 CALL Z,WRDIR1 ;Verify after write 288C C2A829 00893 JP NZ,IOERR ; & display '.' 288F 110100 00894 LD DE,1 ;Pt to cyl 0, sector 1 2892 21002F 00895 LD HL,BOOT ;Pt to the sector 1 boot 2895 CD172A 00896 CALL WRSEC ;Write 0/1 2898 CC402A 00897 CALL Z,WRDIR+3 ;Verify after write 289B C2A829 00898 JP NZ,IOERR 00899 ; 00900 ; Complete GAT construction 00901 ; 289E FD7E06 00902 LD A,(IY+6) ;P/u highest # cylinder 28A1 D622 00903 SUB 22H ; & adj offset from 34 28A3 32CC2E 00904 LD (GATBUF+0CCH),A ;Stuff GAT cyl excess 28A6 FD7E04 00905 LD A,(IY+4) ;P/u # of sides 28A9 E6A0 00906 AND 80H+20H 28AB 47 00907 LD B,A ;Save tempy in B 28AC FD7E03 00908 LD A,(IY+3) ;P/u density 28AF E640 00909 AND 40H ;Mask it, 28B1 B0 00910 OR B ; merge in sides 28B2 47 00911 LD B,A ; and save it 28B3 FD7E08 00912 LD A,(IY+8) ;P/u # of grans/cyl 28B6 07 00913 RLCA 28B7 07 00914 RLCA ; to bits 0-2 28B8 07 00915 RLCA 28B9 E607 00916 AND 7 ;Mask it 28BB 325529 00917 LD (CYLGRN+1),A 28BE B0 00918 OR B ;Merge the two 28BF F688 00919 OR 88H ;Data disk, new date style 28C1 32CD2E 00920 LD (GATBUF+0CDH),A ;Stuff into GAT 00921 ; 28C4 11F52E 00922 LD DE,GATBUF+255-10 ;6.2 Media Data Block 28C7 21DB28 00923 LD HL,LSIID ;Point to header 28CA 010400 00924 LD BC,04 ;Set length & 28CD EDB0 00925 LDIR ; move it 28CF FDE5 00926 PUSH IY ;Get DCT address 28D1 E1 00927 POP HL ; into HL 28D2 23 00928 INC HL ;Bypass the driver vector 28D3 23 00929 INC HL 28D4 23 00930 INC HL 28D5 0E07 00931 LD C,7 ;Bytes to move 28D7 EDB0 00932 LDIR 28D9 1804 00933 JR WRGAT1 ;Skip around string 00934 IF @BLD631 28DB 03 00935 LSIID DB 03,'631' ;<631> 36 33 31 00936 ELSE 00937 LSIID DB 03,'LSI' 00938 ENDIF 00939 ; 00940 ; Write copy of GAT into 0/3 00941 ; 00942 WRGAT1 28DF 21002E 00943 LD HL,GATBUF ;Pt to GAT buffer 28E2 1600 00944 LD D,0 ;Write it out to 28E4 1E03 00945 LD E,3 ;Cyl 0, sector 3 28E6 CD172A 00946 CALL WRSEC ;Write 0/3 28E9 CC402A 00947 CALL Z,WRDIR1 ;Verify after write 28EC C2A829 00948 JP NZ,IOERR ;Quit on error 00949 ; 00950 ; Write the system information sector 00951 ; 28EF 210030 00952 LD HL,HITBUF ;Zero out buffer 28F2 3600 00953 GSYS1 LD (HL),0 28F4 2C 00954 INC L 28F5 20FB 00955 JR NZ,GSYS1 00956 IF @BLD631 00957 ELSE 00958 LD HL,HITBUF ;Set first byte to OSVER 00959 ENDIF 28F7 3663 00960 LD (HL),RLS ; for release number 28F9 2E20 00961 LD L,20H ;Point hl to AUTO buffer 28FB 360D 00962 LD (HL),0DH ;Put in terminator 28FD 110200 00963 LD DE,2 ;Pt to cyl 0, sector 2 2900 6A 00964 LD L,D ;Hl now points to HITBUF 2901 CD172A 00965 CALL WRSEC ;Write 0/2 2904 CC402A 00966 CALL Z,WRDIR1 ;Verify after write 00967 IF @BLD631 00968 ELSE 00969 JP NZ,IOERR ;Quit on error 00970 ENDIF 2907 2E20 00971 LD L,20H ;Zero this out for use 2909 3600 00972 LD (HL),0 ; when writing HIT 00973 ; 00974 ; Write out the directory GAT 00975 ; 290B 21002E 00976 LD HL,GATBUF ;Pt to GAT sector buffer 290E FD5609 00977 LD D,(IY+9) ;P/u the dir cyl 2911 5D 00978 LD E,L ;Denote sector 0 00979 IF @BLD631 2912 CC3D2A 00980 CALL Z,WRDIR ;<631>Write the GAT 00981 ELSE 00982 CALL WRDIR ;Write the GAT 00983 JP NZ,IOERR 00984 ENDIF 00985 ; 00986 ; Construct the HIT 00987 ; 2915 210030 00988 LD HL,HITBUF ;Point to the HIT buffer 2918 36A2 00989 LD (HL),0A2H ;Stuff BOOT/SYS hash code 291A 23 00990 INC HL 291B 36C4 00991 LD (HL),0C4H ;Stuff DIR/SYS hash code 291D 2B 00992 DEC HL 291E FD5609 00993 LD D,(IY+9) ;P/u dir cyl # 2921 1E01 00994 LD E,1 ;Pt to sector 1 2923 CD3D2A 00995 CALL WRDIR ;Write the HIT 2926 C2A829 00996 JP NZ,IOERR 2929 110030 00997 LD DE,HITBUF ;Establish buffer for 292C 21992A 00998 LD HL,BOOTDIR ; dir records 292F 012000 00999 LD BC,32 ;Move BOOT/SYS dir record 2932 EDB0 01000 LDIR ; into 1st slot 2934 FD5609 01001 LD D,(IY+9) ;P/u dir cyl 2937 1E02 01002 LD E,2 ;This will be sector 2 2939 210030 01003 LD HL,HITBUF ;Pt to buffer start 293C CD3D2A 01004 CALL WRDIR ;Write the sector 293F C2A829 01005 JP NZ,IOERR 2942 3AE42A 01006 LD A,(SECCYL) ;P/u # of records 01007 IF @BLD631 01008 ELSE 01009 LD (DIRDIR+14H),A ; & stuff into DIR/SYS 01010 ENDIF 2945 B7 01011 OR A ;Are recs=256? 01012 IF @BLD631 2946 2804 01013 JR Z,L294C ;<631> 2948 FE23 01014 CP '#' ;<631> 294A 3802 01015 JR C,L294E ;<631> 294C 3E22 01016 L294C: LD A,22H ;<631> 294E 21E42A 01017 L294E: LD HL,SECCYL ;<631> 2951 32CD2A 01018 LD (DIRDIR+14H),A ;<631> set lsb of ERN 01019 ELSE 01020 JR NZ,CYLGRN ;Go if not 01021 INC A 01022 LD (DIRDIR+15H),A ; else stuff msb of ERN 01023 ENDIF 2954 3E00 01024 CYLGRN LD A,0 ;P/u # grans/cyl 2956 FDCB046E 01025 BIT 5,(IY+4) ;Test 2-sided 295A 2802 01026 JR Z,$+4 295C 87 01027 ADD A,A ;Double count on 2-sided 295D 3C 01028 INC A ;Plus 1 for 0 offset adj 295E 32D02A 01029 LD (DIRDIR+17H),A ;Stuf in DIR/SYS 2961 FD7E09 01030 LD A,(IY+9) ;P/u the dir cyl # & 2964 32CF2A 01031 LD (DIRDIR+16H),A ; stuff into the DIR rec 2967 21B92A 01032 LD HL,DIRDIR ;Pt to start of DIR data 296A 110030 01033 LD DE,HITBUF ;Pt to start of dir buf 296D 012000 01034 LD BC,32 ;Move DIR/SYS into buf 2970 EDB0 01035 LDIR 2972 FD5609 01036 LD D,(IY+9) ;P/u dir cyl # 2975 1E03 01037 LD E,3 ;Write as sector 3 2977 210030 01038 LD HL,HITBUF ;Pt to start of buffer 297A CD3D2A 01039 CALL WRDIR ;Write the sector 297D 2029 01040 JR NZ,IOERR 297F 210030 01041 LD HL,HITBUF ;Zero the 1st 32 bytes 2982 0620 01042 LD B,32 ; of the buffer to clear 2984 3600 01043 GSYS2 LD (HL),0 ;Where we stuffed the 2986 23 01044 INC HL ; BOOT & DIR dir records 2987 10FB 01045 DJNZ GSYS2 2989 FD5609 01046 LD D,(IY+9) ;P/u dir cyl # 298C 1E04 01047 LD E,4 ;Cont writing at sect 4 298E 210030 01048 GSYS3 LD HL,HITBUF ;Pt to start of buffer 2991 CD3D2A 01049 CALL WRDIR ;Write the sector 2994 2012 01050 JR NZ,IOERR 01051 ; 01052 ; Write the remaining directory 01053 ; 2996 1C 01054 INC E ;Bump the sector pointer 2997 3AE42A 01055 LD A,(SECCYL) ;P/u highest # sector 299A BB 01056 CP E ;Are we finished yet? 299B 20F1 01057 JR NZ,GSYS3 ;Loop if not 299D CDE529 01058 CALL EXIT2 ;Get system disk 29A0 01059 @@DSPLY FMTCAO$ ;"formatting complete... 01060 IFEQ 01H,1 29A0+210A2D 01061 LD HL,FMTCAO$ 01062 ENDIF 29A3+3E0A 01063 LD A,10 29A5+EF 01064 RST 40 29A6 1823 01065 JR EXIT 01066 ; 01067 ; Exit procedures 01068 ; 29A8 F5 01069 IOERR PUSH AF ;Save errcod 29A9 CDE529 01070 CALL EXIT2 ;Interrupts on if needed 29AC F1 01071 POP AF ;Rcvr errcod 29AD FE3F 01072 CP 63 ;Extended errror? 29AF 280E 01073 JR Z,EXTERR ;Go if so 29B1 6F 01074 LD L,A ;Error code to HL 29B2 2600 01075 LD H,0 29B4 F6C0 01076 OR 0C0H ;Mask to ABORT with brief 29B6 4F 01077 LD C,A ;Error code to C 29B7 01078 @@ERROR ; for error display 29B7+3E1A 01079 LD A,26 29B9+EF 01080 RST 40 29BA 180C 01081 JR ERREXIT 01082 ; 29BC 01083 BREAK EQU $ 29BC 21202D 01084 FMTABT LD HL,FMTABT$ ;"Command aborted 29BF 01085 EXTERR @@LOGOT ;Some error to abort job 01086 IFEQ 00H,1 01087 LD HL, 01088 ENDIF 29BF+3E0C 01089 LD A,12 29C1+EF 01090 RST 40 29C2 CDE529 01091 CALL EXIT2 ;Get system disk 29C5 21FFFF 01092 LD HL,-1 ;Set abort code 29C8 22CC29 01093 ERREXIT LD (RETCOD),HL 29CB 210000 01094 EXIT LD HL,0 ;Init to no error 29CC 01095 RETCOD EQU $-2 29CE E5 01096 PUSH HL 29CF FDE5 01097 PUSH IY ;Transfer the saved 29D1 D1 01098 POP DE ; system DCT back 29D2 21D92A 01099 LD HL,SYSDCT ; into the system 29D5 010A00 01100 LD BC,10 ; DCT slot 29D8 EDB0 01101 LDIR 29DA CD032A 01102 CALL RESTOR ;Match DCT and drive 29DD E1 01103 POP HL 29DE 310000 01104 SPSAV LD SP,$-$ ;P/u the stack pointer 29E1 01105 @@CKBRKC ;Clear break bit 29E1+3E6A 01106 LD A,106 29E3+EF 01107 RST 40 29E4 C9 01108 RET ; & exit to caller 01109 ; 29E5 3A272A 01110 EXIT2 LD A,(FMTDRV+1) ;P/u drive # just fmtd 29E8 3C 01111 INC A ;If drive never entered, 29E9 C8 01112 RET Z ; just return 29EA 3D 01113 DEC A ;If 0, we need a system 29EB 200D 01114 JR NZ,EXIT4 29ED 21EB2C 01115 LD HL,PMTSYS$ ;"load system disk... 29F0 01116 @@DSPLY 01117 IFEQ 00H,1 01118 LD HL, 01119 ENDIF 29F0+3E0A 01120 LD A,10 29F2+EF 01121 RST 40 29F3 01122 EXIT3 @@KEY ;Request a key 29F3+3E01 01123 LD A,1 29F5+EF 01124 RST 40 29F6 FE0D 01125 CP CR ;Must be29F8 20F9 01126 JR NZ,EXIT3 29FA 1807 01127 EXIT4 JR RESTOR ;Restore disk to cyl 0 01128 ; 01129 ; Disk I/O requests 01130 ; 01131 IF @BLD631 29FC AF 01132 DRVNOP: XOR A ;<631> 29FD 1826 01133 JR SAVBC ;<631> 29FF 3E01 01134 SELECT: LD A,1 ;<631> 2A01 1822 01135 JR SAVBC ;<631> 2A03 3E04 01136 RESTOR: LD A,4 ;<631> 2A05 181E 01137 JR SAVBC ;<631> 2A07 3E05 01138 STEPIN: LD A,5 ;<631> 2A09 181A 01139 JR SAVBC ;<631> 2A0B 3E07 01140 RSELCT: LD A,7 ;<631> 2A0D 1816 01141 JR SAVBC ;<631> 2A0F 3E0F 01142 WRCYL: LD A,15 ;<631> 2A11 1812 01143 JR SAVBC ;<631> 2A13 3E0C 01144 FMTHD: LD A,12 ;<631> 2A15 180E 01145 JR SAVBC ;<631> 2A17 3E0D 01146 WRSEC: LD A,13 ;<631> 2A19 180A 01147 JR SAVBC ;<631> 2A1B 3E0E 01148 WRSYS: LD A,14 ;<631> 2A1D 1806 01149 JR SAVBC ;<631> 2A1F 3E09 01150 RDSEC: LD A,9 ;<631> 2A21 1802 01151 JR SAVBC ;<631> 2A23 3E0A 01152 VERSEC: LD A,10 ;<631> 2A25 C5 01153 SAVBC: PUSH BC ;<631> 2A26 0EFF 01154 FMTDRV: LD C,-1 ;<631>P/u drive # 01155 ELSE 01156 DRVNOP PUSH BC 01157 XOR A 01158 JR FMTDRV 01159 SELECT PUSH BC 01160 LD A,1 01161 JR FMTDRV 01162 RESTOR PUSH BC 01163 LD A,4 01164 JR FMTDRV 01165 STEPIN PUSH BC 01166 LD A,5 01167 JR FMTDRV 01168 RSELCT PUSH BC 01169 LD A,7 01170 JR FMTDRV 01171 WRCYL PUSH BC 01172 LD A,15 01173 JR FMTDRV 01174 FMTHD PUSH BC 01175 LD A,12 01176 JR FMTDRV 01177 WRSEC PUSH BC 01178 LD A,13 01179 JR FMTDRV 01180 WRSYS PUSH BC 01181 LD A,14 01182 JR FMTDRV 01183 RDSEC PUSH BC 01184 LD A,9 01185 JR FMTDRV 01186 VERSEC PUSH BC 01187 LD A,10 01188 FMTDRV LD C,-1 ;P/u drive # 01189 ENDIF 2A28 C628 01190 ADD A,40 ;Adjust SVC # 2A2A EF 01191 RST 40 2A2B C1 01192 POP BC 2A2C C9 01193 RET 01194 ; 01195 ; Perform a verification to ensure system sector 01196 ; 2A2D CD232A 01197 VERSYS CALL VERSEC ;Sector verify 2A30 2806 01198 JR Z,VERS1 ;Bypass if not system 2A32 D606 01199 SUB 6 ;Test read system retcod 2A34 C8 01200 RET Z ;Go if that's what it was 2A35 C606 01201 ADD A,6 ;Restore orig retcod 2A37 C9 01202 RET 2A38 F601 01203 VERS1 OR 1 ;S/b system, found data 2A3A 3E00 01204 LD A,0 2A3C C9 01205 RET 01206 ; 2A3D CD1B2A 01207 WRDIR CALL WRSYS ;Write the DIR sector 2A40 C42D2A 01208 WRDIR1 CALL NZ,VERSYS ;Verify after write 2A43 C0 01209 RET NZ 2A44 D5 01210 PUSH DE 2A45 0E2E 01211 LD C,'.' ;Display a period 2A47 01212 @@DSP ; for every sector written 2A47+3E02 01213 LD A,2 2A49+EF 01214 RST 40 2A4A D1 01215 POP DE 2A4B C9 01216 RET 01217 ; 01218 ; Routine to convert reg A to 2 decimal digits 01219 ; 2A4C 0E30 01220 CVDEC LD C,30H ;Init msd to 0 2A4E D60A 01221 CVD1 SUB 10 ;Sub 10 until underflow 2A50 3803 01222 JR C,CVD2 2A52 0C 01223 INC C ;Inc the count 2A53 18F9 01224 JR CVD1 2A55 C63A 01225 CVD2 ADD A,3AH ;Add back 10 + '0' 2A57 47 01226 LD B,A ;Lsd to B 2A58 C9 01227 RET 01228 ; 01229 ; Routines to convert input strings to UC 01230 ; HL => Prompt string 01231 ; 2A59 01232 GET3 @@DSPLY ;Display the prompt 01233 IFEQ 00H,1 01234 LD HL, 01235 ENDIF 2A59+3E0A 01236 LD A,10 2A5B+EF 01237 RST 40 2A5C 010003 01238 LD BC,3<8 ;Init 3 keys max 2A5F 1803 01239 JR $+5 2A61 010008 01240 GET8 LD BC,8<8 ;8-chars max 2A64 210030 01241 LD HL,HITBUF ;Buffer area 2A67 01242 GET8A @@KEYIN ;Enter them 2A67+3E09 01243 LD A,9 2A69+EF 01244 RST 40 2A6A DABC29 01245 JP C,FMTABT ;Quit on Break 2A6D 78 01246 LD A,B ;Get length of response 2A6E B7 01247 OR A 2A6F C8 01248 RET Z ;Back if Enter only 01249 ; 01250 ; Routine to convert n-character string to UC 01251 ; 2A70 F5 01252 PUSH AF ;Save the registers 2A71 C5 01253 PUSH BC 2A72 E5 01254 PUSH HL 2A73 7E 01255 GETUC LD A,(HL) ;P/u a char 2A74 FE61 01256 CP 'a' ;Skip if below 'a' 2A76 3806 01257 JR C,GETUC1 2A78 FE7B 01258 CP 'z'+1 ; or above 'z' 2A7A 3002 01259 JR NC,GETUC1 2A7C CBAE 01260 RES 5,(HL) ; else convert to UC 2A7E 23 01261 GETUC1 INC HL ;Bump the buffer ptr 2A7F 10F2 01262 DJNZ GETUC ;Loop thru all chars 2A81 E1 01263 POP HL 2A82 C1 01264 POP BC 2A83 F1 01265 POP AF 2A84 C9 01266 RET 01267 ; 01268 ; Routine to display the cylinder number 01269 ; 2A85 C5 01270 DSPCYL PUSH BC ;Save ASCII cylinder # 2A86 0E08 01271 LD C,8 ;Back up twice & 2A88 01272 @@DSP ; output new position 2A88+3E02 01273 LD A,2 2A8A+EF 01274 RST 40 2A8B 0E08 01275 LD C,8 2A8D 01276 @@DSP 2A8D+3E02 01277 LD A,2 2A8F+EF 01278 RST 40 2A90 C1 01279 POP BC ;Recover cyl # 2A91 01280 @@DSP ;Send MSD 2A91+3E02 01281 LD A,2 2A93+EF 01282 RST 40 2A94 48 01283 LD C,B 2A95 01284 @@DSP ;Send LSD 2A95+3E02 01285 LD A,2 2A97+EF 01286 RST 40 2A98 C9 01287 RET 01288 ; 01289 ; Formatting data and tables 01290 ; 01291 IF @BLD631 2A99 5E 01292 BOOTDIR DB 5EH,0,0,0,0,'BOOT SYS',0F4H,71H ;<631> 00 00 00 00 42 4F 4F 54 20 20 20 20 53 59 53 F4 71 01293 ELSE 01294 BOOTDIR DB 5EH,0,0,0,0,'BOOT SYS',0F6H,37H 01295 ENDIF 2AAB 00 01296 DB 0,0,5,0,0,0,0FFH,0FFH,-1,-1,-1,-1,-1,-1 00 05 00 00 00 FF FF FF FF FF FF FF FF 01297 IF @BLD631 2AB9 5D 01298 DIRDIR DB 5DH,0,0,0,0,'DIR SYS',0F4H,71H ;<631> 00 00 00 00 44 49 52 20 20 20 20 20 53 59 53 F4 71 01299 ELSE 01300 DIRDIR DB 5DH,0,0,0,0,'DIR SYS',0F6H,37H 01301 ENDIF 2ACB 96 01302 DB 96H,42H,10,0,11H,1,0FFH,0FFH,0,0,0,0,0,0 42 0A 00 11 01 FF FF 00 00 00 00 00 00 2AD9 01303 SYSDCT DS 10 2AE3 00 01304 STEPDFT DB 0 ;Boot step rate default 2AE4 01305 SECCYL DS 1 ;# of sectors per cyl 2AE5 01306 SECTRK DS 1 ;# of sectors per trk 01307 ; 01308 ; Single density 5" format table 01309 ; 2AE6 0A 01310 S5TBL DB 10,7 07 2AE8 00 01311 DB 0,5,1,6,2,7,3,8,4,9 05 01 06 02 07 03 08 04 09 2AF2 F6 01312 DB -10,-10,-10,-10,-10,-10,-10,-10,14,0FFH F6 F6 F6 F6 F6 F6 F6 0E FF 2AFC F1 01313 DB 0F1H,6,0,1,0FEH 06 00 01 FE 2B01 F3 01314 DB 0F3H,3,0,1,1,1,0F7H,1,0FFH,11,0FFH 03 00 01 01 01 F7 01 FF 0B FF 2B0C 06 01315 DB 6,0,1,0FBH,0,0E5H,1,0F7H,1,0FFH,13,0FFH 00 01 FB 00 E5 01 F7 01 FF 0D FF 2B18 F2 01316 DB 0F2H,47H,0FFH,0F4H 47 FF F4 2B1C 00 01317 DB 0,1,2,3,4,5,6,7,8,9 01 02 03 04 05 06 07 08 09 01318 ; 01319 ; Double density 5" format table 01320 ; 2B26 12 01321 D5TBL DB 18,10 0A 2B28 00 01322 DB 0,9,1,10,2,11,3,12,4 09 01 0A 02 0B 03 0C 04 2B31 0D 01323 DB 13,5,14,6,15,7,16,8,17 05 0E 06 0F 07 10 08 11 2B3A EE 01324 DC 11,-18 EE EE EE EE EE EE EE EE EE EE 2B45 20 01325 DB 32,4EH 4E 2B47 F1 01326 DB 0F1H,12,0,3,0F5H,1,0FEH 0C 00 03 F5 01 FE 2B4E F3 01327 DB 0F3H,3,0,1,1,1,0F7H,22,4EH,12,0,3,0F5H 03 00 01 01 01 F7 16 4E 0C 00 03 F5 2B5B 01 01328 DB 1,0FBH,0F5H,128,6DH,0B6H FB F5 80 6D B6 2B61 01 01329 DB 1,0F7H,1,4EH,23,04EH F7 01 4E 17 4E 2B67 F2 01330 DB 0F2H,182,4EH,0F4H B6 4E F4 2B6B 00 01331 DB 0,1,2,3,4,5,6,7,8,9 01 02 03 04 05 06 07 08 09 2B75 0A 01332 DB 10,11,12,13,14,15,16,17 0B 0C 0D 0E 0F 10 11 01333 ; 01334 ; Single density 8" format table 01335 ; 2B7D 10 01336 S8TBL DB 16,2 02 2B7F 0A 01337 DB 10,5,0,11,6,1,12,7,2,13,8,3,14,9,4,15 05 00 0B 06 01 0C 07 02 0D 08 03 0E 09 04 0F 2B8F F0 01338 DB -16,-16,-16,28H,0FFH F0 F0 28 FF 2B94 F1 01339 DB 0F1H,6,0,1,0FEH 06 00 01 FE 2B99 F3 01340 DB 0F3H,3,0,1,1,1,0F7H,11,0FFH,6,0,1,0FBH 03 00 01 01 01 F7 0B FF 06 00 01 FB 2BA6 00 01341 DB 0,0E5H,1,0F7H,1,0FFH,20,0FFH E5 01 F7 01 FF 14 FF 2BAE F2 01342 DB 0F2H,208,0FFH,0F4H D0 FF F4 2BB2 0A 01343 DB 10,0,6,12,2,8,14,4,5,11,1,7,13,3,9,15 00 06 0C 02 08 0E 04 05 0B 01 07 0D 03 09 0F 01344 ; 01345 ; Double density 8" format table 01346 ; 2BC2 1E 01347 D8TBL DB 30,12 0C 2BC4 00 01348 DB 0,10,20,1,11,21,2,12,22,3,13,23,4,14,24 0A 14 01 0B 15 02 0C 16 03 0D 17 04 0E 18 2BD3 05 01349 DB 5,15,25,6,16,26,7,17,27,8,18,28,9,19,29 0F 19 06 10 1A 07 11 1B 08 12 1C 09 13 1D 2BE2 E2 01350 DC 13,-30 E2 E2 E2 E2 E2 E2 E2 E2 E2 E2 E2 E2 2BEF 14 01351 DB 20,4EH 4E 2BF1 F1 01352 DB 0F1H,0CH,0,3,0F5H,1,0FEH 0C 00 03 F5 01 FE 2BF8 F3 01353 DB 0F3H,3,0,1,1,1,0F7H,22,4EH,12,0,3,0F5H 03 00 01 01 01 F7 16 4E 0C 00 03 F5 2C05 01 01354 DB 1,0FBH,0F5H,128,6DH,0B6H FB F5 80 6D B6 2C0B 01 01355 DB 1,0F7H,1,0FFH,17,4EH F7 01 FF 11 4E 2C11 F2 01356 DB 0F2H,0,4EH,61,4EH,0F4H 00 4E 3D 4E F4 2C17 00 01357 DB 0,20,11,2,22,13,4,24,15,6,26,17,8,28,19 14 0B 02 16 0D 04 18 0F 06 1A 11 08 1C 13 2C26 0A 01358 DB 10,1,21,12,3,23,14,5,25,16,7,27,18,9,29 01 15 0C 03 17 0E 05 19 10 07 1B 12 09 1D 01359 ; 2C35 1D 01360 FMTCYL$ DB 29,'Formatting cylinder ',3 46 6F 72 6D 61 74 74 69 6E 67 20 63 79 6C 69 6E 64 65 72 20 20 20 03 2C4D 1D 01361 VERCYL$ DB 29,'Verifying cylinder ',3 56 65 72 69 66 79 69 6E 67 20 20 63 79 6C 69 6E 64 65 72 20 20 20 03 2C65 2A 01362 STAR$ DB '* ',3 20 20 20 03 2C6A 46 01363 FMTG$ DB 'Formatting...',CR 6F 72 6D 61 74 74 69 6E 67 2E 2E 2E 0D 2C78 4E 01364 NOCYL$ DB 'No cylinders available for directory',CR 6F 20 63 79 6C 69 6E 64 65 72 73 20 61 76 61 69 6C 61 62 6C 65 20 66 6F 72 20 64 69 72 65 63 74 6F 72 79 0D 2C9D 44 01365 DIRCYL$ DB 'Directory will be placed on cylinder ' 69 72 65 63 74 6F 72 79 20 77 69 6C 6C 20 62 65 20 70 6C 61 63 65 64 20 6F 6E 20 63 79 6C 69 6E 64 65 72 20 2CC2 30 01366 DIRASC$ DB '00',CR 30 0D 2CC5 0A 01367 IPLSYS$ DB LF,'Initializing DIRECTORY information: ',3 49 6E 69 74 69 61 6C 69 7A 69 6E 67 20 44 49 52 45 43 54 4F 52 59 20 69 6E 66 6F 72 6D 61 74 69 6F 6E 3A 20 03 2CEB 0A 01368 PMTSYS$ DB LF,'Load SYSTEM diskette ',CR 4C 6F 61 64 20 53 59 53 54 45 4D 20 64 69 73 6B 65 74 74 65 20 20 3C 45 4E 54 45 52 3E 0D 2D0A 0A 01369 FMTCAO$ DB LF,LF,'Formatting complete',CR 0A 46 6F 72 6D 61 74 74 69 6E 67 20 63 6F 6D 70 6C 65 74 65 0D 2D20 0A 01370 FMTABT$ DB LF,'Command aborted',CR 43 6F 6D 6D 61 6E 64 20 61 62 6F 72 74 65 64 0D 2D31 0A 01371 NOTFMT$ DB LF,'Can''t, Diskette not formatted',CR 43 61 6E 27 74 2C 20 44 69 73 6B 65 74 74 65 20 6E 6F 74 20 66 6F 72 6D 61 74 74 65 64 0D 01372 ; 01373 ; Patch area 01374 ; 2E00 01375 ORG $<-8+1<+8 2E00 01376 GATBUF DS 203 ;GAT sector buffer 2ECB 63 01377 DB RLS,0,0,0,0 ;Ver, cyl exc, type, pswd 00 00 00 00 2ED0 20 01378 DB ' MM/DD/YY' 20 20 20 20 20 20 20 4D 4D 2F 44 44 2F 59 59 2EE0 00 01379 DC 32,0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2F00 01380 BOOT EQU $ 2F00 01381 CORE$ DEFL $ 4300 01382 ORG 4300H ;Execute at ROM BOOT 4300 01383 LORG CORE$ ; but load here 4300 00 01384 NOP 4301 FE00 01385 CP 0 ;P/u the DIR track 01386 ; 01387 IF @MOD2 01388 DB 83H 01389 ENDIF 01390 IF @MOD4 4303 F3 01391 DI 01392 ENDIF 4304 00 01393 DC 12,0 00 00 00 00 00 00 00 00 00 00 00 4310 118DFB 01394 LD DE,80*11+CRT4+29 ;Mod 4 video locn 4313 212943 01395 LD HL,DATADSK$ ;Xfer error to vidmem 4316 011700 01396 LD BC,STRLEN 4319 EDB0 01397 LDIR 431B 11153E 01398 LD DE,64*8+CRT3+21 ;Mod 3 video locn 431E 212943 01399 LD HL,DATADSK$ ;Xfer error to vidmem 4321 011700 01400 LD BC,STRLEN 4324 EDB0 01401 LDIR 4326 C32643 01402 STOP JP STOP 4329 43 01403 DATADSK$ DB 'Cannot boot, DATA DISK!' 61 6E 6E 6F 74 20 62 6F 6F 74 2C 20 44 41 54 41 20 44 49 53 4B 21 0017 01404 STRLEN EQU $-DATADSK$ 4340 00 01405 DC -$&0FFH,0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4400 01406 SAFESP EQU $ 3000 01407 ORG CORE$+256 3000 01408 LORG CORE$+256 3000 01409 HITBUF DS 256 01410 ; 3100 01413 *GET FORMAT2:3 01414 ;FORMAT2/ASM - Format Initialization Code 01415 ; 01416 ; FORMAT routine entry point 01417 ; 01418 FORMAT 3100 01419 @@CKBRKC ;Check for break 3100+3E6A 01420 LD A,106 3102+EF 01421 RST 40 3103 2804 01422 JR Z,FORMATA ;Continue if no break 3105 21FFFF 01423 LD HL,-1 ; else abort 3108 C9 01424 RET 01425 ; 3109 ED73DF29 01426 FORMATA LD (SPSAV+1),SP ;Save the stack pointer 310D E5 01427 PUSH HL ;Save cmdline ptr 310E 01428 @@DSPLY HELLO$ ;Hello message 01429 IFEQ 01H,1 310E+21BE36 01430 LD HL,HELLO$ 01431 ENDIF 3111+3E0A 01432 LD A,10 3113+EF 01433 RST 40 3114 CD5036 01434 CALL GETSYS2 ;Load SYS2 overlay 01435 ; 01436 ; Read config sector & extract DCT # cyls 01437 ; 01438 IF @MOD4 3117 110200 01439 LD DE,2 ;Track 0, sector 2 311A 4A 01440 LD C,D ;Drive 0 01441 ENDIF 01442 ; 01443 IF @MOD2 01444 LD C,0 ;Drive 0 01445 @@GTDCT ;Fetch DCT 01446 LD A,(IY+3) ;Get dct data 01447 AND 28H ;Bit 5/3 01448 CP 20H ;8" floppy? 01449 JR NZ,SETSYS1 ;Go if not 01450 LD A,(IY+4) ;Get data 01451 AND 50H ;Bit 6/4 01452 CP 40H ;DD not alien? 01453 JR NZ,SETSYS1 ;Go if not 01454 LD HL,HITBUF ;Init buffer 01455 LD D,(IY+9) ;Get dir cyl 01456 LD E,0 ;Init GAT table 01457 @@RDSEC ;Read GAT table 01458 CP 6 ;Directory read? 01459 JP NZ,IOERR ;Go on disk error 01460 LD A,(HITBUF+0CDH) ;Get data byte 01461 BIT 7,A ;System disk? 01462 SETSYS1 LD DE,0<8+2 ;Init cyl 0 01463 JR NZ,$+3 ;Go if not system 01464 INC D ;Else on cyl 1 01465 LD C,0 ;Drive 0 01466 ENDIF 01467 ; 311B 210030 01468 LD HL,HITBUF ;Set disk buffer 311E 01469 @@RDSEC ;Read sysinfo sector 311E+3E31 01470 LD A,49 3120+EF 01471 RST 40 3121 C2A829 01472 JP NZ,IOERR ;Quit on read error 3124 2E76 01473 LD L,70H+6 ;Pt to default DCTs 01474 ; 01475 ; Establish the default BOOT step rate 01476 ; 3126 E5 01477 PUSH HL ;Pt IY to the 3127 FDE1 01478 POP IY ; start of the DCTs 3129 FD7EFD 01479 LD A,(IY+3-6) ;P/u DCT$ default step 312C E603 01480 AND 3 ; & strip off 312E 329731 01481 LD (STEPARM+1),A ;Keep for Step parm 01482 ; 01483 ; Keep cyl count on all 8 drives 01484 ; 3131 0608 01485 LD B,8 3133 DD211D36 01486 LD IX,DCTCYL ;Pt to where to stuff 3137 110A00 01487 LD DE,10 ; 10-byte increments 313A 7E 01488 DCTLP1 LD A,(HL) ;P/u default # CYL 313B DD7700 01489 LD (IX),A ;Save in table 313E DD23 01490 INC IX 3140 19 01491 ADD HL,DE 3141 10F7 01492 DJNZ DCTLP1 ;Loop for 8 DCTs 01493 ; 3143 E1 01494 POP HL ;Rcvr ptr to cmdline 3144 7E 01495 FMT1 LD A,(HL) ;Ignore spaces 3145 23 01496 INC HL 3146 FE20 01497 CP ' ' 3148 28FA 01498 JR Z,FMT1 314A FE3A 01499 CP ':' ;Colon drive indicator? 314C 281F 01500 JR Z,FMT2 ;Go on drive entry 01501 ; 01502 ; Drive not entered, prompt for it 01503 ; 314E 2B 01504 DEC HL ;Backspace command line 314F 2B 01505 DEC HL ; & adjust for next INC 3150 E5 01506 PUSH HL ;Save pointer 3151 01507 WHDRV @@DSPLY WHDRV$ ;"which drive... 01508 IFEQ 01H,1 3151+216A37 01509 LD HL,WHDRV$ 01510 ENDIF 3154+3E0A 01511 LD A,10 3156+EF 01512 RST 40 3157 210030 01513 LD HL,HITBUF ;Input buffer for now 315A 010001 01514 LD BC,1<8 ;Max 1 char 315D 01515 @@KEYIN ;Get a 1-char line 315D+3E09 01516 LD A,9 315F+EF 01517 RST 40 3160 DABC29 01518 JP C,FMTABT ;Quit on Break 3163 7E 01519 LD A,(HL) ;P/u the entry 3164 D630 01520 SUB '0' ;Cvrt to binary 3166 FE08 01521 CP 8 ;Error if > 7 3168 30E7 01522 JR NC,WHDRV 316A E1 01523 POP HL ;Rcvr command pointer 316B 1808 01524 JR FMT2A 01525 ; 01526 ; Drive entered 01527 ; 316D 7E 01528 FMT2 LD A,(HL) ;P/u drive # 316E D630 01529 SUB '0' ;Cvrt to ASCII 3170 FE08 01530 CP 8 ;Make sure not > 7 3172 D24B36 01531 JP NC,PRMERR 3175 32272A 01532 FMT2A LD (FMTDRV+1),A ;Stuff drive 3178 23 01533 INC HL ;Bump cmdline ptr 3179 115C36 01534 LD DE,PRMTBL$ ;Parse any parameters 317C 01535 @@PARAM 317C+3E11 01536 LD A,17 317E+EF 01537 RST 40 317F C24B36 01538 JP NZ,PRMERR ;Jump on parm error 01539 ; 01540 ; Test if any other parm was entered 01541 ; 3182 110000 01542 SDPARM LD DE,0 ;Single density parm 3185 7A 01543 LD A,D 3186 B3 01544 OR E ;Merge all theses parms 3187 110000 01545 DDPARM LD DE,0 ;Double density parm 318A B2 01546 OR D 318B B3 01547 OR E 318C 110000 01548 SIDES LD DE,0 ;Sides parm 318F B2 01549 OR D 3190 B3 01550 OR E 3191 110000 01551 CPARM LD DE,0 ;Cylinder parm 3194 B2 01552 OR D 3195 B3 01553 OR E 3196 1100FF 01554 STEPARM LD DE,0FF00H ;Init to show if entry 3199 14 01555 INC D ;Did user enter it? 319A B2 01556 OR D ;0=no user entry 319B 32B032 01557 LD (PRMMRG+1),A ;Set to non-zero if any 01558 ; 01559 ; If Q-parm, then set NAME & MPW if not entered 01560 ; 319E ED5BB532 01561 LD DE,(QPARM+1) ;P/u Query parm 31A2 2AEB31 01562 LD HL,(NPARM+1) ;P/u Name parm 31A5 7C 01563 LD A,H 31A6 B5 01564 OR L 31A7 2004 01565 JR NZ,$+6 ;Go if user entered name 31A9 ED53EB31 01566 LD (NPARM+1),DE ; else use Q-parm value 31AD 2A3B32 01567 LD HL,(MPARM+1) ;P/u Password parm 31B0 7C 01568 LD A,H 31B1 B5 01569 OR L 31B2 2004 01570 JR NZ,$+6 ;Go if user entered password 31B4 ED533B32 01571 LD (MPARM+1),DE ;Set to Q-parm entry 01572 ; 31B8 3A272A 01573 LD A,(FMTDRV+1) ;P/u drive 31BB 4F 01574 LD C,A ;Set in drive register 31BC 211D36 01575 LD HL,DCTCYL ;Find default # cyls 31BF 85 01576 ADD A,L ;Index the DCTCYL table 31C0 6F 01577 LD L,A ; according to drive # 31C1 8C 01578 ADC A,H 31C2 95 01579 SUB L 31C3 67 01580 LD H,A 31C4 7E 01581 LD A,(HL) ;P/u cylinder count 31C5 3C 01582 INC A ;Offset from 1 31C6 324133 015839 LD (PCYL2+1),A ;Stuff default for 5" 31C9 01584 @@GTDCT ;Find the DCT pointer 31C9+3E51 01585 LD A,81 31CB+EF 01586 RST 40 31CC FDE5 01587 PUSH IY 31CE E1 01588 POP HL ;Xfer DCT to HL 31CF 11D92A 01589 LD DE,SYSDCT ;Save the system's DCT 31D2 010A00 01590 LD BC,10 ; for the drive since 31D5 EDB0 01591 LDIR ; we are altering it 31D7 3A1C26 01592 LD A,(SYSPRM+1) ;Check if "SYSTEM" parm 31DA 3C 01593 INC A ; entered 31DB 2007 01594 JR NZ,FMT2B ;Go if not 31DD FDCB035E 01595 BIT 3,(IY+3) ;Check if hard drive 31E1 CA4536 01596 JP Z,NOTHARD ;Can't "SYSTEM" floppy 31E4 CDFC29 01597 FMT2B CALL DRVNOP ;Test if drive enabled 31E7 C2A829 01598 JP NZ,IOERR 31EA 210000 01599 NPARM LD HL,0 ;NAME parm entered? 31ED 7C 01600 LD A,H 31EE B5 01601 OR L 31EF 3C 01602 INC A ;Was it just NAME? 31F0 2826 01603 JR Z,DSKNAM ;Prompt if so 31F2 3D 01604 DEC A ;If entered, use it 31F3 2003 01605 JR NZ,$+5 31F5 21DF39 01606 DFTNAM LD HL,PAKNAM$ 31F8 11D02E 01607 LD DE,GATBUF+0D0H ;Yes, move name to field 31FB 0608 01608 LD B,8 ;8-chars max 31FD 7E 01609 MOVNAM LD A,(HL) ;P/u a char 31FE FE22 01610 CP '"' ;Closing " 3200 2829 01611 JR Z,CKNAME ;Exit if end of parm 3202 FE20 01612 CP 20H ;Permit all but controls 3204 DA2B32 01613 JP C,CKNAME 3207 FE61 01614 CP 'a' ;If char is lower case, 3209 3806 01615 JR C,MOVNAM1 320B FE7B 01616 CP 'z'+1 320D 3002 01617 JR NC,MOVNAM1 320F EE20 01618 XOR 20H ; make it UC 3211 12 01619 MOVNAM1 LD (DE),A ;Put char in buffer 3212 23 01620 INC HL ;Bump both ptrs 3213 13 01621 INC DE 3214 10E7 01622 DJNZ MOVNAM ;Loop til complete 3216 1813 01623 JR CKNAME ;Check if valid name 01624 ; 01625 ; Prompt user for name parameter 01626 ; 3218 01627 DSKNAM @@DSPLY DSKNAM$ ;"diskette name? 01628 IFEQ 01H,1 3218+218737 01629 LD HL,DSKNAM$ 01630 ENDIF 321B+3E0A 01631 LD A,10 321D+EF 01632 RST 40 321E CD612A 01633 CALL GET8 ;Get 8 chars, make UC 3221 28D2 01634 JR Z,DFTNAM ;Use default if no entry 3223 48 01635 LD C,B ;Only move to name field 3224 0600 01636 LD B,0 ; how many were entered 3226 11D02E 01637 LD DE,GATBUF+0D0H 3229 EDB0 01638 LDIR 322B 11D02E 01639 CKNAME LD DE,GATBUF+0D0H ;Now check if illegal 322E CDB835 01640 CALL CKMPW0 ; chars in name 3231 C23D36 01641 JP NZ,BADNAM ; & quit if so 3234 21D82E 01642 GETDAT LD HL,GATBUF+0D8H ;Get today's date & stuff 3237 01643 @@DATE 3237+3E12 01644 LD A,18 3239+EF 01645 RST 40 01646 ; 01647 ; Master Password handling 01648 ; 323A 210000 01649 MPARM LD HL,0 ;Did user enter the MPW? 323D 7C 01650 LD A,H 323E B5 01651 OR L 323F 3C 01652 INC A ;If only MPW, then prompt 3240 2821 01653 JR Z,MPW ;Go prompt if not 3242 3D 01654 DEC A 3243 2003 01655 JR NZ,$+5 ;If entered, use it 3245 21E739 01656 DFTMPW LD HL,PAKMPW$ ; else use ours 3248 115336 01657 LD DE,MPWBUF ;Shift to pswd field 324B 0608 01658 LD B,8 324D 7E 01659 MOVMPW LD A,(HL) 324E FE30 01660 CP 30H ;No spaces permitted 3250 3819 01661 JR C,PRSMPW ;End also on closing " 3252 FE61 01662 CP 'a' ;Need cvrt to UC? 3254 3806 01663 JR C,MOVMPW1 3256 FE7B 01664 CP 'z'+1 3258 3002 01665 JR NC,MOVMPW1 325A EE20 01666 XOR 20H ;Cvrt to UC 325C 12 01667 MOVMPW1 LD (DE),A ;Store the char and 325D 13 01668 INC DE ; bump the buffer ptrs 325E 23 01669 INC HL 325F 10EC 01670 DJNZ MOVMPW 3261 1808 01671 JR PRSMPW ;Check if valid password 01672 ; 01673 ; Prompt for master password 01674 ; 3263 219837 01675 MPW LD HL,MPW$ ;"master... 3266 CD9135 01676 CALL INPMPW 3269 30DA 01677 JR NC,DFTMPW ;Use default on 01678 ; 01679 ; Parse the password & stuff into GAT sector buffer 01680 ; 326B 115336 01681 PRSMPW LD DE,MPWBUF 326E CDB135 01682 CALL CKMPW ;Check for valid MPW 3271 C2A829 01683 JP NZ,IOERR 3274 22CE2E 01684 LD (GATBUF+0CEH),HL ;Stuff it 3277 FDCB0466 01685 BIT 4,(IY+4) ;Jump if alien controller 327B C2A833 01686 JP NZ,CALCGPC 327E 212536 01687 LD HL,TBLDATA ;Pt to config tables 3281 110600 01688 LD DE,6 ;Index the table 3284 FDCB036E 01689 BIT 5,(IY+3) ;8" drive? 3288 2802 01690 JR Z,INITDEN ;Bypass if not 328A 19 01691 ADD HL,DE ; else move to 8" configs 328B 19 01692 ADD HL,DE 328C 22F332 01693 INITDEN LD (SETSDEN+1),HL ; & stuff for SDEN option 328F EB 01694 EX DE,HL ;6->HL, SDEN->DE 3290 19 01695 ADD HL,DE ;Pt to DDEN index table 3291 22E332 01696 LD (SETDDEN+1),HL ;Stuff DDEN config ptr 3294 EB 01697 EX DE,HL ;HL=SDEN, DE=DDEN 3295 FDCB03B6 01698 RES 6,(IY+3) ;Set DCT to SDEN 3299 FDCB0476 01699 BIT 6,(IY+4) ;Test if DDEN capability 329D 2805 01700 JR Z,SETSTD ;Go if single 329F EB 01701 EX DE,HL ;HL->DDEN table 32A0 FDCB03F6 01702 SET 6,(IY+3) ;Set DCT to DDEN 32A4 CD2D35 01703 SETSTD CALL SETUP ;Init to std config 32A7 FDCB03A6 01704 RES 4,(IY+3) ;Set i/o to front side 32AB FDCB04AE 01705 RES 5,(IY+4) ;Set to 1-sided 32AF 3E00 01706 PRMMRG LD A,0 ;<>0 if config parms 32B1 B7 01707 OR A ; in command line 32B2 2008 01708 JR NZ,GETDEN 32B4 11FFFF 01709 QPARM LD DE,-1 ;Prompts? Default=Y 32B7 7A 01710 LD A,D 32B8 B3 01711 OR E 32B9 CA9D33 01712 JP Z,PSTEP1 ;Go if no prompting 32BC FDCB0476 01713 GETDEN BIT 6,(IY+4) ;Bypass DDEN request msg 32C0 283A 01714 JR Z,PMTSIDE ; if no DDEN capability 32C2 3AB032 01715 LD A,(PRMMRG+1) ;Also, don't prompt if 32C5 B7 01716 OR A ; any config parm was 32C6 2013 01717 JR NZ,GDDEN1 ; entered with command 32C8 213E38 01718 LD HL,DEN?$ ;Density ... 32CB CD592A 01719 CALL GET3 32CE 282C 01720 JR Z,PMTSIDE ;Go on32D0 7E 01721 LD A,(HL) ;P/u respsonse 32D1 FE53 01722 CP 'S' ;Single Density? 32D3 281D 01723 JR Z,SETSDEN 32D5 FE44 01724 CP 'D' ;Double density? 32D7 2809 01725 JR Z,SETDDEN 32D9 18E1 01726 JR GETDEN ;Redo if bad response 32DB 3A8831 01727 GDDEN1 LD A,(DDPARM+1) ;Not prompted, was DDEN 32DE EEFF 01728 XOR -1 ; set in command line? 32E0 2009 01729 JR NZ,GSDEN1 ;Bypass if not 32E2 210000 01730 SETDDEN LD HL,$-$ ;P/u DDEN index table 32E5 FDCB03F6 01731 SET 6,(IY+3) ;Set DCT to DDEN 32E9 180E 01732 JR CHGDEN 32EB 3A8331 01733 GSDEN1 LD A,(SDPARM+1) ;Was SDEN parm 32EE EEFF 01734 XOR -1 ; on command line? 32F0 200A 01735 JR NZ,PMTSIDE ;Go if not 32F2 210000 01736 SETSDEN LD HL,$-$ ;P/u SDEN index table 32F5 FDCB03B6 01737 RES 6,(IY+3) ;Set DCT to SDEN 32F9 CD2D35 01738 CHGDEN CALL SETUP ;Init #CYLs & alloc 32FC 3AB032 01739 PMTSIDE LD A,(PRMMRG+1) ;Config parms entered 32FF B7 01740 OR A ;On command line? 3300 2020 01741 JR NZ,PMTS1 ;Bypass if yes 3302 FDE5 01742 PUSH IY ;P/u flag table 3304 01743 @@FLAGS ; and check if 3304+3E65 01744 LD A,101 3306+EF 01745 RST 40 3307 FDCB0B6E 01746 BIT 5,(IY+'L'-'A') ; 2-side inhibit? 330B FDE1 01747 POP IY 330D 2013 01748 JR NZ,PMTS1 ;If set, use 1 side 330F 211F38 01749 LD HL,SIDES$ ;"double sided...? 3312 CD592A 01750 CALL GET3 ;Get # sides wanted 3315 2816 01751 JR Z,PMTCYL ;Go on 3317 7E 01752 LD A,(HL) ;P/u response char 3318 FE31 01753 CP '1' ;1 is ok 331A 2811 01754 JR Z,PMTCYL 331C FE32 01755 CP '2' ; and so is 2 331E 20DC 01756 JR NZ,PMTSIDE ; but redo on anything else 3320 1805 01757 JR TSTSID 01758 ; 01759 ; Check side parm from command line 01760 ; 3322 3A8D31 01761 PMTS1 LD A,(SIDES+1) ;How many sides? 3325 FE02 01762 CP 2 3327 2004 01763 TSTSID JR NZ,PMTCYL ;DCT ok if not 2 3329 FDCB04EE 01764 SET 5,(IY+4) ;Set 2-sided drive 332D FD7E03 01765 PMTCYL LD A,(IY+3) ;No cylinder request 3330 E628 01766 AND 28H ; if either hard drive 3332 202E 01767 JR NZ,PMTSTEP ; or 8" drive 3334 3AB032 01768 PCYL1 LD A,(PRMMRG+1) ;P/u config test byte & 3337 B7 01769 OR A ; bypass cyl req if user 3338 201E 01770 JR NZ,PCYL4 ; entered cmd line parms 333A 21AB37 01771 LD HL,NUMCYL$ ;"number of cyls..? 333D CD592A 01772 CALL GET3 3340 3E00 01773 PCYL2 LD A,0 ;P/u default # cyls 3342 C47E35 01774 CALL NZ,CVBIN ;Get # of cyls on CR 01775 IF @BLD631 3345 CD4C33 01776 CALL CHKCNT ;<631> 3348 38EA 01777 JR C,PCYL1 ;<631>Anything out of range 334A 1816 01778 JR PMTSTEP ;<631> 334C FE61 01779 CHKCNT: CP 96+1 ;<631>System cannot support 334E 3F 01780 CCF ;<631> anything over 96 (95) 334F D8 01781 RET C ;<631> 3350 FE23 01782 CP 35 ;<631>Must be 35 or more 3352 D8 01783 RET C ;<631> 3353 3D 01784 DEC A ;<631>Adjust to zero offset 3354 FD7706 01785 LD (IY+6),A ;<631> & stuff in DCT 3357 C9 01786 RET ;<631> 01787 ELSE 01788 PCYL3 CP 96+1 ;System cannot support 01789 JR NC,PCYL1 ; anything over 96 (95) 01790 CP 35 01791 JR C,PCYL1 ;Must be 35 or more 01792 DEC A ;Adjust to zero offset 01793 LD (IY+6),A ; & stuff in DCT 01794 JR PMTSTEP 01795 ENDIF 01796 ; 01797 ; User entered config parms with command line 01798 ; 3358 3A9231 01799 PCYL4 LD A,(CPARM+1) ;Was cyl= one of them? 335B B7 01800 OR A 01801 IF @BLD631 335C C44C33 01802 CALL NZ,CHKCNT ;<631>Check for valid range 335F DA4B36 01803 JP C,PRMERR ;<631>Parm error if too big 3362 FDCB0466 01804 PMTSTEP:BIT 4,(IY+4) ;<631>Alien controller? 3366 2040 01805 JR NZ,CALCGPC ;<631>No adjustable rate if so 01806 ELSE 01807 JR Z,PMTSTEP ;Bypass if not 01808 CP 96+1 01809 JP NC,PRMERR ;Parm error if too big 01810 CP 35 01811 JP C,PRMERR ; or too small 01812 DEC A ;Adjust to zero offset 01813 LD (IY+6),A ; & stuff into DCT 01814 PMTSTEP BIT 4,(IY+4) ;Alien controller? 01815 JR NZ,PMTSIDE ;No adjustable step rate if so 01816 ENDIF 01817 ; 01818 ; If step rate parm wasn't entered, prompt 01819 ; for it but first determine 8" or 5" drive 01820 ; 3368 3AB032 01821 LD A,(PRMMRG+1) ;Did user enter config 336B B7 01822 OR A ;Parms on command line? 336C 202F 01823 JR NZ,PSTEP1 ;Go to step prompt if yes 01824 ; 336E FDE5 01825 PUSH IY ;P/u flag table and 3370 01826 @@FLAGS ; check if 3370+3E65 01827 LD A,101 3372+EF 01828 RST 40 3373 FDCB0B46 01829 BIT 0,(IY+'L'-'A') ; step prompt inhibited 3377 FDE1 01830 POP IY 3379 2022 01831 JR NZ,PSTEP1 ;Bypass if set 01832 ; 337B FDCB036E 01833 BIT 5,(IY+3) ;Need prompt, 8"? 337F 200F 01834 JR NZ,STEP8 ;Jump if 8" 01835 ; 01836 ; 5" drive step rate parsing 01837 ; 3381 21C237 01838 STEP5 LD HL,STEP5$ ;"...step rate - 5" 01839 IF @BLD631 3384 117435 01840 LD DE,L3574 ;<631> 3387 CD5635 01841 CALL DOITALL ;<631> 338A 20F5 01842 JR NZ,STEP5 ;<631> 338C 380F 01843 JR C,PSTEP1 ;<631> 338E 1814 01844 JR GOTSTEP ;<631> 01845 ELSE 01846 CALL GET3 01847 CALL CVBIN ;Get 5" step rate 01848 OR A ;Use default? 01849 JR Z,PSTEP1 ;Go if parm not entered 01850 LD B,0 ;Init key to 0 01851 CP 6 01852 JR Z,GOTSTEP 01853 LD B,1 ;Init key to 1 01854 CP 12 01855 JR Z,GOTSTEP 01856 LD B,2 ;Init key to 2 01857 CP 20 01858 JR Z,GOTSTEP 01859 LD B,3 ;Init key to 3 01860 CP 30 01861 JR Z,GOTSTEP 01862 CP 40 01863 JR Z,GOTSTEP 01864 JR STEP5 ;Re-request, bad value 01865 ENDIF 01866 ; 01867 ; 8" drive step rate parsing 01868 ; 3390 21F037 01869 STEP8 LD HL,STEP8$ ;"step rate - 8"... 01870 IF @BLD631 3393 117935 01871 LD DE,L3579 ;<631> 3396 CD5635 01872 CALL DOITALL ;<631> 3399 20F5 01873 JR NZ,STEP8 ;<631> 339B 3007 01874 JR NC,GOTSTEP ;<631> 01875 ELSE 01876 CALL GET3 01877 CALL CVBIN ;Get 8" step rate 01878 OR A ;Use default? 01879 JR Z,PSTEP1 ;Go if not entered 01880 LD B,0 ;Init key to 0 01881 CP 3 01882 JR Z,GOTSTEP 01883 LD B,1 ;Init key to 1 01884 CP 6 01885 JR Z,GOTSTEP 01886 LD B,2 ;Init key to 2 01887 CP 10 01888 JR Z,GOTSTEP 01889 LD B,3 ;Init key to 3 01890 CP 15 01891 JR Z,GOTSTEP 01892 CP 20 01893 JR Z,GOTSTEP 01894 JR STEP8 ;Bad entry, re-request 01895 ENDIF 339D 3A9731 01896 PSTEP1 LD A,(STEPARM+1) ;P/u step parm entry 33A0 E603 01897 AND 3 ;Keep 2 lo-order bits 33A2 1801 01898 JR $+3 33A4 78 01899 GOTSTEP LD A,B ;Stuff boot step rate key 33A5 32E32A 01900 LD (STEPDFT),A 01901 ; 01902 ; Routine to calculate the # of grans per logical 01903 ; cylinder so that the GAT byte can be constructed 01904 ; 33A8 FD7E08 01905 CALCGPC LD A,(IY+8) ;P/u # of grans per cyl 33AB 07 01906 RLCA ;Rotate to bits 0-2 33AC 07 01907 RLCA 33AD 07 01908 RLCA 33AE E607 01909 AND 7 ;Strip off other data 33B0 3C 01910 INC A ;Adj for zero offset 01911 ; 01912 ; If double siding (cylindering), double the count 01913 ; 33B1 FDCB046E 01914 BIT 5,(IY+4) ;Test if 2-sided drive 33B5 2801 01915 JR Z,$+3 ;Bypass if only 1-sided 33B7 87 01916 ADD A,A ;Double the grans/cyl 33B8 01FFFF 01917 LD BC,0FFFFH ;Init GAT byte to ones 33BB CB20 01918 CGPC1 SLA B ;Now keep removing low 33BD 3D 01919 DEC A ; order bits , 1 bit for 33BE 20FB 01920 JR NZ,CGPC1 ; each available granule 33C0 21002E 01921 LD HL,GATBUF ;Pt to GAT buffer area 33C3 FD7E06 01922 LD A,(IY+6) ;P/u highest # cylinder 33C6 70 01923 CGPC2 LD (HL),B ;Stuff the GAT byte into 33C7 2C 01924 INC L ;Each position of the GAT 33C8 BD 01925 CP L ;One byte per cylinder 33C9 30FB 01926 JR NC,CGPC2 01927 ; 01928 ; Test if we are at 202 first by ignoring the 01929 ; first two instructions with LD DE,xxxx 01930 ; 33CB 3ECB 01931 LD A,0CBH ;Continue to stuff GAT 33CD 11 01932 DB 11H ; until cyl 202 33CE 71 01933 CGPC3 LD (HL),C ;Use FFH to show unused 33CF 2C 01934 INC L 33D0 BD 01935 CP L ;First test here for 33D1 20FB 01936 JR NZ,CGPC3 ; match against 202 01937 ; 01938 ; Prompt for destination disk & prepare it 01939 ; 33D3 3A272A 01940 LD A,(FMTDRV+1) ;P/u drive 33D6 B7 01941 OR A 33D7 2020 01942 JR NZ,PFMT1 ;Bypass if other than 0 33D9 01943 PMTDST @@DSPLY PMTDST$ ;"load dest disk... 01944 IFEQ 01H,1 33D9+219938 01945 LD HL,PMTDST$ 01946 ENDIF 33DC+3E0A 01947 LD A,10 33DE+EF 01948 RST 40 33DF FDE5 01949 PUSH IY ;Save DCT pointer 33E1 01950 @@FLAGS ;Point to flags 33E1+3E65 01951 LD A,101 33E3+EF 01952 RST 40 33E4 FDCB126E 01953 BIT 5,(IY+'S'-'A') ;Check for JCL active 33E8 FDE1 01954 POP IY ;Restore pointer 33EA C2BC29 01955 JP NZ,FMTABT ;Abort if in JCL 33ED 210030 01956 LD HL,HITBUF 33F0 010000 01957 LD BC,0 ;Zero characters means 33F3 01958 @@KEYIN ;Enter or Break only 33F3+3E09 01959 LD A,9 33F5+EF 01960 RST 40 33F6 DABC29 01961 JP C,FMTABT ;Abort if Break 33F9 FDE5 01962 PFMT1 PUSH IY ;Xfer DCT ptr to HL 33FB E1 01963 POP HL ; & move DCT again 33FC 111336 01964 LD DE,TMPDCT ; to store tempy 33FF 010A00 01965 LD BC,10 3402 EDB0 01966 LDIR 01967 IF @MOD2 01968 CALL SELECT 01969 JP NZ,IOERR ;Go on error 01970 ENDIF 3404 CD032A 01971 CALL RESTOR ;Restore to cyl 0 3407 C2A829 01972 JP NZ,IOERR ;Go on error 340A CD0B2A 01973 CALL RSELCT ;Reselect drive 340D C2A829 01974 JP NZ,IOERR ;Go on error 3410 FDCB0466 01975 BIT 4,(IY+4) ;Jump if alien controller 3414 2040 01976 JR NZ,PFMT3 3416 216038 01977 LD HL,NOTRDY$ ;Init "drive not ready 3419 CB7F 01978 BIT 7,A ;Test FDC status for READY 341B C2BF29 01979 JP NZ,EXTERR ;Quit if not ready 341E 218538 01980 LD HL,NODRV$ ;Init "drive not in... 3421 CB57 01981 BIT 2,A ;Test FDC status for TRACK-0 3423 CABF29 01982 JP Z,EXTERR ; & error if not at track 0 3426 CDE835 01983 CALL CKDRV ;Ck if floppy not present 3429 20AE 01984 JR NZ,PMTDST 342B 217038 01985 LD HL,CANTWR$ ;Init "write protected.. 342E 07 01986 RLCA ;Align to bit 7 342F FDB603 01987 OR (IY+3) ;Combine with soft WP 3432 E680 01988 AND 80H ;WP error? 3434 C2BF29 01989 JP NZ,EXTERR ;Can't format over WP 3437 3A1C26 01990 LD A,(SYSPRM+1) ;Don't check space needed 343A B7 01991 OR A ; if SYSTEM info only 343B 2019 01992 JR NZ,PFMT3 343D 210031 01993 LD HL,FORMAT ;Start of format buffer 3440 110000 01994 PFMT2 LD DE,0 ;P/u format space needed 3443 19 01995 ADD HL,DE ;Pt to last addr needed 3444 54 01996 LD D,H ;Xfer to reg DE 3445 5D 01997 LD E,L 3446 210000 01998 LD HL,0 ;Set up for HIGH$ fetch 3449 45 01999 LD B,L 344A 02000 @@HIGH$ ;Make sure it won't wrap 344A+3E64 02001 LD A,100 344C+EF 02002 RST 40 344D AF 02003 XOR A 344E ED52 02004 SBC HL,DE ; into protected memory 3450 215C37 02005 LD HL,NOMEM$ ;Init "insufficient mem.. 3453 DABF29 02006 JP C,EXTERR ;Quit if no memory available 3456 110000 02007 PFMT3 LD DE,0 ;Init to cyl 0, sect 0 3459 CD232A 02008 CALL VERSEC ;Verify BOOT 345C C21935 02009 JP NZ,PFMT6 ;Assume unformated if err 02010 ; 02011 ; Appears formatted, is there SYSTEM information? 02012 ; 345F 3A1C26 02013 LD A,(SYSPRM+1) ;Ignore data if SYSTEM 3462 B7 02014 OR A ; info only 3463 C21935 02015 JP NZ,PFMT6 3466 210030 02016 LD HL,HITBUF ;Pt to i/o buffer 3469 CD1F2A 02017 CALL RDSEC ;Now try to read BOOT 346C C2A829 02018 JP NZ,IOERR ;Jump on error 346F 02019 @@LOGOT HASDAT$ ;Show "disk contains data 02020 IFEQ 01H,1 346F+21BC38 02021 LD HL,HASDAT$ 02022 ENDIF 3472+3E0C 02023 LD A,12 3474+EF 02024 RST 40 3475 21D338 02025 LD HL,NOFMT$ ;Init "non-std format 02026 ; 02027 ; BOOT was read, is there a valid directory pointer 02028 ; 3478 3A0230 02029 LD A,(HITBUF+2) ;P/u dir cyl # (possible) 347B FDBE06 02030 CP (IY+6) ;Check against max cyl # 347E 3076 02031 JR NC,PFMT5 ;Go if bigger (or =) 02032 ; 02033 ; Read the assumed GAT & test it 02034 ; 3480 210030 02035 LD HL,HITBUF 3483 5D 02036 LD E,L 3484 57 02037 LD D,A ;Pt to assumed GAT sector 3485 210030 02038 LD HL,HITBUF ;Pt to buffer 3488 CD1F2A 02039 CALL RDSEC ;Read the sector 348B FE06 02040 CP 6 ;Dir errcod returned? 348D 2805 02041 JR Z,PFMT4 ;Jump if yes & grab data 348F 21E738 02042 LD HL,CANTRD$ ;Init "unreadable dir... 3492 1862 02043 JR PFMT5 3494 21FC38 02044 PFMT4 LD HL,NODIR$ ;Init "non-init dir 3497 3ADA30 02045 LD A,(HITBUF+0DAH) ;Check if date field 349A FE2F 02046 CP '/' ; is present 349C 2058 02047 JR NZ,PFMT5 ;Jump if no 02048 ; 02049 ; The directory is readable - request its MPW 02050 ; 349E 21D030 02051 LD HL,HITBUF+0D0H 34A1 111B39 02052 LD DE,PACKID$+5 ;Move name & date into 34A4 010800 02053 LD BC,8 ; display message field 34A7 EDB0 02054 LDIR 34A9 112A39 02055 LD DE,PACKID$+14H 34AC 0E08 02056 LD C,8 34AE EDB0 02057 LDIR 02058 ; 02059 ; If MPW = "PASSWORD", just ck ABS 02060 ; 34B0 2ACE30 02061 LD HL,(HITBUF+0CEH) ;P/u disk MPW 34B3 11E042 02062 LD DE,PASSWORD ;Password=PASSWORD 34B6 AF 02063 XOR A 34B7 ED52 02064 SBC HL,DE ;Is it password? 34B9 211639 02065 LD HL,PACKID$ ;Init"Name=, Date= 34BC 2838 02066 JR Z,PFMT5 ;If match, go check ABS 02067 IF @BLD631 34BE FDE5 02068 PUSH IY ;<631> 34C0 02069 @@FLAGS ;<631> 34C0+3E65 02070 LD A,101 34C2+EF 02071 RST 40 34C3 FDCB0D7E 02072 BIT 7,(IY+0DH) ;<631> 34C7 FDE1 02073 POP IY ;<631> 34C9 202B 02074 JR NZ,PFMT5 ;<631> 02075 ENDIF 34CB 02076 @@LOGOT ;Log the ID field 02077 IFEQ 00H,1 02078 LD HL, 02079 ENDIF 34CB+3E0C 02080 LD A,12 34CD+EF 02081 RST 40 34CE FDE5 02082 PUSH IY ;Abort if in JCL 34D0 02083 @@FLAGS 34D0+3E65 02084 LD A,101 34D2+EF 02085 RST 40 34D3 FDCB126E 02086 BIT 5,(IY+'S'-'A') ;Test if "DOing" 34D7 FDE1 02087 POP IY 34D9 C2BC29 02088 JP NZ,FMTABT ;Can't get PW if in JCL 02089 ; 02090 ; User must enter Current Pack's MPW to proceed 02091 ; 34DC 213339 02092 OLDMPW LD HL,OLDMPW$ ;"What's the old MPW? 34DF CD9135 02093 CALL INPMPW ;Grab user input to match 34E2 30F8 02094 JR NC,OLDMPW 34E4 115336 02095 LD DE,MPWBUF 34E7 CDB535 02096 CALL HASHMPW ;Hash user entry 02097 ; 02098 ; Routine to test master password for match 02099 ; 34EA EB 02100 EX DE,HL ;Xfer hashed MPW to DE 34EB 2ACE30 02101 LD HL,(HITBUF+0CEH) ;Else grab pack MPW 34EE AF 02102 XOR A ;Clear carry flag 34EF ED52 02103 SBC HL,DE ;Did user enter pack MPW? 34F1 C24136 02104 JP NZ,BADMPW ;Abort if no match 34F4 1823 02105 JR PFMT6 02106 ; 02107 ; The directory was not readable - req assurance 02108 ; 34F6 02109 PFMT5 @@LOGOT 02110 IFEQ 00H,1 02111 LD HL, 02112 ENDIF 34F6+3E0C 02113 LD A,12 34F8+EF 02114 RST 40 34F9 110000 02115 APARM LD DE,0 ;ABS parameter 34FC 1C 02116 INC E 34FD 281A 02117 JR Z,PFMT6 ;Go if ABS used 34FF FDE5 02118 PUSH IY 3501 02119 @@FLAGS 3501+3E65 02120 LD A,101 3503+EF 02121 RST 40 3504 FDCB126E 02122 BIT 5,(IY+'S'-'A') ;Test if "DOing" 3508 FDE1 02123 POP IY 350A C2BC29 02124 JP NZ,FMTABT ;Abort if JCL but no ABS 350D 218D39 02125 LD HL,SURE?$ ;"are you sure...? 3510 CD592A 02126 CALL GET3 ;Get response 3513 7E 02127 LD A,(HL) 3514 FE59 02128 CP 'Y' ;If not Yes, abort 3516 C2BC29 02129 JP NZ,FMTABT 3519 FDE5 02130 PFMT6 PUSH IY ;Move drive code table 351B D1 02131 POP DE ; back into place 351C 211336 02132 LD HL,TMPDCT ; into system slot 351F 010A00 02133 LD BC,10 3522 EDB0 02134 LDIR 3524 CD032A 02135 CALL RESTOR ;Restore to cylinder 0 3527 C2A829 02136 JP NZ,IOERR ;Go on error 352A C30126 02137 JP GOFMT ;Go and format it 02138 ; 02139 ; Routine to set up the DCT for format 02140 ; 352D 3A4133 02141 SETUP LD A,(PCYL2+1) ;P/u the highest # cyl 3530 FDCB036E 02142 BIT 5,(IY+3) ;If 8" drive, use 77 3534 2802 02143 JR Z,$+4 ;Go if only 5" 3536 3E4D 02144 LD A,77 ;8" drives are 77 cyls 3538 3D 02145 DEC A 3539 FD7706 02146 LD (IY+6),A ;Stuff in our DCT 353C 5E 02147 LD E,(HL) ;Grab address to 353D 23 02148 INC HL ; master formatting table 353E 56 02149 LD D,(HL) 353F 23 02150 INC HL 3540 ED530926 02151 LD (FMTTBL+1),DE ;Stuff for later use 3544 5E 02152 LD E,(HL) ;P/u DCT+7 data 3545 23 02153 INC HL ;Max sector, # of heads 3546 56 02154 LD D,(HL) ;P/u DCT+8 data, # of 3547 23 02155 INC HL ; sectors/gran & grans/cyl 3548 FD7307 02156 LD (IY+7),E ;Stuff these values into 354B FD7208 02157 LD (IY+8),D ; our DCT 354E 5E 02158 LD E,(HL) ;P/u space needed for 354F 23 02159 INC HL ; the formatting buffer 3550 56 02160 LD D,(HL) 3551 ED534134 02161 LD (PFMT2+1),DE ; & stuff that for later 3555 C9 02162 RET 02163 IF @BLD631 3556 D5 02164 DOITALL:PUSH DE ;<631> 3557 CD592A 02165 CALL GET3 ;<631> 355A CD7E35 02166 CALL CVBIN ;<631> 355D E1 02167 POP HL ;<631> 355E B7 02168 OR A ;<631> 355F 37 02169 SCF ;<631> 3560 C8 02170 RET Z ;<631> 3561 0600 02171 LD B,0 ;<631> 3563 BE 02172 CP (HL) ;<631> 3564 C8 02173 RET Z ;<631> 3565 23 02174 INC HL ;<631> 3566 04 02175 INC B ;<631> 3567 BE 02176 CP (HL) ;<631> 3568 C8 02177 RET Z ;<631> 3569 04 02178 INC B ;<631> 356A 23 02179 INC HL ;<631> 356B BE 02180 CP (HL) ;<631> 356C C8 02181 RET Z ;<631> 356D 23 02182 INC HL ;<631> 356E 04 02183 INC B ;<631> 356F BE 02184 CP (HL) ;<631> 3570 C8 02185 RET Z ;<631> 3571 23 02186 INC HL ;<631> 3572 BE 02187 CP (HL) ;<631> 3573 C9 02188 RET ;<631> 3574 06 02189 L3574: DB 06H,0CH,14H,1EH,28H ;<631> 0C 14 1E 28 3579 03 02190 L3579: DB 03H,06H,0AH,0FH,14H ;<631> 06 0A 0F 14 02191 ENDIF 02192 ; 02193 ; Convert decimal ASCII to binary 02194 ; 357E 1E00 02195 CVBIN LD E,0 ;Init value to 0 3580 7E 02196 CVB1 LD A,(HL) ;Get a character 3581 23 02197 INC HL ;Bump buff ptr 3582 D630 02198 SUB 30H ;Make binary 3584 47 02199 LD B,A 3585 FE0A 02200 CP 0AH ;Was it a decimal digit? 3587 7B 02201 LD A,E 3588 D0 02202 RET NC ;Return if not 3589 87 02203 ADD A,A ;Mult previous value X 10 358A 87 02204 ADD A,A 358B 83 02205 ADD A,E 358C 87 02206 ADD A,A 358D 80 02207 ADD A,B ;Add in new digit 358E 5F 02208 LD E,A ;Put results in E 358F 18EF 02209 JR CVB1 ;Loop 02210 ; 3591 02211 INPMPW @@DSPLY 02212 IFEQ 00H,1 02213 LD HL, 02214 ENDIF 3591+3E0A 02215 LD A,10 3593+EF 02216 RST 40 3594 215336 02217 LD HL,MPWBUF ;Use this buffer 3597 0608 02218 LD B,8 ;8 chars max 3599 CD672A 02219 CALL GET8A ;Input the pswd 359C C8 02220 RET Z ;Go if Enter only 359D EB 02221 EX DE,HL 359E 83 02222 ADD A,E ;Find where the X'0D' was 359F 6F 02223 LD L,A ; stuffed & cover it 35A0 7A 02224 LD A,D 35A1 CE00 02225 ADC A,0 35A3 67 02226 LD H,A 35A4 3E08 02227 LD A,8 ;If 8 chars entered, 35A6 90 02228 SUB B 35A7 37 02229 SCF ; done 35A8 C8 02230 RET Z 35A9 47 02231 LD B,A ; else pad the buffer 35AA 3620 02232 FILLBLK LD (HL),' ' ; w/spaces 35AC 23 02233 INC HL 35AD 10FB 02234 DJNZ FILLBLK 35AF 37 02235 SCF 35B0 C9 02236 RET 02237 ; 35B1 CDB835 02238 CKMPW CALL CKMPW0 35B4 C0 02239 RET NZ 02240 ; 02241 ; Hash a diskette password 02242 ; 35B5 3EE4 02243 HASHMPW LD A,0E4H ;Use SYS2 routine 35B7 EF 02244 RST 40 02245 ; 35B8 0608 02246 CKMPW0 LD B,8 ;8 char to check 35BA D5 02247 PUSH DE ;Xfer start of PW 35BB E1 02248 POP HL ; to HL 35BC 7E 02249 LD A,(HL) ;P/u 1st char 35BD 180E 02250 JR CKMPW2 ; & check 35BF 23 02251 CKMPW1 INC HL ;Advance to next char 35C0 7E 02252 LD A,(HL) ;P/u the char 35C1 FE20 02253 CP ' ' 35C3 2818 02254 JR Z,CKMPW7 ;Go on space 35C5 FE30 02255 CP '0' 35C7 3818 02256 JR C,INVMPW ;Bad if less than o 35C9 FE3A 02257 CP '9'+1 ; or greater than 9 35CB 3808 02258 JR C,CKMPW3 35CD FE41 02259 CKMPW2 CP 'A' 35CF 3810 02260 JR C,INVMPW ; but less than A 35D1 FE5B 02261 CP 'Z'+1 35D3 300C 02262 JR NC,INVMPW ;More than Z also bad 35D5 10E8 02263 CKMPW3 DJNZ CKMPW1 ;Char ok, do another 35D7 AF 02264 XOR A ;Set Z, PW good 35D8 C9 02265 RET 02266 ; 35D9 23 02267 CKMPW5 INC HL ;Next char position 35DA BE 02268 CP (HL) ;No imbedded spaces 35DB 2004 02269 JR NZ,INVMPW 35DD 10FA 02270 CKMPW7 DJNZ CKMPW5 ;Loop til 8 checked 35DF AF 02271 XOR A ;Set Z = PW good 35E0 C9 02272 RET 02273 ; 35E1 21B339 02274 INVMPW LD HL,INVMPW$ ;Init "Invalid PW 35E4 3E3F 02275 LD A,63 ;Indicate extended error 35E6 B7 02276 OR A ;Set NZ condition 35E7 C9 02277 RET 02278 ; 02279 ; Brief routine to check a drive for availability 02280 ; 35E8 210030 02281 CKDRV LD HL,HITBUF 35EB 02282 @@TIME ;P/u the timer pointer 35EB+3E13 02283 LD A,19 35ED+EF 02284 RST 40 35EE EB 02285 EX DE,HL ;TIME$ to HL 35EF 2B 02286 DEC HL ;TIMER$ to HL 35F0 7E 02287 LD A,(HL) ;P/u current timer value 35F1 C60F 02288 ADD A,15 ;Set timeout to 500ms 35F3 57 02289 LD D,A ;Save for test later 02290 ; 02291 ; Test for diskette in drive & rotating 02292 ; 35F4 CD0436 02293 CKDR1 CALL CKDR6 ;Test index pulse 35F7 20FB 02294 JR NZ,CKDR1 ;Jump on index 35F9 CD0436 02295 CKDR2 CALL CKDR6 ;Test index pulse 35FC 28FB 02296 JR Z,CKDR2 ;Jump on no index 35FE CD0436 02297 CKDR2A CALL CKDR6 3601 20FB 02298 JR NZ,CKDR2A ;Jump on index 3603 C9 02299 RET 3604 FB 02300 CKDR6 EI ;Make sure they're ON 3605 7E 02301 LD A,(HL) ;P/u latest TIMER$ value 3606 92 02302 SUB D ;500ms passed? 3607 2806 02303 JR Z,CKDR7 3609 CD0B2A 02304 CALL RSELCT ;Select & wait not busy 360C CB4F 02305 BIT 1,A ;Test index 360E C9 02306 RET 360F D1 02307 CKDR7 POP DE ;Pop the ret address 3610 F601 02308 OR 1 ;Set "Illegal drive # 3612 C9 02309 RET ;With NZ 02310 ; 02311 ; Temporary storage space for format drive DCT 02312 ; 3613 02313 TMPDCT DS 10 361D 02314 DCTCYL DS 8 ;Default # cyls 02315 ; 02316 ; Config table for single density 5" 02317 ; 3625 02318 TBLDATA EQU $ 3625 E62A 02319 DW S5TBL,2409H,3381 0924 350D 02320 ; 02321 ; Config table for double density 5" 02322 ; 362B 262B 02323 DW D5TBL,4511H,6506 1145 6A19 02324 ; 02325 ; Config table for single density 8" 02326 ; 3631 7D2B 02327 DW S8TBL,270FH,5464 0F27 5815 02328 ; 02329 ; Config table for double density 8" 02330 ; 3637 C22B 02331 DW D8TBL,491DH,10673 1D49 B129 02332 ; 02333 ; Parm error exit 02334 ; 363D 21CD39 02335 BADNAM LD HL,BADNAM$ 3640 DD 02336 DB 0DDH 3641 21B339 02337 BADMPW LD HL,INVMPW$ 3644 DD 02338 DB 0DDH 3645 214337 02339 NOTHARD LD HL,HARD$ 3648 C3BF29 02340 JP EXTERR 364B 3E2C 02341 PRMERR LD A,44 ;Init Parm ERROR 364D C3A829 02342 JP IOERR 02343 ; 02344 ; Load SYS2 overlay 02345 ; 3650 3E84 02346 GETSYS2 LD A,84H 3652 EF 02347 RST 28H 02348 ; 3653 20 02349 MPWBUF DB ' ' 20 20 20 20 20 20 20 20 02350 PRMTBL$ 0080 02351 VAL EQU 80H 0040 02352 SW EQU 40H 0020 02353 STR EQU 20H 0010 02354 SGL EQU 10H 365C 80 02355 DB 80H 365D 74 02356 DB SW!STR!SGL!4,'NAME',0 4E 41 4D 45 00 3662 02357 NRESP EQU $-1 3663 EB31 02358 DW NPARM+1 3665 73 02359 DB SW!STR!SGL!3,'MPW',0 4D 50 57 00 3669 02360 MRESP EQU $-1 366A 3B32 02361 DW MPARM+1 366C 44 02362 DB SW!4,'SDEN',0 53 44 45 4E 00 3672 8331 02363 DW SDPARM+1 3674 44 02364 DB SW!4,'DDEN',0 44 44 45 4E 00 367A 8831 02365 DW DDPARM+1 367C 85 02366 DB VAL!5,'SIDES',0 53 49 44 45 53 00 3683 8D31 02367 DW SIDES+1 3685 93 02368 DB VAL!SGL!3,'CYL',0 43 59 4C 00 368A 9231 02369 DW CPARM+1 368C 84 02370 DB VAL!4,'STEP',0 53 54 45 50 00 3692 9731 02371 DW STEPARM+1 3694 53 02372 DB SW!SGL!3,'ABS',0 41 42 53 00 3699 FA34 02373 DW APARM+1 369B 55 02374 DB SW!SGL!5,'QUERY',0 51 55 45 52 59 00 36A2 B532 02375 DW QPARM+1 36A4 46 02376 DB SW!6,'SYSTEM',0 53 59 53 54 45 4D 00 36AC 1C26 02377 DW SYSPRM+1 36AE 94 02378 DB VAL!SGL!4,'WAIT',0 57 41 49 54 00 36B4 2C27 02379 DW WAITPRM+1 36B6 93 02380 DB VAL!SGL!3,'DIR',0 44 49 52 00 36BB 1228 02381 DW DIRPARM+1 36BD 00 02382 NOP 02383 ; 36BE 46 02384 HELLO$ DB 'FORMAT' 4F 52 4D 41 54 36C4 02385 *GET CLIENT:3 02386 ;CLIENT/ASM - File to establish sign-on headers 02387 ; and version numbers. 02388 ; 02389 ; EACH STRING SHOULD CONTAIN ONLY 63 CHARACTERS !! 02390 ; 02391 IF @BLD631 02392 ; 12345678901234567890123456789012345678901234567890 36C4 20 02393 DB ' - 6.3.1 - Copyright 1982/83/84/86/90 by MISOSYS, ';<631> 2D 20 36 2E 33 2E 31 20 2D 20 43 6F 70 79 72 69 67 68 74 20 31 39 38 32 2F 38 33 2F 38 34 2F 38 36 2F 39 30 20 62 79 20 4D 49 53 4F 53 59 53 2C 20 36F6 49 02394 DB 'Inc., ',10 ;<631> 6E 63 2E 2C 20 20 20 20 20 20 20 0A 02395 ELSE 02396 DB ' - 6.3.0 - Copyright 1982/83/84/86 by Logical Syst' 02397 DB 'ems, Inc. ',10 02398 ENDIF 02399 ; 02400 ; DB 'All Rights Reserved. Licensed 1982/83/84 to Tandy ' 02401 ; DB 'Corporation.',10,13 02402 ; 02403 ; DB 'All Rights Reserved. Beta-TEST Level/AD, DO NOT DI' 02404 ; DB 'STRIBUTE !! ',10,13 02405 ; DB 'All Rights reserved by LSI, 8970 N. 55th St. Milwa' 02406 ; DB 'ukee, Wisc. ',10,13 3703 41 02407 DB 'All Rights Reserved. Unauthorized duplication is p' 6C 6C 20 52 69 67 68 74 73 20 52 65 73 65 72 76 65 64 2E 20 55 6E 61 75 74 68 6F 72 69 7A 65 64 20 64 75 70 6C 69 63 61 74 69 6F 6E 20 69 73 20 70 3735 72 02408 DB 'rohibited. ',10,13 6F 68 69 62 69 74 65 64 2E 20 20 0A 0D 3743 43 02409 HARD$ DB 'Cannot "SYSTEM" a floppy',CR 61 6E 6E 6F 74 20 22 53 59 53 54 45 4D 22 20 61 20 66 6C 6F 70 70 79 0D 02410 IF @BLD631 375C 4F 02411 NOMEM$ DB 'Out of memory',CR ;<631> 75 74 20 6F 66 20 6D 65 6D 6F 72 79 0D 02412 ELSE 02413 NOMEM$ DB 'Insufficient memory for ' 02414 DB 'specified format',CR 02415 ENDIF 376A 57 02416 WHDRV$ DB 'Which drive is to be used ? ',3 68 69 63 68 20 64 72 69 76 65 20 69 73 20 74 6F 20 62 65 20 75 73 65 64 20 3F 20 03 3787 44 02417 DSKNAM$ DB 'Diskette name ? ',3 69 73 6B 65 74 74 65 20 6E 61 6D 65 20 3F 20 03 3798 4D 02418 MPW$ DB 'Master password ? ',3 61 73 74 65 72 20 70 61 73 73 77 6F 72 64 20 3F 20 03 37AB 4E 02419 NUMCYL$ DB 'Number of cylinders ? ',3 75 6D 62 65 72 20 6F 66 20 63 79 6C 69 6E 64 65 72 73 20 3F 20 03 02420 IF @BLD631 37C2 42 02421 STEP5$ DB 'Boot strap step rate ' ;<631> 6F 6F 74 20 73 74 72 61 70 20 73 74 65 70 20 72 61 74 65 20 02422 ELSE 02423 STEP5$ DB 'Boot strap stepping rate ' 02424 ENDIF 37D7 3C 02425 DB '<6, 12, 20, 30 msecs> ? ',3 36 2C 20 31 32 2C 20 32 30 2C 20 33 30 20 6D 73 65 63 73 3E 20 3F 20 03 02426 IF @BLD631 37F0 42 02427 STEP8$ DB 'Bootstrap step rate ' ;<631> 6F 6F 74 73 74 72 61 70 20 73 74 65 70 20 72 61 74 65 20 02428 ELSE 02429 STEP8$ DB 'Bootstrap stepping rate ' 02430 ENDIF 3804 3C 02431 DB '<3, 6, 10, 15/20 msecs> ? ',3 33 2C 20 36 2C 20 31 30 2C 20 31 35 2F 32 30 20 6D 73 65 63 73 3E 20 3F 20 03 381F 45 02432 SIDES$ DB 'Enter number of sides <1,2> ? ',3 6E 74 65 72 20 6E 75 6D 62 65 72 20 6F 66 20 73 69 64 65 73 20 3C 31 2C 32 3E 20 3F 20 03 383E 53 02433 DEN?$ DB 'Single or Double density ? ',3 69 6E 67 6C 65 20 6F 72 20 44 6F 75 62 6C 65 20 64 65 6E 73 69 74 79 20 3C 53 2C 44 3E 20 3F 20 03 3860 44 02434 NOTRDY$ DB 'Drive not ready',CR 72 69 76 65 20 6E 6F 74 20 72 65 61 64 79 0D 3870 57 02435 CANTWR$ DB 'Write protected disk',CR 72 69 74 65 20 70 72 6F 74 65 63 74 65 64 20 64 69 73 6B 0D 3885 44 02436 NODRV$ DB 'Drive not in system',CR 72 69 76 65 20 6E 6F 74 20 69 6E 20 73 79 73 74 65 6D 0D 3899 4C 02437 PMTDST$ DB 'Load destination diskette',CR 6F 61 64 20 64 65 73 74 69 6E 61 74 69 6F 6E 20 64 69 73 6B 65 74 74 65 20 20 3C 45 4E 54 45 52 3E 0D 38BC 44 02438 HASDAT$ DB 'Disk contains data -- ',3 69 73 6B 20 63 6F 6E 74 61 69 6E 73 20 64 61 74 61 20 2D 2D 20 03 38D3 4E 02439 NOFMT$ DB 'Non-standard format',CR 6F 6E 2D 73 74 61 6E 64 61 72 64 20 66 6F 72 6D 61 74 0D 38E7 55 02440 CANTRD$ DB 'Unreadable directory',CR 6E 72 65 61 64 61 62 6C 65 20 64 69 72 65 63 74 6F 72 79 0D 38FC 4E 02441 NODIR$ DB 'Non-initialized directory',CR 6F 6E 2D 69 6E 69 74 69 61 6C 69 7A 65 64 20 64 69 72 65 63 74 6F 72 79 0D 3916 4E 02442 PACKID$ DB 'Name=XXXXXXXX Date=MM/DD/YY',CR 61 6D 65 3D 58 58 58 58 58 58 58 58 20 20 44 61 74 65 3D 4D 4D 2F 44 44 2F 59 59 0D 3933 20 02443 OLDMPW$ DB ' Enter its Master Password' 20 45 6E 74 65 72 20 69 74 73 20 4D 61 73 74 65 72 20 50 61 73 73 77 6F 72 64 394E 20 02444 DB ' or to abort: ',3 6F 72 20 3C 42 52 45 41 4B 3E 20 74 6F 20 61 62 6F 72 74 3A 20 03 3965 2A 02445 LASTMSG DB '*** The target drive is a hard disk ***',LF 2A 2A 20 54 68 65 20 74 61 72 67 65 74 20 64 72 69 76 65 20 69 73 20 61 20 68 61 72 64 20 64 69 73 6B 20 2A 2A 2A 0A 398D 41 02446 SURE?$ DB 'Are you sure you want to format it ? ',3 72 65 20 79 6F 75 20 73 75 72 65 20 79 6F 75 20 77 61 6E 74 20 74 6F 20 66 6F 72 6D 61 74 20 69 74 20 3F 20 03 39B3 0A 02447 INVMPW$ DB LF,'Invalid Master Password',LF,CR 49 6E 76 61 6C 69 64 20 4D 61 73 74 65 72 20 50 61 73 73 77 6F 72 64 0A 0D 39CD 49 02448 BADNAM$ DB 'Invalid Disk Name',CR 6E 76 61 6C 69 64 20 44 69 73 6B 20 4E 61 6D 65 0D 39DF 44 02449 PAKNAM$ DB 'DATADISK' 41 54 41 44 49 53 4B 39E7 50 02450 PAKMPW$ DB 'PASSWORD' 41 53 53 57 4F 52 44 02451 ; 3100 02452 END FORMAT 3100 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]