romdevtools 0.71.1 → 0.84.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +19 -16
- package/CHANGELOG.md +184 -0
- package/README.md +5 -5
- package/examples/README.md +1 -0
- package/examples/gametank/templates/gt_draw.h +91 -0
- package/examples/gametank/templates/gt_hud.h +89 -0
- package/examples/gametank/templates/gt_palette.h +59 -0
- package/examples/gametank/templates/gt_sound.h +90 -0
- package/examples/gametank/templates/gt_sprites.h +53 -0
- package/examples/gametank/templates/platformer.c +318 -0
- package/examples/gametank/templates/puzzle.c +295 -0
- package/examples/gametank/templates/racing.c +139 -0
- package/examples/gametank/templates/shmup.c +277 -0
- package/examples/gametank/templates/sports.c +119 -0
- package/package.json +24 -22
- package/src/cores/capabilities.js +24 -0
- package/src/cores/registry.js +7 -1
- package/src/host/LibretroHost.js +90 -17
- package/src/host/callbacks.js +20 -2
- package/src/host/cpu-state.js +17 -0
- package/src/host/gametank-acp-state.js +53 -0
- package/src/http/skill-doc.js +10 -6
- package/src/mcp/tools/audio.js +1 -1
- package/src/mcp/tools/cart-parts.js +76 -0
- package/src/mcp/tools/lifecycle.js +1 -1
- package/src/mcp/tools/platform-tools.js +9 -1
- package/src/platforms/gametank/lib/gt/audio/acp_image.bin +0 -0
- package/src/platforms/gametank/lib/gt/audio/audio_coprocessor.c +55 -0
- package/src/platforms/gametank/lib/gt/audio/audio_coprocessor.h +34 -0
- package/src/platforms/gametank/lib/gt/audio/audio_fw.asm +223 -0
- package/src/platforms/gametank/lib/gt/audio/audio_fw_blob.s +8 -0
- package/src/platforms/gametank/lib/gt/audio/instruments.c +79 -0
- package/src/platforms/gametank/lib/gt/audio/instruments.h +25 -0
- package/src/platforms/gametank/lib/gt/audio/music.c +370 -0
- package/src/platforms/gametank/lib/gt/audio/music.h +35 -0
- package/src/platforms/gametank/lib/gt/audio/note_numbers.h +132 -0
- package/src/platforms/gametank/lib/gt/audio/scaled_sines.raw +0 -0
- package/src/platforms/gametank/lib/gt/audio/sine_256_-63_63.bin +0 -0
- package/src/platforms/gametank/lib/gt/banking.c +29 -0
- package/src/platforms/gametank/lib/gt/banking.h +8 -0
- package/src/platforms/gametank/lib/gt/banking2.s +41 -0
- package/src/platforms/gametank/lib/gt/crt0.s +102 -0
- package/src/platforms/gametank/lib/gt/draw_logo.s +55 -0
- package/src/platforms/gametank/lib/gt/feature/persist/persist.c +103 -0
- package/src/platforms/gametank/lib/gt/feature/persist/persist.h +13 -0
- package/src/platforms/gametank/lib/gt/feature/random/random.c +40 -0
- package/src/platforms/gametank/lib/gt/feature/random/random.h +18 -0
- package/src/platforms/gametank/lib/gt/feature/text/text.c +111 -0
- package/src/platforms/gametank/lib/gt/feature/text/text.h +25 -0
- package/src/platforms/gametank/lib/gt/gametank.c +12 -0
- package/src/platforms/gametank/lib/gt/gametank.h +80 -0
- package/src/platforms/gametank/lib/gt/gametank_logo.inc +393 -0
- package/src/platforms/gametank/lib/gt/gen/assets/assets_index.h +9 -0
- package/src/platforms/gametank/lib/gt/gen/assets/sdk_default.h +5 -0
- package/src/platforms/gametank/lib/gt/gen/bank_nums.h +11 -0
- package/src/platforms/gametank/lib/gt/gen/modules_enabled.h +4 -0
- package/src/platforms/gametank/lib/gt/gen/modules_enabled.inc +4 -0
- package/src/platforms/gametank/lib/gt/gfx/draw_direct.c +132 -0
- package/src/platforms/gametank/lib/gt/gfx/draw_direct.h +75 -0
- package/src/platforms/gametank/lib/gt/gfx/draw_queue.c +177 -0
- package/src/platforms/gametank/lib/gt/gfx/draw_queue.h +35 -0
- package/src/platforms/gametank/lib/gt/gfx/draw_util.s +157 -0
- package/src/platforms/gametank/lib/gt/gfx/gfx_sys.c +43 -0
- package/src/platforms/gametank/lib/gt/gfx/gfx_sys.h +46 -0
- package/src/platforms/gametank/lib/gt/gfx/sprites.c +216 -0
- package/src/platforms/gametank/lib/gt/gfx/sprites.h +41 -0
- package/src/platforms/gametank/lib/gt/init.c +9 -0
- package/src/platforms/gametank/lib/gt/input.c +26 -0
- package/src/platforms/gametank/lib/gt/input.h +20 -0
- package/src/platforms/gametank/lib/gt/interrupt.s +67 -0
- package/src/platforms/gametank/lib/gt/vectors.s +14 -0
- package/src/platforms/gametank/lib/gt/wait.s +53 -0
- package/src/playtest/playtest.js +174 -26
- package/src/toolchains/arm-none-eabi-gcc/gcc.js +39 -188
- package/src/toolchains/asar/asar.js +10 -15
- package/src/toolchains/cc65/cc65.js +82 -92
- package/src/toolchains/cc65/da65.js +12 -17
- package/src/toolchains/cc65/preset-resolver.js +13 -2
- package/src/toolchains/cc65/presets/gametank/gametank.h +80 -0
- package/src/toolchains/cc65/presets/gametank/sdk.cfg +32 -0
- package/src/toolchains/cc65/presets/gametank/sdk.crt0.s +61 -0
- package/src/toolchains/cc65/presets/gametank/sdk.vectors.s +11 -0
- package/src/toolchains/cc65/presets/gametank/single-bank.cfg +28 -0
- package/src/toolchains/cc65/presets/gametank/single-bank.crt0.s +71 -0
- package/src/toolchains/cc65/presets/gametank/single-bank.vectors.s +12 -0
- package/src/toolchains/common/c-build.js +109 -0
- package/src/toolchains/common/gcc-toolchain.js +164 -0
- package/src/toolchains/common/wasm-tool.js +101 -0
- package/src/toolchains/dasm/dasm.js +12 -18
- package/src/toolchains/gba-c/gba-c.js +253 -305
- package/src/toolchains/genesis-c/genesis-c.js +196 -225
- package/src/toolchains/index.js +58 -4
- package/src/toolchains/m68k-elf-gcc/gcc.js +39 -202
- package/src/toolchains/mips-c/mips-c.js +68 -78
- package/src/toolchains/mips-elf-gcc/gcc.js +55 -118
- package/src/toolchains/rgbds/rgbds.js +7 -19
- package/src/toolchains/sdcc/sdcc.js +35 -26
- package/src/toolchains/sh-c/sh-c.js +44 -52
- package/src/toolchains/sh-elf-gcc/gcc.js +55 -110
- package/src/toolchains/sjasm/sjasm.js +10 -14
- package/src/toolchains/snes-c/snes-c.js +125 -150
- package/src/toolchains/tcc816/tcc816.js +10 -15
- package/src/toolchains/vasm68k/vasm68k.js +11 -16
- package/src/toolchains/wladx/wladx.js +5 -17
- package/src/toolchains/z80/binutils.js +5 -11
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#ifndef DRAW_DIRECT_H
|
|
2
|
+
#define DRAW_DIRECT_H
|
|
3
|
+
#include "gametank.h"
|
|
4
|
+
#include "gfx_sys.h"
|
|
5
|
+
#include "sprites.h"
|
|
6
|
+
|
|
7
|
+
typedef char clip_mode_t;
|
|
8
|
+
|
|
9
|
+
extern char direct_sprite_offset_x;
|
|
10
|
+
extern char direct_sprite_offset_y;
|
|
11
|
+
|
|
12
|
+
//Setup registers to draw sprites in direct mode
|
|
13
|
+
//Also checks for and awaits queued drawing operations
|
|
14
|
+
void direct_prepare_sprite_mode(SpriteSlot sprite);
|
|
15
|
+
|
|
16
|
+
//Both this and direct_prepare_sprite_mode select the sprite slot to use
|
|
17
|
+
//but this skips other register settings and ONLY selects the sprite slot
|
|
18
|
+
void direct_quick_select_sprite(SpriteSlot sprite);
|
|
19
|
+
|
|
20
|
+
//Setup registers to draw colored boxes in direct mode
|
|
21
|
+
//Also checks for and awaits queued drawing operations
|
|
22
|
+
void direct_prepare_box_mode();
|
|
23
|
+
|
|
24
|
+
//Setup registers to access the framebuffer as an array
|
|
25
|
+
void direct_prepare_array_mode();
|
|
26
|
+
|
|
27
|
+
//Setup registers to access Sprite RAM as an array
|
|
28
|
+
void direct_prepare_sprite_ram_array_mode(SpriteSlot sprite);
|
|
29
|
+
|
|
30
|
+
//If enabled, sprite draws will repeat the same 16x16 grid from the source data
|
|
31
|
+
void direct_tiled_mode(bool enabled);
|
|
32
|
+
|
|
33
|
+
//If enabled, sprite draws will treat color 0 as transparent instead of black
|
|
34
|
+
void direct_transparent_mode(bool enabled);
|
|
35
|
+
|
|
36
|
+
//Set whether drawings will be clipped at screen edges or wrap around
|
|
37
|
+
void direct_clip_mode(clip_mode_t mode);
|
|
38
|
+
|
|
39
|
+
void direct_draw_sprite_frame(SpriteSlot sprite, char x, char y, char frame, char flip);
|
|
40
|
+
|
|
41
|
+
#define DIRECT_DRAW_START() draw_busy = 1; \
|
|
42
|
+
vram[START] = 1;
|
|
43
|
+
|
|
44
|
+
#define DIRECT_DRAW_CLEAR_IRQ() vram[START] = 0;
|
|
45
|
+
|
|
46
|
+
#define DIRECT_SET_DEST_X(x) vram[VX] = (x);
|
|
47
|
+
#define DIRECT_SET_DEST_Y(y) vram[VY] = (y);
|
|
48
|
+
#define DIRECT_SET_SOURCE_X(x) vram[GX] = (x) | direct_sprite_offset_x
|
|
49
|
+
#define DIRECT_SET_SOURCE_Y(y) vram[GY] = (y) | direct_sprite_offset_y
|
|
50
|
+
#define DIRECT_SET_WIDTH(w) vram[WIDTH] = (w);
|
|
51
|
+
#define DIRECT_SET_HEIGHT(h) vram[HEIGHT] = (h);
|
|
52
|
+
#define DIRECT_SET_COLOR(c) vram[COLOR] = ~(c);
|
|
53
|
+
|
|
54
|
+
//If you do consecutive draws that will cause redundant register sets
|
|
55
|
+
// then you can skip the macro and just set the registers directly.
|
|
56
|
+
// eg. for tilemaps you'd only need to set WIDTH, HEIGHT once and
|
|
57
|
+
// set VY once per row
|
|
58
|
+
#define DIRECT_DRAW_SPRITE(dst_x, dst_y, w, h, src_gx, src_gy) \
|
|
59
|
+
vram[VX] = dst_x; \
|
|
60
|
+
vram[VY] = dst_y; \
|
|
61
|
+
vram[GX] = src_gx + direct_sprite_offset_x; \
|
|
62
|
+
vram[GY] = src_gy + direct_sprite_offset_y; \
|
|
63
|
+
vram[WIDTH] = w; \
|
|
64
|
+
vram[HEIGHT] = h; \
|
|
65
|
+
DIRECT_DRAW_START();
|
|
66
|
+
|
|
67
|
+
#define DIRECT_DRAW_COLOR(dst_x, dst_y, w, h, c) \
|
|
68
|
+
vram[VX] = dst_x; \
|
|
69
|
+
vram[VY] = dst_y; \
|
|
70
|
+
vram[WIDTH] = w; \
|
|
71
|
+
vram[HEIGHT] = h; \
|
|
72
|
+
vram[COLOR] = ~(c); \
|
|
73
|
+
DIRECT_DRAW_START();
|
|
74
|
+
|
|
75
|
+
#endif
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
#define MODULE_DRAWQUEUE_INTERNAL_USE
|
|
2
|
+
#include "draw_queue.h"
|
|
3
|
+
#include "gametank.h"
|
|
4
|
+
#include "modules_enabled.h"
|
|
5
|
+
|
|
6
|
+
#ifdef ENABLE_MODULE_DRAWQUEUE
|
|
7
|
+
|
|
8
|
+
void pushRect();
|
|
9
|
+
|
|
10
|
+
unsigned char queue_start = 0;
|
|
11
|
+
unsigned char queue_end = 0;
|
|
12
|
+
unsigned char queue_count = 0;
|
|
13
|
+
unsigned char queue_pending = 0;
|
|
14
|
+
|
|
15
|
+
void queue_draw_sprite_rect() {
|
|
16
|
+
if(queue_count >= QUEUE_MAX) {
|
|
17
|
+
asm("CLI");
|
|
18
|
+
await_drawing();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
asm("SEI");
|
|
22
|
+
if(rect.b & SPRITE_OFFSET_X_MASK) { rect.gx |= 128; }
|
|
23
|
+
if(rect.b & SPRITE_OFFSET_Y_MASK) { rect.gy |= 128; }
|
|
24
|
+
rect.b = (rect.b & BANK_GRAM_MASK) | bankflip | CLIP_MODE_XY;
|
|
25
|
+
queue_flags_param = DMA_GCARRY;
|
|
26
|
+
pushRect();
|
|
27
|
+
|
|
28
|
+
if(queue_pending == 0) {
|
|
29
|
+
next_draw_queue();
|
|
30
|
+
}
|
|
31
|
+
asm("CLI");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
void queue_draw_box(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char c) {
|
|
35
|
+
if(x > 127) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if(y > 127) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if(w == 0) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if(h == 0) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
while(queue_count >= QUEUE_MAX) {
|
|
48
|
+
asm("CLI");
|
|
49
|
+
await_drawing();
|
|
50
|
+
}
|
|
51
|
+
if(x + w >= 128) {
|
|
52
|
+
w = 128 - x;
|
|
53
|
+
}
|
|
54
|
+
if(y + h >= 128) {
|
|
55
|
+
h = 128 - y;
|
|
56
|
+
}
|
|
57
|
+
asm("SEI");
|
|
58
|
+
|
|
59
|
+
rect.x = x;
|
|
60
|
+
rect.y = y;
|
|
61
|
+
rect.w = w;
|
|
62
|
+
rect.h = h;
|
|
63
|
+
rect.gx = 0;
|
|
64
|
+
rect.gy = 0;
|
|
65
|
+
rect.b = bankflip;
|
|
66
|
+
rect.c = ~c;
|
|
67
|
+
queue_flags_param = DMA_COLORFILL_ENABLE | DMA_OPAQUE;
|
|
68
|
+
pushRect();
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
if(queue_pending == 0) {
|
|
72
|
+
next_draw_queue();
|
|
73
|
+
}
|
|
74
|
+
asm("CLI");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
void queue_clear_border(char c) {
|
|
78
|
+
queue_draw_box(
|
|
79
|
+
0,
|
|
80
|
+
0,
|
|
81
|
+
SCREEN_WIDTH-BORDER_RIGHT_WIDTH,
|
|
82
|
+
BORDER_TOP_HEIGHT,
|
|
83
|
+
c
|
|
84
|
+
);
|
|
85
|
+
queue_draw_box(
|
|
86
|
+
0,
|
|
87
|
+
BORDER_TOP_HEIGHT,
|
|
88
|
+
BORDER_LEFT_WIDTH,
|
|
89
|
+
SCREEN_HEIGHT-BORDER_TOP_HEIGHT,
|
|
90
|
+
c
|
|
91
|
+
);
|
|
92
|
+
queue_draw_box(
|
|
93
|
+
BORDER_LEFT_WIDTH,
|
|
94
|
+
SCREEN_HEIGHT-BORDER_BOTTOM_HEIGHT,
|
|
95
|
+
SCREEN_WIDTH-BORDER_LEFT_WIDTH,
|
|
96
|
+
BORDER_BOTTOM_HEIGHT,
|
|
97
|
+
c
|
|
98
|
+
);
|
|
99
|
+
queue_draw_box(
|
|
100
|
+
SCREEN_WIDTH-BORDER_RIGHT_WIDTH,
|
|
101
|
+
0,
|
|
102
|
+
BORDER_RIGHT_WIDTH,
|
|
103
|
+
SCREEN_HEIGHT-BORDER_BOTTOM_HEIGHT,
|
|
104
|
+
c
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
void queue_draw_sprite_frame(SpriteSlot sprite, char x, char y, char frame, char flip) {
|
|
109
|
+
while(queue_count >= QUEUE_MAX) {
|
|
110
|
+
asm("CLI");
|
|
111
|
+
await_drawing();
|
|
112
|
+
}
|
|
113
|
+
asm("SEI");
|
|
114
|
+
queue_flags_param = DMA_GCARRY;
|
|
115
|
+
sprite_fetch_frame(sprite, frame);
|
|
116
|
+
rect.b = (sprite & BANK_GRAM_MASK) | bankflip | CLIP_MODE_XY;
|
|
117
|
+
|
|
118
|
+
if(flip & SPRITE_FLIP_X) {
|
|
119
|
+
rect.x = (x - sprite_temp_frame.w - sprite_temp_frame.x - 1);
|
|
120
|
+
} else {
|
|
121
|
+
rect.x = (sprite_temp_frame.x + x);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if(flip & SPRITE_FLIP_Y) {
|
|
125
|
+
rect.y = (y - sprite_temp_frame.h - sprite_temp_frame.y - 1);
|
|
126
|
+
} else {
|
|
127
|
+
rect.y = (sprite_temp_frame.y + y);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
rect.gx = sprite_temp_frame.gx;
|
|
131
|
+
if(sprite & SPRITE_OFFSET_X_MASK) { rect.gx |= 128; }
|
|
132
|
+
if(flip & SPRITE_FLIP_X) {
|
|
133
|
+
rect.gx ^= 0xFF;
|
|
134
|
+
rect.gx -= sprite_temp_frame.w - 1;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
rect.gy = sprite_temp_frame.gy;
|
|
138
|
+
if(sprite & SPRITE_OFFSET_Y_MASK) { rect.gy |= 128; }
|
|
139
|
+
if(flip & SPRITE_FLIP_Y) {
|
|
140
|
+
rect.gy ^= 0xFF;
|
|
141
|
+
rect.gy -= sprite_temp_frame.h - 1;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
rect.w = sprite_temp_frame.w | (flip & SPRITE_FLIP_X ? 128 : 0);
|
|
145
|
+
rect.h = sprite_temp_frame.h | (flip & SPRITE_FLIP_Y ? 128 : 0);
|
|
146
|
+
|
|
147
|
+
pushRect();
|
|
148
|
+
|
|
149
|
+
if(queue_pending == 0) {
|
|
150
|
+
next_draw_queue();
|
|
151
|
+
}
|
|
152
|
+
asm("CLI");
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
void queue_clear_screen(char c) {
|
|
156
|
+
queue_draw_box(1, 7, SCREEN_WIDTH-2, SCREEN_HEIGHT - 15, c);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
#endif
|
|
160
|
+
|
|
161
|
+
void await_draw_queue() {
|
|
162
|
+
//If draw queue isn't installed leave the stub in case something waits for it
|
|
163
|
+
#ifdef ENABLE_MODULE_DRAWQUEUE
|
|
164
|
+
asm ("SEI");
|
|
165
|
+
if(queue_pending != 0) {
|
|
166
|
+
await_drawing();
|
|
167
|
+
}
|
|
168
|
+
while(queue_end != queue_start) {
|
|
169
|
+
next_draw_queue();
|
|
170
|
+
asm ("CLI");
|
|
171
|
+
await_drawing();
|
|
172
|
+
}
|
|
173
|
+
vram[START] = 0;
|
|
174
|
+
queue_pending = 0;
|
|
175
|
+
asm ("CLI");
|
|
176
|
+
#endif
|
|
177
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#ifndef DRAW_QUEUE_H
|
|
2
|
+
#define DRAW_QUEUE_H
|
|
3
|
+
#include "gfx_sys.h"
|
|
4
|
+
#include "sprites.h"
|
|
5
|
+
#include "modules_enabled.h"
|
|
6
|
+
|
|
7
|
+
#ifdef ENABLE_MODULE_DRAWQUEUE
|
|
8
|
+
|
|
9
|
+
#define QUEUE_MAX 250
|
|
10
|
+
|
|
11
|
+
extern unsigned char queue_start, queue_end, queue_pending, queue_count;
|
|
12
|
+
extern unsigned char queue_flags_param; //defined in draw_util.s
|
|
13
|
+
|
|
14
|
+
void queue_draw_box(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char c);
|
|
15
|
+
void queue_draw_sprite_rect();
|
|
16
|
+
|
|
17
|
+
#define queue_draw_sprite(X,Y,W,H,GX,GY,SPRITESLOT) rect.x=X;rect.y=Y;rect.w=W;rect.h=H;rect.gx=GX;rect.gy=GY;rect.b=SPRITESLOT;queue_draw_sprite_rect();
|
|
18
|
+
void queue_draw_sprite_frame(SpriteSlot sprite, char x, char y, char frame, char flip);
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
void queue_clear_border(char c);
|
|
22
|
+
void queue_clear_screen(char c);
|
|
23
|
+
|
|
24
|
+
//defined in draw_util.s
|
|
25
|
+
void next_draw_queue();
|
|
26
|
+
|
|
27
|
+
#else
|
|
28
|
+
|
|
29
|
+
#ifndef MODULE_DRAWQUEUE_INTERNAL_USE
|
|
30
|
+
#error "Module DRAWQUEUE included but not enabled!"
|
|
31
|
+
#endif
|
|
32
|
+
#endif
|
|
33
|
+
|
|
34
|
+
void await_draw_queue();
|
|
35
|
+
#endif
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
.export _rect
|
|
2
|
+
.importzp sp, ptr1
|
|
3
|
+
|
|
4
|
+
.import incsp2, pushax
|
|
5
|
+
.import _flagsMirror, _frameflip, _draw_busy
|
|
6
|
+
.import _banksMirror
|
|
7
|
+
|
|
8
|
+
.include "modules_enabled.inc"
|
|
9
|
+
|
|
10
|
+
.ifdef ENABLE_MODULE_DRAWQUEUE
|
|
11
|
+
.export _pushRect, _queue_flags_param, _next_draw_queue
|
|
12
|
+
.import _queue_start,_queue_end, _queue_count, _queue_pending
|
|
13
|
+
.endif
|
|
14
|
+
|
|
15
|
+
BankReg = $2005
|
|
16
|
+
DMAFlags = $2007
|
|
17
|
+
|
|
18
|
+
Q_DMAFlags = $0200
|
|
19
|
+
Q_VX = $0300
|
|
20
|
+
Q_VY = $0400
|
|
21
|
+
Q_GX = $0500
|
|
22
|
+
Q_GY = $0600
|
|
23
|
+
Q_WIDTH = $0700
|
|
24
|
+
Q_HEIGHT = $0800
|
|
25
|
+
Q_Color = $0900
|
|
26
|
+
Q_BankReg = $0A00
|
|
27
|
+
|
|
28
|
+
DMA_VX = $4000
|
|
29
|
+
DMA_VY = $4001
|
|
30
|
+
DMA_GX = $4002
|
|
31
|
+
DMA_GY = $4003
|
|
32
|
+
DMA_WIDTH = $4004
|
|
33
|
+
DMA_HEIGHT = $4005
|
|
34
|
+
DMA_Start = $4006
|
|
35
|
+
DMA_Color = $4007
|
|
36
|
+
|
|
37
|
+
_queue_flags_param = $3200
|
|
38
|
+
_rect = $3201 ;borrow unbanked Audio RAM memory
|
|
39
|
+
|
|
40
|
+
.ifdef ENABLE_MODULE_DRAWQUEUE
|
|
41
|
+
; ---------------------------------------------------------------
|
|
42
|
+
; void __near__ pushRect ()
|
|
43
|
+
; ---------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
.segment "CODE"
|
|
46
|
+
|
|
47
|
+
.proc _pushRect: near
|
|
48
|
+
|
|
49
|
+
.segment "CODE"
|
|
50
|
+
|
|
51
|
+
jsr pushax
|
|
52
|
+
|
|
53
|
+
ldy _queue_end
|
|
54
|
+
inc _queue_end
|
|
55
|
+
inc _queue_count
|
|
56
|
+
|
|
57
|
+
lda _banksMirror ;get current banks reg
|
|
58
|
+
tax
|
|
59
|
+
ora #$40 ;make BANK1 version of same
|
|
60
|
+
sta BankReg ;switch to BANK1
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
lda _rect+7 ;bank
|
|
64
|
+
sta Q_BankReg, y
|
|
65
|
+
|
|
66
|
+
lda _rect+0 ;x
|
|
67
|
+
sta Q_VX, y
|
|
68
|
+
|
|
69
|
+
lda _rect+1 ;y
|
|
70
|
+
sta Q_VY, y
|
|
71
|
+
|
|
72
|
+
lda _rect+4 ;gx
|
|
73
|
+
sta Q_GX, y
|
|
74
|
+
|
|
75
|
+
lda _rect+5 ;gy
|
|
76
|
+
sta Q_GY, y
|
|
77
|
+
|
|
78
|
+
lda _rect+2 ;w
|
|
79
|
+
sta Q_WIDTH, y
|
|
80
|
+
|
|
81
|
+
lda _rect+3 ;h
|
|
82
|
+
sta Q_HEIGHT, y
|
|
83
|
+
|
|
84
|
+
lda _rect+6 ;color
|
|
85
|
+
sta Q_Color, y
|
|
86
|
+
|
|
87
|
+
lda _queue_flags_param ;flags
|
|
88
|
+
sta Q_DMAFlags, y
|
|
89
|
+
|
|
90
|
+
;now finally switch back to BANK0
|
|
91
|
+
stx BankReg
|
|
92
|
+
|
|
93
|
+
jmp incsp2
|
|
94
|
+
|
|
95
|
+
.endproc
|
|
96
|
+
|
|
97
|
+
.proc _next_draw_queue: near
|
|
98
|
+
;determined that there is more to process
|
|
99
|
+
;so load next set of parameters
|
|
100
|
+
STZ BankReg
|
|
101
|
+
LDA #1
|
|
102
|
+
STA _queue_pending
|
|
103
|
+
|
|
104
|
+
;make sure DMA mode is set to input these params
|
|
105
|
+
LDA _flagsMirror
|
|
106
|
+
ORA #$01
|
|
107
|
+
|
|
108
|
+
LDY _queue_start
|
|
109
|
+
|
|
110
|
+
LDA #$40
|
|
111
|
+
STA BankReg
|
|
112
|
+
|
|
113
|
+
LDA Q_VX, y
|
|
114
|
+
STA DMA_VX
|
|
115
|
+
|
|
116
|
+
LDA Q_VY, y
|
|
117
|
+
STA DMA_VY
|
|
118
|
+
|
|
119
|
+
LDA Q_GX, y
|
|
120
|
+
STA DMA_GX
|
|
121
|
+
|
|
122
|
+
LDA Q_GY, y
|
|
123
|
+
STA DMA_GY
|
|
124
|
+
|
|
125
|
+
LDA Q_WIDTH, y
|
|
126
|
+
STA DMA_WIDTH
|
|
127
|
+
|
|
128
|
+
LDA Q_HEIGHT, y
|
|
129
|
+
STA DMA_HEIGHT
|
|
130
|
+
|
|
131
|
+
LDA Q_Color, y
|
|
132
|
+
STA DMA_Color
|
|
133
|
+
|
|
134
|
+
LDX Q_DMAFlags, y
|
|
135
|
+
LDA Q_BankReg, y
|
|
136
|
+
|
|
137
|
+
AND #$3F
|
|
138
|
+
STA BankReg
|
|
139
|
+
STA _banksMirror
|
|
140
|
+
|
|
141
|
+
TXA ;retrieve Q_DMAFlags value
|
|
142
|
+
ORA _frameflip
|
|
143
|
+
ORA #$45 ; DMA_ENABLE | DMA_NMI | DMA_IRQ
|
|
144
|
+
STA _flagsMirror
|
|
145
|
+
STA DMAFlags
|
|
146
|
+
|
|
147
|
+
INC _queue_start
|
|
148
|
+
|
|
149
|
+
LDA #1
|
|
150
|
+
STA _draw_busy
|
|
151
|
+
STA DMA_Start ;START
|
|
152
|
+
|
|
153
|
+
DEC _queue_count
|
|
154
|
+
RTS
|
|
155
|
+
.endproc
|
|
156
|
+
|
|
157
|
+
.endif
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* GameTank-specific implementation of drawing functions
|
|
3
|
+
*/
|
|
4
|
+
#include "gfx_sys.h"
|
|
5
|
+
#include "gametank.h"
|
|
6
|
+
#include "banking.h"
|
|
7
|
+
|
|
8
|
+
char cursorX, cursorY;
|
|
9
|
+
char draw_busy;
|
|
10
|
+
|
|
11
|
+
void await_vsync(int frames) {
|
|
12
|
+
int i;
|
|
13
|
+
for(i = 0; i < frames; i++) {
|
|
14
|
+
frameflag = 1;
|
|
15
|
+
while(frameflag) {}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
void flip_pages() {
|
|
20
|
+
frameflip ^= DMA_PAGE_OUT;
|
|
21
|
+
bankflip ^= BANK_SECOND_FRAMEBUFFER;
|
|
22
|
+
flagsMirror = DMA_NMI | DMA_ENABLE | DMA_IRQ | DMA_OPAQUE | frameflip | DMA_GCARRY;
|
|
23
|
+
*dma_flags = flagsMirror;
|
|
24
|
+
*bank_reg = bankflip;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
void init_graphics() {
|
|
28
|
+
frameflip = 0;
|
|
29
|
+
draw_busy = 0;
|
|
30
|
+
flagsMirror = DMA_NMI | DMA_ENABLE | DMA_IRQ;
|
|
31
|
+
bankflip = BANK_SECOND_FRAMEBUFFER;
|
|
32
|
+
*dma_flags = flagsMirror;
|
|
33
|
+
banksMirror = bankflip;
|
|
34
|
+
*bank_reg = banksMirror;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
void await_drawing() {
|
|
38
|
+
asm ("CLI");
|
|
39
|
+
while (draw_busy)
|
|
40
|
+
{
|
|
41
|
+
wait();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#ifndef GFX_SYS_H
|
|
2
|
+
|
|
3
|
+
#define GFX_SYS_H
|
|
4
|
+
|
|
5
|
+
#define CLIP_MODE_NONE 0
|
|
6
|
+
#define CLIP_MODE_X 16
|
|
7
|
+
#define CLIP_MODE_Y 32
|
|
8
|
+
#define CLIP_MODE_XY 48
|
|
9
|
+
|
|
10
|
+
#define SPRITE_FLIP_NONE 0
|
|
11
|
+
#define SPRITE_FLIP_X 1
|
|
12
|
+
#define SPRITE_FLIP_Y 2
|
|
13
|
+
#define SPRITE_FLIP_BOTH 3
|
|
14
|
+
|
|
15
|
+
#define QUADRANT_0 0
|
|
16
|
+
#define QUADRANT_1 8
|
|
17
|
+
#define QUADRANT_2 16
|
|
18
|
+
#define QUADRANT_3 24
|
|
19
|
+
|
|
20
|
+
#define BORDER_BOTTOM_HEIGHT 8
|
|
21
|
+
#define BORDER_TOP_HEIGHT 7
|
|
22
|
+
#define BORDER_LEFT_WIDTH 1
|
|
23
|
+
#define BORDER_RIGHT_WIDTH 1
|
|
24
|
+
|
|
25
|
+
typedef struct Frame {
|
|
26
|
+
char x, y, w, h, gx, gy, c, b;
|
|
27
|
+
} Frame;
|
|
28
|
+
|
|
29
|
+
#define SET_RECT(xm,ym,wm,hm,gxm,gym,cm,bm) rect.x = xm;\
|
|
30
|
+
rect.y = ym; \
|
|
31
|
+
rect.w = wm; \
|
|
32
|
+
rect.h = hm; \
|
|
33
|
+
rect.gx = gxm; \
|
|
34
|
+
rect.gy = gym; \
|
|
35
|
+
rect.c = cm; \
|
|
36
|
+
rect.b = bm; \
|
|
37
|
+
|
|
38
|
+
void await_vsync(int frames);
|
|
39
|
+
void flip_pages();
|
|
40
|
+
void init_graphics();
|
|
41
|
+
void await_drawing();
|
|
42
|
+
|
|
43
|
+
extern char draw_busy;
|
|
44
|
+
extern Frame rect; //Defined in draw_util.s
|
|
45
|
+
|
|
46
|
+
#endif
|