Submit #2864 ยป 0001-some-refactoring-for-boot0.patch
| sys/boot/pc32/boot0/boot0.S | ||
|---|---|---|
|
.set _FAKE,0x0 # Fake partition entry
|
||
|
.set _MNUOPT,0xc # Menu options
|
||
|
.set _SECTOR_FIELD_OFF,-0xe # Offset to Sector field
|
||
|
# in the fake partition
|
||
|
.set _DATA_OFF,PRT_OFF+_SECTOR_FIELD_OFF # Offset to boot0 variables
|
||
|
# from partition table
|
||
|
.globl start # Entry point
|
||
|
.code16 # This runs in real mode
|
||
| ... | ... | |
|
movw $MEM_BIOS_LADDR,%sp # stack
|
||
|
|
||
|
/*
|
||
|
* Copy this code to the address it was linked for
|
||
|
* Copy this code to the address it was linked for.
|
||
|
* Base address after relocation is - 0x600.
|
||
|
*/
|
||
|
movw %sp,%si # Source
|
||
|
movw $start,%di # Destination
|
||
| ... | ... | |
|
stosw # them
|
||
|
/*
|
||
|
* Relocate to the new copy of the code. Do not make
|
||
|
* assumptions with regard to a relative-PC near jump
|
||
|
* capability.
|
||
|
* Set C:H:S to 0:0:1 and relocate to the new copy of
|
||
|
* the code. Do not make assumptions with regard to
|
||
|
* a relative-PC near jump capability.
|
||
|
*/
|
||
|
incb -0xe(%di) # Sector number
|
||
|
incb _SECTOR_FIELD_OFF(%di) # Sector number
|
||
|
pushw $main # Jump to relocated code
|
||
|
retw
|
||
| ... | ... | |
|
* that the table starts 2 bytes earlier than you would
|
||
|
* expect as the bootable flag is after it in the block)
|
||
|
*/
|
||
|
movw $(partbl+0x4),%bx # Partition table (+4)
|
||
|
xorw %dx,%dx # Item number
|
||
|
movw $(partbl+0x4),%bx # Partition table (+4 - type)
|
||
|
xorw %dx,%dx # Partition entry item number
|
||
|
/*
|
||
|
* Loop around on the partition table, printing values until
|
||
|
* we pass a 256 byte boundary. The end of loop test is at
|
||
|
* we pass a 256 (4x 64 byte partitions) byte boundary. The
|
||
|
* end of loop test is at
|
||
|
* main.5.
|
||
|
*/
|
||
|
main.3: movb %ch,-0x4(%bx) # Zero active flag (ch == 0)
|
||
| ... | ... | |
|
movw $start,%bx # Data to write
|
||
|
movb $0x3,%ah # Write sector
|
||
|
callw intx13 # to disk
|
||
|
main.14: popw %si # Restore
|
||
|
popf # Restore
|
||
|
main.14: popw %si # Restore partition
|
||
|
popf # Restore eflags
|
||
|
/*
|
||
|
* If going to next drive, replace drive with selected one.
|
||
| ... | ... | |
|
putchr:
|
||
|
movb $0x01,%ah # BIOS: Send
|
||
|
bioscom:
|
||
|
pusha # Save
|
||
|
pusha # Save (preserve driver number)
|
||
|
xorw %dx,%dx # Use COM1
|
||
|
int $0x14 # Character
|
||
|
popa # Restore
|
||
|
popa # Restore (restore driver number)
|
||
|
retw # To caller
|
||
|
#endif
|
||
|
|
||
| ... | ... | |
|
os_dfbsd: .ascii "DF/F"
|
||
|
os_bsd: .ascii "BS"; .byte 'D'|0x80
|
||
|
.org PRT_OFF-0xe,0x90
|
||
|
.org _DATA_OFF,0x90
|
||
|
.word B0MAGIC # Magic number
|
||
| sys/boot/pc32/bootasm.h | ||
|---|---|---|
|
#define BDA_SCR 0x449 /* Video mode */
|
||
|
#define BDA_POS 0x450 /* Cursor position */
|
||
|
#define BDA_BOOT 0x472 /* Boot howto flag */
|
||
|
#define BDA_NHRDRV 0x475
|
||
|
#define BDA_NHRDRV 0x475 /* Number of drivers found by BIOS */
|
||
|
#define BDA_KEYBOARD 0x496 /* BDA byte with keyboard bit */
|
||
|
/*
|
||