Revamp MBR
New features: - ES:DI (potential PnP structure) is preserved - FAT detection now works by checking for BPB values - Uses booterr procedure
This commit is contained in:
		
							parent
							
								
									bbfcd42f61
								
							
						
					
					
						commit
						abc7b563cd
					
				
					 1 changed files with 119 additions and 113 deletions
				
			
		
							
								
								
									
										136
									
								
								boot/mbr.asm
									
										
									
									
									
								
							
							
						
						
									
										136
									
								
								boot/mbr.asm
									
										
									
									
									
								
							|  | @ -1,51 +1,65 @@ | ||||||
| ; Memory layout: |  | ||||||
| %define self      0x00600 ; 1 sector |  | ||||||
| %define prog      0x07C00 ; 1 sector |  | ||||||
| 
 |  | ||||||
| ; FDC fields in VBR | ; FDC fields in VBR | ||||||
| %define spt       (prog + 0x18) | %define bps	(bs + 0x0B) | ||||||
| %define nos       (prog + 0x1A) | %define md	(bs + 0x15) | ||||||
| %define po        (prog + 0x1C) | %define spt	(bs + 0x18) | ||||||
|  | %define nos	(bs + 0x1A) | ||||||
|  | %define po	(bs + 0x1C) | ||||||
| 
 | 
 | ||||||
| org self | ; blah dont judge me, i miss 8080 | ||||||
| cpu 8086 | %macro retnz 0 | ||||||
|  | 	jz short ($+3) | ||||||
|  | 	ret | ||||||
|  | %endmacro | ||||||
|  | %macro callc 1 | ||||||
|  | 	jnc short ($+5) | ||||||
|  | 	call %1 | ||||||
|  | %endmacro | ||||||
| 
 | 
 | ||||||
| init: | 	cpu 8086 | ||||||
|   cli | 	org 0x0600 | ||||||
|  | bs:	equ 0x7C00 | ||||||
| 
 | 
 | ||||||
|   ; Stack grows down from PSP + 64k | init:	cli | ||||||
| 	xor ax, ax | 	xor ax, ax | ||||||
| 	mov ss, ax | 	mov ss, ax | ||||||
|   mov sp, ax | 	xor sp, sp | ||||||
| 
 | 
 | ||||||
|  | 	; save driver number | ||||||
| 	push dx | 	push dx | ||||||
| 
 | 
 | ||||||
|   ; Relocate from [prog] to [self] | 	; save PnP ptr | ||||||
|  | 	push es | ||||||
|  | 	push di | ||||||
|  | 
 | ||||||
|  | 	; Relocate away from bootsector loading area | ||||||
| 	mov ds, ax | 	mov ds, ax | ||||||
| 	mov es, ax | 	mov es, ax | ||||||
|   mov si, prog | 	mov si, bs | ||||||
|   mov di, self | 	mov di, $$ | ||||||
| 	mov cx, 0x100 | 	mov cx, 0x100 | ||||||
| 	rep movsw | 	rep movsw | ||||||
| 
 | 
 | ||||||
| 	jmp 0:main | 	jmp 0:main | ||||||
| 
 | 
 | ||||||
| main: | 	%include "inc/booterr.asm" | ||||||
|   mov bp, 0x3335 | 
 | ||||||
|   mov si, part1 | 	; find active partition or bail out | ||||||
|  | 	; result in si | ||||||
|  | findp:	mov si, part1 | ||||||
| 	mov cx, 4 | 	mov cx, 4 | ||||||
| .loop: | .loop:	test BYTE [si], 0x80 | ||||||
|   test BYTE [si], 0x80 | 	retnz | ||||||
|   jnz loadpart |  | ||||||
| 	add si, 0x10 | 	add si, 0x10 | ||||||
| 	loop .loop | 	loop .loop | ||||||
|   jmp error | 	call errcll | ||||||
|  | 
 | ||||||
|  | main:	; find active partition | ||||||
|  | 	call findp | ||||||
| 
 | 
 | ||||||
