90 lines
2.8 KiB
Plaintext
90 lines
2.8 KiB
Plaintext
;*******************************************************************************
|
||
; *
|
||
; Macros and equates for i/o and graphics which are performed in real mode. *
|
||
; *
|
||
; *
|
||
;*******************************************************************************
|
||
|
||
IFNDEF DOS
|
||
DOS equ 021h ; Dos Function Request
|
||
ENDIF
|
||
|
||
IFNDEF RPC
|
||
RPC equ 0E1h ; Real Procedure Call
|
||
ENDIF
|
||
|
||
IFNDEF BLOCK_XFER
|
||
BLOCK_XFER equ 0EC00h ; Block Transfer
|
||
ENDIF
|
||
|
||
;
|
||
; Entry points within realio.asm for performing text I/O.
|
||
;
|
||
|
||
REAL_BELL equ 0 ;ring the bell
|
||
REAL_CLEAR equ 1 ;clear the screen
|
||
REAL_BORDER equ 2 ;draw window borders
|
||
REAL_SAVESCR equ 3 ;save screen contents
|
||
REAL_RESTSCR equ 4 ;restore screen contents
|
||
REAL_CURON equ 5 ;turn cursor on
|
||
REAL_CUROFF equ 6 ;turn cursor off
|
||
REAL_PUTCUR equ 7 ;position cursor
|
||
REAL_PUTC equ 8 ;write character
|
||
REAL_SCROLLUP equ 9 ;scroll up
|
||
REAL_SCROLLDN equ 10 ;scroll down
|
||
REAL_EGACURS equ 11 ;ega cursor
|
||
REAL_CHGVMODE equ 12 ;change video mode
|
||
REAL_WRTSTRNG equ 13 ;write string to port
|
||
REAL_WRTBLOCK equ 14 ;write string to display
|
||
|
||
;
|
||
; The following macro creates the code to call all of the real mode I/O
|
||
; routines. The arguments (which reside on the stack) are moved to the
|
||
; a buffer which resides in real mode, along with one of the above defined
|
||
; function indicators. Then an rpc call is performed, such that the correct
|
||
; real mode xli routine is envoked.
|
||
;
|
||
|
||
REALIO MACRO FUNCTION,ARGSTART,ARGEND,CONTINUE
|
||
; address arguments
|
||
push es
|
||
push si
|
||
push di
|
||
mov si,bp
|
||
add si,(ARGSTART - 2) ;ds:si => arguments
|
||
; move arguments to real mode buffer
|
||
push word ptr [si] ;save word at this location
|
||
mov word ptr [si],FUNCTION ;and replace with function opcode
|
||
IFDIF <ARGSTART>,<ARGEND> ;cx = length
|
||
mov cx,((ARGEND + 2) - (ARGSTART - 2))
|
||
ELSE
|
||
mov cx,(ARGEND - (ARGSTART - 2))
|
||
ENDIF
|
||
mov di,word ptr REAL_BUF_SELECTOR ;get real buffer selector
|
||
mov es,di
|
||
mov di,word ptr REAL_BUF_TOP ;get top address of buffer
|
||
sub di,cx ;es:di => real mode buffer
|
||
mov ax,BLOCK_XFER ;xfer block to real memory
|
||
int DOS
|
||
pop [si] ;restore word at this location
|
||
; issue call to real mode handler
|
||
mov al,rpc_handle ;real procedure handle
|
||
mov ah,RPC ;rpc function call
|
||
push di ;stack pointer
|
||
push XLI_REALIO ;real i/o function designator
|
||
mov dx,sp
|
||
mov cx,4 ;cx = # bytes in rpc buffer
|
||
IFNB <CONTINUE>
|
||
mov bx,2 ;bx = number return bytes
|
||
ELSE
|
||
xor bx,bx ;bx = number return bytes
|
||
ENDIF
|
||
int DOS
|
||
add sp,4
|
||
pop di
|
||
pop si
|
||
pop es
|
||
ENDM
|
||
|
||
|
||
|