8bitworkshop/presets/astrocade/acbios.h

149 lines
3.4 KiB
C

#ifndef _ACBIOS_H
#define _ACBIOS_H
#include "aclib.h"
// FONT DESCRIPTORS
typedef struct {
byte base_ch;
byte frame_x;
byte frame_y;
byte pattern_x;
byte pattern_y;
const byte* chartab;
} FontDescriptor;
const FontDescriptor __at(0x206) FNTSYS; // system font
const FontDescriptor __at(0x20d) FNTSML; // small font
const byte __at(0x214) ALKEYS[4]; // "all keys" keyboard mask
// SENTRY
typedef enum {
SNUL,
SCT0,SCT1,SCT2,SCT3,SCT4,SCT5,SCT6,SCT7,
SF0,SF1,SF2,SF3,SF4,SF5,SF6,SF7,
SSEC,
SKYU,SKYD,
ST0,SJ0,ST1,SJ1,ST2,SJ2,ST3,SJ3,
SP0,SP1,SP2,SP3
} SENTRYCode;
typedef struct {
byte code;
word address;
} DOITEntry;
#define DOIT_END 0xff
// PATTERNS
typedef struct {
sbyte xofs, yofs;
byte xsize, ysize;
byte pattern[0];
} RelativeBlock;
typedef struct {
byte xsize, ysize;
byte pattern[0];
} PatternBlock;
// FUNCTIONS
#define OPT_1x1 0x00
#define OPT_2x2 0x40
#define OPT_4x4 0x80
#define OPT_8x8 0xc0
#define OPT_XOR 0x20
#define OPT_OR 0x10
#define OPT_ON(n) ((n)<<2)
#define OPT_OFF(n) ((n))
#define DISBCD_SML 0x40
#define DISBCD_NOZERO 0x80
void activate_interrupts(void);
void sleep(byte frames) __z88dk_fastcall;
void fast_vsync(void);
void display_string(byte x, byte y, byte options, const char* str);
void paint_rectangle(byte x, byte y, byte w, byte h, byte colormask);
void blank_area(byte wb, byte h, byte data, byte* video);
void write_relative(byte x, byte y, byte magic, const byte* pattern);
void write_pattern(byte x, byte y, byte magic, const byte* pattern);
void display_bcd_number(byte x, byte y, byte options, const byte* number, byte extopt);
void bcdn_add(byte* dest, byte size, const byte* n);
void bcdn_sub(byte* dest, byte size, const byte* n);
byte ranged_random(byte n) __z88dk_fastcall;
byte keycode_to_ascii(byte n) __z88dk_fastcall;
word sense_transition(const byte keypad_mask[4]) __z88dk_fastcall;
void respond_to_input(const DOITEntry* doit_table, byte a);
void respond_to_input_b(const DOITEntry* doit_table, byte b);
void begin_music(const byte* stack, byte voices, const byte* musicdata);
void end_music(void);
// QUICK MACROS
#define SYS_ACTINT()\
__asm__("rst 0x38");\
__asm__(".db 0x0f");\
#define SYS_PAWS(frames)\
__asm__("rst 0x38");\
__asm__(".db 0x51");\
__asm__(".db "#frames);\
#define SYS_SETOUT(verbl,horcb,inmod)\
__asm__("rst 0x38");\
__asm__(".db 0x17");\
__asm__(".db "#verbl);\
__asm__(".db "#horcb);\
__asm__(".db "#inmod);\
#define SYS_FILL(dest,count,val)\
__asm__("rst 0x38");\
__asm__(".db 0x1b");\
__asm__(".dw "#dest);\
__asm__(".dw "#count);\
__asm__(".db "#val);\
#define SYS_MOVE(dest,src,count)\
__asm__("rst 0x38");\
__asm__(".db 0x5f");\
__asm__(".dw "#dest);\
__asm__(".dw "#count);\
__asm__(".dw "#src);\
#define SYS_RECTAN(x,y,width,height,color)\
__asm__("rst 0x38");\
__asm__(".db 0x1d");\
__asm__(".db "#x);\
__asm__(".db "#y);\
__asm__(".db "#width);\
__asm__(".db "#height);\
__asm__(".db "#color);\
#define SYS_BMUSIC(stack,voices,musicdata)\
__asm__("rst 0x38");\
__asm__(".db 0x13");\
__asm__(".dw "#stack);\
__asm__(".db "#voices);\
__asm__(".dw "#musicdata);\
#define SYS_EMUSIC()\
__asm__("rst 0x38");\
__asm__(".db 0x15");\
#define RESET_TIMEOUT() \
__asm__("ld a,#0xff");\
__asm__("ld (0x4FEC),a");
#endif