home *** CD-ROM | disk | FTP | other *** search
/ Aminet 10 / aminetcdnumber101996.iso / Aminet / misc / emu / Frodo.lha / Frodo / src / 6526.asm < prev    next >
Assembly Source File  |  1995-12-10  |  26KB  |  1,415 lines

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