64kramsystem / 64kramsystem/ghidra-vice-connector
Ghidra Data Type archive for C64 I/O hardware structures
- 主要語言
- Python
- 星號
- 1
- 分支
- 0
- PR 合併指標
- 30 天內沒有已合併 PR
描述
## 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)
貢獻指南
這個儲存庫沒有索引到貢獻指南
評估
這個 Issue 還沒有評估資料。