home *** CD-ROM | disk | FTP | other *** search
/ Brotikasten / BROTCD01.iso / amiga / frodov13.lha / src / 6510.asm < prev    next >
Assembly Source File  |  1995-02-22  |  57KB  |  3,093 lines

  1. *
  2. * 6510.asm - 6510-Emulation (eigener Task)
  3. *
  4. * Copyright (C) 1994-1995 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Register d0/d1 - WICHTIG:
  12. *  - Der Emulator geht davon aus, da▀ die MSWs von d0 und d1 immer Null
  13. *    sind. Denn dadurch kann das C64-RAM mittels (RAMPTR,d0.l) ohne
  14. *    Vorzeichen indiziert angesprochen werden.
  15. *  - Die Makros Read#?Zero#? und Read#?Ind#? gehen zusΣtlich davon aus,
  16. *    da▀ nur das untere Byte von d0 Null ist, da diese Makros immer nur
  17. *    am Anfang eines Befehls stehen und d0 vom Next-Makro noch gel÷scht
  18. *    ist
  19. *
  20. * Speicherkonfigurationen:
  21. *
  22. * $01  $a000-$bfff  $d000-$dfff  $e000-$ffff
  23. * -----------------------------------------------
  24. *  0       RAM          RAM          RAM
  25. *  1       RAM       Char-ROM        RAM
  26. *  2       RAM       Char-ROM    Kernal-ROM
  27. *  3    Basic-ROM    Char-ROM    Kernal-ROM
  28. *  4       RAM          RAM          RAM
  29. *  5       RAM          I/O          RAM
  30. *  6       RAM          I/O      Kernal-ROM
  31. *  7    Basic-ROM       I/O      Kernal-ROM
  32. *
  33. * Zugriff auf den C64-Speicher:
  34. *  - Fast alle Speicherzugriffe laufen ⁿber die ReadByte/WriteByte-Makros,
  35. *    die die eingestellte Speicherkonfiguration dadurch berⁿcksichtigen,
  36. *    da▀ die oberen 8 Adre▀bits als Index in eine Sprungtabelle
  37. *    (ReadTab/WriteTab) dienen, die Zeiger auf die ReadByte*/WriteByte*-
  38. *    Routinen enthalten, ⁿber die der tatsΣchliche Zugriff erfolgt.
  39. *    Fⁿr jede der 8 Speicherkonfigurationen existiert jeweils eine solche
  40. *    Tabelle Bei einer ─nderung der Speicherkonfiguration (NewConfig)
  41. *    werden die Zeiger auf die Tabellen (RDTAB/WRTAB) geΣndert.
  42. *  - Das LESEN aus der Zero-Page geschieht immer direkt,
  43. *    da dort keine Register liegen ($01 wird auch im RAM abgelegt)
  44. *  - Beim Schreiben in die Zero-Page wird nur auf $00/$01 getestet,
  45. *    ansonsten direkt zugegriffen
  46. *  - Der Stack wird immer direkt angesprochen
  47. *  - Die ReadByte-Routinen dⁿrfen nur d0-d1/a0 verΣndern.
  48. *    a1 enthΣlt die Rⁿcksprungadresse, die Routinen mⁿssen also mit
  49. *    "jmp (a1)" enden.
  50. *  - Die WriteByte-Routinen dⁿrfen nur d0-d1/a0-a1 verΣndern
  51. *
  52. * ProgrammzΣhler:
  53. *  - Aus Geschwindigkeitsgrⁿnden wird der PC durch einen 32-Bit-
  54. *    Amiga-Zeiger reprΣsentiert und ⁿber diesen direkt auf den
  55. *    Speicher zugegriffen (und nicht ⁿber ReadByte). Bei einem
  56. *    Sprungbefehl wird aus dem 16-Bit Sprungziel und der aktuellen
  57. *    Speicherkonfiguration die neue 32-Bit-Adresse berechnet,
  58. *    indem Σhnlich zur ReadTab die oberen 8 Bit des Sprungziels
  59. *    als Index in die JumpTab verwendet werden. Die darⁿber aufgerufenen
  60. *    Routinen fⁿhren die Umrechnung durch.
  61. *  - Durch die Art, wie das Hauptprogramm den Speicher anfordert,
  62. *    entsprechen die unteren 16 Bit des 32-Bit-PCs immer der
  63. *    16-Bit-C64-Adresse. Das erleichtert erheblich das Ablegen des
  64. *    PC auf dem Stack, da dazu einfach nur die unteren 16 Bit
  65. *    genommen werden mⁿssen (ansonsten mⁿ▀te man je nach RAM/ROM-
  66. *    Bereich erst die jeweilige Basisadresse subtrahieren).
  67. *  - Durch diese Art der PC-Verwaltung bestehen folgende InkompatibilitΣten:
  68. *     - Es gibt keinen Wraparound ⁿber Adresse $ffff/$0000 hinweg
  69. *     - Ein Branch oder ein Hineinlaufen in einen anderen Speicherbereich
  70. *       (z.B. RAM->ROM) funktioniert nicht. Das sollte allerdings kein
  71. *       Problem darstellen.
  72. *     - Ein Sprung in den I/O-Bereich ist z.Z. nicht m÷glich
  73. *
  74. * Condition-Codes:
  75. *  - Die Emulation verwendet zwei Register, um die Prozessorflags zu
  76. *    speichern: RCCR und RP.
  77. *  - RCCR ist ein Abbild des 680x0-CCR und wird nach den entsprechenden
  78. *    Operationen mit "move ccr,RCCR" gelesen. Von RCCR werden nur das N-
  79. *    und das Z-Flag verwendet.
  80. *  - Die einzigen Opcodes, die V Σndern, sind ADC, SBC, CLV, PLP und RTI.
  81. *    Darum wird das V-Flag nicht aus dem 680x0-V-Flag erzeugt, sondern
  82. *    gegebenenfalls von Hand gesetzt.
  83. *  - Im oberen Byte (Bit 8-15) von RP sind die 6510-Flags V,B,D und I
  84. *    in der selben Anordnung wie beim 6510 gespeichert. Das untere Byte
  85. *    enthΣlt in Bit 0 das Carry-Flag in 6510-Interpretation (bei SBC und
  86. *    CMP/CPX/CPY inverse Bedeutung zum 680x0), das bei den entsprechenden
  87. *    Opcodes aus dem CCR gelesen (und ggf. invertiert) wird. Der Einfachheit
  88. *    halber wird immer das ganze untere Byte von CCR gelesen, da nur Bit 0
  89. *    interessant ist.
  90. *
  91. * Opcode-Ausfⁿhrung:
  92. *  - Es gibt keine Fetch-Decode-Schleife, sondern jede Opcode-Routine
  93. *    enthΣlt am Schlu▀ den Code, der den nΣchsten Befehl ausfⁿhrt
  94. *    ("Next"-Makro).
  95. *  - Die Verzweigung in die einzelnen Opcode-Routinen geschieht ⁿber
  96. *    eine Sprungtabelle, die OpcodeTable. Das Register OPTABPTR enthΣlt
  97. *    einen Zeiger auf diese Tabelle (vor der Tabelle steht noch der
  98. *    ZyklenzΣhler, auf den so schneller zugegriffen werden kann).
  99. *
  100. * ZyklenzΣhler/Periodic/Interrupts:
  101. *  - Die Variable CyclesLeft (erreichbar ⁿber (OPTABPTR)) enthΣlt die
  102. *    Anzahl Zyklen, die dem 6510 in der augenblicklichen Rasterzeile noch
  103. *    zur Verfⁿgung stehen
  104. *  - Nach jeder Opcode-Ausfⁿhrung wird dieser ZΣhler um die Zyklenzahl
  105. *    des gerade ausgefⁿhrten Befehls erniedrigt. Dazu wird dem Next-Makro
  106. *    die Anzahl Zyklen ⁿbergeben. Unterschreitet der ZΣhler Null, wird
  107. *    die Routine "Periodic" aufgerufen.
  108. *  - In dieser Routine werden die Unterroutinen von VIC und CIA
  109. *    ausgefⁿhrt, die die Aktionen fⁿr eine Rasterzeile durchfⁿhren
  110. *    (VIC (Periodic6569): Eine Bildschirmzeile aufbauen, CIA
  111. *    (Periodic6526): Timer zΣhlen)
  112. *  - In Periodic6569 wird der ZyklenzΣhler neu gesetzt (der Wert hΣngt
  113. *    davon ab, ob eine Bad Line stattfand oder nicht)
  114. *
  115. * Interrupts:
  116. *  - Die Haupt-Interruptquellen sind VIC und CIA, daher prⁿft der
  117. *    Emulator das Auftreten eines Interrupts im Rahmen der Periodic-
  118. *    Routine
  119. *  - Es gibt folgende Interrupt-M÷glichkeiten (PrioritΣten):
  120. *     - RESET, Sprung nach ($FFFC) oder 6510-Task beenden (RESETIsEXIT-Flag)
  121. *     - NMI, Sprung nach ($FFFA)
  122. *     - VIC-IRQ, I-Flag wird geprⁿft, Sprung nach ($FFFE)
  123. *     - CIA-IRQ, I-Flag wird geprⁿft, Sprung nach ($FFFE)
  124. *  - Die Aufteilung in VIC- und CIA-IRQ erleichtert die Handhabung, wenn
  125. *    beide IRQs gleichzeitig auftreten
  126. *  - Die einzige M÷glichkeit, au▀erhalb des Periodic einen Interrupt
  127. *    auszul÷sen, ist das L÷schen des I-Flags, wenn ein IRQ ansteht.
  128. *    Die Opcode-Routinen fⁿr PLP, RTI und CLI enthalten deswegen besondere
  129. *    Abfragen, die ggf. in den Interrupt-Handler verzweigen.
  130. *
  131. * Erweiterungen:
  132. *  - ▄ber den Opcode $f2 sind die 1541-Routinen implementiert. Dem Opcode
  133. *    folgt ein Byte, das die Nummer der auzurufenden Routine angibt.
  134. *
  135. * InkompatibilitΣten:
  136. *  - ($ff),Y-Adressierung liest das zweite Byte der indirekten Adresse
  137. *    aus $0100 statt $0000. Dies geschieht aus Geschwindigkeitsgrⁿnden,
  138. *    der korrekte Code ist im Makro ReadAdrIndY auskommentiert.
  139. *  - In der Verwaltung des PCs bestehen einige Ungenauigkeiten (siehe
  140. *    Abschnitt "ProgrammzΣhler")
  141. *  - RMW-Befehle sollten erst die Originaldaten und dann die geΣnderten
  142. *    schreiben, aber das spielt nur eine Rolle fⁿr Register wie das
  143. *    VIC-IRQFLAG-Register, das in 6569.asm deswegen speziell behandelt wird
  144. *  - Zyklen werden nur fⁿr ganze Befehle gezΣhlt, Extra-Zyklen fⁿr
  145. *    Seitenⁿberschreitungen werden nicht berechnet (dies betrifft die
  146. *    Adressierungsarten xxxx,X xxxx,Y (xx),Y und die Branch-Befehle)
  147. *  - ADC und SBC im Dezimalmodus setzen die Flags nicht korrekt
  148. *  - RRA und ISB berⁿcksichtigen das D-Flag nicht
  149. *
  150.  
  151.  
  152.         MACHINE    68020
  153.  
  154.         INCLUDE    "exec/types.i"
  155.         INCLUDE    "exec/macros.i"
  156.         INCLUDE    "exec/execbase.i"
  157.         INCLUDE    "exec/nodes.i"
  158.         INCLUDE    "dos/dos.i"
  159.         INCLUDE    "dos/dostags.i"
  160.         INCLUDE    "Frodo_rev.i"
  161. CATCOMP_NUMBERS    = 1
  162.         INCLUDE    "Strings.i"
  163.  
  164.         XREF    _SysBase
  165.         XREF    _DOSBase
  166.         XREF    _IntuitionBase
  167.  
  168.         XREF    GetString    ;Strings.o
  169.         XREF    TheLocale
  170.  
  171.         XDEF    TheRAM        ;Main.asm
  172.         XDEF    TheBasic
  173.         XDEF    TheKernal
  174.         XDEF    TheChar
  175.         XDEF    TheColor
  176.         XREF    MainTask
  177.  
  178.         XREF    ReadFrom6526A    ;6526.asm
  179.         XREF    ReadFrom6526B
  180.         XREF    WriteTo6526A
  181.         XREF    WriteTo6526B
  182.         XREF    Reset6526
  183.  
  184.         XREF    Init6569    ;6569.asm
  185.         XREF    Exit6569
  186.         XREF    ReadFrom6569
  187.         XREF    WriteTo6569
  188.         XREF    Periodic6569
  189.         XREF    AmigaToFront
  190.         XREF    EmulToFront
  191.  
  192.         XREF    ReadFrom6581    ;65