; ----------------------------------------------------------- ; defs.asm - hardware registers, constants, zero page, macros ; included first by main.asm ; ----------------------------------------------------------- ; ---- hardware registers ---- RASTER = $d012 ; current raster line BORDER = $d020 ; border color register BG = $d021 ; background color register SCREEN = $0400 ; screen RAM (40x25 chars) COLRAM = $d800 ; color RAM SCRCTL = $d011 ; control 1: raster msb, y-scroll SPR_EN = $d015 ; sprite enable bits SPRX0 = $d000 ; sprite 0 x (x/y pairs go up from here) SPRY0 = $d001 ; sprite 0 y SPRMSB = $d010 ; 9th x position bit of each sprite SPRDBLY = $d017 ; sprite y expand VMCSB = $d018 ; memory setup: screen + charset base SPRPRI = $d01b ; sprite/background priority SPRMCEN = $d01c ; sprite multicolor enable SPRDBLX = $d01d ; sprite x expand SPRCOL = $d027 ; sprite colors, 8 registers CPUPORT = $01 ; 6510 port: ROM/RAM banking CIA1_PA = $dc00 ; CIA1 port A: keyboard columns / joystick 2 CIA1_PB = $dc01 ; CIA1 port B: keyboard rows / joystick 1 CIA1_TA = $dc04 ; CIA1 timer A low byte: free-running entropy CHARSET = $3800 ; RAM charset: ROM font + the custom tiles SPRPTR = SCREEN + $3f8 ; sprite shape pointers ; ---- SID registers (single-voice SFX driver) ---- SID_V1FL = $d400 ; voice 1 frequency low SID_V1FH = $d401 ; voice 1 frequency high SID_V1PL = $d402 ; voice 1 pulse width low SID_V1PH = $d403 ; voice 1 pulse width high SID_V1CR = $d404 ; voice 1 control (waveform + gate) SID_V1AD = $d405 ; voice 1 attack/decay SID_V1SR = $d406 ; voice 1 sustain/release SID_VOL = $d418 ; filter mode + master volume ; ---- SFX IDs ---- SFX_CURSOR = 0 ; corner cursor step: click SFX_SELECT = 1 ; menu fire: rising tone SFX_ROTATE = 2 ; wall spin: noise whoosh SFX_DENY = 3 ; blocked spin: low buzz SFX_WIN = 4 ; escape: rising jingle SFX_LOSE = 5 ; caught: descending sweep SFX_SHOT = 6 ; gun / scorpion sting: short high tick SFX_HIT = 7 ; enemy hit: noise burst NSFX = 8 ; ---- colors ---- BLACK = 0 WHITE = 1 RED = 2 CYAN = 3 PURPLE = 4 GREEN = 5 BLUE = 6 YELLOW = 7 ORANGE = 8 BROWN = 9 LRED = 10 DGREY = 11 MGREY = 12 LGREEN = 13 LBLUE = 14 LGREY = 15 ; ---- joystick bits (after read_joy / read_joy2, active high) ---- JOY_UP = 1 JOY_DOWN = 2 JOY_LEFT = 4 JOY_RIGHT = 8 JOY_FIRE = 16 ; ---- the maze ---- ; a lattice of (2*cells+1) chars per side, centered on rows ; 1-23; local coordinates inside the lattice: ; cell = odd column, odd row (walkable) ; post = even column, even row (pivot, always solid) ; slot = the rest: wall pieces that spin around the posts ; wall thickness therefore equals corridor width: one cell ; the levels are squares, one cell bigger each level: MZMIN ; up to MZMAX (11x11 cells = 23x23 chars, the tallest square ; the screen fits); the menu backdrop uses the full lattice MZMIN = 4 ; level 1: 4x4 cells MZMAX = 11 ; level 8: 11x11 cells MAZE_CW = 19 ; the largest lattice: the menu backdrop MAZE_CH = 11 NCELLS = MAZE_CW * MAZE_CH NENEMIES = 4 ; enemy sprite slots (a level uses 1-4) ; ---- characters (the custom tiles live in the RAM charset) ---- CH_WALL = $e0 ; sandstone block: spinnable wall piece CH_POST = $e1 ; bolted plate: fixed pivot post CH_EXIT = $e2 ; the portal out (4 animated glyph frames) CH_FLOOR = $20 ; space: corridor CH_BAR = $e3 ; 7 chars: a bar cell 1-7 pixels full ; ---- the actors are hardware sprites ---- SP_RUN = 0 ; player 1, the worker SP_CUR = 1 ; player 2, ra's cursor SP_SHOT = 2 ; the optional bullet SP_EN = 3 ; the enemies ride sprites 3-6 SP_STING = 7 ; the scorpions' venom sting ; ---- desert palette ---- COL_WALL = ORANGE ; sandstone wall pieces COL_POST = BROWN ; fixed pivot posts COL_EXIT = LGREEN ; the exit portal COL_HILITE = YELLOW ; walls the cursor's spin would move COL_SCARAB = CYAN ; the scarabs COL_SCORP = LRED ; the scorpions COL_STING = PURPLE ; the venom sting STATCOL = BROWN ; background band behind the status row ; ---- game timing ---- REP_HOLD = 10 ; runner: frames before a held dir repeats REP_PERIOD = 5 ; runner: frames between repeat steps CREP_HOLD = 12 ; cursor: same, a touch slower CREP_PERIOD = 7 COOL_TIME = 160 ; spin cooldown option: recharge frames RESPAWN_TIME = 150 ; gun option: frames until a hit enemy returns RAS_SYNC = 251 ; raster line polled for the frame sync BUILD_STEPS = 8 ; maze carve animation: generator steps a frame ; ---- zero page pointers (same slots as rabbitc64) ---- txtlo = $f5 ; text pointer for the print routines (2 bytes) txthi = $f6 updvec = $f9 ; state update vector (2 bytes) scrlo = $fb scrhi = $fc collo = $fd colhi = $fe ; ---- helper macros: print a normal / big text line ---- !macro prtext .row, .col, .color, .txt, .len { lda #<.txt sta txtlo lda #>.txt sta txthi lda #.row sta prow lda #.col sta pcol lda #.color sta pcolor lda #.len sta plen jsr print_text } !macro prbig .row, .col, .color, .txt, .len { lda #<.txt sta txtlo lda #>.txt sta txthi lda #.row sta bigrow lda #.col sta bigcol lda #.color sta bigcolor lda #.len sta biglen jsr draw_big } ; ---- set the state update vector ---- !macro setupd .addr { lda #<.addr sta updvec lda #>.addr sta updvec+1 } ; ---- leave the current screen: fade to black, then run the ; init routine of the next one ---- !macro fadeto .addr { lda #<.addr sta fadevec lda #>.addr sta fadevec+1 jmp fade_start }