You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.6 KiB
114 lines
2.6 KiB
[bits 16] |
|
[org 0x0600] |
|
%define STAGE1_BASE 0x7c00 |
|
%define STAGE2_BASE 0x0600 |
|
|
|
%define STACK_POINTER_MAX 0x2000 |
|
|
|
%macro HALT 0 |
|
%%h: |
|
cli |
|
hlt |
|
jmp %%h |
|
%endmacro |
|
|
|
%macro CRLF 0 |
|
push ax |
|
mov ax, 0xe00|13 |
|
int 0x10 |
|
mov al, 10 |
|
int 0x10 |
|
pop ax |
|
%endmacro |
|
|
|
segment Stage1 vstart=STAGE1_BASE |
|
Stage1: |
|
; Setup segments |
|
cli |
|
xor ax, ax |
|
xor bx, bx |
|
xor cx, cx |
|
xor dx, dx |
|
xor si, si |
|
xor di, di |
|
times 32-($-$$) nop |
|
times 7 inc ax |
|
times 40 nop |
|
call PrintAxHex |
|
call PrintCRLF |
|
|
|
HALT |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
PrintAx: |
|
PrintAxHex: |
|
; Prints the contens of ax as a hexadecimal number |
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
pusha ; save registers |
|
mov dx, ax |
|
mov ah, 0xE ; Teletype output |
|
|
|
mov cx, 4 ; 4 nibbles in a 16 bit word |
|
.PrintLoop: |
|
rol dx, 4 ; rotate to next nibble |
|
mov al, dl ; we copy to al because we need to mask only the low 4 bits |
|
and al, 0xF ; Do the masking |
|
add al, '0' ; convert to ASCII |
|
|
|
; If we are greater than 9 ascii... |
|
cmp al, '9' |
|
jbe .SkipDiffToAsciiA |
|
add al, 'A'-('9'+1) ; ...add 7 to make digits 10 to 15 be represented as 'A' to 'F' |
|
.SkipDiffToAsciiA: |
|
|
|
int 0x10 ; BIOS call 'output' |
|
loop .PrintLoop |
|
|
|
popa ; restore registers |
|
ret |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
PrintAxDec: |
|
; Prints the contens of ax as a decimal number |
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
pusha |
|
|
|
mov bx, 10 ; Divisor |
|
|
|
xor cx, cx ; Digit count starts at 0 |
|
|
|
.LoopDivide: ; finds digits and pushes them to stack |
|
test ax, ax |
|
jz .BreakLoopDivide |
|
xor dx, dx |
|
div bx ; dx = (dx:ax)%bx, ax = (dx:ax)/bx |
|
push dx |
|
inc cx ; Increase digit count |
|
jmp .LoopDivide |
|
.BreakLoopDivide: |
|
|
|
.LoopPrint: |
|
pop ax |
|
add al, '0' ; Convert to ascii |
|
mov ah, 0xE |
|
int 0x10 |
|
loop .LoopPrint |
|
|
|
popa |
|
ret |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
PrintCRLF: |
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
pusha |
|
mov ah, 0xE |
|
mov al, 13 |
|
int 0x10 |
|
mov al, 10 |
|
int 0x10 |
|
popa |
|
ret |
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
times 510-($-$$) db 0 ; Zero-pad to boot signature |
|
db 0x55, 0xAA ; Boot signature |