rendered paste body;//////////////////////////////////////////////////////////////////////////////
;// Interrupt 0x10
;//////////////////////////////////////////////////////////////////////////////
int0x10:
cmp ah, 0x00
je .0x00
cmp ah, 0x02
je .0x02
cmp ah, 0x09
je .0x09
cmp ah, 0x0E
je .0x0E
cmp ah, 0x13
je .0x13
cmp ah, 0x10
je .0x10
cli
hlt
;TODO: Set video mode
.0x00:
iret
;TODO: Textmode: Set Cursor position
.0x02:
push ax
push ds
mov ax, 0xF000
mov ds, ax
mov al, 160
mul dh
push dx
xor dh, dh
add ax, dx
pop dx
mov [vram_offset], ax
pop ds
pop ax
iret
;Textmode: Write character with attribute to current offset
;TODO: Screen page
;TODO: xor attribute if 7th bit in bl set
.0x09:
push si
push ds
push ax
mov ax, 0xF000
mov ds, ax
mov si, [vram_offset]
push si
add si, cx
add si, cx
mov [vram_offset], si
pop si
mov ax, 0xB800
mov ds, ax
pop ax
.loop:
mov [ds:si], al
inc si
mov [ds:si], bl
inc si
loop .loop
pop ds
pop si
iret
;Textmode: Write character to current offset
.0x0E:
push si
push ds
push ax
mov ax, 0xF000
mov ds, ax
mov si, [vram_offset]
mov ax, 0xB800
mov ds, ax
pop ax
push ax
cmp al, 10
je .0x0E.10
cmp al, 13
je .0x0E.13
mov [ds:si], al
inc si
push bx
mov bh, [ds:si]
and bl, 0x0F
and bh, 0xF0
or bl, bh
mov [ds:si], bl
pop bx
inc si
jmp .0x0E.end
.0x0E.10:
add si, 160
jmp .0x0E.end
.0x0E.13:
push bx
mov ax, si
mov bl, 160
div bl
pop bx
shr ax, 8
sub si, ax
jmp .0x0E.end
.0x0E.end:
mov ax, 0xF000
mov ds, ax
mov [vram_offset], si
pop ax
pop ds
pop si
iret
.0x10:
iret
;Textmode: Write string
.0x13:
push ax
push ds
push word 0xB800
pop ds
push di
push ax
push dx
push bx
mov al, dl
mov bl, 160
mul bl
pop bx
shr dx, 7
add ax, dx
mov di, ax
pop dx
pop ax
and ax, 0x02
jz .noattr
.attr:
.loop1:
mov ax, [es:bp]
cmp al, 10
je .loop1.10
cmp al, 13
je .loop1.13
jmp .loop1.else
;Line feed
.loop1.10:
add di, 160
jmp .loop1.end
;Carriage return
.loop1.13:
push bx
mov ax, di
mov bl, 160
div bl
pop bx
shr ax, 8
sub di, ax
jmp .loop1.end
;Normal char
.loop1.else:
mov [ds:di], ax
add di, 2
.loop1.end:
add bp, 2
loop .loop1
jmp .end
.noattr:
.loop2:
mov al, [es:bp]
cmp al, 10
je .loop2.10
cmp al, 13
je .loop2.13
jmp .loop2.else
;Line feed
.loop2.10:
add di, 160
jmp .loop2.end
;Carriage return
.loop2.13:
push bx
mov ax, di
mov bl, 160
div bl
pop bx
shr ax, 8
sub di, ax
jmp .loop2.end
;Normal char
.loop2.else:
mov ah, bl
mov [ds:di], ax
add di, 2
.loop2.end:
add bp, 1
loop .loop2
jmp .end
.end:
mov bp, di
pop di
pop ds
pop ax
push ds
push ax
and al, 0x01
jz .end2
mov ax, 0xF000
mov ds, ax
mov [vram_offset], bp
.end2:
pop ax
pop ds
iret