this is incomplete solution
[org 0x0100]
jmp start
oldisr: dd 0
op: dw 0
swap: db 0
loc: dw 0
locc: dw 0
data: dw 2, 1, 4, 3, 6, 5, 8, 7, 10, 9
;========================number printing====================
printnum:
push bp
mov bp, sp
push es
push ax
push bx
push cx
push dx
push di
mov ax, 0xb800
mov es, ax
mov ax, [bp+4]
mov bx, 10
mov cx, 0
nextdigit:
mov dx, 0
div bx ; divide by 10
add dl, 0x30
push dx
inc cx
cmp ax, 0
jnz nextdigit
mov di, 0
nextpos:
pop dx
mov dh, 0x07
;================================================
mov ax,[loc]
mov ah,0
mov si,ax
mov [es:si], dx
add ax,2
mov [loc],ax
;======================================
add di, 2
loop nextpos
pop di
pop dx
pop cx
pop bx
pop ax
pop es
pop bp
ret 2
;=========================================================
uuu:
mov word[data],2
mov word[data+2],1
mov word[data+4],4
mov word[data+6],3
mov word[data+8],6
mov word[data+10],5
mov word[data+12],8
mov word[data+14],7
mov word[data+16],10
mov word[data+18],9
mov word[op],1
ret
;=====================================================
kbisr:
push ax
push es
in al, 0x60
;=======================================================
cmp al, 0x1f
jne nomatch
call uuu
;=======================================================
mov bx, [locc]
;=============================================
mov bp,0
ll:
mov ax, [data+bp]
push ax
call printnum
add bp,2
cmp bp,20
jne ll
;====================================================
jmp exit
;============================================================
nomatch:
pop es
pop ax
jmp far [cs:oldisr]
;==================================================================
exit:
mov al, 0x20
out 0x20, al
pop es
pop ax
iret
;=======================================================
start:
xor ax, ax
mov es, ax
mov ax, [es:9*4]
mov [oldisr], ax
mov ax, [es:9*4+2]
mov [oldisr+2], ax
cli
mov word [es:9*4], kbisr
mov [es:9*4+2], cs
sti
mov dx, start
add dx, 15
mov cl, 4
shr dx, cl
mov ax, 0x3100
int 0x21
No comments:
Post a Comment