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 | ; SAVE_AND_GET_INTPACK_TO_SSBP
|
---|
50 | ; Parameters
|
---|
51 | ; Nothing
|
---|
52 | ; Returns:
|
---|
53 | ; SS:BP: Points to INTPACK
|
---|
54 | ; Corrupts registers:
|
---|
55 | ; Nothing
|
---|
56 | ;--------------------------------------------------------------------
|
---|
57 | %macro SAVE_AND_GET_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 | ; Extra words will be initialized to zero.
|
---|
92 | ;
|
---|
93 | ; SAVE_AND_GET_INTPACK_WITH_EXTRA_WORDS_TO_SSBP
|
---|
94 | ; Parameters
|
---|
95 | ; %1: Number of extra words to reserve before INTPACK
|
---|
96 | ; Returns:
|
---|
97 | ; SS:BP: Points to INTPACK
|
---|
98 | ; Corrupts registers:
|
---|
99 | ; Nothing
|
---|
100 | ;--------------------------------------------------------------------
|
---|
101 | %macro SAVE_AND_GET_INTPACK_WITH_EXTRA_WORDS_TO_SSBP 1
|
---|
102 | ePUSHA
|
---|
103 | push ds
|
---|
104 | push es
|
---|
105 | %ifdef USE_386
|
---|
106 | push fs
|
---|
107 | push gs
|
---|
108 | %endif
|
---|
109 | xor bp, bp
|
---|
110 | times %1 push bp ; Initialize to zero
|
---|
111 | mov bp, sp
|
---|
112 | %endmacro
|
---|
113 |
|
---|
114 | ;--------------------------------------------------------------------
|
---|
115 | ; This macro must be the last thing to call on Interrupt Service Routine.
|
---|
116 | ;
|
---|
117 | ; RESTORE_INTPACK_WITH_EXTRA_WORDS_FROM_SSBP
|
---|
118 | ; Parameters
|
---|
119 | ; %1: Number of extra words in INTPACK
|
---|
120 | ; SS:BP: Ptr to INTPACK
|
---|
121 | ; Returns:
|
---|
122 | ; All Registers will be loaded from INTPACK
|
---|
123 | ;--------------------------------------------------------------------
|
---|
124 | %macro RESTORE_INTPACK_WITH_EXTRA_WORDS_FROM_SSBP 1
|
---|
125 | add sp, BYTE (%1)*2
|
---|
126 | %ifdef USE_386
|
---|
127 | pop gs
|
---|
128 | pop fs
|
---|
129 | %endif
|
---|
130 | pop es
|
---|
131 | pop ds
|
---|
132 | ePOPA
|
---|
133 | iret
|
---|
134 | %endmacro
|
---|
135 |
|
---|
136 |
|
---|
137 | ;--------------------------------------------------------------------
|
---|
138 | ; NORMALIZE_FAR_POINTER
|
---|
139 | ; Parameters:
|
---|
140 | ; %1:%2: Far pointer to normalize
|
---|
141 | ; %3: Scratch register
|
---|
142 | ; %4: Scratch register
|
---|
143 | ; Returns:
|
---|
144 | ; %1:%2: Normalized far pointer
|
---|
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
|
---|
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
|
---|