Hi, im making little game in asm.
Problem is that is very slowed down by using int 16h or keyboard port check on every loop.
So i want to use keyboard interrupt handler, with some functions already found on this board.
Here is the code of my test program. It should print out current address for keyboard interrupt handler, change address, print new address and then do a loop to simulate a normal working program.
And when i hit a key, my keyboardhandler should be called automatically and print something out. The problem is it doesnt, the program just hangs after the first key pressed, why ?
use16
org 0x100
mov al, 9h
call getint ; es = segment bx = offset
mov ax, es
mov dx, bx
mov bx, 16
call putint
call newline
mov ax,dx
call putint
call newline
call newline
mov ah, 0 ; Key wait
int 16h
mov al, 9h
mov dx, handlekey
call setint
mov al, 9h
call getint ; es = segment bx = offset
mov ax, es
mov dx, bx
mov bx, 16
call putint
call newline
mov ax,dx
call putint
call newline
call newline
mov ah, 0 ; Key wait
int 16h
a: ;simulate a real running program
nop
nop
mov ax,bx
mov cx,bx
jmp a
exit:
int 20h ;exit
handlekey:
push ax
push bx
in al,60h ; read scancode byte
mov ah,0eh ; print character from scancode
mov bh,0
int 10
pop bx
pop ax
iret
;----------------------------------------------------------------------------
; set interrupt vector
setint:
; al = interrrupt
; cs = segment
; dx = offset
; cmp al, 19h ; do not allow to change int 19h (for rebooting)
; je near int21_error
cli
xor ah, ah
shl ax, 2
push si
push bx
push es
mov si, ax
xor bx, bx
mov es, bx
mov word [es:si], dx ; offset
mov bx, cs
mov word [es:si+2], bx ; segment
pop es
pop bx
pop si
sti
retn
;----------------------------------------------------------------------------
; get interrupt vector
; al = interrupt
; es = segment
; bx = offset
getint:
push ds
push si
xor ah, ah
shl ax, 2
mov si, ax
xor bx, bx
mov ds, bx ; DS = 0
mov bx, word [ds:si+2] ; segment
push bx
mov bx, word [ds:si] ; offset
pop es ; get segment
pop si
pop ds
retn
newline:
push ax dx
mov ah,02h
mov dl,0Dh
int 21h ; Output CR to screen
mov dl,0Ah
int 21h ; Output LF to screen
pop dx ax
ret
; bx = base (default = 10), ax = number
putint:
push ax bx cx dx
cmp bx,0
jne .start ; the same as in putsint... (if bx = 0 then bx = 10)
mov bx,10
.start:
xor cx,cx ; cx = 0
.new:
xor dx,dx ; dx = 0
div bx ; number / base
push dx ; push the remainder
inc cx ; increase the "digit-count"
cmp ax,0 ; if the quotient still is not 0, do it once more
jnz .new
.loop:
pop dx ; pop the remainder
add dl,30h ; convert the number to a character
cmp dl,"9"
jng .ok ; if the charater is greater than "9" then we have
add dl,7 ; to add 7 to get A as 10, B as 11, and so on...
.ok:
mov ah,02h ; output the character
int 21h
loop .loop
pop dx cx bx ax
ret