Algunas conclusiones sobre el teclado:

llamar a                         m68k_set_irq(1);
                        m68k_set_irq(2);
                        m68k_set_irq(3);
                        m68k_set_irq(4);
                        m68k_set_irq(5);
                        m68k_set_irq(6);

como interrupcion en el core acaba generando escrituras en registros ipc siempre que la lectura de ipc devuelva valor random

Segun llamadas a sistema:

Trap1 , D11

Lectura IPC
Pagina 79 de documento qltm.pdf

TR1d11
XLtr1d11 EQU TR1d11

* send command to 8049

L00872 MOVEM.L D4/D6/A0-A1/A3,-(A7)
       JSR     L02C72(PC)    * execute command to 8049
       MOVEM.L (A7)+,D4/D6/A0-A1/A3
       BRA     L003A4




Pruebas interrupcion. Se produce al acabar los t-estados:
estados: 24944
estados: 24948
estados: 24952
estados: 24956
estados: 0
estados: 0
estados: 0
estados: 0


en uqlx, rutina de ipc write relacionada con esto:
#define IPCW_CMD_CODE       0xadc2

adc2h es un opcode de ql???
ese opcode aparentemente es 
and.l   ($0,A5), D1

Parece que cuando se lee ese opcode, se llama a WriteIPC,
esta funcion comprueba que el pc sea 0x2e78?
Hacia esa direccion hay:

L02E76 CLR.W   $008A(A6)    * autorepeat buffer
       JSR     L02F96(PC)    * receive ctrl alt shift
       MOVE.B  D1,D2
       JSR     L02F9A(PC)
       MOVEA.L $BFF2,A3
       JSR     (A3)      * convert to ASCII 
       BRA.S   L02EC4    * ctrl - space
       BRA.S   L02EC2    * no char implemented !!! change to 2ec0 !!!
       BSR.S   L02EEC
       DBF     D4,L02E76 * look for next bytes in buffer


Si pongo
command@cpu-step> set-breakpoint 1 pc>02E58h AND pc<02F00h

y pulso enter se para en:

PC: 02E5C move.l  A2, D0

Aqui resulta:

L02E58 MOVEA.L $004C(A6),A2  * clear 8049 - keyboard buffer
       MOVE.L  A2,D0
       BEQ.S   L02EC0        * = no con open
       MOVEQ   #$08,D0       * command 8=read keyboard
       JSR     L02F7C(PC)    * command for 8079
       JSR     L02F96(PC)    * receive
02E6A       MOVE.B  D1,D5         * d1=d5=d4 : number of bytes in buffer

Y D1 vale 0, o sea, entiende que no hay bytes en el buffer
Si se pone D1 a 1, 1 byte de tecla, luego creo que el truco esta en


L02E76 CLR.W   $008A(A6)    * autorepeat buffer
       JSR     L02F96(PC)    * receive ctrl alt shift
       MOVE.B  D1,D2
       JSR     L02F9A(PC)
       MOVEA.L $BFF2,A3
       JSR     (A3)      * convert to ASCII 
       BRA.S   L02EC4    * ctrl - space
       BRA.S   L02EC2    * no char implemented !!! change to 2ec0 !!!
       BSR.S   L02EEC
       DBF     D4,L02E76 * look for next bytes in buffer


Supuestamente ahi D1 tiene un codigo de tecla que al hacer JSR (A3) se convierte a ascii
Que habria que hacer para simular F1?


-Parece que en L04AE4 se dibuja menu y se espera F1, F2....


L0B352 ANDI.W #$0007,D2
       ANDI.W #$003F,D1


