source: trunk/include/asm.inc

Last change on this file was 186, checked in by Ben Rietbroek, 8 years ago

Improved language selection [v1.1.1-testing]

The old method copied the language specific files to a central location
before starting the build. This is a bit annoying when using version
control because the copied files get marked as changed, blurring the
current state of the work directory. Also, the specific language files
from the last build are always the active ones.

The new method conditionally includes the specific language files based
upon the BLD_LANG definition, which is passed on the cli. No more file
copying for specific language builds.

CAUTION:
This is a testbuild !
AirBoot uses the BIOS to access disks and a small coding error can trash
partition tables or other vital disk structures. You are advised to make
backups of TRACK0 and EBRs before using this testbuild. More info at:
https://rousseaux.github.io/netlabs.air-boot/pdf/AirBoot-v1.1.0-manual.pdf

File size: 9.5 KB
Line 
1; AiR-BOOT (c) Copyright 1998-2008 M. Kiewitz
2;
3; This file is part of AiR-BOOT
4;
5; AiR-BOOT is free software: you can redistribute it and/or modify it under
6; the terms of the GNU General Public License as published by the Free
7; Software Foundation, either version 3 of the License, or (at your option)
8; any later version.
9;
10; AiR-BOOT is distributed in the hope that it will be useful, but WITHOUT ANY
11; WARRANTY: without even the implied warranty of MERCHANTABILITY or FITNESS
12; FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13; details.
14;
15; You should have received a copy of the GNU General Public License along with
16; AiR-BOOT. If not, see <http://www.gnu.org/licenses/>.
17;
18; Some Standard macros to make life easier with ALP and other assemblers :D
19
20MPush Macro reglist
21 irp reg,<reglist>
22 push reg
23 EndM
24EndM
25
26MPop Macro reglist
27 irp reg,<reglist>
28 pop reg
29 EndM
30EndM
31
32; Macro to show some text when using debugging.
33; Possibly a register dump is done after this code, so we save and restore
34; the flags too.
35DBG_TEXT_OUT_AUX MACRO txt
36 local skip00 ; macro local jump labels
37 local txt00 ; macro local storage definitions
38 jmp skip00 ; jump over the string
39txt00 db 10,txt,10,0 ; macro text-string parameter inserted here
40 skip00:
41 pushf ; save flags
42 push si ; used to print the string
43 mov si, offset [txt00] ; address of the string
44 call AuxIO_Print ; output to serial port
45 pop si ; restore previous value
46 popf ; restore flags
47ENDM
48
49; Push CPU working context
50PUSHRF MACRO
51 pusha
52 pushf
53ENDM
54
55; Restore CPU working context
56POPRF MACRO
57 popf
58 popa
59ENDM
60
61; Push CPU working context including DS and ES
62PUSHRSF MACRO
63 pusha
64 push ds
65 push es
66 pushf
67ENDM
68
69; Restore CPU working context including DS and ES
70POPRSF MACRO
71 popf
72 pop es
73 pop ds
74 popa
75ENDM
76
77; Rousseau:
78; My editor (Geany) keeps auto-completing 'call' to 'callfar' because
79; of this definition. Since it's not used anywhere I disabled it.
80;~ callfar Macro destination
81 ;~ push cs
82 ;~ call &destination
83;~ EndM
84
85
86;
87; OLD OVERLAP CHECKER, DOES NOT WORK WELL WITH JWASM.
88;
89; NOTE: Overlapchecking in JWasm is not as reliable as in Tasm.
90; Because it's a single pass assembler, the current location can be
91; incorrect. Tasm with multiple passes works correct.
92; FIXME: Get JWasm and Tasm use some common ECHO/%OUT method.
93; (Tasm only pases first word of non-quoted string to a macro)
94check_overlap MACRO loc
95
96 ; Exit macro immediately if no overlap.
97 ; We don't want to assign values to z_last_... if there is no
98 ; overlap because they would then hold the values the last time this
99 ; macro was called and not those of the last overlap.
100 IF (loc - $) LE 0
101 ;~ IF ($ - loc) GE 0
102 EXITM
103 ENDIF
104
105 ; Calculate the overlap.
106 z_last_overlap_size = (loc - $)
107 z_last_overlap_location = loc - z_last_overlap_size
108
109 IFDEF JWASM
110 ; Output message.
111 ECHO
112 ECHO ** ERROR: LOCATION OVERLAP DETECTED [JWASM] ! **
113 ECHO . THIS IS MOST LIKELY CAUSED BY CODE / DATA
114 ECHO . EXPANSION TOWARDS AN 'ORG' DIRECTIVE.
115 ECHO . LOOK AT 'z_last_overlap_location' TO SEE WHERE.
116 ECHO . LOOK AT 'z_last_overlap_size' TO SEE SIZE.
117 ECHO . FORCING ERROR...
118 ECHO
119 ENDIF
120 IFDEF TASM
121 IF2
122 ; Output message (only on pass2).
123 %OUT
124 %OUT ** ERROR: LOCATION OVERLAP DETECTED [TASM] ! **
125 %OUT . THIS IS MOST LIKELY CAUSED BY CODE / DATA
126 %OUT . EXPANSION TOWARDS AN 'ORG' DIRECTIVE.
127 %OUT . LOOK AT 'z_last_overlap_location' TO WHERE.
128 %OUT . LOOK AT 'z_last_overlap_size' TO SEE SIZE.
129 %OUT . FORCING ERROR...
130 %OUT
131 ENDIF
132 ENDIF
133
134 ; Terminate assembly by forcing an error.
135 .ERR
136ENDM
137
138
139;
140; A normal ORG directive resets the location counter where code and data is
141; going to be emitted. If the location counter is reset back to a point
142; where code or data already has been emitted, this will be overwritten
143; without warning.
144; This macro does a check for this condition and aborts if it exists.
145; If there is space between the new location and the last emitted code or data
146; it will be filled with a filler-value defined in this macro..
147;
148; There are differences between assemblers on when and how labels and values
149; are evaluated. Since JWasm is a single-pass assembler, some expressions
150; do not work that do work in multi-pass Tasm.
151; That's why the actual check for overlap is done by db getting a negative
152; value if an overlap occured.
153; Don't change the (after - before) expression to a pre-calculated label
154; because that won't work and will break this macro.
155;
156ORIGIN MACRO loc
157 ;~ IFDEF JWASM
158 ;~ db (@F - $) dup('X')
159 ;~ ORG loc
160 ;~ @@:
161 ;~ ENDIF
162
163 ; Use this value to fill the gap between the new origin and the last
164 ; emitted code or data.
165 IFDEF AUX_DEBUG
166 fillchar = '#'
167 ELSE
168 fillchar = 0
169 ENDIF
170
171 ; Mark the location of the last emitted code or data.
172 z_&loc&_1before:
173
174 ; JWasm can do db 0 dup (0).
175 ; Using db dup() causes JWasm to recognize the after label so that
176 ; overlap calculations are correct.
177 IFDEF JWASM
178 db (z_&loc&_2after - z_&loc&_1before) dup(fillchar)
179 ENDIF
180
181 ; Tasm cannot do db 0 dup(0), so we exclude that condition.
182 ; Overlap checking could be done differently in Tasm but to keep things
183 ; easy the JWasm method above is used.
184 IFDEF TASM
185 IF (z_&loc&_2after - z_&loc&_1before) NE 0
186 db (z_&loc&_2after - z_&loc&_1before) dup(fillchar)
187 ENDIF
188 ENDIF
189
190 ; Masm can also do db 0 dup (0), and it does calculate correctly
191 ; but cannot find the after label.
192 ; Same issue as with JWasm but the db construct does not solve it for Masm.
193 ; The label-values show-up to be correct in the listing though.
194 ; Currently overlap-checking is disabled when assembling with Masm !
195 ; FIXME: Find a solution for Masm.
196 IFDEF MASM
197 ;~ db (z_&loc&_2after - z_&loc&_1before) dup(fillchar)
198 ECHO ** Warning: Overlap Check on: loc not performed !
199 ENDIF
200
201 ; Wasm can also do db 0 dup (0), but it complains about brackets or so.
202 ; Seems to be some syntax issue.
203 ; It cannot generate a list-file so values cannot be checked.
204 ; It does not even support ECHO so no warning can be given.
205 ; So overlap-checking is disabled when assembling with Wasm !
206 ; FIXME: Find a solution for Wasm.
207 IFDEF WASM
208 ; NOT EVEN ECHO IS SUPPORTED !
209 ;~ db (z_&loc&_2after - z_&loc&_1before) dup(fillchar)
210 ENDIF
211
212 ; Set the new origin.
213 ORG loc
214
215 ; Mark the new location.
216 z_&loc&_2after:
217
218 ; Calculate the gap.
219 z_&loc&_3gap = z_&loc&_2after - z_&loc&_1before
220
221 ;
222 ; Note that the variables are prefixed with z_ so they appear
223 ; at the end of the list-file.
224 ;
225ENDM
226
227
228;
229; This macro inserts the AiR-BOOT signature at the place where it is invoked.
230;
231InsertAirbootSignature MACRO lang
232 db 'AiRBOOT'
233 dw AB_SIG_DATE
234 dw AB_SIG_YEAR
235 dw AB_SIG_VERSION
236 ; Wasm can only process the reference to 'lang' in pass 2 because it comes
237 ; from an included file which it has not processed yet at pass 1.
238 IFDEF WASM
239 IF2
240 db lang
241 ENDIF
242 ; The other assemblers process 'lang' correctly in pass 1.
243 ELSE
244 db lang
245 ENDIF
246ENDM
247
248
249;
250; This macro composes a path and file to load in include file.
251; It is used to include language specific files by using the BLD_LANG value.
252;
253include_from MACRO loc,file
254 include loc/file
255ENDM
256
257
258;
259; This macro creates a new symbol ending with '_TXT' which has the value of
260; the original symbol put in single quotes. It is used to do language specific
261; actions based on the BLD_LANG value.
262;
263enquote MACRO symname,symval
264 symname&_TXT EQU '&symval&'
265ENDM
266
267
268; Shortcuts for pointer-types
269bptr equ byte ptr
270wptr equ word ptr
271dptr equ dword ptr
272qptr equ qword ptr
273tptr equ tbyte ptr
274
275
276sector_size equ 512 ; Normal size of a sector.
277image_size_60secs equ 7800h ; Size of the pre v1.07 image.
278image_size_62secs equ 7c00h ; Size of the post v1.06 image.
279
280;image_size equ image_size_60secs
281image_size equ image_size_62secs
282
283; Image size in sectors
284sector_count equ image_size / sector_size
285
286IF image_size EQ image_size_60secs
287 ; Maximum number of partitions supported in pre v1.07.
288 max_partitions equ 30
289ELSE
290 ; Maximum number of partitions supported in post v1.06.
291 max_partitions equ 45
292ENDIF
Note: See TracBrowser for help on using the repository browser.