Ayuda con la interrupción H.KEYI

By DarkSchneider

Paladin (862)

DarkSchneider's picture

20-05-2016, 11:43

Ya tengo la H.TIMI funcionando como quiero, así que nos olvidamos de ésta y nos centramos en la H.KEYI.

Estoy en entorno DOS, la función de C principal es muy simple:

main() {
  isrset();
  loop {
    // if SPACE salir de loop
    // esperar a JIFFY
  }
  isrrst();
}

Código referente al ISR:

.z80
KEYI equ 0FD9AH
TIMI equ 0FD9FH
CALSLT equ 0001CH
RAMAD0 equ 0F341H
WRTVDP equ 00047H
;LDIRVM equ 0005CH
EXTROM equ 0015FH
VDPSTA equ 00131H
EXPTBL equ 0FCC1H
RG0SAV equ 0F3DFH
RG19SA equ 0FFF2H
LINEINT equ 16

public isrset@
isrset@:	di
	;KEYI
	ld hl, KEYI
	ld de, oldkei
	ld bc, 5
	ldir
	ld a, 0cdh ; call
	ld (KEYI), a
	ld hl, newkei@
	ld (KEYI+1), hl
	ld a, 0c9h
	ld (KEYI+3), a
	; set line interrupt
	; read R#0
	ld a, (RG0SAV)
	;ld (KEYI-1), a ; this shows that R#0 has value 4
	; set IE1
	or 010h
	ld c, 0
	ld b, a
	ld iy, (EXPTBL-1)
	ld ix, WRTVDP
	call CALSLT
; this shows that R#0 has 14h, the expected value
	;ld a, (RG0SAV)
	;ld (KEYI-3), a
	ei
	ret
	
newkei@:
	push af
	push bc
	push de
	push hl
	ld a, 99
	ld (KEYI-1), a
	; read S#1
	ld a, 1
	out (099h), a
	ld a, 15
	out (099h), a
	in a, (099h)
	ld (KEYI-2), a
	; if FH call the function (now only a RET)
	and 1
	call nz, @exit
	; select S#0
	xor a
	out (099h), a
	ld a, 08fh
	out (099h), a
	ld a, 96
	ld (KEYI-1), a
	pop hl
	pop de
	pop bc
	pop af
@exit:
	ret

Sigo este ejemplo
https://youtu.be/cnqruXo-udA

Pero:
- Si habilito IE1 se cuelga.
- Si no habilito IE1 (comentar la línea "call CALSLT" que establece R#0), en newkei@:
-Si no leo S#1 OK.
- En el momento en que leo S#1, se cuelga en cualquier caso (incluso sin habilitar IE1).

Uso algunos valores para ver hasta donde llega. Usando el debugger cuando no habilito IE1 veo valores para S#1 como 9fh, como leyendo el lightpen seguramente, pero si leo S#1, se cuelga. Si hago cualquier cosa que no sean memoria y registros (LD, etc.) se cuelga, por ejemplo invocando a DISSCR, BEEP, o cualquier de esas (con 1 flag de control para que sólo se llame 1 sola vez), se cuelga igualmente.
El contenido previo de H.KEYi es C9 5 veces, así que no contenía nada que se pueda echar de menos.

Login or register to post comments