source: xtideuniversalbios/trunk/Assembly_Library/Inc/Macros.inc@ 631

Last change on this file since 631 was 631, checked in by Krister Nordvall, 9 hours ago

Changes:

  • Fixed a bug in XTIDECFG where changing the COM port for a virtual serial device would not work at all. Thanks to Jaroslaw Jablonski for reporting this problem.
  • Added a couple of macros to the library, LPUSH and LPOP, which creates the long (two bytes) encoding of PUSH and POP respectively. They are pretty much useless except LPOP can be used to differentiate between 808x and NEC V CPUs.
File size: 6.5 KB
RevLine 
[104]1; Project name : Assembly Library
2; Description : This is the place to put various generic macros.
[566]3; Should be included immediately after Emulate.inc
[110]4%ifndef MACROS_INC
5%define MACROS_INC
[104]6
[602]7
[104]8;--------------------------------------------------------------------
[631]9; The long (two byte) form of PUSH. Supported by NEC V20/V30.
10;
11; LPUSH
12; Parameters:
13; %1: Any 16 bit general purpose register.
14; Returns:
15; Nothing
16; Corrupts registers:
17; Nothing
18;--------------------------------------------------------------------
19%macro LPUSH 1.nolist
20 %ifidni %1, ax
21 db 0FFh, 0F0h
22 %elifidni %1, cx
23 db 0FFh, 0F1h
24 %elifidni %1, dx
25 db 0FFh, 0F2h
26 %elifidni %1, bx
27 db 0FFh, 0F3h
28 %elifidni %1, sp
29 db 0FFh, 0F4h
30 %elifidni %1, bp
31 db 0FFh, 0F5h
32 %elifidni %1, si
33 db 0FFh, 0F6h
34 %elifidni %1, di
35 db 0FFh, 0F7h
36 %else
37 %error "Invalid parameter passed to LPUSH"
38 %endif
39%endmacro
40
41
42;--------------------------------------------------------------------
43; The long (two byte) form of POP. Not supported by NEC V20/V30.
44; NEC V20/V30 CPU:s will adjust SP but not actually move the contents
45; of the top WORD on the stack to the destination register.
46;
47; LPOP
48; Parameters:
49; %1: Any 16 bit general purpose register.
50; Returns:
51; Nothing
52; Corrupts registers:
53; Nothing
54;--------------------------------------------------------------------
55%macro LPOP 1.nolist
56 %ifidni %1, ax
57 db 8Fh, 0C0h
58 %elifidni %1, cx
59 db 8Fh, 0C1h
60 %elifidni %1, dx
61 db 8Fh, 0C2h
62 %elifidni %1, bx
63 db 8Fh, 0C3h
64 %elifidni %1, sp
65 db 8Fh, 0C4h
66 %elifidni %1, bp
67 db 8Fh, 0C5h
68 %elifidni %1, si
69 db 8Fh, 0C6h
70 %elifidni %1, di
71 db 8Fh, 0C7h
72 %else
73 %error "Invalid parameter passed to LPOP"
74 %endif
75%endmacro
76
77
78;--------------------------------------------------------------------
[602]79; Skips the immediately following 1 byte instruction by using it
80; as an immediate value to a dummy instruction.
81; Destroys the contents of %1.
82;
83; SKIP1B
84; Parameters:
85; %1: Any 8 bit general purpose register or F for flags.
86; Returns:
87; Nothing
88; Corrupts registers:
89; %1
90;--------------------------------------------------------------------
91%macro SKIP1B 1.nolist
92 %ifidni %1, f
[631]93 db 03Ch ; Opcode byte for CMP AL, <immed>
94 ;db 0A8h ; Alt. version TEST AL, <immed>
[602]95 %elifidni %1, al
[631]96 db 0B0h ; Opcode byte for MOV AL, <immed>
[602]97 %elifidni %1, ah
[631]98 db 0B4h ; Opcode byte for MOV AH, <immed>
[602]99 %elifidni %1, bl
[631]100 db 0B3h ; Opcode byte for MOV BL, <immed>
[602]101 %elifidni %1, bh
[631]102 db 0B7h ; Opcode byte for MOV BH, <immed>
[602]103 %elifidni %1, cl
[631]104 db 0B1h ; Opcode byte for MOV CL, <immed>
[602]105 %elifidni %1, ch
[631]106 db 0B5h ; Opcode byte for MOV CH, <immed>
[602]107 %elifidni %1, dl
[631]108 db 0B2h ; Opcode byte for MOV DL, <immed>
[602]109 %elifidni %1, dh
[631]110 db 0B6h ; Opcode byte for MOV DH, <immed>
[602]111 %else
112 %error "Invalid parameter passed to SKIP1B"
113 %endif
114%endmacro
115
[631]116
[602]117;--------------------------------------------------------------------
[104]118; Skips the immediately following 2 byte instruction by using it
119; as an immediate value to a dummy instruction.
120; Destroys the contents of %1.
121;
122; SKIP2B
123; Parameters:
124; %1: Any 16 bit general purpose register or F for flags.
125; Returns:
126; Nothing
127; Corrupts registers:
128; %1
129;--------------------------------------------------------------------
[592]130%macro SKIP2B 1.nolist
[104]131 %ifidni %1, f
[631]132 db 03Dh ; Opcode byte for CMP AX, <immed>
133 ;db 0A9h ; Alt. version TEST AX, <immed>
[104]134 %elifidni %1, ax
[631]135 db 0B8h ; Opcode byte for MOV AX, <immed>
[104]136 %elifidni %1, cx
[631]137 db 0B9h ; Opcode byte for MOV CX, <immed>
[104]138 %elifidni %1, dx
[631]139 db 0BAh ; Opcode byte for MOV DX, <immed>
[104]140 %elifidni %1, bx
[631]141 db 0BBh ; Opcode byte for MOV BX, <immed>
[104]142 %elifidni %1, sp
[631]143 db 0BCh ; Opcode byte for MOV SP, <immed>
[104]144 %elifidni %1, bp
[631]145 db 0BDh ; Opcode byte for MOV BP, <immed>
[104]146 %elifidni %1, si
[631]147 db 0BEh ; Opcode byte for MOV SI, <immed>
[104]148 %elifidni %1, di
[631]149 db 0BFh ; Opcode byte for MOV DI, <immed>
[104]150 %else
151 %error "Invalid parameter passed to SKIP2B"
152 %endif
153%endmacro
[110]154
155
156;--------------------------------------------------------------------
[119]157; Load BDA (Bios Data Area) segment to wanted segment register.
158;
159; Use an exclamation point (!) as the third parameter when you want
160; to force the use of the register in the second parameter. This is
161; useful when that register needs to be zeroed in subsequent code or
162; when stack usage is undesirable (ie speed is critical).
163;
[258]164; The PRESERVE_FLAGS version will zero the register with a MOV instead
165; of an XOR, thus preserving the flags. It is one byte larger on
166; non-186 or higher systems.
167;
[119]168; LOAD_BDA_SEGMENT_TO
[258]169; LOAD_BDA_SEGMENT_PRESERVE_FLAGS_TO
[119]170; Parameters:
171; %1: Destination Segment Register
172; %2: Temporary WORD Register
173; %3: Can be ! or empty
174; Returns:
175; %1: BDA segment (zero)
176; Corrupts registers:
177; %2
178;--------------------------------------------------------------------
179%macro LOAD_BDA_SEGMENT_TO 2-3
180%ifndef USE_186
181 xor %2, %2
182 mov %1, %2
183%elifidn %3, !
184 xor %2, %2
185 mov %1, %2
186%else
187 push BYTE 0
188 pop %1
189%endif
190%endmacro
191
[258]192%macro LOAD_BDA_SEGMENT_PRESERVE_FLAGS_TO 2-3
193%ifndef USE_186
194 mov %2, 0
195 mov %1, %2
196%elifidn %3, !
197 mov %2, 0
198 mov %1, %2
199%else
200 push BYTE 0
201 pop %1
202%endif
203%endmacro
[119]204
[258]205
[119]206;--------------------------------------------------------------------
[110]207; eENTER_STRUCT
208; Parameters:
209; %1: Number of bytes to reserve from stack
210; Returns:
211; SS:BP: Ptr to beginning of struct reserved from stack
212; Corrupts registers:
213; FLAGS
214;--------------------------------------------------------------------
215%macro eENTER_STRUCT 1
216 push bp
217 sub sp, %1
218 mov bp, sp
219%endmacro
220
221;--------------------------------------------------------------------
222; eLEAVE_STRUCT
223; Parameters:
224; %1: Number of bytes reserved with eENTER_STRUCT
225; Returns:
226; BP: What it was before eENTER_STRUCT
227; Corrupts registers:
228; FLAGS
229;--------------------------------------------------------------------
230%macro eLEAVE_STRUCT 1
231 add sp, %1
232 pop bp
233%endmacro
234
235
[593]236;--------------------------------------------------------------------
[596]237; Small delay between I/O port accesses if needed.
[593]238;
239; IO_DELAY
240; Parameters:
241; Nothing
242; Returns:
243; Nothing
244; Corrupts registers:
245; Nothing
246;--------------------------------------------------------------------
247%macro IO_DELAY 0
248 jmp SHORT %%ClearPrefetchQueue
249%%ClearPrefetchQueue:
250%endmacro
251
252
[110]253%endif ; MACROS_INC
Note: See TracBrowser for help on using the repository browser.