210 lines
2.4 KiB
PHP
210 lines
2.4 KiB
PHP
; conio.inc
|
|
; real mode console input / output functions
|
|
; Author: Josh Holtrop
|
|
; Date: 01/04/05
|
|
; Modified: 01/04/05
|
|
|
|
|
|
con_getkey:
|
|
xor ax, ax
|
|
int 0x16
|
|
ret
|
|
|
|
|
|
con_move_cursor: ;con_move_cursor(word location)
|
|
push bp
|
|
mov bp, sp
|
|
push ax
|
|
|
|
mov ax, [bp + 4]
|
|
mov [cursor], ax
|
|
call con_write_cursor
|
|
|
|
pop ax
|
|
pop bp
|
|
ret
|
|
|
|
|
|
con_clear:
|
|
pusha
|
|
push es
|
|
push ds
|
|
|
|
mov ax, 0xB800
|
|
mov es, ax
|
|
mov di, 0
|
|
mov ax, 0x0720
|
|
mov cx, 2000
|
|
rep stosw
|
|
mov [cursor], word 0
|
|
call con_write_cursor
|
|
|
|
pop ds
|
|
pop es
|
|
popa
|
|
ret
|
|
|
|
|
|
con_putstring: ;con_putstring(char *str)
|
|
push bp
|
|
mov bp, sp
|
|
pusha
|
|
|
|
mov si, [bp + 4]
|
|
putstring_loop:
|
|
lodsb
|
|
or al, al
|
|
jz putstring_done
|
|
mov ah, 0x07
|
|
ccall con_putc, ax
|
|
jmp putstring_loop
|
|
|
|
putstring_done:
|
|
popa
|
|
pop bp
|
|
ret
|
|
|
|
|
|
con_putHex: ;con_putHex(word hexVal)
|
|
push bp
|
|
mov bp, sp
|
|
pusha
|
|
|
|
mov ax, [bp + 4]
|
|
mov cx, 12
|
|
mov dl, 0
|
|
con_putHex_loop:
|
|
push ax
|
|
shr ax, cl
|
|
and ax, 0xF
|
|
cmp ax, 0
|
|
jnz con_putHex_putc
|
|
cmp cx, 0
|
|
jz con_putHex_putc
|
|
cmp dl, 0
|
|
jz con_putHex_loop_done
|
|
con_putHex_putc:
|
|
add ax, '0'
|
|
cmp ax, '9'
|
|
jbe con_putHex_putc_goon
|
|
add ax, 'A'-'9'-1
|
|
con_putHex_putc_goon:
|
|
mov ah, 0x07
|
|
ccall con_putc, ax
|
|
mov dl, 1
|
|
con_putHex_loop_done:
|
|
pop ax
|
|
cmp cx, 0
|
|
jz con_putHex_done
|
|
sub cx, 4
|
|
jmp con_putHex_loop
|
|
|
|
con_putHex_done:
|
|
popa
|
|
pop bp
|
|
ret
|
|
|
|
|
|
con_putDec: ;con_putDec(word dec)
|
|
push bp
|
|
mov bp, sp
|
|
pusha
|
|
|
|
mov ax, [bp + 4]
|
|
mov cx, 10000
|
|
mov di, 0
|
|
|
|
con_putDec_loop:
|
|
xor dx, dx
|
|
div cx ;remainder in dx, quotient in ax
|
|
mov bx, ax
|
|
mov ax, dx ;new value is ax % mod
|
|
push ax
|
|
mov ax, bx
|
|
cmp ax, 0
|
|
jnz con_putDec_putc
|
|
cmp cx, 1
|
|
jz con_putDec_putc
|
|
cmp di, 0
|
|
jz con_putDec_loop_done
|
|
con_putDec_putc:
|
|
add ax, 0x0730
|
|
ccall con_putc, ax
|
|
mov di, 1
|
|
|
|
con_putDec_loop_done:
|
|
mov ax, cx
|
|
xor dx, dx
|
|
mov bx, 10
|
|
div bx
|
|
mov cx, ax
|
|
pop ax
|
|
cmp cx, 0
|
|
jnz con_putDec_loop
|
|
|
|
popa
|
|
pop bp
|
|
ret
|
|
|
|
|
|
con_putc: ;con_putc(char chr)
|
|
push bp
|
|
mov bp, sp
|
|
pusha
|
|
push es
|
|
|
|
mov ax, 0xB800
|
|
mov es, ax
|
|
mov di, [cursor]
|
|
mov ax, [bp + 4]
|
|
cmp al, 10
|
|
jz putc_return
|
|
stosw
|
|
jmp putc_update
|
|
putc_return:
|
|
mov ax, di
|
|
mov bl, 160
|
|
div bl ; quotient in al, remainder in ah
|
|
shr ax, 8
|
|
sub di, ax
|
|
add di, 160
|
|
putc_update:
|
|
mov [cursor], di
|
|
call con_write_cursor
|
|
|
|
pop es
|
|
popa
|
|
pop bp
|
|
ret
|
|
|
|
|
|
con_write_cursor:
|
|
pusha
|
|
|
|
mov ax, [cursor]
|
|
shr ax, 1
|
|
|
|
mov bl, al
|
|
mov dx, 0x03D4
|
|
mov al, 0x0E
|
|
out dx, al
|
|
|
|
inc dx
|
|
mov al, ah
|
|
out dx, al
|
|
|
|
dec dx
|
|
mov al, 0x0F
|
|
out dx, al
|
|
|
|
inc dx
|
|
mov al, bl
|
|
out dx, al
|
|
|
|
popa
|
|
ret
|
|
|
|
|
|
cursor: dw 0
|
|
|