gr-sim: minimal text mode support

still need to implement cout()
This commit is contained in:
Vince Weaver 2017-05-17 17:14:47 -04:00
parent 5b8bc29f5b
commit e99d77f6fd
7 changed files with 608 additions and 24 deletions

View File

@ -51,7 +51,7 @@ sparkle.o: sparkle.c
$(CC) $(CFLAGS) -c sparkle.c
gr-sim.o: gr-sim.c
gr-sim.o: gr-sim.c apple2_font.h
$(CC) $(CFLAGS) $(SDL_INCLUDE) -c gr-sim.c
clean:

View File

@ -1,4 +1,8 @@
unsigned char a2_font[64][7]={
/* 2513 character generator */
unsigned char a2_font[256][7]={
/* Control Chars */
{0x0e, // 01110
0x11, // 10001
0x15, // 10101
@ -7,4 +11,467 @@ unsigned char a2_font[64][7]={
0x10, // 10000
0x0f, // 01111
}, // @
{0x04, // 00100
0x0a, // 01010
0x11, // 10001
0x11, // 10001
0x1f, // 11111
0x11, // 10001
0x11, // 10001
}, // A
{0x1e, // 11110
0x11, // 10001
0x11, // 10001
0x1e, // 11110
0x11, // 10001
0x11, // 10001
0x1e, // 11110
}, // B
{0x0e, // 01110
0x11, // 10001
0x10, // 10000
0x10, // 10000
0x10, // 10000
0x11, // 10001
0x0e, // 01110
}, // C
{0x1e, // 11110
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x1e, // 11110
}, // D
{0x1f, // 11111
0x10, // 10000
0x10, // 10000
0x1e, // 11110
0x10, // 10000
0x10, // 10000
0x1f, // 11111
}, // E
{0x1f, // 11111
0x10, // 10000
0x10, // 10000
0x1e, // 11110
0x10, // 10000
0x10, // 10000
0x10, // 10000
}, // F
{0x1e, // 01111
0x10, // 10000
0x10, // 10000
0x1e, // 10000
0x13, // 10011
0x11, // 10001
0x0f, // 01111
}, // G
{0x11, // 10001
0x11, // 10001
0x11, // 10001
0x1f, // 11111
0x11, // 10001
0x11, // 10001
0x11, // 10001
}, // H
{0x0e, // 01110
0x04, // 00100
0x04, // 00100
0x04, // 00100
0x04, // 00100
0x04, // 00100
0x0e, // 01110
}, // I
{0x01, // 00001
0x01, // 00001
0x01, // 00001
0x01, // 00001
0x01, // 00001
0x11, // 10001
0x0e, // 01110
}, // J
{0x11, // 10001
0x12, // 10010
0x14, // 10100
0x18, // 11000
0x14, // 10100
0x12, // 10010
0x11, // 10001
}, // K
{0x10, // 10000
0x10, // 10000
0x10, // 10000
0x10, // 10000
0x10, // 10000
0x10, // 10000
0x1f, // 11111
}, // L
{0x11, // 10001
0x1b, // 11011
0x15, // 10101
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
}, // M
{0x11, // 10001
0x11, // 10001
0x19, // 11001
0x15, // 10101
0x13, // 10011
0x11, // 10001
0x11, // 10001
}, // N
{0x0e, // 01110
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x0e, // 01110
}, // O
{}, // P
{}, // Q
{}, // R
{}, // S
{}, // T
{}, // U
{}, // V
{}, // W
{}, // X
{}, // Y
{}, // Z
{}, // [
{}, // \.
{}, // ]
{}, // ^
{}, // _
/* Non-control chars */
{}, //
{}, // !
{}, // "
{}, // #
{}, // $
{}, // %
{}, // &
{}, // '
{}, // (
{}, // )
{}, // *
{}, // +
{}, // ,
{}, // -
{}, // .
{}, // /
{}, // 0
{}, // 1
{}, // 2
{}, // 3
{}, // 4
{}, // 5
{}, // 6
{}, // 7
{}, // 8
{}, // 9
{}, // :
{}, // ;
{}, // <
{}, // =
{}, // >
{}, // ?
{0x0e, // 01110
0x11, // 10001
0x15, // 10101
0x17, // 10111
0x16, // 10110
0x10, // 10000
0x0f, // 01111
}, // @
{0x04, // 00100
0x0a, // 01010
0x11, // 10001
0x11, // 10001
0x1f, // 11111
0x11, // 10001
0x11, // 10001
}, // A
{0x1e, // 11110
0x11, // 10001
0x11, // 10001
0x1e, // 11110
0x11, // 10001
0x11, // 10001
0x1e, // 11110
}, // B
{0x0e, // 01110
0x11, // 10001
0x10, // 10000
0x10, // 10000
0x10, // 10000
0x11, // 10001
0x0e, // 01110
}, // C
{0x1e, // 11110
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x1e, // 11110
}, // D
{0x1f, // 11111
0x10, // 10000
0x10, // 10000
0x1e, // 11110
0x10, // 10000
0x10, // 10000
0x1f, // 11111
}, // E
{0x1f, // 11111
0x10, // 10000
0x10, // 10000
0x1e, // 11110
0x10, // 10000
0x10, // 10000
0x10, // 10000
}, // F
{0x1e, // 01111
0x10, // 10000
0x10, // 10000
0x1e, // 10000
0x13, // 10011
0x11, // 10001
0x0f, // 01111
}, // G
{0x11, // 10001
0x11, // 10001
0x11, // 10001
0x1f, // 11111
0x11, // 10001
0x11, // 10001
0x11, // 10001
}, // H
{0x0e, // 01110
0x04, // 00100
0x04, // 00100
0x04, // 00100
0x04, // 00100
0x04, // 00100
0x0e, // 01110
}, // I
{0x01, // 00001
0x01, // 00001
0x01, // 00001
0x01, // 00001
0x01, // 00001
0x11, // 10001
0x0e, // 01110
}, // J
{0x11, // 10001
0x12, // 10010
0x14, // 10100
0x18, // 11000
0x14, // 10100
0x12, // 10010
0x11, // 10001
}, // K
{0x10, // 10000
0x10, // 10000
0x10, // 10000
0x10, // 10000
0x10, // 10000
0x10, // 10000
0x1f, // 11111
}, // L
{0x11, // 10001
0x1b, // 11011
0x15, // 10101
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
}, // M
{0x11, // 10001
0x11, // 10001
0x19, // 11001
0x15, // 10101
0x13, // 10011
0x11, // 10001
0x11, // 10001
}, // N
{0x0e, // 01110
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x0e, // 01110
}, // O
{}, // P
{}, // Q
{}, // R
{}, // S
{}, // T
{}, // U
{}, // V
{}, // W
{}, // X
{}, // Y
{}, // Z
{}, // [
{}, // \.
{}, // ]
{}, // ^
{}, // _
/* Lowercase */
{0x0e, // 01110
0x11, // 10001
0x15, // 10101
0x17, // 10111
0x16, // 10110
0x10, // 10000
0x0f, // 01111
}, // @
{0x04, // 00100
0x0a, // 01010
0x11, // 10001
0x11, // 10001
0x1f, // 11111
0x11, // 10001
0x11, // 10001
}, // A
{0x1e, // 11110
0x11, // 10001
0x11, // 10001
0x1e, // 11110
0x11, // 10001
0x11, // 10001
0x1e, // 11110
}, // B
{0x0e, // 01110
0x11, // 10001
0x10, // 10000
0x10, // 10000
0x10, // 10000
0x11, // 10001
0x0e, // 01110
}, // C
{0x1e, // 11110
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x1e, // 11110
}, // D
{0x1f, // 11111
0x10, // 10000
0x10, // 10000
0x1e, // 11110
0x10, // 10000
0x10, // 10000
0x1f, // 11111
}, // E
{0x1f, // 11111
0x10, // 10000
0x10, // 10000
0x1e, // 11110
0x10, // 10000
0x10, // 10000
0x10, // 10000
}, // F
{0x1e, // 01111
0x10, // 10000
0x10, // 10000
0x1e, // 10000
0x13, // 10011
0x11, // 10001
0x0f, // 01111
}, // G
{0x11, // 10001
0x11, // 10001
0x11, // 10001
0x1f, // 11111
0x11, // 10001
0x11, // 10001
0x11, // 10001
}, // H
{0x0e, // 01110
0x04, // 00100
0x04, // 00100
0x04, // 00100
0x04, // 00100
0x04, // 00100
0x0e, // 01110
}, // I
{0x01, // 00001
0x01, // 00001
0x01, // 00001
0x01, // 00001
0x01, // 00001
0x11, // 10001
0x0e, // 01110
}, // J
{0x11, // 10001
0x12, // 10010
0x14, // 10100
0x18, // 11000
0x14, // 10100
0x12, // 10010
0x11, // 10001
}, // K
{0x10, // 10000
0x10, // 10000
0x10, // 10000
0x10, // 10000
0x10, // 10000
0x10, // 10000
0x1f, // 11111
}, // L
{0x11, // 10001
0x1b, // 11011
0x15, // 10101
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
}, // M
{0x11, // 10001
0x11, // 10001
0x19, // 11001
0x15, // 10101
0x13, // 10011
0x11, // 10001
0x11, // 10001
}, // N
{0x0e, // 01110
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x11, // 10001
0x0e, // 01110
}, // O
{}, // P
{}, // Q
{}, // R
{}, // S
{}, // T
{}, // U
{}, // V
{}, // W
{}, // X
{}, // Y
{}, // Z
{}, // [
{}, // \.
{}, // ]
{}, // ^
{}, // _
};

View File

@ -8,12 +8,18 @@
#include "apple2_font.h"
/* 40x48 low-res mode */
#define XSIZE 40
#define YSIZE 48
#define PIXEL_X_SCALE 14
#define PIXEL_Y_SCALE 8
/* 40 column only for now */
#define TEXT_XSIZE 40
#define TEXT_YSIZE 24
#define TEXT_X_SCALE 14
#define TEXT_Y_SCALE 16
static int xsize=XSIZE*PIXEL_X_SCALE;
static int ysize=YSIZE*PIXEL_Y_SCALE;
@ -43,7 +49,8 @@ unsigned char a,y,x;
#define MASK 0x2E
#define COLOR 0x30
#define FIRST 0xF0
#define SPEEDZ 0xF1
#define FLASH 0xF3
#define TEMP 0xFA
@ -215,21 +222,70 @@ int scrn(unsigned char xcoord, unsigned char ycoord) {
return 0;
}
static short gr_addr_lookup[24]={
0x400,0x480,0x500,0x580,0x600,0x680,0x700,0x780,
0x428,0x4a8,0x528,0x5a8,0x628,0x6a8,0x728,0x7a8,
0x450,0x4d0,0x550,0x5d0,0x650,0x6d0,0x750,0x7d0,
};
int grsim_update(void) {
int x,y,i,j;
int bit_set,ch,inverse,flash;
unsigned int *t_pointer;
t_pointer=((Uint32 *)sdl_screen->pixels);
if (text_mode) {
for(y=0;y<YSIZE;y++) {
for(j=0;j<PIXEL_Y_SCALE;j++) {
for(x=0;x<XSIZE;x++) {
for(i=0;i<PIXEL_X_SCALE;i++) {
*t_pointer=color[15];
t_pointer++;
for(y=0;y<TEXT_YSIZE;y++) {
for(j=0;j<TEXT_Y_SCALE;j++) {
for(x=0;x<TEXT_XSIZE;x++) {
ch=ram[gr_addr_lookup[y]+x];
// printf("%x ",ch);
if (ch&0x80) {
flash=0;
inverse=0;
ch=ch&0x7f;
}
else if (ch&0x40) {
flash=1;
inverse=0;
ch=ch&0x3f;
}
else {
inverse=1;
flash=0;
ch=ch&0x3f;
}
for(i=0;i<TEXT_X_SCALE;i++) {
/* 14 x 16 */
/* but font is 5x7 */
/* FIXME: handle page2 */
if (j>12) bit_set=0;
else if (i>10) bit_set=0;
else bit_set=(a2_font[ch][j/2])&(1<<(i/2));
if (inverse) {
if (bit_set) *t_pointer=color[0];
else *t_pointer=color[15];
}
else if (flash) {
if (bit_set) *t_pointer=color[9];
else *t_pointer=color[0];
}
else {
if (bit_set) *t_pointer=color[15];
else *t_pointer=color[0];
}
t_pointer++;
}
}
}
@ -657,11 +713,6 @@ int basic_vlin(int y1, int y2, int at) {
}
short gr_addr_lookup[48]={
0x400,0x480,0x500,0x580,0x600,0x680,0x700,0x780,
0x428,0x4a8,0x528,0x5a8,0x628,0x6a8,0x728,0x7a8,
0x450,0x4d0,0x550,0x5d0,0x650,0x6d0,0x750,0x7d0,
};
int grsim_put_sprite(unsigned char *sprite_data, int xpos, int ypos) {
@ -734,15 +785,75 @@ int text(void) {
return 0;
}
int basic_htab(int x) {
return 0;
static void cout(void) {
// FDED
}
int basic_vtab(int y) {
return 0;
static void wait(void) {
}
int basic_print(char *string) {
return 0;
static void outdo(void) {
unsigned char s;
/* Print char in the accumulator */
a=a|0x80; /* raw ascii has high bit on Apple II */
if (a<0xa0) {
/* skip if control char? */
}
else {
a=a|ram[FLASH];
}
cout();
a=a&0x7f; // ?
s=a; // pha
a=ram[SPEEDZ];
wait(); // this is BASIC, slow down if speed set
a=s;
}
static void crdo(void) {
// DAFB
a=13; // carriage return
outdo();
a=a^0xff; /* negate for some reason? */
}
void basic_htab(int xpos) {
unsigned char s;
// F7E7
x=xpos; // JSR GETBYT
x--; // DEX
a=x; // TXA
while(a>=40) {
s=a; // PHA
crdo();
a=s; // PLA
a-=40;
}
ram[CH]=a; // STA MON.CH
// KRW for the win!
}
void basic_vtab(int y) {
}
void basic_print(char *string) {
int i;
for(i=0;i<strlen(string);i++) {
a=string[i];
outdo();
}
}

View File

@ -14,7 +14,7 @@ int home(void);
int grsim_put_sprite(unsigned char *sprite_data, int xpos, int ypos);
int gr_copy(short source, short dest);
int text(void);
int basic_htab(int x);
int basic_vtab(int y);
int basic_print(char *string);
void basic_htab(int x);
void basic_vtab(int y);
void basic_print(char *string);

View File

@ -10,6 +10,8 @@ int main(int argc, char **argv) {
grsim_init();
gr();
/* Put rainbow on screen */
for(y=0;y<40;y++) for(x=0;x<40;x++) {
color_equals(y%16);

View File

@ -12,6 +12,8 @@ int main(int argc, char **argv) {
home();
gr();
text();
basic_htab(10);

View File

@ -48,6 +48,8 @@ int main(int argc, char **argv) {
grsim_init();
gr();
/* Title Screen */
grsim_unrle(title_rle,0x800);
gr_copy(0x800,0x400);