;////////////////////////////////////////////////////////////////////////////// ;// 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