TITLE HARD DISK FORMAT UTILITY LIST NOCOND ;*************************************************************************** ; ; HARD DISK FORMAT PROGRAM ; ;*************************************************************************** ; ; FORMATH is a system utility which provides a means to write a ; format on any of the drives accessed by the hard disk controller. ; ;*************************************************************************** ; ; REVISION STATUS: ; ; 0.00 - 10 MAY 88 GRH ; Modify from FORMAT8 for hard disk. Need caused by hard disk data ; errors. Realized I have no format utility! ; ; VERSN EQU 000 ;CHANGE HERE FOR SIGN-ON CHANGE ; ;*************************************************************************** SUBTTL DECLARATIONS ;=========================================================================== ; ; ASSEMBLY CONTROL ; ;=========================================================================== FALSE EQU 0 TRUE EQU NOT FALSE ; DIAG EQU TRUE ;=========================================================================== ; ; CONSTANTS ; ;=========================================================================== CTRLC: EQU 3 ;REQUEST REBOOT CPM LF: EQU 0AH ;LINE FEED CR: EQU 0DH ;CARRIAGE RETURN BS EQU 08H ;BACKSPACE ; NDRVS EQU 4 ;MAX NUMBER OF DRIVES SECSZ: EQU 128 ;128 BYTES PER SECTOR DSIZE EQU 8 ;DISK SIZE {5, 8} ; SKEW EQU 6 ;SKEW FACTOR HDSPT EQU 128 ;MAX SECTORS PER TRACK ;=========================================================================== ; ; LOCATIONS ; ;=========================================================================== REBOOT: EQU 0 ;REBOOT ADDR TPA: EQU 100H ;TRANSIENT PROGRAM AREA ;=========================================================================== ; ; BDOS CALL VECTORS ; ;=========================================================================== WBOOT EQU 0000H ;SYSTEM WARM BOOT BDOS: EQU 0005H ;SYSTEM CALL ADDR ;=========================================================================== ; ;*INCLUDE COMIOPB.DEF ;*INCLUDE ISASI.DEF ; ;=========================================================================== LIST OFF *INCLUDE COMIOPB.DEF *INCLUDE ISASI.DEF LIST ON SUBTTL MAIN PROGRAM ORG TPA ;--------------------------------------------------------------------------- ; ; PROGRAM ENTRY POINT ; ;--------------------------------------------------------------------------- JP INIT ;INITIALIZE ;########################################################################### ; ; COPYRIGHT NOTICE ; ;########################################################################### SIGNON: DB 'M5b 8" Hard Disk Format Utility Ver ' DB (VERSN / 100) + '0' DB '.' DB ((VERSN - ((VERSN / 100) * 100)) / 10) + '0' DB (VERSN % 10) + '0' DB CR,LF DB 'Copyright (c) 1988 GRH Enterprises' DB '$' ;--------------------------------------------------------------------------- ; ; MAIN PROGRAM CONTINUES ; ;--------------------------------------------------------------------------- INIT: ; ; SET UP LOCAL STACK ; LD SP,(BDOS + 1) DEC SP DEC SP ; ; OUTPUT SIGNON MESSAGE ; LD DE,SIGNON ;OUTPUT MESSAGE CALL MSGOT ; ; TEST IF CONTROLLER PRESENT ; IN A,(HSTATUS) ;FETCH STATUS PORT DATA INC A ;IF 0FFH THEN NOT INSTALLED JR NZ,CINSTLD ; ; CONTROLLER NOT INSTALLED, ERROR ; LD DE,CNIM CALL MSGOT JP REBOOT ;QUIT ; ; CINSTLD: ; ; CLEAR THE CONTROLLER ; LD A,1 SHL HRESET OUT (HCMD),A ; EX (SP),HL ;WAIT FOR FDC TO CATCH UP EX (SP),HL EX (SP),HL EX (SP),HL ; CLRWT: IN A,(HSTATUS) ;WAIT FOR DONE AND A,1 SHL HBUSYB JR NZ,CLRWT ; ; TOP OF DRIVE FORMAT LOOP ; FMTDSK: ; ; SET UP REGS ; LD A,DDFMT LD (FIOPB + PBCMDO),A ; ; SELECT DRIVE ; @@@ MUST CORRECT DRIVE A/B INTO HEAD BIT 1 CALL SELDR JP C,0 ;ERROR- QUIT ; ; REQUEST INTERLEAVE FACTOR ; LD DE,INITLM CALL GETDPAR ; ; IF INTERLEAVE OUT OF BOUNDS THEN ERROR ; LD HL,16 SBC HL,DE JP NC,FMTDK2 ; ; PARAMETER ERROR ; PARERR: LD DE,PERRM CALL MSGOT JR FMTDSK ; ; ; ELSE SET INTERLEAVE ; FMTDK2: LD A,(FIOPB + PBSECO) OR A,E ;ADD INTO DRIVE (HEAD) LD (FIOPB + PBSECO),A ; ; REQUEST USER FOR START ; LD DE,REQSTM CALL MSGOT ; ; IF NOT CORRECT RESPONSE THEN ABORT ; CALL CI CP A,CR JP NZ,FMTDSK ; ; SET UP IOPB FOR 1ST TRACK ; LD HL,0 LD (FIOPB + PBTRKO),HL ; ; FORMAT TRACK 0 UNIQUE DUE TO ID SECTOR ; CALL FMTTRK JR NZ,FMTDSK ;IF ERROR THEN ABORT ; ; WHILE ON TRACK 0, WRITE THE DESCRIPTOR SECTOR & LOGON DRIVE ; CALL WRTID ;WHILE WE'RE HERE, WRITE ID SECTOR JR NZ,FMTDSK ; ; DO SIDE 1 ; DOSID1: LD HL,FIOPB + PBSECO SET 6,(HL) ; CALL FMTTRK JR NZ,FMTDSK ; ; TRACK 0 DONE, GO DO REMAINING TRACKS ; FMTLP: ; ; BUMP TRACK ; LD HL,(FIOPB + PBTRKO) INC HL LD (FIOPB + PBTRKO),HL ; ; IF LAST TRACK DONE THEN EXIT LOOP ; LD DE,MAXTRKS OR A,A SBC HL,DE JP NC,DOCHK ; ; ELSE FORMAT NEXT TRACK, SIDE 0 ; LD HL,FIOPB + PBSECO RES 6,(HL) ; CALL FMTTRK JP DOSID1 ; ; ; FORMAT DONE, GO TEST FOR READ ERRORS ; DOCHK CALL CHECK ;CHECK FOR READ ERRORS JP FMTDSK ;READY FOR ANOTHER DISK SUBTTL SUBROUTINES ;*************************************************************************** ; ; MESSAGE OUTPUT SUBR ; ENTRY- DE= PTR TO '$' TERMINATED TEXT ; EXIT - ? ; ;*************************************************************************** MSGOT: LD C,9 ;PRINT STRING FUNCTION JP BDOS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT SUBR ; EXIT - A= CHAR AND 7FH ; BC, DE, HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CI: ; ; GET CHARACTER ; LD C,1 ;CONSOLE READ FUNCTION # CALL BDOS ; ; MASK BIT 7 ; AND A,7FH ; ; IF CTRL-C THEN ABORT ; CP A,CTRLC JP Z,REBOOT ; ; CONVERT LOWER CASE TO UPPER CASE ; CP A,'a' RET C ; CP A,'z' + 1 RET NC ; AND A,5FH RET ;*************************************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- E= CHAR ; ;*************************************************************************** CO: LD C,2 ;CONSOLE OUTPUT FUNCTION # JP BDOS ;*************************************************************************** ; ; PUT DECIMAL SUBROUTINE OUTPUT 5 DIGIT DECIMAL NUMBER ON CONSOLE ; ENTRY- HL= VALUE TO OUTPUT ; EXIT - HL, DE, BC, A= ? ; ;*************************************************************************** PUTD: ; ; PUT DATA IN PROPER REGISTERS ; EX DE,HL ; ; INIT DIGITS TO 0 ; LD HL,UNIT LD B,5 ; SET0: LD (HL),0 INC HL DJNZ SET0 ; ; PROCESS TENTHOUSANDS DIGIT ; DEC HL LD BC,-10000 CALL DECDIG ; ; PROCESS THOUSANDS DIGIT ; LD BC,-1000 CALL DECDIG ; ; PROCESS HUNDREDS DIGIT ; LD BC,-100 CALL DECDIG ; ; PROCESS TENS DIGIT ; LD BC,-10 CALL DECDIG ; ; REMAINDER IS UNITS DIGIT ; LD (HL),E ; ; OUTPUT DIGITS WITH LEADING SPACES ; LD HL,TTHOU ;SET PTR LD BC,500H ;5 DIGITS, NOCONVERT 0 TO SPACE = FALSE ; NXTDEC: LD A,(HL) ;FETCH DIGIT DEC HL ;NEXT DIGIT ADD A,'0' ;CONVERT TO ASCII CP A,'0' ;IF NOT 0 THEN NOCONVERT TO SPACE = TRUE JR NZ,FIRST ; INC C ;ELSE IF FLAG != 0 THEN DIGIT OCCURRED DEC C JR NZ,OUTNUM ; LD A,B ;AT LEAST ONE 0 DEC A LD A,'0' JR Z,OUTNUM ; LD A,' ' ;PAD WITH LEADING BLANKS UNTIL DIGIT JR OUTNUM ; ; NON-0 DIGIT OCCURRED, FLAG = TRUE ; FIRST: INC C ; ; OUTPUT DIGIT ; OUTNUM: PUSH HL PUSH BC LD E,A LD C,2 CALL BDOS POP BC POP HL DJNZ NXTDEC ; ; DONE ALL 5 DIGITS ; RET ;*************************************************************************** ; ; OUTPUT CRLF SUBROUTINE ; EXIT - HL, DE, BC, AF= ? ; ;*************************************************************************** CRLF: LD DE,CRLFM JP MSGOT ;*************************************************************************** ; ; CREATE DECIMAL DIGIT SUBROUTINE ; ENTRY- HL= PTR TO PLACE TO STORE DIGIT ; DE= VALUE TO CONVERT ; BC= DIVISOR FOR DIGIT ; EXIT - HL= PTR TO NEXT DIGIT ; DE= REMAINDER ; BC= -BC ; ;*************************************************************************** DECDIG: ; ; SAVE DIGIT PTR ; PUSH HL ; ; SUBTRACT DIVISOR FROM VALUE ; EX DE,HL ADD HL,BC ; ; IF OVERFLOW THEN EXIT ; JR NC,ADDIT ; ; ELSE RESTORE DIGIT PTR AND INCREMENT DIGIT ; EX DE,HL ; POP HL INC (HL) ; ; NO OVERFLOW, TRY AGAIN ; JR DECDIG ; ; ; OVERFLOW PRODUCED NEGATIVE NUMBER, RESTORE BY ADDING BACK ; ADDIT: OR A,A ;ADD BACK BY SUBTRACTING -N SBC HL,BC EX DE,HL ; ; SET UP FOR NEXT LEAST SIGNIFICANT DIGIT ; POP HL DEC HL RET UNIT: DS 4 TTHOU: DS 1 ;*************************************************************************** ; ; WRITE ID SECTOR ; EXIT - AF= /0: ERROR ; ;*************************************************************************** WRTID: ; ; SET UP IOPBs ; LD A,(FIOPB + PBDRVO) LD (WIDIOPB + PBDRVO),A LD (LOGIOPB + PBDRVO),A ; LD HL,IDSIMG LD (WIDIOPB + PBDMAO),HL ; LD HL,IDSECT ;SET ID SECTOR LD (WIDIOPB + PBSECO),HL ; ; EXECUTE THE IOPB ; LD HL,WIDIOPB ;PASS PTR TO IOPB CALL EXECIOPB JR NZ,WIDERR ;IF ERROR THEN RETURN ; ; OK SO FAR, PERFORM LOGON TO SET CONTROLLER FLAGS ; LD HL,LOGIOPB CALL EXECIOPB RET Z ;IF LOGON OK THEN RETURN ; ; ERROR ENCOUNTERED, TELL IT ; WIDERR: LD DE,MSGNC ;ELSE OUTPUT ERROR & RETURN CALL MSGOT XOR A,A DEC A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FORMAT TRACK FUNCTION ; EXIT - AF= /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FMTTRK: ; ; DISPLAY FORMATTING DATA ON CONSOLE ; LD DE,FMTGM ;OUTPUT FORMATTING MESSAGE CALL MSGOT ; LD HL,(FIOPB + PBTRKO) CALL PUTD ; LD DE,ENDEQM CALL MSGOT ; ; EXECUTE FORMAT TRACK ; LD HL,FIOPB CALL EXECIOPB RET Z ;IF NO ERROR THEN RETURN ; ; IF SEEK ERROR THEN TELL DIFFERENT MESSAGE ; LD DE,MSGNC ;ELSE OUTPUT ERROR MSG CP A,SEEKERR ;IF SEEK ERROR THEN DIFFERENT MESSAGE JR NZ,FTE1 ; LD DE,SKERM ; FTE1: CALL MSGOT ; ; RETURN ERROR FLAG ; XOR A,A DEC A RET ;*************************************************************************** ; ; SELECT DRIVE SUBR ; EXIT - CF= ERROR ; ;*************************************************************************** SELDR: ; ; OUTPUT PROMPT ; LD DE,MSGFD CALL MSGOT ; ; GET RESPONSE ; CALL CI ; ; IF RETURN THEN RETURN CF ; CP A,CR SCF RET Z ; ; SAVE DRIVE LETTER IN MESSAGES ; LD (DRLTR),A ;ELSE SAVE DRIVE LETTER & TEST FOR LEGAL LD (LTRSE),A ; ; TEST FOR LEGAL DRIVE {0..3} ; SUB A,'0' CP A,4 JR C,NMBRD ;IF LEGAL THEN CONTINUE ; ; ILLEGAL DRIVE, REPEAT ; LD DE,MSGSE ;PRINT SELECT ERROR MESSAGE CALL MSGOT JR SELDR ; ; ; DRIVE SELECTED ; NMBRD: LD (FIOPB + PBDRVO),A LD (WIDIOPB + PBDRVO),A LD (RDIOPB + PBDRVO),A ; ; DONE ; RET ;*************************************************************************** ; ; PAUSE FOR USER SETUP ; EXIT - ZF= PROPER USER RESPONSE ; ;*************************************************************************** PAUSE: ; ; OUTPUT PROMPT ; LD DE,MSGXX ;PRINT TYPE CR WHEN READY MSG CALL MSGOT ; ; GET USER RESPONSE ; CALL CI ; ; IF NOT CR THEN RETURN NZ ; CP A,CR RET ;*************************************************************************** ; ; CHECK FUNCTION CHECKS ALL TRACKS BY READING BACKWARD FROM LAST TRACK ; ;*************************************************************************** CHECK: ; ; SET UP ; LD HL,(FIOPB + PBTRKO) ;START WITH LAST TRACK FORMATTED DEC HL LD (RDIOPB + PBTRKO),HL ; LD A,(FIOPB + PBDRVO) ;SAME DRIVE LD (RDIOPB + PBDRVO),A ; ; NEW LINE ; LD DE,CRLFM CALL MSGOT ; ; ALL SET TO DO TRACK ; VLP: ; ; SET TRACK SIZE ; RDTRKL: SETNSEC: LD A,HDSPT ;OFFSET FOR TEST LD (NSECTS),A ; ; START WITH 1ST SECTOR ; LD A,(FIOPB + PBSECO) ;FETCH HEAD DATA AND A,10000000B ;MASK OFF SIDE & SECTOR BITS ; ; READ LOOP ; RDLP: ; ; SAVE CURRENT SECTOR ; LD (CURSEC),A ; ; SET SECTOR ; RDSOK: LD (RDIOPB + PBSECO),A ;SAVE CURRENT SECTOR ; ; CHECK CONSOLE FOR ABORT ; LD C,11 ;GET CONSOLE STATUS CALL BDOS ; OR A,A JP Z,NOABRT ; LD C,1 ;FLUSH CONSOLE CHAR BEFORE ABORT CALL BDOS ; LD DE,ABRTDM ;OUTPUT ABORTED MESSAGE JP MSGOT ; ; NOABRT: ; ; IF LAST SECTOR OF TRACK THEN DONE ; LD HL,NSECTS LD A,(CURSEC) AND A,7FH ;MASK OFF DRIVE BIT CP A,(HL) JR NC,TDONE ; ; OUTPUT TESTING TRACK MESSAGE ; LD DE,TSTGM CALL MSGOT ; LD HL,(RDIOPB + PBTRKO) CALL PUTD ; ; OUTPUT SIDE NO. ; LD DE,SIDEM CALL MSGOT ; LD A,(RDIOPB + PBSECO) RLCA RLCA AND A,1 LD L,A LD H,0 CALL PUTD ; ; OUTPUT SECTOR ; LD DE,SECM CALL MSGOT ; LD HL,(RDIOPB + PBSECO) RES 7,L ;MASK OFF SIDE BIT RES 6,L CALL PUTD ; ; EXECUTE THE READ ; LD HL,RDIOPB CALL EXECIOPB ; LD DE,ERM ;IF READ ERROR THEN OUTPUT ERROR CALL NZ,MSGOT ; ; NEXT SECTOR & REPEAT ; LD A,(CURSEC) INC A JP RDLP ; ; ; TRACK IS DONE ; TDONE: ; ; IS DOUBLE SIDED, TOGGLE SIDE ; LD A,(RDIOPB + PBSECO) XOR A,40H ; ; BACK TO 1ST SECTOR ; AND A,11000000B ; ; IF SIDE == 1 THEN GO DO IT ; BIT 6,A JP NZ,RDLP ; TD1: ; ; TOGGLED BACK TO SIDE 0, NEXT TRACK ; RDNXTT: ; ; SAVE NEW SECTOR DATA ; LD (RDIOPB + PBSECO),A ; ; NEXT TRACK ; LD A,(RDIOPB + PBTRKO) DEC A LD (RDIOPB + PBTRKO),A ; ; IF NEXT TRACK < 0 THEN RETURN ; JP P,RDLP ; LD DE,OKM JP MSGOT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXECIOPB: ; ; SET UP IOPB ADDRESS ; LD A,L OUT (HDATA),A LD A,HIOPBL OUT (HCMD),A ; EXEC1: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,EXEC1 ; CALL GETRES RET C ; LD A,H OUT (HDATA),A LD A,HIOPBH OUT (HCMD),A ; EXEC2: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,EXEC2 ; CALL GETRES RET C ; XOR A,A OUT (HDATA),A LD A,HIOPBX OUT (HCMD),A ; EXEC3: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,EXEC3 ; CALL GETRES RET C ; ; EXECUTE THE IOPB ; LD A,HEXEC OUT (HCMD),A EXEC4: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,EXEC4 ; ; FALL INTO GET RESULTS FUNCTION ; ;*************************************************************************** ; ; GET FUNCTION RESULT PROCEDURE DISPLAYS ERRORS ; ENTRY- HL= IOPB PTR ; EXIT - NZ= ERROR ; ;*************************************************************************** GETRES: ; ; IF NO ERRORS THEN RETURN ; IN A,(HSTATUS) AND A,[1 SHL HERRB] + [1 SHL HFERRB] RET Z ; ; ERROR, SAVE REGS ; PUSH IY ; ; PUT IOPB PTR WHERE WE CAN USE OFFSETS ; PUSH HL POP IY ; ; FETCH RESULT STATUS ; LD A,(IY+PBSTATO) ; ; PRESET RETURN DATA ; OR A,A PUSH AF ; ; DISPLAY PREFIX MESSAGE ; PUSH IY ;SAVE REGS 1ST PUSH AF ; LD DE,IOPBERM CALL MSGOT ; ; DISPLAY ERROR DATA ; POP AF LD L,A LD H,0 CALL PUTD ; POP IY PUSH IY LD L,(IY + PBST1O) LD H,0 CALL PUTD ; ; RESTORE REGS ; POP HL ;IOPB PTR POP AF ;STATUS POP IY ;IY ; ; DONE ; RET ;%%% ; *INCLUDE DPBDEF.Z80 SUBTTL DISK DESCRIPTOR SECTOR DATA ;########################################################################### ; ; DESCRIPTOR SECTOR ; ;########################################################################### IDSIMG: ; ; RESERVE FIRST 16 BYTES FOR BOOT, IF NEEDED ; REPT 16 LIST OFF DB 0E5H LIST ON ENDM ; ; DISK DESCRIPTOR SECTOR KEY ; DB 'Disk Descriptor ' ; REPT IDSIMG + 20H - $ LIST OFF DB 0E5H LIST ON ENDM ; ; DISK PARAMETER BLOCK IMAGE, TO BE TRANSFERRED TO BIOS AT LOGON TIME ; DW 128 ;SECTORS PER TRACK DB 5 ;BLOCK SHIFT FACTOR DB 31 ;BLOCK MASK DB 1 ;NULL MASK DW 1015 ;DISK SIZE -1 DW 1152/2 ;DIRECTORY MAXIMUM DB 11111111B ;ALLOC 0 DB 10000000B ;ALLOC 1 DW 0 ;CHECK SIZE DW 2 ;TRACK OFFSET ; ; PAD TO FORMAT DATA WITH E5H ; REPT IDSIMG + 40H - $ LIST OFF DB 0E5H LIST ON ENDM ; ; DISKETTE FORMAT DATA ; DB 01101000B ;DISKETTE FLAGS ; REPT 3 DB 32 ;;SECTORS PER TRACK DB 1 ;;BYTES PER SECTOR {0:128, 1:256, 2:512, 3:1024} ENDM ; DB 0,0 ;MED & HIGH PRECOMP START TRACKS ; ; FILL REMAINING SECTOR DATA WITH E5H ; REPT IDSIMG + 128 - $ ;FILL OUT SECTOR LIST OFF DB 0E5H LIST ON ENDM ;########################################################################### ; ; MESSAGES ; ;########################################################################### MSGSE: DB CR,LF,LF LTRSE: DB ' Is not a valid selection.$' MSGFD: DB CR,LF,LF,'Write format on drive (CR to abort): $' MSGNC: DB CR,LF,LF,'Execution Error!$' SKERM: DB CR,LF,'Seek Error. Is Drive Double Sided?$' MSGXX: DB CR,LF,LF,'Type CR when drive ' DRLTR: DB ' is ready. $' FMTGM DB CR,'Formatting track $' ENDEQM DB ' End = $' TSTGM DB CR,'Testing track $' SIDEM DB ' Side $' SECM DB ' Sector $' CRLFM DB CR,LF,'$' OKM DB ' Ok',CR,LF,'$' ERM DB ' Error!',CR,LF,'$' ABRTDM DB ' ** ABORTED **',CR,LF,'$' CNIM DB CR,LF,'Controller not installed!$' IF DIAG IOPBERM DB CR,LF,'IOPB error = (status fdc status) $' ENDIF SUBTTL VARIABLE DECLARATIONS NSECTS DS 1 ;NUMBER OF SECTORS IN TRACK CURSEC DS 1 ;CURRENT SECTOR LASTTRK DS 2 ;LAST TRACK ; ; FORMAT TRACK IOPB ; FIOPB DB 3 ;FORMAT TRACK DB 0 ;DRIVE DW 0 ;TRACK DW 6 ;HEAD/INTERLEAVE DB 01101000B ;FLAGS DW SECBUF ;DMA XFER DB 0 ;DMA XADDR DB 0 ;STATUS DB 0,0,0,0,0 ; ; WRITE ID SECTOR IOPB ; WIDIOPB: DB 2 ;WRITE SECTOR DB 0 ;DRIVE DW 0 ;TRACK DW 1 ;SECTOR DB 0 ;FLAGS DW SECBUF ;DMA XFER DB 0 ;DMA XADDR DB 0 ;STATUS DB 0,0,0,0,0 ; ; READ SECTOR IOPB ; RDIOPB: DB 1 ;READ SECTOR DB 0 ;DRIVE DW 0 ;TRACK DW 0 ;SECTOR DB 0 ;FLAGS DW SECBUF ;DMA XFER DB 0 ;DMA XADDR DB 0 ;STATUS DB 0,0,0,0,0 ; ; LOGON IOPB ; LOGIOPB: DB 0 DB 0 ;DRIVE DW 0 ;TRACK DW 1 ;SECTOR DB 0 ;FLAGS DW SECBUF ;DMA XFER DB 0 ;DMA XADDR DB 0 ;STATUS DB 0,0,0,0,0 ; ; READ SECTOR BUFFER ; SECBUF DS 1024 ;SECTOR BUFFER END