;   8086 C li b r a r y

; manifests for stack layout
stackheader equ 6
indexbase equ 2

; And for locating parameters

; P0 is last parm, p1 next to last, and so on

parm0 equ indexbase - stackheader
parm0l equ parm0
parm0h equ parm0l + 1

parm1 equ parm0h + 1
parm1l equ parm1
parm1h equ parm1l + 1

parm2 equ indexbase + 2
parm2l equ parm2
parm2h equ parm2l + 1
 
parm3l equ parm2h + 1
parm3h equ parm3l + 1
 
parm4l equ parm3h + 1
parm4h equ parm4l + 1


;   8086 lib routines

EXTRN DISPATCHW:NEAR; DESTROY NOTHING

PURGE LENGTH, SIZE, TYPE

DEFINE JRPOS = JGE#
DEFINE JRNEG = JL#
DEFINE JRZ = JE#
DEFINE JRNZ = JNE#
DEFINE JR = JMP SHORT#

CodeMacro JMPZ place:Cb
DW 0375H
DB 0E9H
RelW place
EndM

CodeMacro JMPZ place:Cw
DW 0375H
DB 0E9H
RelW place
EndM

CodeMacro IDiv dst:Aw,divisor:Ew    
Segfix divisor
DB 0F7H
ModRM 7,divisor
EndM

CodeMacro Imul dst:Aw,mplier:Ew    
Segfix mplier
DB 0F7H
ModRM 5,mplier
EndM

CodeMacro SAL dst:Eb    
Segfix dst
DB 0D0H
ModRM 4,dst
EndM

CodeMacro SAL dst:Ew    
Segfix dst  
DB 0D1H
ModRM 4,dst
EndM

CodeMacro SAL dst:Eb,count:Rw(CX)    
Segfix dst
DB 0D2H
ModRM 4,dst
EndM

CodeMacro SAL dst:Ew,count:Rw(CX)    
Segfix dst
DB 0D3H
ModRM 4,dst
EndM

CodeMacro SAR dst:Eb    
Segfix dst
DB 0D0H
ModRM 7,dst
EndM

CodeMacro SAR dst:Ew    
Segfix dst
DB 0D1H
ModRM 7,dst
EndM

CodeMacro SAR dst:Eb,count:Rw(CX)    
Segfix dst
DB 0D2H
ModRM 7,dst
EndM

CodeMacro SAR dst:Ew,count:Rw(CX)    
Segfix dst  
DB 0D3H
ModRM 7,dst
EndM

CodeMacro SHR dst:Eb    
Segfix dst
DB 0D0H
ModRM 5,dst
EndM

CodeMacro SHR dst:Ew    
Segfix dst
DB 0D1H
ModRM 5,dst
EndM

CodeMacro SHR dst:Eb,count:Rw(CX)    
Segfix dst
DB 0D2H
ModRM 5,dst
EndM

CodeMacro SHR dst:Ew,count:Rw(CX)    
Segfix dst  
DB 0D3H
ModRM 5,dst
EndM

END