; Figure 10-6 ; ; Testbed for Disk I/O drivers in the BIOS. ; ; The complete source file consists of three components: ; ; 1. The testbed code shown here. ; 2. The Disk I/O drivers destined for the BIOS. ; 3. The debug package shown in Figure 10-2. ; TRUE EQU 0FFFFH FALSE EQU NOT TRUE DEBUG EQU TRUE ;For conditional assembly of RST ; instructions in place of IN and ; OUT instructions in the drivers. ORG 100H START: LXI SP,Test$Stack ;Use a local stack CALL DB$Init ;Initialize the debug package ; ; Make calls to SELDSK, SETTRK, SETSEC and SETDMA, ; then either a Read or Write routine. ; Testbed$Loop: LXI SP,Test$Stack ;Use local stack LDA Logical$Disk ;Setup for SELDSK call MOV C,A CALL SELDSK CALL DB$Display ;Display return value in HL DB DB$HL DB 'SELDSK returned',0 SHLD DPH$Start ;Setup to display Disk Parameter Header LXI D,16 ;Compute end address DAD D SHLD DPH$End ;Store into debug call CALL DB$Display ;Display DPH DB DB$M ;Memory DPH$Start: DW 0 DPH$End: DW 0 DB 'Selected DPH',0 LHLD Track ;Call SETTRK PUSH H POP B ;SETTRK needs track in BC CALL SETTRK LDA Sector ;Call SETSEC MOV C,A ;SETSEC need sector in C CALL SETSEC LXI B,Test$Buffer ;Set DMA address CALL SETDMA LDA Write$Disk ;Check if reading or writing ORA A JNZ Test$Write CALL Read$No$Deblock ;*** or Read$Physical depending on which ;*** drivers you are testing. CALL DB$Display ;Display return code DB DB$A DB 'Test Read returned',0 CALL Check$Ripple ;Check if ripple pattern in buffer JZ Testbed$Loop ;Yes, it is correct CALL DB$MSGI ;Indicate problem DB DB$HL ;Display HL (points to offending byte) DB 'Ripple pattern incorrect. HL -> failure.',0 CALL DB$Display ;Display test buffer CALL DB$M ;Memory DW Test$Buffer DW Test$Buffer$Size DB 'Contents of Test$Buffer',0 JMP Testbed$Loop Test$Write: CALL Fill$Ripple ;Fill the test buffer with ripple pattern CALL Write$No$Deblock;*** or Write$Physical depending on which ;*** drivers you are testing. CALL DB$Display ;Display return code DB DB$A DB 'Test Write returned',0 JMP Testbed$Loop Fill$Ripple: ;Fills the Test$Buffer with a pattern ; formed by putting into each byte, the ; least significant 8-bits of the byte's ; address. LXI B,Test$Buffer$Size LXI H,Test$Buffer FR$Loop: MOV M,L ;Set pattern value into buffer INX H ;Update buffer pointer DCX B ;Down date count MOV A,C ;Check if count zero ORA B JNZ FR$Loop ;Repeat until zero RET ; Check$Ripple: ;Check that the buffer is filled with the ; correct ripple pattern. ; Returns with Zero status if this is true, ; non-zero status if the ripple is not ; correct. HL point to the offending byte ; (which should = L) LXI B,Test$Buffer$Size LXI H,Test$Buffer CR$Loop: MOV A,L ;Get correct value CMP M ;Compare to that in the buffer RNZ ;Mismatch - Non-zero already indicated INX H ;Update buffer pointer DCX B ;Down date count MOV A,C ;Check count zero ORA B JNZ CR$Loop ;Repeat until zero RET ;Zero flag will already be set ; ; Testbed variables ; Logical$Disk: DB 0 ;A = 0, B = 1,... Track: DW 0 ;Disk track number Sector: DB 0 ;Disk sector number Write$Disk: DB 0 ;NZ to write to disk ; Test$Buffer$Size EQU 512 ;<=== Alter as required Test$Buffer: DS Test$Buffer$Size ; DW 9999H,9999H,9999H,9999H,9999H,9999H,9999H,9999H DW 9999H,9999H,9999H,9999H,9999H,9999H,9999H,9999H DW 9999H,9999H,9999H,9999H,9999H,9999H,9999H,9999H Test$Stack: ; ; Dummy routines for those shown in other figures ; ; BIOS routines (Figure 8-10) ; SELDSK: ;Select logical disk SETTRK: ;Set track number SETSEC: ;Set sector number SETDMA: ;Set DMA address Read$No$Deblock: ;Driver read routines Read$Physical: Write$No$Deblock: ;Driver write routines Write$Physical: ; ; Debug routines (Figure 10-2) ; DB$Init: ;Debug initialization DB$MSGI: ;Display message in-line DB$Display: ;Main debug display routine DB$A EQU 02 ;Display codes for DB$Display DB$HL EQU 20 DB$M EQU 24