Skip to content

Commit

Permalink
Add device libraries for various C computers
Browse files Browse the repository at this point in the history
  • Loading branch information
drmortalwombat committed Mar 5, 2023
1 parent 6189e0c commit 9bd7b5c
Show file tree
Hide file tree
Showing 11 changed files with 559 additions and 1 deletion.
78 changes: 78 additions & 0 deletions include/c128/vdc.c
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();
}

95 changes: 95 additions & 0 deletions include/c128/vdc.h
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
40 changes: 40 additions & 0 deletions include/conio.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,33 @@ __asm bsinit
sta 0xff01
}
#pragma code(code)
#elif defined(__PLUS4__)
#pragma code(lowcode)
__asm bsout
{
sta 0xff3e
jsr 0xffd2
sta 0xff3f
}
__asm bsin
{
sta 0xff3e
jsr 0xffe4
sta 0xff3f
}
__asm bsplot
{
sta 0xff3e
jsr 0xfff0
sta 0xff3f
}
__asm bsinit
{
sta 0xff3e
jsr 0xff81
sta 0xff3f
}
#pragma code(code)
#else
#define bsout 0xffd2
#define bsin 0xffe4
Expand Down Expand Up @@ -66,12 +93,25 @@ __asm putpch
bcc w3
cmp #123
bcs w3

#if defined(__CBMPET__)
cmp #97
bcs w4
cmp #91
bcs w3
w2:
eor #$a0
w4:
eor #$20

#else
cmp #97
bcs w2
cmp #91
bcs w3
w2:
eor #$20
#endif
cpx #IOCHM_PETSCII_2
beq w3
and #$df
Expand Down
44 changes: 43 additions & 1 deletion include/crt.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,41 @@ char spentry = 0;

int main(void);

#if defined (__PLUS4__)

#pragma code(lowcode)
__asm p4irqx
{
sta $ff3f
pla
tax
pla
rti
}

__asm p4irq
{
pha
txa
pha
sta $ff3e

lda #>p4irqx
pha
lda #<p4irqx
pha
tsx
lda $0105, x
pha
pha
txa
pha
tya
pha
jmp $ce00
}
#pragma code(code)
#endif

__asm startup
{
Expand Down Expand Up @@ -150,6 +185,12 @@ lx1: lda (addr), y

#if defined(__C128__)
sta 0xff01
#elif defined(__PLUS4__)
lda #<p4irq
sta $fffe
lda #>p4irq
sta $ffff
sta $ff3f
#endif

tsx
Expand Down Expand Up @@ -253,7 +294,8 @@ l2: dey
#if defined(__C128__)
lda #0
sta 0xff00
#endif
#elif defined(__PLUS4__)
sta $ff3e
#endif
rts
}
Expand Down
73 changes: 73 additions & 0 deletions include/plus4/ted.c
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);
}
}
Loading

0 comments on commit 9bd7b5c

Please sign in to comment.