| loadpart: |  | ||||||
| 	; transfer starting address into DAP | 	; transfer starting address into DAP | ||||||
| 	push si | 	push si | ||||||
| 	add si, 0x08 | 	add si, 0x08 | ||||||
|   mov di, dap.blocknum | 	mov di, dap.num | ||||||
| 	movsw | 	movsw | ||||||
| 	movsw | 	movsw | ||||||
| 	pop si | 	pop si | ||||||
|  | @ -53,24 +67,30 @@ loadpart: | ||||||
| 	; load sector | 	; load sector | ||||||
| 	push si | 	push si | ||||||
| 	mov si, dap | 	mov si, dap | ||||||
|   mov bp, 0x3336 |  | ||||||
| 	mov ah, 0x42 | 	mov ah, 0x42 | ||||||
| 	stc | 	stc | ||||||
| 	int 0x13 | 	int 0x13 | ||||||
|   jc error | 	callc errcll | ||||||
| 	pop si | 	pop si | ||||||
| 
 | 
 | ||||||
|   cmp BYTE [si+4], 0x01 | 	; FAT bpb has "bytes per sector" at this place | ||||||
|   jne jump | 	; we support only 512 byte sectors anyways | ||||||
|  | 	cmp word [bps], 512 | ||||||
|  | 	jne chain | ||||||
| 
 | 
 | ||||||
| adjust: | 	; Media descriptor byte is never smaller than 0xF0 | ||||||
|   push dx | 	cmp byte [md], 0xF0 | ||||||
|  | 	jc chain | ||||||
| 
 | 
 | ||||||
|   mov bp, 0x3337 | 	; ask BIOS what our disk geometry is | ||||||
| 	mov ah, 0x08 | 	mov ah, 0x08 | ||||||
| 	stc | 	stc | ||||||
| 	int 0x13 | 	int 0x13 | ||||||
|   jc error | 	jc chain | ||||||
|  | 
 | ||||||
|  | 	; ES might be messed up from int 13h, fix it | ||||||
|  | 	push cs | ||||||
|  | 	pop es | ||||||
| 
 | 
 | ||||||
| 	; update sectors per track | 	; update sectors per track | ||||||
| 	xor ax, ax | 	xor ax, ax | ||||||
|  | @ -90,47 +110,33 @@ adjust: | ||||||
| 	movsw | 	movsw | ||||||
| 	pop si | 	pop si | ||||||
| 
 | 
 | ||||||
|  | chain:	; restore PnP structure | ||||||
|  | 	pop di | ||||||
|  | 	pop es | ||||||
| 	pop dx | 	pop dx | ||||||
| 
 | 	xor cx, cx | ||||||
| jump: | 	mov bp, si | ||||||
|   jmp 0:prog | 	; chain into partition boot sector | ||||||
| 
 | 	jmp 0:bs | ||||||
| error: |  | ||||||
|   mov ax, bp |  | ||||||
|   mov ah, 0x0e |  | ||||||
|   mov bx, 7 |  | ||||||
|   int 0x10 |  | ||||||
|   mov al, 0x21 |  | ||||||
|   int 0x10 |  | ||||||
|   xor ax, ax |  | ||||||
|   int 0x16 |  | ||||||
|   int 0x19 |  | ||||||
| 
 | 
 | ||||||
| dap: | dap: | ||||||
| .size: | .size:	db 0 | ||||||
| 	db 0 | 	db 0 | ||||||
|   db 0 | .count:	dw 1 | ||||||
| .count: | .buf:	dw bs | ||||||
|   dw 1 |  | ||||||
| .buffer: |  | ||||||
|   dw prog |  | ||||||
| 	dw 0 | 	dw 0 | ||||||
| .blocknum: | .num:	dq 0 | ||||||
|   dq 0 |  | ||||||
| 
 | 
 | ||||||
| times (0x1BE - ($-$$)) db 0 | 	times (0x1BE - ($-$$)) db 0 | ||||||
| part1: | 
 | ||||||
|   db 0x80 | part1:	db 0x80 | ||||||
| .chs_start: |  | ||||||
| 	db 0xFF, 0xFF, 0xFF | 	db 0xFF, 0xFF, 0xFF | ||||||
| .type: |  | ||||||
| 	db 0x01 | 	db 0x01 | ||||||
| .chs_end: |  | ||||||
| 	db 0xFF, 0xFF, 0xFF | 	db 0xFF, 0xFF, 0xFF | ||||||
| .begin: |  | ||||||
| 	dd 1 | 	dd 1 | ||||||
| .end: |  | ||||||
| 	dd (FLOPPY * 2) | 	dd (FLOPPY * 2) | ||||||
| 
 | 
 | ||||||
| times (0x1FE - ($-$$)) db 0 | 	times (0x1FE - ($-$$)) db 0 | ||||||
| dw 0xAA55 | 
 | ||||||
|  | 	; Boot signature | ||||||
|  | 	dw 0xAA55 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue