1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2025-07-22 14:24:15 +00:00

bios fixes

This commit is contained in:
Steven Hugg
2018-09-06 16:58:28 -04:00
parent 3b4f933d20
commit 8e3dae776b
2 changed files with 166 additions and 65 deletions

View File

@@ -20,14 +20,15 @@ __sfr __at(0x05) hw_col1l;
__sfr __at(0x06) hw_col2l; __sfr __at(0x06) hw_col2l;
__sfr __at(0x07) hw_col3l; // palette 7 __sfr __at(0x07) hw_col3l; // palette 7
__sfr __at(0x08) hw_intst; // intercept test feedback
__sfr __at(0x09) hw_horcb; // horiz color boundary __sfr __at(0x09) hw_horcb; // horiz color boundary
__sfr __at(0x0a) hw_verbl; // vertical blanking line * 2 __sfr __at(0x0a) hw_verbl; // vertical blanking line * 2
__sfr __at(0x0c) hw_magic; // magic register __sfr __at(0x0c) hw_magic; // magic register
__sfr __at(0x0d) hw_infbk; // interrupt feedback
__sfr __at(0x0e) hw_inmod; // interrupt enable __sfr __at(0x0e) hw_inmod; // interrupt enable
__sfr __at(0x0f) hw_inlin; // interrupt line
__sfr __at(0x19) hw_xpand; // expander register __sfr __at(0x19) hw_xpand; // expander register
__sfr __at(0x08) hw_intst; // intercept test feedback
__sfr __at(0x10) hw_p1ctrl; // player controls __sfr __at(0x10) hw_p1ctrl; // player controls
__sfr __at(0x11) hw_p2ctrl; // player controls __sfr __at(0x11) hw_p2ctrl; // player controls
__sfr __at(0x12) hw_p3ctrl; // player controls __sfr __at(0x12) hw_p3ctrl; // player controls
@@ -70,7 +71,7 @@ byte SEMI4S; // $4FDE // SEMAPHORE flag bitS
byte OPOT[4]; // $4FDF // Old POT 0 tracking byte byte OPOT[4]; // $4FDF // Old POT 0 tracking byte
byte KEYSEX; // $4FE3 // KEYS-EX tracking byte byte KEYSEX; // $4FE3 // KEYS-EX tracking byte
byte OSW[4]; // $4FE4 // Old SWitch 0 tracking byte byte OSW[4]; // $4FE4 // Old SWitch 0 tracking byte
byte COLLST; // $4FE8 // COLset LaST address for P.B. A word COLLST; // $4FE8 // COLset LaST address for P.B. A
// Used by STIMER: // Used by STIMER:
byte DURAT; // $4FEA // note DURATion byte DURAT; // $4FEA // note DURATion
byte TMR60; // $4FEB // TiMeR for SIXTY'ths of sec byte TMR60; // $4FEB // TiMeR for SIXTY'ths of sec
@@ -92,61 +93,96 @@ word* USERTB; // $4FFD // USER Table Base + routine = JumP address
// start routine @ 0x0 // start routine @ 0x0
void bios_start() __naked { void bios_start() __naked {
__asm __asm
DI DI
LD SP,#0x4fce LD SP,#0x4fce
CALL _bios_init CALL _bios_init
LD HL,#0x2005 LD HL,#0x2005
LD A,(HL) LD A,(HL)
INC HL INC HL
#ifndef TEST #ifndef TEST
LD H,(HL) LD H,(HL)
LD L,A LD L,A
JP (HL) JP (HL)
#else #else
jp _main JP _main
#endif #endif
.ds 0x38 - 0xf ; skip to 0x38 .ds 0x38 - 0xf ; skip to 0x38
__endasm; __endasm;
} }
void interrupt_0x38() __naked { void interrupt_0x38() __naked {
__asm __asm
push hl push hl
push af push af
push bc push bc
push de push de
push ix push ix
push iy push iy
ld hl,#0 ld hl,#0
add hl,sp add hl,sp
push hl push hl
call _SYSCALL call _SYSCALL
pop hl pop hl
pop iy pop iy
pop ix pop ix
pop de pop de
pop bc pop bc
pop af pop af
pop hl pop hl
ret ret
__endasm; __endasm;
} }
void _predope() __naked { void _predope() __naked {
__asm __asm
.ds 0x200-0x52 ; skip to 0x200 .ds 0x200-0x52 ; skip to 0x200
__endasm; __endasm;
} }
// DOPE vector @ 0x200 // DOPE vector @ 0x200
void DOPE() __naked { void DOPE() __naked {
__asm __asm
JP _STIMER JP _STIMER
JP _CTIMER JP _CTIMER
.db 0x20, 8, 8, 1, 7
.dw _BIGFONT
.db 0xa0, 4, 6, 1, 5
.dw _SMLFONT
__endasm; __endasm;
} }
// TODO: font defs typedef struct {
byte base_ch;
byte frame_x;
byte frame_y;
byte pattern_x;
byte pattern_y;
const byte* chartab;
} FontDescriptor;
#define LOCHAR 32
#define HICHAR 127
extern const char BIGFONT[HICHAR-LOCHAR+1][7];
extern const char SMLFONT[HICHAR-LOCHAR+1][5];
const FontDescriptor __at(0x206) FNTSYS; // = { 0x20, 8, 8, 1, 7, (byte*)BIGFONT };
const FontDescriptor __at(0x20d) FNTSML; // = { 0xa0, 4, 6, 1, 5, (byte*)SMLFONT };
void hw_interrupt() __interrupt {
CT[0]++;
CT[1]++;
CT[2]++;
CT[3]++;
if (++TMR60 == 60) {
TMR60 = 0;
if (++GTSECS == 60) {
GTMINS++;
}
}
}
const void* const actint_vec = &hw_interrupt;
void STIMER() { void STIMER() {
} }
@@ -209,6 +245,19 @@ void RCALL(ContextBlock *ctx) {
((Routine*)ctx->regs.w.hl)(); ((Routine*)ctx->regs.w.hl)();
} }
void ACTINT(ContextBlock *ctx) {
ctx;
hw_inlin = 200;
hw_infbk = (byte) &actint_vec;
hw_inmod = 8;
__asm
LD A,#0x2 ; I = 0x200
LD I,A
IM 2 ; mode 2
EI ; enable interrupts
__endasm;
}
// Outputs D to port 0A, B to port 09, A to port 0E. // Outputs D to port 0A, B to port 09, A to port 0E.
void SETOUT(ContextBlock *ctx) { void SETOUT(ContextBlock *ctx) {
hw_verbl = ctx->regs.b.d; hw_verbl = ctx->regs.b.d;
@@ -237,20 +286,19 @@ void FILL(ContextBlock *ctx) {
memset(dest, val, count); memset(dest, val, count);
} }
#define LOCHAR 32 const char BIGFONT[HICHAR-LOCHAR+1][7] = {
#define HICHAR 127 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00 },{ 0x00,0x20,0x20,0x20,0x00,0x20,0x00 },{ 0x50,0x50,0x50,0x00,0x00,0x00,0x00 },{ 0x00,0x50,0xF8,0x50,0xF8,0x50,0x00 },{ 0x00,0xF8,0xA0,0xF8,0x28,0xF8,0x00 },{ 0x00,0xC8,0xD0,0x20,0x58,0x98,0x00 },{ 0x00,0xE0,0xA8,0xF8,0x90,0xF8,0x00 },{ 0x40,0x40,0x40,0x00,0x00,0x00,0x00 },{ 0x30,0x20,0x20,0x20,0x20,0x20,0x30 },{ 0x60,0x20,0x20,0x20,0x20,0x20,0x60 },{ 0x00,0x20,0xA8,0x70,0xA8,0x20,0x00 },{ 0x00,0x20,0x20,0xF8,0x20,0x20,0x00 },{ 0x00,0x00,0x00,0x00,0x60,0x60,0x40 },{ 0x00,0x00,0x00,0xF8,0x00,0x00,0x00 },{ 0x00,0x00,0x00,0x00,0x60,0x60,0x00 },{ 0x00,0x08,0x10,0x20,0x40,0x80,0x00 },{ 0x00,0xF8,0x88,0xE8,0x88,0xF8,0x00 },{ 0x00,0x10,0x30,0x50,0x10,0x10,0x00 },{ 0x00,0xF8,0x08,0xF8,0x80,0xF8,0x00 },{ 0x00,0xF8,0x08,0xF8,0x08,0xF8,0x00 },{ 0x00,0x38,0x48,0x88,0xF8,0x08,0x00 },{ 0x00,0xF8,0x80,0xF8,0x08,0xF8,0x00 },{ 0x00,0xF8,0x80,0xF8,0x88,0xF8,0x00 },{ 0x00,0xF8,0x08,0x10,0x20,0x40,0x00 },{ 0x00,0xF8,0x88,0xF8,0x88,0xF8,0x00 },{ 0x00,0xF8,0x88,0xF8,0x08,0xF8,0x00 },{ 0x00,0x30,0x30,0x00,0x30,0x30,0x00 },{ 0x00,0x30,0x30,0x00,0x30,0x30,0x20 },{ 0x08,0x10,0x20,0x40,0x20,0x10,0x08 },{ 0x00,0x00,0xF8,0x00,0xF8,0x00,0x00 },{ 0x40,0x20,0x10,0x08,0x10,0x20,0x40 },{ 0x00,0xF8,0x08,0x78,0x00,0x60,0x00 },{ 0x00,0xF8,0xA8,0xB8,0x80,0xF8,0x00 },{ 0x00,0xF8,0x88,0xF8,0x88,0x88,0x00 },{ 0x00,0xF0,0x90,0xF8,0x88,0xF8,0x00 },{ 0x00,0xF8,0x80,0x80,0x80,0xF8,0x00 },{ 0x00,0xE0,0x90,0x88,0x88,0xF8,0x00 },{ 0x00,0xF8,0x80,0xF8,0x80,0xF8,0x00 },{ 0x00,0xF8,0x80,0xF8,0x80,0x80,0x00 },{ 0x00,0xF8,0x80,0xB8,0x88,0xF8,0x00 },{ 0x00,0x88,0x88,0xF8,0x88,0x88,0x00 },{ 0x00,0x40,0x40,0x40,0x40,0x40,0x00 },{ 0x00,0x08,0x08,0x88,0x88,0xF8,0x00 },{ 0x00,0x88,0x90,0xA0,0x90,0x88,0x00 },{ 0x00,0x80,0x80,0x80,0x80,0xF8,0x00 },{ 0x00,0xFE,0x92,0x92,0x92,0x92,0x00 },{ 0x00,0x88,0xC8,0xA8,0x98,0x88,0x00 },{ 0x00,0xF8,0x88,0x88,0x88,0xF8,0x00 },{ 0x00,0xF8,0x88,0x88,0xF8,0x80,0x00 },{ 0x00,0xF8,0x88,0xA8,0xA8,0xF8,0x10 },{ 0x00,0xF8,0x88,0xF8,0x90,0x88,0x00 },{ 0x00,0xF8,0x80,0xF8,0x08,0xF8,0x00 },{ 0x00,0xF8,0x20,0x20,0x20,0x20,0x00 },{ 0x00,0x88,0x88,0x88,0x88,0xF8,0x00 },{ 0x00,0x88,0x88,0x90,0xA0,0xC0,0x00 },{ 0x00,0x92,0x92,0x92,0x92,0xFE,0x00 },{ 0x00,0x88,0x50,0x20,0x50,0x88,0x00 },{ 0x00,0x88,0x88,0xF8,0x08,0xF8,0x00 },{ 0x00,0xF8,0x10,0x20,0x40,0xF8,0x00 },{ 0x38,0x20,0x20,0x20,0x20,0x20,0x38 },{ 0x00,0x80,0x40,0x20,0x10,0x08,0x00 },{ 0x70,0x10,0x10,0x10,0x10,0x10,0x70 },{ 0x00,0x20,0x50,0x88,0x00,0x00,0x00 },{ 0x00,0x00,0x00,0x00,0x00,0x00,0xF8 },{ 0x40,0x20,0x10,0x00,0x00,0x00,0x00 },{ 0x00,0xF8,0x88,0xF8,0x88,0x88,0x00 },{ 0x00,0xF0,0x90,0xF8,0x88,0xF8,0x00 },{ 0x00,0xF8,0x80,0x80,0x80,0xF8,0x00 },{ 0x00,0xE0,0x90,0x88,0x88,0xF8,0x00 },{ 0x00,0xF8,0x80,0xF8,0x80,0xF8,0x00 },{ 0x00,0xF8,0x80,0xF8,0x80,0x80,0x00 },{ 0x00,0xF8,0x80,0xB8,0x88,0xF8,0x00 },{ 0x00,0x88,0x88,0xF8,0x88,0x88,0x00 },{ 0x00,0x40,0x40,0x40,0x40,0x40,0x00 },{ 0x00,0x08,0x08,0x88,0x88,0xF8,0x00 },{ 0x00,0x88,0x90,0xA0,0x90,0x88,0x00 },{ 0x00,0x80,0x80,0x80,0x80,0xF8,0x00 },{ 0x00,0xFE,0x92,0x92,0x92,0x92,0x00 },{ 0x00,0x88,0xC8,0xA8,0x98,0x88,0x00 },{ 0x00,0xF8,0x88,0x88,0x88,0xF8,0x00 },{ 0x00,0xF8,0x88,0x88,0xF8,0x80,0x00 },{ 0x00,0xF8,0x88,0xA8,0xA8,0xF8,0x10 },{ 0x00,0xF8,0x88,0xF8,0x90,0x88,0x00 },{ 0x00,0xF8,0x80,0xF8,0x08,0xF8,0x00 },{ 0x00,0xF8,0x20,0x20,0x20,0x20,0x00 },{ 0x00,0x88,0x88,0x88,0x88,0xF8,0x00 },{ 0x00,0x88,0x88,0x90,0xA0,0xC0,0x00 },{ 0x00,0x92,0x92,0x92,0x92,0xFE,0x00 },{ 0x00,0x88,0x50,0x20,0x50,0x88,0x00 },{ 0x00,0x88,0x88,0xF8,0x08,0xF8,0x00 },{ 0x00,0xF8,0x10,0x20,0x40,0xF8,0x00 },{ 0x38,0x20,0x20,0xE0,0x20,0x20,0x38 },{ 0x20,0x20,0x20,0x20,0x20,0x20,0x20 },{ 0xE0,0x20,0x20,0x38,0x20,0x20,0xE0 },{ 0x00,0xE8,0xB8,0x00,0x00,0x00,0x00 },{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00 },};
#define FONT_BWIDTH 1
#define FONT_HEIGHT 8 const char SMLFONT[HICHAR-LOCHAR+1][5] = {
const char FONT[HICHAR-LOCHAR+1][FONT_HEIGHT*FONT_BWIDTH] = { { 0x00,0x00,0x00,0x00,0x00 },{ 0x40,0x40,0x00,0x40,0x00 },{ 0xA0,0xA0,0x00,0x00,0x00 },{ 0x60,0xF0,0xF0,0x60,0x00 },{ 0x40,0xE0,0xE0,0x40,0x00 },{ 0x90,0x20,0x40,0x90,0x00 },{ 0xC0,0xB0,0xE0,0xD0,0x00 },{ 0x20,0x40,0x00,0x00,0x00 },{ 0x20,0x40,0x40,0x20,0x00 },{ 0x40,0x20,0x20,0x40,0x00 },{ 0x40,0xE0,0x40,0xA0,0x00 },{ 0x00,0x40,0xE0,0x40,0x00 },{ 0x00,0x00,0x00,0x60,0x20 },{ 0x00,0x00,0xE0,0x00,0x00 },{ 0x00,0x00,0x00,0x40,0x00 },{ 0x20,0x20,0x40,0x40,0x00 },{ 0xE0,0xA0,0xA0,0xE0,0x00 },{ 0xC0,0x40,0x40,0xE0,0x00 },{ 0xE0,0x20,0xC0,0xE0,0x00 },{ 0xE0,0x60,0x20,0xE0,0x00 },{ 0xA0,0xA0,0xE0,0x20,0x00 },{ 0xE0,0xC0,0x20,0xE0,0x00 },{ 0xC0,0x80,0xE0,0xE0,0x00 },{ 0xE0,0x20,0x40,0x40,0x00 },{ 0x60,0xE0,0xA0,0xE0,0x00 },{ 0xE0,0xE0,0x20,0x60,0x00 },{ 0x00,0x40,0x00,0x40,0x00 },{ 0x00,0x40,0x00,0x60,0x20 },{ 0x00,0x20,0x40,0x20,0x00 },{ 0x00,0xE0,0x00,0xE0,0x00 },{ 0x00,0x40,0x20,0x40,0x00 },{ 0xE0,0x20,0x60,0x00,0x40 },{ 0xF0,0x90,0x10,0xD0,0xF0 },{ 0x60,0xA0,0xE0,0xA0,0x00 },{ 0xC0,0xE0,0xA0,0xE0,0x00 },{ 0x60,0x80,0x80,0xE0,0x00 },{ 0xC0,0xA0,0xA0,0xC0,0x00 },{ 0xE0,0xC0,0x80,0xE0,0x00 },{ 0xE0,0xC0,0x80,0x80,0x00 },{ 0x60,0x80,0xA0,0xE0,0x00 },{ 0xA0,0xA0,0xE0,0xA0,0x00 },{ 0xE0,0x40,0x40,0xE0,0x00 },{ 0x60,0x20,0xA0,0xE0,0x00 },{ 0xA0,0xC0,0xC0,0xA0,0x00 },{ 0x80,0x80,0x80,0xE0,0x00 },{ 0xE0,0xE0,0xE0,0xA0,0x00 },{ 0xE0,0xA0,0xA0,0xA0,0x00 },{ 0xE0,0xA0,0xA0,0xE0,0x00 },{ 0xE0,0xA0,0xE0,0x80,0x00 },{ 0xE0,0xA0,0xE0,0xF0,0x00 },{ 0xE0,0xA0,0xC0,0xA0,0x00 },{ 0xE0,0x80,0x60,0xE0,0x00 },{ 0xE0,0x40,0x40,0x40,0x00 },{ 0xA0,0xA0,0xA0,0xE0,0x00 },{ 0xA0,0xA0,0xC0,0x80,0x00 },{ 0xA0,0xE0,0xE0,0xE0,0x00 },{ 0xA0,0x40,0xA0,0xA0,0x00 },{ 0xA0,0xE0,0x40,0x40,0x00 },{ 0xE0,0x20,0x40,0xE0,0x00 },{ 0x60,0x40,0x40,0x60,0x00 },{ 0x40,0x40,0x20,0x20,0x00 },{ 0x60,0x20,0x20,0x60,0x00 },{ 0x40,0xA0,0x00,0x00,0x00 },{ 0x00,0x00,0x00,0x00,0xF0 },{ 0x80,0x40,0x00,0x00,0x00 },{ 0x00,0x60,0xA0,0xE0,0x00 },{ 0x80,0xE0,0xA0,0xE0,0x00 },{ 0x00,0x60,0x80,0xE0,0x00 },{ 0x20,0xE0,0xA0,0xE0,0x00 },{ 0x00,0xE0,0xA0,0xC0,0x00 },{ 0x20,0x40,0x60,0x40,0x00 },{ 0x00,0x60,0xA0,0x60,0xC0 },{ 0x80,0xE0,0xA0,0xA0,0x00 },{ 0x40,0x00,0x40,0x40,0x00 },{ 0x40,0x00,0x40,0x40,0xC0 },{ 0x80,0xA0,0xC0,0xA0,0x00 },{ 0xC0,0x40,0x40,0x60,0x00 },{ 0x00,0xE0,0xE0,0xA0,0x00 },{ 0x00,0xE0,0xA0,0xA0,0x00 },{ 0x00,0xE0,0xA0,0xE0,0x00 },{ 0x00,0xE0,0xA0,0xE0,0x80 },{ 0x00,0xE0,0xA0,0xE0,0x20 },{ 0x00,0xE0,0x80,0x80,0x00 },{ 0x00,0x60,0x40,0xC0,0x00 },{ 0x40,0x60,0x40,0x60,0x00 },{ 0x00,0xA0,0xA0,0xE0,0x00 },{ 0x00,0xA0,0xE0,0x40,0x00 },{ 0x00,0xA0,0xE0,0xE0,0x00 },{ 0x00,0xA0,0x40,0xA0,0x00 },{ 0x00,0xA0,0xE0,0x20,0xC0 },{ 0x00,0xC0,0x40,0x60,0x00 },{ 0x60,0xC0,0x40,0x60,0x00 },{ 0x40,0x40,0x40,0x40,0x40 },{ 0xC0,0x60,0x40,0xC0,0x00 },{ 0x20,0xE0,0x80,0x00,0x00 },};
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, },{ 0x00,0x00,0x00,0x20,0x20,0x20,0x00,0x20, },{ 0x00,0x00,0x50,0x50,0x50,0x00,0x00,0x00, },{ 0x00,0x00,0x00,0x50,0xF8,0x50,0xF8,0x50, },{ 0x00,0x00,0x00,0xF8,0xA0,0xF8,0x28,0xF8, },{ 0x00,0x00,0x00,0xC8,0xD0,0x20,0x58,0x98, },{ 0x00,0x00,0x00,0xE0,0xA8,0xF8,0x90,0xF8, },{ 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00, },{ 0x00,0x00,0x30,0x20,0x20,0x20,0x20,0x20, },{ 0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20, },{ 0x00,0x00,0x00,0x20,0xA8,0x70,0xA8,0x20, },{ 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20, },{ 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60, },{ 0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00, },{ 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60, },{ 0x00,0x00,0x00,0x08,0x10,0x20,0x40,0x80, },{ 0x00,0x00,0x00,0xF8,0x88,0xE8,0x88,0xF8, },{ 0x00,0x00,0x00,0x10,0x30,0x50,0x10,0x10, },{ 0x00,0x00,0x00,0xF8,0x08,0xF8,0x80,0xF8, },{ 0x00,0x00,0x00,0xF8,0x08,0xF8,0x08,0xF8, },{ 0x00,0x00,0x00,0x38,0x48,0x88,0xF8,0x08, },{ 0x00,0x00,0x00,0xF8,0x80,0xF8,0x08,0xF8, },{ 0x00,0x00,0x00,0xF8,0x80,0xF8,0x88,0xF8, },{ 0x00,0x00,0x00,0xF8,0x08,0x10,0x20,0x40, },{ 0x00,0x00,0x00,0xF8,0x88,0xF8,0x88,0xF8, },{ 0x00,0x00,0x00,0xF8,0x88,0xF8,0x08,0xF8, },{ 0x00,0x00,0x00,0x30,0x30,0x00,0x30,0x30, },{ 0x00,0x00,0x00,0x30,0x30,0x00,0x30,0x30, },{ 0x00,0x00,0x08,0x10,0x20,0x40,0x20,0x10, },{ 0x00,0x00,0x00,0x00,0xF8,0x00,0xF8,0x00, },{ 0x00,0x00,0x40,0x20,0x10,0x08,0x10,0x20, },{ 0x00,0x00,0x00,0xF8,0x08,0x78,0x00,0x60, },{ 0x00,0x00,0x00,0xF8,0xA8,0xB8,0x80,0xF8, },{ 0x00,0x00,0x00,0xF8,0x88,0xF8,0x88,0x88, },{ 0x00,0x00,0x00,0xF0,0x90,0xF8,0x88,0xF8, },{ 0x00,0x00,0x00,0xF8,0x80,0x80,0x80,0xF8, },{ 0x00,0x00,0x00,0xE0,0x90,0x88,0x88,0xF8, },{ 0x00,0x00,0x00,0xF8,0x80,0xF8,0x80,0xF8, },{ 0x00,0x00,0x00,0xF8,0x80,0xF8,0x80,0x80, },{ 0x00,0x00,0x00,0xF8,0x80,0xB8,0x88,0xF8, },{ 0x00,0x00,0x00,0x88,0x88,0xF8,0x88,0x88, },{ 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40, },{ 0x00,0x00,0x00,0x08,0x08,0x88,0x88,0xF8, },{ 0x00,0x00,0x00,0x88,0x90,0xA0,0x90,0x88, },{ 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0xF8, },{ 0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0x92, },{ 0x00,0x00,0x00,0x88,0xC8,0xA8,0x98,0x88, },{ 0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0xF8, },{ 0x00,0x00,0x00,0xF8,0x88,0x88,0xF8,0x80, },{ 0x00,0x00,0x00,0xF8,0x88,0xA8,0xA8,0xF8, },{ 0x00,0x00,0x00,0xF8,0x88,0xF8,0x90,0x88, },{ 0x00,0x00,0x00,0xF8,0x80,0xF8,0x08,0xF8, },{ 0x00,0x00,0x00,0xF8,0x20,0x20,0x20,0x20, },{ 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0xF8, },{ 0x00,0x00,0x00,0x88,0x88,0x90,0xA0,0xC0, },{ 0x00,0x00,0x00,0x92,0x92,0x92,0x92,0xFE, },{ 0x00,0x00,0x00,0x88,0x50,0x20,0x50,0x88, },{ 0x00,0x00,0x00,0x88,0x88,0xF8,0x08,0xF8, },{ 0x00,0x00,0x00,0xF8,0x10,0x20,0x40,0xF8, },{ 0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20, },{ 0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08, },{ 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10, },{ 0x00,0x00,0x00,0x20,0x50,0x88,0x00,0x00, },{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, },{ 0x00,0x00,0x40,0x20,0x10,0x00,0x00,0x00, },{ 0x00,0x00,0x00,0xF8,0x88,0xF8,0x88,0x88, },{ 0x00,0x00,0x00,0xF0,0x90,0xF8,0x88,0xF8, },{ 0x00,0x00,0x00,0xF8,0x80,0x80,0x80,0xF8, },{ 0x00,0x00,0x00,0xE0,0x90,0x88,0x88,0xF8, },{ 0x00,0x00,0x00,0xF8,0x80,0xF8,0x80,0xF8, },{ 0x00,0x00,0x00,0xF8,0x80,0xF8,0x80,0x80, },{ 0x00,0x00,0x00,0xF8,0x80,0xB8,0x88,0xF8, },{ 0x00,0x00,0x00,0x88,0x88,0xF8,0x88,0x88, },{ 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40, },{ 0x00,0x00,0x00,0x08,0x08,0x88,0x88,0xF8, },{ 0x00,0x00,0x00,0x88,0x90,0xA0,0x90,0x88, },{ 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0xF8, },{ 0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0x92, },{ 0x00,0x00,0x00,0x88,0xC8,0xA8,0x98,0x88, },{ 0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0xF8, },{ 0x00,0x00,0x00,0xF8,0x88,0x88,0xF8,0x80, },{ 0x00,0x00,0x00,0xF8,0x88,0xA8,0xA8,0xF8, },{ 0x00,0x00,0x00,0xF8,0x88,0xF8,0x90,0x88, },{ 0x00,0x00,0x00,0xF8,0x80,0xF8,0x08,0xF8, },{ 0x00,0x00,0x00,0xF8,0x20,0x20,0x20,0x20, },{ 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0xF8, },{ 0x00,0x00,0x00,0x88,0x88,0x90,0xA0,0xC0, },{ 0x00,0x00,0x00,0x92,0x92,0x92,0x92,0xFE, },{ 0x00,0x00,0x00,0x88,0x50,0x20,0x50,0x88, },{ 0x00,0x00,0x00,0x88,0x88,0xF8,0x08,0xF8, },{ 0x00,0x00,0x00,0xF8,0x10,0x20,0x40,0xF8, },{ 0x00,0x00,0x38,0x20,0x20,0xE0,0x20,0x20, },{ 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20, },{ 0x00,0x00,0xE0,0x20,0x20,0x38,0x20,0x20, },{ 0x00,0x00,0x00,0xE8,0xB8,0x00,0x00,0x00, },{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, },};
// draw a letter // draw a letter
void draw_char(byte ch, byte x, byte y, byte op) { void draw_char(const FontDescriptor* font, byte ch, byte x, byte y, byte op) {
const byte* src = &FONT[(ch-LOCHAR)][0]; const byte* src = font->chartab + (ch-font->base_ch)*font->pattern_y;
byte xb = x>>2; // divide x by 4 byte xb = x>>2; // divide x by 4
byte* dest = &vmagic[y][xb]; // destination address byte* dest = &vmagic[y][xb]; // destination address
hw_magic = M_SHIFT(x) | M_XPAND | op; hw_magic = M_SHIFT(x) | M_XPAND | op;
for (byte i=0; i<8; i++) { for (byte i=0; i<font->pattern_y; i++) {
char b = *src++; char b = *src++;
EXIT_CLIPDEST(dest); EXIT_CLIPDEST(dest);
*dest++ = b; // expand lower nibble -> 1st byte *dest++ = b; // expand lower nibble -> 1st byte
@@ -261,12 +309,38 @@ void draw_char(byte ch, byte x, byte y, byte op) {
} }
} }
void draw_string(const char* str, byte x, byte y, byte op) { #define FONT_IX ((const FontDescriptor*)ctx->regs.w.ix)
void draw_string(ContextBlock *ctx, const char* str, byte x, byte y, byte op) {
do { do {
byte ch = *str++; byte ch = *str++;
if (!ch) break; if (!ch) {
draw_char(ch, x, y, op); ctx->regs.b.e = x;
x += 8; break;
}
if (ch < 0x20) {
x += 8 * ch;
} else if (ch < 0x64) {
draw_char(&FNTSYS, ch, x, y, op);
x += 8;
} else if (ch >= 0x80) {
draw_char(FONT_IX, ch, x, y, op);
x += FONT_IX->frame_x;
} else {
/*
if (ch & 0x10) {
ctx->regs.b.ixl = *str++;
ctx->regs.b.ixh = *str++;
}
if (ch & 0x1)
ctx->regs.b.e = *str++;
if (ch & 0x2)
ctx->regs.b.d = *str++;
if (ch & 0x4)
ctx->regs.b.c = *str++;
*/
// TODO: only can change font
}
} while (1); } while (1);
} }
@@ -278,7 +352,7 @@ void STRDIS(ContextBlock *ctx) {
char* str = (char*) ctx->regs.w.hl; char* str = (char*) ctx->regs.w.hl;
void* fontdesc = (void*) ctx->regs.w.ix; void* fontdesc = (void*) ctx->regs.w.ix;
hw_xpand = opts & 0xf; hw_xpand = opts & 0xf;
draw_string(str, x, y, 3&(opts>>4)); // TODO: opts draw_string(ctx, str, x, y, 3&(opts>>4)); // TODO: opts
} }
// Character display routine // Character display routine
@@ -290,6 +364,12 @@ void CHRDIS(ContextBlock *ctx) {
STRDIS(ctx); STRDIS(ctx);
} }
typedef struct {
sbyte xofs, yofs;
byte xsize, ysize;
byte pattern[0];
} PatternBlock;
const SysCallEntry SYSCALL_TABLE[64] = { const SysCallEntry SYSCALL_TABLE[64] = {
/* 0 */ /* 0 */
{ &INTPC, 0 }, { &INTPC, 0 },
@@ -300,7 +380,7 @@ const SysCallEntry SYSCALL_TABLE[64] = {
/* 10 */ /* 10 */
{ 0, 0 }, { 0, 0 },
{ 0, 0 }, { 0, 0 },
{ 0, 0 }, { &ACTINT, 0 },
{ 0, 0 }, { 0, 0 },
{ 0, 0 }, { 0, 0 },
/* 20 */ /* 20 */
@@ -420,10 +500,14 @@ void SYSCALL(ContextBlock *ctx) {
#ifdef TEST #ifdef TEST
void main() { void main() {
__asm __asm
ld hl,#0x20d
push hl
pop ix
RST 0x38 RST 0x38
.db 0 ; INTPC .db 0 ; INTPC
.db 22+1 ; SETOUT .db 22+1 ; SETOUT
.db 102*2, 0x1c, 0x08 .db 102*2, 0x1c, 0x08
.db 14 ; ACTINT
.db 24+1 ; COLSET .db 24+1 ; COLSET
.dw _main ; palette??? .dw _main ; palette???
.db 26+1 ; FILL .db 26+1 ; FILL
@@ -435,17 +519,42 @@ __asm
.db 32 .db 32
.db 0x0c .db 0x0c
.dw HelloString .dw HelloString
.db 52+1 ; draw string
.db 0
.db 48
.db 0x0c
.dw HelloString
.db 50+1 ; draw char .db 50+1 ; draw char
.db 0 .db 0
.db 64 .db 64
.db 0x0c .db 0x0c
.db 65 .db 0x40
.db 2 ; EXIT .db 2 ; EXIT
jp .end .loop:
ld hl,#0x4FED
ld a,(hl)
add a,#0x30
RST 0x38
.db 50 ; draw char
jp .loop
HelloString: HelloString:
.ascii "HELLO WORLD!" .ascii "HELLO WORLD! "
.db 0 .db 0xc1, 0xc2, 0xc3, 0xc4, 0xc5
.end: .db 0
; Critter Pattern
; Color 0 = White and Color 2 = Black
;
PATERN: .DB 0,0 ; (0,0) Position
.DB 0x02,0x08 ; 2 byte, 8 line pattern size
.DB 0x0A,0xA0 ; 0000101010100000 - . . 2 2 2 2 . .
.DB 0x22,0x88 ; 0010001010001000 - . 2 . 2 2 . 2 .
.DB 0xAA,0xAA ; 1010101010101010 - 2 2 2 2 2 2 2 2
.DB 0x2A,0xA8 ; 0010101010101000 - . 2 2 2 2 2 2 .
.DB 0x08,0x20 ; 0000100000100000 - . . 2 . . 2 . .
.DB 0x20,0x08 ; 0010000000001000 - . 2 . . . . 2 .
.DB 0x08,0x20 ; 0000100000100000 - . . 2 . . 2 . .
.DB 0x00,0x00 ; 0000000000000000 - . . . . . . . .
__endasm; __endasm;
while (1) CT[0]++; while (1) CT[0]++;
} }

View File

@@ -186,14 +186,8 @@ function renderGlyph(glyph, putPixel) {
var xx = x+dx; var xx = x+dx;
var yy = y+dy; var yy = y+dy;
yy += params.yoffset || 0; yy += params.yoffset || 0;
/*
font.pixbounds[0] = Math.min(font.pixbounds[0], xx);
font.pixbounds[1] = Math.min(font.pixbounds[1], yy);
font.pixbounds[2] = Math.max(font.pixbounds[2], xx);
font.pixbounds[3] = Math.max(font.pixbounds[3], yy);
*/
var xoutrange = xx < 0 || x >= params.width; var xoutrange = xx < 0 || x >= params.width;
var youtrange = yy < 0 || y >= params.width; var youtrange = yy < 0 || y >= params.height;
if (!xoutrange && !youtrange) { if (!xoutrange && !youtrange) {
putPixel(xx, yy); putPixel(xx, yy);
} else if (!error_logged) { } else if (!error_logged) {
@@ -250,8 +244,6 @@ function previewFont() {
function encodeGlyph(glyph, bytes) { function encodeGlyph(glyph, bytes) {
var abort = false; var abort = false;
renderGlyph(glyph, function(x,y) { renderGlyph(glyph, function(x,y) {
//x -= font.pixbounds[0];
//y -= font.pixbounds[1];
if (params.yflip) { y = params.height-1-y; } if (params.yflip) { y = params.height-1-y; }
if (params.xflip ^ params.rotate) { x = params.width-1-x; } if (params.xflip ^ params.rotate) { x = params.width-1-x; }
if (params.rotate) { if (params.rotate) {