; ; DISK UTILITY PROGRAM WHICH PARKS DISK HEAD ; WRITTEN IN OCTOBER, 1983 ; WARMBT EQU 0H ;LOC. WHERE WARM BOOT ADDR IS SELDSK EQU 18H ;OFFSET TO BIOS SELECT-DISK-ROUTINE SETSEC EQU 1EH ;OFFSET TO BIOS SET-SECTOR-ROUTINE SETTRK EQU 1BH ;OFFSET TO BIOS SET-TRACK-ROUTINE READ EQU 24H ;OFFSET TO BIOS READ-SECTOR-ROUTINE SETDMA EQU 21H ;OFFSET TO BIOS SET-DMA-ROUTINE FSTSEC EQU 01H ;SECTOR TO SET BDOS EQU 05H CR EQU 0DH CRWH EQU 8DH LF EQU 0AH TAB EQU 09H CLSCR EQU 1AH ESC EQU 1BH PRINT EQU 09H MTAB EQU 41H DEFDRV EQU 00H VIRTUAL EQU 80H HARD1 EQU 2H HARD2 EQU 3H ; .Z80 CSEG JP MAIN ;JUMP TO THE START OF MAIN PROGRAM ; HEADER: DB CR,LF,' DISK HEAD PARK UTILITY PROGRAM',1AH ; MAIN: CALL GETDRV CALL SCAN1 CALL GETDRV CALL SCAN2 LD C,PRINT LD DE,MSG CALL BDOS ;DISPLAY MESSAGE FOR THE USER LOOP: DI ;DISABLE INTERRUPTS HALT ;PUT PROCESSOR IN HALT CONDITION JP LOOP ; ; GETDRV: LD HL,SELDSK LD DE,1 LD C,0FFH ;SELECT DISK CALL BIOS INC A LD (NODRV),A ;SAVE NUMBER OF DRIVES IN THE SYSTEM LD HL,(WARMBT+1) LD DE,MTAB ADD HL,DE ;OFFSET TO MTAB IN BIOS LD A,(HL) INC HL LD H,(HL) LD L,A ;(HL) HAS MTAB ADDRESS LD A,(NODRV) LD B,A ;(B) HAS NO. OF DRIVES LD A,DEFDRV LD (DRIVE),A RET ; SCAN1: LD A,(HL) AND VIRTUAL JP NZ,NEXT1 LD A,(HL) AND HARD1 JP NZ,PARKHD NEXT1: LD DE,16 ADD HL,DE LD A,(DRIVE) INC A LD (DRIVE),A DEC B JP NZ,SCAN1 RET ; SCAN2: LD A,(HL) AND VIRTUAL ;CHECK FOR VIRTUAL DRIVE JP NZ,NEXT2 LD A,(HL) AND HARD2 ;CHECK FOR HARD DISK BIT CP HARD2 CALL Z,PARKHD ;IF IT IS SET, PARK HARD DISK HEAD NEXT2: LD DE,16 ;OFFSET INTO NEXT MTAB ENTRY ADD HL,DE LD A,(DRIVE) INC A LD (DRIVE),A ;NEXT DRIVE NO DEC B ;DECREMENT NO. OF DRIVES JP NZ,SCAN2 RET ; ; ; PARKHD: PUSH HL PUSH BC LD A,(HL) ;GET THE 1ST BYTE IN MTAB ENTRY RRA RRA AND 07 INC A ;NO. OF HEADS LD (HEADCNT),A INC HL INC HL INC HL INC HL LD A,(HL) ;GET THE NO. OF CYLYNDERS INC HL LD D,(HL) LD E,A LD HL,0 LD A,(HEADCNT) AGAIN: ADD HL,DE DEC A JR NZ,AGAIN DEC HL ;NO. OF TRACKS LD (TRKNO),HL CALL EXECUTE POP BC POP HL RET ; ; ; EXECUTE:LD HL,SELDSK LD DE,1 LD A,(DRIVE) LD C,A CALL BIOS LD HL,SETSEC LD BC,FSTSEC ;SET FIRST SECTOR CALL BIOS LD HL,SETTRK LD A,(TRKNO) ;SET THE MAX. NO. TRACK LD C,A LD A,(TRKNO+1) LD B,A CALL BIOS LD HL,SETDMA LD BC,BUFFER ;SET DMA ADDR. CALL BIOS LD HL,READ ;READ SECTOR LD BC,FSTSEC CALL BIOS CP 0 RET Z LD DE,ERRMSG LD C,PRINT CALL BDOS JP WARMBT ;PRINT ERROR MESSAGE & RETURN TO CP/M ; BIOS: PUSH DE EX DE,HL LD HL,(WARMBT+1) ;GET WARM BOOT ADDR IN HL ADD HL,DE ;ADD THE OFFSET VALUE TO IT POP DE JP (HL) ;JUMP TO PROPER BIOS ROUTINE ; ; ; BUFFER AREA ; BUFFER: DS 128 DRIVE: DS 1 NODRV: DS 1 HEADCNT:DS 1 TRKNO: DS 2 ; ; MESSAGE AREA ; MSG: DB CLSCR,CR,LF,LF,'Your Micro Decision is now ready to be turned off.' DB CR,LF,'If you do not want to turn off the system, but were just experimenting' DB CR,LF,'with the PARK program, hit the RESET switch to restart your system.' DB CR,LF,LF,LF,'$' ; ERRMSG: DB CLSCR,CR,LF,LF,TAB,TAB,'Disk Read Error:try again.' DB CR,LF,LF,LF,'$' ; ; END MAIN