-
Notifications
You must be signed in to change notification settings - Fork 23
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add device libraries for various C computers
- Loading branch information
1 parent
6189e0c
commit 9bd7b5c
Showing
11 changed files
with
559 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
#include "vdc.h" | ||
|
||
|
||
inline void vdc_reg(VDCRegister reg) | ||
{ | ||
vdc.addr = reg; | ||
do {} while (vdc.addr < 128); | ||
} | ||
|
||
inline void vdc_write(byte data) | ||
{ | ||
vdc.data = data; | ||
} | ||
|
||
inline byte vdc_read(void) | ||
{ | ||
return vdc.data; | ||
} | ||
|
||
|
||
void vdc_reg_write(VDCRegister reg, byte data) | ||
{ | ||
vdc_reg(reg); | ||
vdc_write(data); | ||
} | ||
|
||
byte vdc_reg_read(VDCRegister reg) | ||
{ | ||
vdc_reg(reg); | ||
return vdc_read(); | ||
} | ||
|
||
|
||
void vdc_mem_addr(unsigned addr) | ||
{ | ||
vdc_reg_write(VDCR_ADDRH, addr >> 8); | ||
vdc_reg_write(VDCR_ADDRL, addr); | ||
vdc_reg(VDCR_DATA); | ||
} | ||
|
||
inline void vdc_mem_write(char data) | ||
{ | ||
vdc_write(data); | ||
} | ||
|
||
inline char vdc_mem_read(void) | ||
{ | ||
return vdc_read(); | ||
} | ||
|
||
|
||
void vdc_mem_write_at(unsigned addr, char data) | ||
{ | ||
vdc_mem_addr(addr); | ||
vdc_write(data); | ||
} | ||
|
||
char vdc_mem_read_at(unsigned addr) | ||
{ | ||
vdc_mem_addr(addr); | ||
return vdc_read(); | ||
} | ||
|
||
|
||
void vdc_mem_write_buffer(unsigned addr, const char * data, char size) | ||
{ | ||
vdc_mem_addr(addr); | ||
for(char i=0; i<size; i++) | ||
vdc_write(data[i]); | ||
} | ||
|
||
void vdc_mem_read_buffer(unsigned addr, char * data, char size) | ||
{ | ||
vdc_mem_addr(addr); | ||
for(char i=0; i<size; i++) | ||
data[i] = vdc_read(); | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
#ifndef C128_VDC_H | ||
#define C128_VDC_H | ||
|
||
#include <c64/types.h> | ||
|
||
enum VDCRegister | ||
{ | ||
VDCR_HTOTAL, | ||
VDCR_HDISPLAY, | ||
VDCR_HSYNC, | ||
VDCR_SYNCSIZE, | ||
|
||
VDCR_VTOTAL, | ||
VDCR_VADJUST, | ||
VDCR_VDISPLAY, | ||
VDCR_VSYNC, | ||
|
||
VDCR_LACE, | ||
VDCR_CSIZE, | ||
VDCR_CURSOR_START, | ||
VDCR_CURSOR_END, | ||
|
||
VDCR_DISP_ADDRH, | ||
VDCR_DISP_ADDRL, | ||
VDCR_CURSOR_ADDRH, | ||
VDCR_CURSOR_ADDRL, | ||
|
||
VDCR_LPEN_Y, | ||
VDCR_LPEN_X, | ||
VDCR_ADDRH, | ||
VDCR_ADDRL, | ||
|
||
VDCR_ATTR_ADDRH, | ||
VDCR_ATTR_ADDRL, | ||
VDCR_CWIDTH, | ||
VDCR_CHEIGHT, | ||
|
||
VDCR_VSCROLL, | ||
VDCR_HSCROLL, | ||
VDCR_COLOR, | ||
VDCR_ROWINC, | ||
|
||
VDCR_CHAR_ADDRH, | ||
VDCR_UNDERLINE, | ||
VDCR_DSIZE, | ||
VDCR_DATA, | ||
|
||
VDCR_BLOCK_ADDRH, | ||
VDCR_BLOCK_ADDRL, | ||
VDCR_HSTART, | ||
VDCR_HEND, | ||
|
||
VDCR_REFRESH | ||
}; | ||
|
||
struct VDC | ||
{ | ||
volatile char addr; | ||
volatile char data; | ||
}; | ||
|
||
#define vdc (*((struct VDC *)0xd600)) | ||
|
||
inline void vdc_reg(VDCRegister reg); | ||
|
||
inline void vdc_write(byte data); | ||
|
||
inline byte vdc_read(void); | ||
|
||
|
||
void vdc_reg_write(VDCRegister reg, byte data); | ||
|
||
byte vdc_reg_read(VDCRegister reg); | ||
|
||
|
||
void vdc_mem_addr(unsigned addr); | ||
|
||
inline void vdc_mem_write(char data); | ||
|
||
inline char vdc_mem_read(void); | ||
|
||
|
||
void vdc_mem_write_at(unsigned addr, char data); | ||
|
||
char vdc_mem_read_at(unsigned addr); | ||
|
||
|
||
void vdc_mem_write_buffer(unsigned addr, const char * data, char size); | ||
|
||
void vdc_mem_read_buffer(unsigned addr, char * data, char size); | ||
|
||
|
||
#pragma compile("vdc.c") | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
#include "ted.h" | ||
|
||
void ted_waitBottom(void) | ||
{ | ||
while (!(ted.vscan_high & 1)) | ||
; | ||
} | ||
|
||
void ted_waitTop(void) | ||
{ | ||
while (ted.vscan_high & 1) | ||
; | ||
} | ||
|
||
void ted_waitFrame(void) | ||
{ | ||
while (ted.vscan_high & 1) | ||
; | ||
while (!(ted.vscan_high & 1)) | ||
; | ||
} | ||
|
||
void ted_waitLine(int line) | ||
{ | ||
char upper = (char)(line >> 8) & 1; | ||
char lower = (char)line; | ||
|
||
do | ||
{ | ||
while (ted.vscan_low != lower) | ||
; | ||
} while ((ted.vscan_high & 1) != upper); | ||
} | ||
|
||
void ted_setmode(TedMode mode, char * text, char * font) | ||
{ | ||
switch (mode) | ||
{ | ||
case TEDM_TEXT: | ||
ted.ctrl1 = TED_CTRL1_DEN | TED_CTRL1_RSEL | 3; | ||
ted.ctrl2 = TED_CTRL2_CSEL; | ||
break; | ||
case TEDM_TEXT_MC: | ||
ted.ctrl1 = TED_CTRL1_DEN | TED_CTRL1_RSEL | 3; | ||
ted.ctrl2 = TED_CTRL2_CSEL | TED_CTRL2_MCM; | ||
break; | ||
case TEDM_TEXT_ECM: | ||
ted.ctrl1 = TED_CTRL1_DEN | TED_CTRL1_ECM | TED_CTRL1_RSEL | 3; | ||
ted.ctrl2 = TED_CTRL2_CSEL; | ||
break; | ||
case TEDM_HIRES: | ||
ted.ctrl1 = TED_CTRL1_BMM | TED_CTRL1_DEN | TED_CTRL1_RSEL | 3; | ||
ted.ctrl2 = TED_CTRL2_CSEL; | ||
break; | ||
case TEDM_HIRES_MC: | ||
ted.ctrl1 = TED_CTRL1_BMM | TED_CTRL1_DEN | TED_CTRL1_RSEL | 3; | ||
ted.ctrl2 = TED_CTRL2_CSEL | TED_CTRL2_MCM; | ||
break; | ||
default: | ||
__assume(false); | ||
} | ||
|
||
ted.vid_ptr = (unsigned)text >> 8; | ||
|
||
if (mode < TEDM_HIRES) | ||
{ | ||
ted.char_ptr = (unsigned)font >> 8; | ||
} | ||
else | ||
{ | ||
ted.sound1_high = (ted.sound1_high & 0x3) | ((unsigned)font >> 10); | ||
} | ||
} |
Oops, something went wrong.