2018-12-03 15:51:47 +00:00
|
|
|
|
|
|
|
#ifndef _ACLIB_H
|
|
|
|
#define _ACLIB_H
|
|
|
|
|
2019-05-27 01:54:37 +00:00
|
|
|
// convenient type definitions
|
|
|
|
|
2018-12-03 15:51:47 +00:00
|
|
|
typedef unsigned char byte;
|
|
|
|
typedef signed char sbyte;
|
|
|
|
typedef unsigned short word;
|
2019-05-27 01:54:37 +00:00
|
|
|
typedef enum { false, true } bool;
|
2018-12-03 15:51:47 +00:00
|
|
|
|
2019-05-27 01:54:37 +00:00
|
|
|
/// registers
|
2018-12-03 15:51:47 +00:00
|
|
|
|
|
|
|
__sfr __at(0x00) hw_col0r; // palette 0
|
|
|
|
__sfr __at(0x01) hw_col1r;
|
|
|
|
__sfr __at(0x02) hw_col2r;
|
|
|
|
__sfr __at(0x03) hw_col3r;
|
|
|
|
__sfr __at(0x04) hw_col0l;
|
|
|
|
__sfr __at(0x05) hw_col1l;
|
|
|
|
__sfr __at(0x06) hw_col2l;
|
|
|
|
__sfr __at(0x07) hw_col3l; // palette 7
|
2019-05-28 01:52:00 +00:00
|
|
|
__sfr __at(0x08) hw_concm; // consumer/commercial mode
|
2018-12-03 15:51:47 +00:00
|
|
|
__sfr __at(0x09) hw_horcb; // horiz color boundary
|
|
|
|
__sfr __at(0x0a) hw_verbl; // vertical blanking line * 2
|
2019-05-28 01:52:00 +00:00
|
|
|
__sfr __at(0x0b) hw_colbx; // palette transfer
|
2018-12-03 15:51:47 +00:00
|
|
|
__sfr __at(0x0c) hw_magic; // magic register
|
2019-05-28 01:52:00 +00:00
|
|
|
__sfr __at(0x0d) hw_infbk; // interrupt feedback
|
|
|
|
__sfr __at(0x0e) hw_inmod; // interrupt enable, mode
|
|
|
|
__sfr __at(0x0f) hw_inlin; // interrupt line
|
2018-12-03 15:51:47 +00:00
|
|
|
__sfr __at(0x19) hw_xpand; // expander register
|
|
|
|
|
|
|
|
__sfr __at(0x08) hw_intst; // intercept test feedback
|
|
|
|
|
2019-05-27 01:54:37 +00:00
|
|
|
__sfr __at(0x10) hw_p1ctrl; // player 1 controls
|
|
|
|
__sfr __at(0x11) hw_p2ctrl; // player 2 controls
|
|
|
|
__sfr __at(0x12) hw_p3ctrl; // player 3 controls
|
|
|
|
__sfr __at(0x13) hw_p4ctrl; // player 4 controls
|
2019-06-13 03:26:16 +00:00
|
|
|
__sfr __at(0x14) hw_keypad0; // keypad column
|
|
|
|
__sfr __at(0x15) hw_keypad1; // keypad column
|
|
|
|
__sfr __at(0x16) hw_keypad2; // keypad column
|
|
|
|
__sfr __at(0x17) hw_keypad3; // keypad column
|
|
|
|
__sfr __at(0x1c) hw_p1pot; // player 1 paddle
|
|
|
|
__sfr __at(0x1d) hw_p2pot; // player 1 paddle
|
|
|
|
__sfr __at(0x1e) hw_p3pot; // player 1 paddle
|
|
|
|
__sfr __at(0x1f) hw_p4pot; // player 1 paddle
|
2019-05-27 01:54:37 +00:00
|
|
|
|
2019-05-28 01:52:00 +00:00
|
|
|
__sfr __at(0x10) hw_tonmo; // tone master oscillator
|
|
|
|
__sfr __at(0x11) hw_tonea;
|
|
|
|
__sfr __at(0x12) hw_toneb;
|
|
|
|
__sfr __at(0x13) hw_tonec;
|
|
|
|
__sfr __at(0x14) hw_vibra;
|
|
|
|
__sfr __at(0x15) hw_volc;
|
|
|
|
__sfr __at(0x16) hw_volab;
|
|
|
|
__sfr __at(0x17) hw_voln;
|
|
|
|
__sfr __at(0x18) hw_sndbx;
|
|
|
|
|
2019-06-13 03:26:16 +00:00
|
|
|
// magic register flags
|
2018-12-03 15:51:47 +00:00
|
|
|
|
|
|
|
#define M_SHIFT0 0x00
|
|
|
|
#define M_SHIFT1 0x01
|
|
|
|
#define M_SHIFT2 0x02
|
|
|
|
#define M_SHIFT3 0x03
|
2019-06-03 14:08:29 +00:00
|
|
|
#define M_ROTATE 0x04
|
2018-12-03 15:51:47 +00:00
|
|
|
#define M_XPAND 0x08
|
|
|
|
#define M_MOVE 0x00
|
|
|
|
#define M_OR 0x10
|
|
|
|
#define M_XOR 0x20
|
|
|
|
#define M_FLOP 0x40
|
2019-06-03 14:08:29 +00:00
|
|
|
|
2018-12-03 15:51:47 +00:00
|
|
|
#define M_SHIFT(x) ((x)&3)
|
2019-06-03 14:08:29 +00:00
|
|
|
|
2019-06-13 03:26:16 +00:00
|
|
|
// xpand register
|
|
|
|
|
2018-12-03 15:51:47 +00:00
|
|
|
#define XPAND_COLORS(off,on) (((off)&3) | (((on)&3)<<2))
|
|
|
|
|
2019-06-13 03:26:16 +00:00
|
|
|
// collision detection
|
|
|
|
|
|
|
|
#define RESET_COLLISION() (hw_intst)
|
|
|
|
#define WAS_COLLISION() ((hw_intst & 0xf0)!=0)
|
|
|
|
|
|
|
|
// controller flags
|
|
|
|
|
|
|
|
#define JOY_UP 0x1
|
|
|
|
#define JOY_DOWN 0x2
|
|
|
|
#define JOY_LEFT 0x4
|
|
|
|
#define JOY_RIGHT 0x8
|
|
|
|
#define JOY_TRIGGER 0x10
|
|
|
|
|
|
|
|
// constants
|
|
|
|
|
2019-05-27 01:54:37 +00:00
|
|
|
#define VTOTAL 102 // number of total scanlines
|
|
|
|
#define VHEIGHT 89 // number of scanlines in use
|
2018-12-03 15:51:47 +00:00
|
|
|
#define VBWIDTH 40 // number of bytes per scanline
|
|
|
|
#define PIXWIDTH 160 // 4 pixels per byte
|
|
|
|
|
2019-05-27 01:54:37 +00:00
|
|
|
// magic register active area
|
|
|
|
byte __at (0x0000) vmagic[VTOTAL][VBWIDTH];
|
|
|
|
// regular frame buffer RAM
|
|
|
|
byte __at (0x4000) vidmem[VTOTAL][VBWIDTH];
|
2018-12-03 15:51:47 +00:00
|
|
|
|
2019-07-06 18:41:15 +00:00
|
|
|
byte __at(0xfff) WASTER; // to soak up shifter residue
|
|
|
|
|
|
|
|
|
2018-12-03 15:51:47 +00:00
|
|
|
/// GRAPHICS FUNCTIONS
|
|
|
|
|
2019-05-28 01:52:00 +00:00
|
|
|
void set_palette(byte palette[8]) __z88dk_fastcall; // palette in reverse order
|
2019-07-06 18:41:15 +00:00
|
|
|
|
|
|
|
#define SET_PALETTE(palette)\
|
|
|
|
__asm__("ld hl,#"#palette);\
|
|
|
|
__asm__("ld bc,#0x80b");\
|
|
|
|
__asm__("otir");\
|
|
|
|
|
|
|
|
#define SET_RIGHT_PALETTE(palette)\
|
|
|
|
__asm__("ld hl,#"#palette);\
|
|
|
|
__asm__("ld bc,#0x40b");\
|
|
|
|
__asm__("otir");\
|
|
|
|
|
|
|
|
/// SOUND FUNCTIONS
|
|
|
|
|
2019-05-31 19:05:33 +00:00
|
|
|
void set_sound_registers(byte regs[8]) __z88dk_fastcall; // in reverse too
|
2019-05-27 01:54:37 +00:00
|
|
|
|
2019-07-06 18:41:15 +00:00
|
|
|
/// INTERRUPTS
|
2019-06-06 19:40:31 +00:00
|
|
|
|
|
|
|
typedef void (*t_interrupt_handler)(void) __interrupt;
|
|
|
|
|
|
|
|
void set_interrupt_vector(t_interrupt_handler*ih) __z88dk_fastcall;
|
|
|
|
|
2019-06-13 03:26:16 +00:00
|
|
|
#define CHANGE_INTERRUPT_VECTOR(ihp)\
|
|
|
|
__asm__("ld hl,#"#ihp);\
|
|
|
|
__asm__("ld a,l");\
|
|
|
|
__asm__("out (0x0D),a");\
|
|
|
|
__asm__("ld a,h");\
|
|
|
|
__asm__("ld i,a");\
|
|
|
|
|
2018-12-03 15:51:47 +00:00
|
|
|
#endif
|