?? equmac.inc
字號:
;***************************************************************************
;* *
;* PROT - A softdog killer *
;* Copyright (C) 1996, by Li Wen_xian *
;* All rights reserved *
;* *
;* This file is: EQUMAC.INC, assorted macros and equates. *
;* *
;***************************************************************************
;EQUates the user may wish to change (one set for each mode)
DOSSTACK EQU 200H ;stack size for DOS startup
VM86STACK EQU 200H ;stack size for VM86 int
TSRSTACK EQU 200H ;stack size for TSR program
CRITSTACK EQU 30H ;stack size for crit errs
PMSTACK EQU 400H ;stack size for p-mode stack
PVSTACK EQU 260 ;P10/VM86 psuedo stack size
;Maximum protected mode interrupt # defined
TOPINT EQU 0FFH
;The critical error handler works different for dos 2.x than for
;other DOS versions. In 99% of the cases it won't make any
;difference if you compile with dos=2...
;major dos version number (2,3 or 4)
DOS EQU 3
;Access rights equates
;use these with make desc or make seg
RO_DATA EQU 90H ;r/o data
RW_DATA EQU 92H ;r/w data
RO_STK EQU 94H ;r/o stack
RW_STK EQU 96H ;r/w stack
EX_CODE EQU 98H ;exec only code
ER_CODE EQU 9AH ;read/exec code
CN_CODE EQU 9CH ;exec only conforming code
CR_CODE EQU 9EH ;read/exec conforming code
LDT_DESC EQU 82H ;LDT entry
TSS_DESC EQU 89H ;TSS entry
;use these with make gate
CALL_GATE EQU 8CH ;call gate
TRAP_GATE EQU 8FH ;trap gate
INTR_GATE EQU 8EH ;int gate
TASK_GATE EQU 85H ;task gate
;dpl equates
DPL0 EQU 0
DPL1 EQU 20H
DPL2 EQU 40H
DPL3 EQU 60H
.386P
;macro definitons
;other macros use this to error check parameters
;Give an error if last is blank or too many is not blank
ERRCHK MACRO LAST,TOOMANY
IFNB <TOOMANY>
IF2
%OUT TOO MANY PARAMETERS
ENDIF
.ERR
ENDIF
IFB <LAST>
IF2
%OUT NOT ENOUGH PARAMETERS
ENDIF
.ERR
ENDIF
ENDM
;Perform absolute 16 bit jump (in a 16 bit segment)
JMPABS MACRO A,B,ERRCK
ERRCHK B,ERRCK
DB 0EAH ;;absolute 16 bit jump
DW OFFSET B
DW A
ENDM
;Perform absolute 32 bit jump (in a 32 bit segment)
JMPABS32 MACRO A,B,ERRCK
ERRCHK B,ERRCK
DB 0EAH ;;absolute 32 bit jump
DD OFFSET B
DW A
ENDM
;this generates a correct 32 bit offset for a proc call
;since MASM doesn't sign extend 32 bit relative items
CALL32S MACRO LBL,ERRCK ;;short call
ERRCHK LBL,ERRCK
DB 0E8H
DD LBL-($+4)
ENDM
CALL32F MACRO SG,LBL,ERRCK ;far call
ERRCHK LBL,ERRCK
DB 9AH
DD OFFSET LBL
DW SG
ENDM
JMP32S MACRO LBL,ERRCK ;;short jump
ERRCHK LBL,ERRCK
DB 0E9H
DD LBL-($+4)
ENDM
;jcc32 uses the condition codes used in the intel literature
;conditional jump macro
JCC32 MACRO CONDX,LBL,ERRCK
ERRCHK LBL,ERRCK
DB 0FH
IFIDNI <CONDX>,<A>
DB 87H
ELSEIFIDNI <CONDX>,<NBE>
DB 87H
ELSEIFIDNI <CONDX>,<AE>
DB 83H
ELSEIFIDNI <CONDX>,<C>
DB 82H
ELSEIFIDNI <CONDX>,<NAE>
DB 82H
ELSEIFIDNI <CONDX>,<B>
DB 82H
ELSEIFIDNI <CONDX>,<BE>
DB 86H
ELSEIFIDNI <CONDX>,<E>
DB 84H
ELSEIFIDNI <CONDX>,<Z>
DB 84H
ELSEIFIDNI <CONDX>,<G>
DB 8FH
ELSEIFIDNI <CONDX>,<GE>
DB 8DH
ELSEIFIDNI <CONDX>,<L>
DB 8CH
ELSEIFIDNI <CONDX>,<LE>
DB 8EH
ELSEIFIDNI <CONDX>,<NA>
DB 86H
ELSEIFIDNI <CONDX>,<NB>
DB 83H
ELSEIFIDNI <CONDX>,<NC>
DB 83H
ELSEIFIDNI <CONDX>,<NGE>
DB 8CH
ELSEIFIDNI <CONDX>,<NL>
DB 8DH
ELSEIFIDNI <CONDX>,<NO>
DB 81H
ELSEIFIDNI <CONDX>,<NP>
DB 8BH
ELSEIFIDNI <CONDX>,<NS>
DB 89H
ELSEIFIDNI <CONDX>,<NZ>
DB 85H
ELSEIFIDNI <CONDX>,<O>
DB 80H
ELSEIFIDNI <CONDX>,<P>
DB 8AH
ELSEIFIDNI <CONDX>,<PE>
DB 8AH
ELSEIFIDNI <CONDX>,<PO>
DB 8BH
ELSEIFIDNI <CONDX>,<S>
DB 88H
ELSE
%OUT JCC32: UNKNOWN CONDITION CODE
.ERR
ENDIF
DD LBL-($+4)
ENDM
;Override default operand size
OPSIZ MACRO NOPARM ;op size override
ERRCHK X,NOPARM
DB 66H
ENDM
;Override default address size
ADSIZ MACRO NOPARM ;address size override
ERRCHK X,NOPARM
DB 67H
ENDM
;delay macro for interrupt controller access
IDELAY MACRO NOPARM
LOCAL DELAY1,DELAY2
ERRCHK X,NOPARM
JMP SHORT DELAY1
DELAY1: JMP SHORT DELAY2
DELAY2:
ENDM
;BREAKPOINT MACROS
;MACRO to turn on NBREAKPOINTS
;if used with no arguments (or a 1), this macro makes NBREAKPOINT
;active if used with an argument> 1, NBREAKPOINT will break after
;that many passes
BREAKON MACRO ARG,ERRCK
ERRCHK X,ERRCK
PUSH DS
PUSH SEL_DATA
POP DS
PUSH EAX
IFB <ARG>
MOV AL,1
ELSE
MOV AL,&ARG
ENDIF
MOV BPON,AL
POP EAX
POP DS
ENDM
;turns off NBREAKPOINT
BREAKOFF MACRO NOPARAM
ERRCHK X,NOPARAM
PUSH DS
PUSH SEL_DATA
POP DS
PUSH EAX
XOR AL,AL
MOV BPON,AL
POP EAX
POP DS
ENDM
BREAKPOINT MACRO NOPARM
ERRCHK X,NOPARM
INT 3
ENDM
;counter breakpoint - use BREAKON to set count control
;BREAKPOINT with memory dump
;usage: BREAKDUMP seg-selector,offset number of words
BREAKDUMP MACRO SEG,OFF,CNT,ERRCK
ERRCHK CNT,ERRCK
PUSH EAX
MOV AX,&SEG
MOV DUMP_SEG,AX
MOV EAX,OFFSET &OFF
MOV DUMP_OFF,EAX
MOV EAX,&CNT
MOV DUMP_CNT,EAX
POP EAX
BREAKPOINT
ENDM
NBREAKDUMP MACRO SEG,OFF,CNT,ERRCK
ERRCHK CNT,ERRCK
LOCAL NONBP
PUSH DS
PUSH SEL_DATA
POP DS
PUSHFD
OR DS:BPON,0
JZ SHORT NONBP
DEC BPON
JNZ SHORT NONBP
POPFD
POP DS
BREAKDUMP SEG,OFF,CNT
NONBP:
POPFD
POP DS
ENDM
NBREAKPOINT MACRO SEG,OFF,CNT,ERRCK
ERRCHK CNT,ERRCK
LOCAL NONBP
PUSH DS
PUSH SEL_DATA
POP DS
PUSHFD
OR DS:BPON,0
JZ SHORT NONBP
DEC BPON
JNZ SHORT NONBP
POPFD
POP DS
BREAKPOINT
NONBP:
POPFD
POP DS
ENDM
;determine linear address of first free byte of memory
;(to nearest paragraph)
LOADFREE MACRO REG,ERRCK
ERRCHK REG,ERRCK
XOR E®,E®
MOV ®,SEG ZZZGROUP
SHL E®,4
ENDM
;Set up PINTFRAME (uses eax)
;load vmstack & vmdata to the ss:esp and ds slots in pintframe
;default ss:esp=ssint1
;default ds=userdata
PROT_STARTUP MACRO VMSTACK,VMDATA,ERRCK
ERRCHK X,ERRCK
IFB <VMSTACK>
MOV AX,SEG SSINT1
ELSE
MOV AX,SEG VMSTACK
ENDIF
MOV PINTFRAME.VMSS,EAX
IFB <VMSTACK>
MOV EAX,OFFSET SSINT1
ELSE
MOV EAX,OFFSET VMSTACK
ENDIF
MOV PINTFRAME.VMESP,EAX
IFB <VMDATA>
MOV AX,SEG USERDATA
ELSE
MOV AX,SEG VMDATA
ENDIF
MOV PINTFRAME.VMDS,EAX
ENDM
;start PROT user segments
PROT_CODE MACRO NOPARM
ERRCHK X,NOPARM
USERCODE SEGMENT
USERCODEBEG EQU $
ASSUME CS:USERCODE,DS:USERDATA,ES:DAT32
ENDM
PROT_DATA MACRO NOPARM
ERRCHK X,NOPARM
USERDATA SEGMENT
USERDATABEG EQU $
ENDM
PROT_CODE_END MACRO NOPARM
ERRCHK X,NOPARM
USERCODEEND EQU $
USERCODELEN EQU (USERCODEEND-USERCODEBEG)-1
PUBLIC USERCODELEN
PUBLIC USER
USERCODE ENDS
ENDM
PROT_DATA_END MACRO NOPARM
ERRCHK X,NOPARM
USERDATAEND EQU $
USERDATALEN EQU (USERDATAEND-USERDATABEG)-1
PUBLIC USERDATALEN
USERDATA ENDS
ENDM
;simplfy programs with no data segment
NODATA MACRO NOPARM
ERRCHK X,NOPARM
PROT_DATA
PROT_DATA_END
ENDM
;Mnemonic for dos return
BACK2DOS MACRO RC,ERRCK
ERRCHK X,ERRCK
IFNB <RC>
MOV AL,RC
ENDIF
JMPABS32 SEL_CODE16,BACK16
ENDM
BACK2REAL MACRO RC,ERRCK
ERRCHK X,ERRCK
IFNB <RC>
MOV AL,RC
ENDIF
JMPABS32 SEL_CODE16,PM2REAL
ENDM
;variables and macro to create GDT/LDT/IDT entries
C_GDT = 0
C_LDT = 0
C_IDT = 0
;create "next" descriptor with name in table
;if no table specified, use GDT
DESC MACRO NAME,TABLE,ERRCK
PUBLIC NAME
DQ 0
IFB <TABLE>
NAME = C_GDT
C_GDT = C_GDT+8
ELSE
IFIDNI <TABLE>,<LDT>
;for LDT selectors,set the T1 bit to one
NAME = C_&TABLE OR 4
ELSE
NAME = C_&TABLE
ENDIF
C_&TABLE = C_&TABLE+8
ENDIF
ENDM
;Segment defines
DAT32 SEGMENT PARA PUBLIC 'DATA32' USE32
DAT32 ENDS
SEG32 SEGMENT PARA PUBLIC 'CODE32' USE32
SEG32 ENDS
CSEG SEGMENT PARA PUBLIC 'CODE16' USE16
CSEG ENDS
TSSSEG SEGMENT PARA PUBLIC 'DATA32' USE32
TSSSEG ENDS
USERCODE SEGMENT PARA PUBLIC 'CODE32' USE32
USERCODE ENDS
USERDATA SEGMENT PARA PUBLIC 'DATA32' USE32
USERDATA ENDS
SSEG SEGMENT PARA STACK 'STACK' USE16
SSEG ENDS
SSINT SEGMENT PARA STACK 'STACK' USE16
SSINT ENDS
SSTSR SEGMENT PARA STACK 'STACK' USE16
SSTSR ENDS
CSTACK SEGMENT PARA STACK 'STACK' USE16
CSTACK ENDS
SS32 SEGMENT PARA PUBLIC 'STACK' USE32
SS32 ENDS
GDTSEG SEGMENT PARA PUBLIC 'CODE32' USE32
GDTSEG ENDS
ZZZSEG SEGMENT PARA PUBLIC 'ZZZ' USE16
ZZZSEG ENDS
ISR SEGMENT PARA PUBLIC 'CODE32' USE32
ISR ENDS
IDTABLE SEGMENT PARA PUBLIC 'DATA32' USE32
IDTABLE ENDS
ZZZGROUP GROUP ZZZSEG
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -