/* Web64 SDK header printout: c64.h * Generated by scripts/copy-web64-ide-source.mjs. * The IDE resolves this header as a read-only virtual SDK document. */ #ifndef WEB64_C64_H #define WEB64_C64_H /* Common C64 memory map. */ #define C64_RAM_BASE 0x0000 #define C64_BASIC_START 0x0801 #define C64_SCREEN_RAM 0x0400 #define C64_COLOR_RAM 0xd800 #define C64_CHAR_ROM 0xd000 #define C64_SCREEN_WIDTH 40 #define C64_SCREEN_HEIGHT 25 #define C64_SCREEN_CELL_COUNT 1000 #define C64_IO_BASE 0xd000 #define C64_KERNAL_ROM 0xe000 typedef unsigned char c64_reg8_t; typedef struct c64_cpu_port_registers { volatile c64_reg8_t data_direction; volatile c64_reg8_t data; } c64_cpu_port_registers; typedef struct c64_screen_ram { volatile c64_reg8_t cells[1000]; } c64_screen_ram; typedef struct c64_color_ram { volatile c64_reg8_t cells[1000]; } c64_color_ram; #define C64_CPU_PORT ((volatile c64_cpu_port_registers*)0x0000) #define C64_SCREEN ((volatile c64_screen_ram*)C64_SCREEN_RAM) #define C64_COLOR ((volatile c64_color_ram*)C64_COLOR_RAM) #define C64_SCREEN_ROWS ((volatile unsigned char (*)[40])C64_SCREEN_RAM) #define C64_COLOR_ROWS ((volatile unsigned char (*)[40])C64_COLOR_RAM) #define C64_CHAR_ROM_GLYPHS ((const unsigned char (*)[8])C64_CHAR_ROM) /* VIC-II registers. */ typedef struct c64_vicii_registers { volatile c64_reg8_t sprite0_x; volatile c64_reg8_t sprite0_y; volatile c64_reg8_t sprite1_x; volatile c64_reg8_t sprite1_y; volatile c64_reg8_t sprite2_x; volatile c64_reg8_t sprite2_y; volatile c64_reg8_t sprite3_x; volatile c64_reg8_t sprite3_y; volatile c64_reg8_t sprite4_x; volatile c64_reg8_t sprite4_y; volatile c64_reg8_t sprite5_x; volatile c64_reg8_t sprite5_y; volatile c64_reg8_t sprite6_x; volatile c64_reg8_t sprite6_y; volatile c64_reg8_t sprite7_x; volatile c64_reg8_t sprite7_y; volatile c64_reg8_t sprite_x_msb; volatile c64_reg8_t control1; volatile c64_reg8_t raster; volatile c64_reg8_t lightpen_x; volatile c64_reg8_t lightpen_y; volatile c64_reg8_t sprite_enable; volatile c64_reg8_t control2; volatile c64_reg8_t sprite_y_expand; volatile c64_reg8_t memory_setup; volatile c64_reg8_t interrupt_status; volatile c64_reg8_t interrupt_enable; volatile c64_reg8_t sprite_priority; volatile c64_reg8_t sprite_multicolor; volatile c64_reg8_t sprite_x_expand; volatile c64_reg8_t sprite_collision; volatile c64_reg8_t data_collision; volatile c64_reg8_t border_color; volatile c64_reg8_t background_color0; volatile c64_reg8_t background_color1; volatile c64_reg8_t background_color2; volatile c64_reg8_t background_color3; volatile c64_reg8_t sprite_multicolor0; volatile c64_reg8_t sprite_multicolor1; volatile c64_reg8_t sprite0_color; volatile c64_reg8_t sprite1_color; volatile c64_reg8_t sprite2_color; volatile c64_reg8_t sprite3_color; volatile c64_reg8_t sprite4_color; volatile c64_reg8_t sprite5_color; volatile c64_reg8_t sprite6_color; volatile c64_reg8_t sprite7_color; } c64_vicii_registers; #define VIC_BASE 0xd000 #define VIC_SPRITE0_X 0xd000 #define VIC_SPRITE0_Y 0xd001 #define VIC_SPRITE1_X 0xd002 #define VIC_SPRITE1_Y 0xd003 #define VIC_SPRITE2_X 0xd004 #define VIC_SPRITE2_Y 0xd005 #define VIC_SPRITE3_X 0xd006 #define VIC_SPRITE3_Y 0xd007 #define VIC_SPRITE4_X 0xd008 #define VIC_SPRITE4_Y 0xd009 #define VIC_SPRITE5_X 0xd00a #define VIC_SPRITE5_Y 0xd00b #define VIC_SPRITE6_X 0xd00c #define VIC_SPRITE6_Y 0xd00d #define VIC_SPRITE7_X 0xd00e #define VIC_SPRITE7_Y 0xd00f #define VIC_SPRITE_X_MSB 0xd010 #define VIC_CONTROL1 0xd011 #define VIC_RASTER 0xd012 #define VIC_LIGHTPEN_X 0xd013 #define VIC_LIGHTPEN_Y 0xd014 #define VIC_SPRITE_ENABLE 0xd015 #define VIC_CONTROL2 0xd016 #define VIC_SPRITE_Y_EXPAND 0xd017 #define VIC_MEMORY_SETUP 0xd018 #define VIC_INTERRUPT_STATUS 0xd019 #define VIC_INTERRUPT_ENABLE 0xd01a #define VIC_SPRITE_PRIORITY 0xd01b #define VIC_SPRITE_MULTICOLOR 0xd01c #define VIC_SPRITE_X_EXPAND 0xd01d #define VIC_SPRITE_COLLISION 0xd01e #define VIC_DATA_COLLISION 0xd01f #define VIC_BORDER 0xd020 #define VIC_BACKGROUND 0xd021 #define VIC_BACKGROUND0 0xd021 #define VIC_BACKGROUND1 0xd022 #define VIC_BACKGROUND2 0xd023 #define VIC_BACKGROUND3 0xd024 #define VIC_SPRITE_MULTICOLOR0 0xd025 #define VIC_SPRITE_MULTICOLOR1 0xd026 #define VIC_SPRITE0_COLOR 0xd027 #define VIC_SPRITE1_COLOR 0xd028 #define VIC_SPRITE2_COLOR 0xd029 #define VIC_SPRITE3_COLOR 0xd02a #define VIC_SPRITE4_COLOR 0xd02b #define VIC_SPRITE5_COLOR 0xd02c #define VIC_SPRITE6_COLOR 0xd02d #define VIC_SPRITE7_COLOR 0xd02e #define VIC_COLOR_BLACK 0x00 #define VIC_COLOR_WHITE 0x01 #define VIC_COLOR_RED 0x02 #define VIC_COLOR_CYAN 0x03 #define VIC_COLOR_PURPLE 0x04 #define VIC_COLOR_GREEN 0x05 #define VIC_COLOR_BLUE 0x06 #define VIC_COLOR_YELLOW 0x07 #define VIC_COLOR_ORANGE 0x08 #define VIC_COLOR_BROWN 0x09 #define VIC_COLOR_LIGHT_RED 0x0a #define VIC_COLOR_DARK_GRAY 0x0b #define VIC_COLOR_GRAY 0x0c #define VIC_COLOR_LIGHT_GREEN 0x0d #define VIC_COLOR_LIGHT_BLUE 0x0e #define VIC_COLOR_LIGHT_GRAY 0x0f #define COLOR_BLACK VIC_COLOR_BLACK #define COLOR_WHITE VIC_COLOR_WHITE #define COLOR_RED VIC_COLOR_RED #define COLOR_CYAN VIC_COLOR_CYAN #define COLOR_PURPLE VIC_COLOR_PURPLE #define COLOR_GREEN VIC_COLOR_GREEN #define COLOR_BLUE VIC_COLOR_BLUE #define COLOR_YELLOW VIC_COLOR_YELLOW #define COLOR_ORANGE VIC_COLOR_ORANGE #define COLOR_BROWN VIC_COLOR_BROWN #define COLOR_LIGHTRED VIC_COLOR_LIGHT_RED #define COLOR_GRAY1 VIC_COLOR_DARK_GRAY #define COLOR_GRAY2 VIC_COLOR_GRAY #define COLOR_LIGHTGREEN VIC_COLOR_LIGHT_GREEN #define COLOR_LIGHTBLUE VIC_COLOR_LIGHT_BLUE #define COLOR_GRAY3 VIC_COLOR_LIGHT_GRAY #define VIC_SPRITE_POINTER_BASE 0x07f8 #define VICII ((volatile c64_vicii_registers*)VIC_BASE) #define VIC VICII /* SID registers. */ typedef struct c64_sid_voice_registers { volatile c64_reg8_t freq_lo; volatile c64_reg8_t freq_hi; volatile c64_reg8_t pulse_lo; volatile c64_reg8_t pulse_hi; volatile c64_reg8_t control; volatile c64_reg8_t attack_decay; volatile c64_reg8_t sustain_release; } c64_sid_voice_registers; typedef struct c64_sid_registers { volatile c64_reg8_t voice1_freq_lo; volatile c64_reg8_t voice1_freq_hi; volatile c64_reg8_t voice1_pulse_lo; volatile c64_reg8_t voice1_pulse_hi; volatile c64_reg8_t voice1_control; volatile c64_reg8_t voice1_attack_decay; volatile c64_reg8_t voice1_sustain_release; volatile c64_reg8_t voice2_freq_lo; volatile c64_reg8_t voice2_freq_hi; volatile c64_reg8_t voice2_pulse_lo; volatile c64_reg8_t voice2_pulse_hi; volatile c64_reg8_t voice2_control; volatile c64_reg8_t voice2_attack_decay; volatile c64_reg8_t voice2_sustain_release; volatile c64_reg8_t voice3_freq_lo; volatile c64_reg8_t voice3_freq_hi; volatile c64_reg8_t voice3_pulse_lo; volatile c64_reg8_t voice3_pulse_hi; volatile c64_reg8_t voice3_control; volatile c64_reg8_t voice3_attack_decay; volatile c64_reg8_t voice3_sustain_release; volatile c64_reg8_t filter_cutoff_lo; volatile c64_reg8_t filter_cutoff_hi; volatile c64_reg8_t filter_resonance; volatile c64_reg8_t volume_filter_mode; volatile c64_reg8_t pot_x; volatile c64_reg8_t pot_y; volatile c64_reg8_t osc3_random; volatile c64_reg8_t env3; } c64_sid_registers; #define SID_BASE 0xd400 #define SID_VOICE1_FREQ_LO 0xd400 #define SID_VOICE1_FREQ_HI 0xd401 #define SID_VOICE1_PULSE_LO 0xd402 #define SID_VOICE1_PULSE_HI 0xd403 #define SID_VOICE1_CONTROL 0xd404 #define SID_VOICE1_ATTACK_DECAY 0xd405 #define SID_VOICE1_SUSTAIN_RELEASE 0xd406 #define SID_VOICE2_FREQ_LO 0xd407 #define SID_VOICE2_FREQ_HI 0xd408 #define SID_VOICE2_PULSE_LO 0xd409 #define SID_VOICE2_PULSE_HI 0xd40a #define SID_VOICE2_CONTROL 0xd40b #define SID_VOICE2_ATTACK_DECAY 0xd40c #define SID_VOICE2_SUSTAIN_RELEASE 0xd40d #define SID_VOICE3_FREQ_LO 0xd40e #define SID_VOICE3_FREQ_HI 0xd40f #define SID_VOICE3_PULSE_LO 0xd410 #define SID_VOICE3_PULSE_HI 0xd411 #define SID_VOICE3_CONTROL 0xd412 #define SID_VOICE3_ATTACK_DECAY 0xd413 #define SID_VOICE3_SUSTAIN_RELEASE 0xd414 #define SID_FILTER_CUTOFF_LO 0xd415 #define SID_FILTER_CUTOFF_HI 0xd416 #define SID_FILTER_RESONANCE 0xd417 #define SID_VOLUME_FILTER_MODE 0xd418 #define SID_POT_X 0xd419 #define SID_POT_Y 0xd41a #define SID_OSC3_RANDOM 0xd41b #define SID_ENV3 0xd41c #define SID_WAVE_TRIANGLE 0x10 #define SID_WAVE_SAW 0x20 #define SID_WAVE_PULSE 0x40 #define SID_WAVE_NOISE 0x80 #define SID_GATE 0x01 #define SID_SYNC 0x02 #define SID_RING_MOD 0x04 #define SID_TEST 0x08 /* CIA, keyboard, and joyport registers. */ typedef struct c64_cia_registers { volatile c64_reg8_t pra; volatile c64_reg8_t prb; volatile c64_reg8_t ddra; volatile c64_reg8_t ddrb; volatile c64_reg8_t timer_a_lo; volatile c64_reg8_t timer_a_hi; volatile c64_reg8_t timer_b_lo; volatile c64_reg8_t timer_b_hi; volatile c64_reg8_t tod_10ths; volatile c64_reg8_t tod_seconds; volatile c64_reg8_t tod_minutes; volatile c64_reg8_t tod_hours; volatile c64_reg8_t serial_data; volatile c64_reg8_t interrupt_control; volatile c64_reg8_t control_a; volatile c64_reg8_t control_b; } c64_cia_registers; #define SID ((volatile c64_sid_registers*)SID_BASE) /* CIA, keyboard, and joyport registers. */ #define CIA1_BASE 0xdc00 #define CIA1_PRA 0xdc00 #define CIA1_PRB 0xdc01 #define CIA1_DDRA 0xdc02 #define CIA1_DDRB 0xdc03 #define CIA1_TIMER_A_LO 0xdc04 #define CIA1_TIMER_A_HI 0xdc05 #define CIA1_TIMER_B_LO 0xdc06 #define CIA1_TIMER_B_HI 0xdc07 #define CIA1_TOD_10THS 0xdc08 #define CIA1_TOD_SECONDS 0xdc09 #define CIA1_TOD_MINUTES 0xdc0a #define CIA1_TOD_HOURS 0xdc0b #define CIA1_SERIAL_DATA 0xdc0c #define CIA1_INTERRUPT_CONTROL 0xdc0d #define CIA1_CONTROL_A 0xdc0e #define CIA1_CONTROL_B 0xdc0f #define CIA2_BASE 0xdd00 #define CIA2_PRA 0xdd00 #define CIA2_PRB 0xdd01 #define CIA2_DDRA 0xdd02 #define CIA2_DDRB 0xdd03 #define CIA2_TIMER_A_LO 0xdd04 #define CIA2_TIMER_A_HI 0xdd05 #define CIA2_TIMER_B_LO 0xdd06 #define CIA2_TIMER_B_HI 0xdd07 #define CIA2_TOD_10THS 0xdd08 #define CIA2_TOD_SECONDS 0xdd09 #define CIA2_TOD_MINUTES 0xdd0a #define CIA2_TOD_HOURS 0xdd0b #define CIA2_SERIAL_DATA 0xdd0c #define CIA2_INTERRUPT_CONTROL 0xdd0d #define CIA2_CONTROL_A 0xdd0e #define CIA2_CONTROL_B 0xdd0f #define CIA1 ((volatile c64_cia_registers*)CIA1_BASE) #define CIA2 ((volatile c64_cia_registers*)CIA2_BASE) #define KEYBOARD_COLUMN_PORT 0xdc00 #define KEYBOARD_ROW_PORT 0xdc01 #define KEYBOARD_COLUMN_DDR 0xdc02 #define KEYBOARD_ROW_DDR 0xdc03 #define KEYBOARD_ACTIVE_MASK 0xff #define JOYPORT_1 0xdc01 #define JOYPORT_2 0xdc00 /* Joystick masks are active-low: (sample & JOY_FIRE) == 0 means pressed. */ #define JOY_UP 0x01 #define JOY_DOWN 0x02 #define JOY_LEFT 0x04 #define JOY_RIGHT 0x08 #define JOY_FIRE 0x10 #define JOY_ACTIVE_LOW 0x00 #define JOY_RELEASED_MASK 0x1f #define JOY2_UP() (!(CIA1->pra & JOY_UP)) #define JOY2_DOWN() (!(CIA1->pra & JOY_DOWN)) #define JOY2_LEFT() (!(CIA1->pra & JOY_LEFT)) #define JOY2_RIGHT() (!(CIA1->pra & JOY_RIGHT)) #define JOY2_FIRE() (!(CIA1->pra & JOY_FIRE)) #define JOY_UP_P(v) (!((v) & JOY_UP)) #define JOY_DOWN_P(v) (!((v) & JOY_DOWN)) #define JOY_LEFT_P(v) (!((v) & JOY_LEFT)) #define JOY_RIGHT_P(v) (!((v) & JOY_RIGHT)) #define JOY_FIRE_P(v) (!((v) & JOY_FIRE)) /* Convenience aliases. */ #define VIC_BORDER_COLOR VIC_BORDER #define VIC_BACKGROUND_COLOR VIC_BACKGROUND #define VIC_SPRITE_POINTERS VIC_SPRITE_POINTER_BASE #define BORDER_COLOR VIC->border_color #define BACKGROUND_COLOR VIC->background_color0 #define SPRITE_ENABLE VIC->sprite_enable #define SPRITE_MULTICOLOR VIC->sprite_multicolor /* Common KERNAL entry points. */ #define KERNAL_CHROUT 0xffd2 #define KERNAL_CHRIN 0xffcf #define KERNAL_READST 0xffb7 #define KERNAL_OPEN 0xffc0 #define KERNAL_CLOSE 0xffc3 #define KERNAL_CHKIN 0xffc6 #define KERNAL_CHKOUT 0xffc9 #define KERNAL_CLRCHN 0xffcc #define KERNAL_GETIN 0xffe4 #define KERNAL_SCNKEY 0xff9f #define KERNAL_PLOT 0xfff0 #define KERNAL_SETLFS 0xffba #define KERNAL_SETNAM 0xffbd #define KERNAL_LOAD 0xffd5 #define KERNAL_SAVE 0xffd8 #endif