home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / Emulatoren / FS_FRO23.LZX / Frodo / src / 6526.asm < prev    next >
Encoding:
Assembly Source File  |  1996-06-13  |  27.2 KB  |  1,504 lines

  1. *
  2. * 6526.asm - CIA-Emulation
  3. *
  4. * Copyright (C) 1994-1996 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Funktionsweise/Periodic:
  12. *  - Für jede (simulierte) C64-Rasterzeile wird vom 6510-Task die Routine
  13. *    Periodic6526 aufgerufen, die die Timer herunterzählt und ggf.
  14. *    Interrupts auslöst
  15. *
  16. * Timer/Latches:
  17. *  - Die Bytefolge im Register-File ist gegenüber dem echten 6526 umgekehrt,
  18. *    das wird aber bei den WriteTo6526- und ReadFrom6526-Routinen wieder
  19. *    ausgeglichen
  20. *
  21. * TOD-Clocks:
  22. *  - Die TODs werden synchron mit dem VBlank gezählt. Es wird also ein
  23. *    50Hz-Eingangssignal simuliert.
  24. *
  25. * Tastaturabfrage:
  26. *  - Das Feld KeyMatrix enthält für jede Taste entsprechend der C64-
  27. *    Tastaturmatrix ein Bit (0: Taste gedrückt, 1: Taste nicht gedrückt).
  28. *    InvKeyMatrix ist dieselbe Matrix mit vertauschten Zeilen und Spalten
  29. *    (für "inverse" Tastaturabfragen).
  30. *  - Bei Lesezugriffen aus CIA-A, Port A/B werden entsprechend der aktiven
  31. *    (ausgewählten) Zeilen der Tastatur die entsprechenden Bits aus der
  32. *    Tastaturmatrix zusammengestellt
  33. *  - F9 löst einen NMI aus (Restore), F10 einen RESET
  34. *
  35. * Inkompatibilitäten:
  36. *  - Die TOD-Clock sollte bei einem Lesezugriff nicht angehalten,
  37. *    sondern gelatcht werden
  38. *  - Kein Lightpen-Interrupt (CIA-A, PB4)
  39. *
  40.  
  41.         MACHINE    68020
  42.  
  43.         XREF    ShowPrefs    ;Main.asm
  44.  
  45.         XREF    _ciaaprb
  46.         XREF    _ciaaddrb
  47.  
  48.         XREF    IntIsNMI    ;6510.asm
  49.         XREF    IntIsCIAIRQ
  50.         XREF    NMIState
  51.         XREF    Peri6526Cont
  52.  
  53.         XREF    ChangedVA    ;6569.asm
  54.  
  55.         XREF    IECIsOpen    ;IEC.asm
  56.  
  57.         XDEF    Reset6526
  58.         XDEF    _GetCIA1Dump
  59.         XDEF    _GetCIA2Dump
  60.         XDEF    ReadFrom6526A
  61.         XDEF    ReadFrom6526B
  62.         XDEF    WriteTo6526A
  63.         XDEF    WriteTo6526B
  64.         XDEF    Periodic6526
  65.         XDEF    ChangedKeys
  66.         XDEF    CountTODs
  67.         XDEF    _KeyPressed
  68.  
  69.         XDEF    CIACycles    ;Prefs
  70.         XDEF    Joystick1On
  71.         XDEF    Joystick2On
  72.         XDEF    JoystickSwap
  73.         XDEF    KeyboardYZ
  74.  
  75.         SECTION    "text",CODE
  76.  
  77.  
  78. **
  79. ** Definitionen
  80. **
  81.  
  82. ; CIA-Register
  83. PRA        = 0
  84. PRB        = 1
  85. DDRA        = 2
  86. DDRB        = 3
  87. TAHI        = 4    ;Timer-Wert A
  88. TALO        = 5    ;Achtung: Umgekehrte Bytefolge!
  89. TBHI        = 6    ;Timer-Wert B
  90. TBLO        = 7
  91. TOD10THS    = 8
  92. TODSEC        = 9
  93. TODMIN        = 10
  94. TODHR        = 11
  95. SDR        = 12
  96. ICR        = 13    ;Interrupt-Data
  97. CRA        = 14
  98. CRB        = 15
  99.  
  100. ; Zusätzliche Register
  101. LTCHA        = 16    ;Timer-Latch A
  102. LTCHB        = 18    ;Timer-Latch B
  103. INTMASK        = 20    ;Interrupt-Enable
  104. TODHALT        = 21    ;TOD zwecks Beschreiben/Auslesen gestoppt
  105. ALM10THS    = 22    ;Alarmzeit
  106. ALMSEC        = 23
  107. ALMMIN        = 24
  108. ALMHR        = 25
  109. TODDIV        = 26    ;TOD-Frequenzteiler
  110. TACNTPHI2    = 27    ;Timer A läuft und zählt Phi2
  111. TBCNTPHI2    = 28    ;Timer B läuft und zählt Phi2
  112. TBCNTTA        = 29    ;Timer B läuft und zählt Unterläufe von Timer A
  113.  
  114. RPC        EQUR    a6    ;PC (32-Bit Amiga-Adresse, untere 16 Bit
  115.                 ;    stimmen mit C64-PC überein)
  116.  
  117.  
  118. **
  119. ** CIAs zurücksetzen
  120. **
  121.  
  122. ; CIA-A
  123. Reset6526    lea    Registers1,a0
  124.         clr.l    (a0)
  125.         clr.l    4(a0)
  126.         clr.l    8(a0)
  127.         clr.l    12(a0)
  128.         move.w    #-1,TAHI(a0)        ;Timer auf -1
  129.         move.w    #-1,TBHI(a0)
  130.  
  131.         move.w    #$0001,LTCHA(a0)    ;Latches auf 1
  132.         move.w    #$0001,LTCHB(a0)
  133.         clr.b    INTMASK(a0)        ;Interrupts abschalten
  134.         clr.b    TODHALT(a0)        ;TOD läuft
  135.         clr.l    ALM10THS(a0)        ;Alarmzeit auf 00:00:00.0
  136.         clr.w    TACNTPHI2(a0)        ;Beide Timer anhalten
  137.         clr.b    TBCNTTA(a0)
  138.  
  139.         move.b    #$ff,Joystick1        ;Joystick inaktiv
  140.         move.b    #$ff,Joystick2
  141.         move.b    #$ff,Joystick2Key
  142.  
  143. ; CIA-B
  144.         lea    Registers2,a0
  145.         clr.l    (a0)
  146.         clr.l    4(a0)
  147.         clr.l    8(a0)
  148.         clr.l    12(a0)
  149.         move.w    #-1,TAHI(a0)        ;Timer auf -1
  150.         move.w    #-1,TBHI(a0)
  151.  
  152.         move.w    #$0001,LTCHA(a0)    ;Latches auf 1
  153.         move.w    #$0001,LTCHB(a0)
  154.         clr.b    INTMASK(a0)        ;Interrupts abschalten
  155.         clr.b    TODHALT(a0)        ;TOD läuft
  156.         clr.l    ALM10THS(a0)        ;Alarmzeit auf 00:00:00.0
  157.         clr.w    TACNTPHI2(a0)        ;Beide Timer anhalten
  158.         clr.b    TBCNTTA(a0)
  159.  
  160. ; Tastaturmatrix löschen
  161.         moveq    #-1,d0
  162.         move.l    d0,KeyMatrix
  163.         move.l    d0,KeyMatrix+4
  164.         move.l    d0,InvKeyMatrix
  165.         move.l    d0,InvKeyMatrix+4
  166.  
  167. ; VIC-Bank 0 einstellen
  168.         moveq    #0,d0
  169.         bra    ChangedVA
  170.  
  171.  
  172. **
  173. ** CIA-Status in Datenstruktur schreiben
  174. **
  175.  
  176. _GetCIA1Dump    lea    Registers1,a0
  177.         bra    GetCIADump
  178.  
  179. _GetCIA2Dump    lea    Registers2,a0
  180.  
  181. GetCIADump    move.l    4(sp),a1
  182.         move.l    (a0),(a1)+
  183.         move.b    TALO(a0),(a1)+    ;Wegen umgekehrter Bytefolge
  184.         move.b    TAHI(a0),(a1)+
  185.         move.b    TBLO(a0),(a1)+
  186.         move.b    TBHI(a0),(a1)+
  187.         move.l    TOD10THS(a0),(a1)+
  188.         move.l    SDR(a0),(a1)+
  189.  
  190.         move.b    LTCHA+1(a0),(a1)+
  191.         move.b    LTCHA(a0),(a1)+
  192.         move.b    LTCHB+1(a0),(a1)+
  193.         move.b    LTCHB(a0),(a1)+
  194.         move.l    ALM10THS(a0),(a1)+
  195.         move.b    INTMASK(a0),(a1)
  196.         rts
  197.  
  198.  
  199. **
  200. ** Tastaturbelegung geändert, Y und Z sortieren
  201. **
  202.  
  203. ChangedKeys    tst.w    KeyboardYZ
  204.         bne    1$
  205.         move.l    #$00010004,KeyPatch1
  206.         move.l    #$00030001,KeyPatch2
  207.         rts
  208. 1$        move.l    #$00030001,KeyPatch1
  209.         move.l    #$00010004,KeyPatch2
  210.         rts
  211.  
  212.  
  213. **
  214. ** In ein CIA-A-Register schreiben
  215. ** d0.w: Registernummer ($00-$0f)
  216. ** d1.b: Byte
  217. **
  218. ** Darf das obere Wort von d0 und d1 nicht verändern!
  219. **
  220.  
  221. WriteTo6526A    lea    Registers1,a0
  222.         move.l    WriteTabA(pc,d0.w*4),a1
  223.         jmp    (a1)
  224.  
  225.         CNOP    0,4
  226. WriteTabA    dc.l    WrNormal
  227.         dc.l    WrNormal
  228.         dc.l    WrNormal
  229.         dc.l    WrNormal
  230.         dc.l    WrTALO
  231.         dc.l    WrTAHI
  232.         dc.l    WrTBLO
  233.         dc.l    WrTBHI
  234.         dc.l    WrTOD10THS
  235.         dc.l    WrTODSEC
  236.         dc.l    WrTODMIN
  237.         dc.l    WrTODHR
  238.         dc.l    WrASDR
  239.         dc.l    WrAICR
  240.         dc.l    WrCRA
  241.         dc.l    WrCRB
  242.  
  243. WrNormal    move.b    d1,(a0,d0.w)
  244.         rts
  245.  
  246. WrTALO        move.b    d1,LTCHA+1(a0)
  247.         rts
  248.  
  249. WrTAHI        move.b    d1,LTCHA(a0)
  250.         btst    #0,CRA(a0)        ;Timer A gestoppt?
  251.         bne    1$
  252.         move.w    LTCHA(a0),TAHI(a0)    ;Ja, Timer laden
  253. 1$        rts
  254.  
  255. WrTBLO        move.b    d1,LTCHB+1(a0)
  256.         rts
  257.  
  258. WrTBHI        move.b    d1,LTCHB(a0)
  259.         btst    #0,CRB(a0)        ;Timer B gestoppt?
  260.         bne    1$
  261.         move.w    LTCHB(a0),TBHI(a0)    ;Ja, Timer laden
  262. 1$        rts
  263.  
  264. WrTOD10THS    and.b    #$0f,d1
  265.         clr.b    TODHALT(a0)        ;TOD weiterlaufen lassen
  266.         btst    #7,CRB(a0)        ;Alarm-Zeit schreiben?
  267.         bne    1$
  268.         move.b    d1,TOD10THS(a0)
  269.         rts
  270. 1$        move.b    d1,ALM10THS(a0)
  271.         rts
  272.  
  273. WrTODSEC    and.b    #$7f,d1
  274.         btst    #7,CRB(a0)        ;Alarm-Zeit schreiben?
  275.         bne    1$
  276.         move.b    d1,TODSEC(a0)
  277.         rts
  278. 1$        move.b    d1,ALMSEC(a0)
  279.         rts
  280.  
  281. WrTODMIN    and.b    #$7f,d1
  282.         btst    #7,CRB(a0)        ;Alarm-Zeit schreiben?
  283.         bne    1$
  284.         move.b    d1,TODMIN(a0)
  285.         rts
  286. 1$        move.b    d1,ALMMIN(a0)
  287.         rts
  288.  
  289. WrTODHR        and.b    #$9f,d1
  290.         st.b    TODHALT(a0)        ;TOD anhalten
  291.         btst    #7,CRB(a0)        ;Alarm-Zeit schreiben?
  292.         bne    1$
  293.         move.b    d1,TODHR(a0)
  294.         rts
  295. 1$        move.b    d1,ALMHR(a0)
  296.         rts
  297.  
  298. WrASDR        move.b    d1,SDR(a0)
  299.         or.b    #$08,ICR(a0)        ;SDR-Interrupt auslösen
  300.         btst    #3,INTMASK(a0)
  301.         beq    1$
  302.         or.b    #$80,ICR(a0)
  303.         st.b    IntIsCIAIRQ
  304. 1$        rts
  305.  
  306. WrAICR        move.b    -3(RPC),d0        ;Opcode lesen
  307.         cmp.b    #$9d,d0            ;STA Abs,X
  308.         beq    11$
  309.         cmp.b    #$99,d0            ;STA Abs,Y
  310.         bne    10$
  311. 11$        clr.b    ICR(a0)            ;IRQ bei indizierter Adressierung löschen
  312.         clr.b    IntIsCIAIRQ
  313.  
  314. 10$        bclr    #7,d1            ;S/C-Bit löschen
  315.         bne    1$            ;War es gesetzt?
  316.         not.b    d1            ;Nein, Bits zum Löschen negieren
  317.         and.b    d1,INTMASK(a0)        ;Und Bits löschen
  318.         bra    2$
  319. 1$        or.b    d1,INTMASK(a0)        ;Bits setzen
  320. 2$
  321.         move.b    ICR(a0),d0        ;Anstehende Interrupts erlaubt?
  322.         and.b    INTMASK(a0),d0
  323.         and.b    #$1f,d0
  324.         beq    3$
  325.         or.b    #$80,ICR(a0)        ;Ja, IRQ auslösen
  326.         st.b    IntIsCIAIRQ
  327. 3$        rts                ;Nein
  328.  
  329. WrCRA        bclr    #4,d1            ;Force load?
  330.         beq    1$
  331.         move.w    LTCHA(a0),TAHI(a0)    ;Ja, Timer laden
  332. 1$        move.b    d1,CRA(a0)
  333.  
  334.         and.b    #$21,d1            ;Läuft der Timer und zählt er Phi2?
  335.         cmp.b    #$01,d1
  336.         seq.b    TACNTPHI2(a0)        ;Ja, Flag setzen
  337.         rts
  338.  
  339. WrCRB        bclr    #4,d1            ;Force load?
  340.         beq    1$
  341.         move.w    LTCHB(a0),TBHI(a0)    ;Ja, Timer laden
  342. 1$        move.b    d1,CRB(a0)
  343.  
  344.         and.b    #$61,d1            ;Läuft der Timer und zählt er Phi2?
  345.         cmp.b    #$01,d1
  346.         seq.b    TBCNTPHI2(a0)        ;Ja, Flag setzen
  347.         cmp.b    #$41,d1            ;Läuft er und zählt Unterläuft von Timer A?
  348.         seq.b    TBCNTTA(a0)        ;Ja, Flag setzen
  349.         rts
  350.  
  351.  
  352. **
  353. ** In ein CIA-B-Register schreiben
  354. ** d0.w: Registernummer ($00-$0f)
  355. ** d1.b: Byte
  356. **
  357. ** Darf das obere Wort von d0 und d1 nicht verändern!
  358. **
  359.  
  360. WriteTo6526B    lea    Registers2,a0
  361.         move.l    WriteTabB(pc,d0.w*4),a1
  362.         jmp    (a1)
  363.  
  364.         CNOP    0,4
  365. WriteTabB    dc.l    WrBPRA
  366.         dc.l    WrNormal
  367.         dc.l    WrBDDRA
  368.         dc.l    WrNormal
  369.         dc.l    WrTALO
  370.         dc.l    WrTAHI
  371.         dc.l    WrTBLO
  372.         dc.l    WrTBHI
  373.         dc.l    WrTOD10THS
  374.         dc.l    WrTODSEC
  375.         dc.l    WrTODMIN
  376.         dc.l    WrTODHR
  377.         dc.l    WrBSDR
  378.         dc.l    WrBICR
  379.         dc.l    WrCRA
  380.         dc.l    WrCRB
  381.  
  382. WrBPRA        move.b    d1,PRA(a0)        ;Floppy/VA
  383.         tst.b    IECIsOpen        ;Wenn IEC aktiv ist, Port setzen
  384.         beq    WrBNewVA
  385.         move.b    d1,_ciaaprb
  386.         bra    WrBNewVA
  387.  
  388. WrBDDRA        move.b    d1,DDRA(a0)        ;Floppy/VA
  389.         tst.b    IECIsOpen        ;Wenn IEC aktiv ist, DDR setzen
  390.         beq    WrBNewVA
  391.         move.b    d1,_ciaaddrb
  392. WrBNewVA    move.b    DDRA(a0),d0        ;VA extrahieren
  393.         not.b    d0
  394.         or.b    PRA(a0),d0
  395.         not.b    d0
  396.         and.b    #$03,d0
  397.         bra    ChangedVA        ;Und dem VIC mitteilen
  398.  
  399. WrBSDR        move.b    d1,SDR(a0)
  400.         or.b    #$08,ICR(a0)        ;SDR-Interrupt auslösen
  401.         btst    #3,INTMASK(a0)
  402.         beq    1$
  403.         or.b    #$80,ICR(a0)
  404.         tst.b    NMIState
  405.         bne    1$
  406.         st.b    NMIState
  407.         st.b    IntIsNMI
  408. 1$        rts
  409.  
  410. WrBICR        move.b    -3(RPC),d0        ;Opcode lesen
  411.         cmp.b    #$9d,d0            ;STA Abs,X
  412.         beq    11$
  413.         cmp.b    #$99,d0            ;STA Abs,Y
  414.         bne    10$
  415. 11$        clr.b    ICR(a0)            ;IRQ bei indizierter Adressierung löschen
  416.         clr.b    NMIState
  417.  
  418. 10$        bclr    #7,d1            ;S/C-Bit löschen
  419.         bne    1$            ;War es gesetzt?
  420.         not.b    d1            ;Nein, Bits zum Löschen negieren
  421.         and.b    d1,INTMASK(a0)        ;Und Bits löschen
  422.         bra    2$
  423. 1$        or.b    d1,INTMASK(a0)        ;Bits setzen
  424. 2$
  425.         move.b    ICR(a0),d0        ;Anstehende Interrupts erlaubt?
  426.         and.b    INTMASK(a0),d0
  427.         and.b    #$1f,d0
  428.         beq    3$
  429.         or.b    #$80,ICR(a0)        ;Ja, NMI auslösen
  430.         tst.b    NMIState
  431.         bne    3$
  432.         st.b    NMIState
  433.         st.b    IntIsNMI
  434. 3$        rts                ;Nein
  435.  
  436.  
  437. **
  438. ** Aus einem CIA-A-Register lesen
  439. ** d0.w: Registernummer ($00-$0f)
  440. ** Rückgabe: d0.b: Byte
  441. **
  442. ** Darf das obere Wort von d0 und d1 nicht verändern!
  443. **
  444.  
  445. ReadFrom6526A    lea    Registers1,a0
  446.         move.l    ReadTabA(pc,d0.w*4),a1
  447.         jmp    (a1)
  448.  
  449.         CNOP    0,4
  450. ReadTabA    dc.l    RdAPRA
  451.         dc.l    RdAPRB
  452.         dc.l    RdANormal
  453.         dc.l    RdANormal
  454.         dc.l    RdATALO
  455.         dc.l    RdATAHI
  456.         dc.l    RdATBLO
  457.         dc.l    RdATBHI
  458.         dc.l    RdATOD10THS
  459.         dc.l    RdANormal
  460.         dc.l    RdANormal
  461.         dc.l    RdATODHR
  462.         dc.l    RdANormal
  463.         dc.l    RdAICR
  464.         dc.l    RdANormal
  465.         dc.l    RdANormal
  466.  
  467. RdANormal    move.b    (a0,d0.w),d0
  468.         rts
  469.  
  470. RdAPRA        lea    InvKeyMatrix,a1
  471.         move.b    DDRB(a0),d1    ;Tastaturabfrage
  472.         not.b    d1
  473.         or.b    PRB(a0),d1
  474.         and.b    Joystick1,d1
  475.         move.b    DDRA(a0),d0
  476.         not.b    d0
  477.         or.b    PRA(a0),d0
  478.  
  479.         lsr.b    #1,d1        ;Alle aktiven Spalten dazuANDen
  480.         bcs    1$
  481.         and.b    (a1),d0
  482. 1$        lsr.b    #1,d1
  483.         bcs    2$
  484.         and.b    1(a1),d0
  485. 2$        lsr.b    #1,d1
  486.         bcs    3$
  487.         and.b    2(a1),d0
  488. 3$        lsr.b    #1,d1
  489.         bcs    4$
  490.         and.b    3(a1),d0
  491. 4$        lsr.b    #1,d1
  492.         bcs    5$
  493.         and.b    4(a1),d0
  494. 5$        lsr.b    #1,d1
  495.         bcs    6$
  496.         and.b    5(a1),d0
  497. 6$        lsr.b    #1,d1
  498.         bcs    7$
  499.         and.b    6(a1),d0
  500. 7$        lsr.b    #1,d1
  501.         bcs    8$
  502.         and.b    7(a1),d0
  503. 8$
  504.         and.b    Joystick2,d0
  505.         rts
  506.  
  507. RdAPRB        lea    KeyMatrix,a1
  508.         move.b    DDRA(a0),d1    ;Tastaturabfrage
  509.         not.b    d1
  510.         or.b    PRA(a0),d1
  511.         and.b    Joystick2,d1
  512.         move.b    DDRB(a0),d0
  513.         not.b    d0
  514.  
  515.         lsr.b    #1,d1        ;Alle aktiven Reihen dazuANDen
  516.         bcs    1$
  517.         and.b    (a1),d0
  518. 1$        lsr.b    #1,d1
  519.         bcs    2$
  520.         and.b    1(a1),d0
  521. 2$        lsr.b    #1,d1
  522.         bcs    3$
  523.         and.b    2(a1),d0
  524. 3$        lsr.b    #1,d1
  525.         bcs    4$
  526.         and.b    3(a1),d0
  527. 4$        lsr.b    #1,d1
  528.         bcs    5$
  529.         and.b    4(a1),d0
  530. 5$        lsr.b    #1,d1
  531.         bcs    6$
  532.         and.b    5(a1),d0
  533. 6$        lsr.b    #1,d1
  534.         bcs    7$
  535.         and.b    6(a1),d0
  536. 7$        lsr.b    #1,d1
  537.         bcs    8$
  538.         and.b    7(a1),d0
  539. 8$
  540.         move.b    PRB(a0),d1
  541.         and.b    DDRB(a0),d1
  542.         or.b    d1,d0
  543.         and.b    Joystick1,d0
  544.         rts
  545.  
  546. RdATALO        move.b    TALO(a0),d0    ;Weil die Timer im Registerfile
  547.         rts            ;als big-endian gespeichert sind
  548.  
  549. RdATAHI        move.b    TAHI(a0),d0
  550.         rts
  551.  
  552. RdATBLO        move.b    TBLO(a0),d0
  553.         rts
  554.  
  555. RdATBHI        move.b    TBHI(a0),d0
  556.         rts
  557.  
  558. RdATOD10THS    move.b    TOD10THS(a0),d0
  559.         clr.b    TODHALT(a0)    ;TOD weiterlaufen lassen
  560.         rts
  561.  
  562. RdATODHR    st.b    TODHALT(a0)    ;TOD anhalten
  563.         move.b    TODHR(a0),d0
  564.         rts
  565.  
  566. RdAICR        move.b    ICR(a0),d0    ;ICR beim Lesen löschen
  567.         clr.b    ICR(a0)
  568.         clr.b    IntIsCIAIRQ    ;IRQ zurücknehmen
  569.         rts
  570.  
  571.  
  572. **
  573. ** Aus einem CIA-B-Register lesen
  574. ** d0.w: Registernummer ($00-$0f)
  575. ** Rückgabe: d0.b: Byte
  576. **
  577. ** Darf das obere Wort von d0 und d1 nicht verändern!
  578. **
  579.  
  580. ReadFrom6526B    lea    Registers2,a0
  581.         move.l    ReadTabB(pc,d0.w*4),a1
  582.         jmp    (a1)
  583.  
  584.         CNOP    0,4
  585. ReadTabB    dc.l    RdBPRA
  586.         dc.l    RdBPRB
  587.         dc.l    RdBNormal
  588.         dc.l    RdBNormal
  589.         dc.l    RdBTALO
  590.         dc.l    RdBTAHI
  591.         dc.l    RdBTBLO
  592.         dc.l    RdBTBHI
  593.         dc.l    RdBTOD10THS
  594.         dc.l    RdBNormal
  595.         dc.l    RdBNormal
  596.         dc.l    RdBTODHR
  597.         dc.l    RdBNormal
  598.         dc.l    RdBICR
  599.         dc.l    RdBNormal
  600.         dc.l    RdBNormal
  601.  
  602. RdBNormal    move.b    (a0,d0.w),d0
  603.         rts
  604.  
  605. RdBPRA        move.b    DDRA(a0),d0    ;Floppy/VA
  606.         not.b    d0
  607.         or.b    PRA(a0),d0
  608.  
  609.         tst.b    IECIsOpen    ;Wenn IEC aktiv ist, davon lesen
  610.         beq    1$
  611.         and.b    #$03,d0
  612.         move.b    _ciaaprb,d1
  613.         and.b    #$fc,d1
  614.         or.b    d1,d0
  615. 1$        rts
  616.  
  617. RdBPRB        move.b    DDRB(a0),d0    ;Userport
  618.         not.b    d0        ;Eingabebits immer 1
  619.         or.b    PRB(a0),d0
  620.         rts
  621.  
  622. RdBTALO        move.b    TALO(a0),d0    ;Weil die Timer im Registerfile
  623.         rts            ;als big-endian gespeichert sind
  624.  
  625. RdBTAHI        move.b    TAHI(a0),d0
  626.         rts
  627.  
  628. RdBTBLO        move.b    TBLO(a0),d0
  629.         rts
  630.  
  631. RdBTBHI        move.b    TBHI(a0),d0
  632.         rts
  633.  
  634. RdBTOD10THS    move.b    TOD10THS(a0),d0
  635.         clr.b    TODHALT(a0)    ;TOD weiterlaufen lassen
  636.         rts
  637.  
  638. RdBTODHR    st.b    TODHALT(a0)    ;TOD anhalten
  639.         move.b    TODHR(a0),d0
  640.         rts
  641.  
  642. RdBICR        move.b    ICR(a0),d0    ;ICR beim Lesen löschen
  643.         clr.b    ICR(a0)
  644.         clr.b    NMIState    ;NMI zurücknehmen
  645.         rts
  646.  
  647.  
  648. **
  649. ** Wird jede Rasterzeile einmal aufgerufen
  650. **
  651.  
  652. *
  653. * CIA-A
  654. * d1: ICR
  655. * d2: INTMASK
  656. * d3: CIACycles
  657. *
  658.  
  659. Periodic6526    lea    Registers1,a0
  660.         move.b    ICR(a0),d1
  661.         move.b    INTMASK(a0),d2
  662.         move.w    CIACycles,d3
  663.  
  664. *
  665. * Timer A
  666. *
  667.  
  668.         tst.b    TACNTPHI2(a0)    ;Wird Phi2 gezählt?
  669.         beq    CiaATADone
  670.  
  671.         sub.w    d3,TAHI(a0)    ;Ja, herabzählen
  672.         bcc    CiaATADone    ;Unterlauf?
  673.  
  674.         or.b    #$01,d1        ;Ja, IRQ-Bit setzen
  675.         btst    #0,d2        ;IRQ freigegeben?
  676.         beq    CiaATANoIRQ
  677.         or.b    #$80,d1        ;Ja, IR-Bit setzen
  678.         st.b    IntIsCIAIRQ    ;und IRQ auslösen
  679.  
  680. CiaATANoIRQ    move.w    LTCHA(a0),TAHI(a0) ;Zähler neu laden
  681.         btst    #3,CRA(a0)    ;One-Shot?
  682.         beq    1$
  683.         and.b    #$fe,CRA(a0)    ;Ja, Zähler stoppen
  684.         clr.b    TACNTPHI2(a0)
  685.  
  686. 1$        tst.b    TBCNTTA(a0)    ;Läuft Timer B und zählt er
  687.         beq    CiaATADone    ; Unterläufe von Timer A?
  688.  
  689.         subq.w    #1,TBHI(a0)    ;Ja, Timer B runterzählen
  690.         bcs    CiaATBUnderflow    ;Untergelaufen?
  691. CiaATADone
  692.  
  693. *
  694. * Timer B
  695. *
  696.  
  697.         tst.b    TBCNTPHI2(a0)    ;Wird Phi2 gezählt?
  698.         beq    CiaATBDone
  699.  
  700.         sub.w    d3,TBHI(a0)    ;Ja, herabzählen
  701.         bcc    CiaATBDone    ;Unterlauf?
  702.  
  703. CiaATBUnderflow    or.b    #$02,d1        ;Ja, IRQ-Bit setzen
  704.         btst    #1,d2        ;IRQ freigegeben?
  705.         beq    CiaATBNoIRQ
  706.         or.b    #$80,d1        ;Ja, IR-Bit setzen
  707.         st.b    IntIsCIAIRQ    ;und IRQ auslösen
  708.  
  709. CiaATBNoIRQ    move.w    LTCHB(a0),TBHI(a0) ;Zähler neu laden
  710.         btst    #3,CRB(a0)    ;One-Shot?
  711.         beq    CiaATBDone
  712.         and.b    #$fe,CRB(a0)    ;Ja, Zähler stoppen
  713.         clr.b    TBCNTPHI2(a0)
  714.         clr.b    TBCNTTA(a0)
  715. CiaATBDone
  716.  
  717. *
  718. * ICR zurückschreiben
  719. *
  720.  
  721.         move.b    d1,ICR(a0)
  722.  
  723. *
  724. * CIA-B
  725. * d1: ICR
  726. * d2: INTMASK
  727. * d3: CIACycles
  728. *
  729.  
  730.         lea    Registers2,a0
  731.         move.b    ICR(a0),d1
  732.         move.b    INTMASK(a0),d2
  733.  
  734. *
  735. * Timer A
  736. *
  737.  
  738.         tst.b    TACNTPHI2(a0)    ;Wird Phi2 gezählt?
  739.         beq    CiaBTADone
  740.  
  741.         sub.w    d3,TAHI(a0)    ;Ja, herabzählen
  742.         bcc    CiaBTADone    ;Unterlauf?
  743.  
  744.         or.b    #$01,d1        ;Ja, IRQ-Bit setzen
  745.         btst    #0,d2        ;IRQ freigegeben?
  746.         beq    CiaBTANoIRQ
  747.         or.b    #$80,d1        ;Ja, IR-Bit setzen
  748.         tst.b    NMIState    ;NMI schon ausgelöst?
  749.         bne    1$
  750.         st.b    NMIState    ;Nein, NMI auslösen
  751.         st.b    IntIsNMI
  752. 1$
  753.  
  754. CiaBTANoIRQ    move.w    LTCHA(a0),TAHI(a0) ;Zähler neu laden
  755.         btst    #3,CRA(a0)    ;One-Shot?
  756.         beq    1$
  757.         and.b    #$fe,CRA(a0)    ;Ja, Zähler stoppen
  758.         clr.b    TACNTPHI2(a0)
  759.  
  760. 1$        tst.b    TBCNTTA(a0)    ;Läuft Timer B und zählt er
  761.         beq    CiaBTADone    ; Unterläufe von Timer A?
  762.  
  763.         subq.w    #1,TBHI(a0)    ;Ja, Timer B runterzählen
  764.         bcs    CiaBTBUnderflow    ;Untergelaufen?
  765. CiaBTADone
  766.  
  767. *
  768. * Timer B
  769. *
  770.  
  771.         tst.b    TBCNTPHI2(a0)    ;Wird Phi2 gezählt?
  772.         beq    CiaBTBDone
  773.  
  774.         sub.w    d3,TBHI(a0)    ;Ja, herabzählen
  775.         bcc    CiaBTBDone    ;Unterlauf?
  776.  
  777. CiaBTBUnderflow    or.b    #$02,d1        ;Ja, IRQ-Bit setzen
  778.         btst    #1,d2        ;IRQ freigegeben?
  779.         beq    CiaBTBNoIRQ
  780.         or.b    #$80,d1        ;Ja, IR-Bit setzen
  781.         tst.b    NMIState    ;NMI schon ausgelöst?
  782.         bne    1$
  783.         st.b    NMIState    ;Nein, NMI auslösen
  784.         st.b    IntIsNMI
  785. 1$
  786.  
  787. CiaBTBNoIRQ    move.w    LTCHB(a0),TBHI(a0) ;Zähler neu laden
  788.         btst    #3,CRB(a0)    ;One-Shot?
  789.         beq    CiaBTBDone
  790.         and.b    #$fe,CRB(a0)    ;Ja, Zähler stoppen
  791.         clr.b    TBCNTPHI2(a0)
  792.         clr.b    TBCNTTA(a0)
  793. CiaBTBDone
  794.  
  795. *
  796. * ICR zurückschreiben
  797. *
  798.  
  799.         move.b    d1,ICR(a0)
  800.  
  801. ; In 6510-Task zurückspringen
  802.         bra    Peri6526Cont
  803.  
  804.  
  805. **
  806. ** TODs zählen
  807. **
  808.  
  809. *
  810. * CIA-A
  811. *
  812.  
  813. CountTODs    lea    Registers1,a0
  814.         subq.b    #1,TODDIV(a0)    ;Frequenzteiler herabzählen
  815.         bpl    CiaATODNop
  816.  
  817.         btst    #7,CRA(a0)    ;Untergelaufen,
  818.         beq    CiaATOD60Hz    ; je nach 50/60Hz-Flag neu laden
  819.         move.b    #4,TODDIV(a0)
  820.         bra    CiaATODLoaded
  821. CiaATOD60Hz    move.b    #5,TODDIV(a0)
  822.  
  823. CiaATODLoaded    move    #0,ccr        ;X löschen
  824.         move.b    #1,d0        ;1/10 Sekunden erhöhen
  825.         move.b    TOD10THS(a0),d1
  826.         abcd    d0,d1
  827.         move.b    d1,TOD10THS(a0)
  828.         cmp.b    #$10,d1        ;Über 10?
  829.         blo    CiaATODDone
  830.  
  831.         clr.b    TOD10THS(a0)    ;Ja, 1/10 Sekunden auf Null setzen
  832.         move    #0,ccr        ;und Sekunden erhöhen
  833.         move.b    #1,d0
  834.         move.b    TODSEC(a0),d1
  835.         abcd    d0,d1
  836.         move.b    d1,TODSEC(a0)
  837.         cmp.b    #$60,d1        ;Über 60?
  838.         blo    CiaATODDone
  839.  
  840.         clr.b    TODSEC(a0)    ;Ja, Sekunden auf Null setzen
  841.         move    #0,ccr        ;und Minuten erhöhen
  842.         move.b    #1,d0
  843.         move.b    TODMIN(a0),d1
  844.         abcd    d0,d1
  845.         move.b    d1,TODMIN(a0)
  846.         cmp.b    #$60,d1        ;Über 60?
  847.         blo    CiaATODDone
  848.  
  849.         clr.b    TODMIN(a0)    ;Ja, Minuten auf Null setzen
  850.         move    #0,ccr        ;und Stunden erhöhen
  851.         move.b    #1,d0
  852.         move.b    TODHR(a0),d1
  853.         and.b    #$1f,d1        ;AM/PM ausmaskieren
  854.         abcd    d0,d1
  855.         and.b    #$80,TODHR(a0)    ;Stunden schreiben, AM/PM lassen
  856.         or.b    d1,TODHR(a0)
  857.  
  858.         cmp.b    #$12,d1        ;Über 12?
  859.         blo    CiaATODDone
  860.  
  861.         and.b    #$80,TODHR(a0)    ;Ja, Stunden auf Null setzen
  862.         eor.b    #$80,TODHR(a0)    ;und AM/PM umdrehen
  863.  
  864. CiaATODDone    move.l    TOD10THS(a0),d0    ;Alarmzeit erreicht?
  865.         cmp.l    ALM10THS(a0),d0
  866.         bne    CiaATODNop
  867.         move.b    ICR(a0),d0    ;Ja, IRQ-Bit setzen
  868.         or.b    #$04,d0
  869.         btst    #2,INTMASK(a0)    ;IRQ freigegeben?
  870.         beq    CiaATODNoIRQ
  871.         or.b    #$80,d0        ;Ja, IR-Bit setzen
  872.         st.b    IntIsCIAIRQ    ;und IRQ auslösen
  873. CiaATODNoIRQ    move.b    d0,ICR(a0)
  874. CiaATODNop
  875.  
  876. *
  877. * CIA-B
  878. *
  879.  
  880.         lea    Registers2,a0
  881.         subq.b    #1,TODDIV(a0)    ;Frequenzteiler herabzählen
  882.         bpl    CiaBTODNop
  883.  
  884.         btst    #7,CRA(a0)    ;Untergelaufen,
  885.         beq    CiaBTOD60Hz    ; je nach 50/60Hz-Flag neu laden
  886.         move.b    #4,TODDIV(a0)
  887.         bra    CiaBTODLoaded
  888. CiaBTOD60Hz    move.b    #5,TODDIV(a0)
  889.  
  890. CiaBTODLoaded    move    #0,ccr        ;X löschen
  891.         move.b    #1,d0        ;1/10 Sekunden erhöhen
  892.         move.b    TOD10THS(a0),d1
  893.         abcd    d0,d1
  894.         move.b    d1,TOD10THS(a0)
  895.         cmp.b    #$10,d1        ;Über 10?
  896.         blo    CiaBTODDone
  897.  
  898.         clr.b    TOD10THS(a0)    ;Ja, 1/10 Sekunden auf Null setzen
  899.         move    #0,ccr        ;und Sekunden erhöhen
  900.         move.b    #1,d0
  901.         move.b    TODSEC(a0),d1
  902.         abcd    d0,d1
  903.         move.b    d1,TODSEC(a0)
  904.         cmp.b    #$60,d1        ;Über 60?
  905.         blo    CiaBTODDone
  906.  
  907.         clr.b    TODSEC(a0)    ;Ja, Sekunden auf Null setzen
  908.         move    #0,ccr        ;und Minuten erhöhen
  909.         move.b    #1,d0
  910.         move.b    TODMIN(a0),d1
  911.         abcd    d0,d1
  912.         move.b    d1,TODMIN(a0)
  913.         cmp.b    #$60,d1        ;Über 60?
  914.         blo    CiaBTODDone
  915.  
  916.         clr.b    TODMIN(a0)    ;Ja, Minuten auf Null setzen
  917.         move    #0,ccr        ;und Stunden erhöhen
  918.         move.b    #1,d0
  919.         move.b    TODHR(a0),d1
  920.         and.b    #$1f,d1        ;AM/PM ausmaskieren
  921.         abcd    d0,d1
  922.         and.b    #$80,TODHR(a0)    ;Stunden schreiben, AM/PM lassen
  923.         or.b    d1,TODHR(a0)
  924.  
  925.         cmp.b    #$12,d1        ;Über 12?
  926.         blo    CiaBTODDone
  927.  
  928.         and.b    #$80,TODHR(a0)    ;Ja, Stunden auf Null setzen
  929.         eor.b    #$80,TODHR(a0)    ;und AM/PM umdrehen
  930.  
  931. CiaBTODDone    move.l    TOD10THS(a0),d0    ;Alarmzeit erreicht?
  932.         cmp.l    ALM10THS(a0),d0
  933.         bne    CiaBTODNop
  934.         move.b    ICR(a0),d0    ;Ja, IRQ-Bit setzen
  935.         or.b    #$04,d0
  936.         btst    #2,INTMASK(a0)    ;IRQ freigegeben?
  937.         beq    CiaBTODNoIRQ
  938.         or.b    #$80,d0        ;Ja, IR-Bit setzen
  939.         tst.b    NMIState    ;NMI schon ausgelöst?
  940.         bne    1$
  941.         st.b    NMIState    ;Nein, NMI auslösen
  942.         st.b    IntIsNMI
  943. 1$
  944. CiaBTODNoIRQ    move.b    d0,ICR(a0)
  945. CiaBTODNop
  946.  
  947. *
  948. * Joystickabfrage
  949. *
  950.  
  951.         lea    Registers1,a0
  952.  
  953. ; Port 1
  954.         move.b    #$ff,d2        ;Vorgabe: Joystick inaktiv
  955.         tst.w    Joystick1On(pc)
  956.         beq    15$
  957.  
  958.         btst    #6,$bfe001    ;Feuerknopf
  959.         bne    11$
  960.         bclr    #4,d2
  961.  
  962. 11$        move.w    $dff00a,d0
  963.         btst    #1,d0        ;Rechts
  964.         beq    12$
  965.         bclr    #3,d2
  966.  
  967. 12$        btst    #9,d0        ;Links
  968.         beq    13$
  969.         bclr    #2,d2
  970.  
  971. 13$        move.w    d0,d1
  972.         add.w    d0,d0
  973.         eor.w    d1,d0
  974.         btst    #1,d0        ;Runter
  975.         beq    14$
  976.         bclr    #1,d2
  977.  
  978. 14$        btst    #9,d0        ;Hoch
  979.         beq    15$
  980.         bclr    #0,d2
  981.  
  982. 15$        move.b    d2,Joystick1
  983.  
  984. ; Port 2
  985.         move.b    Joystick2Key,d2    ;Vorgabe: Zehnerblock-Emulation
  986.         tst.w    Joystick2On(pc)
  987.         beq    25$
  988.  
  989.         btst    #7,$bfe001    ;Feuerknopf
  990.         bne    21$
  991.         bclr    #4,d2
  992.  
  993. 21$        move.w    $dff00c,d0
  994.         btst    #1,d0        ;Rechts
  995.         beq    22$
  996.         bclr    #3,d2
  997.  
  998. 22$        btst    #9,d0        ;Links
  999.         beq    23$
  1000.         bclr    #2,d2
  1001.  
  1002. 23$        move.w    d0,d1
  1003.         add.w    d0,d0
  1004.         eor.w    d1,d0
  1005.         btst    #1,d0        ;Runter
  1006.         beq    24$
  1007.         bclr    #1,d2
  1008.  
  1009. 24$        btst    #9,d0        ;Hoch
  1010.         beq    25$
  1011.         bclr    #0,d2
  1012.  
  1013. 25$        move.b    d2,Joystick2
  1014.  
  1015. ; Joysticks vertauschen?
  1016.         tst.w    JoystickSwap(pc)
  1017.         beq    30$
  1018.         move.b    Joystick1,d0
  1019.         move.b    Joystick2,Joystick1
  1020.         move.b    d0,Joystick2
  1021. 30$        rts
  1022.  
  1023.  
  1024. **
  1025. ** Taste wurde gedrückt
  1026. **
  1027.  
  1028. KeyDown        MACRO
  1029.         bclr    #\1,\2(a0)
  1030.         bclr    #\2,\1(a1)
  1031.         ENDM
  1032.  
  1033. KeyUp        MACRO
  1034.         bset    #\1,\2(a0)
  1035.         bset    #\2,\1(a1)
  1036.         ENDM
  1037.  
  1038. _KeyPressed    move.l    4(sp),d0
  1039.         lea    KeyMatrix,a0
  1040.         lea    InvKeyMatrix,a1
  1041.  
  1042.         bclr    #7,d0                ;KeyUp/KeyDown
  1043.         bne    KeyUp
  1044.  
  1045.         cmp.b    #$40,d0
  1046.         bhs    KeyDownSpecial
  1047.         and.w    #$003f,d0            ;$00..$3f
  1048.  
  1049.         cmp.b    #$0f,d0                ;Joystick-Emulation
  1050.         beq    KeyDownJoyFire
  1051.         cmp.b    #$1d,d0
  1052.         beq    KeyDownJoyDL
  1053.         cmp.b    #$1e,d0
  1054.         beq    KeyDownJoyDown
  1055.         cmp.b    #$1f,d0
  1056.         beq    KeyDownJoyDR
  1057.         cmp.b    #$2d,d0
  1058.         beq    KeyDownJoyLeft
  1059.         cmp.b    #$2e,d0
  1060.         beq    KeyDownJoyFire
  1061.         cmp.b    #$2f,d0
  1062.         beq    KeyDownJoyRight
  1063.         cmp.b    #$3d,d0
  1064.         beq    KeyDownJoyUL
  1065.         cmp.b    #$3e,d0
  1066.         beq    KeyDownJoyUp
  1067.         cmp.b    #$3f,d0
  1068.         beq    KeyDownJoyUR
  1069.  
  1070.         movem.w    KeyTable(pc,d0.w*4),d0/d1
  1071.         bclr    d1,(a0,d0.w)
  1072.         bclr    d0,(a1,d1.w)
  1073.         rts
  1074.  
  1075. KeyUp        cmp.b    #$40,d0
  1076.         bhs    KeyUpSpecial
  1077.         and.w    #$003f,d0            ;$00..$3f
  1078.  
  1079.         cmp.b    #$0f,d0                ;Joystick-Emulation
  1080.         beq    KeyUpJoyFire
  1081.         cmp.b    #$1d,d0
  1082.         beq    KeyUpJoyDL
  1083.         cmp.b    #$1e,d0
  1084.         beq    KeyUpJoyDown
  1085.         cmp.b    #$1f,d0
  1086.         beq    KeyUpJoyDR
  1087.         cmp.b    #$2d,d0
  1088.         beq    KeyUpJoyLeft
  1089.         cmp.b    #$2e,d0
  1090.         beq    KeyUpJoyFire
  1091.         cmp.b    #$2f,d0
  1092.         beq    KeyUpJoyRight
  1093.         cmp.b    #$3d,d0
  1094.         beq    KeyUpJoyUL
  1095.         cmp.b    #$3e,d0
  1096.         beq    KeyUpJoyUp
  1097.         cmp.b    #$3f,d0
  1098.         beq    KeyUpJoyUR
  1099.  
  1100.         movem.w    KeyTable(pc,d0.w*4),d0/d1
  1101.         bset    d1,(a0,d0.w)
  1102.         bset    d0,(a1,d1.w)
  1103. KeyNOP        rts
  1104.  
  1105. KeyDownSpecial    sub.b    #$40,d0
  1106.         cmp.b    #$20,d0
  1107.         bhs    KeyDownMod
  1108.         and.w    #$1f,d0                ;$40..$5f
  1109.         jmp    ([KeyDownSpecTab,pc,d0.w*4])
  1110.  
  1111. KeyDownMod    sub.b    #$20,d0
  1112.         cmp.b    #$08,d0
  1113.         bhs    KeyNOP
  1114.         and.w    #$07,d0                ;$60..$67
  1115.         cmp.w    #$07,d0                ;Amiga rechts ignorieren
  1116.         beq    1$
  1117.         movem.w    KeyModTable(pc,d0.w*4),d0/d1
  1118.         bclr    d1,(a0,d0.w)
  1119.         bclr    d0,(a1,d1.w)
  1120. 1$        rts
  1121.  
  1122. KeyUpSpecial    sub.b    #$40,d0
  1123.         cmp.b    #$20,d0
  1124.         bhs    KeyUpMod
  1125.         and.w    #$1f,d0                ;$40..$5f
  1126.         jmp    ([KeyUpSpecTab,pc,d0.w*4])
  1127.  
  1128. KeyUpMod    sub.b    #$20,d0
  1129.         cmp.b    #$08,d0
  1130.         bhs    KeyNOP
  1131.         and.w    #$07,d0                ;$60..$67
  1132.         cmp.w    #$07,d0                ;Amiga rechts ignorieren
  1133.         beq    1$
  1134.         movem.w    KeyModTable(pc,d0.w*4),d0/d1
  1135.         bset    d1,(a0,d0.w)
  1136.         bset    d0,(a1,d1.w)
  1137. 1$        rts
  1138.  
  1139. KeySpaceD    KeyDown    4,7
  1140.         rts
  1141. KeySpaceU    KeyUp    4,7
  1142.         rts
  1143. KeyBackD    KeyDown    0,0
  1144.         rts
  1145. KeyBackU    KeyUp    0,0
  1146.         rts
  1147. KeyTabD        KeyDown    7,7
  1148.         tst.b    NMIState    ;NMI schon ausgelöst?
  1149.         bne    1$
  1150.         st.b    IntIsNMI    ;Nein, NMI auslösen
  1151. 1$        rts
  1152. KeyTabU        KeyUp    7,7
  1153.         rts
  1154. KeyEnterD
  1155. KeyReturnD    KeyDown    1,0
  1156.         rts
  1157. KeyEnterU
  1158. KeyReturnU    KeyUp    1,0
  1159.         rts
  1160. KeyEscD        KeyDown    7,7
  1161.         rts
  1162. KeyEscU        KeyUp    7,7
  1163.         rts
  1164. KeyDeleteD    KeyDown    3,6
  1165.         rts
  1166. KeyDeleteU    KeyUp    3,6
  1167.         rts
  1168. KeyUpD        KeyDown    4,6
  1169.         KeyDown    7,0
  1170.         rts
  1171. KeyUpU        KeyUp    4,6
  1172.         KeyUp    7,0
  1173.         rts
  1174. KeyDownD    KeyDown    7,0
  1175.         rts
  1176. KeyDownU    KeyUp    7,0
  1177.         rts
  1178. KeyRightD    KeyDown    2,0
  1179.         rts
  1180. KeyRightU    KeyUp    2,0
  1181.         rts
  1182. KeyLeftD    KeyDown    4,6
  1183.         KeyDown    2,0
  1184.         rts
  1185. KeyLeftU    KeyUp    4,6
  1186.         KeyUp    2,0
  1187.         rts
  1188. KeyF1D        KeyDown    4,0
  1189.         rts
  1190. KeyF1U        KeyUp    4,0
  1191.         rts
  1192. KeyF3D        KeyDown    5,0
  1193.         rts
  1194. KeyF3U        KeyUp    5,0
  1195.         rts
  1196. KeyF5D        KeyDown    6,0
  1197.         rts
  1198. KeyF5U        KeyUp    6,0
  1199.         rts
  1200. KeyF7D        KeyDown    3,0
  1201.         rts
  1202. KeyF7U        KeyUp    3,0
  1203.         rts
  1204. KeyF2D        KeyDown    4,6
  1205.         KeyDown    4,0
  1206.         rts
  1207. KeyF2U        KeyUp    4,6
  1208.         KeyUp    4,0
  1209.         rts
  1210. KeyF4D        KeyDown    4,6
  1211.         KeyDOwn    5,0
  1212.         rts
  1213. KeyF4U        KeyUp    4,6
  1214.         KeyUp    5,0
  1215.         rts
  1216. KeyF6D        KeyDown    4,6
  1217.         KeyDown    6,0
  1218.         rts
  1219. KeyF6U        KeyUp    4,6
  1220.         KeyUp    6,0
  1221.         rts
  1222. KeyF8D        KeyDown    4,6
  1223.         KeyDown    3,0
  1224.         rts
  1225. KeyF8U        KeyUp    4,6
  1226.         KeyUp    3,0
  1227.         rts
  1228. KeyF9D        tst.b    NMIState    ;NMI schon ausgelöst?
  1229.         bne    1$
  1230.         st.b    IntIsNMI    ;Nein, NMI auslösen
  1231. 1$        rts
  1232. KeyNKAsterD    tst.w    KeyboardYZ
  1233.         bne    1$
  1234.         KeyDown    1,6    ;*
  1235.         rts
  1236. 1$        KeyDown    5,6    ;=
  1237.         rts
  1238. KeyNKAsterU    tst.w    KeyboardYZ
  1239.         bne    1$
  1240.         KeyUp    1,6
  1241.         rts
  1242. 1$        KeyUp    5,6
  1243.         rts
  1244. KeyNKSlashD    tst.w    KeyboardYZ
  1245.         bne    1$
  1246.         KeyDown    7,6    ;/
  1247.         rts
  1248. 1$        KeyDown    6,6    ;^
  1249.         rts
  1250. KeyNKSlashU    tst.w    KeyboardYZ
  1251.         bne    1$
  1252.         KeyUp    7,6
  1253.         rts
  1254. 1$        KeyUp    6,6
  1255.         rts
  1256. KeyNKLeftParD    KeyDown    4,6    ;[
  1257.         KeyDown    5,5
  1258.         rts
  1259. KeyNKLeftParU    KeyUp    4,6
  1260.         KeyUp    5,5
  1261.         rts
  1262. KeyNKRightParD    KeyDown    4,6    ;]
  1263.         KeyDown    2,6
  1264.         rts
  1265. KeyNKRightParU    KeyUp    4,6
  1266.         KeyUp    2,6
  1267.         rts
  1268.  
  1269. ; Joystick-Emulation
  1270. KeyDownJoyUp    bclr    #0,Joystick2Key
  1271.         rts
  1272. KeyDownJoyDown    bclr    #1,Joystick2Key
  1273.         rts
  1274. KeyDownJoyLeft    bclr    #2,Joystick2Key
  1275.         rts
  1276. KeyDownJoyRight    bclr    #3,Joystick2Key
  1277.         rts
  1278. KeyDownJoyUL    bclr    #0,Joystick2Key
  1279.         bclr    #2,Joystick2Key
  1280.         rts
  1281. KeyDownJoyUR    bclr    #0,Joystick2Key
  1282.         bclr    #3,Joystick2Key
  1283.         rts
  1284. KeyDownJoyDL    bclr    #1,Joystick2Key
  1285.         bclr    #2,Joystick2Key
  1286.         rts
  1287. KeyDownJoyDR    bclr    #1,Joystick2Key
  1288.         bclr    #3,Joystick2Key
  1289.         rts
  1290. KeyDownJoyFire    bclr    #4,Joystick2Key
  1291.         rts
  1292.  
  1293. KeyUpJoyUp    bset    #0,Joystick2Key
  1294.         rts
  1295. KeyUpJoyDown    bset    #1,Joystick2Key
  1296.         rts
  1297. KeyUpJoyLeft    bset    #2,Joystick2Key
  1298.         rts
  1299. KeyUpJoyRight    bset    #3,Joystick2Key
  1300.         rts
  1301. KeyUpJoyUL    bset    #0,Joystick2Key
  1302.         bset    #2,Joystick2Key
  1303.         rts
  1304. KeyUpJoyUR    bset    #0,Joystick2Key
  1305.         bset    #3,Joystick2Key
  1306.         rts
  1307. KeyUpJoyDL    bset    #1,Joystick2Key
  1308.         bset    #2,Joystick2Key
  1309.         rts
  1310. KeyUpJoyDR    bset    #1,Joystick2Key
  1311.         bset    #3,Joystick2Key
  1312.         rts
  1313. KeyUpJoyFire    bset    #4,Joystick2Key
  1314.         rts
  1315.  
  1316.  
  1317. **
  1318. ** Datenbereich
  1319. **
  1320.  
  1321.         CNOP    0,4
  1322. Registers1    ds.b    32    ;CIA-A-Register
  1323. Registers2    ds.b    32    ;CIA-B-Register
  1324.  
  1325. CIACycles    dc.w    0    ;Anzahl Phi2-Zyklen pro Rasterzeile (für Timer)
  1326. Joystick1On    dc.w    0    ;Joystick an Port 1 wird abgefragt
  1327. Joystick2On    dc.w    0    ;Joystick an Port 2 wird abgefragt
  1328.         XDEF    _JoystickSwap
  1329. _JoystickSwap
  1330. JoystickSwap    dc.w    0    ;Joysticks vertauschen
  1331. KeyboardYZ    dc.w    0    ;Amerikanische Tastaturbelegung
  1332.  
  1333. Joystick1    dc.b    0    ;Joystick 1 AND-Wert
  1334. Joystick2    dc.b    0    ;Joystick 2 AND-Wert
  1335. Joystick2Key    dc.b    0    ;Joystick 2 AND-Wert für Emulation über Zehnerblock
  1336.  
  1337. ; Tastaturübersetzungstabelle:
  1338. ; Für jeden Amiga-RawKey Spalte und Zeile in der KeyMatrix
  1339.         CNOP    0,4
  1340. KeyTable    dc.w    7,1    ;` -> <-
  1341.         dc.w    7,0    ;1
  1342.         dc.w    7,3    ;2
  1343.         dc.w    1,0    ;3
  1344.         dc.w    1,3    ;4
  1345.         dc.w    2,0    ;5
  1346.         dc.w    2,3    ;6
  1347.         dc.w    3,0    ;7
  1348.         dc.w    3,3    ;8
  1349.         dc.w    4,0    ;9
  1350.         dc.w    4,3    ;0
  1351.         dc.w    5,0    ;ß -> +
  1352.         dc.w    5,3    ;´ -> -
  1353.         dc.w    6,0    ;\ -> £
  1354.         dc.w    0,0
  1355.         dc.w    4,3    ;NP 0
  1356.  
  1357.         dc.w    7,6    ;Q
  1358.         dc.w    1,1    ;W
  1359.         dc.w    1,6    ;E
  1360.         dc.w    2,1    ;R
  1361.         dc.w    2,6    ;T
  1362. KeyPatch1    dc.w    1,4    ;Y -> Z
  1363.         dc.w    3,6    ;U
  1364.         dc.w    4,1    ;I
  1365.         dc.w    4,6    ;O
  1366.         dc.w    5,1    ;P
  1367.         dc.w    5,6    ;ü -> @
  1368.         dc.w    6,1    ;+ -> *
  1369.         dc.w    0,0
  1370.         dc.w    7,0    ;NP 1
  1371.         dc.w    7,3    ;NP 2
  1372.         dc.w    1,0    ;NP 3
  1373.  
  1374.         dc.w    1,2    ;A
  1375.         dc.w    1,5    ;S
  1376.         dc.w    2,2    ;D
  1377.         dc.w    2,5    ;F
  1378.         dc.w    3,2    ;G
  1379.         dc.w    3,5    ;H
  1380.         dc.w    4,2    ;J
  1381.         dc.w    4,5    ;K
  1382.         dc.w    5,2    ;L
  1383.         dc.w    5,5    ;ö -> :
  1384.         dc.w    6,2    ;ä -> ;
  1385.         dc.w    6,5    ;# -> =
  1386.         dc.w    0,0
  1387.         dc.w    1,3    ;NP 4
  1388.         dc.w    2,0    ;NP 5
  1389.         dc.w    2,3    ;NP 6
  1390.  
  1391.         dc.w    6,6    ;< -> ^
  1392. KeyPatch2    dc.w    3,1    ;Z -> Y
  1393.         dc.w    2,7    ;X
  1394.         dc.w    2,4    ;C
  1395.         dc.w    3,7    ;V
  1396.         dc.w    3,4    ;B
  1397.         dc.w    4,7    ;N
  1398.         dc.w    4,4    ;M
  1399.         dc.w    5,7    ;,
  1400.         dc.w    5,4    ;.
  1401.         dc.w    6,7    ;- -> /
  1402.         dc.w    0,0
  1403.         dc.w    5,4    ;NP .
  1404.         dc.w    3,0    ;NP 7
  1405.         dc.w    3,3    ;NP 8
  1406.         dc.w    4,0    ;NP 9
  1407.  
  1408. KeyDownSpecTab    dc.l    KeySpaceD
  1409.         dc.l    KeyBackD
  1410.         dc.l    KeyTabD
  1411.         dc.l    KeyEnterD
  1412.         dc.l    KeyReturnD
  1413.         dc.l    KeyEscD
  1414.         dc.l    KeyDeleteD
  1415.         dc.l    KeyNOP
  1416.  
  1417.         dc.l    KeyNOP
  1418.         dc.l    KeyNOP
  1419.         dc.l    KeyNOP
  1420.         dc.l    KeyNOP
  1421.         dc.l    KeyUpD
  1422.         dc.l    KeyDownD
  1423.         dc.l    KeyRightD
  1424.         dc.l    KeyLeftD
  1425.  
  1426.         dc.l    KeyF1D
  1427.         dc.l    KeyF2D
  1428.         dc.l    KeyF3D
  1429.         dc.l    KeyF4D
  1430.         dc.l    KeyF5D
  1431.         dc.l    KeyF6D
  1432.         dc.l    KeyF7D
  1433.         dc.l    KeyF8D
  1434.  
  1435.         dc.l    KeyF9D
  1436.         dc.l    KeyNOP
  1437.         dc.l    KeyNKLeftParD
  1438.         dc.l    KeyNKRightParD
  1439.         dc.l    KeyNKSlashD
  1440.         dc.l    KeyNKAsterD
  1441.         dc.l    KeyNOP
  1442.         dc.l    KeyNOP
  1443.  
  1444. KeyUpSpecTab    dc.l    KeySpaceU
  1445.         dc.l    KeyBackU
  1446.         dc.l    KeyTabU
  1447.         dc.l    KeyEnterU
  1448.         dc.l    KeyReturnU
  1449.         dc.l    KeyEscU
  1450.         dc.l    KeyDeleteU
  1451.         dc.l    KeyNOP
  1452.  
  1453.         dc.l    KeyNOP
  1454.         dc.l    KeyNOP
  1455.         dc.l    KeyNOP
  1456.         dc.l    KeyNOP
  1457.         dc.l    KeyUpU
  1458.         dc.l    KeyDownU
  1459.         dc.l    KeyRightU
  1460.         dc.l    KeyLeftU
  1461.  
  1462.         dc.l    KeyF1U
  1463.         dc.l    KeyF2U
  1464.         dc.l    KeyF3U
  1465.         dc.l    KeyF4U
  1466.         dc.l    KeyF5U
  1467.         dc.l    KeyF6U
  1468.         dc.l    KeyF7U
  1469.         dc.l    KeyF8U
  1470.  
  1471.         dc.l    KeyNOP
  1472.         dc.l    KeyNOP
  1473.         dc.l    KeyNKLeftParU
  1474.         dc.l    KeyNKRightParU
  1475.         dc.l    KeyNKSlashU
  1476.         dc.l    KeyNKAsterU
  1477.         dc.l    KeyNOP
  1478.         dc.l    KeyNOP
  1479.  
  1480. KeyModTable    dc.w    1,7        ;Shift left
  1481.         dc.w    6,4        ;Shift right
  1482.         dc.w    1,7        ;Caps lock -> Shift left
  1483.         dc.w    7,2        ;Control
  1484.         dc.w    7,5        ;Alt left -> C=
  1485.         dc.w    7,5        ;Alt right -> C=
  1486.         dc.w    7,5        ;Amiga left -> C=
  1487.         dc.w    0,0        ;Amiga right
  1488.  
  1489. ; Bit  7   6   5   4   3   2   1   0
  1490. ; 0   CUD  F5  F3  F1  F7 CLR RET DEL
  1491. ; 1   SHL  E   S   Z   4   A   W   3
  1492. ; 2    X   T   F   C   6   D   R   5
  1493. ; 3    V   U   H   B   8   G   Y   7
  1494. ; 4    N   O   K   M   0   J   I   9
  1495. ; 5    ,   @   :   .   -   L   P   +
  1496. ; 6    /   ^   =  SHR HOM  ;   *   £
  1497. ; 7   R/S  Q   C= SPC  2  CTL  <-  1
  1498.  
  1499. KeyMatrix    ds.b    8    ;C64-Tastaturmatrix pro Taste ein Bit
  1500.                 ;0: Taste gedrückt
  1501. InvKeyMatrix    ds.b    8    ;Gespiegelte Tastaturmatrix
  1502.  
  1503.         END
  1504.