[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 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 be
29F8 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 on
32D0 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 at nemesis.lonestar.org]