/*Devolveremos una tecla. Esto es:
                                                        * first nibble, ms bit: set if final last keydef is still held
                                                        * first nibble, ls 3 bits: count of keydefs to follow.
                                                        valor 1
                                                        //nibble, bits are 3210=lsca: lost keys (last set only), shift, ctrl and alt.
                                                        valor 0
                                                        //byte, bits are 76543210=00colrow: column and row as keyrow table


// ================================== matrix ============================
//        0      1      2      3      4      5      6      7
//  +-------------------------------------------------------
// 0|    F4     F1      5     F2     F3     F5      4      7
// 1|   Ret   Left     Up    Esc  Right      \  Space   Down
// 2|     ]      z      .      c      b  Pound      m      '
// 3|     [   Caps      k      s      f      =      g      ;
// 4|     l      3      h      1      a      p      d      j
// 5|     9      w      i    Tab      r      -      y      o
// 6|     8      2      6      q      e      0      t      u
// 7| Shift   Ctrl    Alt      x      v      /      n      ,


                                                        //F1 es columna 1, row 0
                                                        valor es 7654=00co=0000=0
                                                        valor es lrow=1000 =8
                                                        col=001 row=000
                                                        00 001 000


	7    3F
      111  111111

	ANDI.W #$003F,D1 -> D1 sera 76543210=00colrow?
	tecla F1 = 00 001 000 = 8  -> D1=8



----

manera de saltarse el menu de inicio. 
set-breakpoint pc=04AF2h
reset-cpu




simulo F2 con:

set-register pc=4B08H


L04AE4 LEA     L04BD2(PC),A1    * WINDOW 2
       MOVEQ   #$02,D4
       BSR.S   L04AA0
       MOVEQ   #-$18,D0         * F1-MONI ETC
       JSR     L03968(PC)       * open START window
04AF2 GETMOD MOVEQ   #$01,D0          * TRAP NR
       MOVEQ   #-$01,D3         * TIMEOUT
       TRAP    #$03             * NOW INKEY$
4AF8   MOVEQ   #$00,D6          * INIT MODE 4
       MOVEQ   #$00,D7
       MOVEQ   #$20,D5
       SUBI.B  #$E8,D1          * F1 ?
       BEQ.S   INIMON
       SUBQ.B  #$4,D1           * F2 ?
       BNE.S   GETMOD

pc=4B08H apunta aqui:
       MOVEQ   #$00,D6


       MOVEQ   #$01,D7
       MOVEQ   #$44,D5          * d5=displacement for windows
INIMON 
4B0E   MOVE.B  D6,D1
       MOVE.B  D7,D2
       MOVEQ   #$10,D0
       TRAP    #$01                     * SCREEN-INIT
       LEA     XL04B72-$08(PC,D5.W),A1       * #2 DEFI
       BSR.S   L04B6E
       MOVEA.L #$00010001,A0
       LEA     XL04B72-$14(PC,D5.W),A1       * #1 DEFI

-------

Por cierto, del TRAP 03 anterior no vuelve nunca, ni pulsando una tecla
GETMOD=4AF2H

trap 03 = 0032A, le envia D0=1 = fetch a byte
A0=channel ID=00020002H.
Supuestamente inkeys$
returns d1.b=byte fetched

acaba saltando aqui:
L00336 SUBQ.W  #8,A7       * initialise of A5 and A6
       MOVE.L  $0008(A7),-(A7)
       MOVEM.L D7/A5-A6,$0004(A7)
       MOVEA.L #$00028000,A6
       LEA     $0004(A7),A5


(sb 1 pc>0032AH and pc<00340h and d0=1 and a0=00020002H)


Para parar y simular F1:

sb 2 pc=4AF6H
set-register pc=4AF8H  (saltamos el trap 3)
set-register D1=E8H    (devolvemos tecla f1)
(o para simular F2: set-register D1=ECH)



Luego se cuelga aqui:

command@cpu-step> cs
PC: 04B4C SP: 3FFF8 USP: 3FFF8 SR: 0004 :        Z   A0: 00004BE4 A1: 0003F200 A2: 00000A90 A3: 00100000 A4: 00028E00 A5: 00000194 A6: 0003F268 A7: 0003FFF8 D0: 00000001 D1: FFFFFFFF D2: 00000000 D3: 00000000 D4: 00000002 D5: 00000020 D6: 00000000 D7: 00000000 

04B4C trap    #$2
04B4E tst.l   D0
04B50 rts


TRAP #2 D0=$1
Open a channel
IO.OPEN


A0=00004BE4 : 

L04BE4 DC.W    $0009
       DC.B    'MDV1_BOOT'
       DC.B    $00


saltamos ese trap
set-register pc=04B50h 



Se cuelga aqui tambien:

command@cpu-step> cs
PC: 079E8 SP: 3FFF0 USP: 3FFF0 SR: 0008 :       N    A0: 00000000 A1: 00000100 A2: 00000A90 A3: 00100000 A4: 00028E00 A5: 00004BF0 A6: 0003F268 A7: 0003FFF0 D0: 00000004 D1: 00000000 D2: 00000080 D3: FFFFFFFF D4: 00000000 D5: 00000020 D6: 00000000 D7: 00000000 
trap    #$3

TRAP #3 D0=$4 IO.EDLIN Edit a line of characters (console driver only)

extendido:

       SUB.W   D1,D2
L079E6 MOVEQ   #-$01,D3
       TRAP    #$03
       TST.L   D0
       BGE.S   L07A06
       CMPI.B  #$FB,D0
       BNE.S   L07A06
79F4H       MOVE.L  D1,D4
       MOVE.L  A1,$0004(A6)
       MOVE.L  A0,-(A7)
       MOVEQ   #$7E,D1
       JSR     L04E6A(PC)

Se puede probar a evitar ese trap3 saltando directamente a 79F4H pero vuelve al mismo sitio.
Quiza habria que llenar la direccion con texto escrito?


--------

prueba
sb 1 pc=0032AH and d0=1 and a0=00020002H


tabla traps:

LTRAP0 
031A   ADDQ.W  #2,A7         * decrement user stack
       RTS

XLTRAP0 EQU LTRAP0
LTRAP1 
031E   BSR.S   L00336      * initialise A5 and A6
       BRA     L00460      * Trap 1 continues
XLTRAP1 EQU LTRAP1
LTRAP2 BSR.S   L00336      * initialise A5 and A6
       BRA     L032A2      * Trap2 continues
XLTRAP2 EQU LTRAP2        
LTRAP3 BSR.S   L00336      * initialise A5 and A6
       BRA     L0337C      * Trap3 continues
XLTRAP3 EQU LTRAP3 
LTRAP4 BSR.S   L00336      * initialise A5 and A6
       BRA     L03432      * Trap4 continues


----

Ver funcion
Cond IPC_Command(void)
de uqlx en QL_hardware.c
