TITLE RECOVER Messages FALSE EQU 0 TRUE EQU NOT FALSE bdos equ 21h boot equ 20h aread equ 25h awrite equ 26h .xlist .xcref INCLUDE DOSSYM.ASM ;The DOST: prefix is a DEC TOPS/20 directory prefix. Remove it for ; assembly in MS-DOS assembly environments using MASM. The DOSSYM.ASM ; file must exist though, it is included with OEM distribution. .cref .list code segment public code ends const segment public byte const ends data segment public byte EXTRN filsiz:WORD data ends dg group code,const,data cr equ 0dh lf equ 0ah code segment public byte assume cs:dg,ds:dg,es:dg,ss:dg EXTRN PCRLF:NEAR,PRINT:NEAR,INT_23:NEAR,CONVERT:NEAR PUBLIC dskwrt,dskrd,DSKERR,report hecode db 0 dskwrt: push ax push bx push cx push dx int awrite mov [hecode],al inc sp inc sp ;clean up stack pop dx pop cx pop bx pop ax jnc pret mov si,offset dg: writing call dskerr jz dskwrt clc pret: ret dskrd: push ax push bx push cx push dx int aread mov [hecode],al inc sp inc sp ;clean up stack pop dx pop cx pop bx pop ax jnc pret mov si,offset dg: reading call dskerr jz dskrd clc ret DSKERR: PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI PUSH ES CALL PCRLF MOV AL,[HECODE] CMP AL,12 JBE HAVCOD MOV AL,12 HAVCOD: XOR AH,AH MOV DI,AX SHL DI,1 MOV DX,WORD PTR [DI+MESBAS] ; Get pointer to error message CALL PRINT ; Print error type MOV DX,OFFSET DG:ERRMES CALL PRINT MOV DX,SI CALL PRINT MOV DX,OFFSET DG:DRVMES CALL PRINT ASK: MOV DX,OFFSET DG:REQUEST CALL PRINT MOV AX,(STD_CON_INPUT_FLUSH SHL 8)+STD_CON_INPUT INT 21H ; Get response PUSH AX CALL PCRLF POP AX OR AL,20H ; Convert to lower case CMP AL,"i" ; Ignore? JZ EEXITNZ CMP AL,"r" ; Retry? JZ EEXIT CMP AL,"a" ; Abort? JNZ ASK JMP INT_23 EEXITNZ: OR AL,AL ; Resets zero flag EEXIT: POP ES POP DI POP DX POP CX POP BX POP AX RET ;****************************************** ; Prints the XXX of YYY bytes recovered message. ; The XXX value is a dword at di+16 on entry. ; The YYY value is a dword (declared as a word) at filsiz. ; Note: ; If it is desired to print a message before the first number, ; point at the message with DX and call PRINT. report: mov si,[di+16] ;Get the XXX value mov di,[di+18] mov bx,offset dg: ofmsg call convert ;Print "XXX of " (DI:SI followed by message ; pointed to by BX) mov si,filsiz ;Get the YYY value mov di,filsiz+2 mov bx,offset dg: endmsg call convert ;Print "YYY bytes recovered CR LF" ret code ends const segment public byte PUBLIC BADVER,askmsg,drvlet,DRVLET1,dirmsg,recmsg_pre PUBLIC crlf,drverr,baddrv,opnerr,recmsg_post MESBAS DW OFFSET DG:ERR0 DW OFFSET DG:ERR1 DW OFFSET DG:ERR2 DW OFFSET DG:ERR3 DW OFFSET DG:ERR4 DW OFFSET DG:ERR5 DW OFFSET DG:ERR6 DW OFFSET DG:ERR7 DW OFFSET DG:ERR8 DW OFFSET DG:ERR9 DW OFFSET DG:ERR10 DW OFFSET DG:ERR11 DW OFFSET DG:ERR12 READING DB "read$" WRITING DB "writ$" ERRMES DB " error $" DRVMES DB "ing drive " DRVLET1 DB "A",13,10,"$" REQUEST DB "Abort, Retry, Ignore? $" ERR0 DB "Write protect$" ERR1 DB "Bad unit$" ERR2 DB "Not ready$" ERR3 DB "Bad command$" ERR4 DB "Data$" ERR5 DB "Bad call format$" ERR6 DB "Seek$" ERR7 DB "Non-DOS disk$" ERR8 DB "Sector not found$" ERR9 DB "No paper$" ERR10 DB "Write fault$" ERR11 DB "Read fault$" ERR12 DB "Disk$" ;-----------------------------------------------------------------------; BADVER DB "Incorrect DOS version" crlf db cr,lf,'$' askmsg db cr,lf,'Press any key to begin recovery of the' db cr,lf,'file(s) on drive ' drvlet db 'A: ',cr,lf,cr,lf,'$' dirmsg db cr,lf,'Warning - directory full',cr,lf,'$' ;"recmsg_prerecmsg_post" recmsg_post db ' file(s) recovered',cr,lf recmsg_pre db '$' ofmsg db ' of $' endmsg db ' bytes recovered',13,10,"$" drverr db 'Invalid number of parameters$' baddrv db 'Invalid drive or file name$' opnerr db 'File not found$' const ends end