Files
86Box-probing-tools/multikey/MULTIKEY.ASM
2021-10-15 23:55:36 -03:00

323 lines
5.2 KiB
NASM

;
; 86Box A hypervisor and IBM PC system emulator that specializes in
; running old operating systems and software designed for IBM
; PC systems and compatibles from 1981 through fairly recent
; system designs based on the PCI bus.
;
; This file is part of the 86Box Probing Tools distribution.
;
; Phoenix MultiKey keyboard controller probing tool.
;
;
;
; Authors: Miran Grca, <mgrca8@gmail.com>
;
; Copyright 2021 Miran Grca.
;
.model tiny
.286
.code
start:
jmp real_start
store_erl:
push ax
mov al,[erl]
mov [di],al
inc di
inc word [dmp_sz]
pop ax
ret
store_cmd:
mov [di],al
inc di
inc word [dmp_sz]
ret
open_file:
mov ah,3ch
mov cx,0020h
mov dx,offset filename
int 21h
jnc short open_file_succ
mov byte [erl],9
jmp short open_file_ret
open_file_succ:
mov [fileh],ax
open_file_ret:
ret
write_file:
mov ah,40h
mov bx,[fileh]
int 21h
jnc short write_file_ret
mov byte [erl],10
write_file_ret:
ret
close_file:
mov ah,3eh
mov bx,[fileh]
int 21h
jnc short close_file_succ
mov byte [erl],11
jmp short close_file_ret
close_file_succ:
mov word [fileh],0
close_file_ret:
ret
wait_for_nibf:
xor cx,cx
push ax
mov cx,0010h
nibf_push_cx:
push cx
xor cx,cx
nibf_in:
in al,64h
test al,2
loopne nibf_in
pop cx
loopne nibf_push_cx
pop ax
ret
wait_for_obf:
or al,al
push ax
mov cx,0010h
obf_push_cx:
push cx
xor cx,cx
obf_in:
in al,64h
test al,1
loope obf_in
pop cx
loope obf_push_cx
pop ax
ret
print_string:
mov ah,9
int 21h
ret
convert_digit:
and al,0fh
add al,30h
cmp al,39h
ja short digit_is_letter
jmp short output_digit
digit_is_letter:
add al,7
output_digit:
mov [si],al
inc si
ret
cmd_d5:
mov al,0d5h
call store_cmd
pusha
out 64h,al
call wait_for_nibf
jnz short cmd_d5_stuck
call wait_for_obf
jz short cmd_d5_no_out
in al,60h
mov [si],al
inc si
call wait_for_obf
jz short cmd_d5_no_out
in al,60h
mov [si],al
mov byte [erl],0
jmp short cmd_d5_ret
cmd_d5_no_out:
mov byte [erl],3
jmp short cmd_d5_ret
cmd_d5_stuck:
mov byte [erl],2
cmd_d5_ret:
popa
call store_erl
ret
cmd_d6:
mov al,0d6h
call store_cmd
pusha
out 64h,al
call wait_for_nibf
jnz short cmd_d6_stuck
call wait_for_obf
jz short cmd_d6_no_out
in al,60h
mov [si],al
inc si
call wait_for_obf
jz short cmd_d6_no_out
in al,60h
mov [si],al
mov byte [erl],0
jmp short cmd_d6_ret
cmd_d6_no_out:
mov byte [erl],5
jmp short cmd_d6_ret
cmd_d6_stuck:
mov byte [erl],4
cmd_d6_ret:
popa
call store_erl
ret
cmd_d7:
mov al,0d7h
call store_cmd
pusha
out 64h,al
call wait_for_nibf
jnz short cmd_d7_stuck
call wait_for_obf
jz short cmd_d7_no_out
in al,60h
mov [si],al
inc si
call wait_for_obf
jz short cmd_d7_no_out
in al,60h
mov [si],al
inc si
call wait_for_obf
jz short cmd_d7_no_out
in al,60h
mov [si],al
mov byte [erl],0
jmp short cmd_d7_ret
cmd_d7_no_out:
mov byte [erl],7
jmp short cmd_d7_ret
cmd_d7_stuck:
mov byte [erl],6
cmd_d7_ret:
popa
call store_erl
ret
disable_kbd:
mov al,0adh
call store_cmd
pusha
out 64h,al
call wait_for_nibf
jz short dkbd_ret
mov byte [erl],1
dkbd_ret:
popa
call store_erl
ret
enable_kbd:
mov al,0aeh
call store_cmd
pusha
out 64h,al
call wait_for_nibf
jz short ekbd_ret
mov byte [erl],8
ekbd_ret:
popa
call store_erl
ret
print_out:
mov si,[erl]
shl si,1
add si,offset strs
mov dx,[si]
call print_string
ret
dmp_sz dw 0
dmp_arr dup 10, 0
d5_sz dw 2
d5_data dup 2, 0
d6_sz dw 2
d6_data dup 2, 0
d7_sz dw 3
d7_data dup 3, 0
fileh dw 0000h
erl dw 0
; String table organized by error level
strs dw offset err_00,offset err_01,offset err_02,offset err_03
dw offset err_04,offset err_05,offset err_06,offset err_07
dw offset err_08,offset err_09,offset err_0a,offset err_0b
err_00 db "Phoenix MultiKey/42 series detected",0dh,0ah,'$'
err_01 db "Disable Keyboard command stuck",0dh,0ah,'$'
err_02 db "Read MultiKey Code Revision Level command stuck",0dh,0ah,'$'
err_03 db "Read MultiKey Code Revision Level command not returning bytes",0dh,0ah,'$'
err_04 db "Read Version Information command stuck",0dh,0ah,'$'
err_05 db "Read Version Information command not returning bytes",0dh,0ah,'$'
err_06 db "Read MultiKey Model Numbers command stuck",0dh,0ah,'$'
err_07 db "Read MultiKey Model Numbers command not returning bytes",0dh,0ah,'$'
err_08 db "Enable Keyboard command stuck",0dh,0ah,'$'
err_09 db "Error opening file "
filename
db "MULTIKEY.BIN",0,0dh,0ah,'$'
err_0a db "Error writing file",0dh,0ah,'$'
err_0b db "Error closing file",0dh,0ah,'$'
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;
; External Entry Point
;
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
real_start:
; First round of tests
cli
mov di,offset dmp_arr
call disable_kbd
mov si,offset d5_data
call cmd_d5
mov si,offset d6_data
call cmd_d6
mov si,offset d7_data
call cmd_d7
call enable_kbd
; 06 - Enable Keyboard
sti
call print_out
call open_file
mov cx,2
mov dx,offset dmp_sz
call write_file
mov cx,[dmp_sz]
mov dx,offset dmp_arr
call write_file
mov cx,4
mov dx,offset d5_sz
call write_file
mov cx,4
mov dx,offset d6_sz
call write_file
mov cx,5
mov dx,offset d7_sz
call write_file
call close_file
mov al,[erl]
errorlevel_not_0:
mov ah,4ch
int 21h
.end start
end