source: trunk/bootcode/airboot.asm@ 244

Last change on this file since 244 was 244, checked in by Ben Rietbroek, 7 years ago

Merged "strings-to-es-20180707.txt" provided by Alfredo [v1.1.5-testing]

Translator-build 'AiR-BOOT-v1.1.5-ES-TESTBUILD-20180708' was created
from this commit.

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.4-manual.pdf

File size: 101.3 KB
Line 
1;
2; AiR-BOOT (c) Copyright 1998-2008 M. Kiewitz
3;
4; This file is part of AiR-BOOT
5;
6; AiR-BOOT is free software: you can redistribute it and/or modify it under
7; the terms of the GNU General Public License as published by the Free
8; Software Foundation, either version 3 of the License, or (at your option)
9; any later version.
10;
11; AiR-BOOT is distributed in the hope that it will be useful, but WITHOUT ANY
12; WARRANTY: without even the implied warranty of MERCHANTABILITY or FITNESS
13; FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14; details.
15;
16; You should have received a copy of the GNU General Public License along with
17; AiR-BOOT. If not, see <http://www.gnu.org/licenses/>.
18;
19
20
21
22
23
24
25
26;##############################################################################
27; AiR-BOOT / DEFINITIONS
28;##############################################################################
29
30;
31; This one should never be undefined, but if so, then default to English.
32;
33IFNDEF BLD_LANG
34BLD_LANG EQU en
35ENDIF
36
37;
38; Include AiR-BOOT Version Information.
39; This version-info is defined using simpel EQU's so it can serve as a
40; single source for other formats. The AiR-BOOT signature and the
41; OS/2 BLDLEVEL use this basic version information.
42;
43include ../include/version.inc
44
45;
46; Include OS/2 BLDLEVEL Information.
47; It uses the version-information in VERSION.INC to build it's signature.
48;
49include bldlevel.inc
50
51;
52; Include some macro's.
53; This file contains the ORIGIN macro that is used to detect overlaps.
54;
55include ../include/asm.inc
56
57;
58; The BLD_LANG is passed as an unquoted string so it can be used with
59; the 'include' directive. But for other language conditional actions a quoted
60; version is needed. This macro creates BLD_LANG_TXT holding the language
61; in single quotes.
62;
63enquote BLD_LANG,%BLD_LANG
64
65; We actually don't want to use this directive because it generates extra
66; NOP instructions that we can do without.
67; TASM also has a bug in that when the .ERR2 directive is used when
68; the .386 directive is in effect, the JUMPS directive is also active
69; and cannot be turned off.
70; NOJUMPS seems to have no effect in this situation.
71; In this case 4 NOP instructions are generated after forward referencing jump
72; instructions, to allow for automatic recoding by TASM.
73; This seems to be a TASM bug. (v2,v3,v4, dunno v5)
74IFDEF TASM
75 ;~ JUMPS
76ENDIF
77
78
79;
80; If defined then each module is prefixed with it's name.
81; This is used for debugging purposes but it also increases code space.
82; It should be off in release code.
83;
84;~ MODULE_NAMES EQU
85
86
87
88; -----------------------------------------------------------------------------
89; DEBUG
90; -----------------------------------------------------------------------------
91
92;
93; Enable this to include Debug Modules and enable COM-port debugging.
94; To have room for the debug-code, the FX-code can only be enabled
95; when AUX_DEBUG is not defined.
96;
97;~ AUX_DEBUG EQU
98
99
100;
101; The FX (video animation) module is about to be completely removed from the
102; build to regain code space. This is especially true for non-EN builds,
103; which often have longer strings or even load special character sets.
104;
105; However, because the EN-build for REALEASE-v1.1.2 was already distributed
106; with ArcaOS v5, FX will only be excluded for non-EN builds. When FX is not
107; compiled-in and Cooper Bars is enabled in the SETUP, the TAB-key used for
108; switching between MENU and PRE-BOOT screens will not work.
109;
110; Upcoming releases will completely remove FX related code and SETUP options.
111;
112; As can be read in 'special/fx.asm' around line 26, this removal may have
113; severe consequences for me, so if no new AiR-BOOT releases appear, then you
114; know I have been './'-ted, which most probably will be something completely
115; different from being 'slash-dotted' ... ;)
116;
117
118;~ IF BLD_LANG_TXT EQ 'en'
119;~ IFNDEF AUX_DEBUG
120;~ FX_ENABLED EQU
121;~ ENDIF
122;~ ELSE
123 ;~ echo
124 ;~ echo ***** NOTE: Excluding FX-module for this language ! *****
125 ;~ echo
126;~ ENDIF
127
128echo
129echo *** NOTE: As of v1.1.4-RELEASE the FX-module is excluded to save space ***
130echo
131
132; -----------------------------------------------------------------------------
133; AUX
134; -----------------------------------------------------------------------------
135;
136; bits 7-5 = datarate
137; (000=110,001=150,010=300,011=600,100=1200,101=2400,110=4800,111=9600 bps)
138; bits 4-3 = parity
139; (00 or 10 = none, 01 = odd, 11 = even)
140; bit 2 = stop-bits
141; (set = 2 stop-bits, clear = 1 stop-bit)
142; bits 1-0 = data-bits
143; (00 = 5, 01 = 6, 10 = 7, 11 = 8)
144;
145
146; 9600 bps, no parity, 1 stop-bit, 8 bits per char
147AUX_INIT_PARMS EQU 11100011b
148
149; Com-port for debugging, 0 is disabled
150BIOS_COM_PORT EQU 1
151
152; Default word value for BIOS_AuxParms variable
153; Note that is has moved since v1.07
154BIOS_AUXPARMS_DEFAULT EQU (AUX_INIT_PARMS SHL 8) OR BIOS_COM_PORT
155
156; Default byte value for BIOS_BootDisk variable
157BIOS_BOOTDISK_DEFAULT EQU 80h
158
159
160
161; -----------------------------------------------------------------------------
162; LABELS
163; -----------------------------------------------------------------------------
164; Address labels after code-move
165BootBaseSeg equ 08000h ; Pre-boot, in the low 640K
166BootBasePtr equ 0h ; We put our MBR to this location
167BootBaseExec equ BootBasePtr+offset MBR_RealStart
168StackSeg equ 07000h ; Put the stack below the code
169StartBaseSeg equ 00000h ; Pre-boot, we are in low memory
170StartBasePtr equ 07C00h ; BIOS starts our MBR at 0:7C00
171
172
173
174; -----------------------------------------------------------------------------
175; VIDEO
176; -----------------------------------------------------------------------------
177; Video pages, no INT 10h is used for menu-drawing etc.
178VideoIO_Page0 equ 0B800h
179VideoIO_Page1 equ 0B900h
180VideoIO_Page2 equ 0BA00h
181VideoIO_Page4 equ 0BC00h
182VideoIO_FXSegment equ 0A000h
183
184; Special line-drawing characters
185TextChar_WinLineRight equ 0C4h
186TextChar_WinLineDown equ 0B3h
187TextChar_WinRep1 equ 0D1h
188TextChar_WinRep2 equ 0C5h
189TextChar_WinRep3 equ 0CFh
190
191; Remap the box-char for Spanish
192IF BLD_LANG_TXT EQ 'es'
193TextChar_WinRep4 equ 0D9h ; Remapped box-char for ES
194ELSE
195TextChar_WinRep4 equ 0B5h ; Normal box-char
196ENDIF
197
198TextChar_WinRep5 equ 0C6h
199TextChar_WinRep6 equ 0D8h
200
201
202; -----------------------------------------------------------------------------
203; DISK INFORMATION
204; -----------------------------------------------------------------------------
205; Offsets into the DISKINFO structures located in the array [DiskInformation]
206
207; BIOS disk number and MBR flags
208LocDISKINFO_DiskNum equ 00h ; BYTE - BIOS disk number (80h etc)
209LocDISKINFO_MbrFlags equ 01h ; BYTE - Valid MBR, etc
210
211; BIOS INT13 Info
212LocDISKINFO_I13_Secs equ 02h ; WORD - Max 63
213LocDISKINFO_I13_Heads equ 04h ; WORD - Max 16 or 255
214LocDISKINFO_I13_Cyls equ 06h ; WORD - Max 1024
215
216; BIOS INT13X Info
217LocDISKINFO_I13X_Flags equ 08h ; WORD - CHS valid, etc
218LocDISKINFO_I13X_SecSize equ 0ah ; WORD - Normally 512 bytes
219LocDISKINFO_I13X_Secs equ 0ch ; DWORD - Max 63 ?
220LocDISKINFO_I13X_Heads equ 10h ; DWORD - Max 255 ?
221LocDISKINFO_I13X_Cyls equ 14h ; DWORD - Max 2_32 (4294967296)
222LocDISKINFO_I13X_SecsLBA equ 18h ; QWORD - Max 2^64 (4294967296^2)
223LocDISKINFO_I13X_HostBus equ 20h ; 4 bytes
224LocDISKINFO_I13X_Interface equ 24h ; 8 bytes
225
226; OS/2 LVM Info
227LocDISKINFO_LVM_Flags equ 2ch ; WORD - OS/2 ext geo, etc
228LocDISKINFO_LVM_MasterLBA equ 2eh ; DWORD - Max 254
229LocDISKINFO_LVM_Secs equ 32h ; DWORD - Max 255
230LocDISKINFO_LVM_Heads equ 36h ; DWORD - Max 255
231LocDISKINFO_LVM_Cyls equ 3ah ; DWORD - Max 65536
232
233; Custom Info
234LocDISKINFO_Flags equ 3eh ; WORD - Custom flags, dunno yet
235
236; Size of this structure
237DISKINFO_Size equ 40h ; Size to be allocated
238
239
240; -----------------------------------------------------------------------------
241; PARTITION TABLE
242; -----------------------------------------------------------------------------
243; Offsets for Partition-Entries in MBR/EBRs
244LocBRPT_LenOfEntry equ 16 ; Length of a standard MBR or EPR entry
245LocBRPT_Flags equ 0 ; Bootable, Hidden, etc.
246LocBRPT_BeginCHS equ 1 ; Packed CHS value
247LocBRPT_BeginHead equ 1 ; Start head, usually < 16
248LocBRPT_BeginSector equ 2 ; Start sector, max 63 + cyl high bits
249LocBRPT_BeginCylinder equ 3 ; Start cylinder 8+2 bits, max 1023
250LocBRPT_SystemID equ 4 ; Type of system using the partition
251LocBRPT_EndCHS equ 5 ; Packed CHS value
252LocBRPT_EndHead equ 5 ; End head, usually < 16
253LocBRPT_EndSector equ 6 ; End sector, max 63 + cyl high bits
254LocBRPT_EndCylinder equ 7 ; End cylinder 8+2 bits, max 1023
255LocBRPT_RelativeBegin equ 8 ; LBA32 address of partition
256LocBRPT_AbsoluteLength equ 12 ; 32-bit length of partition
257
258; Signature relative to start of MBR/EBR
259LocBR_Magic equ 510 ; Offset of 0AA55h signature
260
261
262; -----------------------------------------------------------------------------
263; LVM RECORD
264; -----------------------------------------------------------------------------
265; Used as a quick compare in LVM.ASM
266LocLVM_SignatureByte0 equ 02h
267
268; Offsets for LVM Information Sector.
269; These are relative to the start of the LVM sector.
270LocLVM_SignatureStart equ 00h ; 02h,'RMBPMFD' (8 bytes)
271LocLVM_CRC equ 08h ; CRC is a DWORD
272LocLVM_Heads equ 1ch ; Number of heads
273LocLVM_Secs equ 20h ; Sectors per Track
274LocLVM_DiskName equ 24h ; Name of the disk
275LocLVM_StartOfEntries equ 3ch ; (contains maximum of 4 entries)
276LocLVM_LenOfEntry equ 3ch ; Length of an LVM-entry
277
278; An LVM info-sector can contain information on max. 4 partitions.
279; All 4 entries will be used when there 4 primary partitions defined.
280; For logical partitions, the LVM info-sector is located below the start
281; of the logical partition and only one LVM entry is used in that logical
282; LVM info-sector.
283LocLVM_MaxEntries equ 4 ; Max entries in an LVM-sector
284
285
286; -----------------------------------------------------------------------------
287; LVM ENTRY
288; -----------------------------------------------------------------------------
289; Offsets for LVM entry.
290; These are relative to the start of the entry.
291LocLVM_VolumeID equ 00h ; DWORD
292LocLVM_PartitionID equ 04h ; DWORD
293LocLVM_PartitionSize equ 08h ; DWORD
294LocLVM_PartitionStart equ 0ch ; DWORD
295LocLVM_OnBootMenu equ 10h ; is on IBM BM Bootmenu
296LocLVM_Startable equ 11h ; is Startable (newly installed system)
297LocLVM_VolumeLetter equ 12h ; Drive Letter for partition (C-Z or 0)
298LocLVM_Unknown equ 13h ; unknown BYTE (can be used ?)
299LocLVM_InstallLetter equ 13h ; unknown BYTE (can be used ?)
300
301; Truncated to 11 chars when displayed in menu.
302; MiniLVM sets both to the same value.
303; Also, MiniLVM uses a 0-byte terminator, so the maximum length is 19d.
304; Same goes for LocLVM_DiskName.
305; These offsets are relative to an LVM entry.
306LocLVM_VolumeName equ 14h ; 20 bytes
307LocLVM_PartitionName equ 28h ; 20 bytes (Used in menu)
308
309; LVM constants.
310LocLVM_LabelLen equ 14h ; Length of LVM Label (Disk/Part/Vol)
311LocLVM_DiskNameLen equ 14h ; Length of LVM DiskName
312LocLVM_VolumeNameLen equ 14h ; Length of LVM VolumeName
313LocLVM_PartitionNameLen equ 14h ; Length of LVM PartitionName
314
315
316; -----------------------------------------------------------------------------
317; AiR-BOOT IPT
318; -----------------------------------------------------------------------------
319; Offsets for IPT (Internal Partition Table)
320LocIPT_MaxPartitions equ max_partitions ; 45 in v1.07+
321LocIPT_LenOfSizeElement equ 6 ; Size of one Size-Element
322LocIPT_LenOfIPT equ 34 ; Length of an IPT-entry
323LocIPT_Serial equ 0 ; Serial from MBR ?
324LocIPT_Name equ 4 ; Name from FS or LVM (part/vol)
325LocIPT_Drive equ 15 ; Drive-ID (80h,81h)
326LocIPT_SystemID equ 16 ; Partition-Type (06,07,etc)
327LocIPT_Flags equ 17 ; AiR-BOOT Flags for part (see below)
328LocIPT_BootRecordCRC equ 18 ; CRC of Boot-Record
329LocIPT_LocationBegin equ 20 ; Begin of Partition
330LocIPT_LocationPartTable equ 23 ; PartitionTable of Partition
331LocIPT_AbsoluteBegin equ 26 ; Absolute Sector of Begin
332LocIPT_AbsolutePartTable equ 30 ; Absolute Sector of PartTable
333
334
335; AiR-BOOT IPT-Flags
336LocIPT_DefaultFlags equ 00000011b ; Don't know if boot-able :)
337LocIPT_DefaultNonBootFlags equ 00000010b ; VIBR Detection is always on
338
339Flags_Bootable equ 00000001b
340Flags_VIBR_Detection equ 00000010b
341Flags_HideFeature equ 00000100b
342Flags_DriveLetter equ 00001000b ; OS/2 FAT16/HPFS only
343Flags_ExtPartMShack equ 00010000b ; Ext. Partition M$-Hack req ?
344Flags_NoPartName equ 01000000b
345Flags_NowFound equ 10000000b ; temp only in OldPartTable
346Flags_SpecialMarker equ 10000000b ; temp only for HiddenSetup
347
348FileSysFlags_BootAble equ 00000001b ; Is this Partition boot-able ?
349FileSysFlags_FAT32 equ 00010000b ; FAT 32 specific name getting
350FileSysFlags_NoName equ 00100000b ; No Name - use PartitionName
351FileSysFlags_DriveLetter equ 01000000b ; DriveLetter Feature possible
352
353
354; -----------------------------------------------------------------------------
355; AiR-BOOT HPT
356; -----------------------------------------------------------------------------
357; Hidden Partition Table
358; Length of an HPT-entry ((45 * 6 bits-per-part) / 8) * 45
359; 33.75 = 34 bytes for HPT-entry, coincidently same as length of IPT-entry.
360; Packed table !
361LocHPT_LenOfHPT equ 34
362
363
364; -----------------------------------------------------------------------------
365; NAVIGATION KEYS
366; -----------------------------------------------------------------------------
367; Navigation keys
368Keys_Up equ 48h
369Keys_Down equ 50h
370Keys_Left equ 4Bh
371Keys_Right equ 4Dh
372Keys_PageUp equ 49h
373Keys_PageDown equ 51h
374Keys_GrayPlus equ 4Eh
375Keys_GrayMinus equ 4Ah
376Keys_Plus equ 1Bh
377Keys_Minus equ 35h
378Keys_ENTER equ 1Ch
379Keys_ESC equ 1h
380Keys_F1 equ 3Bh
381Keys_F10 equ 44h
382Keys_C equ 2Eh ; Add. Check for Ctrl!
383Keys_Y equ 2Ch
384Keys_Z equ 15h
385Keys_N equ 31h
386Keys_TAB equ 0Fh
387Keys_Delete equ 53h
388Keys_Backspace equ 0Eh
389Keys_Space equ 20h
390
391Keys_Flags_EnterSetup equ 1100b ; Strg+Alt (AL)
392
393
394; -----------------------------------------------------------------------------
395; MISC
396; -----------------------------------------------------------------------------
397; Initial value for the FreeDriveletterMap
398; Meaning A,B not free; C-Z free, rest unused. (right to left)
399; Each partition with an assigned drive-letter clears a bit in this map.
400; (Not implemented yet)
401InitialFreeDriveletterMap equ 00000011111111111111111111111100b
402
403;
404; The first harddisk is BIOS coded 80h.
405; This makes a total of 128 disks that could be supported using this coding.
406; This value is used to store disk-information and this info is allocated
407; in the BSS. 64 disks ought to be enough for everybody :-)
408;
409MaxDisks equ 64
410
411
412
413
414
415
416;##############################################################################
417; AiR-BOOT / MAIN-CODE
418;##############################################################################
419
420;
421; Because of the TASM-bug the processor had to be changed to turn JUMPS
422; off. Existing movzx instructions were replaced with 286 equivalent code.
423; Out of range relative jumps have been recoded.
424;
425; Since version 1.0.8, JWasm is the preferred assembler and Tasm will be
426; dropped. Also, the chances of AiR-BOOT being used on a 286-machine are
427; very slim, so a future version will revert back to .386 and also incorporate
428; 32-bit code. This will enable some enhanced constructs such as scaled
429; indexing, bit-instructions, 32-bit registers and what not.
430;
431.286
432
433;
434; For Tasm, MODEL is needed for the USES directive to work.
435; So always use a model when assembling with Tasm otherwise registers on
436; function calls that use USES are not saved and restored.
437; The model itself, has no real effect because we generate a binary image
438; and not a segmented executable.
439; For the other assemblers we define no model to get rid of the default C/C++
440; segments for future object-linked versions of AiR-BOOT.
441;
442IFDEF TASM
443 ;~ .model large, basic
444 .model tiny,c
445ENDIF
446
447;
448; The below is used to switch between the original 1-segment (code_seg) layout
449; and the new 2-segment (code_seg and bss_data) layout.
450; It will be removed in future versions.
451; The 2-segment layout was needed for JWasm because it does not treat
452; db ? at the end of a code segment as bss-data.
453; Therefore, a true BSS segment is now used.
454; Both the code_seg and the bss_data are grouped to the logical AIRBOOT
455; segment.
456; Note that this influences the offsets in the BSS in the list-file and
457; the wdis disassembly file (.WDA).
458; They are now segment-relative. The true offset is resolved at link
459; time.
460;
461SEGMENTED EQU
462
463 IFDEF SEGMENTED
464 AIRBOOT GROUP LDRIMAGE,VOLATILE
465 ENDIF
466
467 ; Our code-segment starts here.
468 LDRIMAGE SEGMENT USE16 PUBLIC 'CODE'
469
470 IFDEF SEGMENTED
471 ASSUME CS:AIRBOOT, DS:AIRBOOT, ES:nothing, SS:nothing
472 ELSE
473 ASSUME CS:LDRIMAGE,DS:LDRIMAGE,ES:nothing, SS:nothing
474 ENDIF
475
476
477
478;==============================================================================
479; Sector 1
480;==============================================================================
481
482;------------------------------------------------------------------------------
483 ; We are not a .COM file at 100h but a BINARY image
484 ; of which only the 1st sector gets loaded at 0000:07c00h
485 ; by the BIOS. The code in this 1st sector is position
486 ; independent and moves itself to a new location at 8000:0000h.
487 ; Then it jumps to a new entry-point and loads the rest of
488 ; the image to the new location.
489 org 00000h
490;------------------------------------------------------------------------------
491
492
493;
494; Since AiR-BOOT is a boot-loader residing in track0, the first 512 bytes
495; have the layout of a Master Boot Record (MBR). When AiR-BOOT get's installed,
496; the first 512 bytes of this code get's merged with the Partition Table.
497; The rest is installed in the remaining sectors with sector 62 (LBA 61)
498; being the last sector used by AiR-BOOT. Sector 63 is reserved for IBM LVM.
499; The last sector used by AiR-BOOT is a copy of the MBR that AiR-BOOT makes
500; every time a system gets booted.
501;
502
503;
504; Due to the addition of an extra 'I13X' sugnature and code to preserve the
505; values of the registers on entry, the MBR-code has become a bit messy.
506; This will be cleaned-up in future versions.
507;
508
509;
510; Martin had a short jump followed by the AiRBOOT signature at first.
511; Then he encountered strange behaviour by some M$ operating-systems
512; if the the first insruction was not a CLI.
513; But there was no room to insert the CLI and of course he did not want to
514; change the location of the AiR-BOOT signature.
515; He solved this by inserting the M$ needed CLI at offset 0 followed by a short
516; jump that uses the 'A' of the AiR-BOOT signature as the jump displacement.
517;
518
519
520; -----------------------------------------------------------------------------
521; FIRST ENTRY-POINT
522; -----------------------------------------------------------------------------
523; BOOKMARK: FIRST ENTRY-POINT (Invoked by BIOS)
524; ######################################################
525; # ENTRY-POINT WHERE THE BIOS TRANSFERS CONTROL TO US #
526; ######################################################
527AiR_BOOT:
528 ; Some M$ operating systems need a CLI
529 ; here otherwise they will go beserk
530 ; and will do funny things during
531 ; boot phase, it's laughable!
532 MBR_1stOpc: cli
533
534 ; JMP-Short -> MBR_Start
535 ; Uses the 'A' from the signature as the displacement !
536 MBR_JmpOpc db 0EBh
537
538 ; ID String, Date (DD,MM,CC,YY), Version Number, Language ID
539 ;~ db 'AiRBOOT',24h,02h,20h,12h,01h,08h,TXT_LanguageID
540 MBR_ABSig: InsertAirbootSignature TXT_LanguageID
541
542 ; Total Code Sectors Count.
543 ; Actual value will be inserted by FIXCODE.
544 MBR_CodeSecs db 1
545
546 ; Total Code Sectors Count, dynamically calculated.
547 ;~ db (code_end-$)/512
548
549 ; Check-Sum for Code
550 MBR_CheckCode dw 0
551
552
553
554; -----------------------------------------------------------------------------
555; THIRD ENTRY-POINT
556; -----------------------------------------------------------------------------
557; BOOKMARK: THIRD ENTRY-POINT (Relocate code)
558;
559; No single instruction below should be changed, added or removed in the code
560; below as this will cause the jump-link to go haywire.
561;
562MBR_Start:
563 ;
564 ; When we arrive here, no registers have been used yet.
565 ; So, they still contain the values the BIOS left in them.
566 ; We want to preserve those value's for later inspection
567 ; by putting them on the stack.
568 ;
569
570 ; No space for this instruction here.
571 ; We'll enable interrupts later.
572 ;sti ; This opcode is dedicated to:
573 ; =MICROSOFT JUMP DEPARTMENT=
574
575 ; Push all registers with values provided by the BIOS
576 ; on the stack.
577 pusha
578
579 ;
580 ; Setup some base stuff
581 ; AX got loaded wrongly for debug, changed the instructions
582 ; without modifying the number of bytes.
583 ; Don't comment-out the redundant instruction below because it
584 ; *will* change the number of bytes and break the jump-chain.
585 ;
586
587 ; The segment we are moving ourself from (NOT USED)
588 ;mov ax, StartBaseSeg
589 ;mov ds, ax
590
591 ; Make sure DS points to CS.
592 push cs
593 pop ds
594
595 ; Setup the source and destination for the code move.
596 mov si, StartBasePtr ; The offset we move ourself from
597 mov ax, BootBaseSeg ; The target segment we move to
598 mov es, ax
599 ;mov di, BootBasePtr ; The target offset we move to
600 ; Changed the instruction to make room.
601 ; So, BootBasePtr is not used !
602 ; The offset in the target segment is assumed to be 0000
603 ; anyway.
604 xor di,di
605 ;sti
606
607 ; Size of the MBR in words.
608 mov cx, 256 ; Pre-boot environment
609
610 ;
611 ; This moves this 512-byte sector, loaded by the BIOS at
612 ; 0000:7c00 to 8000:0000.
613 ;
614 cld
615 rep movsw
616
617 ; Temporary save SS and SP so we still have access to this
618 ; stack after we have setup our own.
619 mov cx,ss
620 mov bx,sp
621
622 ; Code an intersegment jump to the new location.
623 ; jmp BootBaseSeg:BootBaseExec
624 ; Note that DX:BX containts the old SS:SP.
625 db 0EAh
626 dw BootBaseExec ; This is MBR_RealStart + BootBasePtr
627 dw BootBaseSeg ; This is 08000h
628
629
630
631
632; -----------------------------------------------------------------------------
633; SIMPLE MBR FUNCTIONS
634; -----------------------------------------------------------------------------
635;
636; Some MBR-functions to provide absolute minimum functionality.
637;
638
639;
640; BOOKMARK: Halt System
641; Entry-point for halting the system.
642;
643MBR_HaltSystem:
644 mov ax, 8600h
645 xor cx, cx
646 mov dx, 500
647 int 15h ; Wait to display the whole screen :]
648MBR_HaltSys:
649 ;~ cli
650 jmp MBR_HaltSys
651
652
653 ; Base of some MBR variables
654 ORIGIN 0003Ch
655
656MBR_Variables:
657
658; Comport settings.
659; It had to be moved to create room for the double I13X signature.
660; It cannot be in the config-area (sector 55)
661; because that area is crc-protected and would not allow 'poking'.
662BIOS_AuxParms dw BIOS_AUXPARMS_DEFAULT
663
664; When the BIOS turns over control to the MBR, DL holds the BIOS disk-number
665; from which the boot was initiated. This would normally be 80h, corresponding
666; to the first physical disk. However, some modern BIOSses can directly boot
667; from other disks, so AirBoot cannot assume being loaded from 80h anymore.
668; So here we store the BIOS disk-number passed in DL when AirBoot got control.
669BIOS_BootDisk db BIOS_BOOTDISK_DEFAULT ; Get overwritten with 'DL'
670
671; Reserved space for future variables.
672IFDEF AUX_DEBUG
673reserved db 5 dup('X')
674ELSE
675reserved db 5 dup(0)
676ENDIF
677
678
679
680
681; -----------------------------------------------------------------------------
682; SECOND ENTRY-POINT
683; -----------------------------------------------------------------------------
684
685 ;
686 ; We arrive here after the first jump using the 'A' of the
687 ; AiR-BOOT signature. So we ensure the jump is always at
688 ; this offset. We jump here, because Martin needed to
689 ; insert a CLI on start and did not want to change the
690 ; AiR-BOOT signature because of Microsoft inventions...
691 ;
692 ORIGIN 00044h
693
694 ; Jump again...
695 ; This time to the code that relocates to 8000:0000.
696 ; BOOKMARK: SECOND ENTRY_POINT (Skipped over AB signature)
697 jmp MBR_Start
698
699;
700; Entry-point when loading fails.
701;
702 db 'LOAD ERROR!', 0
703MBR_LoadError Proc Near
704 mov si, offset $-12
705 push cs
706 pop ds
707 call MBR_Teletype
708 MBRLE_Halt:
709 jmp MBRLE_Halt
710MBR_LoadError EndP
711
712;
713; Entry-point when saving fails.
714;
715 db 'SAVE ERROR!', 0
716MBR_SaveError Proc Near
717 mov si, offset $-12
718 push cs
719 pop ds
720 call MBR_Teletype
721 MBRSE_Halt:
722 jmp MBRSE_Halt
723MBR_SaveError EndP
724
725
726; Put text on the screen using the BIOS tele-type function.
727; No attributes like color are supported.
728; In: SI - Pointer to begin of string (EOS is 0)
729; Destroyed: SI
730MBR_Teletype Proc Near Uses ax bx cx
731 mov ah, 0Eh
732 mov bx, 7
733 MBRT_Loop:
734 lodsb
735 or al, al
736 jz MBRT_End
737 int 10h
738 jmp MBRT_Loop
739 MBRT_End:
740 ret
741MBR_Teletype EndP
742
743;
744; Rousseau: DO NOT ADD CODE TO THIS SECTION !
745;
746
747; In: BX - Base Check
748; DS:SI - Pointer to 512-byte-area to be included
749; Out: BX - Base Check Result
750; Destroyed: SI will get updated (+512)
751MBR_GetCheckOfSector Proc Near Uses ax cx
752 mov cx, 256
753 MBRGCOS_Loop:
754 lodsw
755 xor ax, 0BABEh
756 xor bx, ax
757 loop MBRGCOS_Loop
758 or bx, bx
759 jnz MBRGCOS_NoFixUp
760 mov bx, 1 ; dont allow 0, cause 0 == empty
761 MBRGCOS_NoFixUp:
762 ret
763MBR_GetCheckOfSector EndP
764
765
766
767
768
769
770; -----------------------------------------------------------------------------
771; ENTRY-POINT OF MOVED CODE
772; -----------------------------------------------------------------------------
773
774;
775; When we arrive here we are running at 8000:0000.
776; CX:BX contains the SS:SP of the old stack.
777;
778
779;
780; This is where the rest of AiR-BOOT gets loaded from track0.
781;
782; BOOKMARK: Running at relocated position (Load additional sectors)
783;------------------------------------------------------------------------------
784MBR_RealStart:
785 ;
786 ; Setup new stack and other segment registers.
787 ;
788 mov ax, StackSeg ; 07000h, below the moved code
789 mov ss, ax
790 mov sp, 7FFEh ; Even is better
791 push es ; ES holds segment where we moved to
792 pop ds ; Set DS=ES to Code Segment
793
794 ;
795 ; Push the old SS:SP which was saved in CX:BX on the new stack.
796 ;
797 push cx ; Old SS
798 push bx ; Old SP
799
800 ;
801 ; Store the BIOS disk-number AirBoot was loaded from.
802 ;
803 mov [BIOS_BootDisk], dl
804
805 ; Load the configuration-sectors from disk.
806 ; These are the main configuration sector and the various
807 ; tables that follow it upto but not including the MBR backup.
808 mov bx, offset Configuration ; Location in RAM
809 mov cx, 0037h ; Config sector is at 55d
810 mov al, (MBR_BackUpMBR - Configuration) / 200h
811 mov ah, 02h
812 ; DL is already loaded with BIOS disk-number
813 int 13h ; Call BIOS service
814 jnc MBR_ConfigCopy_NoError
815
816 ; Some error occured
817 MBR_ConfigCopy_LoadError:
818 jmp MBR_LoadError ; Will Abort BootUp
819
820 ; Load the code-sectors from disk.
821 ; [MBR_CodeSecs] is filled in by the FIXCODE helper that post
822 ; processes the AIRBOOT loader image after it has been built.
823 MBR_ConfigCopy_NoError:
824 mov bx, offset FurtherMoreLoad ; Directly after MBR
825 mov cx, 0002h ; Start at 2nd sector
826 mov al, [MBR_CodeSecs] ; Number of code sectors
827 mov ah, 02h ; Read sectors
828 ; DL is already loaded with BIOS disk-number
829 int 13h ; Call BIOS service
830 jnc MBR_RealStart_NoError
831
832 ; Some error occured
833 jmp MBR_LoadError ; Will Abort BootUp
834
835
836 ; I13X Signatures
837 ORIGIN 000d0h
838
839 ; [v1.05+]
840 ; Signature for IBM's LVM to detect our "powerful" features ;)
841 ;
842 ; [v1.0.8+]
843 ; Reworked MBR code to be able to create a
844 ; double 'I13X' signature.
845 ; MBR's created with LVM eCS v1.x have the signature at 0d5h
846 ; MBR's created with LVM eCS v2.x have the signature at 0d0h
847 ; See eCS bugtracker issue #3002
848 ;
849 ; Update: These are actually MOV EAX,'X31I' instructions
850 ; in the eCS LVM MBR-code. They are at different places in
851 ; the v1.x and v2.x LVM MBR-code. Other code might depend on
852 ; their presence. Let's protect their location.
853 db 'I13X',0,'I13X',0
854
855
856 MBR_RealStart_NoError:
857 ; Now Check Code with CheckSum
858 mov si, offset FurtherMoreLoad
859
860 ;movzx cx, bptr ds:[10h]
861 mov cl, ds:[10h]
862 mov ch,0
863
864 ; Claculate checksum
865 xor bx, bx
866 MBR_RealStart_CheckCodeLoop:
867 call MBR_GetCheckOfSector
868 loop MBR_RealStart_CheckCodeLoop
869
870 ; Verify checksum -- EQUAL if OK
871 cmp MBR_CheckCode, bx
872
873 ;
874 ; The CRC is calculated and inserted in the loader image when
875 ; AiR-BOOT is installed. Ignoring the CRC enables manually
876 ; merging the loader without using the installer. This is used
877 ; for debugging in virtual machines, where it is easy to
878 ; merge the loader to the disk image of the VM.
879 ;
880 IFDEF CRC_IGNORE
881 jmp MBR_RealStart_CheckSuccess ; Ignore CRC
882 ELSE
883 je MBR_RealStart_CheckSuccess ; Honor CRC -- EQ is OK
884 ENDIF
885
886 ;
887 ; Oops, checksum mismatch -- halt the system
888 ;
889 mov si, offset TXT_ERROR_Attention
890 call MBR_Teletype
891 mov si, offset TXT_ERROR_CheckCode
892 call MBR_Teletype
893 mov si, offset TXT_ERROR_CheckFailed
894 call MBR_Teletype
895 jmp MBR_HaltSystem
896
897
898 ;
899 ; OK, all loading went fine so the rest of the code
900 ; is present now, so we jump to it.
901 ; The old SS:SP is still on the stack.
902 ;
903 MBR_RealStart_CheckSuccess:
904 jmp AiR_BOOT_Start
905
906
907
908
909
910;------------------------------------------------------------------------------
911include_from text/%BLD_LANG,mbr.asm ; All translateable Text in MBR
912;------------------------------------------------------------------------------
913
914 ; Disk Signature
915 ORIGIN 001B8h
916
917
918 ; Disk Signature
919 ; Note that in an LVM 2.x MBR this collides
920 ; with the dummy PTE that it uses to look for IBM-BM
921 ; on the second harddisk.
922 ; AiR-BOOT installer will merge the field
923 ; from the MBR it replaces.
924 MBR_DrvSig db 'DSIG'
925
926 ; Unused word at 01BCh.
927 ; An LVM 2.x MBR puts 0CC33h here.
928 ; AiR-BOOT installer will merge the field
929 ; from the MBR it replaces.
930 MBR_Spare dw '$$'
931
932
933 ; Partition Table.
934 ORIGIN 001BEh
935
936 ; The 4 entries just for show.
937 ; AiR-BOOT installer will merge them from the MBR it replaces.
938 MBR_PartTable:
939 db 16 dup('0')
940 db 16 dup('1')
941 db 16 dup('2')
942 db 16 dup('3')
943
944 ; Boot Sigbature
945 MBR_Sig dw 0aa55h
946
947
948
949
950
951
952
953;==============================================================================
954; Sector 2
955;==============================================================================
956
957; -----------------------------------------------------------------------------
958; FILE-SYSTEM TABLES
959; -----------------------------------------------------------------------------
960
961 ; First sector the rest of the loader image
962 ORIGIN 00200h
963
964;
965; Everything beyond this point is loaded on startup
966; and is NOT existant at first
967;
968FurtherMoreLoad:
969
970;
971; Filesystem table correlating id with name.
972;
973
974 ; -> 44 Partition-Types
975 ; first Normal-Partition-ID, Hidden-Partition-ID
976 ; and Default-Partition-Flags.
977 ; 01h -> Boot-Able
978 ; 10h -> FAT32 - Name Getting Scheme
979 ; 20h -> No Name To Get (use Partition Name from IPT)
980 ; 40h -> 'L' flag possible
981 db 'AiRSYS-TABLE'
982FileSysIDs db 01h, 11h,01h, 04h,014h,01h, 06h,016h,41h, 0Eh,00Eh,01h
983 db 07h, 17h,41h, 08h,017h,21h, 35h,035h,20h,0FCh,017h,41h
984 db 09h, 19h,11h, 0Bh,01Bh,11h, 0Ch,01Ch,11h,0EBh,0EBh,01h
985 db 63h, 63h,21h, 81h,081h,21h, 83h,083h,21h, 40h,040h,21h
986 db 0A5h,0A5h,21h,0A6h,0A6h,21h, 82h,082h,20h,0A7h,0A7h,21h
987 db 63h, 63h,21h, 4Dh,04Dh,21h, 4Eh,04Eh,21h, 4Fh,04Fh,21h
988 db 01h, 01h,01h, 01h,001h,01h, 01h,001h,01h, 01h,001h,01h
989 db 01h, 01h,01h, 01h,001h,01h, 01h,001h,01h, 01h,001h,01h
990 db 01h, 01h,01h, 01h,001h,01h, 01h,001h,01h, 01h,001h,01h
991 db 01h, 01h,01h,0FDh,0FDh,20h, 84h,084h,20h,0A0h,0A0h,20h
992 db 0Ah, 0Ah,20h,0FEh,0FEh,21h,0FFh,0FFh,21h, 00h,000h,21h
993 db 16 dup (0)
994
995 ; Filesystem Types / Boot Methods
996FileSysNames db 'FAT12 ', 'FAT16 ', 'FAT16Big', 'FAT16Big'
997 db 'HPFS ', 'NTFS ', 'LVM-Data', 'JFS '
998 db 'FAT32 ', 'FAT32 ', 'FAT32 ', 'BeOS '
999 db 'Unix ', 'Minix ', 'Linux ', 'Venix ' ; x row ;)
1000 db 'BSD/386 ', 'OpenBSD ', 'LinuxSwp', 'NeXTSTEP'
1001 db 'GNU HURD', 'QNX ', 'QNX ', 'QNX '
1002 db ' ', ' ', ' ', ' '
1003 db ' ', ' ', ' ', ' '
1004 db ' ', ' ', ' ', ' '
1005 db ' ', 'Kernel ', ' ', '0V-Award'
1006; db 'OS/2 Man', 'via BIOS', 'Floppy ', 'Unknown '
1007
1008; rousseau.comment.201807081141
1009; These strings should not be separated into language-files because they are
1010; part of the table above.
1011IF BLD_LANG_TXT EQ 'es'
1012 db 'OS2-BMGR', 'v¡a BIOS', 'Flexible', '????????'
1013ELSE
1014 db 'OS2-BMGR', 'via BIOS', 'Floppy ', 'Unknown '
1015ENDIF
1016
1017
1018
1019;==============================================================================
1020; Sector 3
1021;==============================================================================
1022
1023; -----------------------------------------------------------------------------
1024; ENTRY-POINT AFTER LOADING THE REST OF THE CODE
1025; -----------------------------------------------------------------------------
1026
1027 ; The entry-point jumped to from the MBR code
1028 ORIGIN 00400h
1029
1030
1031;##############################################################################
1032;# AiR_BOOT_Start :: This is where the real work begins #
1033;# -------------------------------------------------------------------------- #
1034;# At this point, all of AirBoot is loaded, including its configuration. #
1035;# First, some setup is done, which includes the initialization of variables #
1036;# in the BSS. After that, disks are scanned for partitions and the required #
1037;# house keeping is done to incorporate changes from the previous boot. Then #
1038;# the partition list is prepared and the menu is presented. #
1039;##############################################################################
1040; BOOKMARK: AiR_BOOT_Start (AiR-BOOT now completely loaded)
1041AiR_BOOT_Start:
1042
1043
1044 ;
1045 ; Enable interrupts.
1046 ;
1047 sti
1048
1049 ;
1050 ; Pop the old SS:SP from the stack and save it in the BSS.
1051 ; Note that this is outside the normal variable area that gets cleared.
1052 ; This allows AiR-BOOT to restart itself when debugging and come-up
1053 ; with access to the original values of registers the BIOS passed.
1054 ;
1055 pop [OldSP]
1056 pop [OldSS]
1057
1058 ; Clear the BSS from its real start just upto the end of the variables.
1059 ; Here 'real start' means from where the BSS begins, which is below
1060 ; the point where the first variables are located. The part after
1061 ; the variables is not cleared because that is where the old SS:SP is
1062 ; stored, which is needed for AirBoot restarts during debugging.
1063 mov bx, offset sobss
1064 mov cx, offset EndOfVariables - offset sobss
1065 xor ax, ax
1066 call FillMemBlock
1067
1068; Initialize the com-port for debugging
1069IFDEF AUX_DEBUG
1070 PUSHRF
1071 ; Init com-port
1072 call AuxIO_Init
1073 ; Hello message
1074 mov si, offset [AuxIOHello]
1075 call AuxIO_Print
1076 ; Show Build Info
1077 call AuxIO_PrintBuildInfo
1078 call AuxIO_TeletypeNL
1079 POPRF
1080ENDIF
1081
1082; Dump debug information
1083IFDEF AUX_DEBUG
1084 IF 1
1085 call DEBUG_Dump1
1086 ENDIF
1087ENDIF
1088
1089; Verify we still got the BIOS disk in DL
1090IFDEF AUX_DEBUG
1091 IF 1
1092 DBG_TEXT_OUT_AUX '## AiR_BOOT_Start ##'
1093 PUSHRF
1094 call DEBUG_DumpRegisters
1095 POPRF
1096 ENDIF
1097ENDIF
1098
1099
1100; -----------------------------------------------------------------------------
1101; IBM-BM BOOT PREPARATION
1102; -----------------------------------------------------------------------------
1103 ;
1104 ; Since v1.0.8, AiR-BOOT is able to chainload IBM-BM.
1105 ; When IBM-BM resides above the 1024-cylinder limit, the 'I13X'
1106 ; signature is required at 3000:0000, FS needs to contain 3000h
1107 ; and the 32-bit LBA address needs to follow the 'I13X' signature.
1108 ; For booting IBM-BM from the second disk, a copy of the MBR of the
1109 ; first disk is also required at 0000:7E00.
1110 ; This information is derived from the eCS 2.x LVM MBR.
1111 ;
1112 ; So, now is a good time to copy the MBR of the first disk to
1113 ; 0000:7E00 in case the partition that will be started is IBM-BM.
1114 ; This copy is located at 8000:0000 and DS already points to this
1115 ; segment. The 'I13X' signature and FS will be setup later.
1116 ;
1117 pusha ; Save all the general purpose regs
1118 push es ; We need ES too, so save its value
1119 xor ax,ax ; Segment 0000h
1120 mov es,ax ; Make ES point to it
1121 mov si,offset BootBasePtr ; Start of AiR-BOOT which has the MBR
1122 mov di,7e00h ; Destination for the MBR for IBM-BM
1123 mov cx,100h ; 256 words = 512 bytes
1124 cld ; Direction from low to high
1125 rep movsw ; Copy the 256 words of the MBR
1126 pop es ; Restore previous value of ES
1127 popa ; Restore all the general purpose regs
1128
1129
1130; -----------------------------------------------------------------------------
1131; PRECRAP
1132; -----------------------------------------------------------------------------
1133
1134 ;
1135 ; First it clears the BSS area.
1136 ; Note that the old SS:SP is stored outside this area so this
1137 ; does not get lost.
1138 ; Then initialize various runtime variables and structures.
1139 ;
1140 ; BOOKMARK: Pre Crap
1141 call PRECRAP_Main
1142 ; Number of harddisks and other system-info is now known.
1143
1144;!
1145;! DEBUG_BLOCK
1146;! Let's see what the BIOS supplied us with...
1147;! Uncomment below to activate.
1148;!
1149IFDEF AUX_DEBUG
1150 IF 0
1151 pushf
1152 pusha
1153
1154 ; Print title.
1155 mov si,offset [bios_reg]
1156 call AuxIO_Print
1157 ; Save the current stack (SS:SP).
1158 mov ax,ss
1159 mov [CurrentSS],ax
1160 mov [CurrentSP],sp
1161
1162 ; Restore the old stack.
1163 mov ss,[OldSS]
1164 mov sp,[OldSP]
1165
1166 ; Pop the registers with the BIOS values.
1167 popa
1168 ; Push them back for AiR-BOOT restart (debug mode).
1169 pusha
1170 ; Dump them to the serial-port.
1171 call DEBUG_DumpRegisters
1172 ; Restore the current stack.
1173 mov ax,[CurrentSS]
1174 mov ss,ax
1175 mov sp,[CurrentSP]
1176
1177 popa
1178 popf
1179 ENDIF
1180ENDIF
1181
1182
1183
1184; -----------------------------------------------------------------------------
1185; UPDATE MBR
1186; -----------------------------------------------------------------------------
1187
1188 ; Write MBR back to disk to sync MBR variables.
1189 ; Otherwise subsequent MBR loads will differ from the RAM stored one,
1190 ; which is used by MBR protection to validate parts of the MBR.
1191 xor bx, bx ; 0000h - our load address (8000:0000)
1192 mov cx, 1 ; CHS sector 1, cylinder 0
1193 xor dh, dh ; CHS head 0
1194 mov dl, [BIOS_BootDisk] ; The disk we were loaded from
1195 mov al, 1 ; One sector to write
1196 mov ah, 03h ; BIOS write disk (legacy)
1197 int 13h ; Call BIOS
1198 sti ; Enable ints
1199 ;!
1200 ;! TODO: Check success
1201 ;! Yes, we should check for errors here, coz it would mean AirBoot
1202 ;! was loaded from a disk where the MBR cannot be written !
1203 ;!
1204
1205
1206
1207; -----------------------------------------------------------------------------
1208; SCAN DISKS
1209; -----------------------------------------------------------------------------
1210
1211;!
1212;! DEBUG_BLOCK
1213;! Dump the registers at this point.
1214;!
1215IFDEF AUX_DEBUG
1216 IF 0
1217 PUSHRF
1218 call DEBUG_DumpRegisters
1219 ;~ call DEBUG_DumpDriveLetters
1220 ;~ call DEBUG_DumpVolumeLetters
1221 ;~ call DEBUG_DumpPartitionXref
1222 POPRF
1223 ENDIF
1224ENDIF
1225
1226
1227 ;
1228 ; Scan disks for information like size etc.
1229 ;
1230 call DriveIO_ScanDisks
1231
1232;!
1233;! DEBUG_BLOCK
1234;! Dump the registers at this point.
1235;!
1236IFDEF AUX_DEBUG
1237 IF 0
1238 PUSHRF
1239 call DEBUG_DumpRegisters
1240 ;~ call DEBUG_DumpDriveLetters
1241 ;~ call DEBUG_DumpVolumeLetters
1242 ;~ call DEBUG_DumpPartitionXref
1243 POPRF
1244 ENDIF
1245ENDIF
1246
1247
1248; -----------------------------------------------------------------------------
1249; SCAN FOR PARTITIONS
1250; -----------------------------------------------------------------------------
1251
1252 ;
1253 ; Scan disks for partitions
1254 ;
1255 call PARTSCAN_ScanForPartitions
1256
1257 ;
1258 ; Internal Partition Table is now populated.
1259 ;
1260
1261;!
1262;! DEBUG_BLOCK
1263;! Dump various tables.
1264;!
1265IFDEF AUX_DEBUG
1266 IF 0
1267 PUSHRF
1268 ;~ call DEBUG_DumpIPT
1269 ;~ call DEBUG_DumpPartitionPointers
1270 ;~ call DEBUG_DumpNewPartTable
1271 ;~ call DEBUG_DumpDriveLetters
1272 ;~ call DEBUG_DumpDriveLetters
1273 ;~ call DEBUG_DumpVolumeLetters
1274 ;~ call DEBUG_DumpPartitionXref
1275 POPRF
1276 ENDIF
1277ENDIF
1278
1279
1280; -----------------------------------------------------------------------------
1281; RESTORE FORCED DRIVELETTER CORRELATION [LVM]
1282; -----------------------------------------------------------------------------
1283
1284 ;
1285 ; Reconnect forced drive-letters to their corresponding
1286 ; partitions.
1287 ;
1288 ; BOOKMARK: Update Driveletters so they are in-sync again
1289 call PARTSCAN_UpdateDriveLetters
1290 ; Driveletter <-> Partition correlation is now restored.
1291
1292
1293
1294;!
1295;! DEBUG_BLOCK
1296;! Dump various tables.
1297;!
1298IFDEF AUX_DEBUG
1299 IF 0
1300 PUSHRF
1301 ;~ call DEBUG_DumpIPT
1302 ;~ call DEBUG_DumpPartitionPointers
1303 ;~ call DEBUG_DumpNewPartTable
1304 ;~ call DEBUG_DumpDriveLetters
1305 ;~ call DEBUG_DumpDriveLetters
1306 ;~ call DEBUG_DumpVolumeLetters
1307 ;~ call DEBUG_DumpPartitionXref
1308 POPRF
1309 ENDIF
1310ENDIF
1311
1312
1313; -----------------------------------------------------------------------------
1314; SHOW WE ARE ALIVE
1315; -----------------------------------------------------------------------------
1316
1317 ;
1318 ; Put some info about AiR-BOOT and the system on the screen.
1319 ;
1320
1321 ; Display number of physical disks found
1322 IFNDEF AUX_DEBUG
1323 mov [TextPosY], 3
1324 ELSE
1325 mov [TextPosY], 4
1326 ENDIF
1327 mov [TextPosX], 0
1328 mov si, offset [DisksFound]
1329 call VideoIO_Print
1330 mov al, [TotalHarddiscs]
1331 mov [TextColorFore], 0fh
1332 call VideoIO_PrintByteDynamicNumber
1333 mov [TextColorFore], 07h
1334
1335 ; Display number of partitions found
1336 inc [TextPosY]
1337 mov [TextPosX], 0
1338 mov si, offset [PartitionsFound]
1339 call VideoIO_Print
1340 mov al, [CFG_Partitions]
1341 call VideoIO_PrintByteDynamicNumber
1342
1343 ; Display Phase 1 Indicator
1344 inc [TextPosY]
1345 mov [TextPosX], 0
1346 mov si, offset [Phase1]
1347 call VideoIO_Print
1348 mov si, offset [OS2_InstallVolume]
1349 mov al, [si]
1350 test al,al ; See if phase 1 is active
1351 jnz @F
1352 mov si, offset [No]
1353 @@:
1354 call VideoIO_Print
1355
1356 ; Display information about the disks found
1357 call VideoIO_DisplayDiskInfo
1358
1359
1360
1361; -----------------------------------------------------------------------------
1362; OS/2 PHASE1 CHECK
1363; -----------------------------------------------------------------------------
1364
1365 ;
1366 ; BOOKMARK: Check for OS/2 being installed
1367 ; Here we check if OS/2 is being installed.
1368 ; If so, we forgo the menu and directly boot it.
1369 ;
1370
1371 ; If the first byte of the name of the Install Volume is not 0
1372 ; then we potentially have a phase1 boot.
1373 test byte ptr [OS2_InstallVolume],0ffh
1374 ; Nope, so continue normally.
1375 jz MBR_Main_ContinueBoot
1376
1377 ; Setup phase1.
1378 ; It is still possible that a name was set for the
1379 ; Install Volume that does not exist.
1380 ; In that case CY will be clear and AL=0FFh.
1381 call PART_SetupPhase1
1382 ; Oops, Install Volume not found, continue normally.
1383 jnc MBR_Main_ContinueBoot
1384
1385
1386 ;
1387 ; == Install Volume Found ==
1388 ;
1389
1390
1391;!
1392;! DEBUG_BLOCK
1393;! Dump various tables.
1394;!
1395IFDEF AUX_DEBUG
1396 IF 0
1397 PUSHRF
1398 ;~ call DEBUG_DumpIPT
1399 ;~ call DEBUG_DumpPartitionPointers
1400 ;~ call DEBUG_DumpPartitionXref
1401 ;~ call DEBUG_DumpNewPartTable
1402 ;~ call DEBUG_DumpDriveLetters
1403 POPRF
1404 ENDIF
1405ENDIF
1406
1407
1408 ; BOOKMARK: Scan for Partitions (Only if OS/2 install going on)
1409 ; Because one or more partitions are possibly added, the
1410 ; PartitionXref table is not 'in sync' and could cause the
1411 ; wrong system to be automatically booted.
1412 ; So we rescan all partitions causing the PartitionXref
1413 ; table to be filled with correct values so the auto-boot
1414 ; from the new partition will work correctly.
1415 call PARTSCAN_ScanForPartitions
1416
1417
1418;!
1419;! DEBUG_BLOCK
1420;! Dump various tables.
1421;!
1422IFDEF AUX_DEBUG
1423 IF 0
1424 PUSHRF
1425 ;~ call DEBUG_DumpIPT
1426 ;~ call DEBUG_DumpPartitionPointers
1427 ;~ call DEBUG_DumpPartitionXref
1428 ;~ call DEBUG_DumpNewPartTable
1429 ;~ call DEBUG_DumpDriveLetters
1430 POPRF
1431 ENDIF
1432ENDIF
1433
1434 ; Setup automatic boot to forgo the Menu.
1435 ; PART_SetupPhase1 has filled in the other variables.
1436 mov byte ptr [CFG_AutomaticBoot],1
1437
1438 ;
1439 ; At this point the AiR-BOOT configuration has been altered
1440 ; to automatically boot the newly installed system without
1441 ; displaying the menu.
1442 ; Code further down the road will take care of that.
1443 ;
1444 jmp MBR_Main_ContinueBoot
1445
1446
1447
1448
1449 ;
1450 ; Wether a new system is being installed or not,
1451 ; booting continues here.
1452 ;
1453 MBR_Main_ContinueBoot:
1454
1455 ;
1456 ; Inform user how to switch between post-screen and menu
1457 ; by putting this info on the screen.
1458 ;
1459 mov [TextPosY], 23
1460 mov [TextPosX], 0
1461 mov si, offset [TABMessage]
1462 call VideoIO_Print
1463 inc [TextPosY]
1464 mov [TextPosX], 79 - sizeof [PREPMessage]
1465 call MBR_TeletypeSyncPos
1466 mov si, offset [PREPMessage]
1467 call MBR_TeletypeBold
1468 mov al,30
1469 call TIMER_WaitTicCount
1470 mov cl, sizeof [PREPMessage]
1471 mov al, ' '
1472 call VideoIO_PrintSingleMultiChar
1473
1474 mov [TextPosX], 25
1475 mov si, offset [BootEndMsg2]
1476 add si, 39
1477 mov [TextColorFore], 08h
1478 call VideoIO_Print
1479
1480
1481 ;
1482 ; Debug stop.
1483 ;
1484
1485 ;
1486 ; ####################### WAIT FOR KEY ########################
1487 ;
1488
1489 ; Wait for key so we can see debug log if ab-menu hangs.
1490 ;~ xor ax, ax
1491 ;~ int 16h
1492 ;call SOUND_Beep
1493
1494
1495 ; Copy BIOS POST to Second Page
1496 mov ax, VideoIO_Page1
1497 call VideoIO_BackUpTo
1498
1499 ;call SOUND_Beep
1500
1501
1502 ; BOOKMARK: Save Configuration
1503 ; Save configuration so phase1 boot-through is disabled
1504 ; on next boot.
1505 mov byte ptr [OS2_InstallVolume], 0
1506 call DriveIO_SaveConfiguration
1507
1508
1509
1510 ;
1511 ; See if setup needs to be entered.
1512 ;
1513 MBR_Main_ReEnterSetup:
1514 call SETUP_CheckEnterSETUP
1515
1516 ;
1517 ; Do some post processing.
1518 ;
1519 ; BOOKMARK: After Crap
1520 call AFTERCRAP_Main
1521
1522 MBR_Main_ReEnterBootMenuPre:
1523 ; SetUp PartitionPointers for BootMenu (filter non-bootable)
1524 call PART_CalculateMenuPartPointers
1525
1526 ; ...and count that one...
1527 cmp byte ptr [PartitionPointerCount], 0
1528 jne MBR_Main_SomethingBootAble
1529 mov si, offset TXT_NoBootAble
1530 call MBR_Teletype
1531 jmp MBR_HaltSystem
1532
1533 MBR_Main_SomethingBootAble:
1534 ; FixUp Values, define Timed Setup booting, etc.
1535 call PART_FixUpDefaultPartitionValues
1536
1537
1538
1539 ; -------------------------------------------------- BOOT-MENU
1540 MBR_Main_ReEnterBootMenu:
1541 call BOOTMENU_ResetMenuVars ; reset has to be done
1542 test byte ptr [CFG_AutomaticBoot], 1
1543 jz MBR_Main_NoAutomaticBooting
1544
1545
1546 ; ------------------------------------------ AUTOMATIC BOOTING
1547 ; Select automatic partition, disable automatic booting for
1548 ; next time and boot system...
1549 mov byte ptr [CFG_AutomaticBoot], 0
1550 call PASSWORD_AskSystemPwd
1551 mov al, Menu_EntryAutomatic
1552
1553 ;mov al, 2
1554
1555 mov Menu_EntrySelected, al ; zero based
1556 jmp MBR_Main_NoBootMenu
1557
1558
1559 MBR_Main_NoAutomaticBooting:
1560
1561 ;call SOUND_Beep
1562
1563 test byte ptr [CFG_BootMenuActive], 0FFh
1564 jnz MBR_Main_GotBootMenu
1565 ; ----------------------------------------------- NO BOOT-MENU
1566 ; Select default partition and boot system...
1567 call PASSWORD_AskSystemPwd
1568
1569 mov al, Menu_EntryDefault
1570 ;mov al,0 ; zero based
1571 mov Menu_EntrySelected, al
1572 jmp MBR_Main_NoBootMenu
1573
1574 MBR_Main_GotBootMenu:
1575 ; ------------------------------------------ BOOT-MENU VISUALS
1576
1577
1578 IFDEF FX_ENABLED
1579 call FX_StartScreen
1580 ENDIF
1581
1582 ; BOOKMARK: Build Main Menu
1583 call BOOTMENU_BuildBackground
1584 call BOOTMENU_BuildMain
1585
1586 IFDEF FX_ENABLED
1587 call FX_EndScreenRight
1588 ENDIF
1589
1590 call PASSWORD_AskSystemPwd
1591 call BOOTMENU_ResetTimedBoot
1592
1593 ; BOOKMARK: Display Main Menu
1594 call BOOTMENU_Execute
1595
1596 jc MBR_Main_ReEnterSetup
1597 call BOOTMENU_SetVarsAfterMenu
1598
1599 ; ---------------------------------------------------- BOOTING
1600 MBR_Main_NoBootMenu:
1601
1602 IFDEF FX_ENABLED
1603 call FX_StartScreen
1604 ENDIF
1605
1606IFDEF AUX_DEBUG
1607 IF 0
1608 DBG_TEXT_OUT_AUX 'HALTING'
1609 PUSHRF
1610 ;~ call DEBUG_DumpRegisters
1611 ;~ call AuxIO_DumpParagraph
1612 ;~ call AuxIO_TeletypeNL
1613 @@: jmp @B
1614 POPRF
1615 ENDIF
1616ENDIF
1617 ; BOOKMARK: Display bye-screen and start selected partition
1618 call BOOTMENU_BuildGoodBye
1619
1620 IFDEF FX_ENABLED
1621 call FX_EndScreenRight
1622 ENDIF
1623
1624 call PASSWORD_AskChangeBootPwd
1625
1626 call ANTIVIR_SaveBackUpMBR
1627
1628 ; Preload the selected menu-entry
1629 ; However, this value will be wrong if OS/2 phase1 is
1630 ; active and the installation partition is newly created.
1631 ; See below for the adjustment.
1632 mov dl, byte ptr [Menu_EntrySelected]
1633
1634
1635 ;
1636 ; Prepare to start the partition.
1637 ;
1638 jmp MBR_Main_StartPartition
1639
1640
1641
1642; -----------------------------------------------------------------------------
1643; START PARTITION
1644; -----------------------------------------------------------------------------
1645
1646 MBR_Main_StartPartition:
1647
1648IFDEF AUX_DEBUG
1649 IF 0
1650 PUSHRF
1651 ;~ call DEBUG_DumpIPT
1652 ;~ call DEBUG_DumpPartitionPointers
1653 ;~ call DEBUG_DumpPartitionXref
1654 ;~ call DEBUG_DumpNewPartTable
1655 POPRF
1656 ENDIF
1657ENDIF
1658
1659
1660 ; -------------------------------------------- START PARTITION
1661 ; THIS DOES NOT RETURN !
1662 call PART_StartPartition
1663
1664
1665
1666
1667;
1668; This entry-point restarts AiR-BOOT almost from scratch.
1669; It skips the movement of the MBR but otherwise it is a functional restart.
1670; The old BIOS SS:SP where the registers on entry are stored is passed along.
1671; This entry-point is used for debugging purposes.
1672;
1673; BOOKMARK: AiR-BOOT Restart (used for debugging)
1674AirbootRestart:
1675 mov bx, [OldSP] ; Old SP when BIOS transferred control to AB
1676 mov cx, [OldSS] ; Old SS when BIOS transferred control to AB
1677 xor dh, dh ; Head 0
1678 mov dl, [BIOS_BootDisk] ; Disk AirBoot was loaded from
1679 jmp MBR_RealStart
1680
1681
1682;
1683; This entry-point displays a popup that the system is halted
1684; and then halts the system.
1685; It is entered on severe error conditions.
1686;
1687; BOOKMARK: Halt System
1688HaltSystem:
1689 call VideoIO_ClearScreen
1690 mov ax,0ababh
1691 mov cx, 0C04h
1692 mov si, offset SystemHalted
1693 call SETUP_ShowErrorBox
1694 ; Halt the system.
1695 jmp MBR_HaltSystem
1696
1697
1698
1699
1700
1701
1702 ;
1703 ; The following section includes various assembler modules
1704 ; at the source level. These contain functionality for a
1705 ; multitude of categories like disk-access, video-io, lvm,
1706 ; debugging, etc. Later versions of AiR-BOOT will use such
1707 ; modules at the object-file level so they can be shared
1708 ; more easily.
1709 ;
1710
1711
1712; -----------------------------------------------------------------------------
1713; INCLUDED FILE SECTION
1714; -----------------------------------------------------------------------------
1715
1716; BOOKMARK: Include Section
1717
1718;
1719; Include other code-modules here.
1720;
1721
1722b_std_txt:
1723include regular/std_text.asm ; Standard (non-translateable text)
1724size_std_txt = $-b_std_txt
1725
1726b_driveio:
1727include regular/driveio.asm ; Drive I/O, Config Load/Save
1728size_driveio = $-b_driveio
1729
1730b_lvm:
1731include special/lvm.asm ; LVM-specific code
1732size_lvm = $-b_lvm
1733
1734b_videoio:
1735include regular/videoio.asm ; Video I/O
1736size_videoio = $-b_videoio
1737
1738b_timer:
1739include regular/timer.asm ; Timer
1740size_timer = $-b_timer
1741
1742b_partmain:
1743include regular/partmain.asm ; Regular Partition Routines
1744size_partmain = $-b_partmain
1745
1746b_partscan:
1747include regular/partscan.asm ; Partition Scanning
1748size_partscan = $-b_partscan
1749
1750b_bootmenu:
1751include regular/bootmenu.asm ; Boot-Menu
1752size_bootmenu = $-b_bootmenu
1753
1754b_password:
1755include regular/password.asm ; Password related
1756size_password = $-b_password
1757
1758b_other:
1759include regular/other.asm ; Other Routines
1760size_other = $-b_other
1761
1762b_main:
1763include setup/main.asm ; The whole AiR-BOOT SETUP
1764size_main = $-b_main
1765
1766b_math:
1767include regular/math.asm ; Math functions (like 32-bit multiply)
1768size_math = $-b_math
1769
1770b_txtother:
1771include_from text/%BLD_LANG,other.asm ; All translateable Text-Strings
1772size_txtother = $-b_txtother
1773
1774b_txtmenus:
1775include_from text/%BLD_LANG,menus.asm ; All translateable Menu-text
1776size_txtmenus = $-b_txtmenus
1777
1778b_charset:
1779include text/charset.asm ; Special Video Charsets (if needed)
1780size_charset = $-b_charset
1781
1782b_conv:
1783include regular/conv.asm ; Various conversion routines
1784size_conv = $-b_conv
1785
1786b_virus:
1787include special/virus.asm ; Virus Detection / Anti-Virus
1788size_virus = $-b_virus
1789
1790b_billsuxx:
1791include special/f00k/billsuxx.asm ; Extended Partition - Microsoft-Hack
1792size_billsuxx = $-b_billsuxx
1793
1794b_sound:
1795include special/sound.asm ; Sound
1796size_sound = $-b_sound
1797
1798b_apm:
1799include special/apm.asm ; Power Managment Support
1800size_apm = $-b_apm
1801
1802
1803
1804;
1805; Extended Charset support.
1806;
1807IFDEF TXT_LoadCharset
1808b_ccharset:
1809 include special/charset.asm ; Charset Support (RU and ES)
1810size_ccharset = $-b_ccharset
1811ENDIF
1812
1813; Various debugging routines, uses AUXIO and CONV
1814IFDEF AUX_DEBUG
1815b_debug:
1816include regular/debug.asm ; Debug module
1817size_debug = $-b_debug
1818b_auxio:
1819include regular/auxio.asm ; Com-port support for debugging
1820size_auxio = $-b_auxio
1821ENDIF
1822
1823;
1824; We only include this if FX_ENABLED is defined.
1825; FX is disabled when debugging to have more room for debug-code.
1826; The module compiles to 50eh = 1294 bytes, so that is a lot.
1827;
1828IFDEF FX_ENABLED
1829b_fx:
1830include special/fx.asm ; l33t Cooper-Bars/Scrolling <bg>
1831size_fx = $-b_fx
1832ENDIF
1833
1834
1835 ;
1836 ; End of code marker.
1837 ;
1838 ; BOOKMARK: END OF CODE
1839 db 'BABE'
1840 db 'FACE'
1841
1842
1843; -----------------------------------------------------------------------------
1844; END OF CODE
1845; -----------------------------------------------------------------------------
1846code_end:
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857; -----------------------------------------------------------------------------
1858; BLDLEVEL INFORMATION
1859; -----------------------------------------------------------------------------
1860
1861 ; BOOKMARK: BLDLEVEL Information
1862 ORIGIN 068A0h
1863
1864;
1865; The space between this offset and code_end is the space
1866; available for code.
1867;
1868zzz_code_space = $ - code_end
1869
1870
1871bld_level:
1872 ;
1873 ; Here we insert the OS/2 BLDLEVEL Information.
1874 ; It is composed of the AiR-BOOT version-info and other
1875 ; information. It is unique for each release of AiR-BOOT.
1876 ;
1877
1878 ;
1879 ; ?? When AUX_DEBUG is enabled and the above org is active,
1880 ; the BLDLEVEL gets corrupted eventhough it gets inserted here
1881 ; explicitly. The effect is almost like an 'OR' or a merge
1882 ; with the already generated FX code.
1883 ; Tasm and JWasm produce different results.
1884 ; ??
1885 ;
1886 InsertBuildLevel
1887
1888
1889
1890
1891
1892;==============================================================================
1893; Sector 53
1894;==============================================================================
1895
1896 ;
1897 ; From here on, the layout of the image consists of:
1898 ; - AiR-BOOT Protection Image
1899 ; - AiR-BOOT Configuration
1900 ; - DriveLetters
1901 ; - Install Volume
1902 ; - Floppy/CDROM/BIOS BOOT ENTRIES
1903 ; - Internal Partition Table (IPT)
1904 ; - Hidden Partition Table (HPT)
1905 ; - MBR Backup
1906 ;
1907
1908 ;
1909 ; After that, the BSS follows with several runtime
1910 ; variables and structures.
1911 ; The BSS is not part of the image on disk of course.
1912 ;
1913
1914; -----------------------------------------------------------------------------
1915; PROTECTION IMAGE
1916; -----------------------------------------------------------------------------
1917
1918 ;
1919 ; This is the AiR-BOOT MBR Protection Image.
1920 ; The stuff generated here gets overwritten when the
1921 ; MBR_PROT module, which is assembled separately,
1922 ; gets binary merged.
1923 ; So you won't find the string below in the generated binary.
1924 ;
1925 ; BOOKMARK: AiR-BOOT MBR Protection Image
1926 ORIGIN 06900h
1927
1928
1929
1930
1931;
1932; Hardcoded to 768 bytes (MBR_PROT.ASM)
1933; The string below is searched for by the FIXCODE helper and *must* be
1934; page (256 bytes) aligned.
1935;
1936; It seems to be possible to shrink the protection-image to 768 bytes.
1937; That gives us an additional 256 bytes of code-space.
1938; MBR-PROT.ASM,FIXCODE.C,PARTMAIN.ASM and AIR-BOOT.ASM need to be adjusted for that.
1939; Also the granularity needs to change from 512 bytes to 256 bytes since
1940; 6900h is not a 512-byte boundary.
1941;
1942; 20120908 - Done.
1943;
1944MBR_Protection db 'AiR-BOOT MBR-Protection Image'
1945
1946 ; Just fill.
1947 ;~ db 1024-($-MBR_Protection) dup('M')
1948 db 768-($-MBR_Protection) dup('M')
1949
1950
1951
1952
1953
1954
1955
1956;==============================================================================
1957; Sector 55
1958;==============================================================================
1959; -----------------------------------------------------------------------------
1960; AiR-BOOT CONFIGURATION
1961; -----------------------------------------------------------------------------
1962
1963 ;
1964 ; This section contains the AiR-BOOT configuration.
1965 ; Note that it has a version that should be updated
1966 ; when stuff is added.
1967 ; Also add stuff to the end so that offsets of other
1968 ; variables remain vaild.
1969 ;
1970 ; BOOKMARK: AiR-BOOT Configuration Sector
1971 ORIGIN 06C00h
1972
1973Configuration:
1974 ; This is the signature for the AiR-BOOT Configuration.
1975 ; Note that this configuration section, like the code section,
1976 ; is CRC protected. This means that poking values in these
1977 ; sections on the disk will invalidate AiR-BOOT and cause it
1978 ; to halt. This is a protection method against other software
1979 ; modifying stuff in track 0.
1980 db 'AiRCFG-TABLE',0adh
1981 db 01h, 10h, 'U' ; "Compressed" ID String
1982 ; Version 1.02 was for code 1.06, 1.03 was internal
1983 ; and 1.04,1.05 and 1.06 do not exist.
1984 ;
1985 ; 1.07 was used with AB v1.07 and introduced the phase1
1986 ; system-name. For the rest it is compatible with v1.02.
1987 ;
1988 ; 1.0.8 is introduced with AB v1.0.8 and indicates the movement
1989 ; of several components and the packing of the hideparttable.
1990 ; The core configuration has not changed but the generated
1991 ; configuration has. The v1.0.8 installer handles upgrading.
1992 ;
1993 ; It has been decided that uneven minor numbers will be
1994 ; test-versions. Therefore v1.0.8 has been bumbed to v1.1.0.
1995 ;
1996 ; It is not required for the config to have the
1997 ; same version as the code, so in the future
1998 ; the code version might be higher than the
1999 ; config version if there are no changes to the latter.
2000 ;
2001
2002CFG_LastTimeEditLow dw 0 ; Last Time Edited Stamp (will incr every setup)
2003CFG_LastTimeEditHi dw 0 ; second 16 bit part...
2004
2005CFG_CheckConfig dw 0 ; Check-Sum for Configuration
2006
2007CFG_Partitions db 0 ; Count of partitions in IPT
2008CFG_MiscFlags db 1 ; Miscellaneous Flags (See EQUates)
2009CFG_PartDefault db 0 ; Default-Partition (Base=0)
2010
2011CFG_PartLast db 0 ; Which Partition was booted last time ? (Base=0)
2012
2013; Do not enable time-out when debugging.
2014IFDEF AUX_DEBUG
2015CFG_TimedBoot db 0 ; Timed Boot Enable (for REAL Enable look TimedBootEnable)
2016ELSE
2017CFG_TimedBoot db 1 ; Timed Boot Enable (for REAL Enable look TimedBootEnable)
2018ENDIF
2019
2020CFG_TimedSecs db 15 ; Timed Boot - How Many Seconds Till Boot
2021CFG_TimedDelay dw 123 ; Timed Boot - Delay
2022CFG_TimedBootLast db 1 ; Timed Boot - Boot From Last Drive Booted From
2023CFG_RememberBoot db 1 ; Remember Manual Boot Choice
2024CFG_RememberTimed db 0 ; Remember if Timed Boot (if both disabled: Boot Default)
2025CFG_IncludeFloppy db 1 ; Include Floppy Drives in Boot-Menu
2026CFG_BootMenuActive db 1 ; Display Boot-Menu (if Disabled: Boot Default)
2027 ; v0.29+ -> 2 - Detailed Bootmenu
2028CFG_PartitionsDetect db 1 ; Autodetect New Partitions (Auto-Add!)
2029CFG_PasswordSetup db 0 ; Ask Password when entering Setup
2030CFG_PasswordSystem db 0 ; Ask Password when booting System
2031CFG_PasswordChangeBoot db 0 ; Ask Password when changing boot partition
2032CFG_ProtectMBR db 0 ; Protect MBR via TSR ?
2033CFG_IgnoreWriteToMBR db 0 ; Just ignore writes to MBR, otherwise crash
2034CFG_FloppyBootGetName db 0 ; Gets floppy name for display purposes
2035CFG_DetectVirus db 0 ; Detect Virus ?
2036CFG_DetectStealth db 0 ; Detect Stealth-Virus ?
2037CFG_DetectVIBR db 0 ; Detect BootRecord-Virus ?
2038CFG_AutoEnterSetup db 0 ; Automatic Enter Setup (first install!)
2039CFG_MasterPassword dw 0101Fh ; Encoded Password (this is just CR)
2040 dw 07A53h
2041 dw 0E797h
2042 dw 0A896h
2043CFG_BootPassword dw 0101Fh ; Another CR... ;-)
2044 dw 07A53h
2045 dw 0E797h
2046 dw 0A896h
2047 db 0 ; Rude-Protection - Removed since v0.28b
2048CFG_LinuxRootPartition db 0 ; Linux Root Partition (Base=0)
2049CFG_TimedKeyHandling db 0 ; Timed Key Handling (for Timed Boot)
2050 ; 0 - Do Nothing
2051 ; 1 - Reset Time
2052 ; 2 - Stop Time
2053CFG_MakeSound db 0 ; Should be clear ;)
2054CFG_FloppyBootGetTimer db 0 ; Floppy Name will get updated every 2 secs
2055CFG_ResumeBIOSbootSeq db 1 ; If BIOS Boot Sequence should be resumed
2056 ; 0 - Disabled
2057 ; 1 - CD-ROM
2058 ; 2 - Network
2059 ; 3 - ZIP/LS120
2060CFG_CooperBars db 0 ; If Cooper Bars should be shown
2061CFG_LinuxCommandLine db 75 dup (0) ; Linux Command Line
2062CFG_LinuxKrnlPartition db 0FFh ; FAT-16 Linux Kernel Partition (Base=0)
2063 ; FFh -> Disabled
2064CFG_LinuxDefaultKernel db 'DEFAULT', 4 dup (32), 0 ; Default Kernel Name
2065CFG_LinuxLastKernel db 11 dup (32), 0 ; Last-Booted Kernel Name
2066CFG_ExtPartitionMShack db 0 ; Extended Partition M$-Hack Global Enable
2067CFG_AutomaticBoot db 0 ; Automatic Booting (only one bootup)
2068CFG_PartAutomatic db 0 ; Partition-No for automatic booting
2069CFG_ForceLBAUsage db 1 ; LBA-BIOS-API forced on any HDD I/O
2070CFG_IgnoreLVM db 0 ; Ignores any LVM-Information
2071
2072
2073;
2074; THERE IS ROOM RESERVED HERE FOR MORE VARIABLES
2075;
2076
2077 ;
2078 ; Drive Letters.
2079 ;
2080 ; BOOKMARK: Stored Drive Letters
2081 ORIGIN 06CB0h
2082
2083
2084; -----------------------------------------------------------------------------
2085; DRIVE LETTERS
2086; -----------------------------------------------------------------------------
2087
2088;
2089; Moved here to make room for packed hiddenparttable.
2090; This gets filled with drive-letters that are assigned using the dl-feature.
2091;
2092DriveLetters db LocIPT_MaxPartitions dup (0)
2093 ; Format is:
2094 ;============
2095 ; Drive-Letter : BYTE (80h-C:, 81h-D:)
2096 ; --------------------> 1 Byte * 45
2097
2098
2099
2100; -----------------------------------------------------------------------------
2101; INSTALL VOLUME
2102; -----------------------------------------------------------------------------
2103
2104 ;
2105 ; Allways have the name of the installation volume
2106 ; at this offset.
2107 ; So future config changes will not break auto-install.
2108 ;
2109 ; BOOKMARK: Name of OS/2 Installation Volume
2110 ORIGIN 06D00h
2111
2112; SET(A)BOOT stores the volume name of the OS/2 system being installed here.
2113; It is truncated to 11 chars because AiR-BOOT currently does not support
2114; longer labelnames. The name is also capitalized.
2115OS2_InstallVolume db 0,'NOPHASEONE' ,0
2116
2117;
2118; THERE IS ROOM RESERVED HERE FOR MORE VARIABLES
2119;
2120
2121
2122; -----------------------------------------------------------------------------
2123; FLOPPY/CDROM/BIOS BOOT ENTRIES
2124; -----------------------------------------------------------------------------
2125
2126 ;
2127 ; 06DABh - 06C00h = 01ABh = 427 bytes.
2128 ; Entries allocated down from 06E00 boundary.
2129 ;
2130 ; BOOKMARK: Floppy/CD-ROM/BIOS Boot Entries
2131 ORIGIN 06DABh ; 427 Boundry
2132
2133; (432 - 5 = 427)
2134AutoDrvLetter db 0
2135AutoDrvLetterSerial dd 0
2136
2137; This entry is also 34 bytes long (466 - 34 = 432)
2138BIOScontIPTentry:
2139 db 0, 0, 0, 0, ' '
2140 db 0, 0FEh, Flags_Bootable
2141 dw 0 ; No Checksum :)
2142 db 0, 1, 0
2143 db 0, 1, 0 ; Location of Partition/Boot Record
2144 dd 0, 0
2145
2146; VIR variables are for the AiR-BOOT Anti Virus Code
2147; Most of them are backups of Interrupt Points, so we can check, if a
2148; stealth virus is on-line, we can intercept its call.
2149; Normal (non stealth) virus are trapped simply by rereading the MBR sector.
2150; If a virus is found, we will restore MBR from Sektor 60/62 and stop the
2151; system from working, so the user has to press reset.
2152; That's saver than a Reboot.
2153;
2154; If a virus is found on the partition to boot, the system will ONLY halt,
2155; nothing more, because we can not remove it. The user shall do it :)
2156; Those viruses are detected via a real nasty method...Checksum-Checking of the
2157; boot-record, which is to be executed. If it does not match the one in our
2158; internal partition table, we will stop. You may however switch this detection
2159; off or just reset it by switching 'VIBR Detection'.
2160
2161; 478 - 12 = 466 ; 466 Sub-Part
2162CFG_VIR_INT08 dd 0 ; pointer to saved 08h entry point
2163CFG_VIR_INT13 dd 0 ; pointer to saved 13h entry point
2164CFG_VIR_INT1C dd 0 ; pointer to saved 1Ch entry point
2165
2166; 478 Boundry (512-34)
2167; This entry is also 34 bytes long
2168FloppyIPTentry db 0, 0, 0, 0, 'FloppyDrive'
2169 db 0, 0FFh, Flags_Bootable
2170 dw 0 ; No Checksum :)
2171 db 0, 1, 0
2172 db 0, 1, 0 ; Location of Partition/Boot Record
2173 dd 0, 0
2174
2175
2176
2177; -----------------------------------------------------------------------------
2178; INTERNAL PARTITION TABLE (IPT)
2179; -----------------------------------------------------------------------------
2180
2181 ;
2182 ; AiR-BOOT Internal Partition Table (IPT)
2183 ;
2184 ; BOOKMARK: Internal Partition Table
2185 ORIGIN % (image_size - 0a00h - (image_size - image_size_60secs))
2186
2187
2188;
2189; Rousseau: This is the start of the AiR-BOOT IPT
2190;
2191PartitionTable db (LocIPT_MaxPartitions * LocIPT_LenOfIPT) dup (0)
2192; no-partitions detected... :]
2193; db 1, 0, 0, 0, 'Harddisc 1'
2194; db 0, 0FFh, Flags_BootAble
2195; dw 0 ; No Checksum :)
2196; db 0, 0, 1
2197; db 0, 0, 1 ; Location of Partition/Boot Record
2198; dd 0, 0
2199
2200 ; Format is:
2201 ;============
2202 ; SerialNumber * 4
2203 ; PartitionName * 11
2204 ; Drive * 1
2205 ; SystemID * 1 (means the partition type)
2206 ; Flags * 1
2207 ; Checksum * 2 (for virus checking)
2208 ; LocationBegin * 3 (where the partition begins)
2209 ; LocationPartTab * 3 (where the partition table is)
2210 ; AbsoluteBegin * 4 (where the partition begins, in absolute sectors)
2211 ; AbsolutePartTab * 4 (where the partition table is, in absolute sectors)
2212 ; --------------------> 34 Bytes (total maximum partition-entries = 30)
2213
2214
2215
2216 ; No need to check overlap here because this string will
2217 ; be overwritten if the maximum partition count is reached.
2218 ; So this is not a critical boundary.
2219 ORG (image_size - 600h - (image_size - image_size_60secs) / 2 - 10)
2220
2221 db 'AiRBOOTPAR' ; 1K internal partition table
2222
2223
2224
2225; -----------------------------------------------------------------------------
2226; HIDDEN PARTITION TABLE (HPT)
2227; -----------------------------------------------------------------------------
2228
2229 ;
2230 ; Hidden Partition Table (6-bit packed as of v1.0.8)
2231 ;
2232 ; BOOKMARK: Hidden Partition Table (packed)
2233 ORIGIN % (image_size - 600h - (image_size - image_size_60secs) / 2)
2234
2235HidePartitionTable db (LocIPT_MaxPartitions * LocHPT_LenOfHPT) dup (0FFh)
2236 ; Format is:
2237 ;============
2238 ; PartitionPtr : BYTE * 30
2239 ; --------------------> 30 Bytes * 45
2240
2241;
2242; Driveletters were here.
2243; Moved down to make room for packed hideparttable.
2244;
2245
2246
2247 ;
2248 ; End of hidden partition table.
2249 ; Check overlap here for security reasons.
2250 ;
2251 ORIGIN % (image_size - 200h - 5)
2252
2253; 79fa - end of packed hide table
2254 db 'ABHID' ; 1K internal Hide-partition table
2255
2256
2257
2258
2259;==============================================================================
2260; Sector 62
2261;==============================================================================
2262; -----------------------------------------------------------------------------
2263; MBR BACKUP
2264; -----------------------------------------------------------------------------
2265
2266 ;
2267 ; AiR-BOOT MBR Backup.
2268 ;
2269 ; BOOKMARK: MBR Backup
2270 ORIGIN % (image_size - 200h)
2271
2272
2273MBR_BackUpMBR db 'AiR-BOOT MBR-BackUp',\
2274 ' - Just to fill this sector with something',0
2275AirBootRocks db 'AiR-BOOT Rocks!',0
2276
2277 db (512 - ($-MBR_BackUpMBR) - 2) dup('M')
2278
2279 ; End of Image signature.
2280 ;
2281 ORIGIN % (image_size - 2)
2282 dw 0BABEh
2283
2284
2285 ;
2286 ; End of Image.
2287 ;
2288 ORIGIN % (image_size)
2289image_end:
2290
2291;
2292; Terminate LDRIMAGE segment.
2293;
2294IFDEF SEGMENTED
2295LDRIMAGE ENDS
2296ENDIF
2297
2298
2299
2300
2301
2302
2303
2304;##############################################################################
2305; BSS SEGMENT
2306;##############################################################################
2307
2308; BOOKMARK: BSS Segment
2309
2310;
2311; Open BSS segment.
2312;
2313IFDEF SEGMENTED
2314VOLATILE SEGMENT USE16 PUBLIC 'BSS'
2315ENDIF
2316
2317
2318
2319sobss:
2320sobss_abs = offset sobss + image_size
2321;------------------------------------------------------------------------------
2322
2323
2324 ;
2325 ; This is the actual start of the BSS.
2326 ; In the past however, we have had a code-loop that went out of bounds,
2327 ; overwriting the start of the BSS.
2328 ;
2329 ; Because important runtime data is stored in the BSS, we offset it
2330 ; by 400h bytes. Since the loader-image is always 62 sectors, which
2331 ; makes it 7c00h in size, the runtime data starts at 8000h.
2332 ; This is the 'BeginOfVariables' location.
2333 ;
2334
2335
2336;
2337; If segmented, offsets are relative to the BSS segment.
2338; They are resolved at link-time.
2339; If not segmented, offsets are relative to the CODE segment.
2340;
2341IFDEF SEGMENTED
2342 ORG 00400h ; 7c00h + 400h = 8000h
2343ELSE
2344 ORG 08000h ; 8000h
2345ENDIF
2346
2347
2348; -----------------------------------------------------------------------------
2349; START OF BSS DATA
2350; -----------------------------------------------------------------------------
2351; This space actually gets initialized in PreCrap to NUL (till EndOfVariables)
2352BeginOfVariables:
2353BeginOfVariablesAbs = offset BeginOfVariables + image_size
2354
2355
2356; -----------------------------------------------------------------------------
2357; SECTOR BUFFERS
2358; -----------------------------------------------------------------------------
2359; BOOKMARK: Sector Buffers
2360PartitionSector db 512 dup (?) ; Temporary Sector for Partition
2361PBRSector db 512 dup (?) ; Temporary Sector for JFS/HPFS writeback
2362LVMSector db 512 dup (?) ; Temporary Sector for LVM
2363TmpSector db 512 dup (?) ; Temporary Sector
2364Scratch db 512 dup (?) ; Scratch buffer
2365 ALIGN 16
2366
2367
2368; -----------------------------------------------------------------------------
2369; NEW PARTITION TABLE
2370; -----------------------------------------------------------------------------
2371; Everything used to build a new IPT and reference it to the old one
2372; BOOKMARK: New Partition Table
2373NewPartTable db 1536 dup (?) ; New Partition Table
2374 ALIGN 16
2375
2376
2377; -----------------------------------------------------------------------------
2378; NEW HIDE PARTITION TABLE
2379; -----------------------------------------------------------------------------
2380; BOOKMARK: New Hide-Partition Table
2381NewHidePartTable db LocIPT_MaxPartitions * LocHPT_LenOfHPT dup (?)
2382 ALIGN 16
2383
2384
2385; -----------------------------------------------------------------------------
2386; NEW DRIVE LETTERS
2387; -----------------------------------------------------------------------------
2388; BOOKMARK: Logical Drive-Letters
2389NewDriveLetters db LocIPT_MaxPartitions dup (?)
2390 ALIGN 16
2391
2392
2393; -----------------------------------------------------------------------------
2394; PARTITION SIZE TABLE
2395; -----------------------------------------------------------------------------
2396; Size-Table (6 bytes per partition)
2397; BOOKMARK: Partition Size Table
2398PartitionSizeTable db LocIPT_MaxPartitions * 6 dup (?)
2399 ALIGN 16
2400
2401
2402; -----------------------------------------------------------------------------
2403; PARTITION POINTERS
2404; -----------------------------------------------------------------------------
2405; Maximum is 52 word entries till now
2406; BOOKMARK: Partition Pointers
2407PartitionPointers dw 52 dup (?)
2408 ALIGN 16
2409
2410; Count of total Partition Pointers
2411PartitionPointerCount db ?
2412 ALIGN 16
2413
2414
2415; -----------------------------------------------------------------------------
2416; XREF TABLE
2417; -----------------------------------------------------------------------------
2418; X-Reference Table (holds new partnr, index is old part nr)
2419; BOOKMARK: Xref Table
2420PartitionXref db LocIPT_MaxPartitions dup (?)
2421 ALIGN 16
2422
2423
2424; -----------------------------------------------------------------------------
2425; VOLUME LETTERS
2426; -----------------------------------------------------------------------------
2427; Volume-Letters
2428; 0 - no LVM support
2429; 1 - LVM support, but no letter
2430; 'C'-'Z' - assigned drive letter
2431; BOOKMARK: Volume Drive Letters
2432PartitionVolumeLetters db LocIPT_MaxPartitions dup (?)
2433 ALIGN 16
2434
2435
2436; -----------------------------------------------------------------------------
2437; MISC VARS AND FLAGS
2438; -----------------------------------------------------------------------------
2439; BOOKMARK: Misc Vars and Flags
2440TotalHarddiscs db ? ; Total harddrives (by POST)
2441LBASwitchTable db 128 dup (?) ; Bit 25-18 for CHS/LBA Switching
2442NewPartitions db ? ; Freshly found partitions
2443 ; Independent of SaveConfiguration
2444TooManyPartitions db ? ; Non-zero if too many partitions found
2445
2446VideoIO_Segment dw ? ; Segment for Video I/O
2447
2448ExtendedAbsPos dd ? ; Extended Partition Absolute Position
2449ExtendedAbsPosSet db ? ; If Absolute Position set
2450
2451CurPartition_Location dw 4 dup (?) ; Where did current partition come from?
2452CurIO_UseExtension db ? ; 1-Use INT 13h EXTENSIONS
2453 ; (filled out by PreCrap)
2454CurIO_Scanning db ? ; 1-AiR-BOOT is scanning partitions
2455 ; (for detailed error message)
2456 ALIGN 16
2457
2458
2459; -----------------------------------------------------------------------------
2460; MENU RELATED VARS
2461; -----------------------------------------------------------------------------
2462Menu_EntrySelected db ? ; Which partition we boot this time...
2463Menu_UpperPart db ? ; Which number (Base=0) is the partition upper pos
2464Menu_AbsoluteX db ? ; Pos where Menu stuff starts
2465Menu_TotalParts db ? ; Copy of CFG_BootParts
2466Menu_TotalLines db ? ; Total Lines on Screen used for BootMenu
2467Menu_EntryDefault db ? ; Default Entry in filtered View
2468Menu_EntryLast db ? ; LastBooted Entry in filtered View
2469Menu_EntryAutomatic db ? ; Automatic Entry in filtered View
2470 ; - All adjusted to menu locations
2471 ALIGN 16
2472
2473
2474; -----------------------------------------------------------------------------
2475; PARTITION RELATED VARS
2476; -----------------------------------------------------------------------------
2477PartSetup_UpperPart db ? ; Partition-Setup (like Menu_UpperPart)
2478PartSetup_ActivePart db ? ; Active Partition
2479PartSetup_HiddenUpper db ? ; (like Menu_UpperPart)
2480PartSetup_HiddenX db ? ; Pos for Hidden-Setup
2481PartSetup_HiddenAdd db ? ; Adjust for Hidden-Setup
2482 ALIGN 16
2483
2484
2485; -----------------------------------------------------------------------------
2486; TIMER / SETUP RELATED VARS
2487; -----------------------------------------------------------------------------
2488TimedBootEnable db ? ; Local Enable/Disable for timed boot
2489TimedTimeOut dd ? ; TimeOut Timer for TimedBoot (too much time here;)
2490TimedSecondLeft db ? ; How many seconds are left till boom ?
2491TimedSecondBack db ? ; To get a modification noticed
2492TimedBootUsed db ? ; Timed Boot used for bootup ?
2493FloppyGetNameTimer dd ? ; Timer for Floppy-Get-Name
2494SETUP_KeysOnEntry db ? ; which Shift Status was there, when booting ?
2495SETUP_ExitEvent db ? ; Exit Event to end SETUP
2496TempPasswordEntry db 17 dup (?)
2497SETUP_OldPwd db 17 dup (?)
2498SETUP_NewPwd db 17 dup (?)
2499SETUP_VerifyPwd db 17 dup (?)
2500StartSoundPlayed db ?
2501ChangePartNameSave db ? ; Save label after user-edit ?
2502SyncLvmLabels db ? ; Sync LVM labels after user-edit ?
2503 ALIGN 16
2504
2505
2506; -----------------------------------------------------------------------------
2507; FX RELATED VARS
2508; -----------------------------------------------------------------------------
2509FX_UseCount dw ?
2510FX_OverallTimer dw ?
2511FX_WideScrollerTimer dw ?
2512FX_WideScrollerCurPos dw ?
2513FX_WideScrollerSpeed db ?
2514FX_WideScrollerSpeedState db ?
2515FX_WideScrollerDirection db ?
2516FX_WideScrollerAbsDirection db ?
2517FX_WideScrollerBounceSpeed db ?
2518FX_CooperBarsTimer dw ?
2519 ALIGN 16
2520
2521; Dynamically Generated Tables - do not need to get initialized with NUL
2522FX_CooperColors db 672 dup (?) ; 7 cooper bars*96 - runtime calculated
2523FX_CooperState db 7 dup (?)
2524FX_SinusPos db 7 dup (?)
2525FX_CooperPos dw 7 dup (?)
2526 ALIGN 16
2527
2528
2529; -----------------------------------------------------------------------------
2530; CHARSET BUFFER
2531; -----------------------------------------------------------------------------
2532CharsetTempBuffer db 4096 dup (?) ; Uninitialized Charset buffer
2533 ALIGN 16
2534
2535
2536; -----------------------------------------------------------------------------
2537; LVM CRC TABLE
2538; -----------------------------------------------------------------------------
2539LVM_CRCTable dd 256 dup (?) ; LVM-CRC (->SPECiAL\LVM.asm)
2540 ALIGN 16
2541
2542
2543; -----------------------------------------------------------------------------
2544; LVM DRIVE-LETTER MAP
2545; -----------------------------------------------------------------------------
2546; Get's initialized at startup to: 00000011111111111111111111111100b
2547; Meaning A,B not free; C-Z free, rest unused. (right to left)
2548; Each partition with an assigned drive-letter clears a bit in this map.
2549FreeDriveletterMap dd ?
2550 ALIGN 16
2551
2552
2553; -----------------------------------------------------------------------------
2554; OS/2 PHASE1 RELATED
2555; -----------------------------------------------------------------------------
2556Phase1Active db ?
2557OldPartitionCount db ?
2558 ALIGN 16
2559
2560
2561; -----------------------------------------------------------------------------
2562; ARRAY OF DISK INFORMATION STRUCTURES
2563; -----------------------------------------------------------------------------
2564; Array of DISKINFO structures
2565DiskInformation db MaxDisks dup(DISKINFO_Size dup(?))
2566 ALIGN 16
2567
2568
2569; -----------------------------------------------------------------------------
2570; INT13X DAP
2571; -----------------------------------------------------------------------------
2572; Disk Address Package that holds information for LBA-access using INT13X
2573INT13X_DAP db ? ; Size of paket, inserted by code
2574 db ? ; Reserved
2575INT13X_DAP_NumBlocks dw ? ; Number of blocks
2576INT13X_DAP_Transfer dd ? ; Transfer Adress
2577INT13X_DAP_Absolute dd ? ; Absolute Sector
2578 dd ? ; Second Part of QWORD
2579INT13X_DAP_Size = $-offset [INT13X_DAP] ; Calculated size
2580 ALIGN 16
2581
2582
2583; -----------------------------------------------------------------------------
2584; DEBUG
2585; -----------------------------------------------------------------------------
2586; Some debug area.
2587dbg_scratch db 512 dup(?)
2588 ALIGN 16
2589
2590
2591; End of transient variables.
2592EndOfVariables:
2593EndOfVariablesAbs = offset EndOfVariables + image_size
2594
2595
2596
2597; -----------------------------------------------------------------------------
2598; OLD AND NEW STACKS
2599; -----------------------------------------------------------------------------
2600; BOOKMARK: Storage for Old and New Stack Pointers
2601;
2602; These need to be outside the variable section because AiR-BOOT can restart
2603; itself in debug-mode. If the OldSP and OldSS would be in the variable area,
2604; they would be cleared on AiR-BOOT restart.
2605;
2606
2607; The variable section is cleared word-wise, so it could clear one byte extra
2608; depending on the alignment and size. This DD prevents the OldSP and OldSS
2609; to be partly overwritten by the clearing routine.
2610 dd ?
2611 ALIGN 16
2612
2613; SS:SP from before our relocation.
2614; The registers values when the BIOS transferred control to us were pushed
2615; on this stack.
2616
2617OldSP dw ?
2618OldSS dw ?
2619
2620; SS:SP currently in use.
2621; They are temporarily dumped here so we can pop the resgisters from
2622; the old stack to display them in debug mode.
2623CurrentSP dw ?
2624CurrentSS dw ?
2625 ALIGN 16
2626
2627; Usually, commits are buildable and some minor checking has been done that
2628; whole disks do not get wiped. However, there are situations where stuff is
2629; in such a flux that it would be better to do non-buildable commits.
2630; That makes it possible to record the changes piecemeal without the danger of
2631; accidently using the resulting loader. Of course everyone is clever enough
2632; to _never_ build commits marked as 'testing' and install the result in
2633; environments where wiping all attached disks and sticks would be a problem...
2634;~ force_build_error dd 0f000h dup(?)
2635
2636;
2637; End of BSS segment.
2638;
2639eobss:
2640eobss_abs = offset eobss + image_size
2641;
2642; Total RAM occupied, including BSS.
2643; BASE is 8000:0000, LIMIT is 8000:FFFF.
2644; Note that the LDRIMAGE is of constant size, 7C00h = 62 sectors of 512 bytes.
2645;
2646resident_size = offset eobss + image_size
2647
2648;
2649; Close BSS segment.
2650;
2651IFDEF SEGMENTED
2652 VOLATILE ENDS
2653ELSE
2654 LDRIMAGE ENDS
2655ENDIF
2656
2657 ; BOOKMARK: End of Module
2658 END AiR_BOOT
2659
Note: See TracBrowser for help on using the repository browser.