TITLE 8" FLOPPY DISK FORMAT UTILITY FOR JADE DD CONTROLLER LIST NOCOND ;*************************************************************************** ; ; JADE DOUBLE D DISK FORMAT PROGRAM ; ;*************************************************************************** ; ; FORMATn is a system utility which provides a means to write a single or ; double density format on any of the drives accessed by the DD controller. ; ;*************************************************************************** ; ; REVISION STATUS: ; ; X.1 - 30 DEC 86 GRH ; Fix bug causing display of side 1 sector number > 32768. ; Remove sector skew for double density in order to get failure data. ; ; X.2 - 31 DEC 86 GRH ; Reinstall double density skew factor. ; Add precomp thresholds to ID sector data & add logon to track 0 ; format after writing ID sector ; ; 1.0 - 8 FEB 81 GRH ; RELEASE ; VERSN EQU '00' ;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} IF DSIZE = 5 DDPORT DL DDPORT5 ;JADE CONTOLLER PORT SKEW EQU 6 ;SKEW FACTOR FOR DOUBLE DENSITY DDSPTC EQU 29 ;DOUBLE DENSITY MAX SECTORS PER TRACK SDSPTC EQU 16 ;SINGLE DENSITY MAX SECTORS PER TRACK ENDIF IF DSIZE = 8 DDPORT DL DDPORT8 ;JADE CONTOLLER PORT SKEW EQU 6 ;SKEW FACTOR FOR DOUBLE DENSITY DDSPTC EQU 48 ;DOUBLE DENSITY MAX SECTORS PER TRACK SDSPTC EQU 26 ;SINGLE DENSITY MAX SECTORS PER TRACK ENDIF ;=========================================================================== ; ; 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 JDDLOC.DEF ;*INCLUDE JDDDISK.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE COMIOPB.DEF ; ;=========================================================================== LIST OFF *INCLUDE JDDLOC.DEF *INCLUDE JDDDISK.DEF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF LIST ON SUBTTL MACROS ;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;; ;; GENERATE THE TRANSLATE TABLE ;; ;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS ;;ONCE FOR EACH SECTOR LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;;ADD IN SKEW FACTOR ;; IF NXTSEC > #SECTORS ;;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;; ;; GENERATE THE ID SECTOR DATA ;; ;; ARGS: ;; LS= LOGICAL SECTORS PER TRACK ;; BS= BLOCK SHIFT FACTOR ;; BL= BLOCK MASK ;; EM= EXTENT MASK ;; DS= DISK SIZE IN CP/M BLOCKS ;; DI= DIRECTORY SIZE ;; A0= ALLOCATION MASK 0 ;; A1= ALLOCATION MASK 1 ;; CK= CHECK SIZE ;; OF= OFFSET ;; PS= PHYSICAL SECTORS PER TRACK ;; FG= PHYSICAL DISK FLAGS ;; PT= PHYSICAL DISK TRACKS ;; ;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GENSPT MACRO #FLG,#FG,#PS IF #FLG AND 1 DB DDSPTC ELSE DB SDSPTC ENDIF DB #FG SHR 6 ENDM ; GENIDD MACRO #LS,#BS,#BL,#EM,#DS,#DI,#A0,#A1,#CK,#OF,#PS,#FG,#PT DW #LS DB #BS,#BL,#EM DW #DS,#DI DB #A0,#A1 DW #CK,#OF DB #FG GENSPT #FG, #FG, #PS GENSPT #FG SHR 1, #FG, #PS GENSPT #FG SHR 2, #FG, #PS DB (#PT / 3) + 1 DB ((#PT / 3) * 2) + 1 ENDM SUBTTL MAIN PROGRAM ORG TPA ;--------------------------------------------------------------------------- ; ; PROGRAM ENTRY POINT ; ;--------------------------------------------------------------------------- JP INIT ;INITIALIZE ;########################################################################### ; ; COPYRIGHT NOTICE ; ;########################################################################### SIGNON: DB 'Jade Double D 8" disk format Utility Ver ' DB HIGH VERSN,'.',LOW VERSN,CR,LF DB 'Copyright (c) 1983,1986 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,(DDPORT) ;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 ; ; ; SET UP CONTROLLER ADDRESS ; CINSTLD: DEC A ;OFFSET BACK TO DATA AND A,DDSASW ;MASK ADDRESS SWITCH RLCA OR A,0E0H ;ASSUME 111xxx00B LD H,A LD L,0 LD (DDADDR),HL ; ; CLEAR THE CONTROLLER ; LD A,DDBGN OUT (DDPORT),A ; IF DSIZE = 5 EX (SP),HL ;WAIT FOR FDC TO CATCH UP EX (SP),HL EX (SP),HL EX (SP),HL ; ENDIF CLRWT: IN A,(DDPORT) ;WAIT FOR DONE AND A,DDSHLT JR NZ,CLRWT ; ; OUTPUT MENU ; FUNBG: LD DE,MSGFL ;OUTPUT FUNCTION LIST CALL MSGOT ; ; GET FUNCTION SELECTION FROM USER ; CALL CNSIN ;GET CONSOLE CHAR LD (LTRSE),A ;SAVE CHAR FOR ERROR MESSAGE ; ; CHECK FOR RANGE ; SUB A,'0' CP A,NFUNCS JR C,FUNOK ; ; UNKNOWN FUNCTION, ERROR ; FUNERR: LD DE,MSGSE ;ELSE OUTPUT ERROR MSG CALL MSGOT JR FUNBG ;REPEAT ; ; FUNCTION RANGE OK, COMPUTE EXECUTION ADDRESS ; FUNOK: LD HL,FUNTBL LD E,A LD D,0 ADD HL,DE ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD HL,FUNBG ;SET UP RETURN ADDRESS PUSH HL EX DE,HL JP (HL) ;EXECUTE COMMAND ; ; FUNCTION ADDRESS TABLE ; FUNTBL: DW FUN0 ;SINGLE SIDED SINGLE DENSITY 26SPT (241K) DW FUN1 ;DOUBLE SIDED SINGLE DENSITY 26SPT (480K) DW FUN2 ;SINGLE SIDED SINGLE DENSITY IBM 3740 (241K) DW FUN3 ;DOUBLE SIDED SINGLE DENSITY IBM 3740 (480K) DW FUN4 ;SINGLE SIDED DOUBLE DENSITY 48SPT (440K) DW FUN5 ;DOUBLE SIDED DOUBLE DENSITY 48SPT (880K) DW NOFUN DW NOFUN DW NOFUN DW CUSTOM NFUNCS EQU ($ - FUNTBL) / 2 ; ; NO SUPPORTED FUNCTION STUB ; NOFUN: POP HL ;RESTORE STACK JR FUNERR ;TELL ERROR ;--------------------------------------------------------------------------- ; ; SELECT PARAMETERS ; ;--------------------------------------------------------------------------- ; ; 0 ; FUN0: LD HL,SSSDID ;JADE SSSD 26SPT ; ; COMMON CODE ; DO48: LD A,77 - 1 ; ; COMMON INIT CODE ; DOCOMN: ; ; SET LAST TRACK OF DISK ; LD (LASTTRK),A ; ; OVERLAY DPB DATA ; LD DE,IDSIMG + IDDPBO LD BC,IDDPBSZ LDIR ; ; OVERLAY DISK FORMAT DATA ; LD DE,IDSIMG + IDDFFO LD A,(HL) ;PULL OFF FLAGS FOR FORMAT IOPB LD BC,IDFSIZE LDIR ; ; PASS DISK FLAGS WITH FORMAT COMMAND ; LD (IOPB + PBFLGO),A ; ; DO FORMAT ; JP FMTDSK ; ; ; 1 ; FUN1: LD HL,DSSDID ;JADE DSSD 26SPT JR DO48 ; ; ; 2 ; FUN2: LD HL,SSSD40ID ;IBM 3740 SSSD 26SPT JR DO48 ; ; ; 3 ; FUN3: LD HL,DSSD40ID ;IBM 3740 DSSD 26SPT JR DO48 ; ; ; 4 ; FUN4: LD HL,SSDD48ID ;JADE FORMAT SSDD 48SPT JR DO48 ; ; ; 5 ; FUN5: LD HL,DSDD48ID ;JADE FORMAT DSDD 48SPT JR DO48 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FORMAT DISK FUNCTION ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FMTDSK: ; ; SELECT DRIVE ; CALL SELDR ;SELECT DRIVE RET C ;ERR- RESELECT ; ; SET UP IOPB FOR 1ST TRACK ; LD A,0 ;SET TRACK # LD (IOPB + PBTRKO),A ; ; MAIN LOOP ; FMTDSKLP: ; ; SIDE 0 ; LD HL,0 LD (IOPB + PBSECO),HL ; ; FLAGS ; LD A,(IDSIMG + IDDFFO) LD (IOPB + PBFLGO),A ; ; FORMAT TRACK ; CALL FMTTRK RET NZ ;IF ERROR THEN RETURN ; ; WHILE ON TRACK 0, WRITE THE DESCRIPTOR SECTOR ; LD A,(IOPB + PBTRKO) OR A,A JR NZ,FMTDSK1 ; CALL WRTID ;WHILE WE'RE HERE, WRITE ID SECTOR RET NZ ;ERR ; FMTDSK1: ; ; DO SECOND SIDE IF NEEDED ; LD A,(IDSIMG + IDDFFO) AND A,1 SHL DFTSDB JR Z,NO2ND ; LD HL,8000H ;BIT 15= SIDE SELECT LD (IOPB + PBSECO),HL ; CALL FMTTRK RET NZ ; NO2ND: ; ; CHECK FOR DONE ; LD A,(IOPB + PBTRKO) INC A LD (IOPB + PBTRKO),A LD C,A LD A,(LASTTRK) CP A,C JR NC,FMTDSKLP ; ; FORMAT DONE, GO TEST FOR READ ERRORS ; CALL CHECK ;CHECK FOR READ ERRORS JP FMTDSK ;READY FOR ANOTHER DISK ;--------------------------------------------------------------------------- ; ; CUSTOM FORMATTER ; ;--------------------------------------------------------------------------- CUSTOM: RET SUBTTL SUBROUTINES ;*************************************************************************** ; ; MESSAGE OUTPUT SUBR ; ENTRY- DE= PTR TO '$' TERMINATED TEXT ; EXIT - ? ; ;*************************************************************************** PUTS: MSGOT: LD C,9 ;PRINT STRING FUNCTION JP BDOS ;*************************************************************************** ; ; CONSOLE INPUT SUBR ; EXIT - A= CHAR AND 7FH ; BC, DE, HL= ? ; ;*************************************************************************** CNSIN: ; ; 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 ; ;*************************************************************************** CNSOT: LD C,2 ;CONSOLE OUTPUT FUNCTION # JP BDOS ;*************************************************************************** ; ; PUT DECIMAL SUBROUTINE ; 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 PUSH AF LD E,A LD C,2 CALL BDOS POP AF POP BC POP HL DJNZ NXTDEC ; ; DONE ALL 5 DIGITS ; RET ;*************************************************************************** ; ; OUTPUT CRLF SUBROUTINE ; EXIT - HL, DE, BC, AF= ? ; ;*************************************************************************** CRLF: LD DE,CRLFM JP PUTS ;*************************************************************************** ; ; 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: PUSH HL EX DE,HL ADD HL,BC JR NC,ADDIT ; EX DE,HL POP HL INC (HL) JR DECDIG ; ; ADDIT: LD A,C CPL LD E,A LD A,B CPL LD D,A INC DE ADD HL,DE EX DE,HL POP HL DEC HL RET UNIT: DS 4 TTHOU: DS 1 ;*************************************************************************** ; ; WRITE ID SECTOR ; EXIT - AF= /0: ERROR ; ;*************************************************************************** WRTID: ; ; SET UP IOPBs ; LD A,(IOPB + 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: LD A,(IOPB + PBFLGO) LD L,A LD A,(IOPB + PBTRKO) CP A,1 JR C,FMT0 JR Z,FMT1 ; SRL L FMT1: SRL L FMT0: BIT 0,L JR NZ,FMTDDTRK ; ; FORMAT SINGLE DENSITY TRACK SUBR ; ; SET UP DRIVER ; LD A,(IOPB + PBTRKO) ;SECTORS PER TRACK CALL GETSPT LD (SDSPT),A ; LD A,(IOPB + PBSECO + 1) ;SIDE RLCA AND A,1 LD (SDSID),A ; LD A,(IOPB + PBTRKO) ;SECTOR SIZE INDEX CALL GETSSZ AND A,3 LD (SDSSZ),A ; LD HL,128 ;SECTOR BYTE COUNT FMTS1: OR A,A JR Z,FMTS0 ; ADD HL,HL DEC A JR FMTS1 ; FMTS0: LD (SDSECSZ),HL ; LD HL,FMTSD ;SET INJECTION ADDR JR STDMA ; ; ; FORMAT DOUBLE DENSITY TRACK SUBR ; FMTDDTRK: ; ; SET UP DRIVER ; LD A,(IOPB + PBTRKO) ;SECTORS PER TRACK CALL GETSPT LD (DDSPT),A ; LD A,(IOPB + PBSECO + 1) ;SIDE RLCA AND A,1 LD (DDSID),A ; LD A,(IOPB + PBTRKO) ;SECTOR SIZE INDEX CALL GETSSZ AND A,3 LD (DDSSZ),A ; LD HL,128 ;SECTOR BYTE COUNT FMTD1: OR A,A JR Z,FMTD0 ; ADD HL,HL DEC A JR FMTD1 ; FMTD0: LD (DDSECSZ),HL ; LD HL,FMTDD ;SET INJECTION ADDR ; ; COMMON FORMATTER CODE ; STDMA: ; ; SET UP PTR TO DRIVER ; LD (IOPB + PBDMAO),HL ; ; CALCULATE CHECKSUM ; INC HL ;POINT TO BYTE COUNT INC HL LD E,(HL) ;FETCH BYTE COUNT INC HL LD D,(HL) ; ; MAKE LAST BYTE = 0 TO CALCULATE CHECKSUM PROPERLY ; LD HL,(IOPB + PBDMAO) ADD HL,DE DEC HL ;COMPENSATE, WE'RE 1 PAST LD (HL),0 ; LD HL,(IOPB + PBDMAO) ;REFETCH PTR TO START OF MODULE LD C,0 ;CHECKSUM STARTS AT 0 ; FMTCKS: LD A,(HL) ;FETCH BYTE INC HL ;POINT TO NEXT BYTE ADD A,C ;ADD TO CHECKSUM LD C,A ; DEC DE ;IF --COUNT != 0 THEN REPEAT LD A,E OR A,D JR NZ,FMTCKS ; LD A,C ;STORE -CHECKSUM IN LAST BYTE NEG DEC HL LD (HL),A ; ; FORMAT THE TRACK ; LD DE,FMTGM ;OUTPUT FORMATTING MESSAGE CALL MSGOT ; LD HL,(IOPB + PBTRKO) CALL PUTD ; LD DE,ENDEQM CALL MSGOT ; LD HL,IOPB CALL EXECIOPB ;FORMAT TRACK ; ; TELL LAST PADDING ; PUSH AF LD HL,(IOPB + PBST2O) CALL PUTD ; POP AF RET Z ;IF NO ERROR THEN RETURN ; ; ERROR- TELL SO ; 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 XOR A,A ;RETURN ERROR FLAG DEC A RET ;*************************************************************************** ; ; SELECT DRIVE SUBR ; EXIT - CF= ERROR ; ;*************************************************************************** SELDR: ; ; OUTPUT PROMPT ; LD DE,MSGFD CALL MSGOT ; ; GET RESPONSE ; CALL CNSIN ; ; IF RETURN THEN EXIT ; CP A,CR ;IF RETURN THEN EXIT 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 (IOPB + PBDRVO),A LD (WIDIOPB + PBDRVO),A LD (RDIOPB + PBDRVO),A ; ; PAUSE FOR READY ; LD DE,MSGXX ;PRINT TYPE CR WHEN READY MSG CALL MSGOT CALL CNSIN ;IF NOT CR THEN REPEAT CP A,CR JR NZ,SELDR ; ; RETURN NO ERROR ; AND A,A RET ;*************************************************************************** ; ; CHECK FUNCTION CHECKS ALL TRACKS BY READING BACKWARD FROM LAST TRACK ; ;*************************************************************************** CHECK: ; ; SET UP ; LD HL,(IOPB + PBTRKO) ;START WITH LAST TRACK FORMATTED DEC HL LD (RDIOPB + PBTRKO),HL ; LD A,(IOPB + PBDRVO) ;SAME DRIVE LD (RDIOPB + PBDRVO),A ; ; NEW LINE ; LD DE,CRLFM CALL MSGOT ; ; ALL SET TO DO TRACK ; VLP: ; ; SET TRACK SIZE ; RDTRKL: LD A,(RDIOPB + PBTRKO) CALL GETSPT ; SETNSEC: INC A ;OFFSET FOR TEST LD (NSECTS),A ; ; START WITH 1ST SECTOR ; LD A,1 ;START WITH 1ST SECTOR ; ; READ LOOP ; RDLP: ; ; CHECK FOR SECTOR TRANSLATION ; LD (CURSEC),A ;SAVE THE CURRENT SECTOR ; LD A,(IDSIMG + IDFLGO) ;FETCH FLAGS LD L,A LD A,(RDIOPB + PBTRKO) ;FETCH TRACK CP A,1 ;IF TRACK 0 THEN TEST BIT 0 JR C,RDTST JR Z,RDTST1 ;IF TRACK 1 THEN TEST BIT 1 ; SRL L ;ELSE TEST BIT 2 RDTST1: SRL L RDTST: BIT 0,L ;IF DOUBLE DENSITY THEN NO XLATE LD A,(CURSEC) JR NZ,RDSOK ; ; XLATE SECTOR ; LD HL,TRNTBL ;POINT TO TABLE DEC A ;{1..N} -> {0..N-1} ADD A,L ;CALCULATE OFFSET TO SECTOR LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ;FETCH TRANSLATED SECTOR ; ; 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) 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 + 1) 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,H ;MASK OFF SIDE BIT 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: ; ; IF DOUBLE SIDED THEN DO SIDE 2 ; LD A,(IDSIMG + IDFLGO) BIT DFTSDB,A JR Z,TD1 ; ; IS DOUBLE SIDED, TOGGLE SIDE ; LD A,(RDIOPB + PBSECO + 1) XOR A,80H LD (RDIOPB + PBSECO + 1),A JP NZ,RDTRKL ; TD1: ; ; NEXT TRACK ; RDNXTT: LD A,(RDIOPB + PBTRKO) ;NEXT TRACK DEC A LD (RDIOPB + PBTRKO),A ; ; IF NEXT TRACK < 0 THEN RETURN ; JP P,VLP ; LD DE,OKM JP MSGOT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXECIOPB: ; ; OPEN WINDOW TO CONTROLLER ; LD A,DDMB0 OUT (DDPORT),A ; ; MOVE FORMAT BUFFER TO DD ; PUSH HL POP IY LD L,(IY+PBDMAO) LD H,(IY+PBDMAO + 1) PUSH HL ;SAVE FOR SECTOR DATA MOVE LD DE,(DDADDR) LD BC,512 LDIR ; ; MOVE IOPB TO DD ; LD DE,(DDADDR) ;CALCULATE OFFSET TO COMMAND BLOCK IN FDC LD HL,DDCBO ADD HL,DE EX DE,HL ; PUSH IY POP HL LD BC,IOPBSZ LDIR ; ; MOVE SECTOR DATA TO DD ; LD A,DDMB1 OUT (DDPORT),A POP HL LD DE,(DDADDR) LD BC,1024 LDIR ; ; EXECUTE ; LD A,DDEXC OUT (DDPORT),A ; ; WAIT FOR DONE ; IF DSIZE = 5 EX (SP),HL ;DELAY FOR FDC ACTION EX (SP),HL EX (SP),HL EX (SP),HL ; ENDIF DDWAIT: IN A,(DDPORT) ;NOW TEST FOR DONE AND A,DDSHLT JR NZ,DDWAIT ; ; GET IOPB DATA ; LD A,DDMB0 OUT (DDPORT),A ; LD HL,(DDADDR) ;CACULATE OFFSET TO FDC COMMAND BLOCK LD DE,DDCBO ADD HL,DE ; PUSH IY POP DE LD BC,IOPBSZ LDIR ; ; REMOVE FDC WINDOW BEFORE RETURN ; LD A,DDFREE OUT (DDPORT),A ; ; TEST FOR ERROR ; LD A,(IY + PBSTATO) OR A,A IF DIAG = TRUE ; ; RETURN IF OK ; RET Z ; ; OUTPUT ERROR DATA ; PUSH AF LD L,A LD H,0 PUSH IY PUSH HL LD DE,IOPBERM CALL MSGOT ; POP HL CALL PUTD ; POP IY PUSH IY LD L,(IY + PBST1O) LD H,0 CALL PUTD POP IY POP AF ; ENDIF RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TRACK PHYSICAL SECTORS PER TRACK FUNCTION ; ENTRY- A= TRACK ; EXIT - A= PHYSICAL SECTORS PER TRACK {1,2,..255} ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETSPT: ; ; POINT TO BASE OF DATA ; PUSH HL LD HL,IDSIMG + IDSPT0O ;ASSUME TRACK 0 ; ; COMMON GET DATA CODE ; GETIDD: CP A,1 ;TEST TRACK NO. JR C,GFT0 ;IF TRK 0 THEN OK ; INC HL ;ELSE POINT TO TRK 1 INC HL JR Z,GFT0 ;IF TRK 1 THEN OK ; INC HL ;ELSE POINT TO DATA TRACKS INC HL ; GFT0: LD A,(HL) POP HL RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DISK FORMAT PHYSICAL SECTOR SIZE INDEX FUNCTION ; ENTRY- A= TRACK {0,1,..} ; EXIT - A= SECTOR SIZE INDEX {0:128, 1:256, 2:512, 3:1024} ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETSSZ: PUSH HL LD HL,IDSIMG + IDSSZ0O JP GETIDD ;%%% ; *INCLUDE DPBDEF.Z80 SUBTTL CONSTANT DECLARATIONS ;------------------------------------------------ ; ; SINGLE DENSITY TRANSLATION TABLE ; ;------------------------------------------------ SPT DL SDSPTC TRNTBL: GXLATE SPT,6 SUBTTL DISK DESCRIPTOR SECTOR DATA ;########################################################################### ; ; SINGLE DENSITY DESCRIPTOR SECTOR (128 BYTES) ; TRACK 0..40= SD, (SDSPTC) 128 BYTE SECTORS ; ;########################################################################### 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 ' ; ; DISK PARAMETER BLOCK IMAGE, TO BE TRANSFERRED TO BIOS AT LOGON TIME ; DW SDSPTC ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAXIMUM DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;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 00000000B ;DISKETTE FLAGS ; REPT 3 DB SDSPTC ;;SECTORS PER TRACK DB 0 ;;BYTES PER SECTOR {0:128, 1:256, 2:512, 3:1024} ENDM ; ; FILL REMAINING SECTOR DATA WITH E5H ; REPT IDSIMG + 128 - $ ;FILL OUT SECTOR LIST OFF DB 0E5H LIST ON ENDM ;########################################################################### ; ; DISK DESCRIPTOR SECTOR OVERLAYS ; ;########################################################################### SSSDID: GENIDD 26,3,7,0,242,63,0C0H,0,16,2,26,2,77 DSSDID: GENIDD 52,4,0FH,1,242,63,80H,0,16,2,26,0AH,77 SSSD40ID: GENIDD 26,3,7,0,242,63,0C0H,0,16,2,26,0,77 DSSD40ID: GENIDD 52,4,0FH,1,242,63,80H,0,16,2,26,8,77 SSDD48ID: GENIDD 48,4,0FH,1,224,63,80H,0,16,2,48,6,77 DSDD48ID: GENIDD 96,4,0FH,0,449,127,0C0H,0,16,2,48,0EH,77 ;########################################################################### ; ; MESSAGES ; ;########################################################################### MSGFL: DB CR,LF,LF,'****** Functions List ******' DB CR,LF,'0. Single sided, single density, 26 SPT (241k)' DB CR,LF,'1. Double sided, single density, 26 SPT (484k)' DB CR,LF,'2. Single sided, single density, IBM 3740 (148K)' DB CR,LF,'3. Double sided, single density, IBM 3740 (296K)' DB CR DB LF,LF,'4. Single sided, double density, 48 SPT (446k)' DB CR,LF,'5. Double sided, double density, 48 SPT (894k)' DB CR,LF,LF,'9. Custom configuration' DB CR,LF,'USE CTRL-C TO RE-BOOT.' DB CR,LF,LF,'Enter function number: $' MSGSE: DB CR,LF,LF LTRSE: DB ' Is not a valid selection.$' MSGFD: DB CR,LF,LF,'Write format on drive (CR to reselect): $' 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 at port 4' DB (DDPORT AND 0FH) + '0' DB 'H$' IF DIAG IOPBERM DB CR,LF,'IOPB error = (status fdc status) $' ENDIF SUBTTL SINGLE DENSITY TRACK FORMATTER INJECTION MODULE ;########################################################################### ; ; SINGLE DENSITY FORMATTER INJECTION MODULE ; THIS CODE IS INTENDED TO EXECUTE WITHIN THE DOUBLE D MEMORY. ; ENTRY- DRIVE IS SELECTED, FLAGS ARE SET & TRACK IS SEEK'D ; IY= RETURN ADDRESS FOR FDC INTERRUPT ; D= SIDE # ; ;########################################################################### FMTSD: ; ; FORMAT DRIVER HEADER ; DB 55H,0AAH ;KEYS DW SDOVSIZE ;CHECKSUM SIZE ; ; MAIN DRIVER ENTRY ; ; INIT PTR TO SECTOR TABLE ; SR0: LD HL,SDXT - FMTSD + FMTBG ; ; INIT SECTOR COUNT ; SDSPT EQU $ + 1 ;POINTER TO SPT LD E,SDSPTC ; ; COMMAND FDC TO WRITE TRACK ; LD A,DCWRT RST 32 ; ; WRITE 40 BYTES FFH ; LD B,40 ;# BYTES SRPT1: IN A,(XPDSH) ;WAIT FOR DATA REQ LD A,0FFH XOR C OUT (WDDTA),A ;WRITE DATA DJNZ SRPT1 ; ; WRITE 6 BYTES 00 ; LD B,6 SRPT2: IN A,(XPDSH) LD A,0 XOR C OUT (WDDTA),A DJNZ SRPT2 ; ; WRITE INDEX MARK ; IN A,(XPDSH) LD A,0FCH ;0FCH COMMANDS FDC CHIP TO WRITE INDEX MARK XOR C OUT (WDDTA),A ; ; WRITE 26 BYTES FFH ; LD B,26 SRPT3: IN A,(XPDSH) LD A,0FFH XOR C OUT (WDDTA),A DJNZ SRPT3 ; ; COMMON SECTOR CODE ; RPTSEC: ; ; WRITE 6 BYTES 0 ; LD B,6 SRPT4: IN A,(XPDSH) LD A,0 XOR C OUT (WDDTA),A DJNZ SRPT4 ; ; WRITE SECTOR ID MARK ; IN A,(XPDSH) LD A,0FEH ;0FEH COMMANDS FDC CHIP TO WRITE ID MARK XOR C OUT (WDDTA),A ; ; WRITE TRACK NUMBER ; IN A,(XPDSH) IN A,(WDTRK) ;USE FDC'S OWN DATA OUT (WDDTA),A ; ; WRITE SIDE NUMBER ; IN A,(XPDSH) SDSID EQU $ + 1 ;PTR TO SIDE BYTE LD A,0 XOR C OUT (WDDTA),A ; ; WRITE SECTOR NUMBER ; IN A,(XPDSH) LD A,(HL) ;FETCH FROM TRANSLATION TABLE XOR C OUT (WDDTA),A ; INC HL ; ; WRITE SECTOR SIZE INDEX ; IN A,(XPDSH) SDSSZ EQU $ + 1 ;PTR TO SECTOR SIZE INDEX BYTE LD A,0 ;{0:128, 1:256, 2:512, 3:1024} XOR C OUT (WDDTA),A ; ; WRITE HEADER CRC ; IN A,(XPDSH) LD A,0F7H ;0F7H COMMANDS FDC CHIP TO WRITE ACCUMULATED CRC XOR C OUT (WDDTA),A ; ; WRITE 11 BYTES FFH ; LD B,11 ;WRITE 11 ONES SRPT5: IN A,(XPDSH) LD A,0FFH XOR C OUT (WDDTA),A DJNZ SRPT5 ; ; WRITE 6 BYTES 0 ; LD B,6 ;WRITE 6 ZEROS BYTES SRPT6: IN A,(XPDSH) LD A,0 XOR C OUT (WDDTA),A DJNZ SRPT6 ; ; WRITE DATA MARK ; IN A,(XPDSH) LD A,0FBH ;0FBH COMMANDS FDC CHIP TO WRITE DATA ID MARK XOR C OUT (WDDTA),A ; ; WRITE SECSIZ BYTES E5H ; PUSH DE ;SAVE DE (SECTOR COUNT) SDSECSZ EQU $ + 1 ;PTR TO SECTOR BYTE COUNT LD DE,SECSZ SRPT7: IN A,(XPDSH) LD A,0E5H XOR C OUT (WDDTA),A DEC DE LD A,E OR A,D JP NZ,SRPT7 - FMTSD + FMTBG ; ; WRITE DATA CRC ; IN A,(XPDSH) LD A,0F7H ;0F7H COMMANDS FDC CHIP TO WRITE CRC XOR C OUT (WDDTA),A ; POP DE ;ENOUGH TIME TO RESTORE SECTOR COUNT NOW ; ; WRITE 27 BYTES FFH ; LD B,27 SRPT8: IN A,(XPDSH) LD A,0FFH XOR C OUT (WDDTA),A DJNZ SRPT8 ; ; IF --SECTOR_COUNT != 0 THEN DO NEXT SECTOR ; DEC E ;# SECTORS -1 JP NZ,RPTSEC - FMTSD + FMTBG ; ; COUNT THE NUMBER OF FILL BYTES TO INDEX ; LD HL,0 ;COUNT = 0 ; SRPT9: IN A,(XPDSH) LD A,0FFH ;WRITE ONES UNTIL INTERRUPT XOR C OUT (WDDTA),A INC HL ;RETURN ONES COUNT JP SRPT9 - FMTSD + FMTBG ;########################################################################### ; ; SECTOR TRANSLATION TABLE, NONE FOR SINGLE DENSITY ; ;########################################################################### SDXT: GXLATE SDSPTC, 1 ; ; CHECKSUM COMPENSATION BYTE. MODIFY TO MAKE TOTAL CHECKSUM = 0 ; DB 0 ;STARTING WITH 0 ALLOWS RUNTIME COMPUTATION ; SDOVSIZE EQU $ - FMTSD IF SDOVSIZE > 512 ; ; USER WARNING MESSAGE ; CONMSG **** WARNING! SDRIVER EXCEEDS 512 BYTES ALLOCATED SPACE!! **** ENDIF SUBTTL DOUBLE DENSITY TRACK FORMATTER INJECTION MODULE ;########################################################################### ; ; DOUBLE D DOUBLE DENSITY INJECTION MODULE ; ;########################################################################### FMTDD: ; ; FORMAT DRIVER HEADER ; DB 55H,0AAH ;KEYS DW DDOVSIZE ;CHECKSUM SIZE ; ; MAIN DRIVER ENTRY ; ; INIT PTR TO SECTOR TABLE ; DR0: LD HL,DDXT - FMTDD + FMTBG ; ; INIT SECTOR COUNT ; DDSPT EQU $ + 1 ;PTR TO SECTOR COUNT BYTE LD E,DDSPTC ; ; INIT COMPLEMENTING REGISTER' ; LD A,C EXX LD C,A LD DE,-1 ;BYTE COUNT SUBTRACTOR USING ADD INSTRUCTION EXX ; ; PRE-INVERT SECTOR DATA ; LD A,(DDSECD - FMTDD + FMTBG) XOR A,C LD (DDSECD - FMTDD + FMTBG),A ; ; COMMAND FDC TO WRITE TRACK ; LD A,DCWRT RST 32 ; ; WRITE PREAMBLE - 80 X 4EH BYTES ; LD B,80 DRPT1: IN A,(XPDSH) LD A,4EH XOR C OUT (WDDTA),A DJNZ DRPT1 ; ; WRITE 12 X 0 BYTES ; LD B,12 DRPT10: IN A,(XPDSH) XOR A,A XOR C OUT (WDDTA),A DJNZ DRPT10 ; ; WRITE GAP C2 - 3 X F6H BYTES ; LD B,3 DRPT11: IN A,(XPDSH) LD A,0F6H XOR C OUT (WDDTA),A DJNZ DRPT11 ; ; WRITE INDEX MARK ; IN A,(XPDSH) ;WRITE INDEX MARK LD A,0FCH XOR C OUT (WDDTA),A ; ; WRITE GAP 1 - 32 X 4EH BYTES ; LD B,32 DRPT12: IN A,(XPDSH) LD A,4EH XOR C OUT (WDDTA),A DJNZ DRPT12 ; ; COMMON SECTOR CODE ; RPJ48D: ; ; WRITE END OF GAP 3 - 8 X 0 BYTES ; LD B,8 DRPT2: IN A,(XPDSH) XOR A,A XOR C OUT (WDDTA),A DJNZ DRPT2 ; ; WRITE GAP A1 - 3 X F5H BYTES ; LD B,3 DRPT3: IN A,(XPDSH) LD A,0F5H XOR C OUT (WDDTA),A DJNZ DRPT3 ; ; WRITE ID MARK ; IN A,(XPDSH) LD A,0FEH XOR C OUT (WDDTA),A ; ; WRITE TRACK # ; IN A,(XPDSH) IN A,(WDTRK) OUT (WDDTA),A ; ; WRITE SIDE # ; IN A,(XPDSH) DDSID EQU $ + 1 ;PTR TO SIDE BYTE LD A,0 XOR C OUT (WDDTA),A ; ; WRITE SECTOR # ; IN A,(XPDSH) LD A,(HL) XOR C OUT (WDDTA),A INC HL ; ; WRITE SECTOR SIZE ; IN A,(XPDSH) DDSSZ EQU $ + 1 ;PTR TO SECTOR SIZE INDEX BYTE LD A,0 ;128=0 XOR C OUT (WDDTA),A ; ; WRITE HEADER CRC ; IN A,(XPDSH) LD A,0F7H XOR C OUT (WDDTA),A ; ; WRITE GAP 2 - 22 X 4EH BYTES ; LD B,22 DRPT4: IN A,(XPDSH) LD A,4EH XOR C OUT (WDDTA),A DJNZ DRPT4 ; ; WRITE 8 X 0 BYTES ; LD B,8 DRPT5: IN A,(XPDSH) XOR A,A XOR C OUT (WDDTA),A DJNZ DRPT5 ; ; WRITE GAP A1 - 3 X F5H BYTES ; LD B,3 DRPT6: IN A,(XPDSH) LD A,0F5H XOR C OUT (WDDTA),A DJNZ DRPT6 ; ; WRITE DATA MARK ; IN A,(XPDSH) LD A,0FBH XOR C OUT (WDDTA),A ; ; WRITE SECTOR DATA WITH E5H BYTES ; EXX ;SAVE REGS ; DDSECSZ EQU $ + 1 ;PTR TO SECTOR BYTE COUNT BYTE LD HL,SECSZ DEC HL ;OFFSET TO GENERATE CARRY ; DRPT7: IN A,(XPDSH) DDSECD EQU $ + 1 LD A,0E5H ; XOR C ;CONVERSION COMMENTED OUT. ALREADY DONE OUT (WDDTA),A ADD HL,DE JP C,DRPT7 - FMTDD + FMTBG ; ; WRITE DATA CRC ; IN A,(XPDSH) LD A,0F7H XOR C OUT (WDDTA),A ; EXX ;ENOUGH TIME TO RESTORE SECTOR COUNT NOW ; ; WRITE GAP 3 - 24 X 4EH BYTES ; LD B,24 DRPT8: IN A,(XPDSH) LD A,4EH XOR C OUT (WDDTA),A DJNZ DRPT8 ; ; IF SECTORS LEFT THEN REPEAT ; DEC E JP NZ,RPJ48D - FMTDD + FMTBG ; ; COUNT REMAINING BYTES TO INDEX AND RETURN THEM TO HOST ; LD L,E ;START WITH 0 LD H,L ; ; WRITE GAP 4 - 4EH BYTES UNTIL INTERRUPT (INDEX) ; DRPT9: IN A,(XPDSH) LD A,4EH XOR C OUT (WDDTA),A INC HL ;COUNT++ JR DRPT9 ; ; DOUBLE DENSITY SKEW TABLE, SKEW 8 SEEMS OPTIMUM ; DDXT: GXLATE DDSPTC, SKEW ; ; CHECKSUM COMPENSATION BYTE. MODIFY TO MAKE TOTAL CHECKSUM = 0 ; DB 0 ;STARTING WITH 0 ALLOWS RUNTIME COMPUTATION ; DDOVSIZE EQU $ - FMTDD IF DDOVSIZE > 512 ; ; USER WARNING MESSAGE ; CONMSG **** WARNING! DDRIVER EXCEEDS 512 BYTES ALLOCATED SPACE!! **** ENDIF SUBTTL VARIABLE DECLARATIONS NSECTS DS 1 ;NUMBER OF SECTORS IN TRACK CURSEC DS 1 ;CURRENT SECTOR DDADDR DS 2 ;JADE CONTROLLER WINDOW ADDRESS LASTTRK DS 2 ;LAST TRACK ; ; FORMAT TRACK IOPB ; IOPB DB 3 ;FORMAT TRACK REPT IOPBSZ - 1 LIST OFF DB 0 LIST ON ENDM ; ; WRITE ID SECTOR IOPB ; WIDIOPB: DB 2 ;WRITE SECTOR REPT IOPBSZ - 1 LIST OFF DB 0 LIST ON ENDM ; ; READ SECTOR IOPB ; RDIOPB: DB 1 ;READ SECTOR REPT IOPBSZ - 1 LIST OFF DB 0 LIST ON ENDM ; ; LOGON IOPB ; LOGIOPB: DB 0 REPT IOPBSZ - 1 LIST OFF DB 0 LIST ON ENDM ; ; READ SECTOR BUFFER ; SECBUF DS 1024 ;SECTOR BUFFER END