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

  1. *
  2. * 6510SC.asm - Einzelzyklus-6510-Emulation
  3. *
  4. * Copyright (C) 1995 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Registerbelegung:
  12. * d5: Von VIC-Emulation benutzt
  13. * d6: Von VIC-Emulation benutzt
  14. * d7: 6510-Programmzähler
  15. * a3: Von VIC-Emulation benutzt
  16. * a4: Zeiger für Near-Adressierung
  17. * a5: Zeiger in C64-RAM, Offset 32K (für Adressierung mit Vorzeichen)
  18. * a6: Zeiger auf die Routine für den nächsten Taktzyklus. Er wird immer
  19. *     am Ende einer Zyklusroutine gesetzt.
  20. *
  21. * Opcode-Ausführung:
  22. *  - Alle Opcodes sind in einzelne Taktzyklen aufgelöst, für jeden
  23. *    Taktzyklus eines Opcodes existiert eine Routine
  24. *  - Die Zyklusroutinen werden vom VIC-Emulator über jsr (CONT)
  25. *    angesprungen, jede Routine setzt diesen Zeiger am Ende auf die
  26. *    nächste Routine
  27. *  - Die Taktzyklen werden von 1 bis 8 gezählt, jede Zyklusroutine
  28. *    enthält die Nummer der Zyklus im Namen getrennt durch einen Punkt
  29. *  - Im ersten Taktzyklus wird immer der Opcode gelesen
  30. *  - In jedem Taktzyklus findet genau ein Speicherzugriff statt
  31. *
  32. * Speicherkonfigurationen:
  33. *
  34. * $01  $a000-$bfff  $d000-$dfff  $e000-$ffff
  35. * -----------------------------------------------
  36. *  0       RAM          RAM          RAM
  37. *  1       RAM       Char-ROM        RAM
  38. *  2       RAM       Char-ROM    Kernal-ROM
  39. *  3    Basic-ROM    Char-ROM    Kernal-ROM
  40. *  4       RAM          RAM          RAM
  41. *  5       RAM          I/O          RAM
  42. *  6       RAM          I/O      Kernal-ROM
  43. *  7    Basic-ROM       I/O      Kernal-ROM
  44. *
  45. * Zugriff auf den C64-Speicher:
  46. *  - Alle Speicherzugriffe laufen über die Read/Write-Makros,
  47. *    es sind keine Abkürzungen erlaubt
  48. *  - Das RAM wird immer über ein 16-Bit-Offset angesprochen (also mit
  49. *    Vorzeichen)
  50. *
  51. * Inkompatibilitäten:
  52. *  - RRA und ISB kennen keinen Dezimalmodus
  53. *  - BRK kann nicht von IRQ/NMI unterbrochen werden
  54. *  - Wenn BA low und AEC high ist, sollte ein Lesezugriff stattfinden
  55. *
  56.  
  57. DEBUG_DETAIL    SET 0
  58. DEBUG_PC    = $0000
  59.  
  60. DE00_COMPATIBLE    SET 1
  61.  
  62.         MACHINE 68020
  63.  
  64.         INCLUDE    "exec/types.i"
  65.         INCLUDE    "exec/macros.i"
  66.         INCLUDE    "dos/dostags.i"
  67.         INCLUDE    "Frodo_rev.i"
  68. CATCOMP_NUMBERS    = 1
  69.         INCLUDE    "LocStrings.i"
  70.         INCLUDE    "debug.i"
  71.  
  72.         XREF    _SysBase
  73.         XREF    _DOSBase
  74.         XREF    _IntuitionBase
  75.  
  76.         XREF    GetString    ;Strings.o
  77.         XREF    TheLocale
  78.  
  79.         XDEF    TheRAM        ;Main.asm
  80.         XDEF    TheBasic
  81.         XDEF    TheKernal
  82.         XDEF    TheChar
  83.         XDEF    TheColor
  84.         XREF    MainTask
  85.         XREF    Random
  86.         XREF    ResetC64
  87.  
  88.         XREF    _InitDisplayFrom6510    ;Display.c
  89.         XREF    _ExitDisplayFrom6510
  90.         XREF    _EmulToBack
  91.         XREF    _EmulToFront
  92.  
  93.         XREF    ReadFrom6526A    ;6526SC.asm
  94.         XREF    ReadFrom6526B
  95.         XREF    WriteTo6526A
  96.         XREF    WriteTo6526B
  97.  
  98.         XREF    Main6569    ;6569SC.asm
  99.         XREF    ReadFrom6569
  100.         XREF    WriteTo6569
  101.     IFNE    DE00_COMPATIBLE
  102.         NREF    LastVICByte
  103.     ENDC
  104.         NREF    CycleCounter
  105.  
  106.         XREF    ReadFrom6581    ;6581.asm
  107.         XREF    WriteTo6581
  108.  
  109.         XREF    IECOut        ;IEC.asm
  110.         XREF    IECOutATN
  111.         XREF    IECOutSec
  112.         XREF    IECIn
  113.         XREF    IECSetATN
  114.         XREF    IECRelATN
  115.         XREF    IECTurnaround
  116.         XREF    IECRelease
  117.  
  118.         XDEF    Init6510
  119.         XDEF    Reset6510
  120.         XDEF    Start6510
  121.         XDEF    Stop6510
  122.         XDEF    _Pause6510
  123.         XDEF    _Resume6510
  124.         XDEF    _SAMReadByte
  125.         XDEF    _SAMWriteByte
  126.         XDEF    Localize6510
  127.         XDEF    IntIsRESET
  128.         XDEF    IntIsNMI
  129.         XDEF    IntIsIRQ
  130.         XDEF    IntIsVICIRQ
  131.         XDEF    IntIsCIAIRQ
  132.         XDEF    FirstIRQCycle
  133.         XDEF    FirstNMICycle
  134.         XDEF    NMIState
  135.         XDEF    BALow
  136.         XDEF    CPUTask
  137.         XDEF    IsFrodoSC
  138.         XDEF    _IsFrodoSC
  139.     IFNE    DEBUG_DETAIL
  140.         XDEF    DEBUGON
  141.     ENDC
  142.  
  143.         NEAR    a4,-2
  144.         XREF    _DATA_BAS_
  145.  
  146.         SECTION    "text",CODE
  147.  
  148.         FAR
  149.  
  150.  
  151. **
  152. ** Definitionen
  153. **
  154.  
  155. ; Registerbelegung
  156. RPC        EQUR    d7    ;PC
  157. RAMPTR        EQUR    a5    ;Zeiger in C64-RAM, Offset 32K (für Adressierung mit Vorzeichen)
  158. CONT        EQUR    a6    ;Zyklusfortsetzungszeiger
  159.  
  160.  
  161. **
  162. ** Emulation vorbereiten (Sprungtabellen aufbauen)
  163. **
  164.  
  165. ; ReadTabs aufbauen
  166. Init6510    lea    ReadTab0,a0        ;Alle mit RAM vorbelegen
  167.         move.w    #256*8-1,d0
  168. 1$        move.l    #ReadByteRAM,(a0)+
  169.         dbra    d0,1$
  170.  
  171.         move.l    #ReadBytePage0,ReadTab0    ;Zeropage immer speziell
  172.         move.l    #ReadBytePage0,ReadTab1
  173.         move.l    #ReadBytePage0,ReadTab2
  174.         move.l    #ReadBytePage0,ReadTab3
  175.         move.l    #ReadBytePage0,ReadTab4
  176.         move.l    #ReadBytePage0,ReadTab5
  177.         move.l    #ReadBytePage0,ReadTab6
  178.         move.l    #ReadBytePage0,ReadTab7
  179.  
  180.         lea    ReadTab3+160*4,a0    ;Basic-ROM
  181.         moveq    #31,d0
  182. 21$        move.l    #ReadByteBasic,(a0)+
  183.         dbra    d0,21$
  184.  
  185.         lea    ReadTab7+160*4,a0
  186.         moveq    #31,d0
  187. 22$        move.l    #ReadByteBasic,(a0)+
  188.         dbra    d0,22$
  189.  
  190.         lea    ReadTab2+224*4,a0    ;Kernal-ROM
  191.         moveq    #31,d0
  192. 31$        move.l    #ReadByteKernal,(a0)+
  193.         dbra    d0,31$
  194.  
  195.         lea    ReadTab3+224*4,a0
  196.         moveq    #31,d0
  197. 32$        move.l    #ReadByteKernal,(a0)+
  198.         dbra    d0,32$
  199.  
  200.         lea    ReadTab6+224*4,a0
  201.         moveq    #31,d0
  202. 33$        move.l    #ReadByteKernal,(a0)+
  203.         dbra    d0,33$
  204.  
  205.         lea    ReadTab7+224*4,a0
  206.         moveq    #31,d0
  207. 34$        move.l    #ReadByteKernal,(a0)+
  208.         dbra    d0,34$
  209.  
  210.         lea    ReadTab5+208*4,a0    ;I/O-Bereich
  211.         move.l    #ReadByteVIC,(a0)+
  212.         move.l    #ReadByteVIC,(a0)+
  213.         move.l    #ReadByteVIC,(a0)+
  214.         move.l    #ReadByteVIC,(a0)+
  215.         move.l    #ReadByteSID,(a0)+
  216.         move.l    #ReadByteSID,(a0)+
  217.         move.l    #ReadByteSID,(a0)+
  218.         move.l    #ReadByteSID,(a0)+
  219.         move.l    #ReadByteColor,(a0)+
  220.         move.l    #ReadByteColor,(a0)+
  221.         move.l    #ReadByteColor,(a0)+
  222.         move.l    #ReadByteColor,(a0)+
  223.         move.l    #ReadByteCIA1,(a0)+
  224.         move.l    #ReadByteCIA2,(a0)+
  225.         move.l    #ReadByteUndef,(a0)+
  226.         move.l    #ReadByteUndef,(a0)
  227.  
  228.         lea    ReadTab6+208*4,a0
  229.         move.l    #ReadByteVIC,(a0)+
  230.         move.l    #ReadByteVIC,(a0)+
  231.         move.l    #ReadByteVIC,(a0)+
  232.         move.l    #ReadByteVIC,(a0)+
  233.         move.l    #ReadByteSID,(a0)+
  234.         move.l    #ReadByteSID,(a0)+
  235.         move.l    #ReadByteSID,(a0)+
  236.         move.l    #ReadByteSID,(a0)+
  237.         move.l    #ReadByteColor,(a0)+
  238.         move.l    #ReadByteColor,(a0)+
  239.         move.l    #ReadByteColor,(a0)+
  240.         move.l    #ReadByteColor,(a0)+
  241.         move.l    #ReadByteCIA1,(a0)+
  242.         move.l    #ReadByteCIA2,(a0)+
  243.         move.l    #ReadByteUndef,(a0)+
  244.         move.l    #ReadByteUndef,(a0)
  245.  
  246.         lea    ReadTab7+208*4,a0
  247.         move.l    #ReadByteVIC,(a0)+
  248.         move.l    #ReadByteVIC,(a0)+
  249.         move.l    #ReadByteVIC,(a0)+
  250.         move.l    #ReadByteVIC,(a0)+
  251.         move.l    #ReadByteSID,(a0)+
  252.         move.l    #ReadByteSID,(a0)+
  253.         move.l    #ReadByteSID,(a0)+
  254.         move.l    #ReadByteSID,(a0)+
  255.         move.l    #ReadByteColor,(a0)+
  256.         move.l    #ReadByteColor,(a0)+
  257.         move.l    #ReadByteColor,(a0)+
  258.         move.l    #ReadByteColor,(a0)+
  259.         move.l    #ReadByteCIA1,(a0)+
  260.         move.l    #ReadByteCIA2,(a0)+
  261.         move.l    #ReadByteUndef,(a0)+
  262.         move.l    #ReadByteUndef,(a0)
  263.  
  264.         lea    ReadTab1+208*4,a0    ;Char-ROM
  265.         moveq    #15,d0
  266. 41$        move.l    #ReadByteChar,(a0)+
  267.         dbra    d0,41$
  268.  
  269.         lea    ReadTab2+208*4,a0
  270.         moveq    #15,d0
  271. 42$        move.l    #ReadByteChar,(a0)+
  272.         dbra    d0,42$
  273.  
  274.         lea    ReadTab3+208*4,a0
  275.         moveq    #15,d0
  276. 43$        move.l    #ReadByteChar,(a0)+
  277.         dbra    d0,43$
  278.  
  279. ; WriteTabs aufbauen
  280.         lea    WriteTab0,a0        ;Alle mit RAM vorbelegen
  281.         move.w    #256*8-1,d0
  282. 5$        move.l    #WriteByteRAM,(a0)+
  283.         dbra    d0,5$
  284.  
  285.         move.l    #WriteBytePage0,WriteTab0 ;Zeropage immer speziell
  286.         move.l    #WriteBytePage0,WriteTab1
  287.         move.l    #WriteBytePage0,WriteTab2
  288.         move.l    #WriteBytePage0,WriteTab3
  289.         move.l    #WriteBytePage0,WriteTab4
  290.         move.l    #WriteBytePage0,WriteTab5
  291.         move.l    #WriteBytePage0,WriteTab6
  292.         move.l    #WriteBytePage0,WriteTab7
  293.  
  294.         lea    WriteTab5+208*4,a0    ;I/O-Bereich
  295.         move.l    #WriteByteVIC,(a0)+
  296.         move.l    #WriteByteVIC,(a0)+
  297.         move.l    #WriteByteVIC,(a0)+
  298.         move.l    #WriteByteVIC,(a0)+
  299.         move.l    #WriteByteSID,(a0)+
  300.         move.l    #WriteByteSID,(a0)+
  301.         move.l    #WriteByteSID,(a0)+
  302.         move.l    #WriteByteSID,(a0)+
  303.         move.l    #WriteByteColor,(a0)+
  304.         move.l    #WriteByteColor,(a0)+
  305.         move.l    #WriteByteColor,(a0)+
  306.         move.l    #WriteByteColor,(a0)+
  307.         move.l    #WriteByteCIA1,(a0)+
  308.         move.l    #WriteByteCIA2,(a0)+
  309.         move.l    #WriteByteUndef,(a0)+
  310.         move.l    #WriteByteUndef,(a0)
  311.  
  312.         lea    WriteTab6+208*4,a0
  313.         move.l    #WriteByteVIC,(a0)+
  314.         move.l    #WriteByteVIC,(a0)+
  315.         move.l    #WriteByteVIC,(a0)+
  316.         move.l    #WriteByteVIC,(a0)+
  317.         move.l    #WriteByteSID,(a0)+
  318.         move.l    #WriteByteSID,(a0)+
  319.         move.l    #WriteByteSID,(a0)+
  320.         move.l    #WriteByteSID,(a0)+
  321.         move.l    #WriteByteColor,(a0)+
  322.         move.l    #WriteByteColor,(a0)+
  323.         move.l    #WriteByteColor,(a0)+
  324.         move.l    #WriteByteColor,(a0)+
  325.         move.l    #WriteByteCIA1,(a0)+
  326.         move.l    #WriteByteCIA2,(a0)+
  327.         move.l    #WriteByteUndef,(a0)+
  328.         move.l    #WriteByteUndef,(a0)
  329.  
  330.         lea    WriteTab7+208*4,a0
  331.         move.l    #WriteByteVIC,(a0)+
  332.         move.l    #WriteByteVIC,(a0)+
  333.         move.l    #WriteByteVIC,(a0)+
  334.         move.l    #WriteByteVIC,(a0)+
  335.         move.l    #WriteByteSID,(a0)+
  336.         move.l    #WriteByteSID,(a0)+
  337.         move.l    #WriteByteSID,(a0)+
  338.         move.l    #WriteByteSID,(a0)+
  339.         move.l    #WriteByteColor,(a0)+
  340.         move.l    #WriteByteColor,(a0)+
  341.         move.l    #WriteByteColor,(a0)+
  342.         move.l    #WriteByteColor,(a0)+
  343.         move.l    #WriteByteCIA1,(a0)+
  344.         move.l    #WriteByteCIA2,(a0)+
  345.         move.l    #WriteByteUndef,(a0)+
  346.         move.l    #WriteByteUndef,(a0)
  347.         rts
  348.  
  349.  
  350. **
  351. ** 6510 zurücksetzen
  352. **
  353.  
  354. Reset6510    st.b    IntIsRESET
  355.         rts
  356.  
  357.  
  358. **
  359. ** 6510-Task starten
  360. ** Rückgabe: d0#0 = Fehler
  361. **
  362.  
  363. ; Signal einrichten
  364. Start6510    move.l    _SysBase,a6
  365.         moveq    #-1,d0
  366.         JSRLIB    AllocSignal
  367.         move.b    d0,ReadySig
  368.         moveq    #0,d1
  369.         bset    d0,d1
  370.         move.l    d1,ReadySet
  371.  
  372. ; Task starten
  373.         move.l    _DOSBase,a6
  374.         move.l    #ProcTags,d1
  375.         JSRLIB    CreateNewProc
  376.         move.l    d0,CPUProc
  377.         beq    1$
  378.  
  379. ; Auf Signal warten
  380.         move.l    _SysBase,a6
  381.         move.l    ReadySet,d0
  382.         JSRLIB    Wait
  383.         moveq    #0,d0        ;Alles OK
  384.         rts
  385.  
  386. ; Fehler aufgetreten
  387. 1$        moveq    #-1,d0
  388.         rts
  389.  
  390.  
  391. **
  392. ** 6510-Task stoppen
  393. **
  394.  
  395. ; Task stoppen
  396. Stop6510    move.l    _SysBase,a6
  397.         tst.l    CPUProc
  398.         beq    1$
  399.         st    RESETIsEXIT    ;EXIT-Reset auslösen
  400.         st    IntIsRESET
  401.         move.l    ReadySet,d0
  402.         JSRLIB    Wait
  403.  
  404. ; Signal freigeben
  405. 1$        move.b    ReadySig,d0
  406.         JMPLIB    FreeSignal
  407.  
  408.  
  409. **
  410. ** 6510-Task anhalten, Zustand sichern
  411. **
  412.  
  413. _Pause6510    move.l    a6,-(sp)
  414.         move.l    _SysBase,a6
  415.         st    RESETIsPause    ;Pause-Reset auslösen
  416.         st    IntIsRESET
  417.         move.l    ReadySet,d0
  418.         JSRLIB    Wait
  419.         move.l    (sp)+,a6
  420.         rts
  421.  
  422.  
  423. **
  424. ** 6510-Task fortsetzen, Zustand übernehmen
  425. **
  426.  
  427. _Resume6510    move.l    a6,-(sp)
  428.         move.l    _SysBase,a6
  429.         move.l    CPUTask,a1    ;Continue-Signal schicken
  430.         move.l    ContinueSet,d0
  431.         JSRLIB    Signal
  432.         move.l    (sp)+,a6
  433.         rts
  434.  
  435.  
  436. **
  437. ** Byte lesen (für SAM)
  438. **
  439.  
  440. _SAMReadByte    moveq    #0,d0
  441.         move.w    6(sp),d0
  442.         movem.l    d2/a4/RAMPTR,-(sp)
  443.         lea    _DATA_BAS_,a4
  444.         lea    32766(a4),a4
  445.         move.l    TheRAMPTR,RAMPTR
  446.         move.l    d0,d1
  447.         lsr.w    #8,d1
  448.         move.b    _SAMMemConfig,d2
  449.         and.w    #7,d2
  450.         move.l    (ConfigTab,d2.w*8),a0
  451.         move.l    (a0,d1.w*4),a0
  452.         jsr    (a0)
  453.         movem.l    (sp)+,d2/a4/RAMPTR
  454.         rts
  455.  
  456.  
  457. **
  458. ** Byte schreiben (für SAM)
  459. **
  460.  
  461. _SAMWriteByte    moveq    #0,d0
  462.         move.w    6(sp),d0
  463.         move.l    8(sp),d1
  464.         cmp.w    #$d000,d0
  465.         blo    1$
  466.         movem.l    d2/a4/RAMPTR,-(sp)
  467.         lea    _DATA_BAS_,a4
  468.         lea    32766(a4),a4
  469.         move.l    TheRAMPTR,RAMPTR
  470.         move.b    _SAMMemConfig,d2
  471.         and.w    #7,d2
  472.         move.l    (ConfigTab+4,d2.w*8),a0
  473.         move.l    d0,d2
  474.         lsr.w    #8,d2
  475.         move.l    (a0,d2.w*4),a0
  476.         jsr    (a0)
  477.         movem.l    (sp)+,d2/a4/RAMPTR
  478.         rts
  479. 1$        move.l    TheRAMPTR,a0
  480.         move.b    d1,(a0,d0.w)
  481.         rts
  482.  
  483.  
  484. **
  485. ** Strings in Datenstrukturen lokalisieren
  486. **
  487.  
  488. GetStr        MACRO    ;Label
  489.         lea    TheLocale,a0
  490.         move.l    #\1,d0
  491.         jsr    GetString
  492.         ENDM
  493.  
  494. Localize6510    GetStr    MSG_REQTITLE
  495.         move.l    d0,IllegalOpReq+8
  496.  
  497.         GetStr    MSG_REQGADS3
  498.         move.l    d0,IllegalOpReq+16
  499.  
  500.         GetStr    MSG_ILLEGALOP
  501.         move.l    d0,IllegalOpReq+12
  502.         rts
  503.  
  504.  
  505. **
  506. ** 6510-Emulator
  507. **
  508.  
  509.         NEAR
  510.  
  511. *
  512. * Makros
  513. *
  514.  
  515. ; Speicherkonfiguration neu einstellen
  516. NewConfig    MACRO
  517.         move.b    RDDR,d0        ;Zustand der Ausgabepins lesen
  518.         not.b    d0        ;Eingabepins sind 1
  519.         or.b    RPR,d0
  520.         and.w    #7,d0        ;Relevante Bits maskieren
  521.         move.l    (ConfigTab,d0.w*8),RDTAB
  522.         move.l    (ConfigTab+4,d0.w*8),WRTAB
  523.         ENDM
  524.  
  525. ; Abschluß einer Zyklusroutine, Fortsetzungszeiger setzen
  526. Next        MACRO    ;Nächste Routine
  527.         lea    \1,CONT
  528.         rts
  529.         ENDM
  530.  
  531. ; Abschluß eines Opcodes, im nächsten Zyklus neuen Opcode lesen
  532. Last        MACRO
  533.         Next    Fetch
  534.         ENDM
  535.  
  536. ; Anfang eines Opcodes, Zeiger auf ersten Zyklus holen
  537. Execute        MACRO
  538.         ReadPCInc
  539.         and.w    #$00ff,d0
  540.         move.l    (OpcodeTable,d0.w*4),CONT
  541.         rts
  542.         ENDM
  543.  
  544. ; Stackzeiger erhöhen
  545. IncS        MACRO
  546.         addq.b    #1,RS+1
  547.         ENDM
  548.  
  549. ; Stackzeiger erniedrigen
  550. DecS        MACRO
  551.         subq.b    #1,RS+1
  552.         ENDM
  553.  
  554. ; Byte bei (PC) lesen
  555. ReadPC        MACRO    ;[Ziel]
  556.         move.w    RPC,d0
  557.         bsr    ReadByte
  558.     IFGE    NARG-1
  559.         move.b    d0,\1
  560.     ENDC
  561.         ENDM
  562.  
  563. ; Byte bei (PC) lesen und PC inkrementieren
  564. ReadPCInc    MACRO    ;[Ziel]
  565.         move.w    RPC,d0
  566.         bsr    ReadByte
  567.         addq.w    #1,RPC
  568.     IFGE    NARG-1
  569.         move.b    d0,\1
  570.     ENDC
  571.         ENDM
  572.  
  573. ; Byte bei (ADR) lesen
  574. ReadADR        MACRO    ;[Ziel]
  575.         move.w    RADR,d0
  576.         bsr    ReadByte
  577.     IFGE    NARG-1
  578.         move.b    d0,\1
  579.     ENDC
  580.         ENDM
  581.  
  582. ; Byte bei (ADR2) lesen
  583. ReadADR2    MACRO    ;[Ziel]
  584.         move.w    RADR2,d0
  585.         bsr    ReadByte
  586.     IFGE    NARG-1
  587.         move.b    d0,\1
  588.     ENDC
  589.         ENDM
  590.  
  591. ; Byte bei $0100,S lesen
  592. ReadStack    MACRO    ;[Ziel]
  593.         move.w    RS,d0        ;S ist ja 16-Bit, $01xx
  594.         bsr    ReadByte
  595.     IFGE    NARG-1
  596.         move.b    d0,\1
  597.     ENDC
  598.         ENDM
  599.  
  600. ; Status vom Stack holen
  601. PopP        MACRO
  602.         ReadStack
  603.         clr.b    RCCR+1
  604.         tst.b    d0        ;N holen
  605.         bpl    PopPNoN\@
  606.         or.b    #$08,RCCR+1
  607. PopPNoN\@    add.b    d0,d0        ;V holen
  608.         smi    ROVERFLOW
  609.         lsl.b    #3,d0        ;D holen
  610.         smi    RDECIMAL
  611.         add.b    d0,d0        ;I holen
  612.         smi    RINTERRUPT
  613.         add.b    d0,d0        ;Z holen
  614.         bpl    PopPNoZ\@
  615.         or.b    #$04,RCCR+1
  616. PopPNoZ\@    add.b    d0,d0        ;C holen
  617.         smi    RCARRY
  618.         ENDM
  619.  
  620. ; Byte nach (ADR) schreiben
  621. WriteADR    MACRO    ;Quelle
  622.         move.w    RADR,d0
  623.         move.b    \1,d1
  624.         bsr    WriteByte
  625.         ENDM
  626.  
  627. ; Byte nach $0100,S schreiben
  628. WriteStack    MACRO    ;[Quelle]
  629.         move.w    RS,d0
  630.     IFGE    NARG-1
  631.         move.b    \1,d1
  632.     ENDC
  633.         bsr    WriteByte
  634.         ENDM
  635.  
  636. ; Status auf den Stack legen
  637. PushP        MACRO    ;Break-Bit
  638.         moveq    #0,d1
  639.         move.w    RS,d0
  640.         btst    #3,RCCR+1    ;N dazunehmen
  641.         beq    PushPNoN\@
  642.         or.b    #$80,d1
  643. PushPNoN\@    tst.b    ROVERFLOW    ;V dazunehmen
  644.         beq    PushPNoV\@
  645.         or.b    #$40,d1
  646. PushPNoV\@    tst.b    RDECIMAL    ;D dazunehmen
  647.         beq    PushPNoD\@
  648.         or.b    #$08,d1
  649. PushPNoD\@    tst.b    RINTERRUPT    ;I dazunehmen
  650.         beq    PushPNoI\@
  651.         or.b    #$04,d1
  652. PushPNoI\@    btst    #2,RCCR+1    ;Z dazunehmen
  653.         beq    PushPNoZ\@
  654.         or.b    #$02,d1
  655. PushPNoZ\@    tst.b    RCARRY        ;C dazunehmen
  656.         beq    PushPNoC\@
  657.         or.b    #$01,d1
  658. PushPNoC\@    
  659.     IFEQ    \1
  660.         or.b    #$20,d1        ;1 setzen
  661.     ELSE
  662.         or.b    #$30,d1        ;B und 1 setzen
  663.     ENDC
  664.         bsr    WriteByte        
  665.         DecS
  666.         ENDM
  667.  
  668. ; Zyklus 2: Byte über unmittelbare Adressierung lesen
  669. ReadByteImm    MACRO    ;[Ziel]
  670.         ReadPCInc \1
  671.         ENDM
  672.  
  673. ; Zyklus 2: Adresse für Zero-Page-Adressierung nach ADR lesen
  674. ReadAdrZero    MACRO    ;Name des Opcodes
  675.         ReadPCInc RADRL
  676.         clr.b    RADRH
  677.         Next    \1_3
  678. \1_3
  679.         ENDM
  680.  
  681. ; Zyklus 2/3: Byte über Zero-Page-Adressierung lesen
  682. ReadByteZero    MACRO    ;Name des Opcodes, [Ziel]
  683.         ReadAdrZero \1
  684.         ReadADR    \2
  685.         ENDM
  686.  
  687. ; Zyklus 2/3/4: Byte über Zero-Page-Adressierung nach RDBUF lesen und zurückschreiben
  688. ReadRMWZero    MACRO    ;Name des Opcodes
  689.         ReadAdrZero \1
  690.         ReadADR    RDBUF
  691.         Next    \1_4
  692. \1_4        WriteADR RDBUF
  693.         Next    \1_5
  694. \1_5
  695.         ENDM
  696.  
  697. ; Zyklus 2/3: Adresse für X-indizierte Zero-Page-Adressierung nach ADR lesen
  698. ReadAdrZeroX    MACRO    ;Name des Opcodes
  699.         ReadPCInc RADRL
  700.         clr.b    RADRH
  701.         Next    \1_3
  702. \1_3        ReadADR
  703.         move.b    RX,d0
  704.         add.b    d0,RADRL    ;Keine Seitenüberschreitung
  705.         Next    \1_4
  706. \1_4
  707.         ENDM
  708.  
  709. ; Zyklus 2/3/4: Byte über X-indizierte Zero-Page-Adressierung lesen
  710. ReadByteZeroX    MACRO    ;Name des Opcodes, [Ziel]
  711.         ReadAdrZeroX \1
  712.         ReadADR    \2
  713.         ENDM
  714.  
  715. ; Zyklus 2/3/4/5: Byte über X-indizierte Zero-Page-Adressierung nach RDBUF lesen und zurückschreiben
  716. ReadRMWZeroX    MACRO    ;Name des Opcodes
  717.         ReadAdrZeroX \1
  718.         ReadADR    RDBUF
  719.         Next    \1_5
  720. \1_5        WriteADR RDBUF
  721.         Next    \1_6
  722. \1_6
  723.         ENDM
  724.  
  725. ; Zyklus 2/3: Adresse für Y-indizierte Zero-Page-Adressierung nach ADR lesen
  726. ReadAdrZeroY    MACRO    ;Name des Opcodes
  727.         ReadPCInc RADRL
  728.         clr.b    RADRH
  729.         Next    \1_3
  730. \1_3        ReadADR
  731.         move.b    RY,d0
  732.         add.b    d0,RADRL    ;Keine Seitenüberschreitung
  733.         Next    \1_4
  734. \1_4
  735.         ENDM
  736.  
  737. ; Zyklus 2/3/4: Byte über Y-indizierte Zero-Page-Adressierung lesen
  738. ReadByteZeroY    MACRO    ;Name des Opcodes, [Ziel]
  739.         ReadAdrZeroY \1
  740.         ReadADR    \2
  741.         ENDM
  742.  
  743. ; Zyklus 2/3: Adresse für absolute Adressierung nach ADR lesen
  744. ReadAdrAbs    MACRO    ;Name des Opcodes
  745.         ReadPCInc RADRL
  746.         Next    \1_3
  747. \1_3        ReadPCInc RADRH
  748.         Next    \1_4
  749. \1_4
  750.         ENDM
  751.  
  752. ; Zyklus 2/3/4: Byte über absolute Adressierung lesen
  753. ReadByteAbs    MACRO    ;Name des Opcodes, [Ziel]
  754.         ReadAdrAbs \1
  755.         ReadADR    \2
  756.         ENDM
  757.  
  758. ; Zyklus 2/3/4/5: Byte über absolute Adressierung nach RDBUF lesen und zurückschreiben
  759. ReadRMWAbs    MACRO    ;Name des Opcodes
  760.         ReadAdrAbs \1
  761.         ReadADR    RDBUF
  762.         Next    \1_5
  763. \1_5        WriteADR RDBUF
  764.         Next    \1_6
  765. \1_6
  766.         ENDM
  767.  
  768. ; Zyklus 2/3/4: Adresse für X-indizierte absolute Adressierung nach ADR lesen
  769. ;  Kein Extrazyklus bei Seitenüberschreitung
  770. ReadAdrAbsX    MACRO    ;Name des Opcodes
  771.         ReadPCInc RADRL
  772.         Next    \1_3
  773. \1_3        ReadPCInc RADRH
  774.         move.b    RX,d0
  775.         add.b    d0,RADRL
  776.         bcs    \@1$        ;Seitenüberschreitung?
  777.         Next    \1_4a
  778. \@1$        Next    \1_4b
  779. \1_4a        ReadADR            ;Nein, von Adresse lesen
  780.         Next    \1_5
  781. \1_4b        ReadADR            ;Ja, von falscher Adresse lesen
  782.         addq.b    #1,RADRH    ; und Adresse korrigieren
  783.         Next    \1_5
  784. \1_5
  785.         ENDM
  786.  
  787. ; Zyklus 2/3/(4)/5: Byte über X-indizierte absolute Adressierung lesen
  788. ;  Extrazyklus bei Seitenüberschreitung
  789. ReadByteAbsX    MACRO    ;Name des Opcodes, [Ziel]
  790.         ReadPCInc RADRL
  791.         Next    \1_3
  792. \1_3        ReadPCInc RADRH
  793.         move.b    RX,d0
  794.         add.b    d0,RADRL
  795.         bcs    \@1$        ;Seitenüberschreitung?
  796.         Next    \1_5
  797. \@1$        Next    \1_4
  798. \1_4        ReadADR            ;Ja, erst von falscher Adresse lesen
  799.         addq.b    #1,RADRH    ; und Adresse korrigieren
  800.         Next    \1_5
  801. \1_5        ReadADR    \2        ;Byte lesen
  802.         ENDM
  803.  
  804. ; Zyklus 2/3/4/5/6: Byte über X-indizierte absolute Adressierung nach RDBUF lesen und zurückschreiben
  805. ;  Kein Extrazyklus bei Seitenüberschreitung
  806. ReadRMWAbsX    MACRO    ;Name des Opcodes
  807.         ReadAdrAbsX \1
  808.         ReadADR    RDBUF
  809.         Next    \1_6
  810. \1_6        WriteADR RDBUF
  811.         Next    \1_7
  812. \1_7
  813.         ENDM
  814.  
  815. ; Zyklus 2/3/4: Adresse für Y-indizierte absolute Adressierung nach ADR lesen
  816. ;  Kein Extrazyklus bei Seitenüberschreitung
  817. ReadAdrAbsY    MACRO    ;Name des Opcodes
  818.         ReadPCInc RADRL
  819.         Next    \1_3
  820. \1_3        ReadPCInc RADRH
  821.         move.b    RY,d0
  822.         add.b    d0,RADRL
  823.         bcs    \@1$        ;Seitenüberschreitung?
  824.         Next    \1_4a
  825. \@1$        Next    \1_4b
  826. \1_4a        ReadADR            ;Nein, von Adresse lesen (unnötig)
  827.         Next    \1_5
  828. \1_4b        ReadADR            ;Ja, von falscher Adresse lesen
  829.         addq.b    #1,RADRH    ; und Adresse korrigieren
  830.         Next    \1_5
  831. \1_5
  832.         ENDM
  833.  
  834. ; Zyklus 2/3/(4)/5: Byte über Y-indizierte absolute Adressierung lesen
  835. ;  Extrazyklus bei Seitenüberschreitung
  836. ReadByteAbsY    MACRO    ;Name des Opcodes, [Ziel]
  837.         ReadPCInc RADRL
  838.         Next    \1_3
  839. \1_3        ReadPCInc RADRH
  840.         move.b    RY,d0
  841.         add.b    d0,RADRL
  842.         bcs    \@1$        ;Seitenüberschreitung?
  843.         Next    \1_5
  844. \@1$        Next    \1_4
  845. \1_4        ReadADR            ;Ja, erst von falscher Adresse lesen
  846.         addq.b    #1,RADRH    ; und Adresse korrigieren
  847.         Next    \1_5
  848. \1_5        ReadADR    \2        ;Byte lesen
  849.         ENDM
  850.  
  851. ; Zyklus 2/3/4/5/6: Byte über Y-indizierte absolute Adressierung nach RDBUF lesen und zurückschreiben
  852. ;  Kein Extrazyklus bei Seitenüberschreitung
  853. ReadRMWAbsY    MACRO    ;Name des Opcodes
  854.         ReadAdrAbsY \1
  855.         ReadADR    RDBUF
  856.         Next    \1_6
  857. \1_6        WriteADR RDBUF
  858.         Next    \1_7
  859. \1_7
  860.         ENDM
  861.  
  862. ; Zyklus 2/3/4/5: Adresse für indiziert-indirekte Adressierung nach ADR lesen
  863. ReadAdrIndX    MACRO    ;Name des Opcodes
  864.         ReadPCInc RADR2L
  865.         clr.b    RADR2H
  866.         Next    \1_3
  867. \1_3        ReadADR2
  868.         move.b    RX,d0
  869.         add.b    d0,RADR2L
  870.         Next    \1_4
  871. \1_4        ReadADR2 RADRL
  872.         addq.b    #1,RADR2L    ;Keine Seitenüberschreitung
  873.         Next    \1_5
  874. \1_5        ReadADR2 RADRH
  875.         Next    \1_6
  876. \1_6
  877.         ENDM
  878.  
  879. ; Zyklus 2/3/4/5/6: Byte über indiziert-indirekte Adressierung lesen
  880. ReadByteIndX    MACRO    ;Name des Opcodes, [Ziel]
  881.         ReadAdrIndX \1
  882.         ReadADR    \2
  883.         ENDM
  884.  
  885. ; Zyklus 2/3/4/5/6/7: Byte über indiziert-indirekte Adressierung nach RDBUF lesen und zurückschreiben
  886. ReadRMWIndX    MACRO    ;Name des Opcodes
  887.         ReadAdrIndX \1
  888.         ReadADR    RDBUF
  889.         Next    \1_7
  890. \1_7        WriteADR RDBUF
  891.         Next    \1_8
  892. \1_8
  893.         ENDM
  894.  
  895. ; Zyklus 2/3/4/5: Adresse für indirekt-indizierte Adressierung nach ADR lesen
  896. ;  Kein Extrazyklus bei Seitenüberschreitung
  897. ReadAdrIndY    MACRO    ;Name des Opcodes
  898.         ReadPCInc RADR2L
  899.         clr.b    RADR2H
  900.         Next    \1_3
  901. \1_3        ReadADR2 RADRL
  902.         addq.b    #1,RADR2L    ;Keine Seitenüberschreitung
  903.         Next    \1_4
  904. \1_4        ReadADR2 RADRH
  905.         move.b    RY,d0
  906.         add.b    d0,RADRL
  907.         bcs    \@1$        ;Seitenüberschreitung?
  908.         Next    \1_5a
  909. \@1$        Next    \1_5b
  910. \1_5a        ReadADR            ;Nein, von Adresse lesen (unnötig)
  911.         Next    \1_6
  912. \1_5b        ReadADR            ;Ja, von falscher Adresse lesen
  913.         addq.b    #1,RADRH    ; und Adresse korrigieren
  914.         Next    \1_6
  915. \1_6
  916.         ENDM
  917.  
  918. ; Zyklus 2/3/4/(5)/6: Byte über indirekt-indizierte Adressierung lesen
  919. ;  Extrazyklus bei Seitenüberschreitung
  920. ReadByteIndY    MACRO    ;Name des Opcodes, [Ziel]
  921.         ReadPCInc RADR2L
  922.         clr.b    RADR2H
  923.         Next    \1_3
  924. \1_3        ReadADR2 RADRL
  925.         addq.b    #1,RADR2L    ;Keine Seitenüberschreitung
  926.         Next    \1_4
  927. \1_4        ReadADR2 RADRH
  928.         move.b    RY,d0
  929.         add.b    d0,RADRL
  930.         bcs    \@1$        ;Seitenüberschreitung?
  931.         Next    \1_6
  932. \@1$        Next    \1_5
  933. \1_5        ReadADR            ;Ja, erst von falscher Adresse lesen
  934.         addq.b    #1,RADRH    ; und Adresse korrigieren
  935.         Next    \1_6
  936. \1_6        ReadADR    \2        ;Byte lesen
  937.         ENDM
  938.  
  939. ; Zyklus 2/3/4/5/6/7: Byte über indirekt-indizierte Adressierung nach RDBUF lesen und zurückschreiben
  940. ;  Kein Extrazyklus bei Seitenüberschreitung
  941. ReadRMWIndY    MACRO    ;Name des Opcodes
  942.         ReadAdrIndY \1
  943.         ReadADR    RDBUF
  944.         Next    \1_7
  945. \1_7        WriteADR RDBUF
  946.         Next    \1_8
  947. \1_8
  948.         ENDM
  949.  
  950. *
  951. * Byte lesen
  952. *
  953.  
  954. ; Ein Byte von der CPU aus lesen
  955. ; -> d0.w: Adresse
  956. ; <- d0.b: Byte
  957. ReadByte    tst.b    BALow        ;BA low?
  958.         bne    ReadBAIsLow
  959.  
  960.     IFNE    DEBUG_DETAIL
  961.     tst.b    DEBUGON
  962.     beq    1$
  963.     move.l    d0,-(sp)
  964.     bsr    1$
  965.     move.l    (sp)+,d1
  966.     and.l    #$00ff,d0
  967.     and.l    #$ffff,d1
  968.     DPRINTF    "CPU Read %04lx -> #%02lx",d1,d0
  969.     rts
  970. 1$
  971.     ENDC
  972.  
  973.         move.w    d0,d1        ;Nein, Lesezugriff ausführen
  974.         lsr.w    #8,d1
  975.         move.l    RDTAB,a0
  976.         move.l    (a0,d1.w*4),a0
  977.         jmp    (a0)
  978.  
  979. ReadBAIsLow    move.w    d0,HALTADRSTORE    ;Sonst Register retten
  980.         move.l    CONT,HALTCONTSTORE
  981.         move.l    (sp)+,HALTRETADR
  982.     IFNE    DEBUG_DETAIL
  983.     tst.b    DEBUGON
  984.     beq    1$
  985.     DPRINTF    "CPU Halted (RDY 1->0)"
  986. 1$
  987.     ENDC
  988.         Next    ReadCheckBA    ;und in Warteschleife gehen
  989.  
  990. ReadCheckBA    tst.b    BALow        ;Nächster Zyklus: BA immer noch low?
  991.         beq    ReadBADone
  992.     IFNE    DEBUG_DETAIL
  993.     tst.b    DEBUGON
  994.     beq    1$
  995.     DPRINTF    "CPU Halted (RDY 0)"
  996. 1$
  997.     ENDC
  998.         Next    ReadCheckBA    ;Ja, weiter warten
  999.  
  1000. ReadBADone    move.w    HALTADRSTORE,d0    ;Nein, Register wieder holen
  1001.         move.l    HALTCONTSTORE,CONT
  1002.         move.w    d0,d1
  1003.         move.l    HALTRETADR,-(sp)
  1004.  
  1005.     IFNE    DEBUG_DETAIL
  1006.     tst.b    DEBUGON
  1007.     beq    1$
  1008.     move.l    d0,-(sp)
  1009.     bsr    1$
  1010.     move.l    (sp)+,d1
  1011.     and.l    #$00ff,d0
  1012.     and.l    #$ffff,d1
  1013.     DPRINTF    "CPU Read %04lx -> #%02lx",d1,d0
  1014.     rts
  1015. 1$
  1016.     ENDC
  1017.  
  1018.         lsr.w    #8,d1
  1019.         move.l    RDTAB,a0
  1020.         move.l    (a0,d1.w*4),a0
  1021.         jmp    (a0)
  1022.  
  1023. ReadBytePage0    cmp.w    #2,d0
  1024.         bhs    ReadByteRAM
  1025.         tst.w    d0        ;Adresse 0: DDR
  1026.         bne    1$
  1027.         move.b    RDDR,d0
  1028.         rts
  1029. 1$        move.b    RDDR,d0        ;Adresse 1: PR
  1030.         move.b    d0,d1
  1031.         and.b    RPR,d0
  1032.         not.b    d1
  1033.         and.b    #%00010111,d1    ;Eingabepins
  1034.         or.b    d1,d0
  1035.         rts
  1036.  
  1037. ReadByteRAM    move.b    (RAMPTR,d0.w),d0
  1038.         rts
  1039.  
  1040. ReadByteBasic    and.w    #$1fff,d0
  1041.         move.l    TheBasic,a0
  1042.         move.b    (a0,d0.w),d0
  1043.         rts
  1044.  
  1045. ReadByteVIC    and.w    #$3f,d0
  1046.         bra    ReadFrom6569
  1047.  
  1048. ReadByteSID    and.w    #$1f,d0
  1049.         jmp    ReadFrom6581
  1050.  
  1051. ReadByteColor    and.w    #$03ff,d0
  1052.         move.l    TheColor,a0
  1053.         move.b    (a0,d0.w),d0
  1054.         and.b    #$0f,d0
  1055.     IFNE    DE00_COMPATIBLE
  1056.         move.b    LastVICByte,d1    ;Oberes Nibble kommt vom VIC
  1057.         and.b    #$f0,d1
  1058.         or.b    d1,d0
  1059.     ENDC
  1060.         rts
  1061.  
  1062. ReadByteCIA1    and.w    #$0f,d0
  1063.         bra    ReadFrom6526A
  1064.  
  1065. ReadByteCIA2    and.w    #$0f,d0
  1066.         bra    ReadFrom6526B
  1067.  
  1068. ReadByteUndef
  1069.     IFNE    DE00_COMPATIBLE
  1070.         move.b    LastVICByte,d0
  1071.     ELSE
  1072.         move.b    #$aa,d0
  1073.     ENDC
  1074.         rts
  1075.  
  1076. ReadByteKernal    and.w    #$1fff,d0
  1077.         move.l    TheKernal,a0
  1078.         move.b    (a0,d0.w),d0
  1079.         rts
  1080.  
  1081. ReadByteChar    and.w    #$0fff,d0
  1082.         move.l    TheChar,a0
  1083.         move.b    (a0,d0.w),d0
  1084.         rts
  1085.  
  1086.  
  1087. *
  1088. * Byte schreiben
  1089. *
  1090.  
  1091. ; Ein Byte von der CPU aus schreiben
  1092. ; -> d0.w: Adresse
  1093. ; -> d1.b: Byte
  1094. WriteByte
  1095.     IFNE    DEBUG_DETAIL
  1096.     tst.b    DEBUGON
  1097.     beq    1$
  1098.     and.l    #$ffff,d0
  1099.     and.l    #$00ff,d1
  1100.     DPRINTF    "CPU Write #%02lx -> %04lx",d1,d0
  1101. 1$
  1102.     ENDC
  1103.  
  1104.         move.w    d0,d2
  1105.         lsr.w    #8,d2
  1106.         move.l    WRTAB,a0
  1107.         move.l    (a0,d2.w*4),a0
  1108.         jmp    (a0)
  1109.  
  1110. WriteBytePage0    cmp.w    #2,d0
  1111.         bhs    WriteByteRAM
  1112.         tst.w    d0
  1113.         bne    1$
  1114.         move.b    d1,RDDR        ;Adresse 0: DDR
  1115.     IFNE    DE00_COMPATIBLE
  1116.         move.b    LastVICByte,(RAMPTR)
  1117.     ENDC
  1118.         NewConfig
  1119.         rts
  1120. 1$        move.b    d1,RPR        ;Adresse 1: PR
  1121.     IFNE    DE00_COMPATIBLE
  1122.         move.b    LastVICByte,1(RAMPTR)
  1123.     ENDC
  1124.         NewConfig
  1125.         rts
  1126.  
  1127. WriteByteRAM    move.b    d1,(RAMPTR,d0.w)
  1128.         rts
  1129.  
  1130. WriteByteVIC    and.w    #$3f,d0
  1131.         bra    WriteTo6569
  1132.  
  1133. WriteByteSID    and.w    #$1f,d0
  1134.         jmp    WriteTo6581
  1135.  
  1136. WriteByteColor    and.w    #$03ff,d0
  1137.         move.l    TheColor,a0
  1138.         move.b    d1,(a0,d0.w)
  1139.         rts
  1140.  
  1141. WriteByteCIA1    and.w    #$0f,d0
  1142.         bra    WriteTo6526A
  1143.  
  1144. WriteByteCIA2    and.w    #$0f,d0
  1145.         bra    WriteTo6526B
  1146.  
  1147. WriteByteUndef    rts
  1148.  
  1149.  
  1150. *
  1151. * Start
  1152. *
  1153.  
  1154. ; Near-Adressierung initialisieren
  1155. CPUTaskProc    lea    _DATA_BAS_,a4
  1156.         lea    32766(a4),a4
  1157.  
  1158. ; Stackpointer retten
  1159.         move.l    a7,InitialSP
  1160.  
  1161. ; Task ermitteln
  1162.         move.l    _SysBase,a6
  1163.         sub.l    a1,a1
  1164.         JSRLIB    FindTask
  1165.         move.l    d0,CPUTask
  1166.  
  1167. ; Continue-Signal holen
  1168.         moveq    #-1,d0
  1169.         JSRLIB    AllocSignal
  1170.         move.b    d0,ContinueSig
  1171.         moveq    #0,d1
  1172.         bset    d0,d1
  1173.         move.l    d1,ContinueSet
  1174.  
  1175. ; Grafik initialisieren
  1176.         jsr    _InitDisplayFrom6510
  1177.  
  1178. ; Signal an den Emulator schicken
  1179.         move.l    _SysBase,a6
  1180.         move.l    MainTask,a1
  1181.         move.l    ReadySet,d0
  1182.         JSRLIB    Signal
  1183.  
  1184. ; RAM mit Einschaltmuster initialisieren
  1185.         move.l    TheRAM,d0
  1186.         add.l    #$8000,d0
  1187.         move.l    d0,TheRAMPTR
  1188.  
  1189.         move.l    TheRAM,a0
  1190.         move.w    #511,d1
  1191. 3$        moveq    #63,d0
  1192. 1$        clr.b    (a0)+        ;Abwechselnd 64 Bytes $00
  1193.         dbra    d0,1$
  1194.         moveq    #63,d0
  1195. 2$        st    (a0)+        ;Und 64 Bytes $ff
  1196.         dbra    d0,2$
  1197.         dbra    d1,3$
  1198.  
  1199. ; Farb-RAM mit Zufallswerten initialisieren
  1200.         move.l    TheColor,a2
  1201.         move.w    #$03ff,d2
  1202. 4$        jsr    Random
  1203.         move.b    d0,(a2)+
  1204.         dbra    d2,4$
  1205.  
  1206. ; Prozessor initilisieren
  1207.         move.l    TheRAMPTR,RAMPTR
  1208.  
  1209.         clr.l    Interrupt    ;Interrupts aus
  1210.         clr.b    RESETIsEXIT
  1211.         clr.b    RESETIsPause
  1212.         clr.b    NMIState
  1213.  
  1214.         clr.b    RA        ;Register löschen
  1215.         clr.b    RX
  1216.         clr.b    RY
  1217.         move.w    #$01ff,RS
  1218.         clr.w    RCCR
  1219.         st    RINTERRUPT
  1220.         clr.b    RDECIMAL
  1221.         clr.b    RCARRY
  1222.         clr.w    RADR
  1223.  
  1224.         clr.b    RDDR        ;Speicherkonfiguration einstellen
  1225.         clr.b    RPR
  1226.         NewConfig
  1227.  
  1228.         clr.b    BALow
  1229.  
  1230. ; Reset-Vektor lesen, PC setzen und für ersten Befehl vorbereiten
  1231.         move.w    #$fffd,d0
  1232.         bsr    ReadByte
  1233.         move.b    d0,RPC
  1234.         lsl.w    #8,RPC
  1235.         move.w    #$fffc,d0
  1236.         bsr    ReadByte
  1237.         move.b    d0,RPC
  1238.         lea    Fetch,CONT
  1239.  
  1240. ; Ab jetzt kontrolliert der VIC alles
  1241.         bra    Main6569
  1242.  
  1243.  
  1244. *
  1245. * Opcode lesen
  1246. *
  1247.  
  1248. Fetch
  1249.     IFNE    DEBUG_DETAIL
  1250.     cmp.w    #DEBUG_PC,RPC
  1251.     bne    1$
  1252.     st    DEBUGON
  1253. 1$
  1254.     ENDC
  1255.  
  1256.         tst.l    Interrupt
  1257.         bne    HandleInt
  1258.         Execute
  1259.  
  1260.  
  1261. *
  1262. * Ungültiger Opcode
  1263. *
  1264.  
  1265. ; Unbekannten Opcode entdeckt: Requester darstellen
  1266. IllegalOp    movem.l    a2-a6,-(sp)
  1267.  
  1268.         and.w    #$00ff,d0        ;Opcode
  1269.         move.w    d0,RequestStream
  1270.         move.w    RPC,d0        ;und PC anzeigen
  1271.         subq.w    #1,d0
  1272.         move.w    d0,RequestStream+2
  1273.  
  1274.         jsr    _EmulToBack
  1275.  
  1276.         move.l    _IntuitionBase,a6
  1277.         sub.l    a0,a0
  1278.         lea    IllegalOpReq,a1
  1279.         move.l    a0,a2
  1280.         lea    RequestStream,a3
  1281.         JSRLIB    EasyRequestArgs
  1282.  
  1283.         move.l    d0,-(sp)
  1284.         jsr    _EmulToFront
  1285.         move.l    (sp)+,d0
  1286.  
  1287.         movem.l    (sp)+,a2-a6
  1288.  
  1289.         tst.l    d0
  1290.         beq    1$
  1291.         jsr    ResetC64
  1292. 1$        Last
  1293.  
  1294.  
  1295. *
  1296. * Interrupts handhaben
  1297. *
  1298.  
  1299. ; Art des Interrupt feststellen (Priorität)
  1300. HandleInt    tst.b    IntIsRESET
  1301.         bne    HandleRESET
  1302.         tst.b    IntIsNMI
  1303.         bne    HandleNMI
  1304.         tst.w    IntIsIRQ
  1305.         bne    HandleIRQ
  1306.  
  1307. ; Kein Interrupt, Befehl ausführen
  1308. IntDont        Execute
  1309.  
  1310. ; IRQ: Interrupt-Bit testen, nach ($fffe) springen
  1311. HandleIRQ    move.l    CycleCounter,d0    ;IRQ muß seit zwei Zyklen anliegen
  1312.         sub.l    FirstIRQCycle,d0
  1313.         moveq    #2,d1
  1314.         cmp.l    d1,d0
  1315.         blo    IntDont
  1316.         tst.b    RINTERRUPT
  1317.         bne    IntDont
  1318.  
  1319.     IFNE    DEBUG_DETAIL
  1320.     tst.b    DEBUGON
  1321.     beq    1$
  1322.     DPRINTF    "CPU IRQ Sequence"
  1323. 1$
  1324.     ENDC
  1325.  
  1326. IRQ_1        ReadPC
  1327.         Next    IRQ_2
  1328. IRQ_2        ReadPC
  1329.         Next    IRQ_3
  1330. IRQ_3        move.w    RPC,d1
  1331.         lsr.w    #8,d1
  1332.         WriteStack
  1333.         DecS
  1334.         Next    IRQ_4
  1335. IRQ_4        move.b    RPC,d1
  1336.         WriteStack
  1337.         DecS
  1338.         Next    IRQ_5
  1339. IRQ_5        PushP    0        ;B auf 0
  1340.         Next    IRQ_6
  1341. IRQ_6        st    RINTERRUPT
  1342.         move.w    #$fffe,d0    ;IRQ-Vektor
  1343.         bsr    ReadByte
  1344.         move.b    d0,RPC
  1345.         lsl.w    #8,RPC
  1346.         Next    IRQ_7
  1347. IRQ_7        move.w    #$ffff,d0
  1348.         bsr    ReadByte
  1349.         move.b    d0,RPC
  1350.         ror.w    #8,RPC
  1351.         Last
  1352.  
  1353. ; NMI: Nach ($fffa) springen
  1354. HandleNMI    move.l    CycleCounter,d0    ;NMI muß seit zwei Zyklen anliegen
  1355.         sub.l    FirstNMICycle,d0
  1356.         moveq    #2,d1
  1357.         cmp.l    d1,d0
  1358.         blo    IntDont
  1359.  
  1360.         clr.b    IntIsNMI    ;Simuliert einen flankengetriggerten Eingang
  1361.  
  1362.     IFNE    DEBUG_DETAIL
  1363.     tst.b    DEBUGON
  1364.     beq    1$
  1365.     DPRINTF    "CPU NMI Sequence"
  1366. 1$
  1367.     ENDC
  1368.  
  1369. NMI_1        ReadPC
  1370.         Next    NMI_2
  1371. NMI_2        ReadPC
  1372.         Next    NMI_3
  1373. NMI_3        move.w    RPC,d1
  1374.         lsr.w    #8,d1
  1375.         WriteStack
  1376.         DecS
  1377.         Next    NMI_4
  1378. NMI_4        move.b    RPC,d1
  1379.         WriteStack
  1380.         DecS
  1381.         Next    NMI_5
  1382. NMI_5        PushP    0        ;B auf 0
  1383.         Next    NMI_6
  1384. NMI_6        st    RINTERRUPT
  1385.         move.w    #$fffa,d0    ;NMI-Vektor
  1386.         bsr    ReadByte
  1387.         move.b    d0,RPC
  1388.         lsl.w    #8,RPC
  1389.         Next    NMI_7
  1390. NMI_7        move.w    #$fffb,d0
  1391.         bsr    ReadByte
  1392.         move.b    d0,RPC
  1393.         ror.w    #8,RPC
  1394.         Last
  1395.  
  1396. ; RESET: Emulator beenden, anhalten oder nach ($fffc) springen
  1397. HandleRESET    tst.b    RESETIsEXIT    ;Beenden?
  1398.         bne    HandleEXIT
  1399.         tst.b    RESETIsPause    ;Pause?
  1400.         bne    HandlePause
  1401.  
  1402.         clr.l    Interrupt    ;Nein, RESET
  1403.         clr.b    NMIState
  1404.  
  1405.         move.l    TheRAM,a0    ;Adressierung ohne Vorzeichen!
  1406.         cmp.l    #$c3c2cd38,$4(a0) ; $4 ist $8004!
  1407.         bne    1$
  1408.         cmp.b    #$30,$8(a0)
  1409.         bne    1$
  1410.         clr.b    $4(a0)        ;CBM80 löschen, wenn vorhanden
  1411.  
  1412. 1$        clr.b    RDDR        ;Speicherkonfiguration einstellen
  1413.         clr.b    RPR
  1414.         NewConfig
  1415.  
  1416.         move.w    #$fffd,d0    ;RESET-Vektor
  1417.         bsr    ReadByte
  1418.         move.b    d0,RPC
  1419.         lsl.w    #8,RPC
  1420.         move.w    #$fffc,d0
  1421.         bsr    ReadByte
  1422.         move.b    d0,RPC
  1423.         bra    Fetch
  1424.  
  1425. ; EXIT: Signal an den Emulator schicken
  1426. HandleEXIT    jsr    _ExitDisplayFrom6510    ;Grafik aufräumen
  1427.  
  1428.         move.l    _SysBase,a6
  1429.         moveq    #0,d0
  1430.         move.b    ContinueSig,d0
  1431.         JSRLIB    FreeSignal
  1432.  
  1433.         JSRLIB    Forbid
  1434.         move.l    MainTask,a1
  1435.         move.l    ReadySet,d0
  1436.         JSRLIB    Signal
  1437.         move.l    InitialSP,a7
  1438.         moveq    #0,d0
  1439.         rts
  1440.  
  1441. ; Pause: Signal an den Emulator schicken und dann selbst auf
  1442. ;  ein Signal warten
  1443. HandlePause    clr.b    IntIsRESET
  1444.         clr.b    RESETIsPause
  1445.  
  1446.         move.b    RA,_RA        ;Register für SAM bereitstellen
  1447.         move.b    RX,_RX
  1448.         move.b    RY,_RY
  1449.  
  1450.         moveq    #0,d0
  1451.         btst    #3,RCCR+1    ;N dazunehmen
  1452.         beq    1$
  1453.         or.b    #$80,d0
  1454. 1$        tst.b    ROVERFLOW    ;V dazunehmen
  1455.         beq    2$
  1456.         or.b    #$40,d0
  1457. 2$        tst.b    RDECIMAL    ;D dazunehmen
  1458.         beq    3$
  1459.         or.b    #$08,d0
  1460. 3$        tst.b    RINTERRUPT    ;I dazunehmen
  1461.         beq    4$
  1462.         or.b    #$04,d0
  1463. 4$        btst    #2,RCCR+1    ;Z dazunehmen
  1464.         beq    5$
  1465.         or.b    #$02,d0
  1466. 5$        tst.b    RCARRY        ;C dazunehmen
  1467.         beq    6$
  1468.         or.b    #$01,d0
  1469. 6$        move.b    d0,_RP
  1470.  
  1471.         move.b    RDDR,_RDDR
  1472.         move.b    RPR,d0
  1473.         and.b    #$3f,d0
  1474.         move.b    d0,_RPR
  1475.  
  1476.         move.b    RDDR,d0
  1477.         not.b    d0
  1478.         or.b    RPR,d0
  1479.         and.b    #$07,d0
  1480.         move.b    d0,_SAMMemConfig
  1481.  
  1482.         move.w    RPC,_RPC
  1483.         move.w    RS,_RS
  1484.  
  1485.         move.l    a6,-(sp)
  1486.         move.l    _SysBase,a6
  1487.         move.l    MainTask,a1
  1488.         move.l    ReadySet,d0
  1489.         JSRLIB    Signal
  1490.         move.l    ContinueSet,d0
  1491.         JSRLIB    Wait
  1492.         move.l    (sp)+,a6
  1493.  
  1494.         move.b    _RA,RA        ;Register von SAM lesen
  1495.         move.b    _RX,RX
  1496.         move.b    _RY,RY
  1497.  
  1498.         clr.b    RCCR+1
  1499.         move.b    _RP,d0        ;N holen
  1500.         bpl    7$
  1501.         or.b    #$08,RCCR+1
  1502. 7$        add.b    d0,d0        ;V holen
  1503.         smi    ROVERFLOW
  1504.         lsl.b    #3,d0        ;D holen
  1505.         smi    RDECIMAL
  1506.         add.b    d0,d0        ;I holen
  1507.         smi    RINTERRUPT
  1508.         add.b    d0,d0        ;Z holen
  1509.         bpl    8$
  1510.         or.b    #$04,RCCR+1
  1511. 8$        add.b    d0,d0        ;C holen
  1512.         smi    RCARRY
  1513.  
  1514.         move.b    _RDDR,RDDR
  1515.         move.b    _RPR,RPR
  1516.         move.w    _RPC,RPC
  1517.         move.w    _RS,RS
  1518.         move.b    #$01,RS
  1519.         NewConfig
  1520.         bra    Fetch
  1521.  
  1522.  
  1523. **
  1524. ** Opcodes
  1525. **
  1526.  
  1527. *
  1528. * Load-Gruppe
  1529. *
  1530.  
  1531. LoadA        MACRO
  1532.         move.b    d0,RA
  1533.         move    ccr,RCCR
  1534.         Last
  1535.         ENDM
  1536.  
  1537. LDAImm_2    ReadByteImm
  1538.         LoadA
  1539.  
  1540. LDAZero_2    ReadByteZero    LDAZero
  1541.         LoadA
  1542.  
  1543. LDAZeroX_2    ReadByteZeroX    LDAZeroX
  1544.         LoadA
  1545.  
  1546. LDAAbs_2    ReadByteAbs    LDAAbs
  1547.         LoadA
  1548.  
  1549. LDAAbsX_2    ReadByteAbsX    LDAAbsX
  1550.         LoadA
  1551.  
  1552. LDAAbsY_2    ReadByteAbsY    LDAAbsY
  1553.         LoadA
  1554.  
  1555. LDAIndX_2    ReadByteIndX    LDAIndX
  1556.         LoadA
  1557.  
  1558. LDAIndY_2    ReadByteIndY    LDAIndY
  1559.         LoadA
  1560.  
  1561.  
  1562. LoadX        MACRO
  1563.         move.b    d0,RX
  1564.         move    ccr,RCCR
  1565.         Last
  1566.         ENDM
  1567.  
  1568. LDXImm_2    ReadByteImm
  1569.         LoadX
  1570.  
  1571. LDXZero_2    ReadByteZero    LDXZero
  1572.         LoadX
  1573.  
  1574. LDXZeroY_2    ReadByteZeroY    LDXZeroY
  1575.         LoadX
  1576.  
  1577. LDXAbs_2    ReadByteAbs    LDXAbs
  1578.         LoadX
  1579.  
  1580. LDXAbsY_2    ReadByteAbsY    LDXAbsY
  1581.         LoadX
  1582.  
  1583.  
  1584. LoadY        MACRO
  1585.         move.b    d0,RY
  1586.         move    ccr,RCCR
  1587.         Last
  1588.         ENDM
  1589.  
  1590. LDYImm_2    ReadByteImm
  1591.         LoadY
  1592.  
  1593. LDYZero_2    ReadByteZero    LDYZero
  1594.         LoadY
  1595.  
  1596. LDYZeroX_2    ReadByteZeroX    LDYZeroX
  1597.         LoadY
  1598.  
  1599. LDYAbs_2    ReadByteAbs    LDYAbs
  1600.         LoadY
  1601.  
  1602. LDYAbsX_2    ReadByteAbsX    LDYAbsX
  1603.         LoadY
  1604.  
  1605.  
  1606. LoadAX        MACRO
  1607.         move.b    d0,RA
  1608.         move.b    d0,RX
  1609.         move    ccr,RCCR
  1610.         Last
  1611.         ENDM
  1612.  
  1613. LAXZero_2    ReadByteZero    LAXZero
  1614.         LoadAX
  1615.  
  1616. LAXZeroY_2    ReadByteZeroY    LAXZeroY
  1617.         LoadAX
  1618.  
  1619. LAXAbs_2    ReadByteAbs    LAXAbs
  1620.         LoadAX
  1621.  
  1622. LAXAbsY_2    ReadByteAbsY    LAXAbsY
  1623.         LoadAX
  1624.  
  1625.  
  1626. *
  1627. * Store-Gruppe
  1628. *
  1629.  
  1630. StoreA        MACRO
  1631.         WriteADR RA
  1632.         Last
  1633.         ENDM
  1634.  
  1635. STAZero_2    ReadAdrZero    STAZero
  1636.         StoreA
  1637.  
  1638. STAZeroX_2    ReadAdrZeroX    STAZeroX
  1639.         StoreA
  1640.  
  1641. STAAbs_2    ReadAdrAbs    STAAbs
  1642.         StoreA
  1643.  
  1644. STAAbsX_2    ReadAdrAbsX    STAAbsX
  1645.         StoreA
  1646.  
  1647. STAAbsY_2    ReadAdrAbsY    STAAbsY
  1648.         StoreA
  1649.  
  1650. STAIndX_2    ReadAdrIndX    STAIndX
  1651.         StoreA
  1652.  
  1653. STAIndY_2    ReadAdrIndY    STAIndY
  1654.         StoreA
  1655.  
  1656.  
  1657. STXZero_2    ReadAdrZero    STXZero
  1658.         WriteADR RX
  1659.         Last
  1660.  
  1661. STXZeroY_2    ReadAdrZeroY    STXZeroY
  1662.         WriteADR RX
  1663.         Last
  1664.  
  1665. STXAbs_2    ReadAdrAbs    STXAbs
  1666.         WriteADR RX
  1667.         Last
  1668.  
  1669.  
  1670. STYZero_2    ReadAdrZero    STYZero
  1671.         WriteADR RY
  1672.         Last
  1673.  
  1674. STYZeroX_2    ReadAdrZeroX    STYZeroX
  1675.         WriteADR RY
  1676.         Last
  1677.  
  1678. STYAbs_2    ReadAdrAbs    STYAbs
  1679.         WriteADR RY
  1680.         Last
  1681.  
  1682.  
  1683. StoreAX        MACRO
  1684.         move.b    RA,d1
  1685.         move.w    RADR,d0
  1686.         and.b    RX,d1
  1687.         bsr    WriteByte
  1688.         Last
  1689.         ENDM
  1690.  
  1691. SAXZero_2    ReadAdrZero    SAXZero
  1692.         StoreAX
  1693.  
  1694. SAXZeroY_2    ReadAdrZeroY    SAXZeroY
  1695.         StoreAX
  1696.  
  1697. SAXAbs_2    ReadAdrAbs    SAXAbs
  1698.         StoreAX
  1699.  
  1700. SAXIndX_2    ReadAdrIndX    SAXIndX
  1701.         StoreAX
  1702.  
  1703.  
  1704. *
  1705. * Transfer-Gruppe
  1706. *
  1707.  
  1708. TAX_2        ReadPC
  1709.         move.b    RA,RX
  1710.         move    ccr,RCCR
  1711.         Last
  1712.  
  1713. TAY_2        ReadPC
  1714.         move.b    RA,RY
  1715.         move    ccr,RCCR
  1716.         Last
  1717.  
  1718. TXA_2        ReadPC
  1719.         move.b    RX,RA
  1720.         move    ccr,RCCR
  1721.         Last
  1722.  
  1723. TYA_2        ReadPC
  1724.         move.b    RY,RA
  1725.         move    ccr,RCCR
  1726.         Last
  1727.  
  1728. TXS_2        ReadPC
  1729.         move.b    RX,RS+1
  1730.         Last
  1731.  
  1732. TSX_2        ReadPC
  1733.         move.b    RS+1,RX
  1734.         move    ccr,RCCR
  1735.         Last
  1736.  
  1737.  
  1738. *
  1739. * Stack-Gruppe
  1740. *
  1741.  
  1742. PHA_2        ReadPC
  1743.         Next    PHA_3
  1744. PHA_3        WriteStack RA
  1745.         DecS
  1746.         Last
  1747.  
  1748. PLA_2        ReadPC
  1749.         Next    PLA_3
  1750. PLA_3        ReadStack
  1751.         IncS
  1752.         Next    PLA_4
  1753. PLA_4        ReadStack
  1754.         move.b    d0,RA
  1755.         move    ccr,RCCR
  1756.         Last
  1757.  
  1758. PHP_2        ReadPC
  1759.         Next    PHP_3
  1760. PHP_3        PushP    1        ;B immer 1
  1761.         Last
  1762.  
  1763. PLP_2        ReadPC
  1764.         Next    PLP_3
  1765. PLP_3        ReadStack
  1766.         IncS
  1767.         Next    PLP_4
  1768. PLP_4        PopP
  1769.         Last
  1770.  
  1771.  
  1772. *
  1773. * Vergleichs-Gruppe
  1774. *
  1775.  
  1776. CompareA    MACRO
  1777.         move.b    RA,d1
  1778.         cmp.b    d0,d1
  1779.         move    ccr,RCCR
  1780.         scc    RCARRY        ;Inverses Carry holen
  1781.         Last
  1782.         ENDM
  1783.  
  1784. CMPImm_2    ReadByteImm
  1785.         CompareA
  1786.  
  1787. CMPZero_2    ReadByteZero    CMPZero
  1788.         CompareA
  1789.  
  1790. CMPZeroX_2    ReadByteZeroX    CMPZeroX
  1791.         CompareA
  1792.  
  1793. CMPAbs_2    ReadByteAbs    CMPAbs
  1794.         CompareA
  1795.  
  1796. CMPAbsX_2    ReadByteAbsX    CMPAbsX
  1797.         CompareA
  1798.  
  1799. CMPAbsY_2    ReadByteAbsY    CMPAbsY
  1800.         CompareA
  1801.  
  1802. CMPIndX_2    ReadByteIndX    CMPIndX
  1803.         CompareA
  1804.  
  1805. CMPIndY_2    ReadByteIndY    CMPIndY
  1806.         CompareA
  1807.  
  1808.  
  1809. CompareX    MACRO
  1810.         move.b    RX,d1
  1811.         cmp.b    d0,d1
  1812.         move    ccr,RCCR
  1813.         scc    RCARRY        ;Inverses Carry holen
  1814.         Last
  1815.         ENDM
  1816.  
  1817. CPXImm_2    ReadByteImm
  1818.         CompareX
  1819.  
  1820. CPXZero_2    ReadByteZero    CPXZero
  1821.         CompareX
  1822.  
  1823. CPXAbs_2    ReadByteAbs    CPXAbs
  1824.         CompareX
  1825.  
  1826.  
  1827. CompareY    MACRO
  1828.         move.b    RY,d1
  1829.         cmp.b    d0,d1
  1830.         move    ccr,RCCR
  1831.         scc    RCARRY        ;Inverses Carry holen
  1832.         Last
  1833.         ENDM
  1834.  
  1835. CPYImm_2    ReadByteImm
  1836.         CompareY
  1837.  
  1838. CPYZero_2    ReadByteZero    CPYZero
  1839.         CompareY
  1840.  
  1841. CPYAbs_2    ReadByteAbs    CPYAbs
  1842.         CompareY
  1843.  
  1844.  
  1845. *
  1846. * Logik-Gruppe
  1847. *
  1848.  
  1849. AndA        MACRO
  1850.         and.b    d0,RA
  1851.         move    ccr,RCCR
  1852.         Last
  1853.         ENDM
  1854.  
  1855. ANDImm_2    ReadByteImm
  1856.         AndA
  1857.  
  1858. ANDZero_2    ReadByteZero    ANDZero
  1859.         AndA
  1860.  
  1861. ANDZeroX_2    ReadByteZeroX    ANDZeroX
  1862.         AndA
  1863.  
  1864. ANDAbs_2    ReadByteAbs    ANDAbs
  1865.         AndA
  1866.  
  1867. ANDAbsX_2    ReadByteAbsX    ANDAbsX
  1868.         AndA
  1869.  
  1870. ANDAbsY_2    ReadByteAbsY    ANDAbsY
  1871.         AndA
  1872.  
  1873. ANDIndX_2    ReadByteIndX    ANDIndX
  1874.         AndA
  1875.  
  1876. ANDIndY_2    ReadByteIndY    ANDIndY
  1877.         AndA
  1878.  
  1879.  
  1880. OrA        MACRO
  1881.         or.b    d0,RA
  1882.         move    ccr,RCCR
  1883.         Last
  1884.         ENDM
  1885.  
  1886. ORAImm_2    ReadByteImm
  1887.         OrA
  1888.  
  1889. ORAZero_2    ReadByteZero    ORAZero
  1890.         OrA
  1891.  
  1892. ORAZeroX_2    ReadByteZeroX    ORAZeroX
  1893.         OrA
  1894.  
  1895. ORAAbs_2    ReadByteAbs    ORAAbs
  1896.         OrA
  1897.  
  1898. ORAAbsX_2    ReadByteAbsX    ORAAbsX
  1899.         OrA
  1900.  
  1901. ORAAbsY_2    ReadByteAbsY    ORAAbsY
  1902.         OrA
  1903.  
  1904. ORAIndX_2    ReadByteIndX    ORAIndX
  1905.         OrA
  1906.  
  1907. ORAIndY_2    ReadByteIndY    ORAIndY
  1908.         OrA
  1909.  
  1910.  
  1911. EorA        MACRO
  1912.         eor.b    d0,RA
  1913.         move    ccr,RCCR
  1914.         Last
  1915.         ENDM
  1916.  
  1917. EORImm_2    ReadByteImm
  1918.         EorA
  1919.  
  1920. EORZero_2    ReadByteZero    EORZero
  1921.         EorA
  1922.  
  1923. EORZeroX_2    ReadByteZeroX    EORZeroX
  1924.         EorA
  1925.  
  1926. EORAbs_2    ReadByteAbs    EORAbs
  1927.         EorA
  1928.  
  1929. EORAbsX_2    ReadByteAbsX    EORAbsX
  1930.         EorA
  1931.  
  1932. EORAbsY_2    ReadByteAbsY    EORAbsY
  1933.         EorA
  1934.  
  1935. EORIndX_2    ReadByteIndX    EORIndX
  1936.         EorA
  1937.  
  1938. EORIndY_2    ReadByteIndY    EORIndY
  1939.         EorA
  1940.  
  1941.  
  1942. BitTest        MACRO
  1943.         tst.b    d0        ;N holen
  1944.         move    ccr,RCCR
  1945.         btst    #6,d0        ;Bit 6 -> V
  1946.         sne    ROVERFLOW
  1947.         and.b    RA,d0        ;A AND M -> Z
  1948.         beq    BitZ\@
  1949.         and.b    #$fb,RCCR+1
  1950.         Last
  1951. BitZ\@        or.b    #$04,RCCR+1
  1952.         Last
  1953.         ENDM
  1954.  
  1955. BITZero_2    ReadByteZero    BITZero
  1956.         BitTest
  1957.  
  1958. BITAbs_2    ReadByteAbs    BITAbs
  1959.         BitTest
  1960.  
  1961.  
  1962. *
  1963. * Arithmetik-Gruppe
  1964. *
  1965.  
  1966. AdcA        MACRO
  1967.         move.b    RCARRY,d1
  1968.         tst.b    RDECIMAL
  1969.         bne    \@1$
  1970.  
  1971.         add.b    d1,d1        ;Carry -> X
  1972.         move.b    RA,d1
  1973.         addx.b    d0,d1
  1974.         scs    RCARRY        ;Carry holen
  1975.         svs    ROVERFLOW    ;Overflow holen
  1976.         move.b    d1,RA
  1977.         move    ccr,RCCR    ;N und Z holen
  1978.         Last
  1979.  
  1980. \@1$        bsr    AdcDec
  1981.         Last
  1982.         ENDM
  1983.  
  1984. AdcDec        move.b    d0,TMPS        ;Dezimalmodus
  1985.         move.b    RA,d2
  1986.         move.b    d2,TMPA
  1987.  
  1988.         clr.w    RCCR
  1989.         clr.b    ROVERFLOW
  1990.  
  1991.         move.b    d2,d3        ;Unteres Nybble berechnen
  1992.         and.b    #$0f,d0
  1993.         and.b    #$0f,d3
  1994.         add.b    d1,d1        ;Carry -> X
  1995.         addx.b    d0,d3        ; -> d3
  1996.  
  1997.         cmp.b    #10,d3        ;BCD-Fixup für das untere Nybble
  1998.         blo    2$
  1999.         addq.b    #6,d3
  2000. 2$
  2001.         move.b    TMPS,d0        ;Oberes Nybble berechnen
  2002.         lsr.b    #4,d0
  2003.         lsr.b    #4,d2
  2004.         add.b    d0,d2
  2005.         cmp.b    #$10,d3
  2006.         blo    1$
  2007.         addq.b    #1,d2        ; -> d2
  2008. 1$
  2009.         move.b    TMPS,d0        ;Z holen (wie im Binärmodus)
  2010.         move.b    TMPA,d4
  2011.         add.b    d1,d1        ;Carry -> X
  2012.         addx.b    d0,d4
  2013.         tst.b    d4        ;Wegen addx
  2014.         bne    6$
  2015.         or.w    #$04,RCCR
  2016. 6$
  2017.         btst    #3,d2        ;N berechnen
  2018.         beq    4$
  2019.         or.w    #$08,RCCR
  2020. 4$
  2021.         move.b    d2,d0        ;V berechnen
  2022.         lsl.b    #4,d0
  2023.         move.b    TMPA,d1
  2024.         eor.b    d1,d0
  2025.         bpl    5$
  2026.         move.b    TMPS,d0
  2027.         eor.b    d1,d0
  2028.         spl    ROVERFLOW
  2029. 5$
  2030.         cmp.b    #10,d2        ;BCD-Fixup für das obere Nybble
  2031.         blo    3$
  2032.         addq.b    #6,d2
  2033. 3$
  2034.         cmp.b    #$10,d2        ;Carry holen
  2035.         shs    RCARRY
  2036.  
  2037.         and.b    #$0f,d3        ;Ergebnis zusammensetzen
  2038.         lsl.b    #4,d2
  2039.         or.b    d3,d2
  2040.         move.b    d2,RA
  2041.         rts
  2042.  
  2043. ADCImm_2    ReadByteImm
  2044.         AdcA
  2045.  
  2046. ADCZero_2    ReadByteZero    ADCZero
  2047.         AdcA
  2048.  
  2049. ADCZeroX_2    ReadByteZeroX    ADCZeroX
  2050.         AdcA
  2051.  
  2052. ADCAbs_2    ReadByteAbs    ADCAbs
  2053.         AdcA
  2054.  
  2055. ADCAbsX_2    ReadByteAbsX    ADCAbsX
  2056.         AdcA
  2057.  
  2058. ADCAbsY_2    ReadByteAbsY    ADCAbsY
  2059.         AdcA
  2060.  
  2061. ADCIndX_2    ReadByteIndX    ADCIndX
  2062.         AdcA
  2063.  
  2064. ADCIndY_2    ReadByteIndY    ADCIndY
  2065.         AdcA
  2066.  
  2067.  
  2068. SbcA        MACRO
  2069.         move.b    RCARRY,d1
  2070.         not.b    d1
  2071.         tst.b    RDECIMAL
  2072.         bne    \@1$
  2073.  
  2074.         add.b    d1,d1        ;Inverses Carry -> X
  2075.         move.b    RA,d1
  2076.         subx.b    d0,d1
  2077.         scc    RCARRY        ;Inverses Carry holen
  2078.         svs    ROVERFLOW    ;Overflow holen
  2079.         move.b    d1,RA
  2080.         move    ccr,RCCR
  2081.         Last
  2082.  
  2083. \@1$        bsr    SbcDec
  2084.         Last
  2085.         ENDM
  2086.  
  2087. SbcDec        move.b    d0,TMPS        ;Dezimalmodus
  2088.         move.b    RA,d2
  2089.         move.b    d2,TMPA
  2090.  
  2091.         and.b    #$0f,d0        ;Unteres Nybble berechnen
  2092.         and.b    #$0f,d2
  2093.         add.b    d1,d1        ;Inverses Carry -> X
  2094.         subx.b    d0,d2
  2095.         move    ccr,d4
  2096.         bcc    1$        ;BCD-Fixup
  2097.         subq.b    #6,d2
  2098.         st    d4
  2099. 1$        and.b    #$0f,d2
  2100.         move.b    d2,d3        ;-> d3
  2101.  
  2102.         move.b    TMPS,d0        ;Oberes Nybble berechnen
  2103.         move.b    TMPA,d2
  2104.         and.b    #$f0,d0
  2105.         and.b    #$f0,d2
  2106.         sub.b    d0,d2
  2107.         bcc    2$        ;BCD-Fixup
  2108.         and.b    #$f0,d2
  2109.         sub.b    #$60,d2
  2110.         btst    #0,d4
  2111.         beq    4$
  2112.         sub.b    #$10,d2
  2113.         bra    4$
  2114. 2$        and.b    #$f0,d2
  2115.         btst    #0,d4
  2116.         beq    4$
  2117.         sub.b    #$10,d2
  2118.         bcc    4$
  2119.         sub.b    #$60,d2
  2120. 4$        or.b    d3,d2        ;Ergebnis zusammenbauen
  2121.         move.b    d2,RA
  2122.  
  2123.         add.b    d1,d1        ;Inverses Carry -> X
  2124.         move.b    TMPS,d0        ;Flags berechnen (wie im Binärmodus)
  2125.         move.b    TMPA,d1
  2126.         subx.b    d0,d1        ;Flags berechnen
  2127.         scc    RCARRY        ;Inverses Carry holen
  2128.         svs    ROVERFLOW    ;Overflow holen
  2129.         tst.b    d1
  2130.         move    ccr,RCCR    ;N und Z holen
  2131.         rts
  2132.  
  2133. SBCImm_2    ReadByteImm
  2134.         SbcA
  2135.  
  2136. SBCZero_2    ReadByteZero    SBCZero
  2137.         SbcA
  2138.  
  2139. SBCZeroX_2    ReadByteZeroX    SBCZeroX
  2140.         SbcA
  2141.  
  2142. SBCAbs_2    ReadByteAbs    SBCAbs
  2143.         SbcA
  2144.  
  2145. SBCAbsX_2    ReadByteAbsX    SBCAbsX
  2146.         SbcA
  2147.  
  2148. SBCAbsY_2    ReadByteAbsY    SBCAbsY
  2149.         SbcA
  2150.  
  2151. SBCIndX_2    ReadByteIndX    SBCIndX
  2152.         SbcA
  2153.  
  2154. SBCIndY_2    ReadByteIndY    SBCIndY
  2155.         SbcA
  2156.  
  2157.  
  2158. *
  2159. * Inkrement/Dekrement-Gruppe
  2160. *
  2161.  
  2162. Increment    MACRO
  2163.         move.b    RDBUF,d1
  2164.         move.w    RADR,d0
  2165.         addq.b    #1,d1
  2166.         move    ccr,RCCR
  2167.         bsr    WriteByte
  2168.         Last
  2169.         ENDM
  2170.  
  2171. INCZero_2    ReadRMWZero    INCZero
  2172.         Increment
  2173.  
  2174. INCZeroX_2    ReadRMWZeroX    INCZeroX
  2175.         Increment
  2176.  
  2177. INCAbs_2    ReadRMWAbs    INCAbs
  2178.         Increment
  2179.  
  2180. INCAbsX_2    ReadRMWAbsX    INCAbsX
  2181.         Increment
  2182.  
  2183.  
  2184. Decrement    MACRO
  2185.         move.b    RDBUF,d1
  2186.         move.w    RADR,d0
  2187.         subq.b    #1,d1
  2188.         move    ccr,RCCR
  2189.         bsr    WriteByte
  2190.         Last
  2191.         ENDM
  2192.  
  2193. DECZero_2    ReadRMWZero    DECZero
  2194.         Decrement
  2195.  
  2196. DECZeroX_2    ReadRMWZeroX    DECZeroX
  2197.         Decrement
  2198.  
  2199. DECAbs_2    ReadRMWAbs    DECAbs
  2200.         Decrement
  2201.  
  2202. DECAbsX_2    ReadRMWAbsX    DECAbsX
  2203.         Decrement
  2204.  
  2205.  
  2206. INX_2        ReadPC
  2207.         addq.b    #1,RX
  2208.         move    ccr,RCCR
  2209.         Last
  2210.  
  2211. INY_2        ReadPC
  2212.         addq.b    #1,RY
  2213.         move    ccr,RCCR
  2214.         Last
  2215.  
  2216. DEX_2        ReadPC
  2217.         subq.b    #1,RX
  2218.         move    ccr,RCCR
  2219.         Last
  2220.  
  2221. DEY_2        ReadPC
  2222.         subq.b    #1,RY
  2223.         move    ccr,RCCR
  2224.         Last
  2225.  
  2226.  
  2227. *
  2228. * Schiebe-/Rotations-Gruppe
  2229. *
  2230.  
  2231. ShiftLeft    MACRO
  2232.         move.b    RDBUF,d1
  2233.         move.w    RADR,d0
  2234.         add.b    d1,d1
  2235.         move    ccr,RCCR
  2236.         scs    RCARRY        ;Carry holen
  2237.         bsr    WriteByte
  2238.         Last
  2239.         ENDM
  2240.  
  2241. ASLA_2        ReadPC
  2242.         move.b    RA,d0
  2243.         add.b    d0,d0
  2244.         move    ccr,RCCR
  2245.         scs    RCARRY        ;Carry holen
  2246.         move.b    d0,RA
  2247.         Last
  2248.  
  2249. ASLZero_2    ReadRMWZero    ASLZero
  2250.         ShiftLeft
  2251.  
  2252. ASLZeroX_2    ReadRMWZeroX    ASLZeroX
  2253.         ShiftLeft
  2254.  
  2255. ASLAbs_2    ReadRMWAbs    ASLAbs
  2256.         ShiftLeft
  2257.  
  2258. ASLAbsX_2    ReadRMWAbsX    ASLAbsX
  2259.         ShiftLeft
  2260.  
  2261.  
  2262. ShiftRight    MACRO
  2263.         move.b    RDBUF,d1
  2264.         move.w    RADR,d0
  2265.         lsr.b    #1,d1
  2266.         move    ccr,RCCR
  2267.         scs    RCARRY        ;Carry holen
  2268.         bsr    WriteByte
  2269.         Last
  2270.         ENDM
  2271.  
  2272. LSRA_2        ReadPC
  2273.         move.b    RA,d0
  2274.         lsr.b    #1,d0
  2275.         move    ccr,RCCR
  2276.         scs    RCARRY        ;Carry holen
  2277.         move.b    d0,RA
  2278.         Last
  2279.  
  2280. LSRZero_2    ReadRMWZero    LSRZero
  2281.         ShiftRight
  2282.  
  2283. LSRZeroX_2    ReadRMWZeroX    LSRZeroX
  2284.         ShiftRight
  2285.  
  2286. LSRAbs_2    ReadRMWAbs    LSRAbs
  2287.         ShiftRight
  2288.  
  2289. LSRAbsX_2    ReadRMWAbsX    LSRAbsX
  2290.         ShiftRight
  2291.  
  2292.  
  2293. RotateLeft    MACRO
  2294.         move.b    RCARRY,d2
  2295.         move.b    RDBUF,d1
  2296.         move.w    RADR,d0
  2297.         add.b    d2,d2        ;Carry -> X
  2298.         roxl.b    #1,d1        ;Vorsicht bei addx und dem Z-Flag!
  2299.         move    ccr,RCCR
  2300.         scs    RCARRY        ;Carry holen
  2301.         bsr    WriteByte
  2302.         Last
  2303.         ENDM
  2304.  
  2305. ROLA_2        ReadPC
  2306.         move.b    RCARRY,d2
  2307.         move.b    RA,d1
  2308.         add.b    d2,d2        ;Carry -> X
  2309.         roxl.b    #1,d1        ;Vorsicht bei addx und dem Z-Flag!
  2310.         move    ccr,RCCR
  2311.         scs    RCARRY        ;Carry holen
  2312.         move.b    d1,RA
  2313.         Last
  2314.  
  2315. ROLZero_2    ReadRMWZero    ROLZero
  2316.         RotateLeft
  2317.  
  2318. ROLZeroX_2    ReadRMWZeroX    ROLZeroX
  2319.         RotateLeft
  2320.  
  2321. ROLAbs_2    ReadRMWAbs    ROLAbs
  2322.         RotateLeft
  2323.  
  2324. ROLAbsX_2    ReadRMWAbsX    ROLAbsX
  2325.         RotateLeft
  2326.  
  2327.  
  2328. RotateRight    MACRO
  2329.         move.b    RCARRY,d2
  2330.         move.b    RDBUF,d1
  2331.         move.w    RADR,d0
  2332.         add.b    d2,d2        ;Carry -> X
  2333.         roxr.b    #1,d1
  2334.         move    ccr,RCCR
  2335.         scs    RCARRY        ;Carry holen
  2336.         bsr    WriteByte
  2337.         Last
  2338.         ENDM
  2339.  
  2340. RORA_2        ReadPC
  2341.         move.b    RCARRY,d2
  2342.         move.b    RA,d1
  2343.         add.b    d2,d2        ;Carry -> X
  2344.         roxr.b    #1,d1
  2345.         move    ccr,RCCR
  2346.         scs    RCARRY        ;Carry holen
  2347.         move.b    d1,RA
  2348.         Last
  2349.  
  2350. RORZero_2    ReadRMWZero    RORZero
  2351.         RotateRight
  2352.  
  2353. RORZeroX_2    ReadRMWZeroX    RORZeroX
  2354.         RotateRight
  2355.  
  2356. RORAbs_2    ReadRMWAbs    RORAbs
  2357.         RotateRight
  2358.  
  2359. RORAbsX_2    ReadRMWAbsX    RORAbsX
  2360.         RotateRight
  2361.  
  2362.  
  2363. *
  2364. * Sprungbefehle
  2365. *
  2366.  
  2367. JMPAbs_2    ReadPCInc RADRL
  2368.         Next    JMPAbs_3
  2369. JMPAbs_3    ReadPC    RPC
  2370.         lsl.w    #8,RPC
  2371.         move.b    RADRL,RPC
  2372.         Last
  2373.  
  2374. JMPInd_2    ReadByteAbs    JMPInd,RPC
  2375.         addq.b    #1,RADRL    ;Keine Seitenüberschreitung
  2376.         lsl.w    #8,RPC
  2377.         Next    JMPInd_5
  2378. JMPInd_5    ReadADR RPC
  2379.         ror.w    #8,RPC
  2380.         Last
  2381.  
  2382.  
  2383. JSR_2        ReadPCInc RADRL
  2384.         Next    JSR_3
  2385. JSR_3        ReadStack
  2386.         Next    JSR_4
  2387. JSR_4        move.w    RPC,d1
  2388.         lsr.w    #8,d1
  2389.         WriteStack
  2390.         DecS
  2391.         Next    JSR_5
  2392. JSR_5        move.b    RPC,d1
  2393.         WriteStack
  2394.         DecS
  2395.         Next    JSR_6
  2396. JSR_6        ReadPC    RPC
  2397.         lsl.w    #8,RPC
  2398.         move.b    RADRL,RPC
  2399.         Last
  2400.  
  2401. RTS_2        ReadPC
  2402.         Next    RTS_3
  2403. RTS_3        ReadStack
  2404.         IncS
  2405.         Next    RTS_4
  2406. RTS_4        ReadStack RADRL
  2407.         IncS
  2408.         Next    RTS_5
  2409. RTS_5        ReadStack RPC
  2410.         lsl.w    #8,RPC
  2411.         move.b    RADRL,RPC
  2412.         Next    RTS_6
  2413. RTS_6        ReadPCInc
  2414.         Last
  2415.  
  2416.  
  2417. BRK_2        ReadPC
  2418.         Next    BRK_3
  2419. BRK_3        move.w    RPC,d1
  2420.         lsr.w    #8,d1
  2421.         WriteStack
  2422.         DecS
  2423.         Next    BRK_4
  2424. BRK_4        move.b    RPC,d1
  2425.         WriteStack
  2426.         DecS
  2427.         Next    BRK_5
  2428. BRK_5        PushP    1        ;B auf 1
  2429.         Next    BRK_6
  2430. BRK_6        st    RINTERRUPT
  2431.         move.w    #$fffe,d0    ;IRQ-Vektor
  2432.         bsr    ReadByte
  2433.         move.b    d0,RPC
  2434.         lsl.w    #8,RPC
  2435.         Next    BRK_7
  2436. BRK_7        move.w    #$ffff,d0
  2437.         bsr    ReadByte
  2438.         move.b    d0,RPC
  2439.         ror.w    #8,RPC
  2440.         Last
  2441.  
  2442.  
  2443. RTI_2        ReadPC
  2444.         Next    RTI_3
  2445. RTI_3        ReadStack
  2446.         IncS
  2447.         Next    RTI_4
  2448. RTI_4        PopP
  2449.         IncS
  2450.         Next    RTI_5
  2451. RTI_5        ReadStack RADRL
  2452.         IncS
  2453.         Next    RTI_6
  2454. RTI_6        ReadStack RPC
  2455.         lsl.w    #8,RPC
  2456.         move.b    RADRL,RPC
  2457.         Last
  2458.  
  2459.  
  2460. *
  2461. * Verzweigungsbefehle
  2462. *
  2463.  
  2464. BranchB        MACRO    ;Name des Opcodes, zu testendes Bit, 0/1
  2465.             ;Also: Verzweige, wenn Bit \2 in RCCR gleich \4 ist
  2466.         ReadByteImm RADRL
  2467.         btst    #\2,RCCR+1    ;Verzweigung genommen?
  2468.     IFEQ    \3
  2469.         beq    \1Yes
  2470.     ELSE
  2471.         bne    \1Yes
  2472.     ENDC
  2473.         Last            ;Nein, nächster Opcode
  2474. \1Yes        Next    \1_3
  2475. \1_3        ReadPC
  2476.         move.b    RADRL,d0    ;Ja, PC erhöhen
  2477.         bpl    \1Forward
  2478.         neg.b    d0        ;Sprung zurück, Seitenüberschreitung?
  2479.         sub.b    d0,RPC
  2480.         bcs    \1BPage
  2481.         Last            ;Nein, nächster Opcode
  2482. \1BPage        Next    \1_4b
  2483. \1_4b        ReadPC            ;Ja, PC korrigieren
  2484.         sub.w    #$100,RPC
  2485.         Last
  2486. \1Forward    add.b    d0,RPC        ;Sprung nach vorne, Seitenüberschreitung?
  2487.         bcs    \1FPage
  2488.         Last            ;Nein, nächster Opcode
  2489. \1FPage        Next    \1_4f
  2490. \1_4f        ReadPC
  2491.         add.w    #$100,RPC    ;Ja, PC korrigieren
  2492.         Last
  2493.         ENDM
  2494.  
  2495. BranchF        MACRO    ;Name des Opcodes, Flag, 0/1
  2496.             ;Also: Verzweige, wenn \2 gleich \3 ist
  2497.         ReadByteImm RADRL
  2498.         tst.b    \2        ;Verzweigung genommen?
  2499.     IFEQ    \3
  2500.         beq    \1Yes
  2501.     ELSE
  2502.         bne    \1Yes
  2503.     ENDC
  2504.         Last            ;Nein, nächster Opcode
  2505. \1Yes        Next    \1_3
  2506. \1_3        ReadPC
  2507.         move.b    RADRL,d0    ;Ja, PC erhöhen
  2508.         bpl    \1Forward
  2509.         neg.b    d0        ;Sprung zurück, Seitenüberschreitung?
  2510.         sub.b    d0,RPC
  2511.         bcs    \1BPage
  2512.         Last            ;Nein, nächster Opcode
  2513. \1BPage        Next    \1_4b
  2514. \1_4b        ReadPC            ;Ja, PC korrigieren
  2515.         sub.w    #$100,RPC
  2516.         Last
  2517. \1Forward    add.b    d0,RPC        ;Sprung nach vorne, Seitenüberschreitung?
  2518.         bcs    \1FPage
  2519.         Last            ;Nein, nächster Opcode
  2520. \1FPage        Next    \1_4f
  2521. \1_4f        ReadPC
  2522.         add.w    #$100,RPC    ;Ja, PC korrigieren
  2523.         Last
  2524.         ENDM
  2525.  
  2526. BVC_2        BranchF    BVC,ROVERFLOW,0
  2527.  
  2528. BVS_2        BranchF    BVS,ROVERFLOW,1
  2529.  
  2530. BEQ_2        BranchB    BEQ,2,1
  2531.  
  2532. BNE_2        BranchB    BNE,2,0
  2533.  
  2534. BPL_2        BranchB    BPL,3,0
  2535.  
  2536. BMI_2        BranchB    BMI,3,1
  2537.  
  2538. BCC_2        BranchF    BCC,RCARRY,0
  2539.  
  2540. BCS_2        BranchF    BCS,RCARRY,1
  2541.  
  2542.  
  2543. *
  2544. * Flag-Gruppe
  2545. *
  2546.  
  2547. CLI_2        ReadPC
  2548.         clr.b    RINTERRUPT
  2549.         Last
  2550.  
  2551. SEI_2        ReadPC
  2552.         st    RINTERRUPT
  2553.         Last
  2554.  
  2555. CLC_2        ReadPC
  2556.         clr.b    RCARRY
  2557.         Last
  2558.  
  2559. SEC_2        ReadPC
  2560.         st    RCARRY
  2561.         Last
  2562.  
  2563. CLD_2        ReadPC
  2564.         clr.b    RDECIMAL
  2565.         Last
  2566.  
  2567. SED_2        ReadPC
  2568.         st    RDECIMAL
  2569.         Last
  2570.  
  2571. CLV_2        ReadPC
  2572.         clr.b    ROVERFLOW
  2573.         Last
  2574.  
  2575.  
  2576. *
  2577. * NOPs
  2578. *
  2579.  
  2580. NOPImpl_2    ReadPC
  2581.         Last
  2582.  
  2583. NOPImm_2    ReadByteImm
  2584.         Last
  2585.  
  2586. NOPZero_2    ReadByteZero    NOPZero
  2587.         Last
  2588.  
  2589. NOPZeroX_2    ReadByteZeroX    NOPZeroX
  2590.         Last
  2591.  
  2592. NOPAbs_2    ReadByteAbs    NOPAbs
  2593.         Last
  2594.  
  2595. NOPAbsX_2    ReadByteAbsX    NOPAbsX
  2596.         Last
  2597.  
  2598.  
  2599. *
  2600. * ASL/ORA-Gruppe (SLO)
  2601. *
  2602.  
  2603. ShiftLeftOr    MACRO
  2604.         move.b    RDBUF,d1
  2605.         move.w    RADR,d0
  2606.         add.b    d1,d1
  2607.         scs    RCARRY        ;Carry holen
  2608.         or.b    d1,RA
  2609.         move    ccr,RCCR
  2610.         bsr    WriteByte
  2611.         Last
  2612.         ENDM
  2613.  
  2614. SLOZero_2    ReadRMWZero    SLOZero
  2615.         ShiftLeftOr
  2616.  
  2617. SLOZeroX_2    ReadRMWZeroX    SLOZeroX
  2618.         ShiftLeftOr
  2619.  
  2620. SLOAbs_2    ReadRMWAbs    SLOAbs
  2621.         ShiftLeftOr
  2622.  
  2623. SLOAbsX_2    ReadRMWAbsX    SLOAbsX
  2624.         ShiftLeftOr
  2625.  
  2626. SLOAbsY_2    ReadRMWAbsY    SLOAbsY
  2627.         ShiftLeftOr
  2628.  
  2629. SLOIndX_2    ReadRMWIndX    SLOIndX
  2630.         ShiftLeftOr
  2631.  
  2632. SLOIndY_2    ReadRMWIndY    SLOIndY
  2633.         ShiftLeftOr
  2634.  
  2635.  
  2636. *
  2637. * ROL/AND-Gruppe (RLA)
  2638. *
  2639.  
  2640. RotateLeftAnd    MACRO
  2641.         move.b    RCARRY,d2
  2642.         move.b    RDBUF,d1
  2643.         move.w    RADR,d0
  2644.         add.b    d2,d2        ;Carry -> X
  2645.         roxl.b    #1,d1
  2646.         scs    RCARRY        ;Carry holen
  2647.         and.b    d1,RA
  2648.         move    ccr,RCCR
  2649.         bsr    WriteByte
  2650.         Last
  2651.         ENDM
  2652.  
  2653. RLAZero_2    ReadRMWZero    RLAZero
  2654.         RotateLeftAnd
  2655.  
  2656. RLAZeroX_2    ReadRMWZeroX    RLAZeroX
  2657.         RotateLeftAnd
  2658.  
  2659. RLAAbs_2    ReadRMWAbs    RLAAbs
  2660.         RotateLeftAnd
  2661.  
  2662. RLAAbsX_2    ReadRMWAbsX    RLAAbsX
  2663.         RotateLeftAnd
  2664.  
  2665. RLAAbsY_2    ReadRMWAbsY    RLAAbsY
  2666.         RotateLeftAnd
  2667.  
  2668. RLAIndX_2    ReadRMWIndX    RLAIndX
  2669.         RotateLeftAnd
  2670.  
  2671. RLAIndY_2    ReadRMWIndY    RLAIndY
  2672.         RotateLeftAnd
  2673.  
  2674.  
  2675. *
  2676. * LSR/EOR-Gruppe (SRE)
  2677. *
  2678.  
  2679. ShiftRightEor    MACRO
  2680.         move.b    RDBUF,d1
  2681.         move.w    RADR,d0
  2682.         lsr.b    #1,d1
  2683.         scs    RCARRY        ;Carry holen
  2684.         eor.b    d1,RA
  2685.         move    ccr,RCCR
  2686.         bsr    WriteByte
  2687.         Last
  2688.         ENDM
  2689.  
  2690. SREZero_2    ReadRMWZero    SREZero
  2691.         ShiftRightEor
  2692.  
  2693. SREZeroX_2    ReadRMWZeroX    SREZeroX
  2694.         ShiftRightEor
  2695.  
  2696. SREAbs_2    ReadRMWAbs    SREAbs
  2697.         ShiftRightEor
  2698.  
  2699. SREAbsX_2    ReadRMWAbsX    SREAbsX
  2700.         ShiftRightEor
  2701.  
  2702. SREAbsY_2    ReadRMWAbsY    SREAbsY
  2703.         ShiftRightEor
  2704.  
  2705. SREIndX_2    ReadRMWIndX    SREIndX
  2706.         ShiftRightEor
  2707.  
  2708. SREIndY_2    ReadRMWIndY    SREIndY
  2709.         ShiftRightEor
  2710.  
  2711.  
  2712. *
  2713. * ROR/ADC-Gruppe (RRA)
  2714. *
  2715.  
  2716. RotateRightAdc    MACRO
  2717.         move.b    RCARRY,d2
  2718.         move.b    RDBUF,d1
  2719.         move.w    RADR,d0
  2720.         add.b    d2,d2        ;Carry -> X
  2721.         roxr.b    #1,d1
  2722.         scs    RCARRY        ;Carry holen
  2723.         move.b    RA,d2
  2724.         addx.b    d1,d2
  2725.         svs    ROVERFLOW    ;Overflow holen
  2726.         move.b    d2,RA
  2727.         move    ccr,RCCR
  2728.         bsr    WriteByte
  2729.         Last
  2730.         ENDM
  2731.  
  2732. RRAZero_2    ReadRMWZero    RRAZero
  2733.         RotateRightAdc
  2734.  
  2735. RRAZeroX_2    ReadRMWZeroX    RRAZeroX
  2736.         RotateRightAdc
  2737.  
  2738. RRAAbs_2    ReadRMWAbs    RRAAbs
  2739.         RotateRightAdc
  2740.  
  2741. RRAAbsX_2    ReadRMWAbsX    RRAAbsX
  2742.         RotateRightAdc
  2743.  
  2744. RRAAbsY_2    ReadRMWAbsY    RRAAbsY
  2745.         RotateRightAdc
  2746.  
  2747. RRAIndX_2    ReadRMWIndX    RRAIndX
  2748.         RotateRightAdc
  2749.  
  2750. RRAIndY_2    ReadRMWIndY    RRAIndY
  2751.         RotateRightAdc
  2752.  
  2753.  
  2754. *
  2755. * DEC/CMP-Gruppe (DCP)
  2756. *
  2757.  
  2758. DecCompare    MACRO
  2759.         move.b    RA,d2
  2760.         move.b    RDBUF,d1
  2761.         move.w    RADR,d0
  2762.         subq.b    #1,d1
  2763.         cmp.b    d1,d2
  2764.         move    ccr,RCCR
  2765.         scc    RCARRY        ;Inverses Carry holen
  2766.         bsr    WriteByte
  2767.         Last
  2768.         ENDM
  2769.  
  2770. DCPZero_2    ReadRMWZero    DCPZero
  2771.         DecCompare
  2772.  
  2773. DCPZeroX_2    ReadRMWZeroX    DCPZeroX
  2774.         DecCompare
  2775.  
  2776. DCPAbs_2    ReadRMWAbs    DCPAbs
  2777.         DecCompare
  2778.  
  2779. DCPAbsX_2    ReadRMWAbsX    DCPAbsX
  2780.         DecCompare
  2781.  
  2782. DCPAbsY_2    ReadRMWAbsY    DCPAbsY
  2783.         DecCompare
  2784.  
  2785. DCPIndX_2    ReadRMWIndX    DCPIndX
  2786.         DecCompare
  2787.  
  2788. DCPIndY_2    ReadRMWIndY    DCPIndY
  2789.         DecCompare
  2790.  
  2791.  
  2792. *
  2793. * INC/SBC-Gruppe (ISB)
  2794. *
  2795.  
  2796. IncSbc        MACRO
  2797.         move.b    RCARRY,d2
  2798.         move.b    RDBUF,d1
  2799.         not.b    d2
  2800.         move.w    RADR,d0
  2801.         addq.b    #1,d1
  2802.         add.b    d2,d2        ;Inverses Carry -> X
  2803.         move.b    RA,d2
  2804.         subx.b    d1,d2
  2805.         scc    RCARRY        ;Inverses Carry holen
  2806.         svs    ROVERFLOW    ;Overflow holen
  2807.         move.b    d2,RA
  2808.         move    ccr,RCCR
  2809.         bsr    WriteByte
  2810.         Last
  2811.         ENDM
  2812.  
  2813. ISBZero_2    ReadRMWZero    ISBZero
  2814.         IncSbc
  2815.  
  2816. ISBZeroX_2    ReadRMWZeroX    ISBZeroX
  2817.         IncSbc
  2818.  
  2819. ISBAbs_2    ReadRMWAbs    ISBAbs
  2820.         IncSbc
  2821.  
  2822. ISBAbsX_2    ReadRMWAbsX    ISBAbsX
  2823.         IncSbc
  2824.  
  2825. ISBAbsY_2    ReadRMWAbsY    ISBAbsY
  2826.         IncSbc
  2827.  
  2828. ISBIndX_2    ReadRMWIndX    ISBIndX
  2829.         IncSbc
  2830.  
  2831. ISBIndY_2    ReadRMWIndY    ISBIndY
  2832.         IncSbc
  2833.  
  2834.  
  2835. *
  2836. * Unübliche Befehle
  2837. *
  2838.  
  2839. ANCImm_2    ReadByteImm        ;??? ($0b, $2b)
  2840.         and.b    d0,RA
  2841.         move    ccr,RCCR
  2842.         smi    RCARRY        ;N -> C (??)
  2843.         Last
  2844.  
  2845. SBXImm_2    ReadByteImm
  2846.         move.b    RX,d1
  2847.         and.b    RA,d1
  2848.         sub.b    d0,d1
  2849.         move    ccr,RCCR
  2850.         scc    RCARRY        ;Inverses Carry holen
  2851.         move.b    d1,RX
  2852.         Last
  2853.  
  2854.  
  2855. *
  2856. * Erweiterte Opcodes
  2857. *
  2858.  
  2859. ; $f2 $xx
  2860. OpIEC        ReadPCInc
  2861.         tst.b    d0
  2862.         beq    OpIECOut
  2863.         cmp.b    #1,d0
  2864.         beq    OpIECOutATN
  2865.         cmp.b    #2,d0
  2866.         beq    OpIECOutSec
  2867.         cmp.b    #3,d0
  2868.         beq    OpIECIn
  2869.         cmp.b    #4,d0
  2870.         beq    OpIECSetATN
  2871.         cmp.b    #5,d0
  2872.         beq    OpIECRelATN
  2873.         cmp.b    #6,d0
  2874.         beq    OpIECTurnaround
  2875.         cmp.b    #7,d0
  2876.         beq    OpIECRelease
  2877.         bra    IllegalOp
  2878.  
  2879. OpIECOut    move.b    $95(RAMPTR),d0    ;Auszugebendes Byte holen
  2880.         move.b    $a3(RAMPTR),d1    ;EOI-Flag holen
  2881.         jsr    IECOut
  2882.         bra    IECSetST
  2883.  
  2884. OpIECOutATN    move.b    $95(RAMPTR),d0    ;Auszugebendes Byte holen
  2885.         jsr    IECOutATN
  2886.         bra    IECSetST
  2887.  
  2888. OpIECOutSec    move.b    $95(RAMPTR),d0    ;Auszugebendes Byte holen
  2889.         jsr    IECOutSec
  2890.         bra    IECSetST
  2891.  
  2892. OpIECIn        jsr    IECIn
  2893.         move.b    d1,RA        ;Byte in den Akku
  2894.         move    ccr,RCCR    ;Flags entsprechend setzen
  2895.         bra    IECSetST
  2896.  
  2897. OpIECSetATN    jsr    IECSetATN
  2898.         move.w    #$edfb,RPC    ;Nach $edfb springen
  2899.         Last
  2900.  
  2901. OpIECRelATN    jsr    IECRelATN
  2902.         bra    IECReturn
  2903.  
  2904. OpIECTurnaround    jsr    IECTurnaround
  2905.         bra    IECReturn
  2906.  
  2907. OpIECRelease    jsr    IECRelease
  2908.         bra    IECReturn
  2909.  
  2910. IECSetST    or.b    d0,$90(RAMPTR)    ;Status setzen
  2911.         clr.b    RCARRY        ;Carry löschen
  2912. IECReturn    bra    RTS_2        ;RTS ausführen
  2913.  
  2914.  
  2915. **
  2916. ** Konstanten
  2917. **
  2918.  
  2919. *
  2920. * Opcode Dispatch Table
  2921. * Jeder Eintrag zeigt auf die erste Zyklusroutine (d.h. die Routine
  2922. * des zweiten Zyklus) eines Opcodes
  2923. * "*" bezeichnet einen undokumentierten Opcode
  2924. *
  2925.  
  2926.         CNOP    0,4
  2927. OpcodeTable    dc.l    BRK_2        ;$00
  2928.         dc.l    ORAIndX_2
  2929.         dc.l    IllegalOp
  2930.         dc.l    SLOIndX_2    ;*
  2931.         dc.l    NOPZero_2    ;*
  2932.         dc.l    ORAZero_2
  2933.         dc.l    ASLZero_2
  2934.         dc.l    SLOZero_2    ;*
  2935.  
  2936.         dc.l    PHP_2        ;$08
  2937.         dc.l    ORAImm_2
  2938.         dc.l    ASLA_2
  2939.         dc.l    ANCImm_2    ;*
  2940.         dc.l    NOPAbs_2    ;*
  2941.         dc.l    ORAAbs_2
  2942.         dc.l    ASLAbs_2
  2943.         dc.l    SLOAbs_2    ;*
  2944.  
  2945.         dc.l    BPL_2        ;$10
  2946.         dc.l    ORAIndY_2
  2947.         dc.l    IllegalOp
  2948.         dc.l    SLOIndY_2    ;*
  2949.         dc.l    NOPZeroX_2    ;*
  2950.         dc.l    ORAZeroX_2
  2951.         dc.l    ASLZeroX_2
  2952.         dc.l    SLOZeroX_2    ;*
  2953.  
  2954.         dc.l    CLC_2        ;$18
  2955.         dc.l    ORAAbsY_2
  2956.         dc.l    NOPImpl_2    ;*
  2957.         dc.l    SLOAbsY_2    ;*
  2958.         dc.l    NOPAbsX_2    ;*
  2959.         dc.l    ORAAbsX_2
  2960.         dc.l    ASLAbsX_2
  2961.         dc.l    SLOAbsX_2    ;*
  2962.  
  2963.         dc.l    JSR_2        ;$20
  2964.         dc.l    ANDIndX_2
  2965.         dc.l    IllegalOp
  2966.         dc.l    RLAIndX_2    ;*
  2967.         dc.l    BITZero_2
  2968.         dc.l    ANDZero_2
  2969.         dc.l    ROLZero_2
  2970.         dc.l    RLAZero_2    ;*
  2971.  
  2972.         dc.l    PLP_2        ;$28
  2973.         dc.l    ANDImm_2
  2974.         dc.l    ROLA_2
  2975.         dc.l    ANCImm_2    ;*
  2976.         dc.l    BITAbs_2
  2977.         dc.l    ANDAbs_2
  2978.         dc.l    ROLAbs_2
  2979.         dc.l    RLAAbs_2    ;*
  2980.  
  2981.         dc.l    BMI_2        ;$30
  2982.         dc.l    ANDIndY_2
  2983.         dc.l    IllegalOp
  2984.         dc.l    RLAIndY_2    ;*
  2985.         dc.l    NOPZeroX_2    ;*
  2986.         dc.l    ANDZeroX_2
  2987.         dc.l    ROLZeroX_2
  2988.         dc.l    RLAZeroX_2    ;*
  2989.  
  2990.         dc.l    SEC_2        ;$38
  2991.         dc.l    ANDAbsY_2
  2992.         dc.l    NOPImpl_2    ;*
  2993.         dc.l    RLAAbsY_2    ;*
  2994.         dc.l    NOPAbsX_2    ;*
  2995.         dc.l    ANDAbsX_2
  2996.         dc.l    ROLAbsX_2
  2997.         dc.l    RLAAbsX_2    ;*
  2998.  
  2999.         dc.l    RTI_2        ;$40
  3000.         dc.l    EORIndX_2
  3001.         dc.l    IllegalOp
  3002.         dc.l    SREIndX_2    ;*
  3003.         dc.l    NOPZero_2    ;*
  3004.         dc.l    EORZero_2
  3005.         dc.l    LSRZero_2
  3006.         dc.l    SREZero_2    ;*
  3007.  
  3008.         dc.l    PHA_2        ;$48
  3009.         dc.l    EORImm_2
  3010.         dc.l    LSRA_2
  3011.         dc.l    IllegalOp
  3012.         dc.l    JMPAbs_2
  3013.         dc.l    EORAbs_2
  3014.         dc.l    LSRAbs_2
  3015.         dc.l    SREAbs_2    ;*
  3016.  
  3017.         dc.l    BVC_2        ;$50
  3018.         dc.l    EORIndY_2
  3019.         dc.l    IllegalOp
  3020.         dc.l    SREIndY_2    ;*
  3021.         dc.l    NOPZeroX_2    ;*
  3022.         dc.l    EORZeroX_2
  3023.         dc.l    LSRZeroX_2
  3024.         dc.l    SREZeroX_2    ;*
  3025.  
  3026.         dc.l    CLI_2        ;$58
  3027.         dc.l    EORAbsY_2
  3028.         dc.l    NOPImpl_2    ;*
  3029.         dc.l    SREAbsY_2    ;*
  3030.         dc.l    NOPAbsX_2    ;*
  3031.         dc.l    EORAbsX_2
  3032.         dc.l    LSRAbsX_2
  3033.         dc.l    SREAbsX_2    ;*
  3034.  
  3035.         dc.l    RTS_2        ;$60
  3036.         dc.l    ADCIndX_2
  3037.         dc.l    IllegalOp
  3038.         dc.l    RRAIndX_2    ;*
  3039.         dc.l    NOPZero_2    ;*
  3040.         dc.l    ADCZero_2
  3041.         dc.l    RORZero_2
  3042.         dc.l    RRAZero_2    ;*
  3043.  
  3044.         dc.l    PLA_2        ;$68
  3045.         dc.l    ADCImm_2
  3046.         dc.l    RORA_2
  3047.         dc.l    IllegalOp
  3048.         dc.l    JMPInd_2
  3049.         dc.l    ADCAbs_2
  3050.         dc.l    RORAbs_2
  3051.         dc.l    RRAAbs_2    ;*
  3052.  
  3053.         dc.l    BVS_2        ;$70
  3054.         dc.l    ADCIndY_2
  3055.         dc.l    IllegalOp
  3056.         dc.l    RRAIndY_2    ;*
  3057.         dc.l    NOPZeroX_2    ;*
  3058.         dc.l    ADCZeroX_2
  3059.         dc.l    RORZeroX_2
  3060.         dc.l    RRAZeroX_2    ;*
  3061.  
  3062.         dc.l    SEI_2        ;$78
  3063.         dc.l    ADCAbsY_2
  3064.         dc.l    NOPImpl_2    ;*
  3065.         dc.l    RRAAbsY_2    ;*
  3066.         dc.l    NOPAbsX_2    ;*
  3067.         dc.l    ADCAbsX_2
  3068.         dc.l    RORAbsX_2
  3069.         dc.l    RRAAbsX_2    ;*
  3070.  
  3071.         dc.l    NOPImm_2    ;* $80
  3072.         dc.l    STAIndX_2
  3073.         dc.l    NOPImm_2    ;*
  3074.         dc.l    SAXIndX_2    ;*
  3075.         dc.l    STYZero_2
  3076.         dc.l    STAZero_2
  3077.         dc.l    STXZero_2
  3078.         dc.l    SAXZero_2    ;*
  3079.  
  3080.         dc.l    DEY_2        ;$88
  3081.         dc.l    NOPImm_2    ;*
  3082.         dc.l    TXA_2
  3083.         dc.l    IllegalOp
  3084.         dc.l    STYAbs_2
  3085.         dc.l    STAAbs_2
  3086.         dc.l    STXAbs_2
  3087.         dc.l    SAXAbs_2    ;*
  3088.  
  3089.         dc.l    BCC_2        ;$90
  3090.         dc.l    STAIndY_2
  3091.         dc.l    IllegalOp
  3092.         dc.l    IllegalOp
  3093.         dc.l    STYZeroX_2
  3094.         dc.l    STAZeroX_2
  3095.         dc.l    STXZeroY_2
  3096.         dc.l    SAXZeroY_2    ;*
  3097.  
  3098.         dc.l    TYA_2        ;$98
  3099.         dc.l    STAAbsY_2
  3100.         dc.l    TXS_2
  3101.         dc.l    IllegalOp
  3102.         dc.l    IllegalOp
  3103.         dc.l    STAAbsX_2
  3104.         dc.l    IllegalOp
  3105.         dc.l    IllegalOp
  3106.  
  3107.         dc.l    LDYImm_2    ;$a0
  3108.         dc.l    LDAIndX_2
  3109.         dc.l    LDXImm_2
  3110.         dc.l    IllegalOp
  3111.         dc.l    LDYZero_2
  3112.         dc.l    LDAZero_2
  3113.         dc.l    LDXZero_2
  3114.         dc.l    LAXZero_2    ;*
  3115.  
  3116.         dc.l    TAY_2        ;$a8
  3117.         dc.l    LDAImm_2
  3118.         dc.l    TAX_2
  3119.         dc.l    IllegalOp
  3120.         dc.l    LDYAbs_2
  3121.         dc.l    LDAAbs_2
  3122.         dc.l    LDXAbs_2
  3123.         dc.l    LAXAbs_2    ;*
  3124.  
  3125.         dc.l    BCS_2        ;$b0
  3126.         dc.l    LDAIndY_2
  3127.         dc.l    IllegalOp
  3128.         dc.l    IllegalOp
  3129.         dc.l    LDYZeroX_2
  3130.         dc.l    LDAZeroX_2
  3131.         dc.l    LDXZeroY_2
  3132.         dc.l    LAXZeroY_2    ;*
  3133.  
  3134.         dc.l    CLV_2        ;$b8
  3135.         dc.l    LDAAbsY_2
  3136.         dc.l    TSX_2
  3137.         dc.l    IllegalOp
  3138.         dc.l    LDYAbsX_2
  3139.         dc.l    LDAAbsX_2
  3140.         dc.l    LDXAbsY_2
  3141.         dc.l    LAXAbsY_2    ;*
  3142.  
  3143.         dc.l    CPYImm_2    ;$c0
  3144.         dc.l    CMPIndX_2
  3145.         dc.l    NOPImm_2    ;*
  3146.         dc.l    DCPIndX_2    ;*
  3147.         dc.l    CPYZero_2
  3148.         dc.l    CMPZero_2
  3149.         dc.l    DECZero_2
  3150.         dc.l    DCPZero_2    ;*
  3151.  
  3152.         dc.l    INY_2        ;$c8
  3153.         dc.l    CMPImm_2
  3154.         dc.l    DEX_2
  3155.         dc.l    SBXImm_2    ;*
  3156.         dc.l    CPYAbs_2
  3157.         dc.l    CMPAbs_2
  3158.         dc.l    DECAbs_2
  3159.         dc.l    DCPAbs_2    ;*
  3160.  
  3161.         dc.l    BNE_2        ;$d0
  3162.         dc.l    CMPIndY_2
  3163.         dc.l    IllegalOp
  3164.         dc.l    DCPIndY_2    ;*
  3165.         dc.l    NOPZeroX_2    ;*
  3166.         dc.l    CMPZeroX_2
  3167.         dc.l    DECZeroX_2
  3168.         dc.l    DCPZeroX_2    ;*
  3169.  
  3170.         dc.l    CLD_2        ;$d8
  3171.         dc.l    CMPAbsY_2
  3172.         dc.l    NOPImpl_2    ;*
  3173.         dc.l    DCPAbsY_2    ;*
  3174.         dc.l    NOPAbsX_2    ;*
  3175.         dc.l    CMPAbsX_2
  3176.         dc.l    DECAbsX_2
  3177.         dc.l    DCPAbsX_2    ;*
  3178.  
  3179.         dc.l    CPXImm_2    ;$e0
  3180.         dc.l    SBCIndX_2
  3181.         dc.l    NOPImm_2    ;*
  3182.         dc.l    ISBIndX_2    ;*
  3183.         dc.l    CPXZero_2
  3184.         dc.l    SBCZero_2
  3185.         dc.l    INCZero_2
  3186.         dc.l    ISBZero_2    ;*
  3187.  
  3188.         dc.l    INX_2        ;$e8
  3189.         dc.l    SBCImm_2
  3190.         dc.l    NOPImpl_2
  3191.         dc.l    SBCImm_2    ;*
  3192.         dc.l    CPXAbs_2
  3193.         dc.l    SBCAbs_2
  3194.         dc.l    INCAbs_2
  3195.         dc.l    ISBAbs_2    ;*
  3196.  
  3197.         dc.l    BEQ_2        ;$f0
  3198.         dc.l    SBCIndY_2
  3199.         dc.l    OpIEC        ;Patch
  3200.         dc.l    ISBIndY_2    ;*
  3201.         dc.l    NOPZeroX_2    ;*
  3202.         dc.l    SBCZeroX_2
  3203.         dc.l    INCZeroX_2
  3204.         dc.l    ISBZeroX_2    ;*
  3205.  
  3206.         dc.l    SED_2        ;$f8
  3207.         dc.l    SBCAbsY_2
  3208.         dc.l    NOPImpl_2    ;*
  3209.         dc.l    ISBAbsY_2    ;*
  3210.         dc.l    NOPAbsX_2    ;*
  3211.         dc.l    SBCAbsX_2
  3212.         dc.l    INCAbsX_2
  3213.         dc.l    ISBAbsX_2    ;*
  3214.  
  3215.  
  3216. *
  3217. * Speicherkonfigurationstabelle
  3218. *
  3219.  
  3220. ; Diese Tabelle enthält für alle 8 Speicherkonfigurationen
  3221. ; die Zeiger auf die zugehörigen Read- und WriteTabs
  3222. ConfigTab    dc.l    ReadTab0,WriteTab0
  3223.         dc.l    ReadTab1,WriteTab1
  3224.         dc.l    ReadTab2,WriteTab2
  3225.         dc.l    ReadTab3,WriteTab3
  3226.         dc.l    ReadTab4,WriteTab4
  3227.         dc.l    ReadTab5,WriteTab5
  3228.         dc.l    ReadTab6,WriteTab6
  3229.         dc.l    ReadTab7,WriteTab7
  3230.  
  3231. *
  3232. * Sonstige Konstanten
  3233. *
  3234.  
  3235. ; Taglist für CreateNewProc
  3236. ProcTags    dc.l    NP_Entry,CPUTaskProc
  3237.         dc.l    NP_Name,CPUTaskName
  3238.         dc.l    NP_Priority,-1
  3239.         dc.l    0
  3240.  
  3241. ; Strings
  3242. CPUTaskName    dc.b    "6510",0
  3243.  
  3244. ; Flag: Dies ist Frodo SC
  3245.         CNOP    0,4
  3246. _IsFrodoSC
  3247. IsFrodoSC    dc.w    1
  3248.  
  3249.  
  3250. **
  3251. ** Initialisierte Daten
  3252. **
  3253.  
  3254.         SECTION    "DATA",DATA
  3255.  
  3256. ; Requester
  3257. IllegalOpReq    dc.l    20,0,0,0,0
  3258.  
  3259.  
  3260. **
  3261. ** Nicht initialisierte Daten
  3262. **
  3263.  
  3264.         SECTION    "BSS",BSS
  3265.  
  3266. ; Sprungtabellen für Speicherzugriff: Ein Eintrag pro Seite
  3267. ; Eine Tabelle für jede der 8 Speicherkonfigurationen
  3268. ReadTab0    ds.l    256
  3269. ReadTab1    ds.l    256
  3270. ReadTab2    ds.l    256
  3271. ReadTab3    ds.l    256
  3272. ReadTab4    ds.l    256
  3273. ReadTab5    ds.l    256
  3274. ReadTab6    ds.l    256
  3275. ReadTab7    ds.l    256
  3276.  
  3277. WriteTab0    ds.l    256
  3278. WriteTab1    ds.l    256
  3279. WriteTab2    ds.l    256
  3280. WriteTab3    ds.l    256
  3281. WriteTab4    ds.l    256
  3282. WriteTab5    ds.l    256
  3283. WriteTab6    ds.l    256
  3284. WriteTab7    ds.l    256
  3285.  
  3286.  
  3287.         SECTION    "__MERGED",BSS
  3288.  
  3289. ; 6510-Task
  3290. CPUProc        ds.l    1    ;Prozess-Handle
  3291.         XDEF    _CPUTask
  3292. _CPUTask
  3293. CPUTask        ds.l    1    ;Task des Prozesses
  3294. InitialSP    ds.l    1    ;Stackpointer
  3295. ReadySet    ds.l    1    ;Signal des Hauptprogramms
  3296. ContinueSet    ds.l    1    ;Signal des CPU-Tasks
  3297. ReadySig    ds.b    1
  3298. ContinueSig    ds.b    1
  3299.  
  3300. ; 6510-Register
  3301. RA        ds.b    1    ;A
  3302. RX        ds.b    1    ;X
  3303. RY        ds.b    1    ;Y
  3304. RDBUF        ds.b    1    ;Puffer für RMW-Befehle
  3305. RS        ds.w    1    ;S (16-Bit, $01xx)
  3306. RCCR        ds.w    1    ;CCR, nur N und Z
  3307. RCARRY        ds.b    1    ;6510-Carry
  3308. ROVERFLOW    ds.b    1    ;6510-Overflow-Flag
  3309. RDECIMAL    ds.b    1    ;6510-Dezimalflag
  3310. RINTERRUPT    ds.b    1    ;6510-Interruptflag
  3311. RADR
  3312. RADRH        ds.b    1    ;Adreß-Latch
  3313. RADRL        ds.b    1
  3314. RADR2
  3315. RADR2H        ds.b    1    ;Zweites Adreß-Latch für indiziert-indirekt
  3316. RADR2L        ds.b    1
  3317. RPR        ds.b    1    ;Prozessorport Datenregister
  3318. RDDR        ds.b    1    ;Prozessorport Datenrichtungsregister
  3319.  
  3320. ; Zwischenspeicher für Adc/Sbc im Dezimalmodus
  3321. TMPS        ds.b    1
  3322. TMPA        ds.b    1
  3323.  
  3324.     IFNE    DEBUG_DETAIL
  3325. DEBUGON        ds.b    1
  3326.     ENDC
  3327.  
  3328. ; Zeiger auf die der aktuellen Speicherkonfiguration entsprechenden
  3329. ;  Read/WriteTab
  3330.         CNOP    0,4
  3331. RDTAB        ds.l    1
  3332. WRTAB        ds.l    1
  3333.  
  3334. ; Speicherzeiger
  3335. TheRAM        ds.l    1    ;Zeiger auf C64-RAM (64K)
  3336. TheRAMPTR    ds.l    1    ;Zeiger auf C64-RAM, Offset 32K (für Adressierung mit Vorzeichen)
  3337. TheBasic    ds.l    1    ;Zeiger auf Basic-ROM
  3338. TheKernal    ds.l    1    ;Zeiger auf Kernal-ROM
  3339. TheChar        ds.l    1    ;Zeiger auf Char-ROM
  3340. TheColor    ds.l    1    ;Zeiger auf Farb-RAM
  3341.  
  3342. ; Interrupt-Flags. Bei einem Interrupt wird eins dieser Flags gesetzt.
  3343. ; Das bewirkt, daß beim nächsten Opcode-Fetch der 6510-Task in die
  3344. ; Routine "HandleInt" springt. Dort werden diese Flags ausgewertet und
  3345. ; entsprechend verzweigt.
  3346.         CNOP    0,4
  3347. Interrupt            ;Zusammenfassung als Langwort
  3348. IntIsRESET    ds.b    1    ;RESET aufgetreten, 6510 beenden oder Pause
  3349. IntIsNMI    ds.b    1    ;NMI aufgetreten
  3350. IntIsIRQ            ;Zusammenfassung als Wort
  3351. IntIsVICIRQ    ds.b    1    ;IRQ durch VIC aufgetreten
  3352. IntIsCIAIRQ    ds.b    1    ;IRQ durch CIA-A aufgetreten
  3353.  
  3354. FirstIRQCycle    ds.l    1    ;Zyklus, an dem IRQ zuletzt auf low ging
  3355. FirstNMICycle    ds.l    1    ;Zyklus, an dem NMI zuletzt auf low ging
  3356.  
  3357. RESETIsEXIT    ds.b    1    ;Zur Unterscheidung von RESET und EXIT
  3358. RESETIsPause    ds.b    1    ;Zur Unterscheidung von RESET und Pause
  3359.  
  3360. NMIState    ds.b    1    ;Aktueller Zustand der NMI-Leitung (für Flankentriggerung)
  3361.  
  3362. ; Bus Available vom VIC
  3363. BALow        ds.b    1
  3364.  
  3365. ; Zwischenspeicher für Lesezugriff mit BA
  3366.         CNOP    0,4
  3367. HALTCONTSTORE    ds.l    1
  3368. HALTRETADR    ds.l    1
  3369. HALTADRSTORE    ds.w    1
  3370.  
  3371. ; Argumente für EasyRequest
  3372.         CNOP    0,4
  3373. RequestStream    ds.l    16
  3374.  
  3375. ; Registerinhalte für SAM, nur gültig innerhalb von Pause6510/Resume6510
  3376.         XDEF    _RA
  3377. _RA        ds.b    1
  3378.         XDEF    _RX
  3379. _RX        ds.b    1
  3380.         XDEF    _RY
  3381. _RY        ds.b    1
  3382.         XDEF    _RP
  3383. _RP        ds.b    1
  3384.         XDEF    _RPR
  3385. _RPR        ds.b    1
  3386.         XDEF    _RDDR
  3387. _RDDR        ds.b    1
  3388.         XDEF    _RPC
  3389. _RPC        ds.w    1
  3390.         XDEF    _RS
  3391. _RS        ds.w    1
  3392.  
  3393.         XDEF    _SAMMemConfig
  3394. _SAMMemConfig    ds.b    1    ;CHAREN, LORAM, HIRAM
  3395.  
  3396.         END
  3397.