IFNDEF BLOCK_XFER BLOCK_XFER equ 0EC00h ; Block Transfer ENDIF IFNDEF DOS DOS equ 021h ; Dos Function Request ENDIF ;MOVE_ARGS_TO_BUF ; Move the specified arguments to a buffer. If the buffer is not ; specified, then ES:DI is assumed to contain the address of the ; buffer. ; ; The specified args are pushed onto the local stack, and the ; address noted in DS:SI. The args are then moved to the ; specifed buffer. move_args_to_buf macro args,realaddr,autobump,save numbytes = 0 irp x, numbytes = numbytes + 2 push x endm IFNB les di,dword ptr ss:&realaddr ENDIF mov cx,numbytes mov si,sp move_to_real_buf autobump,save add sp,numbytes endm ;MOVE_TO_REAL_BUF ; Move CX number of bytes from DS:SI to buffer specifed in ES:DI. ; Since the destination may be in real mode, use the AIA Dos ; extended function Block_Xfer. move_to_real_buf macro autobump,save_offset mov ax,BLOCK_XFER int DOS IFNB IFE direction add di,cx ELSE sub di,cx ENDIF ENDIF IFNB mov ss:&real_buf_offset,di ENDIF endm ;MOVE_BYTE_TO_BUF ; Move one byte from the buffer specified in DS:SI to the ; destination address in ES:DI. MOVE_BYTE_TO_BUF macro byt,realaddr,autobump IFNB les di,dword ptr ss:&realaddr ENDIF sub sp,2 mov si,sp mov byte ptr ss:[si],byt mov cx,1 mov ax,BLOCK_XFER int DOS IFNB IFE direction inc di ELSE dec di ENDIF ENDIF add sp,2 endm ;MOVE_ARGS_FROM_BUF ; Get the specified arguments from a buffer. If the buffer is not ; specified, then ES:DI is assumed to contain the address of the ; buffer. ; ; The number of bytes specified by the args is allocated on ; the local stack, and the address noted in DS:SI. The args ; are then moved from the desired buffer onto the local stack, ; and popped into the desired args. move_args_from_buf macro args,realaddr numbytes = 0 irp x, numbytes = numbytes + 2 endm IFNB les di,dword ptr ss:&realaddr ENDIF mov cx,numbytes sub sp,cx mov si,sp move_from_real_buf irp x, pop x endm endm ;MOVE_FROM_REAL_BUF ; Move CX number of bytes from the buffer specified in ES:DI to ; the destination address in DS:SI. Swap the source and ; destination registers and perform the AIA Dos extended function ; Block_Xfer (in case the source buffer is in real memory). move_from_real_buf macro mov bx,es mov dx,ds mov ds,bx mov es,dx xchg di,si mov ax,BLOCK_XFER int DOS mov ds,dx mov es,bx xchg di,si endm ;REAL_BYTE_TO REG ; Move a byte from the buffer specified by DS:SI to a register. ; ; ES must equal SS real_byte_to_reg macro reg,autobump push cx mov cx,1 sub sp,2 mov di,sp mov ax,BLOCK_XFER int DOS mov al,byte ptr es:[di] IFNB inc si ENDIF add sp,2 pop cx endm reset_real_buffer_offset macro mov ss:real_buf_offset,0 endm save_real_buffer_offset macro arg IFNB mov ss:&real_buf_offset,arg ELSE mov ss:&real_buf_offset,di ENDIF endm direction = 0 ; direction flag for autoincr/autdecr real_buffer_stack = 0 ; treat buffer as stack buffer_is_stack macro direction = 1 endm get_real_buffer_stack macro mov bx,ss:&real_buf_top mov ss:&real_buf_offset,bx direction = 1 endm get_real_buffer macro les di,dword ptr ss:&real_mode_buffer endm buffer_is_buffer macro direction = 0 endm get_real_buffer_top macro reg mov reg,ss:real_buf_top endm get_buffer macro buffer_is_buffer reset_real_buffer_offset get_real_buffer endm rls_buffer macro reset_real_buffer_offset endm