source: trunk/bootcode/airboot.asm@ 123

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

Updated all debug hooks to use the new macros [v1.1.1-testing]

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