From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/CMD/REPLACE/_REPLACE.ASM | 142 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 v4.0/src/CMD/REPLACE/_REPLACE.ASM (limited to 'v4.0/src/CMD/REPLACE/_REPLACE.ASM') diff --git a/v4.0/src/CMD/REPLACE/_REPLACE.ASM b/v4.0/src/CMD/REPLACE/_REPLACE.ASM new file mode 100644 index 0000000..b8071d8 --- /dev/null +++ b/v4.0/src/CMD/REPLACE/_REPLACE.ASM @@ -0,0 +1,142 @@ +page 60,132 ; +name _replace +title Critical error or control break exit +;------------------------------------------------------------------- +; +; MODULE: _replace +; +; PURPOSE: Supplies assembler exit routines for +; critical error or control break situations +; +; CALLING FORMAT: +; crit_err_handler; +; ctl_brk_handler; +; +; DATE: 10/87 +; +;------------------------------------------------------------------- + + + public _crit_err_handler ;AN000; + public _ctl_brk_handler ;AN000; + +;------------------------------------------------------------------- +RET_EXIT equ 4ch ; terminate ;AN000; +CTLBRK equ 3 ; errorlevel return in al ;AN000; +ABORT equ 2 ; if >=, retry ;AN000; +XABORT equ 1 ; errorlevel return in al ;AN000; +;------------------------------------------------------------------- + + +NULL SEGMENT PARA PUBLIC 'BEGDATA' ;AN000; +NULL ENDS ;AN000; +_DATA SEGMENT PARA PUBLIC 'DATA' ;AN000; + extrn _oldint24:dword ;AN000; +_DATA ENDS ;AN000; +CONST SEGMENT WORD PUBLIC 'CONST' ;AN000; +CONST ENDS ;AN000; +_BSS SEGMENT WORD PUBLIC 'BSS' ;AN000; +_BSS ENDS ;AN000; +STACK SEGMENT PARA STACK 'DATA' ;AN000; +STACK ENDS ;AN000; + +PGROUP GROUP _TEXT ;AN000; +DGROUP GROUP NULL, _DATA, CONST, _BSS, STACK ;AN000; + + + +_TEXT segment para public 'CODE' ;AN000; + ASSUME CS:PGROUP ;AN000; + + extrn _restore:near ;AN000; + +;------------------------------------------------------------------- +; CRITICAL ERROR HANDLER +;------------------------------------------------------------------- +vector dd 0 ;receives a copy of _oldint24 ;AN000; + +_crit_err_handler proc near ;AN000; + + pushf ; req by int24 handler ;AN000; + push ax ; will use ax ;AN000; + push ds ; will use ds ;AN000; + + mov ax,dgroup ; setup ;AN000; + mov ds,ax ; ;AN000; + ASSUME DS:DGROUP ;AN000; + + mov ax,word ptr _oldint24 ; load vector so we can use it ;AN000; + mov word ptr vector,ax ; ;AN000; + mov ax,word ptr _oldint24+2 ; ;AN000; + mov word ptr vector+2,ax ; ;AN000; + + pop ds ; finished with ds ;AN000; + ASSUME DS:NOTHING + + pop ax ; finished with ax ;AN000; + + call dword ptr vector ; invoke DOS err hndlr ;AN000; + + cmp al,ABORT ; what was the user's response ;AN000; + jnge retry ; ;AN000; + + mov ax,(RET_EXIT shl 8)+XABORT ; return to DOS w/criterr error ;AN000; + call call_restore ; restore user's orig append/x ;AN000; +; =================== this call does not return =============== + +retry: ;AN000; + ASSUME DS:NOTHING + ASSUME ES:NOTHING + + iret ; user response was "retry" ;AN000; + +_crit_err_handler endp ;AN000; + + +;------------------------------------------------------------------- +; CONTROL BREAK HANDLER +;------------------------------------------------------------------- +_ctl_brk_handler proc near ;AN000; + + ASSUME DS:NOTHING + ASSUME ES:NOTHING + + mov ax,(RET_EXIT shl 8)+CTLBRK ; return to DOS w/ctlbrk error ;AN000; +;------------------------------------------------------------------- + call call_restore ; restore user's orig append/x ;AN000; +;------------------------------------------------------------------- +; =================== this call does not return =============== + +_ctl_brk_handler endp ;AN000; + +call_restore proc near +;input: ah has the RETURN TO DOS WITH RET CODE function request +; al has the ERRORLEVEL return code to be passed back to DOS +;output: this routine does NOT RETURN, but exits to DOS with ret code. + + push ax ;save errorlevel return code + push ds + push es + + mov ax,dgroup ; setup "c" code regs ;AN000; + mov ds,ax ; ;AN000; + ASSUME DS:DGROUP ;AN000; + + mov es,ax ; ;AN000; + ASSUME ES:DGROUP ;AN000; + +;------------------------------------------------------------------- + call _restore ; restore user's orig append/x ;AN000; +;------------------------------------------------------------------- + + pop es + pop ds + pop ax ;restore return code + int 21h ; ;AN000; + int 20h ; in case int21 fails ;AN000; + +call_restore endp + +_TEXT ends ; end code segment ;AN000; + end ;AN000; + \ No newline at end of file -- cgit v1.2.3