160 lines
2.2 KiB
NASM
160 lines
2.2 KiB
NASM
[BITS 16]
|
|
[SECTION .v86]
|
|
global v86Interrupt
|
|
v86Interrupt:
|
|
int 0x00
|
|
int 0x30
|
|
ud2
|
|
|
|
global v86TransFlag
|
|
v86TransFlag:
|
|
push cs
|
|
pop es
|
|
mov ax, 0x13
|
|
int 0x10
|
|
mov ax,0x1012
|
|
xor bx,bx
|
|
mov cx,5
|
|
mov dx,.c
|
|
int 0x10
|
|
push 0xa000
|
|
pop es
|
|
xor di,di
|
|
xor ax,ax
|
|
.loop:
|
|
mov cx, 12800
|
|
rep stosb
|
|
inc ax
|
|
cmp ax,5
|
|
jl .loop
|
|
int 0x30
|
|
ud2
|
|
.c: db `\0263>=*.\?\?\?=*.\0263>`
|
|
|
|
global v86VideoInt
|
|
v86VideoInt:
|
|
int 0x10
|
|
int 0x30
|
|
ud2
|
|
|
|
global v86DiskOp
|
|
v86DiskOp:
|
|
xor bx, bx ; TODO fix assuming we're in first 64k
|
|
mov ds, bx
|
|
mov dl, 0x80 ; TODO get this from BIOS or something
|
|
mov si, v86disk_addr_packet ; ds:si
|
|
int 0x13
|
|
jc .err
|
|
int 0x30
|
|
.err:
|
|
ud2
|
|
global v86disk_addr_packet
|
|
v86disk_addr_packet:
|
|
db 0x10, 0x00 ; size, reserved
|
|
dw 0x1 ; blocks
|
|
dd 0x23000000 ; transfer buffer 0x23000
|
|
dq 0x1 ; start block
|
|
|
|
global v86DiskGetGeometry
|
|
v86DiskGetGeometry:
|
|
mov ah, 8
|
|
mov dl, 0x80
|
|
int 0x13
|
|
movzx eax, ch
|
|
shl eax, 16
|
|
mov al, cl
|
|
mov ah, dh
|
|
int 0x30
|
|
ud2
|
|
|
|
global v86DiskReadCHS
|
|
v86DiskReadCHS:
|
|
push 0x2000
|
|
pop es
|
|
int 0x13
|
|
int 0x30
|
|
ud2
|
|
|
|
global v86TextMode
|
|
v86TextMode:
|
|
mov ax, 0x3
|
|
int 0x10
|
|
int 0x30
|
|
ud2
|
|
|
|
real_hexprint:
|
|
xor cx, cx
|
|
mov bl, al
|
|
shr al, 4
|
|
jmp .donibble
|
|
.nibble2:
|
|
mov al, bl
|
|
inc cx
|
|
.donibble:
|
|
and al, 0x0F
|
|
cmp al, 0x0A
|
|
jl .noadjust
|
|
add al, 'A' - '0' - 10
|
|
.noadjust:
|
|
add al, '0'
|
|
mov ah, 0x1f
|
|
stosw
|
|
test cx, cx
|
|
jz .nibble2
|
|
ret
|
|
real_printword:
|
|
mov dx, ax
|
|
mov al, ah
|
|
call real_hexprint
|
|
mov ax, dx
|
|
call real_hexprint
|
|
ret
|
|
|
|
global v86Test
|
|
v86Test:
|
|
mov ax, (0xB8000 + (80*2)) >> 4
|
|
mov es, ax
|
|
mov di, 0
|
|
mov word es:[di+0], 0x1f00 | 'S'
|
|
mov word es:[di+2], 0x1f00 | 'S'
|
|
mov word es:[di+4], 0x1f00 | ':'
|
|
add di, 6
|
|
mov ax, ss
|
|
call real_printword
|
|
add di, 2
|
|
mov word es:[di+0], 0x1f00 | 'S'
|
|
mov word es:[di+2], 0x1f00 | 'P'
|
|
mov word es:[di+4], 0x1f00 | ':'
|
|
add di, 6
|
|
mov ax, sp
|
|
call real_printword
|
|
add di, 2
|
|
mov word es:[di+0], 0x1f00 | 'D'
|
|
mov word es:[di+2], 0x1f00 | 'S'
|
|
mov word es:[di+4], 0x1f00 | ':'
|
|
add di, 6
|
|
mov ax, ds
|
|
call real_printword
|
|
add di, 2
|
|
mov word es:[di+0], 0x1f00 | 'C'
|
|
mov word es:[di+2], 0x1f00 | 'S'
|
|
mov word es:[di+4], 0x1f00 | ':'
|
|
add di, 6
|
|
mov ax, cs
|
|
call real_printword
|
|
add di, 2
|
|
mov ax, cs
|
|
mov ds, ax
|
|
mov si, .testStr
|
|
mov ah, 0x1f
|
|
mov cx, .testStr_end - .testStr
|
|
.print:
|
|
lodsb
|
|
stosw
|
|
loop .print
|
|
int 3 ; wait for key
|
|
int 0x30 ; exit
|
|
ud2
|
|
.testStr: db "PRESS ANY KEY"
|
|
.testStr_end:
|