source: trunk/bootcode/airboot.asm@ 131

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

Removed BSS storage for INT13(X) info [v1.1.1-testing]

While this storage was introduced just a few commits ago,
the INT13(X) info is now part of the DISKINFO structure.

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