Cartridgeheader und Struktur für C16 und Plus/4 ?

  • Cartridgeheader und Struktur für C16 und Plus/4 ?

    Ich hatte mir heute einige der wenigen C16 CRTs mal angeschaut, um herauszufinden, wie die Header oder Aufbereitung dafür aussehen muss. Letztlich habe ich den Code aus dem Viduzzle-CRT kopiert und das wollte nicht funktionieren.
    Dann habe ich den Code anhand von Memory-Map und ROM-Listing nach meinem Gutdünken umgeschrieben und da funktionierte es sofort. :) Ich habe eine Überprüfung auf mehr als 16kb und dieses Jonglieren mit der Bankingeinstellung herausgeworfen.
    Das Banking stelle ich direkt ein (X-Register=#$02). Warum findet man in den Cartridges, die als C1L eingeblendet werden, immer wieder $00 oder $01 vor der CBM-Kennung ? - Das müsste doch das Konfigurationsbyte sein ?



    Quellcode

    1. !to"c16cart.crt",plain
    2. *=$8000
    3. jmp $800b
    4. jmp $800b
    5. !by $02,$43,$42,$4d ; $?? bank, "CBM"
    6. *=$800b
    7. sei
    8. lda $FB
    9. pha
    10. ldx $8006 ; cartrige 1 lo, kernal
    11. sta $FDD0,X
    12. jsr $FF84 ; Initialize I/O devices
    13. jsr $FF87 ; RAM Test
    14. pla
    15. sta $FB
    16. jsr $FF8A ; Restore vectors to initial values
    17. jsr $FF81 ; Initialize screen editor
    18. lda #<cartrige ; cartridge jump in
    19. sta $02FE
    20. lda #>cartrige
    21. sta $02FF
    22. lda #$F1 ; irq -> banking-routines
    23. sta $0314
    24. lda #$FC
    25. sta $0315
    26. cli
    27. jmp *
    28. cartrige:
    29. ldx #$00
    30. - lda mytxt,x
    31. sta $0c50,x
    32. inx
    33. cpx #$28
    34. bne -
    35. jmp *
    36. mytxt: !scr " das modul wurde passend eingeblendet ! "
    Alles anzeigen



    Warum blinkt da noch ein Cursor ?


    Gibt es irgendwo eine brauchbare Anleitung zu den Cartridges oder muss man das mit auffindbaren Unterlagen selbst herausfinden ?
    If we're evil or divine - we're the last in line. - Ronnie James Dio (1984) -

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von cbmhardware ()

  • Ein kommentiertes ROM-Listing dürfte reichen, so wild isses ja nicht. Das besagte Byte kann IIRC entscheiden, ob das Cartridge vor oder nach der Initialisierung des Systems aufgerufen wird. Und zumindest der 3-plus-1-Header funktioniert auf jedem der drei Slots (intern, extern1, speech/extern2)- IIRC belegt er sogar jeweils eine andere F-Taste mit der Startsequenz.

    Irritierend ist eigentlich nur der überall ausgewiesene NMI-Vektor, den es im 264er-System ja gar nicht gibt...

    edit: Welcher Wert nach FDDx geschrieben wird ist völlig egal! Es zählt nur das low-Nibble der Adresse!
  • Mac Bacon schrieb:

    Hat TED nicht einen Hardware-Cursor?
    Puh, keine Ahnung. Das muss ich dann wohl herausfinden.

    mc71 schrieb:

    Das besagte Byte kann IIRC entscheiden, ob das Cartridge vor oder nach der Initialisierung des Systems aufgerufen wird.
    Ja, das könnte es sein. Da muss ich mich mal im ROM auf die Suche machen.

    So langsam klappt es, nur diesen Cursor werde ich (noch) nicht los. :) Habe mal Kikstart als bin eingefügt, das dann herauskopiert und per Trampolin-Code gestartet wird. Ist so echte Speicherverschwendung, passen zumindest zwei oder mehrere der kleinen C16-Spiele in eine Bank. War nur zum Üben.

    Hänge das crt an.

    Quellcode

    1. !to"kikstart.crt",plain
    2. s_lo = $fa
    3. s_hi = $fb
    4. t_lo = $fc
    5. t_hi = $fd
    6. *=$8000
    7. jmp $800b
    8. jmp $8038
    9. !by $00,$43,$42,$4d ; $?? bank, "CBM"
    10. *=$800b
    11. sei
    12. lda $FB
    13. pha
    14. ldx $02 ; cartrige 1 lo, kernal
    15. sta $FDD0,X
    16. jsr $FF84 ; Initialize I/O devices
    17. jsr $FF87 ; RAM Test
    18. pla
    19. sta $FB
    20. jsr $FF8A ; Restore vectors to initial values
    21. jsr $FF81 ; Initialize screen editor
    22. lda #<cartrige ; cartridge jump in
    23. sta $02FE
    24. lda #>cartrige
    25. sta $02FF
    26. lda #$F1 ; irq -> banking-routines
    27. sta $0314
    28. lda #$FC
    29. sta $0315
    30. cli
    31. jmp *
    32. cartrige:
    33. ldy #$00
    34. ldx #$00
    35. lda #$10
    36. sta t_hi
    37. lda #$01
    38. sta t_lo
    39. lda #$90
    40. sta s_hi
    41. lda #$00
    42. sta s_lo
    43. - lda (s_lo),y
    44. sta (t_lo),y
    45. iny
    46. bne -
    47. inc s_hi
    48. inc t_hi
    49. inx
    50. cpx #$19
    51. bne -
    52. ldx #$00
    53. -- lda $8070,x
    54. sta $7f00,x
    55. inx
    56. cpx #$55
    57. bne --
    58. jmp $7f00
    59. *=$8070
    60. sei
    61. lda #$00
    62. sta $02FE
    63. sta $02FF
    64. lda #$b3 ; nativ irq
    65. sta $0314
    66. lda #$fc
    67. sta $0315
    68. ldx #$00 ; basic , kernal
    69. sta $FDD0,x
    70. stx $fb
    71. lda $fb
    72. jsr $FF84 ; Initialize I/O devices
    73. jsr $FF87 ; RAM Test
    74. jsr $FF8A ; Restore vectors to initial values
    75. jsr $FF81 ; Initialize screen editor
    76. cli
    77. jmp $100d
    78. *=$9000
    79. !bin "kikstart.prg",,2
    Alles anzeigen

    Gerrit schrieb:

    Ja, hat er. Damit der weg ist muss man ihn ausserhalb des sichtbaren Bereichs 'parken'.
    Danke für die Info. Werde ich beim nächsten Mal versuchen.
    Dateien
    • kikstart.crt

      (10,45 kB, 8 mal heruntergeladen, zuletzt: )
    If we're evil or divine - we're the last in line. - Ronnie James Dio (1984) -
  • Ja, danke, funktioniert. Hatte es heute auch mit Google gefunden:

    Im Original pagetable.com/docs/ted/TED%207…minary%20Data%20Sheet.pdf und die Übersetzung: c64-wiki.de/index.php/TED#Registerbelegung


    Ich muss mir mal einen Labelfile für den Assember anlegen. Hatte eben beim Überfliegen im "Commodore Sachbuch" gesehen, dass einige Adressen gleich wie bei anderen C=Rechnern liegen (getin, bsout, usw.). Dann muss ich das nicht immer wieder zusammensuchen.
    If we're evil or divine - we're the last in line. - Ronnie James Dio (1984) -
  • Die Tastaturabfrage per getin $ffe4 funktioniert im ROM scheinbar auch nicht (?) Musste kurz einen Scanner einbauen, um die Tastatur abfragen zu können. Habe mal zwei Spiele in ein Modul gestopft.
    Btw ... das obige Listing hat einige kleine Flüchtigkeitsfehler.

    Kikstart und Invaders:

    Quellcode

    1. !to"2games.crt",plain
    2. s_lo = $fc
    3. s_hi = $fd
    4. t_lo = $fe
    5. t_hi = $ff
    6. bsout = $ffd2
    7. getin = $ffe4
    8. frame_col = $ff19
    9. background_col = $ff15
    10. *=$8000
    11. jmp $800b
    12. jmp $8038
    13. !by $01 ; module number: $00:basic
    14. !by $43,$42,$4d ; "CBM"
    15. *=$800b
    16. sei
    17. lda $fb
    18. pha
    19. ldx #$02 ; cartrige 1 lo, kernal
    20. sta $FDD0,X
    21. jsr $FF84 ; Initialize I/O devices
    22. jsr $FF87 ; RAM Test
    23. pla
    24. sta $FB
    25. jsr $FF8A ; Restore vectors to initial values
    26. jsr $FF81 ; Initialize screen editor
    27. lda #<cartrige ; cartridge jump in
    28. sta $02FE
    29. lda #>cartrige
    30. sta $02FF
    31. lda #$F1 ; irq -> banking-routines
    32. sta $0314
    33. lda #$FC
    34. sta $0315
    35. cli
    36. jmp *
    37. cartrige:
    38. lda #$03
    39. sta $FF0C
    40. ora #$ff
    41. sta $FF0D ; hide cursor
    42. lda #$09
    43. sta frame_col
    44. sta background_col
    45. ldx #$00
    46. - lda games,x
    47. sta $0d74,x
    48. inx
    49. cpx #$50
    50. bne -
    51. key: lda #$7f
    52. sta $fd30
    53. sta $ff08
    54. lda $ff08
    55. cmp #$fe
    56. beq kik
    57. cmp #$f7
    58. beq inv:
    59. bne key
    60. inv:
    61. lda #$0e
    62. sta $0ffe
    63. lda #$10 ; invaders jmp in
    64. sta $0fff
    65. ldy #$00 ; copy parameters invaders
    66. ldx #$00
    67. lda #$10
    68. sta t_hi
    69. lda #$01
    70. sta t_lo
    71. lda #$9b
    72. sta s_hi
    73. lda #$00
    74. sta s_lo
    75. lda #$1a
    76. sta $fa ; blocks to copy
    77. jmp copy
    78. kik: lda #$0d
    79. sta $0ffe
    80. lda #$10 ; kikstart jmp in
    81. sta $0fff
    82. ldy #$00 ; copy parameters kikstart
    83. ldx #$00
    84. lda #$10
    85. sta t_hi
    86. lda #$01
    87. sta t_lo
    88. lda #$82
    89. sta s_hi
    90. lda #$00
    91. sta s_lo
    92. lda #$1a
    93. sta $fa ; blocks to copy
    94. copy: lda (s_lo),y ; copy game oder tool to ram
    95. sta (t_lo),y
    96. iny
    97. bne copy
    98. inc s_hi
    99. inc t_hi
    100. inx
    101. cpx $fa
    102. bne copy
    103. ldx #$36 ; copy trampoline-code
    104. -- lda $8130,x
    105. sta $065e,x
    106. dex
    107. bne --
    108. jmp $065e
    109. games: !scr " 1: kikstart "
    110. !scr " 2: invaders "
    111. *=$8130 ; trampoline code
    112. sei
    113. lda #$00
    114. sta $02FE
    115. sta $02FF
    116. lda #$b3 ; nativ irq
    117. sta $0314
    118. lda #$fc
    119. sta $0315
    120. ldx #$00 ; basic , kernal
    121. sta $FDD0,x
    122. stx $fb
    123. lda $fb
    124. jsr $FF84 ; Initialize I/O devices
    125. jsr $FF87 ; RAM Test
    126. jsr $FF8A ; Restore vectors to initial values
    127. jsr $FF81 ; Initialize screen editor
    128. cli
    129. lda #$03
    130. sta $FF0C
    131. ora #$ff
    132. sta $FF0D ; hide cursor
    133. jmp ($0ffe) ; start game
    134. *=$8200
    135. !bin "kikstart.prg",,2
    136. *=$9b00
    137. !bin "invaders.prg",,2
    Alles anzeigen
    Dateien
    • 2games.crt

      (13,17 kB, 11 mal heruntergeladen, zuletzt: )
    If we're evil or divine - we're the last in line. - Ronnie James Dio (1984) -
  • cbmhardware schrieb:

    Die Tastaturabfrage per getin $ffe4 funktioniert im ROM scheinbar auch nicht (?) Musste kurz einen Scanner einbauen, um die Tastatur abfragen zu können.
    GETIN liest ein Byte vom aktuellen Eingabekanal. Solange die Eingabe nicht per CHKIN auf ein anderes Gerät verbogen wurde, wird das Byte direkt aus dem Tastaturpuffer geholt (im Gegensatz zu CHRIN, welches aus dem Eingabepuffer ab $200 lesen würde). GETIN scannt also nicht die Tastatur, das muss weiter der Systeminterrupt machen. Wenn der nicht läuft, z.B. weil Dein Modulcode vor dem System-Init angesprungen wird, kann GETIN also nicht funktionieren.
    Yes, I'm the guy responsible for the ACME cross assembler
  • Mac Bacon schrieb:

    Wenn der nicht läuft, z.B. weil Dein Modulcode vor dem System-Init angesprungen wird, kann GETIN also nicht funktionieren.
    Ja, richtig, wird ja wie in der Reihenfolge des Source abgearbeitet. Daran hatte ich im Moment nicht gedacht.
    If we're evil or divine - we're the last in line. - Ronnie James Dio (1984) -
  • I don't see the issue ..?

    Attached SRAM Cartridge-Replacement and loaded from sd2iec to $8000. After reset it works:





    Kikstart worked also von Key 1.

    In Vice Xplus4 attached as "raw 16kb C1 Low"-Cartridge it worked also. It's no replacement for the internal function-rom ! - Only an ordinary C1L-Cart.


    Edit: added start-address l/h: $00,$80 and sent it by USB-wire:



    My digicam is old crap, but this worked also fine for me.
    If we're evil or divine - we're the last in line. - Ronnie James Dio (1984) -

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von cbmhardware ()

  • CRT original file is corrupt. Yape emulator does not work.



    your code.

    • .80C6 A2 36 LDX #$36
      .80C8 BD 30 81 LDA $8130, X
      .80CB 9D 5E 06 STA $065E, X
      .80CE CA DEX
      .80CF D0 F7 BNE $80C8
    my code.
    1. .80C6 A2 36 LDX #$36
      .80C8 BD 30 81 LDA $8130, X
      .80CB 9D 5E 06 STA $065E, X
      .80CE CA DEX
      .80CF 10 F7 BPL $80C8
    [list=1][/list]
    Bilder
    • yape.jpg

      63,54 kB, 769×750, 8 mal angesehen
    • cart_fail.png

      14,43 kB, 782×659, 7 mal angesehen
    • replace.jpg

      153,4 kB, 776×720, 9 mal angesehen
  • Ah, yes, one cycle too much. But this is no reason to go stuck for the yape:

    Quellcode

    1. ldx #$35 ;<- also a fix
    2. lda $8130,x
    3. sta $065e,x
    4. dex
    5. bne -- ; or use bpl
    6. jmp $065e

    It writes 41 Bytes in the speech RAM-Aera and 19 Bytes in the following Basic Runtime-Stack. Maybe an error in the Yape-Emulation. Vice Xplus4 and the real machine worked well.
    If we're evil or divine - we're the last in line. - Ronnie James Dio (1984) -