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/RESTORE/_MSGRET.ASM | 242 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 v4.0/src/CMD/RESTORE/_MSGRET.ASM (limited to 'v4.0/src/CMD/RESTORE/_MSGRET.ASM') diff --git a/v4.0/src/CMD/RESTORE/_MSGRET.ASM b/v4.0/src/CMD/RESTORE/_MSGRET.ASM new file mode 100644 index 0000000..92597f6 --- /dev/null +++ b/v4.0/src/CMD/RESTORE/_MSGRET.ASM @@ -0,0 +1,242 @@ +page 60,132 +name _msgret +title C to Message Retriever +;------------------------------------------------------------------- +; +; MODULE: _msgret +; +; PURPOSE: Supplies an interface between C programs and +; the DOS 3.3 message retriever +; +; CALLING FORMAT: +; sysloadmsg(&inregs,&outregs); +; sysdispmsg(&inregs,&outregs); +; +; DATE: 5-21-87 +; +;------------------------------------------------------------------- + + INCLUDE SYSMSG.INC ;PERMIT SYSTEM MESSAGE HANDLER DEFINITION ;AN000; + + MSG_UTILNAME ;IDENTIFY THE COMPONENT ;AN000; + + .8087 +_TEXT SEGMENT BYTE PUBLIC 'CODE' +_TEXT ENDS +_DATA SEGMENT WORD PUBLIC 'DATA' +_DATA ENDS +CONST SEGMENT WORD PUBLIC 'CONST' +CONST ENDS +_BSS SEGMENT WORD PUBLIC 'BSS' +_BSS ENDS +DGROUP GROUP CONST, _BSS, _DATA + ASSUME CS: _TEXT, DS: _TEXT, SS: DGROUP, ES: DGROUP + + + public _sysloadmsg + public _sysdispmsg + +;------------------------------------------------------------------- +;------------------------------------------------------------------- + +_DATA segment +.XLIST +.XCREF + MSG_SERVICES ;DATA AREA FOR THE MESSAGE HANDLER ;AN000; +.LIST +.CREF +_DATA ends + + +_TEXT segment + +;------------------------------------------------------------------- + ;DEFAULT=CHECK DOS VERSION + ;DEFAULT=NEARmsg + ;DEFAULT=INPUTmsg + ;DEFAULT=NUMmsg + ;DEFAULT=NO TIMEmsg + ;DEFAULT=NO DATEmsg +.XLIST +.XCREF + MSG_SERVICES ;AN000;6 + MSG_SERVICES ;AN000;6 +.LIST +.CREF +;------------------------------------------------------------------- + +_sysloadmsg proc near + + push bp ; save user's base pointer + mov bp,sp ; set bp to current sp + push di ; save some registers + push si + +; copy C inregs into proper registers + + mov di,[bp+4] ; fix di (arg 0) + +;------------------------------------------------------------------- + + mov ax,[di+0ah] ; load di + push ax ; the di value from inregs is now on stack + + mov ax,[di+00] ; get inregs.x.ax + mov bx,[di+02] ; get inregs.x.bx + mov cx,[di+04] ; get inregs.x.cx + mov dx,[di+06] ; get inregs.x.dx + mov si,[di+08] ; get inregs.x.si + pop di ; get inregs.x.di from stack + + push bp ; save base pointer + +;------------------------------------------------------------------- + call sysloadmsg ; call the message retriever +;------------------------------------------------------------------- + + pop bp ; restore base pointer + push di ; the di value from call is now on stack + mov di,[bp+6] ; fix di (arg 1) + + mov [di+00],ax ; load outregs.x.ax + mov [di+02],bx ; load outregs.x.bx + mov [di+04],cx ; load outregs.x.cx + mov [di+06],dx ; load outregs.x.dx + mov [di+08],si ; load outregs.x.si + + lahf ; get flags into ax + mov al,ah ; move into low byte + mov [di+0ch],ax ; load outregs.x.cflag + + pop ax ; get di from stack + mov [di+0ah],ax ; load outregs.x.di + +;------------------------------------------------------------------- + + pop si ; restore registers + pop di + mov sp,bp ; restore sp + pop bp ; restore user's bp + ret + +_sysloadmsg endp + + +;_sysgetmsg proc near +; +; push bp ; save user's base pointer +; mov bp,sp ; set bp to current sp +; push di ; save some registers +; push si +; +;; copy C inregs into proper registers +; +; mov di,[bp+4] ; fix di (arg 0) +; +;;------------------------------------------------------------------- +; +; mov ax,[di+0ah] ; load di +; push ax ; the di value from inregs is now on stack +; +; mov ax,[di+00] ; get inregs.x.ax +; mov bx,[di+02] ; get inregs.x.bx +; mov cx,[di+04] ; get inregs.x.cx +; mov dx,[di+06] ; get inregs.x.dx +; mov si,[di+08] ; get inregs.x.si +; pop di ; get inregs.x.di from stack +; +; push bp ; save base pointer +; +;;------------------------------------------------------------------- +; call sysgetmsg ; call the message retriever +;;------------------------------------------------------------------- +; +; pop bp ; restore base pointer +; push di ; the di value from call is now on stack +; mov di,[bp+6] ; fix di (arg 1) +; +; mov [di+00],ax ; load outregs.x.ax +; mov [di+02],bx ; load outregs.x.bx +; mov [di+04],cx ; load outregs.x.cx +; mov [di+06],dx ; load outregs.x.dx +; mov [di+08],si ; load outregs.x.si +; +; lahf ; get flags into ax +; mov al,ah ; move into low byte +; mov [di+0ch],ax ; load outregs.x.cflag +; +; pop ax ; get di from stack +; mov [di+0ah],ax ; load outregs.x.di +; +;;------------------------------------------------------------------- +; +; pop si ; restore registers +; pop di +; mov sp,bp ; restore sp +; pop bp ; restore user's bp +; ret +; +;_sysgetmsg endp + +_sysdispmsg proc near + + push bp ; save user's base pointer + mov bp,sp ; set bp to current sp + push di ; save some registers + push si + +; copy C inregs into proper registers + + mov di,[bp+4] ; fix di (arg 0) + +;------------------------------------------------------------------- + + mov ax,[di+0ah] ; load di + push ax ; the di value from inregs is now on stack + + mov ax,[di+00] ; get inregs.x.ax + mov bx,[di+02] ; get inregs.x.bx + mov cx,[di+04] ; get inregs.x.cx + mov dx,[di+06] ; get inregs.x.dx + mov si,[di+08] ; get inregs.x.si + pop di ; get inregs.x.di from stack + + push bp ; save base pointer + +;------------------------------------------------------------------- + call sysdispmsg ; call the message retriever +;------------------------------------------------------------------- + + pop bp ; restore base pointer + push di ; the di value from call is now on stack + mov di,[bp+6] ; fix di (arg 1) + + mov [di+00],ax ; load outregs.x.ax + mov [di+02],bx ; load outregs.x.bx + mov [di+04],cx ; load outregs.x.cx + mov [di+06],dx ; load outregs.x.dx + mov [di+08],si ; load outregs.x.si + + lahf ; get flags into ax + mov al,ah ; move into low byte + mov [di+0ch],ax ; load outregs.x.cflag + + pop ax ; get di from stack + mov [di+0ah],ax ; load outregs.x.di + +;------------------------------------------------------------------- + + pop si ; restore registers + pop di + mov sp,bp ; restore sp + pop bp ; restore user's bp + ret + +_sysdispmsg endp + +include msgdcl.inc + +_TEXT ends ; end code segment + end + + \ No newline at end of file -- cgit v1.2.3