X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=bootcensus;a=blobdiff_plain;f=src%2Fboot%2Fboot.s;h=ac4a424c5ce713814642489e4ccd10152c7cc682;hp=499c38637e7936b7391df7cea937a9ed24ade657;hb=07db0aabb3ad8dbb0a3cee2d3837dd93792ae825;hpb=ced643ce94dafd3d31e121435a40a967993e2be5 diff --git a/src/boot/boot.s b/src/boot/boot.s index 499c386..ac4a424 100644 --- a/src/boot/boot.s +++ b/src/boot/boot.s @@ -3,10 +3,10 @@ cli cld - # move stack to the top of 512k - mov $0x7000, %ax + # move stack to just below the code + xor %ax, %ax mov %ax, %ss - xor %sp, %sp + mov $0x7c00, %sp # use the code segment for data access mov %cs, %ax mov %ax, %ds @@ -25,7 +25,7 @@ shr $9, %eax and $0x1ff, %ebx jz 0f - inc %eax + inc %ax 0: pushw %ax pushw $1 # set es to the start of the destination buffer to allow reading in @@ -34,7 +34,7 @@ shr $4, %bx mov %bx, %es xor %bx, %bx - call read_sect + call read_sectors jmp boot2_addr cli @@ -45,31 +45,39 @@ .set ARG_NSECT, 6 .set ARG_SIDX, 4 -# read_sect(first, num) -read_sect: +# read_sectors(first, num) +read_sectors: push %bp mov %sp, %bp mov ARG_SIDX(%bp), %ax - mov ARG_NSECT(%bp), %cx + xor %cx, %cx jmp 1f 0: push %ax call read_sector - add $2, %sp + pop %ax + inc %ax + inc %cx 1: cmp ARG_NSECT(%bp), %cx jnz 0b pop %bp ret + .set VAR_ATTEMPTS, -2 + # read_sector(sidx) read_sector: push %bp mov %sp, %bp + sub $2, %sp push %cx push %dx + movw $3, VAR_ATTEMPTS(%bp) + +.Lread_try: # calculate the track (sidx / sectors_per_track) mov 4(%bp), %ax xor %dx, %dx @@ -92,7 +100,22 @@ read_sector: mov $0x0201, %ax movb drive_number, %dl int $0x13 + jnc .Lread_ok + + # abort after 3 attempts + decw VAR_ATTEMPTS(%bp) + jz .Lread_fail + + # error detected, reset controller and retry + xor %ah, %ah + int $0x13 + jmp .Lread_try +.Lread_fail: + mov 4(%bp), %ax + jmp abort_read + +.Lread_ok: # increment es:bx accordingly (advance es if bx overflows) add $512, %bx jno 0f @@ -100,11 +123,26 @@ read_sector: add $4096, %ax mov %ax, %es - pop %dx +0: pop %dx pop %cx + add $2, %sp pop %bp ret +str_read_error: .asciz "Failed to read sector: " + +abort_read: + push %ax + mov $str_read_error, %si + call print_str + + xor %eax, %eax + pop %ax + call print_num + + cli + hlt + clearscr: push %es pushw $0xb800 @@ -116,6 +154,28 @@ clearscr: pop %es ret +cursor_x: .byte 0 + +# expects string pointer in ds:si +print_str: + push %es + pushw $0xb800 + pop %es + xor %di, %di + movb $0, cursor_x + +0: mov (%si), %al + mov %al, %es:(%di) + movb $7, %es:1(%di) + inc %si + add $2, %di + incb cursor_x + cmp $0, %al + jnz 0b + + pop %es + ret + # expects number in eax print_num: # save es @@ -137,7 +197,10 @@ print_num: # print the backwards string pushw $0xb800 pop %es - xor %di, %di + movb cursor_x, %al + xor %ah, %ah + shl $1, %ax + mov %ax, %di 0: dec %si mov (%si), %al