From 64af61ba12b15398c4e48a5c10da17cfe0f11ced Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Fri, 8 Jan 2021 04:13:16 +0100 Subject: [PATCH] First commit --- .build/main.asm | 1008 ++++++++++++++++++++++++++++++++++++++++++++ .build/main.lst | 1023 +++++++++++++++++++++++++++++++++++++++++++++ .build/main.rel | 516 +++++++++++++++++++++++ .build/main.sym | 65 +++ .build/tetris.com | Bin 0 -> 1462 bytes .build/tetris.ihx | 49 +++ Makefile | 44 ++ src/main.c | 247 +++++++++++ 8 files changed, 2952 insertions(+) create mode 100644 .build/main.asm create mode 100644 .build/main.lst create mode 100644 .build/main.rel create mode 100644 .build/main.sym create mode 100644 .build/tetris.com create mode 100644 .build/tetris.ihx create mode 100644 Makefile create mode 100644 src/main.c diff --git a/.build/main.asm b/.build/main.asm new file mode 100644 index 0000000..ede7446 --- /dev/null +++ b/.build/main.asm @@ -0,0 +1,1008 @@ +;-------------------------------------------------------- +; File Created by SDCC : free open source ANSI-C Compiler +; Version 4.0.0 #11528 (Linux) +;-------------------------------------------------------- + .module main + .optsdcc -mz80 + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- + .globl _main + .globl _loop + .globl _draw + .globl _render + .globl _new_shape + .globl _does_piece_fit + .globl _initialize_field + .globl _rotate + .globl _construct_shapes + .globl _random + .globl _put_string + .globl _counter + .globl _current_y + .globl _current_x + .globl _current_rotation + .globl _current_shape + .globl _seed + .globl _screen + .globl _field + .globl _tetromino +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_cout = 0x0002 +_status = 0x001f +_key = 0x001e +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + .area _DATA +_tetromino:: + .ds 14 +_field:: + .ds 216 +_screen:: + .ds 216 +_seed:: + .ds 1 +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + .area _INITIALIZED +_current_shape:: + .ds 1 +_current_rotation:: + .ds 1 +_current_x:: + .ds 1 +_current_y:: + .ds 1 +_counter:: + .ds 1 +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- + .area _DABS (ABS) +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- + .area _HOME + .area _GSINIT + .area _GSFINAL + .area _GSINIT +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- + .area _HOME + .area _HOME +;-------------------------------------------------------- +; code +;-------------------------------------------------------- + .area _CODE +;src/main.c:12: void construct_shapes() { +; --------------------------------- +; Function construct_shapes +; --------------------------------- +_construct_shapes:: +;src/main.c:13: tetromino[0] = "..X." + ld hl, #___str_0 + ld (_tetromino), hl +;src/main.c:18: tetromino[1] = "..X." + ld hl, #___str_1 + ld ((_tetromino + 0x0002)), hl +;src/main.c:23: tetromino[2] = ".X.." + ld hl, #___str_2 + ld ((_tetromino + 0x0004)), hl +;src/main.c:28: tetromino[3] = "..X." + ld hl, #___str_3 + ld ((_tetromino + 0x0006)), hl +;src/main.c:33: tetromino[4] = ".X.." + ld hl, #___str_4 + ld ((_tetromino + 0x0008)), hl +;src/main.c:38: tetromino[5] = "..X." + ld hl, #___str_5 + ld ((_tetromino + 0x000a)), hl +;src/main.c:43: tetromino[6] = "...." + ld hl, #___str_6 + ld ((_tetromino + 0x000c)), hl +;src/main.c:47: } + ret +___str_0: + .ascii "..X...X...X...X." + .db 0x00 +___str_1: + .ascii "..X..XX..X......" + .db 0x00 +___str_2: + .ascii ".X...XX...X....." + .db 0x00 +___str_3: + .ascii "..X...X..XX....." + .db 0x00 +___str_4: + .ascii ".X...X...XX....." + .db 0x00 +___str_5: + .ascii "..X..XX...X....." + .db 0x00 +___str_6: + .ascii ".....XX..XX....." + .db 0x00 +;src/main.c:49: uint8_t rotate(uint8_t x, uint8_t y, uint8_t r) { +; --------------------------------- +; Function rotate +; --------------------------------- +_rotate:: + push ix + ld ix,#0 + add ix,sp + dec sp +;src/main.c:52: return y*4+x; + ld a, 5 (ix) + ld c, 4 (ix) + add a, a + add a, a + ld l, a +;src/main.c:50: switch (r) { + ld a, 6 (ix) + or a, a + jr Z,00101$ +;src/main.c:54: return 12 + y - x*4; + ld e, 5 (ix) + ld a, 4 (ix) + add a, a + add a, a + ld -1 (ix), a +;src/main.c:50: switch (r) { + ld a, 6 (ix) + dec a + jr Z,00102$ + ld a, 6 (ix) + sub a, #0x02 + jr Z,00103$ + ld a, 6 (ix) + sub a, #0x03 + jr Z,00104$ + jr 00105$ +;src/main.c:51: case 0: +00101$: +;src/main.c:52: return y*4+x; + add hl, bc + jr 00106$ +;src/main.c:53: case 1: +00102$: +;src/main.c:54: return 12 + y - x*4; + ld a, e + add a, #0x0c + sub a, -1 (ix) + ld l, a + jr 00106$ +;src/main.c:55: case 2: +00103$: +;src/main.c:56: return 15 - y*4 - x; + ld a, #0x0f + sub a, l + sub a, c + ld l, a + jr 00106$ +;src/main.c:57: case 3: +00104$: +;src/main.c:58: return 3 - y + x*4; + ld a, #0x03 + sub a, e + add a, -1 (ix) + ld l, a + jr 00106$ +;src/main.c:59: } +00105$: +;src/main.c:60: return 0; + ld l, #0x00 +00106$: +;src/main.c:61: } + inc sp + pop ix + ret +;src/main.c:63: void initialize_field() { +; --------------------------------- +; Function initialize_field +; --------------------------------- +_initialize_field:: + push ix + ld ix,#0 + add ix,sp + push af + dec sp +;src/main.c:64: for (uint8_t y = 0; y < HEIGHT; ++y) { + ld c, #0x00 +00107$: +;src/main.c:65: for (uint8_t x = 0; x < WIDTH; ++x) { + ld a,c + cp a,#0x12 + jr NC,00109$ + sub a, #0x11 + ld a, #0x01 + jr Z,00153$ + xor a, a +00153$: + ld -3 (ix), a + ld e, #0x00 +00104$: + ld a, e + sub a, #0x0c + jr NC,00108$ +;src/main.c:66: field[y*WIDTH + x] = (x == 0 || x == WIDTH - 1 || y == HEIGHT-1) ? 9 : 0; + ld l, c + ld h, #0x00 + push de + ld e, l + ld d, h + add hl, hl + add hl, de + add hl, hl + add hl, hl + pop de + ld a, e + ld d, #0x00 + add a, l + ld l, a + ld a, d + adc a, h + ld h, a + ld a, l + add a, #<(_field) + ld -2 (ix), a + ld a, h + adc a, #>(_field) + ld -1 (ix), a + ld a, e + or a, a + jr Z,00114$ + ld a, e + sub a, #0x0b + jr Z,00114$ + bit 0, -3 (ix) + jr Z,00111$ +00114$: + ld hl, #0x0009 + jr 00112$ +00111$: + ld hl, #0x0000 +00112$: + ld a, l + ld l, -2 (ix) + ld h, -1 (ix) + ld (hl), a +;src/main.c:65: for (uint8_t x = 0; x < WIDTH; ++x) { + inc e + jr 00104$ +00108$: +;src/main.c:64: for (uint8_t y = 0; y < HEIGHT; ++y) { + inc c + jr 00107$ +00109$: +;src/main.c:69: } + ld sp, ix + pop ix + ret +;src/main.c:71: uint8_t does_piece_fit(uint8_t shape, uint8_t rotation, uint8_t px, uint8_t py) { +; --------------------------------- +; Function does_piece_fit +; --------------------------------- +_does_piece_fit:: + push ix + ld ix,#0 + add ix,sp + push af + push af +;src/main.c:72: for (uint8_t y = 0; y < 4; ++y) { + ld c, #0x00 +00116$: + ld a, c + sub a, #0x04 + jp NC, 00111$ +;src/main.c:73: for (uint8_t x = 0; x < 4; ++x) { + ld a, 7 (ix) + add a, c + ld -4 (ix), a + xor a, a + ld -1 (ix), a +00113$: + ld a, -1 (ix) + sub a, #0x04 + jp NC, 00117$ +;src/main.c:75: uint8_t pi = rotate(x, y, rotation); + push bc + ld b, 5 (ix) + push bc + ld a, -1 (ix) + push af + inc sp + call _rotate + pop af + inc sp + pop bc + ld -3 (ix), l +;src/main.c:78: uint8_t fi = (py + y) * WIDTH + px + x; + ld a, -4 (ix) + ld e, a + add a, a + add a, e + add a, a + add a, a + ld b, 6 (ix) + add a, b + ld b, -1 (ix) + add a, b + ld -2 (ix), a +;src/main.c:80: if (px + x >= 0 && px + x < WIDTH) { + ld e, 6 (ix) + ld d, #0x00 + ld l, -1 (ix) + ld h, #0x00 + add hl, de + bit 7, h + jr NZ,00114$ + ld de, #0x800c + add hl, hl + ccf + rr h + rr l + sbc hl, de + jr NC,00114$ +;src/main.c:81: if (py + y >= 0 && py + y < HEIGHT) { + ld e, 7 (ix) + ld d, #0x00 + ld l, c + ld h, #0x00 + add hl, de + bit 7, h + jr NZ,00114$ + ld de, #0x8012 + add hl, hl + ccf + rr h + rr l + sbc hl, de + jr NC,00114$ +;src/main.c:83: if (tetromino[shape][pi] == 'X' && field[fi] != 0) { + ld l, 4 (ix) + ld h, #0x00 + add hl, hl + ld de, #_tetromino + add hl, de + ld e, (hl) + inc hl + ld d, (hl) + ld l, -3 (ix) + ld h, #0x00 + add hl, de + ld a, (hl) + sub a, #0x58 + jr NZ,00114$ + ld a, -2 (ix) + add a, #<(_field) + ld e, a + ld a, #0x00 + adc a, #>(_field) + ld d, a + ld a, (de) + or a, a + jr Z,00114$ +;src/main.c:84: return 0; + ld l, #0x00 + jr 00118$ +00114$: +;src/main.c:73: for (uint8_t x = 0; x < 4; ++x) { + inc -1 (ix) + jp 00113$ +00117$: +;src/main.c:72: for (uint8_t y = 0; y < 4; ++y) { + inc c + jp 00116$ +00111$: +;src/main.c:91: return 1; + ld l, #0x01 +00118$: +;src/main.c:92: } + ld sp, ix + pop ix + ret +;src/main.c:99: void new_shape() { +; --------------------------------- +; Function new_shape +; --------------------------------- +_new_shape:: +;src/main.c:100: do { +00101$: +;src/main.c:101: current_shape = random() & 0x07; + call _random + ld a, l + and a, #0x07 + ld (_current_shape+0), a +;src/main.c:102: } while (current_shape == 7); + ld a,(#_current_shape + 0) + sub a, #0x07 + jr Z,00101$ +;src/main.c:103: } + ret +;src/main.c:105: void render() { +; --------------------------------- +; Function render +; --------------------------------- +_render:: + push ix + ld ix,#0 + add ix,sp + push af + push af +;src/main.c:107: for (uint8_t i = 0; i < WIDTH*HEIGHT; ++i) { + ld bc, #_screen+0 + ld de, #_field+0 + xor a, a + ld -1 (ix), a +00107$: + ld a, -1 (ix) + sub a, #0xd8 + jr NC,00101$ +;src/main.c:108: screen[i] = field[i]; + ld a, c + add a, -1 (ix) + ld -3 (ix), a + ld a, b + adc a, #0x00 + ld -2 (ix), a + ld l, -1 (ix) + ld h, #0x00 + add hl, de + ld a, (hl) + ld l, -3 (ix) + ld h, -2 (ix) + ld (hl), a +;src/main.c:107: for (uint8_t i = 0; i < WIDTH*HEIGHT; ++i) { + inc -1 (ix) + jr 00107$ +00101$: +;src/main.c:112: for (uint8_t y = 0; y < 4; ++y) { + ld e, #0x00 +00113$: + ld a, e + sub a, #0x04 + jp NC, 00115$ +;src/main.c:113: for (uint8_t x = 0; x < 4; ++x) { + ld d, #0x00 +00110$: + ld a, d + sub a, #0x04 + jp NC, 00114$ +;src/main.c:114: if (tetromino[current_shape][rotate(x, y, current_rotation)] == 'X') { + ld iy, #_current_shape + ld l, 0 (iy) + ld h, #0x00 + add hl, hl + ld a, #<(_tetromino) + add a, l + ld l, a + ld a, #>(_tetromino) + adc a, h + ld h, a + ld a, (hl) + ld -2 (ix), a + inc hl + ld a, (hl) + ld -1 (ix), a + push bc + push de + ld a, (_current_rotation) + push af + inc sp + ld a, e + push af + inc sp + push de + inc sp + call _rotate + pop af + inc sp + ld a, l + pop de + pop bc + add a, -2 (ix) + ld l, a + ld a, #0x00 + adc a, -1 (ix) + ld h, a + ld a, (hl) + sub a, #0x58 + jr NZ,00111$ +;src/main.c:115: screen[(current_y+y)*WIDTH + current_x + x] = current_shape + 1; + ld iy, #_current_y + ld l, 0 (iy) + ld h, #0x00 + ld -2 (ix), e + xor a, a + ld -1 (ix), a + ld a, -2 (ix) + add a, l + ld l, a + ld a, -1 (ix) + adc a, h + ld h, a + push de + ld e, l + ld d, h + add hl, hl + add hl, de + add hl, hl + add hl, hl + pop de + ex (sp), hl + ld a,(#_current_x + 0) + ld h, #0x00 + add a, -4 (ix) + ld -2 (ix), a + ld a, h + adc a, -3 (ix) + ld -1 (ix), a + ld l, d + ld h, #0x00 + ld a, l + add a, -2 (ix) + ld l, a + ld a, h + adc a, -1 (ix) + ld h, a + add hl, bc + ld -2 (ix), l + ld -1 (ix), h + ld a,(#_current_shape + 0) + inc a + ld l, -2 (ix) + ld h, -1 (ix) + ld (hl), a +00111$: +;src/main.c:113: for (uint8_t x = 0; x < 4; ++x) { + inc d + jp 00110$ +00114$: +;src/main.c:112: for (uint8_t y = 0; y < 4; ++y) { + inc e + jp 00113$ +00115$: +;src/main.c:119: } + ld sp, ix + pop ix + ret +;src/main.c:122: void draw() { +; --------------------------------- +; Function draw +; --------------------------------- +_draw:: + push ix + ld ix,#0 + add ix,sp + dec sp +;src/main.c:124: put_string("\033[2;2H"); + ld hl, #___str_8 + push hl + call _put_string + pop af +;src/main.c:125: for (uint8_t y = 0; y < HEIGHT*SCALE; ++y) { + ld c, #0x00 +00112$: + ld a, c + sub a, #0x12 + jr NC,00114$ +;src/main.c:126: for (uint8_t x = 0; x < WIDTH*SCALE; ++x) { + xor a, a + ld -1 (ix), a +00109$: + ld a, -1 (ix) + sub a, #0x0c + jr NC,00106$ +;src/main.c:127: uint8_t i = screen[y/SCALE*WIDTH + x/SCALE]; + ld e, c + ld d, #0x00 + ld l, e + ld h, d + add hl, hl + add hl, de + add hl, hl + add hl, hl + ld e, -1 (ix) + ld d, #0x00 + add hl, de + ld de, #_screen + add hl, de + ld e, (hl) +;src/main.c:128: if (i >= 8) { + ld a, e + sub a, #0x08 + jr C,00104$ +;src/main.c:129: cout = '\033'; + ld a, #0x1b + out (_cout), a +;src/main.c:130: cout = '['; + ld a, #0x5b + out (_cout), a +;src/main.c:131: cout = '0'; + ld a, #0x30 + out (_cout), a +;src/main.c:132: cout = 'm'; + ld a, #0x6d + out (_cout), a + jr 00105$ +00104$: +;src/main.c:133: } else if (i > 0) { + ld a, e + or a, a + jr Z,00105$ +;src/main.c:134: cout = '\033'; + ld a, #0x1b + out (_cout), a +;src/main.c:135: cout = '['; + ld a, #0x5b + out (_cout), a +;src/main.c:136: cout = '3'; + ld a, #0x33 + out (_cout), a +;src/main.c:137: cout = 48+i; + ld a, e + add a, #0x30 + out (_cout), a +;src/main.c:138: cout = 'm'; + ld a, #0x6d + out (_cout), a +00105$: +;src/main.c:140: char c = " RGOBMCW=#"[i]; + ld hl, #___str_7 + ld d, #0x00 + add hl, de + ld a, (hl) + out (_cout), a +;src/main.c:126: for (uint8_t x = 0; x < WIDTH*SCALE; ++x) { + inc -1 (ix) + jr 00109$ +00106$: +;src/main.c:143: cout = '\n'; + ld a, #0x0a + out (_cout), a +;src/main.c:144: cout = '\r'; + ld a, #0x0d + out (_cout), a +;src/main.c:145: cout = ' '; + ld a, #0x20 + out (_cout), a +;src/main.c:125: for (uint8_t y = 0; y < HEIGHT*SCALE; ++y) { + inc c + jr 00112$ +00114$: +;src/main.c:147: } + inc sp + pop ix + ret +___str_7: + .ascii " RGOBMCW=#" + .db 0x00 +___str_8: + .db 0x1b + .ascii "[2;2H" + .db 0x00 +;src/main.c:154: uint8_t loop() { +; --------------------------------- +; Function loop +; --------------------------------- +_loop:: + push ix + ld ix,#0 + add ix,sp + push af +;src/main.c:156: if (status & 1) { + in a, (_status) + rrca + jp NC,00116$ +;src/main.c:157: uint8_t nx = current_x; + ld a,(#_current_x + 0) + ld -2 (ix), a +;src/main.c:158: uint8_t ny = current_y; + ld hl,#_current_y + 0 + ld c, (hl) +;src/main.c:159: uint8_t nr = current_rotation; + ld a,(#_current_rotation + 0) + ld -1 (ix), a +;src/main.c:161: switch (key) { + in a, (_key) + cp a, #0x03 + jr Z,00101$ + cp a, #0x61 + jr Z,00102$ + cp a, #0x64 + jr Z,00103$ + cp a, #0x72 + jr Z,00104$ + cp a, #0x73 + jr Z,00107$ + sub a, #0x77 + jr Z,00142$ + jr 00112$ +;src/main.c:162: case 0x03: +00101$: +;src/main.c:163: put_string("Exit!\n\r"); + ld hl, #___str_9 + push hl + call _put_string + pop af +;src/main.c:164: return 0; + ld l, #0x00 + jp 00132$ +;src/main.c:167: case 'a': +00102$: +;src/main.c:168: nx--; + dec -2 (ix) +;src/main.c:169: break; + jr 00112$ +;src/main.c:172: case 'd': +00103$: +;src/main.c:173: nx++; + inc -2 (ix) +;src/main.c:174: break; + jr 00112$ +;src/main.c:177: case 'r': +00104$: +;src/main.c:178: nr++; + inc -1 (ix) +;src/main.c:179: if (nr == 4) { + ld a, -1 (ix) + sub a, #0x04 + jr NZ,00112$ +;src/main.c:180: nr = 0; + xor a, a + ld -1 (ix), a +;src/main.c:182: break; + jr 00112$ +;src/main.c:185: case 's': +00107$: +;src/main.c:186: counter = 0; + ld hl,#_counter + 0 + ld (hl), #0x00 +;src/main.c:187: break; + jr 00112$ +;src/main.c:191: while (does_piece_fit(current_shape, current_rotation, current_x, ++ny + 1)); +00142$: +00109$: + inc c + ld a, c + inc a + push bc + push af + inc sp + ld a, (_current_x) + push af + inc sp + ld a, (_current_rotation) + push af + inc sp + ld a, (_current_shape) + push af + inc sp + call _does_piece_fit + pop af + pop af + ld a, l + pop bc + or a, a + jr NZ,00109$ +;src/main.c:193: } +00112$: +;src/main.c:195: if (does_piece_fit(current_shape, nr, nx, ny)) { + push bc + ld a, c + push af + inc sp + ld h, -2 (ix) + ld l, -1 (ix) + push hl + ld a, (_current_shape) + push af + inc sp + call _does_piece_fit + pop af + pop af + ld a, l + pop bc + or a, a + jr Z,00116$ +;src/main.c:196: current_x = nx; + ld a, -2 (ix) + ld (#_current_x + 0),a +;src/main.c:197: current_y = ny; + ld hl,#_current_y + 0 + ld (hl), c +;src/main.c:198: current_rotation = nr; + ld a, -1 (ix) + ld (#_current_rotation + 0),a +00116$: +;src/main.c:203: if (counter == 0) { + ld a,(#_counter + 0) + or a, a + jp NZ, 00125$ +;src/main.c:204: if (does_piece_fit(current_shape, current_rotation, current_x, current_y+1)) { + ld a,(#_current_y + 0) + inc a + push af + inc sp + ld a, (_current_x) + push af + inc sp + ld a, (_current_rotation) + push af + inc sp + ld a, (_current_shape) + push af + inc sp + call _does_piece_fit + pop af + pop af + ld a, l + or a, a + jr Z,00150$ +;src/main.c:205: current_y++; + ld hl, #_current_y+0 + inc (hl) + jp 00123$ +;src/main.c:208: for (uint8_t y = 0; y < 4; ++y) { +00150$: + ld c, #0x00 +00130$: + ld a, c + sub a, #0x04 + jr NC,00120$ +;src/main.c:209: for (uint8_t x = 0; x < 4; ++x) { + ld b, #0x00 +00127$: + ld a, b + sub a, #0x04 + jr NC,00131$ +;src/main.c:210: if (tetromino[current_shape][rotate(x, y, current_rotation)] == 'X') { + ld iy, #_current_shape + ld l, 0 (iy) + ld h, #0x00 + add hl, hl + ld de, #_tetromino + add hl, de + ld e, (hl) + inc hl + ld d, (hl) + push bc + push de + ld a, (_current_rotation) + push af + inc sp + ld a, c + push af + inc sp + push bc + inc sp + call _rotate + pop af + inc sp + pop de + pop bc + ld h, #0x00 + add hl, de + ld a, (hl) + sub a, #0x58 + jr NZ,00128$ +;src/main.c:211: field[(current_y+y)*WIDTH + current_x + x] = current_shape + 1; + ld hl,#_current_y + 0 + ld e, (hl) + ld d, #0x00 + ld l, c + ld h, #0x00 + add hl, de + ld e, l + ld d, h + add hl, hl + add hl, de + add hl, hl + add hl, hl + ex de, hl + ld iy, #_current_x + ld l, 0 (iy) + ld h, #0x00 + add hl, de + ld e, b + ld d, #0x00 + add hl, de + ex de, hl + ld hl, #_field + add hl, de + ex de, hl + ld a,(#_current_shape + 0) + inc a + ld (de), a +00128$: +;src/main.c:209: for (uint8_t x = 0; x < 4; ++x) { + inc b + jr 00127$ +00131$: +;src/main.c:208: for (uint8_t y = 0; y < 4; ++y) { + inc c + jr 00130$ +00120$: +;src/main.c:216: new_shape(); + call _new_shape +;src/main.c:217: current_y = 0; + ld hl,#_current_y + 0 + ld (hl), #0x00 +;src/main.c:218: current_x = WIDTH/2; + ld hl,#_current_x + 0 + ld (hl), #0x06 +;src/main.c:219: current_rotation = 0; + ld hl,#_current_rotation + 0 + ld (hl), #0x00 +00123$: +;src/main.c:221: counter = SPEED; + ld hl,#_counter + 0 + ld (hl), #0x02 +00125$: +;src/main.c:224: counter--; + ld hl, #_counter+0 + dec (hl) +;src/main.c:226: render(); + call _render +;src/main.c:227: draw(); + call _draw +;src/main.c:229: return 1; + ld l, #0x01 +00132$: +;src/main.c:230: } + ld sp, ix + pop ix + ret +___str_9: + .ascii "Exit!" + .db 0x0a + .db 0x0d + .db 0x00 +;src/main.c:234: void main() { +; --------------------------------- +; Function main +; --------------------------------- +_main:: +;src/main.c:235: construct_shapes(); + call _construct_shapes +;src/main.c:236: initialize_field(); + call _initialize_field +;src/main.c:239: new_shape(); + call _new_shape +;src/main.c:242: put_string("\033[2J"); + ld hl, #___str_10 + push hl + call _put_string + pop af +;src/main.c:246: while (loop()); +00101$: + call _loop + ld a, l + or a, a + jr NZ,00101$ +;src/main.c:247: } + ret +___str_10: + .db 0x1b + .ascii "[2J" + .db 0x00 + .area _CODE + .area _INITIALIZER +__xinit__current_shape: + .db #0x00 ; 0 +__xinit__current_rotation: + .db #0x00 ; 0 +__xinit__current_x: + .db #0x06 ; 6 +__xinit__current_y: + .db #0x00 ; 0 +__xinit__counter: + .db #0x02 ; 2 + .area _CABS (ABS) diff --git a/.build/main.lst b/.build/main.lst new file mode 100644 index 0000000..26d389e --- /dev/null +++ b/.build/main.lst @@ -0,0 +1,1023 @@ + 1 ;-------------------------------------------------------- + 2 ; File Created by SDCC : free open source ANSI-C Compiler + 3 ; Version 4.0.0 #11528 (Linux) + 4 ;-------------------------------------------------------- + 5 .module main + 6 .optsdcc -mz80 + 7 + 8 ;-------------------------------------------------------- + 9 ; Public variables in this module + 10 ;-------------------------------------------------------- + 11 .globl _main + 12 .globl _loop + 13 .globl _draw + 14 .globl _render + 15 .globl _new_shape + 16 .globl _does_piece_fit + 17 .globl _initialize_field + 18 .globl _rotate + 19 .globl _construct_shapes + 20 .globl _random + 21 .globl _put_string + 22 .globl _counter + 23 .globl _current_y + 24 .globl _current_x + 25 .globl _current_rotation + 26 .globl _current_shape + 27 .globl _seed + 28 .globl _screen + 29 .globl _field + 30 .globl _tetromino + 31 ;-------------------------------------------------------- + 32 ; special function registers + 33 ;-------------------------------------------------------- + 0002 34 _cout = 0x0002 + 001F 35 _status = 0x001f + 001E 36 _key = 0x001e + 37 ;-------------------------------------------------------- + 38 ; ram data + 39 ;-------------------------------------------------------- + 40 .area _DATA + 0000 41 _tetromino:: + 0000 42 .ds 14 + 000E 43 _field:: + 000E 44 .ds 216 + 00E6 45 _screen:: + 00E6 46 .ds 216 + 01BE 47 _seed:: + 01BE 48 .ds 1 + 49 ;-------------------------------------------------------- + 50 ; ram data + 51 ;-------------------------------------------------------- + 52 .area _INITIALIZED + 0000 53 _current_shape:: + 0000 54 .ds 1 + 0001 55 _current_rotation:: + 0001 56 .ds 1 + 0002 57 _current_x:: + 0002 58 .ds 1 + 0003 59 _current_y:: + 0003 60 .ds 1 + 0004 61 _counter:: + 0004 62 .ds 1 + 63 ;-------------------------------------------------------- + 64 ; absolute external ram data + 65 ;-------------------------------------------------------- + 66 .area _DABS (ABS) + 67 ;-------------------------------------------------------- + 68 ; global & static initialisations + 69 ;-------------------------------------------------------- + 70 .area _HOME + 71 .area _GSINIT + 72 .area _GSFINAL + 73 .area _GSINIT + 74 ;-------------------------------------------------------- + 75 ; Home + 76 ;-------------------------------------------------------- + 77 .area _HOME + 78 .area _HOME + 79 ;-------------------------------------------------------- + 80 ; code + 81 ;-------------------------------------------------------- + 82 .area _CODE + 83 ;src/main.c:12: void construct_shapes() { + 84 ; --------------------------------- + 85 ; Function construct_shapes + 86 ; --------------------------------- + 0000 87 _construct_shapes:: + 88 ;src/main.c:13: tetromino[0] = "..X." + 0000 21r2Br00 [10] 89 ld hl, #___str_0 + 0003 22r00r00 [16] 90 ld (_tetromino), hl + 91 ;src/main.c:18: tetromino[1] = "..X." + 0006 21r3Cr00 [10] 92 ld hl, #___str_1 + 0009 22r02r00 [16] 93 ld ((_tetromino + 0x0002)), hl + 94 ;src/main.c:23: tetromino[2] = ".X.." + 000C 21r4Dr00 [10] 95 ld hl, #___str_2 + 000F 22r04r00 [16] 96 ld ((_tetromino + 0x0004)), hl + 97 ;src/main.c:28: tetromino[3] = "..X." + 0012 21r5Er00 [10] 98 ld hl, #___str_3 + 0015 22r06r00 [16] 99 ld ((_tetromino + 0x0006)), hl + 100 ;src/main.c:33: tetromino[4] = ".X.." + 0018 21r6Fr00 [10] 101 ld hl, #___str_4 + 001B 22r08r00 [16] 102 ld ((_tetromino + 0x0008)), hl + 103 ;src/main.c:38: tetromino[5] = "..X." + 001E 21r80r00 [10] 104 ld hl, #___str_5 + 0021 22r0Ar00 [16] 105 ld ((_tetromino + 0x000a)), hl + 106 ;src/main.c:43: tetromino[6] = "...." + 0024 21r91r00 [10] 107 ld hl, #___str_6 + 0027 22r0Cr00 [16] 108 ld ((_tetromino + 0x000c)), hl + 109 ;src/main.c:47: } + 002A C9 [10] 110 ret + 002B 111 ___str_0: + 002B 2E 2E 58 2E 2E 2E 112 .ascii "..X...X...X...X." + 58 2E 2E 2E 58 2E + 2E 2E 58 2E + 003B 00 113 .db 0x00 + 003C 114 ___str_1: + 003C 2E 2E 58 2E 2E 58 115 .ascii "..X..XX..X......" + 58 2E 2E 58 2E 2E + 2E 2E 2E 2E + 004C 00 116 .db 0x00 + 004D 117 ___str_2: + 004D 2E 58 2E 2E 2E 58 118 .ascii ".X...XX...X....." + 58 2E 2E 2E 58 2E + 2E 2E 2E 2E + 005D 00 119 .db 0x00 + 005E 120 ___str_3: + 005E 2E 2E 58 2E 2E 2E 121 .ascii "..X...X..XX....." + 58 2E 2E 58 58 2E + 2E 2E 2E 2E + 006E 00 122 .db 0x00 + 006F 123 ___str_4: + 006F 2E 58 2E 2E 2E 58 124 .ascii ".X...X...XX....." + 2E 2E 2E 58 58 2E + 2E 2E 2E 2E + 007F 00 125 .db 0x00 + 0080 126 ___str_5: + 0080 2E 2E 58 2E 2E 58 127 .ascii "..X..XX...X....." + 58 2E 2E 2E 58 2E + 2E 2E 2E 2E + 0090 00 128 .db 0x00 + 0091 129 ___str_6: + 0091 2E 2E 2E 2E 2E 58 130 .ascii ".....XX..XX....." + 58 2E 2E 58 58 2E + 2E 2E 2E 2E + 00A1 00 131 .db 0x00 + 132 ;src/main.c:49: uint8_t rotate(uint8_t x, uint8_t y, uint8_t r) { + 133 ; --------------------------------- + 134 ; Function rotate + 135 ; --------------------------------- + 00A2 136 _rotate:: + 00A2 DD E5 [15] 137 push ix + 00A4 DD 21 00 00 [14] 138 ld ix,#0 + 00A8 DD 39 [15] 139 add ix,sp + 00AA 3B [ 6] 140 dec sp + 141 ;src/main.c:52: return y*4+x; + 00AB DD 7E 05 [19] 142 ld a, 5 (ix) + 00AE DD 4E 04 [19] 143 ld c, 4 (ix) + 00B1 87 [ 4] 144 add a, a + 00B2 87 [ 4] 145 add a, a + 00B3 6F [ 4] 146 ld l, a + 147 ;src/main.c:50: switch (r) { + 00B4 DD 7E 06 [19] 148 ld a, 6 (ix) + 00B7 B7 [ 4] 149 or a, a + 00B8 28 21 [12] 150 jr Z,00101$ + 151 ;src/main.c:54: return 12 + y - x*4; + 00BA DD 5E 05 [19] 152 ld e, 5 (ix) + 00BD DD 7E 04 [19] 153 ld a, 4 (ix) + 00C0 87 [ 4] 154 add a, a + 00C1 87 [ 4] 155 add a, a + 00C2 DD 77 FF [19] 156 ld -1 (ix), a + 157 ;src/main.c:50: switch (r) { + 00C5 DD 7E 06 [19] 158 ld a, 6 (ix) + 00C8 3D [ 4] 159 dec a + 00C9 28 13 [12] 160 jr Z,00102$ + 00CB DD 7E 06 [19] 161 ld a, 6 (ix) + 00CE D6 02 [ 7] 162 sub a, #0x02 + 00D0 28 15 [12] 163 jr Z,00103$ + 00D2 DD 7E 06 [19] 164 ld a, 6 (ix) + 00D5 D6 03 [ 7] 165 sub a, #0x03 + 00D7 28 15 [12] 166 jr Z,00104$ + 00D9 18 1C [12] 167 jr 00105$ + 168 ;src/main.c:51: case 0: + 00DB 169 00101$: + 170 ;src/main.c:52: return y*4+x; + 00DB 09 [11] 171 add hl, bc + 00DC 18 1B [12] 172 jr 00106$ + 173 ;src/main.c:53: case 1: + 00DE 174 00102$: + 175 ;src/main.c:54: return 12 + y - x*4; + 00DE 7B [ 4] 176 ld a, e + 00DF C6 0C [ 7] 177 add a, #0x0c + 00E1 DD 96 FF [19] 178 sub a, -1 (ix) + 00E4 6F [ 4] 179 ld l, a + 00E5 18 12 [12] 180 jr 00106$ + 181 ;src/main.c:55: case 2: + 00E7 182 00103$: + 183 ;src/main.c:56: return 15 - y*4 - x; + 00E7 3E 0F [ 7] 184 ld a, #0x0f + 00E9 95 [ 4] 185 sub a, l + 00EA 91 [ 4] 186 sub a, c + 00EB 6F [ 4] 187 ld l, a + 00EC 18 0B [12] 188 jr 00106$ + 189 ;src/main.c:57: case 3: + 00EE 190 00104$: + 191 ;src/main.c:58: return 3 - y + x*4; + 00EE 3E 03 [ 7] 192 ld a, #0x03 + 00F0 93 [ 4] 193 sub a, e + 00F1 DD 86 FF [19] 194 add a, -1 (ix) + 00F4 6F [ 4] 195 ld l, a + 00F5 18 02 [12] 196 jr 00106$ + 197 ;src/main.c:59: } + 00F7 198 00105$: + 199 ;src/main.c:60: return 0; + 00F7 2E 00 [ 7] 200 ld l, #0x00 + 00F9 201 00106$: + 202 ;src/main.c:61: } + 00F9 33 [ 6] 203 inc sp + 00FA DD E1 [14] 204 pop ix + 00FC C9 [10] 205 ret + 206 ;src/main.c:63: void initialize_field() { + 207 ; --------------------------------- + 208 ; Function initialize_field + 209 ; --------------------------------- + 00FD 210 _initialize_field:: + 00FD DD E5 [15] 211 push ix + 00FF DD 21 00 00 [14] 212 ld ix,#0 + 0103 DD 39 [15] 213 add ix,sp + 0105 F5 [11] 214 push af + 0106 3B [ 6] 215 dec sp + 216 ;src/main.c:64: for (uint8_t y = 0; y < HEIGHT; ++y) { + 0107 0E 00 [ 7] 217 ld c, #0x00 + 0109 218 00107$: + 219 ;src/main.c:65: for (uint8_t x = 0; x < WIDTH; ++x) { + 0109 79 [ 4] 220 ld a,c + 010A FE 12 [ 7] 221 cp a,#0x12 + 010C 30 55 [12] 222 jr NC,00109$ + 010E D6 11 [ 7] 223 sub a, #0x11 + 0110 3E 01 [ 7] 224 ld a, #0x01 + 0112 28 01 [12] 225 jr Z,00153$ + 0114 AF [ 4] 226 xor a, a + 0115 227 00153$: + 0115 DD 77 FD [19] 228 ld -3 (ix), a + 0118 1E 00 [ 7] 229 ld e, #0x00 + 011A 230 00104$: + 011A 7B [ 4] 231 ld a, e + 011B D6 0C [ 7] 232 sub a, #0x0c + 011D 30 41 [12] 233 jr NC,00108$ + 234 ;src/main.c:66: field[y*WIDTH + x] = (x == 0 || x == WIDTH - 1 || y == HEIGHT-1) ? 9 : 0; + 011F 69 [ 4] 235 ld l, c + 0120 26 00 [ 7] 236 ld h, #0x00 + 0122 D5 [11] 237 push de + 0123 5D [ 4] 238 ld e, l + 0124 54 [ 4] 239 ld d, h + 0125 29 [11] 240 add hl, hl + 0126 19 [11] 241 add hl, de + 0127 29 [11] 242 add hl, hl + 0128 29 [11] 243 add hl, hl + 0129 D1 [10] 244 pop de + 012A 7B [ 4] 245 ld a, e + 012B 16 00 [ 7] 246 ld d, #0x00 + 012D 85 [ 4] 247 add a, l + 012E 6F [ 4] 248 ld l, a + 012F 7A [ 4] 249 ld a, d + 0130 8C [ 4] 250 adc a, h + 0131 67 [ 4] 251 ld h, a + 0132 7D [ 4] 252 ld a, l + 0133 C6r0E [ 7] 253 add a, #<(_field) + 0135 DD 77 FE [19] 254 ld -2 (ix), a + 0138 7C [ 4] 255 ld a, h + 0139 CEs00 [ 7] 256 adc a, #>(_field) + 013B DD 77 FF [19] 257 ld -1 (ix), a + 013E 7B [ 4] 258 ld a, e + 013F B7 [ 4] 259 or a, a + 0140 28 0B [12] 260 jr Z,00114$ + 0142 7B [ 4] 261 ld a, e + 0143 D6 0B [ 7] 262 sub a, #0x0b + 0145 28 06 [12] 263 jr Z,00114$ + 0147 DD CB FD 46 [20] 264 bit 0, -3 (ix) + 014B 28 05 [12] 265 jr Z,00111$ + 014D 266 00114$: + 014D 21 09 00 [10] 267 ld hl, #0x0009 + 0150 18 03 [12] 268 jr 00112$ + 0152 269 00111$: + 0152 21 00 00 [10] 270 ld hl, #0x0000 + 0155 271 00112$: + 0155 7D [ 4] 272 ld a, l + 0156 DD 6E FE [19] 273 ld l, -2 (ix) + 0159 DD 66 FF [19] 274 ld h, -1 (ix) + 015C 77 [ 7] 275 ld (hl), a + 276 ;src/main.c:65: for (uint8_t x = 0; x < WIDTH; ++x) { + 015D 1C [ 4] 277 inc e + 015E 18 BA [12] 278 jr 00104$ + 0160 279 00108$: + 280 ;src/main.c:64: for (uint8_t y = 0; y < HEIGHT; ++y) { + 0160 0C [ 4] 281 inc c + 0161 18 A6 [12] 282 jr 00107$ + 0163 283 00109$: + 284 ;src/main.c:69: } + 0163 DD F9 [10] 285 ld sp, ix + 0165 DD E1 [14] 286 pop ix + 0167 C9 [10] 287 ret + 288 ;src/main.c:71: uint8_t does_piece_fit(uint8_t shape, uint8_t rotation, uint8_t px, uint8_t py) { + 289 ; --------------------------------- + 290 ; Function does_piece_fit + 291 ; --------------------------------- + 0168 292 _does_piece_fit:: + 0168 DD E5 [15] 293 push ix + 016A DD 21 00 00 [14] 294 ld ix,#0 + 016E DD 39 [15] 295 add ix,sp + 0170 F5 [11] 296 push af + 0171 F5 [11] 297 push af + 298 ;src/main.c:72: for (uint8_t y = 0; y < 4; ++y) { + 0172 0E 00 [ 7] 299 ld c, #0x00 + 0174 300 00116$: + 0174 79 [ 4] 301 ld a, c + 0175 D6 04 [ 7] 302 sub a, #0x04 + 0177 D2r1Er02 [10] 303 jp NC, 00111$ + 304 ;src/main.c:73: for (uint8_t x = 0; x < 4; ++x) { + 017A DD 7E 07 [19] 305 ld a, 7 (ix) + 017D 81 [ 4] 306 add a, c + 017E DD 77 FC [19] 307 ld -4 (ix), a + 0181 AF [ 4] 308 xor a, a + 0182 DD 77 FF [19] 309 ld -1 (ix), a + 0185 310 00113$: + 0185 DD 7E FF [19] 311 ld a, -1 (ix) + 0188 D6 04 [ 7] 312 sub a, #0x04 + 018A D2r1Ar02 [10] 313 jp NC, 00117$ + 314 ;src/main.c:75: uint8_t pi = rotate(x, y, rotation); + 018D C5 [11] 315 push bc + 018E DD 46 05 [19] 316 ld b, 5 (ix) + 0191 C5 [11] 317 push bc + 0192 DD 7E FF [19] 318 ld a, -1 (ix) + 0195 F5 [11] 319 push af + 0196 33 [ 6] 320 inc sp + 0197 CDrA2r00 [17] 321 call _rotate + 019A F1 [10] 322 pop af + 019B 33 [ 6] 323 inc sp + 019C C1 [10] 324 pop bc + 019D DD 75 FD [19] 325 ld -3 (ix), l + 326 ;src/main.c:78: uint8_t fi = (py + y) * WIDTH + px + x; + 01A0 DD 7E FC [19] 327 ld a, -4 (ix) + 01A3 5F [ 4] 328 ld e, a + 01A4 87 [ 4] 329 add a, a + 01A5 83 [ 4] 330 add a, e + 01A6 87 [ 4] 331 add a, a + 01A7 87 [ 4] 332 add a, a + 01A8 DD 46 06 [19] 333 ld b, 6 (ix) + 01AB 80 [ 4] 334 add a, b + 01AC DD 46 FF [19] 335 ld b, -1 (ix) + 01AF 80 [ 4] 336 add a, b + 01B0 DD 77 FE [19] 337 ld -2 (ix), a + 338 ;src/main.c:80: if (px + x >= 0 && px + x < WIDTH) { + 01B3 DD 5E 06 [19] 339 ld e, 6 (ix) + 01B6 16 00 [ 7] 340 ld d, #0x00 + 01B8 DD 6E FF [19] 341 ld l, -1 (ix) + 01BB 26 00 [ 7] 342 ld h, #0x00 + 01BD 19 [11] 343 add hl, de + 01BE CB 7C [ 8] 344 bit 7, h + 01C0 20 52 [12] 345 jr NZ,00114$ + 01C2 11 0C 80 [10] 346 ld de, #0x800c + 01C5 29 [11] 347 add hl, hl + 01C6 3F [ 4] 348 ccf + 01C7 CB 1C [ 8] 349 rr h + 01C9 CB 1D [ 8] 350 rr l + 01CB ED 52 [15] 351 sbc hl, de + 01CD 30 45 [12] 352 jr NC,00114$ + 353 ;src/main.c:81: if (py + y >= 0 && py + y < HEIGHT) { + 01CF DD 5E 07 [19] 354 ld e, 7 (ix) + 01D2 16 00 [ 7] 355 ld d, #0x00 + 01D4 69 [ 4] 356 ld l, c + 01D5 26 00 [ 7] 357 ld h, #0x00 + 01D7 19 [11] 358 add hl, de + 01D8 CB 7C [ 8] 359 bit 7, h + 01DA 20 38 [12] 360 jr NZ,00114$ + 01DC 11 12 80 [10] 361 ld de, #0x8012 + 01DF 29 [11] 362 add hl, hl + 01E0 3F [ 4] 363 ccf + 01E1 CB 1C [ 8] 364 rr h + 01E3 CB 1D [ 8] 365 rr l + 01E5 ED 52 [15] 366 sbc hl, de + 01E7 30 2B [12] 367 jr NC,00114$ + 368 ;src/main.c:83: if (tetromino[shape][pi] == 'X' && field[fi] != 0) { + 01E9 DD 6E 04 [19] 369 ld l, 4 (ix) + 01EC 26 00 [ 7] 370 ld h, #0x00 + 01EE 29 [11] 371 add hl, hl + 01EF 11r00r00 [10] 372 ld de, #_tetromino + 01F2 19 [11] 373 add hl, de + 01F3 5E [ 7] 374 ld e, (hl) + 01F4 23 [ 6] 375 inc hl + 01F5 56 [ 7] 376 ld d, (hl) + 01F6 DD 6E FD [19] 377 ld l, -3 (ix) + 01F9 26 00 [ 7] 378 ld h, #0x00 + 01FB 19 [11] 379 add hl, de + 01FC 7E [ 7] 380 ld a, (hl) + 01FD D6 58 [ 7] 381 sub a, #0x58 + 01FF 20 13 [12] 382 jr NZ,00114$ + 0201 DD 7E FE [19] 383 ld a, -2 (ix) + 0204 C6r0E [ 7] 384 add a, #<(_field) + 0206 5F [ 4] 385 ld e, a + 0207 3E 00 [ 7] 386 ld a, #0x00 + 0209 CEs00 [ 7] 387 adc a, #>(_field) + 020B 57 [ 4] 388 ld d, a + 020C 1A [ 7] 389 ld a, (de) + 020D B7 [ 4] 390 or a, a + 020E 28 04 [12] 391 jr Z,00114$ + 392 ;src/main.c:84: return 0; + 0210 2E 00 [ 7] 393 ld l, #0x00 + 0212 18 0C [12] 394 jr 00118$ + 0214 395 00114$: + 396 ;src/main.c:73: for (uint8_t x = 0; x < 4; ++x) { + 0214 DD 34 FF [23] 397 inc -1 (ix) + 0217 C3r85r01 [10] 398 jp 00113$ + 021A 399 00117$: + 400 ;src/main.c:72: for (uint8_t y = 0; y < 4; ++y) { + 021A 0C [ 4] 401 inc c + 021B C3r74r01 [10] 402 jp 00116$ + 021E 403 00111$: + 404 ;src/main.c:91: return 1; + 021E 2E 01 [ 7] 405 ld l, #0x01 + 0220 406 00118$: + 407 ;src/main.c:92: } + 0220 DD F9 [10] 408 ld sp, ix + 0222 DD E1 [14] 409 pop ix + 0224 C9 [10] 410 ret + 411 ;src/main.c:99: void new_shape() { + 412 ; --------------------------------- + 413 ; Function new_shape + 414 ; --------------------------------- + 0225 415 _new_shape:: + 416 ;src/main.c:100: do { + 0225 417 00101$: + 418 ;src/main.c:101: current_shape = random() & 0x07; + 0225 CDr00r00 [17] 419 call _random + 0228 7D [ 4] 420 ld a, l + 0229 E6 07 [ 7] 421 and a, #0x07 + 022B 32r00r00 [13] 422 ld (_current_shape+0), a + 423 ;src/main.c:102: } while (current_shape == 7); + 022E 3Ar00r00 [13] 424 ld a,(#_current_shape + 0) + 0231 D6 07 [ 7] 425 sub a, #0x07 + 0233 28 F0 [12] 426 jr Z,00101$ + 427 ;src/main.c:103: } + 0235 C9 [10] 428 ret + 429 ;src/main.c:105: void render() { + 430 ; --------------------------------- + 431 ; Function render + 432 ; --------------------------------- + 0236 433 _render:: + 0236 DD E5 [15] 434 push ix + 0238 DD 21 00 00 [14] 435 ld ix,#0 + 023C DD 39 [15] 436 add ix,sp + 023E F5 [11] 437 push af + 023F F5 [11] 438 push af + 439 ;src/main.c:107: for (uint8_t i = 0; i < WIDTH*HEIGHT; ++i) { + 0240 01rE6r00 [10] 440 ld bc, #_screen+0 + 0243 11r0Er00 [10] 441 ld de, #_field+0 + 0246 AF [ 4] 442 xor a, a + 0247 DD 77 FF [19] 443 ld -1 (ix), a + 024A 444 00107$: + 024A DD 7E FF [19] 445 ld a, -1 (ix) + 024D D6 D8 [ 7] 446 sub a, #0xd8 + 024F 30 20 [12] 447 jr NC,00101$ + 448 ;src/main.c:108: screen[i] = field[i]; + 0251 79 [ 4] 449 ld a, c + 0252 DD 86 FF [19] 450 add a, -1 (ix) + 0255 DD 77 FD [19] 451 ld -3 (ix), a + 0258 78 [ 4] 452 ld a, b + 0259 CE 00 [ 7] 453 adc a, #0x00 + 025B DD 77 FE [19] 454 ld -2 (ix), a + 025E DD 6E FF [19] 455 ld l, -1 (ix) + 0261 26 00 [ 7] 456 ld h, #0x00 + 0263 19 [11] 457 add hl, de + 0264 7E [ 7] 458 ld a, (hl) + 0265 DD 6E FD [19] 459 ld l, -3 (ix) + 0268 DD 66 FE [19] 460 ld h, -2 (ix) + 026B 77 [ 7] 461 ld (hl), a + 462 ;src/main.c:107: for (uint8_t i = 0; i < WIDTH*HEIGHT; ++i) { + 026C DD 34 FF [23] 463 inc -1 (ix) + 026F 18 D9 [12] 464 jr 00107$ + 0271 465 00101$: + 466 ;src/main.c:112: for (uint8_t y = 0; y < 4; ++y) { + 0271 1E 00 [ 7] 467 ld e, #0x00 + 0273 468 00113$: + 0273 7B [ 4] 469 ld a, e + 0274 D6 04 [ 7] 470 sub a, #0x04 + 0276 D2r1Br03 [10] 471 jp NC, 00115$ + 472 ;src/main.c:113: for (uint8_t x = 0; x < 4; ++x) { + 0279 16 00 [ 7] 473 ld d, #0x00 + 027B 474 00110$: + 027B 7A [ 4] 475 ld a, d + 027C D6 04 [ 7] 476 sub a, #0x04 + 027E D2r17r03 [10] 477 jp NC, 00114$ + 478 ;src/main.c:114: if (tetromino[current_shape][rotate(x, y, current_rotation)] == 'X') { + 0281 FD 21r00r00 [14] 479 ld iy, #_current_shape + 0285 FD 6E 00 [19] 480 ld l, 0 (iy) + 0288 26 00 [ 7] 481 ld h, #0x00 + 028A 29 [11] 482 add hl, hl + 028B 3Er00 [ 7] 483 ld a, #<(_tetromino) + 028D 85 [ 4] 484 add a, l + 028E 6F [ 4] 485 ld l, a + 028F 3Es00 [ 7] 486 ld a, #>(_tetromino) + 0291 8C [ 4] 487 adc a, h + 0292 67 [ 4] 488 ld h, a + 0293 7E [ 7] 489 ld a, (hl) + 0294 DD 77 FE [19] 490 ld -2 (ix), a + 0297 23 [ 6] 491 inc hl + 0298 7E [ 7] 492 ld a, (hl) + 0299 DD 77 FF [19] 493 ld -1 (ix), a + 029C C5 [11] 494 push bc + 029D D5 [11] 495 push de + 029E 3Ar01r00 [13] 496 ld a, (_current_rotation) + 02A1 F5 [11] 497 push af + 02A2 33 [ 6] 498 inc sp + 02A3 7B [ 4] 499 ld a, e + 02A4 F5 [11] 500 push af + 02A5 33 [ 6] 501 inc sp + 02A6 D5 [11] 502 push de + 02A7 33 [ 6] 503 inc sp + 02A8 CDrA2r00 [17] 504 call _rotate + 02AB F1 [10] 505 pop af + 02AC 33 [ 6] 506 inc sp + 02AD 7D [ 4] 507 ld a, l + 02AE D1 [10] 508 pop de + 02AF C1 [10] 509 pop bc + 02B0 DD 86 FE [19] 510 add a, -2 (ix) + 02B3 6F [ 4] 511 ld l, a + 02B4 3E 00 [ 7] 512 ld a, #0x00 + 02B6 DD 8E FF [19] 513 adc a, -1 (ix) + 02B9 67 [ 4] 514 ld h, a + 02BA 7E [ 7] 515 ld a, (hl) + 02BB D6 58 [ 7] 516 sub a, #0x58 + 02BD 20 54 [12] 517 jr NZ,00111$ + 518 ;src/main.c:115: screen[(current_y+y)*WIDTH + current_x + x] = current_shape + 1; + 02BF FD 21r03r00 [14] 519 ld iy, #_current_y + 02C3 FD 6E 00 [19] 520 ld l, 0 (iy) + 02C6 26 00 [ 7] 521 ld h, #0x00 + 02C8 DD 73 FE [19] 522 ld -2 (ix), e + 02CB AF [ 4] 523 xor a, a + 02CC DD 77 FF [19] 524 ld -1 (ix), a + 02CF DD 7E FE [19] 525 ld a, -2 (ix) + 02D2 85 [ 4] 526 add a, l + 02D3 6F [ 4] 527 ld l, a + 02D4 DD 7E FF [19] 528 ld a, -1 (ix) + 02D7 8C [ 4] 529 adc a, h + 02D8 67 [ 4] 530 ld h, a + 02D9 D5 [11] 531 push de + 02DA 5D [ 4] 532 ld e, l + 02DB 54 [ 4] 533 ld d, h + 02DC 29 [11] 534 add hl, hl + 02DD 19 [11] 535 add hl, de + 02DE 29 [11] 536 add hl, hl + 02DF 29 [11] 537 add hl, hl + 02E0 D1 [10] 538 pop de + 02E1 E3 [19] 539 ex (sp), hl + 02E2 3Ar02r00 [13] 540 ld a,(#_current_x + 0) + 02E5 26 00 [ 7] 541 ld h, #0x00 + 02E7 DD 86 FC [19] 542 add a, -4 (ix) + 02EA DD 77 FE [19] 543 ld -2 (ix), a + 02ED 7C [ 4] 544 ld a, h + 02EE DD 8E FD [19] 545 adc a, -3 (ix) + 02F1 DD 77 FF [19] 546 ld -1 (ix), a + 02F4 6A [ 4] 547 ld l, d + 02F5 26 00 [ 7] 548 ld h, #0x00 + 02F7 7D [ 4] 549 ld a, l + 02F8 DD 86 FE [19] 550 add a, -2 (ix) + 02FB 6F [ 4] 551 ld l, a + 02FC 7C [ 4] 552 ld a, h + 02FD DD 8E FF [19] 553 adc a, -1 (ix) + 0300 67 [ 4] 554 ld h, a + 0301 09 [11] 555 add hl, bc + 0302 DD 75 FE [19] 556 ld -2 (ix), l + 0305 DD 74 FF [19] 557 ld -1 (ix), h + 0308 3Ar00r00 [13] 558 ld a,(#_current_shape + 0) + 030B 3C [ 4] 559 inc a + 030C DD 6E FE [19] 560 ld l, -2 (ix) + 030F DD 66 FF [19] 561 ld h, -1 (ix) + 0312 77 [ 7] 562 ld (hl), a + 0313 563 00111$: + 564 ;src/main.c:113: for (uint8_t x = 0; x < 4; ++x) { + 0313 14 [ 4] 565 inc d + 0314 C3r7Br02 [10] 566 jp 00110$ + 0317 567 00114$: + 568 ;src/main.c:112: for (uint8_t y = 0; y < 4; ++y) { + 0317 1C [ 4] 569 inc e + 0318 C3r73r02 [10] 570 jp 00113$ + 031B 571 00115$: + 572 ;src/main.c:119: } + 031B DD F9 [10] 573 ld sp, ix + 031D DD E1 [14] 574 pop ix + 031F C9 [10] 575 ret + 576 ;src/main.c:122: void draw() { + 577 ; --------------------------------- + 578 ; Function draw + 579 ; --------------------------------- + 0320 580 _draw:: + 0320 DD E5 [15] 581 push ix + 0322 DD 21 00 00 [14] 582 ld ix,#0 + 0326 DD 39 [15] 583 add ix,sp + 0328 3B [ 6] 584 dec sp + 585 ;src/main.c:124: put_string("\033[2;2H"); + 0329 21rB3r03 [10] 586 ld hl, #___str_8 + 032C E5 [11] 587 push hl + 032D CDr00r00 [17] 588 call _put_string + 0330 F1 [10] 589 pop af + 590 ;src/main.c:125: for (uint8_t y = 0; y < HEIGHT*SCALE; ++y) { + 0331 0E 00 [ 7] 591 ld c, #0x00 + 0333 592 00112$: + 0333 79 [ 4] 593 ld a, c + 0334 D6 12 [ 7] 594 sub a, #0x12 + 0336 30 6C [12] 595 jr NC,00114$ + 596 ;src/main.c:126: for (uint8_t x = 0; x < WIDTH*SCALE; ++x) { + 0338 AF [ 4] 597 xor a, a + 0339 DD 77 FF [19] 598 ld -1 (ix), a + 033C 599 00109$: + 033C DD 7E FF [19] 600 ld a, -1 (ix) + 033F D6 0C [ 7] 601 sub a, #0x0c + 0341 30 52 [12] 602 jr NC,00106$ + 603 ;src/main.c:127: uint8_t i = screen[y/SCALE*WIDTH + x/SCALE]; + 0343 59 [ 4] 604 ld e, c + 0344 16 00 [ 7] 605 ld d, #0x00 + 0346 6B [ 4] 606 ld l, e + 0347 62 [ 4] 607 ld h, d + 0348 29 [11] 608 add hl, hl + 0349 19 [11] 609 add hl, de + 034A 29 [11] 610 add hl, hl + 034B 29 [11] 611 add hl, hl + 034C DD 5E FF [19] 612 ld e, -1 (ix) + 034F 16 00 [ 7] 613 ld d, #0x00 + 0351 19 [11] 614 add hl, de + 0352 11rE6r00 [10] 615 ld de, #_screen + 0355 19 [11] 616 add hl, de + 0356 5E [ 7] 617 ld e, (hl) + 618 ;src/main.c:128: if (i >= 8) { + 0357 7B [ 4] 619 ld a, e + 0358 D6 08 [ 7] 620 sub a, #0x08 + 035A 38 12 [12] 621 jr C,00104$ + 622 ;src/main.c:129: cout = '\033'; + 035C 3E 1B [ 7] 623 ld a, #0x1b + 035E D3 02 [11] 624 out (_cout), a + 625 ;src/main.c:130: cout = '['; + 0360 3E 5B [ 7] 626 ld a, #0x5b + 0362 D3 02 [11] 627 out (_cout), a + 628 ;src/main.c:131: cout = '0'; + 0364 3E 30 [ 7] 629 ld a, #0x30 + 0366 D3 02 [11] 630 out (_cout), a + 631 ;src/main.c:132: cout = 'm'; + 0368 3E 6D [ 7] 632 ld a, #0x6d + 036A D3 02 [11] 633 out (_cout), a + 036C 18 19 [12] 634 jr 00105$ + 036E 635 00104$: + 636 ;src/main.c:133: } else if (i > 0) { + 036E 7B [ 4] 637 ld a, e + 036F B7 [ 4] 638 or a, a + 0370 28 15 [12] 639 jr Z,00105$ + 640 ;src/main.c:134: cout = '\033'; + 0372 3E 1B [ 7] 641 ld a, #0x1b + 0374 D3 02 [11] 642 out (_cout), a + 643 ;src/main.c:135: cout = '['; + 0376 3E 5B [ 7] 644 ld a, #0x5b + 0378 D3 02 [11] 645 out (_cout), a + 646 ;src/main.c:136: cout = '3'; + 037A 3E 33 [ 7] 647 ld a, #0x33 + 037C D3 02 [11] 648 out (_cout), a + 649 ;src/main.c:137: cout = 48+i; + 037E 7B [ 4] 650 ld a, e + 037F C6 30 [ 7] 651 add a, #0x30 + 0381 D3 02 [11] 652 out (_cout), a + 653 ;src/main.c:138: cout = 'm'; + 0383 3E 6D [ 7] 654 ld a, #0x6d + 0385 D3 02 [11] 655 out (_cout), a + 0387 656 00105$: + 657 ;src/main.c:140: char c = " RGOBMCW=#"[i]; + 0387 21rA8r03 [10] 658 ld hl, #___str_7 + 038A 16 00 [ 7] 659 ld d, #0x00 + 038C 19 [11] 660 add hl, de + 038D 7E [ 7] 661 ld a, (hl) + 038E D3 02 [11] 662 out (_cout), a + 663 ;src/main.c:126: for (uint8_t x = 0; x < WIDTH*SCALE; ++x) { + 0390 DD 34 FF [23] 664 inc -1 (ix) + 0393 18 A7 [12] 665 jr 00109$ + 0395 666 00106$: + 667 ;src/main.c:143: cout = '\n'; + 0395 3E 0A [ 7] 668 ld a, #0x0a + 0397 D3 02 [11] 669 out (_cout), a + 670 ;src/main.c:144: cout = '\r'; + 0399 3E 0D [ 7] 671 ld a, #0x0d + 039B D3 02 [11] 672 out (_cout), a + 673 ;src/main.c:145: cout = ' '; + 039D 3E 20 [ 7] 674 ld a, #0x20 + 039F D3 02 [11] 675 out (_cout), a + 676 ;src/main.c:125: for (uint8_t y = 0; y < HEIGHT*SCALE; ++y) { + 03A1 0C [ 4] 677 inc c + 03A2 18 8F [12] 678 jr 00112$ + 03A4 679 00114$: + 680 ;src/main.c:147: } + 03A4 33 [ 6] 681 inc sp + 03A5 DD E1 [14] 682 pop ix + 03A7 C9 [10] 683 ret + 03A8 684 ___str_7: + 03A8 20 52 47 4F 42 4D 685 .ascii " RGOBMCW=#" + 43 57 3D 23 + 03B2 00 686 .db 0x00 + 03B3 687 ___str_8: + 03B3 1B 688 .db 0x1b + 03B4 5B 32 3B 32 48 689 .ascii "[2;2H" + 03B9 00 690 .db 0x00 + 691 ;src/main.c:154: uint8_t loop() { + 692 ; --------------------------------- + 693 ; Function loop + 694 ; --------------------------------- + 03BA 695 _loop:: + 03BA DD E5 [15] 696 push ix + 03BC DD 21 00 00 [14] 697 ld ix,#0 + 03C0 DD 39 [15] 698 add ix,sp + 03C2 F5 [11] 699 push af + 700 ;src/main.c:156: if (status & 1) { + 03C3 DB 1F [11] 701 in a, (_status) + 03C5 0F [ 4] 702 rrca + 03C6 D2r6Cr04 [10] 703 jp NC,00116$ + 704 ;src/main.c:157: uint8_t nx = current_x; + 03C9 3Ar02r00 [13] 705 ld a,(#_current_x + 0) + 03CC DD 77 FE [19] 706 ld -2 (ix), a + 707 ;src/main.c:158: uint8_t ny = current_y; + 03CF 21r03r00 [10] 708 ld hl,#_current_y + 0 + 03D2 4E [ 7] 709 ld c, (hl) + 710 ;src/main.c:159: uint8_t nr = current_rotation; + 03D3 3Ar01r00 [13] 711 ld a,(#_current_rotation + 0) + 03D6 DD 77 FF [19] 712 ld -1 (ix), a + 713 ;src/main.c:161: switch (key) { + 03D9 DB 1E [11] 714 in a, (_key) + 03DB FE 03 [ 7] 715 cp a, #0x03 + 03DD 28 16 [12] 716 jr Z,00101$ + 03DF FE 61 [ 7] 717 cp a, #0x61 + 03E1 28 1F [12] 718 jr Z,00102$ + 03E3 FE 64 [ 7] 719 cp a, #0x64 + 03E5 28 20 [12] 720 jr Z,00103$ + 03E7 FE 72 [ 7] 721 cp a, #0x72 + 03E9 28 21 [12] 722 jr Z,00104$ + 03EB FE 73 [ 7] 723 cp a, #0x73 + 03ED 28 2D [12] 724 jr Z,00107$ + 03EF D6 77 [ 7] 725 sub a, #0x77 + 03F1 28 30 [12] 726 jr Z,00142$ + 03F3 18 4D [12] 727 jr 00112$ + 728 ;src/main.c:162: case 0x03: + 03F5 729 00101$: + 730 ;src/main.c:163: put_string("Exit!\n\r"); + 03F5 21r2Ar05 [10] 731 ld hl, #___str_9 + 03F8 E5 [11] 732 push hl + 03F9 CDr00r00 [17] 733 call _put_string + 03FC F1 [10] 734 pop af + 735 ;src/main.c:164: return 0; + 03FD 2E 00 [ 7] 736 ld l, #0x00 + 03FF C3r25r05 [10] 737 jp 00132$ + 738 ;src/main.c:167: case 'a': + 0402 739 00102$: + 740 ;src/main.c:168: nx--; + 0402 DD 35 FE [23] 741 dec -2 (ix) + 742 ;src/main.c:169: break; + 0405 18 3B [12] 743 jr 00112$ + 744 ;src/main.c:172: case 'd': + 0407 745 00103$: + 746 ;src/main.c:173: nx++; + 0407 DD 34 FE [23] 747 inc -2 (ix) + 748 ;src/main.c:174: break; + 040A 18 36 [12] 749 jr 00112$ + 750 ;src/main.c:177: case 'r': + 040C 751 00104$: + 752 ;src/main.c:178: nr++; + 040C DD 34 FF [23] 753 inc -1 (ix) + 754 ;src/main.c:179: if (nr == 4) { + 040F DD 7E FF [19] 755 ld a, -1 (ix) + 0412 D6 04 [ 7] 756 sub a, #0x04 + 0414 20 2C [12] 757 jr NZ,00112$ + 758 ;src/main.c:180: nr = 0; + 0416 AF [ 4] 759 xor a, a + 0417 DD 77 FF [19] 760 ld -1 (ix), a + 761 ;src/main.c:182: break; + 041A 18 26 [12] 762 jr 00112$ + 763 ;src/main.c:185: case 's': + 041C 764 00107$: + 765 ;src/main.c:186: counter = 0; + 041C 21r04r00 [10] 766 ld hl,#_counter + 0 + 041F 36 00 [10] 767 ld (hl), #0x00 + 768 ;src/main.c:187: break; + 0421 18 1F [12] 769 jr 00112$ + 770 ;src/main.c:191: while (does_piece_fit(current_shape, current_rotation, current_x, ++ny + 1)); + 0423 771 00142$: + 0423 772 00109$: + 0423 0C [ 4] 773 inc c + 0424 79 [ 4] 774 ld a, c + 0425 3C [ 4] 775 inc a + 0426 C5 [11] 776 push bc + 0427 F5 [11] 777 push af + 0428 33 [ 6] 778 inc sp + 0429 3Ar02r00 [13] 779 ld a, (_current_x) + 042C F5 [11] 780 push af + 042D 33 [ 6] 781 inc sp + 042E 3Ar01r00 [13] 782 ld a, (_current_rotation) + 0431 F5 [11] 783 push af + 0432 33 [ 6] 784 inc sp + 0433 3Ar00r00 [13] 785 ld a, (_current_shape) + 0436 F5 [11] 786 push af + 0437 33 [ 6] 787 inc sp + 0438 CDr68r01 [17] 788 call _does_piece_fit + 043B F1 [10] 789 pop af + 043C F1 [10] 790 pop af + 043D 7D [ 4] 791 ld a, l + 043E C1 [10] 792 pop bc + 043F B7 [ 4] 793 or a, a + 0440 20 E1 [12] 794 jr NZ,00109$ + 795 ;src/main.c:193: } + 0442 796 00112$: + 797 ;src/main.c:195: if (does_piece_fit(current_shape, nr, nx, ny)) { + 0442 C5 [11] 798 push bc + 0443 79 [ 4] 799 ld a, c + 0444 F5 [11] 800 push af + 0445 33 [ 6] 801 inc sp + 0446 DD 66 FE [19] 802 ld h, -2 (ix) + 0449 DD 6E FF [19] 803 ld l, -1 (ix) + 044C E5 [11] 804 push hl + 044D 3Ar00r00 [13] 805 ld a, (_current_shape) + 0450 F5 [11] 806 push af + 0451 33 [ 6] 807 inc sp + 0452 CDr68r01 [17] 808 call _does_piece_fit + 0455 F1 [10] 809 pop af + 0456 F1 [10] 810 pop af + 0457 7D [ 4] 811 ld a, l + 0458 C1 [10] 812 pop bc + 0459 B7 [ 4] 813 or a, a + 045A 28 10 [12] 814 jr Z,00116$ + 815 ;src/main.c:196: current_x = nx; + 045C DD 7E FE [19] 816 ld a, -2 (ix) + 045F 32r02r00 [13] 817 ld (#_current_x + 0),a + 818 ;src/main.c:197: current_y = ny; + 0462 21r03r00 [10] 819 ld hl,#_current_y + 0 + 0465 71 [ 7] 820 ld (hl), c + 821 ;src/main.c:198: current_rotation = nr; + 0466 DD 7E FF [19] 822 ld a, -1 (ix) + 0469 32r01r00 [13] 823 ld (#_current_rotation + 0),a + 046C 824 00116$: + 825 ;src/main.c:203: if (counter == 0) { + 046C 3Ar04r00 [13] 826 ld a,(#_counter + 0) + 046F B7 [ 4] 827 or a, a + 0470 C2r19r05 [10] 828 jp NZ, 00125$ + 829 ;src/main.c:204: if (does_piece_fit(current_shape, current_rotation, current_x, current_y+1)) { + 0473 3Ar03r00 [13] 830 ld a,(#_current_y + 0) + 0476 3C [ 4] 831 inc a + 0477 F5 [11] 832 push af + 0478 33 [ 6] 833 inc sp + 0479 3Ar02r00 [13] 834 ld a, (_current_x) + 047C F5 [11] 835 push af + 047D 33 [ 6] 836 inc sp + 047E 3Ar01r00 [13] 837 ld a, (_current_rotation) + 0481 F5 [11] 838 push af + 0482 33 [ 6] 839 inc sp + 0483 3Ar00r00 [13] 840 ld a, (_current_shape) + 0486 F5 [11] 841 push af + 0487 33 [ 6] 842 inc sp + 0488 CDr68r01 [17] 843 call _does_piece_fit + 048B F1 [10] 844 pop af + 048C F1 [10] 845 pop af + 048D 7D [ 4] 846 ld a, l + 048E B7 [ 4] 847 or a, a + 048F 28 07 [12] 848 jr Z,00150$ + 849 ;src/main.c:205: current_y++; + 0491 21r03r00 [10] 850 ld hl, #_current_y+0 + 0494 34 [11] 851 inc (hl) + 0495 C3r14r05 [10] 852 jp 00123$ + 853 ;src/main.c:208: for (uint8_t y = 0; y < 4; ++y) { + 0498 854 00150$: + 0498 0E 00 [ 7] 855 ld c, #0x00 + 049A 856 00130$: + 049A 79 [ 4] 857 ld a, c + 049B D6 04 [ 7] 858 sub a, #0x04 + 049D 30 63 [12] 859 jr NC,00120$ + 860 ;src/main.c:209: for (uint8_t x = 0; x < 4; ++x) { + 049F 06 00 [ 7] 861 ld b, #0x00 + 04A1 862 00127$: + 04A1 78 [ 4] 863 ld a, b + 04A2 D6 04 [ 7] 864 sub a, #0x04 + 04A4 30 59 [12] 865 jr NC,00131$ + 866 ;src/main.c:210: if (tetromino[current_shape][rotate(x, y, current_rotation)] == 'X') { + 04A6 FD 21r00r00 [14] 867 ld iy, #_current_shape + 04AA FD 6E 00 [19] 868 ld l, 0 (iy) + 04AD 26 00 [ 7] 869 ld h, #0x00 + 04AF 29 [11] 870 add hl, hl + 04B0 11r00r00 [10] 871 ld de, #_tetromino + 04B3 19 [11] 872 add hl, de + 04B4 5E [ 7] 873 ld e, (hl) + 04B5 23 [ 6] 874 inc hl + 04B6 56 [ 7] 875 ld d, (hl) + 04B7 C5 [11] 876 push bc + 04B8 D5 [11] 877 push de + 04B9 3Ar01r00 [13] 878 ld a, (_current_rotation) + 04BC F5 [11] 879 push af + 04BD 33 [ 6] 880 inc sp + 04BE 79 [ 4] 881 ld a, c + 04BF F5 [11] 882 push af + 04C0 33 [ 6] 883 inc sp + 04C1 C5 [11] 884 push bc + 04C2 33 [ 6] 885 inc sp + 04C3 CDrA2r00 [17] 886 call _rotate + 04C6 F1 [10] 887 pop af + 04C7 33 [ 6] 888 inc sp + 04C8 D1 [10] 889 pop de + 04C9 C1 [10] 890 pop bc + 04CA 26 00 [ 7] 891 ld h, #0x00 + 04CC 19 [11] 892 add hl, de + 04CD 7E [ 7] 893 ld a, (hl) + 04CE D6 58 [ 7] 894 sub a, #0x58 + 04D0 20 2A [12] 895 jr NZ,00128$ + 896 ;src/main.c:211: field[(current_y+y)*WIDTH + current_x + x] = current_shape + 1; + 04D2 21r03r00 [10] 897 ld hl,#_current_y + 0 + 04D5 5E [ 7] 898 ld e, (hl) + 04D6 16 00 [ 7] 899 ld d, #0x00 + 04D8 69 [ 4] 900 ld l, c + 04D9 26 00 [ 7] 901 ld h, #0x00 + 04DB 19 [11] 902 add hl, de + 04DC 5D [ 4] 903 ld e, l + 04DD 54 [ 4] 904 ld d, h + 04DE 29 [11] 905 add hl, hl + 04DF 19 [11] 906 add hl, de + 04E0 29 [11] 907 add hl, hl + 04E1 29 [11] 908 add hl, hl + 04E2 EB [ 4] 909 ex de, hl + 04E3 FD 21r02r00 [14] 910 ld iy, #_current_x + 04E7 FD 6E 00 [19] 911 ld l, 0 (iy) + 04EA 26 00 [ 7] 912 ld h, #0x00 + 04EC 19 [11] 913 add hl, de + 04ED 58 [ 4] 914 ld e, b + 04EE 16 00 [ 7] 915 ld d, #0x00 + 04F0 19 [11] 916 add hl, de + 04F1 EB [ 4] 917 ex de, hl + 04F2 21r0Er00 [10] 918 ld hl, #_field + 04F5 19 [11] 919 add hl, de + 04F6 EB [ 4] 920 ex de, hl + 04F7 3Ar00r00 [13] 921 ld a,(#_current_shape + 0) + 04FA 3C [ 4] 922 inc a + 04FB 12 [ 7] 923 ld (de), a + 04FC 924 00128$: + 925 ;src/main.c:209: for (uint8_t x = 0; x < 4; ++x) { + 04FC 04 [ 4] 926 inc b + 04FD 18 A2 [12] 927 jr 00127$ + 04FF 928 00131$: + 929 ;src/main.c:208: for (uint8_t y = 0; y < 4; ++y) { + 04FF 0C [ 4] 930 inc c + 0500 18 98 [12] 931 jr 00130$ + 0502 932 00120$: + 933 ;src/main.c:216: new_shape(); + 0502 CDr25r02 [17] 934 call _new_shape + 935 ;src/main.c:217: current_y = 0; + 0505 21r03r00 [10] 936 ld hl,#_current_y + 0 + 0508 36 00 [10] 937 ld (hl), #0x00 + 938 ;src/main.c:218: current_x = WIDTH/2; + 050A 21r02r00 [10] 939 ld hl,#_current_x + 0 + 050D 36 06 [10] 940 ld (hl), #0x06 + 941 ;src/main.c:219: current_rotation = 0; + 050F 21r01r00 [10] 942 ld hl,#_current_rotation + 0 + 0512 36 00 [10] 943 ld (hl), #0x00 + 0514 944 00123$: + 945 ;src/main.c:221: counter = SPEED; + 0514 21r04r00 [10] 946 ld hl,#_counter + 0 + 0517 36 02 [10] 947 ld (hl), #0x02 + 0519 948 00125$: + 949 ;src/main.c:224: counter--; + 0519 21r04r00 [10] 950 ld hl, #_counter+0 + 051C 35 [11] 951 dec (hl) + 952 ;src/main.c:226: render(); + 051D CDr36r02 [17] 953 call _render + 954 ;src/main.c:227: draw(); + 0520 CDr20r03 [17] 955 call _draw + 956 ;src/main.c:229: return 1; + 0523 2E 01 [ 7] 957 ld l, #0x01 + 0525 958 00132$: + 959 ;src/main.c:230: } + 0525 DD F9 [10] 960 ld sp, ix + 0527 DD E1 [14] 961 pop ix + 0529 C9 [10] 962 ret + 052A 963 ___str_9: + 052A 45 78 69 74 21 964 .ascii "Exit!" + 052F 0A 965 .db 0x0a + 0530 0D 966 .db 0x0d + 0531 00 967 .db 0x00 + 968 ;src/main.c:234: void main() { + 969 ; --------------------------------- + 970 ; Function main + 971 ; --------------------------------- + 0532 972 _main:: + 973 ;src/main.c:235: construct_shapes(); + 0532 CDr00r00 [17] 974 call _construct_shapes + 975 ;src/main.c:236: initialize_field(); + 0535 CDrFDr00 [17] 976 call _initialize_field + 977 ;src/main.c:239: new_shape(); + 0538 CDr25r02 [17] 978 call _new_shape + 979 ;src/main.c:242: put_string("\033[2J"); + 053B 21r4Br05 [10] 980 ld hl, #___str_10 + 053E E5 [11] 981 push hl + 053F CDr00r00 [17] 982 call _put_string + 0542 F1 [10] 983 pop af + 984 ;src/main.c:246: while (loop()); + 0543 985 00101$: + 0543 CDrBAr03 [17] 986 call _loop + 0546 7D [ 4] 987 ld a, l + 0547 B7 [ 4] 988 or a, a + 0548 20 F9 [12] 989 jr NZ,00101$ + 990 ;src/main.c:247: } + 054A C9 [10] 991 ret + 054B 992 ___str_10: + 054B 1B 993 .db 0x1b + 054C 5B 32 4A 994 .ascii "[2J" + 054F 00 995 .db 0x00 + 996 .area _CODE + 997 .area _INITIALIZER + 0000 998 __xinit__current_shape: + 0000 00 999 .db #0x00 ; 0 + 0001 1000 __xinit__current_rotation: + 0001 00 1001 .db #0x00 ; 0 + 0002 1002 __xinit__current_x: + 0002 06 1003 .db #0x06 ; 6 + 0003 1004 __xinit__current_y: + 0003 00 1005 .db #0x00 ; 0 + 0004 1006 __xinit__counter: + 0004 02 1007 .db #0x02 ; 2 + 1008 .area _CABS (ABS) diff --git a/.build/main.rel b/.build/main.rel new file mode 100644 index 0000000..7fd8e6c --- /dev/null +++ b/.build/main.rel @@ -0,0 +1,516 @@ +XL2 +H 9 areas 15 global symbols +M main +O -mz80 +S .__.ABS. Def0000 +S _random Ref0000 +S _put_string Ref0000 +A _CODE size 550 flags 0 addr 0 +S _main Def0532 +S _draw Def0320 +S _does_piece_fit Def0168 +S _new_shape Def0225 +S _loop Def03BA +S _render Def0236 +S _construct_shapes Def0000 +S _rotate Def00A2 +S _initialize_field Def00FD +A _DATA size 1BF flags 0 addr 0 +S _tetromino Def0000 +S _seed Def01BE +S _screen Def00E6 +S _field Def000E +A _INITIALIZED size 5 flags 0 addr 0 +S _current_shape Def0000 +S _counter Def0004 +S _current_rotation Def0001 +S _current_x Def0002 +S _current_y Def0003 +A _DABS size 0 flags 8 addr 0 +A _HOME size 0 flags 0 addr 0 +A _GSINIT size 0 flags 0 addr 0 +A _GSFINAL size 0 flags 0 addr 0 +A _INITIALIZER size 5 flags 0 addr 0 +A _CABS size 0 flags 8 addr 0 +T 00 00 +R 00 00 01 00 +T 00 00 +R 00 00 01 00 +T 0E 00 +R 00 00 01 00 +T 0E 00 +R 00 00 01 00 +T E6 00 +R 00 00 01 00 +T E6 00 +R 00 00 01 00 +T BE 01 +R 00 00 01 00 +T BE 01 +R 00 00 01 00 +T 00 00 +R 00 00 02 00 +T 00 00 +R 00 00 02 00 +T 01 00 +R 00 00 02 00 +T 01 00 +R 00 00 02 00 +T 02 00 +R 00 00 02 00 +T 02 00 +R 00 00 02 00 +T 03 00 +R 00 00 02 00 +T 03 00 +R 00 00 02 00 +T 04 00 +R 00 00 02 00 +T 04 00 +R 00 00 02 00 +T 00 00 +R 00 00 00 00 +T 00 00 21 2B 00 22 00 00 21 3C 00 22 +R 00 00 00 00 00 03 00 00 00 06 01 00 00 09 00 00 +T 0A 00 02 00 21 4D 00 22 04 00 21 +R 00 00 00 00 00 02 01 00 00 05 00 00 00 08 01 00 +T 13 00 5E 00 22 06 00 21 6F 00 22 +R 00 00 00 00 00 02 00 00 00 05 01 00 00 08 00 00 +T 1C 00 08 00 21 80 00 22 0A 00 21 +R 00 00 00 00 00 02 01 00 00 05 00 00 00 08 01 00 +T 25 00 91 00 22 0C 00 C9 +R 00 00 00 00 00 02 00 00 00 05 01 00 +T 2B 00 +R 00 00 00 00 +T 2B 00 2E 2E 58 2E 2E 2E 58 2E 2E 2E 58 2E 2E 2E +R 00 00 00 00 +T 39 00 58 2E 00 +R 00 00 00 00 +T 3C 00 +R 00 00 00 00 +T 3C 00 2E 2E 58 2E 2E 58 58 2E 2E 58 2E 2E 2E 2E +R 00 00 00 00 +T 4A 00 2E 2E 00 +R 00 00 00 00 +T 4D 00 +R 00 00 00 00 +T 4D 00 2E 58 2E 2E 2E 58 58 2E 2E 2E 58 2E 2E 2E +R 00 00 00 00 +T 5B 00 2E 2E 00 +R 00 00 00 00 +T 5E 00 +R 00 00 00 00 +T 5E 00 2E 2E 58 2E 2E 2E 58 2E 2E 58 58 2E 2E 2E +R 00 00 00 00 +T 6C 00 2E 2E 00 +R 00 00 00 00 +T 6F 00 +R 00 00 00 00 +T 6F 00 2E 58 2E 2E 2E 58 2E 2E 2E 58 58 2E 2E 2E +R 00 00 00 00 +T 7D 00 2E 2E 00 +R 00 00 00 00 +T 80 00 +R 00 00 00 00 +T 80 00 2E 2E 58 2E 2E 58 58 2E 2E 2E 58 2E 2E 2E +R 00 00 00 00 +T 8E 00 2E 2E 00 +R 00 00 00 00 +T 91 00 +R 00 00 00 00 +T 91 00 2E 2E 2E 2E 2E 58 58 2E 2E 58 58 2E 2E 2E +R 00 00 00 00 +T 9F 00 2E 2E 00 +R 00 00 00 00 +T A2 00 +R 00 00 00 00 +T A2 00 DD E5 DD 21 00 00 DD 39 3B DD 7E 05 DD 4E +R 00 00 00 00 +T B0 00 04 87 87 6F DD 7E 06 B7 28 21 DD 5E 05 DD +R 00 00 00 00 +T BE 00 7E 04 87 87 DD 77 FF DD 7E 06 3D 28 13 DD +R 00 00 00 00 +T CC 00 7E 06 D6 02 28 15 DD 7E 06 D6 03 28 15 18 +R 00 00 00 00 +T DA 00 1C +R 00 00 00 00 +T DB 00 +R 00 00 00 00 +T DB 00 09 18 1B +R 00 00 00 00 +T DE 00 +R 00 00 00 00 +T DE 00 7B C6 0C DD 96 FF 6F 18 12 +R 00 00 00 00 +T E7 00 +R 00 00 00 00 +T E7 00 3E 0F 95 91 6F 18 0B +R 00 00 00 00 +T EE 00 +R 00 00 00 00 +T EE 00 3E 03 93 DD 86 FF 6F 18 02 +R 00 00 00 00 +T F7 00 +R 00 00 00 00 +T F7 00 2E 00 +R 00 00 00 00 +T F9 00 +R 00 00 00 00 +T F9 00 33 DD E1 C9 +R 00 00 00 00 +T FD 00 +R 00 00 00 00 +T FD 00 DD E5 DD 21 00 00 DD 39 F5 3B 0E 00 +R 00 00 00 00 +T 09 01 +R 00 00 00 00 +T 09 01 79 FE 12 30 55 D6 11 3E 01 28 01 AF +R 00 00 00 00 +T 15 01 +R 00 00 00 00 +T 15 01 DD 77 FD 1E 00 +R 00 00 00 00 +T 1A 01 +R 00 00 00 00 +T 1A 01 7B D6 0C 30 41 69 26 00 D5 5D 54 29 19 29 +R 00 00 00 00 +T 28 01 29 D1 7B 16 00 85 6F 7A 8C 67 7D C6 0E 00 +R 00 00 00 00 09 0E 01 00 +T 35 01 DD 77 FE 7C CE 0E 00 DD 77 FF 7B B7 28 0B +R 00 00 00 00 89 07 01 00 +T 42 01 7B D6 0B 28 06 DD CB FD 46 28 05 +R 00 00 00 00 +T 4D 01 +R 00 00 00 00 +T 4D 01 21 09 00 18 03 +R 00 00 00 00 +T 52 01 +R 00 00 00 00 +T 52 01 21 00 00 +R 00 00 00 00 +T 55 01 +R 00 00 00 00 +T 55 01 7D DD 6E FE DD 66 FF 77 1C 18 BA +R 00 00 00 00 +T 60 01 +R 00 00 00 00 +T 60 01 0C 18 A6 +R 00 00 00 00 +T 63 01 +R 00 00 00 00 +T 63 01 DD F9 DD E1 C9 +R 00 00 00 00 +T 68 01 +R 00 00 00 00 +T 68 01 DD E5 DD 21 00 00 DD 39 F5 F5 0E 00 +R 00 00 00 00 +T 74 01 +R 00 00 00 00 +T 74 01 79 D6 04 D2 1E 02 DD 7E 07 81 DD 77 FC AF +R 00 00 00 00 00 06 00 00 +T 82 01 DD 77 FF +R 00 00 00 00 +T 85 01 +R 00 00 00 00 +T 85 01 DD 7E FF D6 04 D2 1A 02 C5 DD 46 05 C5 DD +R 00 00 00 00 00 08 00 00 +T 93 01 7E FF F5 33 CD A2 00 F1 33 C1 DD 75 FD DD +R 00 00 00 00 00 07 00 00 +T A1 01 7E FC 5F 87 83 87 87 DD 46 06 80 DD 46 FF +R 00 00 00 00 +T AF 01 80 DD 77 FE DD 5E 06 16 00 DD 6E FF 26 00 +R 00 00 00 00 +T BD 01 19 CB 7C 20 52 11 0C 80 29 3F CB 1C CB 1D +R 00 00 00 00 +T CB 01 ED 52 30 45 DD 5E 07 16 00 69 26 00 19 CB +R 00 00 00 00 +T D9 01 7C 20 38 11 12 80 29 3F CB 1C CB 1D ED 52 +R 00 00 00 00 +T E7 01 30 2B DD 6E 04 26 00 29 11 00 00 19 5E 23 +R 00 00 00 00 00 0B 01 00 +T F5 01 56 DD 6E FD 26 00 19 7E D6 58 20 13 DD 7E +R 00 00 00 00 +T 03 02 FE C6 0E 00 5F 3E 00 CE 0E 00 57 1A B7 28 +R 00 00 00 00 09 04 01 00 89 0A 01 00 +T 0F 02 04 2E 00 18 0C +R 00 00 00 00 +T 14 02 +R 00 00 00 00 +T 14 02 DD 34 FF C3 85 01 +R 00 00 00 00 00 06 00 00 +T 1A 02 +R 00 00 00 00 +T 1A 02 0C C3 74 01 +R 00 00 00 00 00 04 00 00 +T 1E 02 +R 00 00 00 00 +T 1E 02 2E 01 +R 00 00 00 00 +T 20 02 +R 00 00 00 00 +T 20 02 DD F9 DD E1 C9 +R 00 00 00 00 +T 25 02 +R 00 00 00 00 +T 25 02 +R 00 00 00 00 +T 25 02 CD 00 00 7D E6 07 32 00 00 3A 00 00 D6 07 +R 00 00 00 00 02 03 01 00 00 09 02 00 00 0C 02 00 +T 33 02 28 F0 C9 +R 00 00 00 00 +T 36 02 +R 00 00 00 00 +T 36 02 DD E5 DD 21 00 00 DD 39 F5 F5 01 E6 00 11 +R 00 00 00 00 00 0D 01 00 +T 44 02 0E 00 AF DD 77 FF +R 00 00 00 00 00 02 01 00 +T 4A 02 +R 00 00 00 00 +T 4A 02 DD 7E FF D6 D8 30 20 79 DD 86 FF DD 77 FD +R 00 00 00 00 +T 58 02 78 CE 00 DD 77 FE DD 6E FF 26 00 19 7E DD +R 00 00 00 00 +T 66 02 6E FD DD 66 FE 77 DD 34 FF 18 D9 +R 00 00 00 00 +T 71 02 +R 00 00 00 00 +T 71 02 1E 00 +R 00 00 00 00 +T 73 02 +R 00 00 00 00 +T 73 02 7B D6 04 D2 1B 03 16 00 +R 00 00 00 00 00 06 00 00 +T 7B 02 +R 00 00 00 00 +T 7B 02 7A D6 04 D2 17 03 FD 21 00 00 FD 6E 00 26 +R 00 00 00 00 00 06 00 00 00 0A 02 00 +T 89 02 00 29 3E 00 00 85 6F 3E 00 00 8C 67 7E DD +R 00 00 00 00 09 05 01 00 89 0A 01 00 +T 95 02 77 FE 23 7E DD 77 FF C5 D5 3A 01 00 F5 33 +R 00 00 00 00 00 0C 02 00 +T A3 02 7B F5 33 D5 33 CD A2 00 F1 33 7D D1 C1 DD +R 00 00 00 00 00 08 00 00 +T B1 02 86 FE 6F 3E 00 DD 8E FF 67 7E D6 58 20 54 +R 00 00 00 00 +T BF 02 FD 21 03 00 FD 6E 00 26 00 DD 73 FE AF DD +R 00 00 00 00 00 04 02 00 +T CD 02 77 FF DD 7E FE 85 6F DD 7E FF 8C 67 D5 5D +R 00 00 00 00 +T DB 02 54 29 19 29 29 D1 E3 3A 02 00 26 00 DD 86 +R 00 00 00 00 00 0A 02 00 +T E9 02 FC DD 77 FE 7C DD 8E FD DD 77 FF 6A 26 00 +R 00 00 00 00 +T F7 02 7D DD 86 FE 6F 7C DD 8E FF 67 09 DD 75 FE +R 00 00 00 00 +T 05 03 DD 74 FF 3A 00 00 3C DD 6E FE DD 66 FF 77 +R 00 00 00 00 00 06 02 00 +T 13 03 +R 00 00 00 00 +T 13 03 14 C3 7B 02 +R 00 00 00 00 00 04 00 00 +T 17 03 +R 00 00 00 00 +T 17 03 1C C3 73 02 +R 00 00 00 00 00 04 00 00 +T 1B 03 +R 00 00 00 00 +T 1B 03 DD F9 DD E1 C9 +R 00 00 00 00 +T 20 03 +R 00 00 00 00 +T 20 03 DD E5 DD 21 00 00 DD 39 3B 21 B3 03 E5 CD +R 00 00 00 00 00 0C 00 00 +T 2E 03 00 00 F1 0E 00 +R 00 00 00 00 02 02 02 00 +T 33 03 +R 00 00 00 00 +T 33 03 79 D6 12 30 6C AF DD 77 FF +R 00 00 00 00 +T 3C 03 +R 00 00 00 00 +T 3C 03 DD 7E FF D6 0C 30 52 59 16 00 6B 62 29 19 +R 00 00 00 00 +T 4A 03 29 29 DD 5E FF 16 00 19 11 E6 00 19 5E 7B +R 00 00 00 00 00 0B 01 00 +T 58 03 D6 08 38 12 3E 1B D3 02 3E 5B D3 02 3E 30 +R 00 00 00 00 +T 66 03 D3 02 3E 6D D3 02 18 19 +R 00 00 00 00 +T 6E 03 +R 00 00 00 00 +T 6E 03 7B B7 28 15 3E 1B D3 02 3E 5B D3 02 3E 33 +R 00 00 00 00 +T 7C 03 D3 02 7B C6 30 D3 02 3E 6D D3 02 +R 00 00 00 00 +T 87 03 +R 00 00 00 00 +T 87 03 21 A8 03 16 00 19 7E D3 02 DD 34 FF 18 A7 +R 00 00 00 00 00 03 00 00 +T 95 03 +R 00 00 00 00 +T 95 03 3E 0A D3 02 3E 0D D3 02 3E 20 D3 02 0C 18 +R 00 00 00 00 +T A3 03 8F +R 00 00 00 00 +T A4 03 +R 00 00 00 00 +T A4 03 33 DD E1 C9 +R 00 00 00 00 +T A8 03 +R 00 00 00 00 +T A8 03 20 52 47 4F 42 4D 43 57 3D 23 00 +R 00 00 00 00 +T B3 03 +R 00 00 00 00 +T B3 03 1B 5B 32 3B 32 48 00 +R 00 00 00 00 +T BA 03 +R 00 00 00 00 +T BA 03 DD E5 DD 21 00 00 DD 39 F5 DB 1F 0F D2 +R 00 00 00 00 +T C7 03 6C 04 3A 02 00 DD 77 FE 21 03 00 4E 3A +R 00 00 00 00 00 02 00 00 00 05 02 00 00 0B 02 00 +T D4 03 01 00 DD 77 FF DB 1E FE 03 28 16 FE 61 28 +R 00 00 00 00 00 02 02 00 +T E2 03 1F FE 64 28 20 FE 72 28 21 FE 73 28 2D D6 +R 00 00 00 00 +T F0 03 77 28 30 18 4D +R 00 00 00 00 +T F5 03 +R 00 00 00 00 +T F5 03 21 2A 05 E5 CD 00 00 F1 2E 00 C3 25 05 +R 00 00 00 00 00 03 00 00 02 07 02 00 00 0D 00 00 +T 02 04 +R 00 00 00 00 +T 02 04 DD 35 FE 18 3B +R 00 00 00 00 +T 07 04 +R 00 00 00 00 +T 07 04 DD 34 FE 18 36 +R 00 00 00 00 +T 0C 04 +R 00 00 00 00 +T 0C 04 DD 34 FF DD 7E FF D6 04 20 2C AF DD 77 FF +R 00 00 00 00 +T 1A 04 18 26 +R 00 00 00 00 +T 1C 04 +R 00 00 00 00 +T 1C 04 21 04 00 36 00 18 1F +R 00 00 00 00 00 03 02 00 +T 23 04 +R 00 00 00 00 +T 23 04 +R 00 00 00 00 +T 23 04 0C 79 3C C5 F5 33 3A 02 00 F5 33 3A 01 00 +R 00 00 00 00 00 09 02 00 00 0E 02 00 +T 31 04 F5 33 3A 00 00 F5 33 CD 68 01 F1 F1 7D C1 +R 00 00 00 00 00 05 02 00 00 0A 00 00 +T 3F 04 B7 20 E1 +R 00 00 00 00 +T 42 04 +R 00 00 00 00 +T 42 04 C5 79 F5 33 DD 66 FE DD 6E FF E5 3A 00 00 +R 00 00 00 00 00 0E 02 00 +T 50 04 F5 33 CD 68 01 F1 F1 7D C1 B7 28 10 DD 7E +R 00 00 00 00 00 05 00 00 +T 5E 04 FE 32 02 00 21 03 00 71 DD 7E FF 32 01 00 +R 00 00 00 00 00 04 02 00 00 07 02 00 00 0E 02 00 +T 6C 04 +R 00 00 00 00 +T 6C 04 3A 04 00 B7 C2 19 05 3A 03 00 3C F5 33 3A +R 00 00 00 00 00 03 02 00 00 07 00 00 00 0A 02 00 +T 7A 04 02 00 F5 33 3A 01 00 F5 33 3A 00 00 F5 33 +R 00 00 00 00 00 02 02 00 00 07 02 00 00 0C 02 00 +T 88 04 CD 68 01 F1 F1 7D B7 28 07 21 03 00 34 C3 +R 00 00 00 00 00 03 00 00 00 0C 02 00 +T 96 04 14 05 +R 00 00 00 00 00 02 00 00 +T 98 04 +R 00 00 00 00 +T 98 04 0E 00 +R 00 00 00 00 +T 9A 04 +R 00 00 00 00 +T 9A 04 79 D6 04 30 63 06 00 +R 00 00 00 00 +T A1 04 +R 00 00 00 00 +T A1 04 78 D6 04 30 59 FD 21 00 00 FD 6E 00 26 00 +R 00 00 00 00 00 09 02 00 +T AF 04 29 11 00 00 19 5E 23 56 C5 D5 3A 01 00 F5 +R 00 00 00 00 00 04 01 00 00 0D 02 00 +T BD 04 33 79 F5 33 C5 33 CD A2 00 F1 33 D1 C1 26 +R 00 00 00 00 00 09 00 00 +T CB 04 00 19 7E D6 58 20 2A 21 03 00 5E 16 00 69 +R 00 00 00 00 00 0A 02 00 +T D9 04 26 00 19 5D 54 29 19 29 29 EB FD 21 02 00 +R 00 00 00 00 00 0E 02 00 +T E7 04 FD 6E 00 26 00 19 58 16 00 19 EB 21 0E 00 +R 00 00 00 00 00 0E 01 00 +T F5 04 19 EB 3A 00 00 3C 12 +R 00 00 00 00 00 05 02 00 +T FC 04 +R 00 00 00 00 +T FC 04 04 18 A2 +R 00 00 00 00 +T FF 04 +R 00 00 00 00 +T FF 04 0C 18 98 +R 00 00 00 00 +T 02 05 +R 00 00 00 00 +T 02 05 CD 25 02 21 03 00 36 00 21 02 00 36 06 21 +R 00 00 00 00 00 03 00 00 00 06 02 00 00 0B 02 00 +T 10 05 01 00 36 00 +R 00 00 00 00 00 02 02 00 +T 14 05 +R 00 00 00 00 +T 14 05 21 04 00 36 02 +R 00 00 00 00 00 03 02 00 +T 19 05 +R 00 00 00 00 +T 19 05 21 04 00 35 CD 36 02 CD 20 03 2E 01 +R 00 00 00 00 00 03 02 00 00 07 00 00 00 0A 00 00 +T 25 05 +R 00 00 00 00 +T 25 05 DD F9 DD E1 C9 +R 00 00 00 00 +T 2A 05 +R 00 00 00 00 +T 2A 05 45 78 69 74 21 0A 0D 00 +R 00 00 00 00 +T 32 05 +R 00 00 00 00 +T 32 05 CD 00 00 CD FD 00 CD 25 02 21 +R 00 00 00 00 00 03 00 00 00 06 00 00 00 09 00 00 +T 3C 05 4B 05 E5 CD 00 00 F1 +R 00 00 00 00 00 02 00 00 02 06 02 00 +T 43 05 +R 00 00 00 00 +T 43 05 CD BA 03 7D B7 20 F9 C9 +R 00 00 00 00 00 03 00 00 +T 4B 05 +R 00 00 00 00 +T 4B 05 1B 5B 32 4A 00 +R 00 00 00 00 +T 00 00 +R 00 00 07 00 +T 00 00 00 +R 00 00 07 00 +T 01 00 +R 00 00 07 00 +T 01 00 00 +R 00 00 07 00 +T 02 00 +R 00 00 07 00 +T 02 00 06 +R 00 00 07 00 +T 03 00 +R 00 00 07 00 +T 03 00 00 +R 00 00 07 00 +T 04 00 +R 00 00 07 00 +T 04 00 02 +R 00 00 07 00 diff --git a/.build/main.sym b/.build/main.sym new file mode 100644 index 0000000..9d96cb5 --- /dev/null +++ b/.build/main.sym @@ -0,0 +1,65 @@ + ASxxxx Assembler V02.00 + NoICE + SDCC mods (Zilog Z80 / Hitachi HD64180 / ZX-Next / eZ80), page 1. +Hexadecimal [16-Bits] + +Symbol Table + + .__.$$$. = 2710 L + .__.ABS. = 0000 G + .__.CPU. = 0000 L + .__.H$L. = 0000 L + 0 ___str_0 002B R + 0 ___str_1 003C R + 0 ___str_10 054B R + 0 ___str_2 004D R + 0 ___str_3 005E R + 0 ___str_4 006F R + 0 ___str_5 0080 R + 0 ___str_6 0091 R + 0 ___str_7 03A8 R + 0 ___str_8 03B3 R + 0 ___str_9 052A R + 7 __xinit__counter 0004 R + 7 __xinit__current_rotation 0001 R + 7 __xinit__current_shape 0000 R + 7 __xinit__current_x 0002 R + 7 __xinit__current_y 0003 R + 0 _construct_shapes 0000 GR + 2 _counter 0004 GR + _cout = 0002 + 2 _current_rotation 0001 GR + 2 _current_shape 0000 GR + 2 _current_x 0002 GR + 2 _current_y 0003 GR + 0 _does_piece_fit 0168 GR + 0 _draw 0320 GR + 1 _field 000E GR + 0 _initialize_field 00FD GR + _key = 001E + 0 _loop 03BA GR + 0 _main 0532 GR + 0 _new_shape 0225 GR + _put_string **** GX + _random **** GX + 0 _render 0236 GR + 0 _rotate 00A2 GR + 1 _screen 00E6 GR + 1 _seed 01BE GR + _status = 001F + 1 _tetromino 0000 GR + + + ASxxxx Assembler V02.00 + NoICE + SDCC mods (Zilog Z80 / Hitachi HD64180 / ZX-Next / eZ80), page 2. +Hexadecimal [16-Bits] + +Area Table + + 0 _CODE size 550 flags 0 + 1 _DATA size 1BF flags 0 + 2 _INITIALIZED size 5 flags 0 + 3 _DABS size 0 flags 8 + 4 _HOME size 0 flags 0 + 5 _GSINIT size 0 flags 0 + 6 _GSFINAL size 0 flags 0 + 7 _INITIALIZER size 5 flags 0 + 8 _CABS size 0 flags 8 + diff --git a/.build/tetris.com b/.build/tetris.com new file mode 100644 index 0000000000000000000000000000000000000000..efa60a26a2beb15a6c18d5f2077a08c5f86bde13 GIT binary patch literal 1462 zcmZ`(Z)h837=Q0Bd2?;E)kGUFwyt?o3D>D1CSBRm?)=9(5mvEG*D=iS-|GI@FxNCm z(}c=s`=w4qlzk|IewZJpUm6`M%hD7>y+T_Wl<^2tDoB}FB_9gCJD@&`LgR<+K_dCjNa^4>( zTjsnsDf^A{-l9dnf6#yLA{Ai}m8KpaQZ=YsnTooLX|-#CUporZq9W8SOuI_ZngZ5= z5dw#LAY+Ao%k*>xv@H>FBVGKEF0PqwlKA_-V*8isW^W5nB}8+Pd$Y~7oxjHybN zm8bw2+xrmT#$;H(fvWRD0s5>36mVYua+{$X#5BlkpPs&qUG~ul=rblTHAJY3z_8&X z?!|G>fWtn~`SfDj;-hy50!JWXa}g}sJUQra?w&jj!xkUubj(qAq~lc>*3c$X8uTD) z`ojEag)Gq%k7Q+wpGbD-GV&$fo-gozu2Q`E443}H7L1AEm{_vOfA0cU=4Ne?=LuU2IHI}G)!zI01gg%Ml3a0PI^yUI&$PhRZ^bsTLxiIr zLBl3*@6!d@rN1t>>u<>({XLoKm*gi)aXBCzV<}qc#ZU616b|T84|M5LH|DM|(es4a zo#bOlv71Qk_GB;qK`=gU<~$H8B= 0 && px + x < WIDTH) { + if (py + y >= 0 && py + y < HEIGHT) { + // Check for collision + if (tetromino[shape][pi] == 'X' && field[fi] != 0) { + return 0; + } + } + } + } + } + + return 1; +} + +uint8_t current_shape = 0; +uint8_t current_rotation = 0; +uint8_t current_x = WIDTH/2; +uint8_t current_y = 0; + +void new_shape() { + do { + current_shape = random() & 0x07; + } while (current_shape == 7); +} + +void render() { + // Copy current state of the field + for (uint8_t i = 0; i < WIDTH*HEIGHT; ++i) { + screen[i] = field[i]; + } + + // Copy current piece to the screen + for (uint8_t y = 0; y < 4; ++y) { + for (uint8_t x = 0; x < 4; ++x) { + if (tetromino[current_shape][rotate(x, y, current_rotation)] == 'X') { + screen[(current_y+y)*WIDTH + current_x + x] = current_shape + 1; + } + } + } +} + +__sfr __at (0x02) cout; +void draw() { + // Draw the screen + put_string("\033[2;2H"); + for (uint8_t y = 0; y < HEIGHT*SCALE; ++y) { + for (uint8_t x = 0; x < WIDTH*SCALE; ++x) { + uint8_t i = screen[y/SCALE*WIDTH + x/SCALE]; + if (i >= 8) { + cout = '\033'; + cout = '['; + cout = '0'; + cout = 'm'; + } else if (i > 0) { + cout = '\033'; + cout = '['; + cout = '3'; + cout = 48+i; + cout = 'm'; + } + char c = " RGOBMCW=#"[i]; + cout = c; + } + cout = '\n'; + cout = '\r'; + cout = ' '; + } +} + +#define SPEED 2 +uint8_t counter = SPEED; + +__sfr __at (0x1F) status; +__sfr __at (0x1E) key; +uint8_t loop() { + // Check if a key has been pressed + if (status & 1) { + uint8_t nx = current_x; + uint8_t ny = current_y; + uint8_t nr = current_rotation; + // End program on ctrl-c + switch (key) { + case 0x03: + put_string("Exit!\n\r"); + return 0; + + // Move to the left + case 'a': + nx--; + break; + + // Move to the right + case 'd': + nx++; + break; + + // Rotate + case 'r': + nr++; + if (nr == 4) { + nr = 0; + } + break; + + // Move down faster + case 's': + counter = 0; + break; + + // Drop the piece + case 'w': + while (does_piece_fit(current_shape, current_rotation, current_x, ++ny + 1)); + break; + } + + if (does_piece_fit(current_shape, nr, nx, ny)) { + current_x = nx; + current_y = ny; + current_rotation = nr; + } + + } + + if (counter == 0) { + if (does_piece_fit(current_shape, current_rotation, current_x, current_y+1)) { + current_y++; + } else { + // Copy piece to field + for (uint8_t y = 0; y < 4; ++y) { + for (uint8_t x = 0; x < 4; ++x) { + if (tetromino[current_shape][rotate(x, y, current_rotation)] == 'X') { + field[(current_y+y)*WIDTH + current_x + x] = current_shape + 1; + } + } + } + + new_shape(); + current_y = 0; + current_x = WIDTH/2; + current_rotation = 0; + } + counter = SPEED; + } + + counter--; + + render(); + draw(); + + return 1; +} + +uint8_t seed; + +void main() { + construct_shapes(); + initialize_field(); + + // Set initial shape + new_shape(); + + // Clear the screen + put_string("\033[2J"); + + // @todo We need to be able to turn the cursor on/off + + while (loop()); +}