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

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