mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-25 20:30:31 +00:00
gr-sim: minimal text mode support
still need to implement cout()
This commit is contained in:
parent
5b8bc29f5b
commit
e99d77f6fd
@ -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:
|
||||
|
@ -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
|
||||
{}, // [
|
||||
{}, // \.
|
||||
{}, // ]
|
||||
{}, // ^
|
||||
{}, // _
|
||||
};
|
||||
|
||||
|
149
gr-sim/gr-sim.c
149
gr-sim/gr-sim.c
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -12,6 +12,8 @@ int main(int argc, char **argv) {
|
||||
|
||||
home();
|
||||
|
||||
gr();
|
||||
|
||||
text();
|
||||
|
||||
basic_htab(10);
|
||||
|
@ -48,6 +48,8 @@ int main(int argc, char **argv) {
|
||||
|
||||
grsim_init();
|
||||
|
||||
gr();
|
||||
|
||||
/* Title Screen */
|
||||
grsim_unrle(title_rle,0x800);
|
||||
gr_copy(0x800,0x400);
|
||||
|
Loading…
Reference in New Issue
Block a user