add documentation
This commit is contained in:
parent
a8a7a3d3d1
commit
3ca4ce76f0
1 changed files with 150 additions and 131 deletions
281
messages.asm
281
messages.asm
|
@ -1,9 +1,11 @@
|
|||
org 0x7C00
|
||||
bits 16
|
||||
org 0x7C00 ; The boot code on a drive always gets loaded at address 0x7C00
|
||||
bits 16 ; .bin defaults to 16 bits
|
||||
|
||||
WIDTH equ 0x50
|
||||
HEIGHT equ 0x18
|
||||
VIDEO_MODE equ 0x3
|
||||
;; FIXME: possible problem with HEIGHT being defined
|
||||
;; as one less than what VIDEO_MODE implies?
|
||||
WIDTH equ 0x50 ; 60
|
||||
HEIGHT equ 0x18 ; 24 (?)
|
||||
VIDEO_MODE equ 0x3 ; 80x25 screen, text mode
|
||||
|
||||
;; see http://www.ctyme.com/intr/int-10.htm for interrupts
|
||||
|
||||
|
@ -13,173 +15,190 @@ mov ax, VIDEO_MODE
|
|||
int 10h
|
||||
|
||||
;; Clear screen
|
||||
mov ah, 0x06
|
||||
mov al, 0x00
|
||||
mov bh, 0x0F
|
||||
mov cx, 0x0000
|
||||
mov dh, HEIGHT
|
||||
mov dl, WIDTH
|
||||
mov ah, 0x06 ; scroll screen up
|
||||
mov al, 0x00 ; lines to scroll (0 = clear)
|
||||
mov bh, 0x0F ; bg/fg colour
|
||||
mov cx, 0x0000 ; upper row number, left col number (both 0)
|
||||
mov dh, HEIGHT ; lower row number (24)
|
||||
mov dl, WIDTH ; right col number (80)
|
||||
int 0x10
|
||||
|
||||
;; Set cursor to bottom of screen
|
||||
mov dh, HEIGHT
|
||||
mov dl, 0x00
|
||||
mov bh, 0x00
|
||||
mov ah, 0x02
|
||||
mov ah, 0x02 ; set cursor position
|
||||
mov bh, 0x00 ; page number
|
||||
mov dh, HEIGHT ; row (bottommost row)
|
||||
mov dl, 0x00 ; col (leftmost col)
|
||||
int 0x10
|
||||
mov sp, 0x2000
|
||||
|
||||
mov sp, 0x2000 ; initialise stack pointer
|
||||
|
||||
.loop:
|
||||
;; Read character
|
||||
mov ah, 0x00
|
||||
int 0x16
|
||||
mov ah, 0x00 ; Read character
|
||||
int 0x16
|
||||
|
||||
cmp al, 0x0d ; newline
|
||||
je .newline
|
||||
cmp al, 0x08 ; delete character
|
||||
je .change_color_mode
|
||||
cmp al, 0x1b ; escape character
|
||||
je .beep
|
||||
jmp .nonewline
|
||||
cmp al, 0x0d ; newline
|
||||
je .newline
|
||||
|
||||
cmp al, 0x08 ; delete character
|
||||
je .change_color_mode
|
||||
|
||||
cmp al, 0x1b ; escape character
|
||||
je .beep
|
||||
|
||||
jmp .nonewline
|
||||
|
||||
.change_color_mode:
|
||||
call .readbyte
|
||||
mov [color_mode], al
|
||||
jmp .loop
|
||||
call .readbyte
|
||||
mov [color_mode], al
|
||||
jmp .loop
|
||||
|
||||
.newline:
|
||||
;; Scroll up window
|
||||
mov ah, 0x06
|
||||
mov al, 0x01
|
||||
mov bh, 0x0F
|
||||
mov cx, 0x0000
|
||||
mov dh, HEIGHT
|
||||
mov dl, WIDTH
|
||||
int 0x10
|
||||
;; Scroll up window
|
||||
mov ah, 0x06
|
||||
mov al, 0x01
|
||||
mov bh, 0x0F
|
||||
mov cx, 0x0000
|
||||
mov dh, HEIGHT
|
||||
mov dl, WIDTH
|
||||
int 0x10
|
||||
|
||||
;; Get current cursor position
|
||||
mov bh, 0x00
|
||||
mov ah, 0x03
|
||||
int 0x10
|
||||
;; Get current cursor position
|
||||
mov bh, 0x00
|
||||
mov ah, 0x03
|
||||
int 0x10
|
||||
|
||||
;; Move cursor to beginning of screen
|
||||
mov dl, 0x00
|
||||
mov ah, 0x02
|
||||
int 0x10
|
||||
;; Move cursor to beginning of screen
|
||||
mov dl, 0x00
|
||||
mov ah, 0x02
|
||||
int 0x10
|
||||
|
||||
jmp .loop
|
||||
jmp .loop
|
||||
|
||||
.beep:
|
||||
call .readduration
|
||||
mov ah, 0
|
||||
push ax
|
||||
mov al, 182 ; Prepare the speaker for the
|
||||
out 43h, al ; note.
|
||||
call .readbyte
|
||||
mov ah, 0
|
||||
sal ax, 5 ; multiply by 32
|
||||
add ax, 1140
|
||||
out 42h, al ; Output low byte.
|
||||
mov al, ah ; Output high byte.
|
||||
out 42h, al
|
||||
in al, 61h ; Turn on note (get value from
|
||||
; port 61h).
|
||||
or al, 00000011b ; Set bits 1 and 0.
|
||||
out 61h, al ; Send new value.
|
||||
;; mov bx, 50000 ; Pause for duration of note.
|
||||
pop bx
|
||||
push ax
|
||||
mov ax, 3125
|
||||
mul bx
|
||||
mov bx, ax
|
||||
pop ax
|
||||
call .readduration
|
||||
mov ah, 0
|
||||
push ax
|
||||
mov al, 182 ; Prepare the speaker for the
|
||||
out 43h, al ; note.
|
||||
call .readbyte
|
||||
mov ah, 0
|
||||
sal ax, 5 ; multiply by 32
|
||||
add ax, 1140
|
||||
out 42h, al ; Output low byte.
|
||||
mov al, ah ; Output high byte.
|
||||
out 42h, al
|
||||
in al, 61h ; Turn on note (get value from
|
||||
; port 61h).
|
||||
or al, 00000011b ; Set bits 1 and 0.
|
||||
out 61h, al ; Send new value.
|
||||
;; mov bx, 50000 ; Pause for duration of note.
|
||||
pop bx
|
||||
push ax
|
||||
mov ax, 3125
|
||||
mul bx
|
||||
mov bx, ax
|
||||
pop ax
|
||||
|
||||
.pause1:
|
||||
mov cx, 65535
|
||||
mov cx, 65535
|
||||
.pause2:
|
||||
dec cx
|
||||
jne .pause2
|
||||
dec bx
|
||||
jne .pause1
|
||||
in al, 61h ; Turn off note (get value from
|
||||
; port 61h).
|
||||
and al, 11111100b ; Reset bits 1 and 0.
|
||||
out 61h, al ; Send new value.
|
||||
jmp .loop
|
||||
dec cx
|
||||
jne .pause2
|
||||
dec bx
|
||||
jne .pause1
|
||||
in al, 61h ; Turn off note (get value from
|
||||
; port 61h).
|
||||
and al, 11111100b ; Reset bits 1 and 0.
|
||||
out 61h, al ; Send new value.
|
||||
jmp .loop
|
||||
|
||||
|
||||
.nonewline:
|
||||
|
||||
;; Write character
|
||||
;; Write character
|
||||
mov ah, 0x09
|
||||
mov bh, 0x00
|
||||
mov bl, [color_mode]
|
||||
mov cx, 0x01
|
||||
mov bh, 0x00
|
||||
mov bl, [color_mode]
|
||||
mov cx, 0x01
|
||||
int 0x10
|
||||
|
||||
;; Get current cursor position
|
||||
mov ah, 0x03
|
||||
int 0x10
|
||||
;; Get current cursor position
|
||||
mov ah, 0x03
|
||||
int 0x10
|
||||
|
||||
cmp dl, WIDTH
|
||||
jge .eol
|
||||
jmp .noeol
|
||||
cmp dl, WIDTH
|
||||
jge .eol
|
||||
jmp .noeol
|
||||
|
||||
.eol:
|
||||
;; Scroll up window
|
||||
mov ah, 0x06
|
||||
mov al, 0x01
|
||||
mov bh, 0x0F
|
||||
mov cx, 0x0000
|
||||
mov dh, HEIGHT
|
||||
mov dl, WIDTH
|
||||
int 0x10
|
||||
;; Scroll up window
|
||||
mov ah, 0x06
|
||||
mov al, 0x01
|
||||
mov bh, 0x0F
|
||||
mov cx, 0x0000
|
||||
mov dh, HEIGHT
|
||||
mov dl, WIDTH
|
||||
int 0x10
|
||||
|
||||
;; Move cursor to beginning of screen
|
||||
mov bh, 0
|
||||
mov dh, HEIGHT
|
||||
mov dl, 0x00
|
||||
mov ah, 0x02
|
||||
int 0x10
|
||||
jmp .loop
|
||||
;; Move cursor to beginning of screen
|
||||
mov bh, 0
|
||||
mov dh, HEIGHT
|
||||
mov dl, 0x00
|
||||
mov ah, 0x02
|
||||
int 0x10
|
||||
jmp .loop
|
||||
|
||||
.noeol:
|
||||
|
||||
;; Move cursor forward
|
||||
inc dl
|
||||
mov ah, 0x02
|
||||
int 0x10
|
||||
jmp .loop
|
||||
|
||||
;; Move cursor forward
|
||||
inc dl
|
||||
mov ah, 0x02
|
||||
int 0x10
|
||||
jmp .loop
|
||||
|
||||
;; Reads two characters from the keyboard buffer and converts them into a single byte
|
||||
;;
|
||||
;; The conversion happens as follows:
|
||||
;; ASCII 'a' is subtracted from each character (so 'a' = 0, 'b' = 1, ...)
|
||||
;; the first character is shifted left by 4
|
||||
;; the shifted and non-shifted values are then or'ed together to form a byte
|
||||
;;
|
||||
;; CLOBBERS
|
||||
;; - ax
|
||||
;; - bl
|
||||
.readbyte:
|
||||
;; Read character
|
||||
mov ah, 0x00
|
||||
int 0x16
|
||||
;; Read character is in al
|
||||
sub al, 'a'
|
||||
mov bl, al
|
||||
shl bl, 0x4
|
||||
mov ah, 0x00 ; Read character
|
||||
int 0x16
|
||||
|
||||
;; Read character
|
||||
mov ah, 0x00
|
||||
int 0x16
|
||||
;; Read character is in al
|
||||
sub al, 'a'
|
||||
or al, bl
|
||||
ret
|
||||
;; Read character is in al
|
||||
sub al, 'a' ; Normalise
|
||||
mov bl, al
|
||||
shl bl, 0x4 ; First character is upper 4 bits
|
||||
|
||||
mov ah, 0x00 ; Read character
|
||||
int 0x16
|
||||
|
||||
;; Read character is in al
|
||||
sub al, 'a' ; Normalise
|
||||
|
||||
or al, bl ; Combine both characters
|
||||
|
||||
ret
|
||||
|
||||
.readduration:
|
||||
;; Read duration (0-16 supported)
|
||||
mov ah, 0x00
|
||||
int 0x16
|
||||
;; Read character is in al
|
||||
sub al, 'a'
|
||||
ret
|
||||
;; Read duration (0-16 supported)
|
||||
mov ah, 0x00
|
||||
int 0x16
|
||||
;; Read character is in al
|
||||
sub al, 'a'
|
||||
ret
|
||||
|
||||
halt: hlt
|
||||
|
||||
color_mode: db 0x02
|
||||
|
||||
;; Magic number must be in the last 2 bytes of the sector so
|
||||
;; fill the binary with zeroes until it is 510 bytes in size
|
||||
;; (magic number will use up the remaining 2)
|
||||
times 510 - ($ - $$) db 0
|
||||
dw 0xAA55
|
||||
dw 0xAA55 ;; Magic number to mark sector as bootable
|
||||
|
|
Loading…
Reference in a new issue