source: trunk/bootcode/airboot.asm@ 72

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

Temporarily disable checksum verification for code [v1.1.1-testing]

In the development enviroment, we use VirtualBox with VMDK images.
To quickly test modifications, the AirBoot loader image is merged into
the VMDK image ouside of the VM. Because the 'airboot2.exe' installer
is not used, no checksum is embedded, so we temporarily disable
checksumming for the code section here.

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