tetris/.build/main.asm
2021-01-08 04:13:16 +01:00

1009 lines
18 KiB
NASM

;--------------------------------------------------------
; 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)