#include #include #include #include #include "common.h" volatile uint_fast8_t vint_counter; void vint_handler(void) { vint_counter++; } const unsigned char reverse_lookup[16] = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe, 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf, }; byte reverse_bits(byte n) { return (reverse_lookup[n&0b1111] << 4) | reverse_lookup[n>>4]; } void flip_sprite_patterns(word dest, const byte* patterns, word len) { word i; for (i=0; i>= 4; } } // add two 16-bit BCD values word bcd_add(word a, word b) __naked { a; b; // to avoid warning __asm push ix ld ix,#0 add ix,sp ld a,4 (ix) add a, 6 (ix) daa ld c,a ld a,5 (ix) adc a, 7 (ix) daa ld b,a ld l, c ld h, b pop ix ret __endasm; } void vdp_setup() { cv_set_screen_active(false); cv_set_screen_mode(CV_SCREENMODE_4_224); cv_set_character_pattern_t(PATTERN | 0x3000); cv_set_image_table(IMAGE | 0x400); // cv_set_color_table(COLOR | 0xfff); // cv_set_sprite_pattern_table(SPRITE_PATTERNS | 0x1800); cv_set_sprite_attribute_table(SPRITES); cv_set_sprite_big(true); } void set_shifted_pattern(const byte* src, word dest, byte shift) { byte y; for (y=0; y<8; y++) { byte a = src[y+8]; byte b = src[y]; cvu_voutb(a>>shift, dest); cvu_voutb(b>>shift | a<<(8-shift), dest+8); cvu_voutb(b<<(8-shift), dest+16); dest++; } }