1 | ; Project name : Assembly Library
|
---|
2 | ; Description : Register related macros.
|
---|
3 | %ifndef REGISTERS_INC
|
---|
4 | %define REGISTERS_INC
|
---|
5 |
|
---|
6 | struc INTPACK
|
---|
7 | %ifdef USE_386
|
---|
8 | ; .gs resb 2
|
---|
9 | ; .fs resb 2
|
---|
10 | %endif
|
---|
11 | .es resb 2
|
---|
12 | .ds resb 2
|
---|
13 | .di resb 2
|
---|
14 | .si resb 2
|
---|
15 | .bp resb 2
|
---|
16 | .sp resb 2
|
---|
17 | .bx:
|
---|
18 | .bl resb 1
|
---|
19 | .bh resb 1
|
---|
20 | .dx:
|
---|
21 | .dl resb 1
|
---|
22 | .dh resb 1
|
---|
23 | .cx:
|
---|
24 | .cl resb 1
|
---|
25 | .ch resb 1
|
---|
26 | .ax:
|
---|
27 | .al resb 1
|
---|
28 | .ah resb 1
|
---|
29 | .ip resb 2
|
---|
30 | .cs resb 2
|
---|
31 | .flags resb 2
|
---|
32 | endstruc
|
---|
33 |
|
---|
34 | ; 8086/8088 FLAGS
|
---|
35 | FLG_FLAGS_CF EQU (1<<0)
|
---|
36 | FLG_FLAGS_PF EQU (1<<2)
|
---|
37 | FLG_FLAGS_AF EQU (1<<4)
|
---|
38 | FLG_FLAGS_ZF EQU (1<<6)
|
---|
39 | FLG_FLAGS_SF EQU (1<<7)
|
---|
40 | FLG_FLAGS_TF EQU (1<<8)
|
---|
41 | FLG_FLAGS_IF EQU (1<<9)
|
---|
42 | FLG_FLAGS_DF EQU (1<<10)
|
---|
43 | FLG_FLAGS_OF EQU (1<<11)
|
---|
44 |
|
---|
45 |
|
---|
46 | ;--------------------------------------------------------------------
|
---|
47 | ; This macro must be the first thing to call on Interrupt Service Routine.
|
---|
48 | ;
|
---|
49 | ; CREATE_INTPACK_TO_SSBP
|
---|
50 | ; Parameters
|
---|
51 | ; Nothing
|
---|
52 | ; Returns:
|
---|
53 | ; SS:BP: Points to INTPACK
|
---|
54 | ; Corrupts registers:
|
---|
55 | ; Nothing
|
---|
56 | ;--------------------------------------------------------------------
|
---|
57 | %macro CREATE_INTPACK_TO_SSBP 0
|
---|
58 | ePUSHA
|
---|
59 | push ds
|
---|
60 | push es
|
---|
61 | %ifdef USE_386
|
---|
62 | ; push fs
|
---|
63 | ; push gs
|
---|
64 | %endif
|
---|
65 | mov bp, sp
|
---|
66 | %endmacro
|
---|
67 |
|
---|
68 | ;--------------------------------------------------------------------
|
---|
69 | ; This macro must be the last thing to call on Interrupt Service Routine.
|
---|
70 | ;
|
---|
71 | ; RESTORE_INTPACK_FROM_SSBP
|
---|
72 | ; Parameters
|
---|
73 | ; SS:BP: Ptr to INTPACK
|
---|
74 | ; Returns:
|
---|
75 | ; All Registers will be loaded from INTPACK
|
---|
76 | ;--------------------------------------------------------------------
|
---|
77 | %macro RESTORE_INTPACK_FROM_SSBP 0
|
---|
78 | %ifdef USE_386
|
---|
79 | ; pop gs
|
---|
80 | ; pop fs
|
---|
81 | %endif
|
---|
82 | pop es
|
---|
83 | pop ds
|
---|
84 | ePOPA
|
---|
85 | iret
|
---|
86 | %endmacro
|
---|
87 |
|
---|
88 |
|
---|
89 | ;--------------------------------------------------------------------
|
---|
90 | ; This macro must be the first thing to call on Interrupt Service Routine.
|
---|
91 | ;
|
---|
92 | ; CREATE_FRAME_INTPACK_TO_SSBP
|
---|
93 | ; Parameters
|
---|
94 | ; %1: Number of extra bytes to reserve before INTPACK
|
---|
95 | ; Returns:
|
---|
96 | ; SS:BP: Points to INTPACK
|
---|
97 | ; Corrupts registers:
|
---|
98 | ; Nothing
|
---|
99 | ;--------------------------------------------------------------------
|
---|
100 | %macro CREATE_FRAME_INTPACK_TO_SSBP 1
|
---|
101 | ePUSHA
|
---|
102 | push ds
|
---|
103 | push es
|
---|
104 | %ifdef USE_386
|
---|
105 | ; push fs
|
---|
106 | ; push gs
|
---|
107 | %endif
|
---|
108 | sub sp, BYTE %1
|
---|
109 | mov bp, sp
|
---|
110 | %endmacro
|
---|
111 |
|
---|
112 | ;--------------------------------------------------------------------
|
---|
113 | ; This macro must be the last thing to call on Interrupt Service Routine.
|
---|
114 | ;
|
---|
115 | ; RESTORE_FRAME_INTPACK_FROM_SSBP
|
---|
116 | ; Parameters
|
---|
117 | ; %1: Number of extra bytes in INTPACK
|
---|
118 | ; SS:BP: Ptr to INTPACK
|
---|
119 | ; Returns:
|
---|
120 | ; All Registers will be loaded from INTPACK
|
---|
121 | ;--------------------------------------------------------------------
|
---|
122 | %macro RESTORE_FRAME_INTPACK_FROM_SSBP 1
|
---|
123 | add sp, BYTE %1
|
---|
124 | %ifdef USE_386
|
---|
125 | ; pop gs
|
---|
126 | ; pop fs
|
---|
127 | %endif
|
---|
128 | pop es
|
---|
129 | pop ds
|
---|
130 | ePOPA
|
---|
131 | iret
|
---|
132 | %endmacro
|
---|
133 |
|
---|
134 |
|
---|
135 | ;--------------------------------------------------------------------
|
---|
136 | ; NORMALIZE_FAR_POINTER
|
---|
137 | ; Parameters:
|
---|
138 | ; %1:%2: Far pointer to normalize
|
---|
139 | ; %3: Scratch register
|
---|
140 | ; %4: Scratch register
|
---|
141 | ; Returns:
|
---|
142 | ; %1:%2: Normalized far pointer
|
---|
143 | ; CF: Set if overflow in (segment) normalization
|
---|
144 | ; Clear if normalized successfully
|
---|
145 | ; Corrupts registers:
|
---|
146 | ; %3, %4
|
---|
147 | ;--------------------------------------------------------------------
|
---|
148 | %macro NORMALIZE_FAR_POINTER 4
|
---|
149 | mov %4, %2 ; Copy offset to scratch reg
|
---|
150 | and %2, BYTE 0Fh ; Clear offset bits 15...4
|
---|
151 | eSHR_IM %4, 4 ; Divide offset by 16
|
---|
152 | mov %3, %1 ; Copy segment to scratch reg
|
---|
153 | add %3, %4 ; Add shifted offset to segment (sets or clears CF)
|
---|
154 | mov %1, %3 ; Set normalized segment
|
---|
155 | %endmacro
|
---|
156 |
|
---|
157 |
|
---|
158 | ;--------------------------------------------------------------------
|
---|
159 | ; COPY_SSBP_TO_ESDI
|
---|
160 | ; COPY_SSBP_TO_DSSI
|
---|
161 | ; COPY_DSSI_TO_ESDI
|
---|
162 | ; COPY_ESDI_to_DSSI
|
---|
163 | ; Parameters
|
---|
164 | ; Nothing
|
---|
165 | ; Returns:
|
---|
166 | ; Copies farm pointer to different segment/pointer register pair
|
---|
167 | ; Corrupts registers:
|
---|
168 | ; Nothing
|
---|
169 | ;--------------------------------------------------------------------
|
---|
170 | %macro COPY_SSBP_TO_ESDI 0
|
---|
171 | push ss
|
---|
172 | pop es
|
---|
173 | mov di, bp
|
---|
174 | %endmacro
|
---|
175 |
|
---|
176 | %macro COPY_SSBP_TO_DSSI 0
|
---|
177 | push ss
|
---|
178 | pop ds
|
---|
179 | mov si, bp
|
---|
180 | %endmacro
|
---|
181 |
|
---|
182 | %macro COPY_DSSI_TO_ESDI 0
|
---|
183 | push ds
|
---|
184 | pop es
|
---|
185 | mov di, si
|
---|
186 | %endmacro
|
---|
187 |
|
---|
188 | %macro COPY_ESDI_to_DSSI 0
|
---|
189 | push es
|
---|
190 | pop ds
|
---|
191 | mov si, di
|
---|
192 | %endmacro
|
---|
193 |
|
---|
194 |
|
---|
195 |
|
---|
196 | %endif ; REGISTERS_INC
|
---|