source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Main.asm@ 237

Last change on this file since 237 was 233, checked in by gregli@…, 13 years ago

Serial Port: split single byte port and baud into two bytes, taking advantage of the two bytes in DPT_SERIAL, which supports more serial baud rates and in particular fixed a bug where a 4x client machine couldn't talk to a 115.2K server machine. This is a wide change, touching lots of files, but most are shallow changes. DetectPrint.asm took the most significant changes, now it calculates the baud rate to display instead of using characters provided by the Configurator. The Configurator now has a new menu flag, FLG_MENUITEM_CHOICESTRINGS, for specifying that values are not linear and they should be lookedup rather than indexed. Finally, another important bug fixed here is that in some error cases, the serial port code could get into an infinite loop waiting ont the hardware; now it has a timeout.

File size: 10.1 KB
RevLine 
[3]1; Project name : XTIDE Universal BIOS
[86]2; Authors : Tomi Tilli
3; : aitotat@gmail.com
4; :
[181]5; : Greg Lindhorst
6; : gregli@hotmail.com
7; ;
[86]8; : Krister Nordvall
9; : krille_n_@hotmail.com
10; :
[3]11; Description : Main file for BIOS. This is the only file that needs
12; to be compiled since other files are included to this
13; file (so no linker needed, Nasm does it all).
14
15ORG 000h ; Code start offset 0000h
16
[183]17%define MENUEVENT_INLINE_OFFSETS ; Only one menu required, save space and inline offsets
18
[181]19 ; Included .inc files
20 %include "AssemblyLibrary.inc" ; Assembly Library. Must be included first!
21 %include "IntController.inc" ; For Interrupt Controller equates
22 %include "ATA_ID.inc" ; For ATA Drive Information structs
23 %include "IdeRegisters.inc" ; For ATA Registers, flags and commands
24 %include "Int13h.inc" ; Equates for INT 13h functions
[176]25%ifdef MODULE_EBIOS
[181]26 %include "EBIOS.inc" ; Equates for EBIOS functions
[176]27%endif
[181]28 %include "CustomDPT.inc" ; For Disk Parameter Table
29 %include "RomVars.inc" ; For ROMVARS and IDEVARS structs
30 %include "RamVars.inc" ; For RAMVARS struct
31 %include "BootVars.inc" ; For BOOTVARS and BOOTNFO structs
32 %include "BootMenu.inc" ; For Boot Menu
33 %include "IDE_8bit.inc" ; For IDE 8-bit data port macros
34 %include "DeviceIDE.inc" ; For IDE device equates
[3]35
36
37; Section containing code
38SECTION .text
39
40; ROM variables (must start at offset 0)
41CNT_ROM_BLOCKS EQU 16 ; 16 * 512B = 8kB BIOS
42istruc ROMVARS
43 at ROMVARS.wRomSign, dw 0AA55h ; PC ROM signature
44 at ROMVARS.bRomSize, db CNT_ROM_BLOCKS ; ROM size in 512B blocks
[181]45 at ROMVARS.rgbJump, jmp Initialize_FromMainBiosRomSearch
[88]46 at ROMVARS.rgbSign, db "XTIDE120" ; Signature for flash program
[3]47 at ROMVARS.szTitle
48 db "-=XTIDE Universal BIOS"
49%ifdef USE_AT
[88]50 db " (AT)=-",NULL
[3]51%elifdef USE_186
[88]52 db " (XT+)=-",NULL
[3]53%else
[88]54 db " (XT)=-",NULL
[3]55%endif
[97]56 at ROMVARS.szVersion, db "v1.2.0_wip (",__DATE__,")",NULL
[3]57
[179]58;;; For OR'ing into wFlags below
[181]59;;;
[179]60%ifdef MODULE_SERIAL
[181]61 MAIN_FLG_MODULE_SERIAL equ FLG_ROMVARS_MODULE_SERIAL
[179]62%else
[181]63 MAIN_FLG_MODULE_SERIAL equ 0
[179]64%endif
65
66%ifdef MODULE_EBIOS
[181]67 MAIN_FLG_MODULE_EBIOS equ FLG_ROMVARS_MODULE_EBIOS
[179]68%else
[181]69 MAIN_FLG_MODULE_EBIOS equ 0
[179]70%endif
71
[3]72;---------------------------;
73; AT Build default settings ;
74;---------------------------;
75%ifdef USE_AT
[179]76 at ROMVARS.wFlags, dw FLG_ROMVARS_FULLMODE | FLG_ROMVARS_DRVXLAT | MAIN_FLG_MODULE_SERIAL | MAIN_FLG_MODULE_EBIOS
[143]77 at ROMVARS.wDisplayMode, dw DEFAULT_TEXT_MODE
[137]78 at ROMVARS.wBootTimeout, dw 30 * TICKS_PER_SECOND ; Boot Menu selection timeout
[150]79 at ROMVARS.bIdeCnt, db 4 ; Number of supported controllers
[3]80 at ROMVARS.bBootDrv, db 80h ; Boot Menu default drive
81 at ROMVARS.bMinFddCnt, db 0 ; Do not force minimum number of floppy drives
82 at ROMVARS.bStealSize, db 1 ; Steal 1kB from base memory
83
[199]84 at ROMVARS.ideVars0+IDEVARS.wPort, dw DEVICE_ATA_DEFAULT_PORT ; Controller Command Block base port
85 at ROMVARS.ideVars0+IDEVARS.wPortCtrl, dw DEVICE_ATA_DEFAULT_PORTCTRL ; Controller Control Block base port
[150]86 at ROMVARS.ideVars0+IDEVARS.bDevice, db DEVICE_16BIT_ATA
[160]87 at ROMVARS.ideVars0+IDEVARS.bIRQ, db 0
[3]88 at ROMVARS.ideVars0+IDEVARS.drvParamsMaster+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
89 at ROMVARS.ideVars0+IDEVARS.drvParamsSlave+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
90
91 at ROMVARS.ideVars1+IDEVARS.wPort, dw 170h ; Controller Command Block base port
92 at ROMVARS.ideVars1+IDEVARS.wPortCtrl, dw 370h ; Controller Control Block base port
[150]93 at ROMVARS.ideVars1+IDEVARS.bDevice, db DEVICE_16BIT_ATA
[160]94 at ROMVARS.ideVars1+IDEVARS.bIRQ, db 0
[3]95 at ROMVARS.ideVars1+IDEVARS.drvParamsMaster+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
96 at ROMVARS.ideVars1+IDEVARS.drvParamsSlave+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
97
[199]98 at ROMVARS.ideVars2+IDEVARS.wPort, dw DEVICE_XTIDE_DEFAULT_PORT ; Controller Command Block base port
99 at ROMVARS.ideVars2+IDEVARS.wPortCtrl, dw DEVICE_XTIDE_DEFAULT_PORTCTRL ; Controller Control Block base port
[150]100 at ROMVARS.ideVars2+IDEVARS.bDevice, db DEVICE_8BIT_DUAL_PORT_XTIDE
101 at ROMVARS.ideVars2+IDEVARS.bIRQ, db 0
[3]102 at ROMVARS.ideVars2+IDEVARS.drvParamsMaster+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
103 at ROMVARS.ideVars2+IDEVARS.drvParamsSlave+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
[143]104
105 at ROMVARS.ideVars3+IDEVARS.wPort, dw 168h ; Controller Command Block base port
106 at ROMVARS.ideVars3+IDEVARS.wPortCtrl, dw 368h ; Controller Control Block base port
[150]107 at ROMVARS.ideVars3+IDEVARS.bDevice, db DEVICE_16BIT_ATA
108 at ROMVARS.ideVars3+IDEVARS.bIRQ, db 0
[143]109 at ROMVARS.ideVars3+IDEVARS.drvParamsMaster+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
110 at ROMVARS.ideVars3+IDEVARS.drvParamsSlave+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
[175]111
112%ifdef MODULE_SERIAL
113 at ROMVARS.ideVarsSerialAuto+IDEVARS.bDevice, db DEVICE_SERIAL_PORT
[181]114%endif
[3]115%else
116;-----------------------------------;
117; XT and XT+ Build default settings ;
118;-----------------------------------;
[179]119 at ROMVARS.wFlags, dw FLG_ROMVARS_DRVXLAT | MAIN_FLG_MODULE_SERIAL | MAIN_FLG_MODULE_EBIOS
[143]120 at ROMVARS.wDisplayMode, dw DEFAULT_TEXT_MODE
[137]121 at ROMVARS.wBootTimeout, dw 30 * TICKS_PER_SECOND ; Boot Menu selection timeout
[3]122 at ROMVARS.bIdeCnt, db 1 ; Number of supported controllers
123 at ROMVARS.bBootDrv, db 80h ; Boot Menu default drive
124 at ROMVARS.bMinFddCnt, db 1 ; Assume at least 1 floppy drive present if autodetect fails
125 at ROMVARS.bStealSize, db 1 ; Steal 1kB from base memory in full mode
126
[199]127 at ROMVARS.ideVars0+IDEVARS.wPort, dw DEVICE_XTIDE_DEFAULT_PORT ; Controller Command Block base port
128 at ROMVARS.ideVars0+IDEVARS.wPortCtrl, dw DEVICE_XTIDE_DEFAULT_PORTCTRL ; Controller Control Block base port
[150]129 at ROMVARS.ideVars0+IDEVARS.bDevice, db DEVICE_8BIT_DUAL_PORT_XTIDE
[3]130 at ROMVARS.ideVars0+IDEVARS.bIRQ, db 0 ; IRQ
131 at ROMVARS.ideVars0+IDEVARS.drvParamsMaster+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
132 at ROMVARS.ideVars0+IDEVARS.drvParamsSlave+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
[143]133
134 at ROMVARS.ideVars1+IDEVARS.drvParamsMaster+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
135 at ROMVARS.ideVars1+IDEVARS.drvParamsSlave+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
136
137 at ROMVARS.ideVars2+IDEVARS.drvParamsMaster+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
138 at ROMVARS.ideVars2+IDEVARS.drvParamsSlave+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
139
140 at ROMVARS.ideVars3+IDEVARS.drvParamsMaster+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
141 at ROMVARS.ideVars3+IDEVARS.drvParamsSlave+DRVPARAMS.wFlags, db FLG_DRVPARAMS_BLOCKMODE
[175]142
143%ifdef MODULE_SERIAL
144 at ROMVARS.ideVarsSerialAuto+IDEVARS.bDevice, db DEVICE_SERIAL_PORT
[3]145%endif
[181]146%endif
[3]147iend
148
[181]149 ; Libraries and data
150 %include "AssemblyLibrary.asm"
[186]151%ifdef MODULE_STRINGS_COMPRESSED
152 %include "StringsCompressed.asm"
153%else
[181]154 %include "Strings.asm" ; For BIOS message strings
[186]155%endif
[3]156
[181]157 ; Initialization and drive detection
158 %include "Initialize.asm" ; For BIOS initialization
159 %include "Interrupts.asm" ; For Interrupt initialization
160 %include "RamVars.asm" ; For RAMVARS initialization and access
161 %include "CreateDPT.asm" ; For creating DPTs
162 %include "FindDPT.asm" ; For finding DPTs
163 %include "AccessDPT.asm" ; For accessing DPTs
164 %include "BootInfo.asm" ; For creating BOOTNFO structs
165 %include "AtaID.asm" ; For ATA Identify Device information
166 %include "DetectDrives.asm" ; For detecting IDE drives
167 %include "DetectPrint.asm" ; For printing drive detection strings
[192]168
[181]169 ; Boot menu
170 %include "BootMenu.asm" ; For Boot Menu operations
171 %include "BootMenuEvent.asm" ; For menu library event handling
[192]172 ; NOTE: BootMenuPrint needs to come immediately after BootMenuEvent
173 %include "BootMenuPrint.asm" ; For printing Boot Menu strings
174 %include "BootPrint.asm" ; For printing boot information
175 %include "BootMenuPrintCfg.asm" ; For printing hard disk configuration
[181]176 %include "FloppyDrive.asm" ; Floppy Drive related functions
177 %include "BootSector.asm" ; For loading boot sector
[3]178
[181]179 ; Boot loader
180 %include "Int19hMenu.asm" ; For Int 19h, Boot Loader for Boot Menu
[3]181
[181]182 ; For all device types
[192]183 %include "Idepack.asm"
[181]184 %include "Device.asm"
185 %include "Timer.asm" ; For timeout and delay
[155]186
[181]187 ; IDE Device support
188 %include "IdeCommand.asm"
189 %include "IdeTransfer.asm" ; Must be included after IdeCommand.asm
[192]190 %include "IdeWait.asm"
191 %include "IdeError.asm" ; Must be included after IdeWait.asm
[181]192 %include "IdeDPT.asm"
193 %include "IdeIO.asm"
194 %include "IdeIrq.asm"
[155]195
[181]196%ifdef MODULE_SERIAL ; Serial Port Device support
197 %include "SerialCommand.asm"
198 %include "SerialDPT.asm"
[175]199%endif
[155]200
[181]201 ; INT 13h Hard Disk BIOS functions
202 %include "Int13h.asm" ; For Int 13h, Disk functions
203 %include "AH0h_HReset.asm" ; Required by Int13h_Jump.asm
204 %include "AH1h_HStatus.asm" ; Required by Int13h_Jump.asm
205 %include "AH2h_HRead.asm" ; Required by Int13h_Jump.asm
206 %include "AH3h_HWrite.asm" ; Required by Int13h_Jump.asm
207 %include "AH4h_HVerify.asm" ; Required by Int13h_Jump.asm
208 %include "AH8h_HParams.asm" ; Required by Int13h_Jump.asm
209 %include "AH9h_HInit.asm" ; Required by Int13h_Jump.asm
210 %include "AHCh_HSeek.asm" ; Required by Int13h_Jump.asm
211 %include "AHDh_HReset.asm" ; Required by Int13h_Jump.asm
212 %include "AH10h_HReady.asm" ; Required by Int13h_Jump.asm
213 %include "AH11h_HRecal.asm" ; Required by Int13h_Jump.asm
214 %include "AH15h_HSize.asm" ; Required by Int13h_Jump.asm
215 %include "AH23h_HFeatures.asm" ; Required by Int13h_Jump.asm
216 %include "AH24h_HSetBlocks.asm" ; Required by Int13h_Jump.asm
217 %include "AH25h_HDrvID.asm" ; Required by Int13h_Jump.asm
[221]218 %include "DriveXlate.asm" ; For swapping drive numbers
219 %include "Address.asm" ; For sector address translations
220 %include "Prepare.asm" ; For buffer pointer normalization
[176]221%ifdef MODULE_EBIOS
[181]222 %include "AH42h_ExtendedReadSectors.asm"
223 %include "AH43h_ExtendedWriteSectors.asm"
224 %include "AH44h_ExtendedVerifySectors.asm"
225 %include "AH47h_ExtendedSeek.asm"
226 %include "AH48h_GetExtendedDriveParameters.asm"
[221]227 %include "AH41h_CheckIfExtensionsPresent.asm"
[176]228%endif
[3]229
230
231; Fill with zeroes until size is what we want
[88]232;times (CNT_ROM_BLOCKS*512)-($-$$) db 0
Note: See TracBrowser for help on using the repository browser.