; Harddisk Utility Koepfe parken ; OMTI 5520 A ;Autor Wilfried Schmitten, Heidebloeck 16, 2 Hamburg 74 ;letzte Aenderung : 16.1.1989 ;Routine epstr aus der SYSLIB in Quelltext uebernommen ; 12.2.89 Wilfried vers equ 11 maclib cdef.lib disretry equ 80h s10us equ 1 bdos equ 5 start: ld hl,signon call epstr call park ld hl,error jr c,st1 ld hl,signend st1: call epstr jp 0 park: ld hl,parkcyl-1 ld (cyl),hl xor a ld (sector),a ld (head),a seek: ld a,11 ld (cdbcom),a call cylcalc xor a ld (cdbcount),a ld a,disretry or s10us ld (cdbcontrol),a ld hl,cdbcom call command errorcheck: call waitreq in a,(hd$data) and 2 ret z ;fehlerfrei reqsense: ld a,1 call delay ld a,(lun) ld (kreqs+1),a ld hl,kreqs call command call waitreq and 2 jr nz,req1 ld hl,dsense ;Ergebnispuffer ld c,hd$data reql: ;4 byte data ini ;abholen req2: in a,(hd$status) rrca jr nc,req2 and 3 xor 1 ;0 fuer write, 1 fuer read jr z,reql ini ;Statusbyte abholen req1: scf ret command: out (hd$select),a ;Controller mit dummy ansprechen ld b,6 ;6 byte ld c,hd$data ;nach Adresse coml: call waitreq ;teste Data request outi ;ausgeben jr nz,coml ret waitreq: in a,(hd$status) rrca ret c jr waitreq cylcalc: ld a,(cyl) ld (cdbcyl),a ;low byte cylinder xor a ld a,(cyl+1) ld hl,sector rra rra rra push af ;2~10 in carry !! or (hl) ;2~9,2~8 lksbuendig + sector ld (cdbsector),a pop af rra and 80h ;2~10 inc hl or (hl) ;+ head ld hl,lun or (hl) ;+ lun ld (cdbhead),a ret delay: push bc ld b,0 ld c,a dly: djnz dly dec c jr nz,dly pop bc ret ; ; SYSLIB Module Name: SEPSTR ; Author: Richard Conn ; SYSLIB Version Number: 3.6 ; Module Version Number: 1.1 ; ; EPSTR -- ; PRINT STRING PTED TO BY HL ; AFFECT ONLY HL -- WHEN DONE, HL PTS TO BYTE AFTER STRING ; PERFORM NO CONTROL CHARACTER EXPANSION EXCEPT FOR ; INTERPRET , , , ; EPSTR: PUSH DE ; SAVE REGS PUSH BC PUSH AF ; SAVE REG A AND FLAGS LD C,0 ; SET POSITION COUNT PSL: LD A,(HL) ; GET BYTE INC HL ; PT TO NEXT OR A ; 0=DONE JP Z,PSD CP TAB ; EXPAND JP Z,PSTa ; ; PRINT CHAR ; INC C ; INCR POSITION CALL COUT ; PRINT IT ON CON: CP CR ; CHECK FOR JP Z,PCR CP LF ; CHECK FOR JP Z,PLF CP BEL ; CHECK FOR JP Z,PLF CP BS ; CHECK FOR JP Z,PBS JP PSL ; ; -- RESET POSITION COUNT ; PCR: LD C,0 ; RESET JP PSL ; ; , , -- CURSOR DIDN'T ADVANCE ; PLF: DEC C ; BACK UP COUNT BY 1 JP PSL ; ; -- CURSOR WENT BACKWARD, MAYBE ; PBS: LD A,C ; CHECK FOR ZERO OR A JP Z,PSL DEC C ; BACK UP COUNT BY 2 DEC C JP PSL ; ; EXPAND ; PSTa: LD A,C ; GET COUNT AND 7 ; MASK FOR SUB FROM 8 LD B,A ; STORE TEMPORARILY LD A,8 ; SUBTRACT FROM 8 FOR COUNT SUB B LD B,A ; COUNT IN B ADD A,C ; ADD TO POSITION COUNT LD C,A LD A,' ' ; PRINT PSTL: CALL COUT DEC B ; COUNT DOWN JP NZ,PSTL JP PSL ; ; EPSTR DONE ; PSD: POP AF ; RESTORE REG A AND FLAGS POP BC ; RESTORE REGS POP DE RET ; ; ASCII SPECIAL CHARACTER EQUATES ; NULL EQU 0 ; NULL BEL EQU 7 ; BELL BS EQU 8 ; BACKSPACE TAB EQU 9 ; TAB LF EQU 10 ; LINE FEED CR EQU 13 ; CARRIAGE RETURN CTRLR EQU 'R'-40H ; CTRL-R CTRLU EQU 'U'-40H ; CTRL-U CTRLX EQU 'X'-40H ; CTRL-X DEL EQU 7FH ; DELETE CHAR ; ; SYSLIB Module Name: SCOUT ; Author: Richard Conn ; SYSLIB Version Number: 3.6 ; Module Version Number: 1.1 ; ; COUT -- ; CONSOLE OUTPUT ROUTINE ; OUTPUT CHAR IN REG A ON CON: ; AFFECT NO REGISTERS OR FLAGS ; PUTRG MACRO PUSH BC ; SAVE BC, DE, HL PUSH DE PUSH HL ENDM GETRG MACRO POP HL ; RESTORE HL, DE, BC POP DE POP BC ENDM COUT: PUSH AF ; SAVE REG A AND FLAGS PUTRG ; SAVE REGISTERS LD C,A ; CHAR IN C LD HL,(JTABL) ; GET ADDRESS OF JUMP TABLE LD L,CO$OFF ; CONSOLE OUTPUT ADR LD DE,CRET2 ; SET UP RET ADR PUSH DE ; ... ON STACK JP (HL) CRET2: GETRG ; RESTORE REGISTERS POP AF ; RESTORE REG A AND FLAGS RET BOOT EQU 0 ; CP/M BOOT ADDRESS JTABL EQU BOOT+1 ; CP/M JUMP TABLE ADDRESS CO$OFF EQU 0CH ; CONSOLE OUTPUT OFFSET cyl: dw 0 sector: db 0 head: db 0 lun: db 0 ;0=Lun 0, 20=Lun 1 kreqs: db 3,0,0,0,0,0 signon: db 'HD Park WS V ' db vers/10 + '0','.' db vers mod 10 + '0',0dh,0ah,0 signend: db '--- Parkposition ---',0dh,0ah,0 error: db 'HD Error',0dh,0ah,0 ; Command descriptor block cdbcom ds 1 ;Operation code cdbhead ds 1 ;bit 7 =cyl 2~10, head cdbsector ds 1 ;bit 7,6 = cyl 2~9,2~8, sector cdbcyl ds 1 ;cyl 2~7 - 2~0 cdbcount ds 1 ;block count cdbcontrol ds 1 ;bit 7=1=disable retrey ;bit 6=1=disable error correction ;bit 2,1,0 step option dsense ds 5 end start