mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-12-22 12:30:01 +00:00
more atari8 stuff, fixed mame; astrocade-bios preset, paddles
This commit is contained in:
parent
7b6af7ef04
commit
d7d2437004
@ -66,6 +66,7 @@ TODO:
|
||||
- requestInterrupt needs to be disabled after breakpoint?
|
||||
- verilog: when paused scope doesn't work
|
||||
- resize memory dump window
|
||||
- C/asm formatter
|
||||
|
||||
|
||||
WEB WORKER FORMAT
|
||||
|
@ -57,44 +57,43 @@ __sfr __at(0x13) hw_p4ctrl; // player controls
|
||||
byte __at (0x0000) vmagic[VHEIGHT][VBWIDTH];
|
||||
byte __at (0x4000) vidmem[VHEIGHT][VBWIDTH];
|
||||
|
||||
// Used by MUSIC PROCESSOR:
|
||||
volatile word MUZPC; // $4FCE // MUSic Program Counter
|
||||
volatile word MUZSP; // $4FD0 // MUSic Stack Pointer
|
||||
volatile byte PVOLAB; // $4FD2 // Preset VOLume for tones A and B
|
||||
volatile byte PVOLMC; // $4FD3 // Preset VOLuMe for tone C and Noise Mode
|
||||
volatile byte VOICES; // $4FD4 // music VOICES mask
|
||||
// COUNTER TIMERS (used by DECCTS,ACTINT,CTIMER):
|
||||
volatile byte CT[8];
|
||||
// Used by SENTRY to track controls:
|
||||
volatile byte CNT; // $4FDD // Counter update & Number Tracking
|
||||
volatile byte SEMI4S; // $4FDE // SEMAPHORE flag bitS
|
||||
volatile byte OPOT[4]; // $4FDF // Old POT 0 tracking byte
|
||||
volatile byte KEYSEX; // $4FE3 // KEYS-EX tracking byte
|
||||
volatile byte OSW[4]; // $4FE4 // Old SWitch 0 tracking byte
|
||||
volatile word COLLST; // $4FE8 // COLset LaST address for P.B. A
|
||||
// Used by STIMER:
|
||||
volatile byte DURAT; // $4FEA // note DURATion
|
||||
volatile byte TMR60; // $4FEB // TiMeR for SIXTY'ths of sec
|
||||
volatile byte TIMOUT; // $4FEC // TIMer for blackOUT
|
||||
volatile byte GTSECS; // $4FED // Game Time SECondS
|
||||
volatile byte GTMINS; // $4FEE // Game Time MINuteS
|
||||
// Used by MENU:
|
||||
long RANSHT; // $4FEF // RANdom number SHifT register
|
||||
byte NUMPLY; // $4FF3 // NUMber of PLaYers
|
||||
byte ENDSCR[3]; // $4FF4 // END SCoRe to 'play to'
|
||||
byte MRLOCK; // $4FF7 // Magic Register LOCK out flag
|
||||
byte GAMSTB; // $4FF8 // GAMe STatus Byte
|
||||
byte PRIOR; // $4FF9 // PRIOR music protect flag
|
||||
byte SENFLG; // $4FFA // SENtry control seizure FLaG
|
||||
// User UPI Routines, even numbers from $80 to $FE ( + 1 for SUCK):
|
||||
byte* UMARGT; // $4FFB // User Mask ARGument Table + (routine / 2)
|
||||
word* USERTB; // $4FFD // USER Table Base + routine = JumP address
|
||||
// start @ $4FCE
|
||||
volatile word MUZPC; // music PC
|
||||
volatile word MUZSP; // music SP
|
||||
volatile byte PVOLAB; // channels A and B volume
|
||||
volatile byte PVOLMC; // channel C volume and noise mask
|
||||
volatile byte VOICES; // voice smask
|
||||
|
||||
volatile byte CT[8]; // counter timers
|
||||
|
||||
volatile byte CNT;
|
||||
volatile byte SEMI4S;
|
||||
volatile byte OPOT[4];
|
||||
volatile byte KEYSEX;
|
||||
volatile byte OSW[4];
|
||||
volatile word COLLST;
|
||||
|
||||
volatile byte DURAT; // note duration
|
||||
volatile byte TMR60; // 1/60 sec timer
|
||||
volatile byte TIMOUT; // blackout timer
|
||||
volatile byte GTSECS; // seconds timer
|
||||
volatile byte GTMINS; // minutes timer
|
||||
|
||||
unsigned long RANSHT; // RNG
|
||||
byte NUMPLY; // # players
|
||||
byte ENDSCR[3]; // end score
|
||||
byte MRLOCK; // magic register lock out
|
||||
byte GAMSTB; // game status
|
||||
byte PRIOR; // music protect
|
||||
byte SENFLG; // sentry control
|
||||
|
||||
byte* UMARGT; // user mask table (-64 bytes)
|
||||
word* USERTB; // user routine table (-128 bytes)
|
||||
|
||||
// start routine @ 0x0
|
||||
void bios_start() __naked {
|
||||
__asm
|
||||
DI ; disable interrupts
|
||||
LD SP,#0x4fce ; position stack below BIOS vars
|
||||
LD HL,#0x2000
|
||||
LD A,(HL) ; A <- mem[0x2000]
|
||||
CP #0x55 ; found sentinel byte? ($55)
|
||||
@ -105,6 +104,7 @@ __asm
|
||||
JP _main ; jump to test program
|
||||
#endif
|
||||
FoundSentinel:
|
||||
LD SP,#0x4fce ; position stack below BIOS vars
|
||||
CALL _bios_init ; misc. bios init routines
|
||||
LD HL,#0x2005 ; cartridge start vector
|
||||
LD A,(HL)
|
||||
@ -166,8 +166,8 @@ typedef struct {
|
||||
const byte* chartab;
|
||||
} FontDescriptor;
|
||||
|
||||
#define LOCHAR 32
|
||||
#define HICHAR 127
|
||||
#define LOCHAR 0x20
|
||||
#define HICHAR 0x63
|
||||
|
||||
extern const char BIGFONT[HICHAR-LOCHAR+1][7];
|
||||
extern const char SMLFONT[HICHAR-LOCHAR+1][5];
|
||||
@ -335,11 +335,11 @@ void FILL(ContextBlock *ctx) {
|
||||
memset(dest, val, count);
|
||||
}
|
||||
|
||||
const char BIGFONT[HICHAR-LOCHAR+1][7] = {
|
||||
{ 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 },};
|
||||
const char BIGFONT[HICHAR-LOCHAR+1][7] = {/*{count:68,w:8,h:7,brev:1}*/
|
||||
{ 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,0x70,0xA8,0x20,0x20,0x00 },{ 0x00,0x20,0x40,0xF8,0x40,0x20,0x00 },{ 0x00,0x20,0x20,0xA8,0x70,0x20,0x00 },{ 0x00,0x20,0x10,0xF8,0x10,0x20,0x00 },{ 0x00,0x88,0x50,0x20,0x50,0x88,0x00 },{ 0x00,0x20,0x00,0xF8,0x00,0x20,0x00 }};
|
||||
|
||||
const char SMLFONT[HICHAR-LOCHAR+1][5] = {
|
||||
{ 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 },};
|
||||
const char SMLFONT[HICHAR-LOCHAR+1][5] = {/*{count:68,w:5,h:5,brev:1}*/
|
||||
{ 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 }};
|
||||
|
||||
// draw a letter
|
||||
void draw_char(const FontDescriptor* font, byte ch, byte x, byte y, byte op) {
|
||||
@ -449,6 +449,20 @@ void PAWS(ContextBlock *ctx) {
|
||||
}
|
||||
}
|
||||
|
||||
// MATH
|
||||
|
||||
void RANGED(ContextBlock *ctx) {
|
||||
/* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */
|
||||
RANSHT ^= RANSHT << 13;
|
||||
RANSHT ^= RANSHT >> 17;
|
||||
RANSHT ^= RANSHT << 5;
|
||||
if (ctx->regs.b.a == 0) {
|
||||
ctx->regs.b.a = (byte)RANSHT;
|
||||
} else {
|
||||
ctx->regs.b.a = (byte)(RANSHT % ctx->regs.b.a);
|
||||
}
|
||||
}
|
||||
|
||||
const SysCallEntry SYSCALL_TABLE[64] = {
|
||||
/* 0 */
|
||||
{ &INTPC, 0 },
|
||||
@ -521,7 +535,7 @@ const SysCallEntry SYSCALL_TABLE[64] = {
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ &RANGED, REG_A },
|
||||
/* 120 */
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
@ -535,8 +549,8 @@ void SYSCALL(ContextBlock *ctx) {
|
||||
SysRoutine* routine;
|
||||
// user-defined?
|
||||
if (op & 0x80) {
|
||||
argmask = UMARGT[op & 0x7f];
|
||||
routine = (SysRoutine*) USERTB[op & 0x7f];
|
||||
argmask = UMARGT[op>>1];
|
||||
routine = (SysRoutine*) USERTB[op>>1];
|
||||
} else {
|
||||
const SysCallEntry* entry = &SYSCALL_TABLE[op>>1];
|
||||
argmask = entry->argmask;
|
||||
@ -555,6 +569,7 @@ void SYSCALL(ContextBlock *ctx) {
|
||||
#ifdef TEST
|
||||
void main() {
|
||||
__asm
|
||||
LD SP,#0x4fce ; position stack below BIOS vars
|
||||
ld hl,#0x20d
|
||||
push hl
|
||||
pop ix
|
||||
@ -611,6 +626,6 @@ PATERN: .DB 0,0 ; (0,0) Position
|
||||
.DB 0x08,0x20 ; 0000100000100000 - . . 2 . . 2 . .
|
||||
.DB 0x00,0x00 ; 0000000000000000 - . . . . . . . .
|
||||
__endasm;
|
||||
while (1) CT[0]++;
|
||||
while (1) ;
|
||||
}
|
||||
#endif
|
@ -1,4 +1,4 @@
|
||||
|
||||
|
||||
; Atari 5200 "Hello World" sample code
|
||||
; Written by Daniel Boris (dboris@comcast.net)
|
||||
;
|
||||
@ -16,8 +16,7 @@ sDLISTH equ $06 ;Display list hi shadow
|
||||
CHBASE equ $D409 ;Character set base
|
||||
CHACTL equ $D401 ;Character control
|
||||
NMIEN equ $D40E ;NMI Enable
|
||||
COLOR1 equ $0D ;Color 1 shadow
|
||||
COLOR2 equ $0E ;Color 2 shadow
|
||||
COLOR0 equ $0C ;Color 0 shadow
|
||||
|
||||
org $4000 ;Start of cartridge area
|
||||
sei ;Disable interrupts
|
||||
@ -48,7 +47,7 @@ crloop3
|
||||
cmp #$40 ;Check if end of RAM
|
||||
bne crloop2 ;Branch if not
|
||||
|
||||
ldx #$21
|
||||
ldx #$2f
|
||||
dlloop ;Create Display List
|
||||
lda dlist,x ;Get byte
|
||||
sta $1000,x ;Copy to RAM
|
||||
@ -67,12 +66,17 @@ dlloop ;Create Display List
|
||||
sta $204 ;to BIOS routine
|
||||
lda #$FC
|
||||
sta $205
|
||||
lda #$03
|
||||
lda #$06
|
||||
sta CHACTL ;Set Character Control
|
||||
lda #$84 ;Set color PF2
|
||||
sta COLOR2
|
||||
sta COLOR0+2
|
||||
sta COLOR0+4 ; bakground
|
||||
lda #$0F ;Set color PF1
|
||||
sta COLOR1
|
||||
sta COLOR0+1
|
||||
lda #$3f
|
||||
sta COLOR0+0
|
||||
lda #$58
|
||||
sta COLOR0+3
|
||||
lda #$00 ;Set Display list pointer
|
||||
sta sDLISTL
|
||||
sta DLISTL
|
||||
@ -91,24 +95,36 @@ print
|
||||
cld
|
||||
prloop
|
||||
lda text1,y ;Get character
|
||||
beq wait
|
||||
cmp #$60
|
||||
bcs lower
|
||||
sec
|
||||
sbc #$20 ;Convert to ATASCII
|
||||
lower
|
||||
sta $1800,y ;Store in video memory
|
||||
iny ;Next character
|
||||
cpy #11
|
||||
bne prloop
|
||||
wait
|
||||
nop
|
||||
jmp wait
|
||||
|
||||
;Display list data
|
||||
org $b000
|
||||
dlist .byte $70,$70,$70,$42,$00,$18,$02,$02,$02,$02,$02,$02,$02
|
||||
.byte $02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02
|
||||
.byte $02,$02,$02,$41,$00,$10
|
||||
dlist .byte $70,$70,$70
|
||||
.byte $42,$00,$18,$02
|
||||
.byte $43,$00,$18,$02
|
||||
.byte $44,$00,$18,$02
|
||||
.byte $45,$00,$18,$02
|
||||
.byte $46,$00,$18,$06
|
||||
.byte $47,$00,$18,$06
|
||||
.byte $02,$02,$02,$02
|
||||
.byte $41,$00,$10
|
||||
|
||||
;Text data
|
||||
org $b100
|
||||
text1 .byte "HELLO WORLD"
|
||||
org $b100
|
||||
text1 .byte "Howdy Bagel! "
|
||||
.byte $a1,$a2,$a3
|
||||
.byte 0
|
||||
|
||||
org $bffd
|
||||
.byte $FF ;Don't display Atari logo
|
||||
|
@ -677,9 +677,11 @@ export abstract class BaseMAMEPlatform {
|
||||
}
|
||||
|
||||
reset() {
|
||||
this.luacall('manager:machine():soft_reset()');
|
||||
this.running = true;
|
||||
this.initluavars = false;
|
||||
if (this.loaded) {
|
||||
this.luacall('manager:machine():soft_reset()');
|
||||
this.running = true;
|
||||
this.initluavars = false;
|
||||
}
|
||||
}
|
||||
|
||||
isRunning() {
|
||||
@ -875,8 +877,10 @@ export abstract class BaseMAMEPlatform {
|
||||
return this.onBreakpointHit;// TODO?
|
||||
}
|
||||
setupDebug(callback) {
|
||||
this.initlua();
|
||||
this.luareset();
|
||||
if (this.loaded) { // TODO?
|
||||
this.initlua();
|
||||
this.luareset();
|
||||
}
|
||||
this.onBreakpointHit = callback;
|
||||
}
|
||||
runToPC(pc) {
|
||||
|
26
src/emu.ts
26
src/emu.ts
@ -1,6 +1,6 @@
|
||||
"use strict";
|
||||
|
||||
import { hex } from "./util";
|
||||
import { hex, clamp } from "./util";
|
||||
|
||||
// external modules
|
||||
declare var jt, Javatari, Z80_fast, CPU6809;
|
||||
@ -56,7 +56,8 @@ function _setKeyboardEvents(canvas:HTMLElement, callback:KeyboardCallback) {
|
||||
export var RasterVideo = function(mainElement:HTMLElement, width:number, height:number, options?) {
|
||||
var canvas, ctx;
|
||||
var imageData, arraybuf, buf8, datau32;
|
||||
|
||||
var vcanvas;
|
||||
|
||||
this.setRotate = function(rotate) {
|
||||
if (rotate) {
|
||||
// TODO: aspect ratio?
|
||||
@ -71,17 +72,12 @@ export var RasterVideo = function(mainElement:HTMLElement, width:number, height:
|
||||
|
||||
this.create = function() {
|
||||
this.canvas = canvas = __createCanvas(mainElement, width, height);
|
||||
vcanvas = $(canvas);
|
||||
if (options && options.rotate) {
|
||||
this.setRotate(options.rotate);
|
||||
}
|
||||
ctx = canvas.getContext('2d');
|
||||
imageData = ctx.createImageData(width, height);
|
||||
/*
|
||||
arraybuf = new ArrayBuffer(imageData.data.length);
|
||||
buf8 = new Uint8Array(arraybuf); // TODO: Uint8ClampedArray
|
||||
datau32 = new Uint32Array(arraybuf);
|
||||
buf8 = imageData.data;
|
||||
*/
|
||||
datau32 = new Uint32Array(imageData.data.buffer);
|
||||
}
|
||||
|
||||
@ -94,13 +90,25 @@ export var RasterVideo = function(mainElement:HTMLElement, width:number, height:
|
||||
this.getContext = function() { return ctx; }
|
||||
|
||||
this.updateFrame = function(sx:number, sy:number, dx:number, dy:number, width?:number, height?:number) {
|
||||
//imageData.data.set(buf8); // TODO: slow w/ partial updates
|
||||
if (width && height)
|
||||
ctx.putImageData(imageData, sx, sy, dx, dy, width, height);
|
||||
else
|
||||
ctx.putImageData(imageData, 0, 0);
|
||||
if (frameUpdateFunction) frameUpdateFunction(canvas);
|
||||
}
|
||||
|
||||
this.setupMouseEvents = function(el? : HTMLElement) {
|
||||
if (!el) el = canvas;
|
||||
$(el).mousemove( (e) => {
|
||||
// TODO: get coords right
|
||||
var x = e.pageX - vcanvas.offset().left;
|
||||
var y = e.pageY - vcanvas.offset().top;
|
||||
var new_x = Math.floor(x * 255 / vcanvas.width() - 20);
|
||||
var new_y = Math.floor(y * 255 / vcanvas.height() - 20);
|
||||
this.paddle_x = clamp(0, 255, new_x);
|
||||
this.paddle_y = clamp(0, 255, new_y);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
export var VectorVideo = function(mainElement:HTMLElement, width:number, height:number) {
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
import { Platform, BaseZ80Platform } from "../baseplatform";
|
||||
import { PLATFORMS, RAM, newAddressDecoder, padBytes, noise, setKeyboardFromMap, AnimationTimer, RasterVideo, Keys, makeKeycodeMap } from "../emu";
|
||||
import { hex, lzgmini, stringToByteArray, rgb2bgr } from "../util";
|
||||
import { hex, lzgmini, stringToByteArray, rgb2bgr, clamp } from "../util";
|
||||
import { MasterAudio, AY38910_Audio } from "../audio";
|
||||
|
||||
const ASTROCADE_PRESETS = [
|
||||
@ -12,7 +12,11 @@ const ASTROCADE_PRESETS = [
|
||||
{id:'cosmic.c', name:'Cosmic Impalas Game'},
|
||||
];
|
||||
|
||||
// TODO: fix keys, more controllers, paddles, vibrato/noise, border color, full refresh, debug info
|
||||
const ASTROCADE_BIOS_PRESETS = [
|
||||
{id:'bios.c', name:'BIOS'},
|
||||
];
|
||||
|
||||
// TODO: fix keys, more controllers, vibrato/noise, border color, debug info
|
||||
|
||||
const ASTROCADE_KEYCODE_MAP = makeKeycodeMap([
|
||||
// player 1
|
||||
@ -287,6 +291,7 @@ const _BallyAstrocadePlatform = function(mainElement, arcade) {
|
||||
psg = new AstrocadeAudio(audio);
|
||||
video = new RasterVideo(mainElement,swidth,sheight,{});
|
||||
video.create();
|
||||
video.setupMouseEvents();
|
||||
var idata = video.getFrameData();
|
||||
setKeyboardFromMap(video, inputs, ASTROCADE_KEYCODE_MAP);
|
||||
pixels = video.getFrameData();
|
||||
@ -297,7 +302,13 @@ const _BallyAstrocadePlatform = function(mainElement, arcade) {
|
||||
return membus.read(addr);
|
||||
}
|
||||
|
||||
loadControls() {
|
||||
inputs[0x1c] = video.paddle_x & 0xff;
|
||||
inputs[0x1d] = video.paddle_y & 0xff;
|
||||
}
|
||||
|
||||
advance(novideo : boolean) {
|
||||
this.loadControls();
|
||||
for (var sl=0; sl<sheight; sl++) {
|
||||
//console.log(sl, hex(cpu.getPC(),4), cpu.saveState());
|
||||
this.runCPU(cpu, cpuCyclesPerLine);
|
||||
@ -439,6 +450,10 @@ const _BallyArcadePlatform = function(mainElement) {
|
||||
const _BallyAstrocadeBIOSPlatform = function(mainElement) {
|
||||
this.__proto__ = new (_BallyAstrocadePlatform as any)(mainElement);
|
||||
|
||||
this.getPresets = function() {
|
||||
return ASTROCADE_BIOS_PRESETS;
|
||||
}
|
||||
|
||||
this.loadROM = this.loadBIOS;
|
||||
}
|
||||
|
||||
|
@ -75,6 +75,7 @@ class ANTIC {
|
||||
scanaddr : number = 0; // Scan Address (via LMS)
|
||||
startaddr: number = 0; // Start of line Address
|
||||
pfbyte : number = 0; // playfield byte fetched
|
||||
ch : number = 0; // char read
|
||||
linesleft : number = 0; // # of lines left in mode
|
||||
yofs : number = 0; // yofs fine
|
||||
v : number = 0; // vertical scanline #
|
||||
@ -96,6 +97,7 @@ class ANTIC {
|
||||
scanaddr: this.scanaddr,
|
||||
startaddr: this.startaddr,
|
||||
pfbyte: this.pfbyte,
|
||||
ch: this.ch,
|
||||
linesleft: this.linesleft,
|
||||
yofs: this.yofs,
|
||||
v: this.v,
|
||||
@ -111,6 +113,7 @@ class ANTIC {
|
||||
this.scanaddr = s.scanaddr;
|
||||
this.startaddr = s.startaddr;
|
||||
this.pfbyte = s.pfbyte;
|
||||
this.ch = s.ch;
|
||||
this.linesleft = s.linesleft;
|
||||
this.yofs = s.yofs;
|
||||
this.v = s.v;
|
||||
@ -129,14 +132,18 @@ class ANTIC {
|
||||
switch (a) {
|
||||
case DMACTL:
|
||||
this.pfwidth = this.regs[DMACTL] & 3;
|
||||
this.left = PF_LEFT[this.pfwidth]-4; // TODO
|
||||
this.right = PF_RIGHT[this.pfwidth]-4; // TODO
|
||||
this.setLeftRight();
|
||||
break;
|
||||
case NMIRES:
|
||||
this.regs[NMIST] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
setLeftRight() {
|
||||
let offset = 4 << MODE_PERIOD[this.mode & 0xf];
|
||||
this.left = PF_LEFT[this.pfwidth];
|
||||
this.right = PF_RIGHT[this.pfwidth];
|
||||
}
|
||||
readReg(a:number) {
|
||||
switch (a) {
|
||||
case NMIST: return this.regs[NMIST];
|
||||
@ -154,6 +161,7 @@ class ANTIC {
|
||||
if (this.mode & 0x80)
|
||||
this.triggerInterrupt(0x80); // Display List Interrupt (DLI)
|
||||
this.mode = this.nextInsn();
|
||||
this.setLeftRight();
|
||||
stolen++;
|
||||
if ((this.mode & 0xf) == 0) { // N Blank Lines
|
||||
this.linesleft = (this.mode >> 4) + 1;
|
||||
@ -247,14 +255,39 @@ class ANTIC {
|
||||
case 8: nc -= this.startline3(); break;
|
||||
case 12: nc -= this.startline4(); break;
|
||||
default:
|
||||
let mode = this.mode & 0xf;
|
||||
if (h >= 48 && h < 120) nc--; // steal 1 clock for memory refresh
|
||||
if (h >= this.left && h < this.right) { // fetch screen byte?
|
||||
if (h >= this.left && h < this.right && mode >= 2) { // fetch screen byte?
|
||||
if (((h>>2) & this.period) == 0) { // use period interval
|
||||
if ((this.mode & 0xf) < 8) { // character mode
|
||||
let ch = this.nextScreen();
|
||||
if (mode < 8) { // character mode
|
||||
let ch = this.ch = this.nextScreen();
|
||||
let addrofs = this.yofs;
|
||||
// modes 6 & 7
|
||||
if ((mode & 0xe) == 6) { // or 7
|
||||
ch &= 0x3f;
|
||||
} else {
|
||||
ch &= 0x7f;
|
||||
}
|
||||
let addr = (ch<<3) + (this.regs[CHBASE]<<8);
|
||||
this.pfbyte = this.read(addr + this.yofs);
|
||||
//console.log(hex(addr), this.yofs, hex(this.scanaddr), this.h, this.v, ch);
|
||||
// modes 2 & 3
|
||||
if ((mode & 0xe) == 2) { // or 3
|
||||
let chactl = this.regs[CHACTL];
|
||||
if (mode == 3 && ch >= 0x60) {
|
||||
// TODO
|
||||
}
|
||||
if (chactl & 4)
|
||||
this.pfbyte = this.read(addr + (addrofs ^ 7)); // mirror
|
||||
else
|
||||
this.pfbyte = this.read(addr + addrofs);
|
||||
if (this.ch & 0x80) {
|
||||
if (chactl & 1)
|
||||
this.pfbyte = 0x0; // blank
|
||||
if (chactl & 2)
|
||||
this.pfbyte ^= 0xff; // invert
|
||||
}
|
||||
} else {
|
||||
this.pfbyte = this.read(addr + addrofs);
|
||||
}
|
||||
nc -= 2;
|
||||
} else { // map mode
|
||||
this.pfbyte = this.nextScreen();
|
||||
@ -288,6 +321,9 @@ const GRAFP0 = 0x0d;
|
||||
const GRAFM = 0x11;
|
||||
const COLPM0 = 0x12;
|
||||
const COLPF0 = 0x16;
|
||||
const COLPF1 = 0x17;
|
||||
const COLPF2 = 0x18;
|
||||
const COLPF3 = 0x19;
|
||||
const COLBK = 0x1a;
|
||||
const PRIOR = 0x1b;
|
||||
const VDELAY = 0x1c;
|
||||
@ -327,13 +363,48 @@ class GTIA {
|
||||
}
|
||||
}
|
||||
clockPulse() : number {
|
||||
let colreg = (this.antic.pfbyte & 128) ? COLPF0 : COLBK;
|
||||
if ((this.count & this.antic.period) == 0)
|
||||
this.antic.pfbyte <<= 1;
|
||||
let colidx = this.regs[colreg];
|
||||
let pixel = (this.antic.pfbyte & 128) ? 1 : 0;
|
||||
let col = 0;
|
||||
switch (this.antic.mode & 0xf) {
|
||||
// blank line
|
||||
case 0:
|
||||
case 1:
|
||||
col = this.regs[COLBK];
|
||||
break;
|
||||
// normal text mode
|
||||
case 2:
|
||||
case 3:
|
||||
default:
|
||||
if (pixel)
|
||||
col = (this.regs[COLPF1] & 0xf) | (this.regs[COLPF2] & 0xf0);
|
||||
else
|
||||
col = this.regs[COLPF2];
|
||||
if ((this.count & this.antic.period) == 0)
|
||||
this.antic.pfbyte <<= 1;
|
||||
break;
|
||||
// 4bpp mode
|
||||
case 4:
|
||||
case 5:
|
||||
col = (this.antic.pfbyte>>6) & 3;
|
||||
if ((this.antic.ch & 0x80) && col==3)
|
||||
col = 4; // 5th color
|
||||
col = col ? this.regs[COLPF0-1+col] : this.regs[COLBK];
|
||||
if ((this.count & 1) == 0)
|
||||
this.antic.pfbyte <<= 2;
|
||||
break;
|
||||
// 4 colors per 64 chars mode
|
||||
case 6:
|
||||
case 7:
|
||||
if (pixel)
|
||||
col = this.regs[COLPF0 + (this.antic.ch>>6)];
|
||||
else
|
||||
col = this.regs[COLBK];
|
||||
if ((this.count & this.antic.period) == 0)
|
||||
this.antic.pfbyte <<= 1;
|
||||
break;
|
||||
}
|
||||
this.count = (this.count + 1) & 0xff;
|
||||
// TODO
|
||||
return COLORS_RGBA[colidx];
|
||||
return COLORS_RGBA[col];
|
||||
}
|
||||
static stateToLongString(state) : string {
|
||||
let s = "";
|
||||
@ -396,7 +467,7 @@ const _Atari8Platform = function(mainElement) {
|
||||
antic = new ANTIC(bus.read);
|
||||
gtia = new GTIA(antic);
|
||||
// create video/audio
|
||||
video = new RasterVideo(mainElement, 384, 192);
|
||||
video = new RasterVideo(mainElement, 352, 192);
|
||||
audio = newPOKEYAudio();
|
||||
video.create();
|
||||
video.setKeyboardEvents((key,code,flags) => {
|
||||
@ -454,7 +525,7 @@ const _Atari8Platform = function(mainElement) {
|
||||
cpu.clockPulse();
|
||||
}
|
||||
// 4 ANTIC pulses = 8 pixels
|
||||
if (antic.h >= 32 && antic.h < 32+192) { // TODO
|
||||
if (antic.v >= 24 && antic.h >= 44 && antic.h < 44+176) { // TODO: const
|
||||
for (var j=0; j<8; j++) {
|
||||
rgb = gtia.clockPulse();
|
||||
idata[iofs++] = rgb;
|
||||
@ -473,6 +544,7 @@ const _Atari8Platform = function(mainElement) {
|
||||
|
||||
loadROM(title, data) {
|
||||
rom = padBytes(data, romLength);
|
||||
rom[rom.length-3] = 0xff; // TODO
|
||||
this.reset();
|
||||
}
|
||||
|
||||
@ -551,27 +623,19 @@ const _Atari5200Platform = function(mainElement) {
|
||||
|
||||
/// MAME support
|
||||
|
||||
var Atari8MAMEPlatform = function(mainElement) {
|
||||
var self = this;
|
||||
this.__proto__ = new (BaseMAMEPlatform as any)();
|
||||
|
||||
this.loadROM = function(title, data) {
|
||||
abstract class Atari8MAMEPlatform extends BaseMAMEPlatform {
|
||||
loadROM(title, data) {
|
||||
this.loadROMFile(data);
|
||||
this.loadRegion(":cartleft:cart:rom", data);
|
||||
}
|
||||
|
||||
this.getPresets = function() { return Atari8_PRESETS; }
|
||||
|
||||
this.getToolForFilename = getToolForFilename_6502;
|
||||
this.getDefaultExtension = function() { return ".c"; };
|
||||
getPresets() { return Atari8_PRESETS; }
|
||||
getToolForFilename = getToolForFilename_6502;
|
||||
getDefaultExtension() { return ".c"; };
|
||||
}
|
||||
|
||||
var Atari800MAMEPlatform = function(mainElement) {
|
||||
var self = this;
|
||||
this.__proto__ = new Atari8MAMEPlatform(mainElement);
|
||||
|
||||
this.start = function() {
|
||||
self.startModule(mainElement, {
|
||||
class Atari800MAMEPlatform extends Atari8MAMEPlatform implements Platform {
|
||||
start() {
|
||||
this.startModule(this.mainElement, {
|
||||
jsfile:'mameatari400.js',
|
||||
biosfile:'a400.zip', // TODO: load multiple files
|
||||
//cfgfile:'atari5200.cfg',
|
||||
@ -586,12 +650,9 @@ var Atari800MAMEPlatform = function(mainElement) {
|
||||
}
|
||||
}
|
||||
|
||||
var Atari5200MAMEPlatform = function(mainElement) {
|
||||
var self = this;
|
||||
this.__proto__ = new (Atari8MAMEPlatform as any)(mainElement);
|
||||
|
||||
this.start = function() {
|
||||
self.startModule(mainElement, {
|
||||
class Atari5200MAMEPlatform extends Atari8MAMEPlatform implements Platform {
|
||||
start() {
|
||||
this.startModule(this.mainElement, {
|
||||
jsfile:'mameatari400.js',
|
||||
biosfile:'a5200/5200.rom',
|
||||
//cfgfile:'atari5200.cfg',
|
||||
|
@ -3,7 +3,7 @@
|
||||
import { Platform, BasePlatform } from "../baseplatform";
|
||||
import { PLATFORMS, setKeyboardFromMap, AnimationTimer, RasterVideo, Keys, makeKeycodeMap } from "../emu";
|
||||
import { SampleAudio } from "../audio";
|
||||
import { safe_extend } from "../util";
|
||||
import { safe_extend, clamp } from "../util";
|
||||
import { WaveformView, WaveformProvider, WaveformMeta } from "../waveform";
|
||||
|
||||
declare var Split;
|
||||
@ -279,10 +279,6 @@ var VerilogPlatform = function(mainElement, options) {
|
||||
debugCond = null;
|
||||
}
|
||||
|
||||
function clamp(minv,maxv,v) {
|
||||
return (v < minv) ? minv : (v > maxv) ? maxv : v;
|
||||
}
|
||||
|
||||
function shadowText(ctx, txt, x, y) {
|
||||
ctx.shadowColor = "black";
|
||||
ctx.shadowBlur = 0;
|
||||
|
@ -213,6 +213,7 @@ function reloadPresetNamed(id:string) {
|
||||
|
||||
function getSkeletonFile(fileid:string, callback) {
|
||||
var ext = platform.getToolForFilename(fileid);
|
||||
// TODO: .mame
|
||||
$.get( "presets/"+platform_id+"/skeleton."+ext, function( text ) {
|
||||
callback(null, text);
|
||||
}, 'text')
|
||||
@ -360,6 +361,7 @@ function fixFilename(fn : string) : string {
|
||||
|
||||
function _revertFile(e) {
|
||||
var fn = fixFilename(projectWindows.getActiveID());
|
||||
// TODO: .mame
|
||||
$.get( "presets/"+platform_id+"/"+fn, function(text) {
|
||||
if (confirm("Reset '" + fn + "' to default?")) {
|
||||
projectWindows.getActive().setText(text);
|
||||
|
@ -376,3 +376,7 @@ export function rgb2bgr(x) {
|
||||
return ((x&0xff)<<16) | ((x>>16)&0xff) | (x&0x00ff00);
|
||||
}
|
||||
|
||||
export function clamp(minv:number, maxv:number, v:number) {
|
||||
return (v < minv) ? minv : (v > maxv) ? maxv : v;
|
||||
}
|
||||
|
||||
|
@ -142,7 +142,8 @@ var PLATFORM_PARAMS = {
|
||||
'atari8-5200': {
|
||||
define: '__ATARI5200__',
|
||||
cfgfile: 'atari5200.cfg',
|
||||
libargs: ['atari5200.lib'],
|
||||
libargs: ['atari5200.lib',
|
||||
'-D', '__CARTFLAGS__=255'],
|
||||
},
|
||||
'c64': {
|
||||
define: '__C64__',
|
||||
@ -919,19 +920,26 @@ function assembleSDASZ80(step) {
|
||||
if (staleFiles(step, [objpath, lstpath])) {
|
||||
//?ASxxxx-Error-<o> in line 1 of main.asm null
|
||||
// <o> .org in REL area or directive / mnemonic error
|
||||
var match_asm_re = / <\w> (.+)/; // TODO
|
||||
// ?ASxxxx-Error-<q> in line 1627 of cosmic.asm
|
||||
// <q> missing or improper operators, terminators, or delimiters
|
||||
var match_asm_re1 = / in line (\d+) of (\S+)/; // TODO
|
||||
var match_asm_re2 = / <\w> (.+)/; // TODO
|
||||
var errline = 0;
|
||||
var errpath = step.path;
|
||||
function match_asm_fn(s) {
|
||||
var matches = match_asm_re.exec(s);
|
||||
if (matches) {
|
||||
//var errline = parseInt(matches[2]);
|
||||
errors.push({
|
||||
line:0, // TODO
|
||||
path:step.path,
|
||||
msg:matches[1]
|
||||
});
|
||||
var m = match_asm_re1.exec(s);
|
||||
if (m) {
|
||||
errline = parseInt(m[1]);
|
||||
errpath = m[2];
|
||||
} else {
|
||||
// ?ASxxxx-Error-<q> in line 1627 of cosmic.asm
|
||||
// <q> missing or improper operators, terminators, or delimiters
|
||||
m = match_asm_re2.exec(s);
|
||||
if (m) {
|
||||
errors.push({
|
||||
line:errline,
|
||||
path:errpath,
|
||||
msg:m[1]
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
var ASZ80 = sdasz80({
|
||||
@ -1527,7 +1535,7 @@ function executeBuildSteps() {
|
||||
// find previous link step to combine
|
||||
for (var i=0; i<buildsteps.length; i++) {
|
||||
var ls = buildsteps[i];
|
||||
if (ls.tool == linkstep.tool && ls.platform == linkstep.platform && ls.files) {
|
||||
if (ls.tool == linkstep.tool && ls.platform == linkstep.platform && ls.files && ls.args) {
|
||||
ls.files = ls.files.concat(linkstep.files);
|
||||
ls.args = ls.args.concat(linkstep.args);
|
||||
linkstep = null;
|
||||
@ -1545,7 +1553,7 @@ function executeBuildSteps() {
|
||||
path:step.result.path,
|
||||
args:step.result.args
|
||||
};
|
||||
buildsteps.push(asmstep);
|
||||
buildsteps.push(asmstep); // TODO: unshift changes order
|
||||
step.generated = asmstep.files;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user