home *** CD-ROM | disk | FTP | other *** search
- ; os2asm.asm
- ; Andrew Schulman 5-Feb-1988
- ; 286 protected-mode instructions for OS/2
- ; revised 18-December-1988
-
- ; assemble with MASM /ML os2asm.asm;
- ; for use with C small model
-
- DOSSEG
-
- .286p
- .MODEL large
-
- .CODE OS2ASM_TEXT
-
- PUBLIC _lsl, _lar, _verr, _verw, _gdt, _idt, _ldt
-
- ;
- ; extern unsigned far lsl(unsigned seg);
- ; input: segment/selector
- ; output: if segment valid and visible at current protection level,
- ; return segment limit (which may be 0 !)
- ; else
- ; return 0
- ;
-
- _lsl PROC FAR
- enter 0,0
- sub ax,ax ; ax=0
- lsl ax,WORD PTR [bp+6] ; if (valid&&visible) ax=LSL
- leave ; return LSL
- ret
- _lsl ENDP
-
- ;
- ; extern unsigned far lar(unsigned seg);
- ; input: segment/selector
- ; output: if segment valid and visible at current protection level,
- ; return access rights (which will never be 0 ?)
- ; else
- ; return 0
- ;
-
- _lar PROC FAR
- enter 0,0
- sub ax,ax ; ax=0
- lar ax,WORD PTR [bp+6] ; if(valid&&visible) ax=LAR
- shr ax,8 ; ax >>= 8
- leave ; return LAR
- ret
- _lar ENDP
-
- ;
- ; extern unsigned far verr(unsigned seg);
- ; input: segment/selector
- ; output: if segment valid for reading at current privilege level
- ; return 1
- ; else
- ; return 0
- ;
-
- _verr PROC FAR
- enter 0,0
- mov ax,1 ; set up return
- verr WORD PTR [bp+6] ; seg
- je short verr_okay ; if zero flag set
- dec ax ; return 0
- verr_okay:
- leave
- ret
- _verr ENDP
-
- ;
- ; extern unsigned far verw(unsigned seg);
- ; input: segment/selector
- ; output: if segment valid for writing at current privilege level
- ; return 1
- ; else
- ; return 0
- ;
-
- _verw PROC FAR
- enter 0,0
- mov ax,1 ; set up return
- verw WORD PTR [bp+6] ; seg
- je short verw_okay ; if zero flag set
- dec ax ; return 0
- verw_okay:
- leave
- ret
- _verw ENDP
-
- ;
- ; extern void far Debugger(void);
- ; if CVP running, calls back to CVP
- ; otherwise, dies!
- ; NOT USED ANY MORE: cf. breakpoint() in GDT.C
- ;
-
- ;_Debugger proc far
- ; enter 0,0
- ; int 3h
- ; leave
- ; ret
- ;_Debugger endp
-
- ;
- ; extern void far gdt(GDT far *gdt);
- ; input: far ptr to 6-byte structure
- ; output: fills structure with GDTR
- ;
-
- _gdt proc far
- enter 0,0
- les bx,dword ptr [bp+6]
- sgdt fword ptr es:[bx]
- leave
- ret
- _gdt endp
-
-
- ;
- ; extern void far idt(IDT far *idt);
- ; input: far ptr to 6-byte structure
- ; output: fills structure with IDTR
- ;
-
- _idt proc far
- enter 0,0
- les bx,dword ptr [bp+6]
- sidt fword ptr es:[bx]
- leave
- ret
- _idt endp
-
-
- ;
- ; extern USHORT far ldt(void);
- ; input: none
- ; output: LDTR
- ;
-
- _ldt proc far
- enter 0,0
- sldt ax
- leave
- ret
- _ldt endp
-
-
- END
-