64kramsystem / 64kramsystem/ghidra-vice-connector

Ghidra Data Type archive for C64 I/O hardware structures

Abierto
#27 0 comentarios 0 reacciones 0 asignados Ver en GitHub
priority: low
Lenguaje dominante
Python
Estrellas
1
Forks
0
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

## Summary

Create a Ghidra Data Type Archive (`.gdt`) defining C64 hardware chip structs with named bitfields. When applied to the I/O memory range, Ghidra's listing shows `VIC_II.SCROLY` instead of raw bytes at `$D011`, making disassembled code immediately readable.

This is Ghidra-side only — no BMP or VICE changes needed. Complements issue #13 (hardware register labels) and issue #21 (live chip register view).

---

## Structs to define

### `VIC_II` (47 bytes at $D000)
```c
struct VIC_II {
uint8_t SP0X; // $D000 Sprite 0 X
uint8_t SP0Y; // $D001 Sprite 0 Y
// ... SP1X–SP7Y ($D002–$D00F)
uint8_t MSIGX; // $D010 Sprites MSB of X
uint8_t SCROLY; // $D011 Screen control 1 (RST8:ECM:BMM:DEN:RSEL:YSCROLL[2:0])
uint8_t RASTER; // $D012 Raster counter
uint8_t LPENX; // $D013 Light pen X
uint8_t LPENY; // $D014 Light pen Y
uint8_t SPENA; // $D015 Sprite enable
uint8_t SCROLX; // $D016 Screen control 2
uint8_t YXPAND; // $D017 Sprite Y expand
uint8_t VMCSB; // $D018 Memory pointers
uint8_t VICIRQ; // $D019 IRQ status
uint8_t IRQMASK; // $D01A IRQ enable mask
uint8_t SPBGPR; // $D01B Sprite-background priority
uint8_t SPMC; // $D01C Sprite multicolor
uint8_t XXPAND; // $D01D Sprite X expand
uint8_t SPSPCL; // $D01E Sprite-sprite collision
uint8_t SPBGCL; // $D01F Sprite-background collision
uint8_t EXTCOL; // $D020 Border color
uint8_t BGCOL0; // $D021 Background color 0
uint8_t BGCOL1; // $D022
uint8_t BGCOL2; // $D023
uint8_t BGCOL3; // $D024
uint8_t SPMC0; // $D025 Sprite multicolor 0
uint8_t SPMC1; // $D026 Sprite multicolor 1
uint8_t SP0COL; // $D027–$D02E sprite colors
// ...
};
```

### `SID_Voice` (7 bytes, repeated 3 times)
```c
struct SID_Voice {
uint16_t FREQ; // Frequency
uint16_t PW; // Pulse width
uint8_t CR; // Control register (NOISE:PULSE:SAWTOOTH:TRIANGLE:TEST:RING:SYNC:GATE)
uint8_t AD; // Attack/Decay
uint8_t SR; // Sustain/Release
};
struct SID {
SID_Voice V1; // $D400
SID_Voice V2; // $D407
SID_Voice V3; // $D40E
uint16_t FLTFREQ;// $D415 Filter frequency
uint8_t RESON; // $D417 Filter resonance/routing
uint8_t SIGVOL; // $D418 Volume/filter mode
uint8_t POTX; // $D419
uint8_t POTY; // $D41A
uint8_t OSC3; // $D41B
uint8_t ENV3; // $D41C
};
```

### `CIA_Registers` (16 bytes, two instances at $DC00 and $DD00)
```c
struct CIA {
uint8_t PRA; // Port A
uint8_t PRB; // Port B
uint8_t DDRA; // Port A direction
uint8_t DDRB; // Port B direction
uint16_t TA; // Timer A
uint16_t TB; // Timer B
uint8_t TOD10; // Time of Day tenths
uint8_t TODSEC;// Seconds
uint8_t TODMIN;// Minutes
uint8_t TODHR; // Hours/AM-PM
uint8_t SDR; // Serial data register
uint8_t ICR; // Interrupt control
uint8_t CRA; // Control register A
uint8_t CRB; // Control register B
};
```

---

## Implementation

1. Define the structs using Ghidra's Data Type Manager (GUI) or a GhidraScript:

```java
// In a GhidraScript:
DataTypeManager dtm = currentProgram.getDataTypeManager();
StructureDataType vic = new StructureDataType("VIC_II", 0, dtm);
vic.add(ByteDataType.dataType, "SP0X", "Sprite 0 X position");
// ... etc
dtm.addDataType(vic, DataTypeConflictHandler.REPLACE_HANDLER);
// Apply to address:
createData(toAddr(0xD000), vic);
```

2. Export as a `.gdt` archive via **File > Archive Current Program's Data Types** and commit it to `data/ghidra-scripts/c64_datatypes.gdt`.

3. A companion script `ApplyC64DataTypes.java` applies the types to the current program's I/O ranges.

---

## Reference

Complete VIC-II, SID, CIA register descriptions: https://www.c64-wiki.com/wiki/VIC-II (VIC), https://www.c64-wiki.com/wiki/SID, https://www.c64-wiki.com/wiki/CIA

---

## Files to create

- `data/ghidra-scripts/ApplyC64DataTypes.java` — script to create and apply the data types
- `data/ghidra-scripts/c64_datatypes.gdt` — exported archive (optional, for direct import)

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.