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