romdevtools 0.14.0 → 0.15.0

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.
Files changed (96) hide show
  1. package/AGENTS.md +17 -10
  2. package/CHANGELOG.md +63 -0
  3. package/examples/atari2600/main.asm +1 -1
  4. package/examples/atari2600/templates/default.asm +1 -1
  5. package/examples/atari2600/templates/paddle.asm +59 -47
  6. package/examples/atari7800/main.c +1 -1
  7. package/examples/atari7800/templates/default.c +1 -1
  8. package/examples/atari7800/templates/music_demo.c +1 -1
  9. package/examples/c64/main.c +1 -1
  10. package/examples/c64/templates/platformer.c +2 -2
  11. package/examples/c64/templates/puzzle.c +1 -1
  12. package/examples/c64/templates/racing.c +3 -3
  13. package/examples/c64/templates/shmup.c +6 -5
  14. package/examples/c64/templates/sports.c +4 -4
  15. package/examples/gb/main.asm +1 -1
  16. package/examples/gb/main.c +1 -1
  17. package/examples/gb/templates/puzzle.c +1 -1
  18. package/examples/gb/templates/racing.c +1 -1
  19. package/examples/gb/templates/shmup.c +1 -1
  20. package/examples/gba/templates/gba_hello.c +1 -1
  21. package/examples/gba/templates/maxmod_demo.c +1 -1
  22. package/examples/gba/templates/puzzle.c +17 -3
  23. package/examples/gba/templates/racing.c +16 -2
  24. package/examples/gba/templates/shmup.c +23 -4
  25. package/examples/gba/templates/tonc_hello.c +6 -4
  26. package/examples/gbc/main.asm +1 -1
  27. package/examples/gbc/templates/puzzle.c +1 -1
  28. package/examples/gbc/templates/racing.c +1 -1
  29. package/examples/gbc/templates/shmup.c +1 -1
  30. package/examples/genesis/main.s +1 -1
  31. package/examples/genesis/templates/puzzle.c +1 -1
  32. package/examples/genesis/templates/racing.c +45 -1
  33. package/examples/genesis/templates/shmup.c +12 -3
  34. package/examples/genesis/templates/shmup_2p.c +2 -2
  35. package/examples/genesis/templates/sports.c +39 -0
  36. package/examples/gg/templates/hello_sprite.c +38 -23
  37. package/examples/gg/templates/music_demo.c +11 -8
  38. package/examples/gg/templates/platformer.c +37 -15
  39. package/examples/gg/templates/racing.c +25 -12
  40. package/examples/gg/templates/shmup.c +12 -6
  41. package/examples/gg/templates/sports.c +30 -16
  42. package/examples/gg/templates/tile_engine.c +24 -10
  43. package/examples/lynx/templates/platformer.c +7 -1
  44. package/examples/lynx/templates/puzzle.c +8 -2
  45. package/examples/lynx/templates/racing.c +7 -1
  46. package/examples/lynx/templates/sports.c +7 -1
  47. package/examples/nes/main.c +2 -2
  48. package/examples/nes/space-shooter/nes_runtime.h +1 -1
  49. package/examples/nes/templates/default.c +4 -1
  50. package/examples/nes/templates/racing.c +50 -1
  51. package/examples/pce/main.c +1 -1
  52. package/examples/sms/templates/hello_sprite.c +1 -1
  53. package/examples/sms/templates/music_demo.c +1 -1
  54. package/examples/sms/templates/puzzle.c +1 -1
  55. package/examples/sms/templates/racing.c +1 -1
  56. package/examples/sms/templates/shmup.c +1 -1
  57. package/examples/sms/templates/shmup_2p.c +2 -2
  58. package/examples/snes/main.asm +1 -1
  59. package/examples/snes/templates/c-hello-data.asm +309 -14
  60. package/examples/snes/templates/c-hello.c +13 -2
  61. package/examples/snes/templates/default.c +1 -1
  62. package/examples/snes/templates/hello_sprite-data.asm +300 -2
  63. package/examples/snes/templates/hello_sprite.c +10 -1
  64. package/examples/snes/templates/music_demo-data.asm +300 -2
  65. package/examples/snes/templates/music_demo.c +10 -1
  66. package/examples/snes/templates/platformer-data.asm +300 -2
  67. package/examples/snes/templates/platformer.c +10 -1
  68. package/examples/snes/templates/puzzle-data.asm +300 -2
  69. package/examples/snes/templates/puzzle.c +11 -1
  70. package/examples/snes/templates/racing-data.asm +300 -2
  71. package/examples/snes/templates/racing.c +40 -4
  72. package/examples/snes/templates/shmup-data.asm +299 -6
  73. package/examples/snes/templates/shmup.c +11 -7
  74. package/examples/snes/templates/sports-data.asm +300 -2
  75. package/examples/snes/templates/sports.c +40 -5
  76. package/package.json +1 -1
  77. package/src/mcp/tools/project.js +33 -22
  78. package/src/mcp/tools/toolchain.js +183 -19
  79. package/src/observer/livestream.html +34 -4
  80. package/src/platforms/gg/MENTAL_MODEL.md +14 -13
  81. package/src/platforms/gg/lib/c/vdp_init.c +10 -8
  82. package/src/platforms/msx/MENTAL_MODEL.md +1 -1
  83. package/src/platforms/nes/TROUBLESHOOTING.md +1 -1
  84. package/src/platforms/nes/lib/c/nes_runtime.c +28 -6
  85. package/src/platforms/pce/MENTAL_MODEL.md +1 -1
  86. package/src/platforms/pce/lib/c/pce_hw.h +1 -0
  87. package/src/platforms/pce/lib/c/pce_video.c +26 -0
  88. package/src/platforms/sms/MENTAL_MODEL.md +12 -12
  89. package/src/platforms/sms/lib/c/vdp_init.c +10 -8
  90. package/src/platforms/sms/lib/vdp_init.s +1 -1
  91. package/src/toolchains/cc65/presets/nes/chr-ram-runtime.cfg +1 -1
  92. package/src/toolchains/cc65/presets/nes/chr-ram.cfg +1 -1
  93. package/src/toolchains/cc65/presets/nes/chr-ram.crt0.s +1 -1
  94. package/src/toolchains/genesis-c/README.md +1 -1
  95. package/src/toolchains/sdcc/preflight-lint.js +47 -7
  96. package/src/toolchains/snes-c/snes-c.js +3 -7
@@ -27,6 +27,10 @@
27
27
 
28
28
  extern char tilfont, palfont;
29
29
 
30
+ /* consoleVblank() copies the dirty text tilemap to VRAM during VBlank.
31
+ * No public prototype in console.h, so declare it; call once per frame. */
32
+ extern void consoleVblank(void);
33
+
30
34
  int main(void) {
31
35
  u16 pad;
32
36
  u16 prev = 0;
@@ -36,9 +40,13 @@ int main(void) {
36
40
  /* ── Text-mode setup (PVSnesLib convention) ─────────────────── */
37
41
  consoleSetTextMapPtr(0x6800);
38
42
  consoleSetTextGfxPtr(0x3000);
39
- consoleSetTextOffset(0x0100);
43
+ consoleSetTextOffset(0x0000); /* tile index = (char-0x20); font is at the BG char base */
40
44
  consoleInitText(0, 16 * 2, &tilfont, &palfont);
41
45
  setMode(BG_MODE1, 0);
46
+ /* consoleInitText DMAs the font but does NOT set the PPU BG base
47
+ * registers — point BG0 at the same font ($3000) + map ($6800). */
48
+ bgSetGfxPtr(0, 0x3000);
49
+ bgSetMapPtr(0, 0x6800, SC_32x32);
42
50
  bgSetDisable(1);
43
51
  bgSetDisable(2);
44
52
 
@@ -78,6 +86,7 @@ int main(void) {
78
86
  frame++;
79
87
 
80
88
  WaitForVBlank();
89
+ consoleVblank();
81
90
  }
82
91
  return 0;
83
92
  }
@@ -4,10 +4,308 @@
4
4
  .section ".rodata1" superfree
5
5
 
6
6
  tilfont:
7
- .db 0, 0, 0, 0, 0, 0, 0, 0
7
+ ; 8x8 4bpp console font, 96 glyphs (ASCII 0x20-0x7F). consoleInitText
8
+ ; DMAs exactly 3072 bytes (96 tiles x 32 bytes, 4bpp) from here into
9
+ ; VRAM. Glyph index = (char - 0x20); only bitplane 0 carries pixels so
10
+ ; every set pixel uses palette colour 1. Public-domain font8x8 basic.
11
+ ; 0x20 '(space)'
12
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
13
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
14
+ ; 0x21 '!'
15
+ .db $18, $00, $3C, $00, $3C, $00, $18, $00, $18, $00, $00, $00, $18, $00, $00, $00
16
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
17
+ ; 0x22 '"'
18
+ .db $6C, $00, $6C, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
19
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
20
+ ; 0x23 '#'
21
+ .db $6C, $00, $6C, $00, $FE, $00, $6C, $00, $FE, $00, $6C, $00, $6C, $00, $00, $00
22
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
23
+ ; 0x24 '$'
24
+ .db $30, $00, $7C, $00, $C0, $00, $78, $00, $0C, $00, $F8, $00, $30, $00, $00, $00
25
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
26
+ ; 0x25 '%'
27
+ .db $00, $00, $C6, $00, $CC, $00, $18, $00, $30, $00, $66, $00, $C6, $00, $00, $00
28
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
29
+ ; 0x26 '&'
30
+ .db $38, $00, $6C, $00, $38, $00, $76, $00, $DC, $00, $CC, $00, $76, $00, $00, $00
31
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
32
+ ; 0x27 '''
33
+ .db $60, $00, $60, $00, $C0, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
34
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
35
+ ; 0x28 '('
36
+ .db $18, $00, $30, $00, $60, $00, $60, $00, $60, $00, $30, $00, $18, $00, $00, $00
37
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
38
+ ; 0x29 ')'
39
+ .db $60, $00, $30, $00, $18, $00, $18, $00, $18, $00, $30, $00, $60, $00, $00, $00
40
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
41
+ ; 0x2A '*'
42
+ .db $00, $00, $66, $00, $3C, $00, $FF, $00, $3C, $00, $66, $00, $00, $00, $00, $00
43
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
44
+ ; 0x2B '+'
45
+ .db $00, $00, $30, $00, $30, $00, $FC, $00, $30, $00, $30, $00, $00, $00, $00, $00
46
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
47
+ ; 0x2C ','
48
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $30, $00, $30, $00, $60, $00
49
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
50
+ ; 0x2D '-'
51
+ .db $00, $00, $00, $00, $00, $00, $FC, $00, $00, $00, $00, $00, $00, $00, $00, $00
52
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
53
+ ; 0x2E '.'
54
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $30, $00, $30, $00, $00, $00
55
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
56
+ ; 0x2F '/'
57
+ .db $06, $00, $0C, $00, $18, $00, $30, $00, $60, $00, $C0, $00, $80, $00, $00, $00
58
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
59
+ ; 0x30 '0'
60
+ .db $7C, $00, $C6, $00, $CE, $00, $DE, $00, $F6, $00, $E6, $00, $7C, $00, $00, $00
61
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
62
+ ; 0x31 '1'
63
+ .db $30, $00, $70, $00, $30, $00, $30, $00, $30, $00, $30, $00, $FC, $00, $00, $00
64
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
65
+ ; 0x32 '2'
66
+ .db $78, $00, $CC, $00, $0C, $00, $38, $00, $60, $00, $CC, $00, $FC, $00, $00, $00
67
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
68
+ ; 0x33 '3'
69
+ .db $78, $00, $CC, $00, $0C, $00, $38, $00, $0C, $00, $CC, $00, $78, $00, $00, $00
70
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
71
+ ; 0x34 '4'
72
+ .db $1C, $00, $3C, $00, $6C, $00, $CC, $00, $FE, $00, $0C, $00, $1E, $00, $00, $00
73
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
74
+ ; 0x35 '5'
75
+ .db $FC, $00, $C0, $00, $F8, $00, $0C, $00, $0C, $00, $CC, $00, $78, $00, $00, $00
76
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
77
+ ; 0x36 '6'
78
+ .db $38, $00, $60, $00, $C0, $00, $F8, $00, $CC, $00, $CC, $00, $78, $00, $00, $00
79
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
80
+ ; 0x37 '7'
81
+ .db $FC, $00, $CC, $00, $0C, $00, $18, $00, $30, $00, $30, $00, $30, $00, $00, $00
82
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
83
+ ; 0x38 '8'
84
+ .db $78, $00, $CC, $00, $CC, $00, $78, $00, $CC, $00, $CC, $00, $78, $00, $00, $00
85
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
86
+ ; 0x39 '9'
87
+ .db $78, $00, $CC, $00, $CC, $00, $7C, $00, $0C, $00, $18, $00, $70, $00, $00, $00
88
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
89
+ ; 0x3A ':'
90
+ .db $00, $00, $30, $00, $30, $00, $00, $00, $00, $00, $30, $00, $30, $00, $00, $00
91
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
92
+ ; 0x3B ';'
93
+ .db $00, $00, $30, $00, $30, $00, $00, $00, $00, $00, $30, $00, $30, $00, $60, $00
94
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
95
+ ; 0x3C '<'
96
+ .db $18, $00, $30, $00, $60, $00, $C0, $00, $60, $00, $30, $00, $18, $00, $00, $00
97
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
98
+ ; 0x3D '='
99
+ .db $00, $00, $00, $00, $FC, $00, $00, $00, $00, $00, $FC, $00, $00, $00, $00, $00
100
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
101
+ ; 0x3E '>'
102
+ .db $60, $00, $30, $00, $18, $00, $0C, $00, $18, $00, $30, $00, $60, $00, $00, $00
103
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
104
+ ; 0x3F '?'
105
+ .db $78, $00, $CC, $00, $0C, $00, $18, $00, $30, $00, $00, $00, $30, $00, $00, $00
106
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
107
+ ; 0x40 '@'
108
+ .db $7C, $00, $C6, $00, $DE, $00, $DE, $00, $DE, $00, $C0, $00, $78, $00, $00, $00
109
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
110
+ ; 0x41 'A'
111
+ .db $30, $00, $78, $00, $CC, $00, $CC, $00, $FC, $00, $CC, $00, $CC, $00, $00, $00
112
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
113
+ ; 0x42 'B'
114
+ .db $FC, $00, $66, $00, $66, $00, $7C, $00, $66, $00, $66, $00, $FC, $00, $00, $00
115
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
116
+ ; 0x43 'C'
117
+ .db $3C, $00, $66, $00, $C0, $00, $C0, $00, $C0, $00, $66, $00, $3C, $00, $00, $00
118
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
119
+ ; 0x44 'D'
120
+ .db $F8, $00, $6C, $00, $66, $00, $66, $00, $66, $00, $6C, $00, $F8, $00, $00, $00
121
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
122
+ ; 0x45 'E'
123
+ .db $FE, $00, $62, $00, $68, $00, $78, $00, $68, $00, $62, $00, $FE, $00, $00, $00
124
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
125
+ ; 0x46 'F'
126
+ .db $FE, $00, $62, $00, $68, $00, $78, $00, $68, $00, $60, $00, $F0, $00, $00, $00
127
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
128
+ ; 0x47 'G'
129
+ .db $3C, $00, $66, $00, $C0, $00, $C0, $00, $CE, $00, $66, $00, $3E, $00, $00, $00
130
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
131
+ ; 0x48 'H'
132
+ .db $CC, $00, $CC, $00, $CC, $00, $FC, $00, $CC, $00, $CC, $00, $CC, $00, $00, $00
133
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
134
+ ; 0x49 'I'
135
+ .db $78, $00, $30, $00, $30, $00, $30, $00, $30, $00, $30, $00, $78, $00, $00, $00
136
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
137
+ ; 0x4A 'J'
138
+ .db $1E, $00, $0C, $00, $0C, $00, $0C, $00, $CC, $00, $CC, $00, $78, $00, $00, $00
139
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
140
+ ; 0x4B 'K'
141
+ .db $E6, $00, $66, $00, $6C, $00, $78, $00, $6C, $00, $66, $00, $E6, $00, $00, $00
142
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
143
+ ; 0x4C 'L'
144
+ .db $F0, $00, $60, $00, $60, $00, $60, $00, $62, $00, $66, $00, $FE, $00, $00, $00
145
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
146
+ ; 0x4D 'M'
147
+ .db $C6, $00, $EE, $00, $FE, $00, $FE, $00, $D6, $00, $C6, $00, $C6, $00, $00, $00
148
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
149
+ ; 0x4E 'N'
150
+ .db $C6, $00, $E6, $00, $F6, $00, $DE, $00, $CE, $00, $C6, $00, $C6, $00, $00, $00
151
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
152
+ ; 0x4F 'O'
153
+ .db $38, $00, $6C, $00, $C6, $00, $C6, $00, $C6, $00, $6C, $00, $38, $00, $00, $00
154
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
155
+ ; 0x50 'P'
156
+ .db $FC, $00, $66, $00, $66, $00, $7C, $00, $60, $00, $60, $00, $F0, $00, $00, $00
157
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
158
+ ; 0x51 'Q'
159
+ .db $78, $00, $CC, $00, $CC, $00, $CC, $00, $DC, $00, $78, $00, $1C, $00, $00, $00
160
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
161
+ ; 0x52 'R'
162
+ .db $FC, $00, $66, $00, $66, $00, $7C, $00, $6C, $00, $66, $00, $E6, $00, $00, $00
163
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
164
+ ; 0x53 'S'
165
+ .db $78, $00, $CC, $00, $E0, $00, $70, $00, $1C, $00, $CC, $00, $78, $00, $00, $00
166
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
167
+ ; 0x54 'T'
168
+ .db $FC, $00, $B4, $00, $30, $00, $30, $00, $30, $00, $30, $00, $78, $00, $00, $00
169
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
170
+ ; 0x55 'U'
171
+ .db $CC, $00, $CC, $00, $CC, $00, $CC, $00, $CC, $00, $CC, $00, $FC, $00, $00, $00
172
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
173
+ ; 0x56 'V'
174
+ .db $CC, $00, $CC, $00, $CC, $00, $CC, $00, $CC, $00, $78, $00, $30, $00, $00, $00
175
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
176
+ ; 0x57 'W'
177
+ .db $C6, $00, $C6, $00, $C6, $00, $D6, $00, $FE, $00, $EE, $00, $C6, $00, $00, $00
178
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
179
+ ; 0x58 'X'
180
+ .db $C6, $00, $C6, $00, $6C, $00, $38, $00, $38, $00, $6C, $00, $C6, $00, $00, $00
181
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
182
+ ; 0x59 'Y'
183
+ .db $CC, $00, $CC, $00, $CC, $00, $78, $00, $30, $00, $30, $00, $78, $00, $00, $00
184
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
185
+ ; 0x5A 'Z'
186
+ .db $FE, $00, $C6, $00, $8C, $00, $18, $00, $32, $00, $66, $00, $FE, $00, $00, $00
187
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
188
+ ; 0x5B '['
189
+ .db $78, $00, $60, $00, $60, $00, $60, $00, $60, $00, $60, $00, $78, $00, $00, $00
190
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
191
+ ; 0x5C 'backslash'
192
+ .db $C0, $00, $60, $00, $30, $00, $18, $00, $0C, $00, $06, $00, $02, $00, $00, $00
193
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
194
+ ; 0x5D ']'
195
+ .db $78, $00, $18, $00, $18, $00, $18, $00, $18, $00, $18, $00, $78, $00, $00, $00
196
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
197
+ ; 0x5E '^'
198
+ .db $10, $00, $38, $00, $6C, $00, $C6, $00, $00, $00, $00, $00, $00, $00, $00, $00
199
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
200
+ ; 0x5F '_'
201
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $00
202
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
203
+ ; 0x60 '`'
204
+ .db $30, $00, $30, $00, $18, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
205
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
206
+ ; 0x61 'a'
207
+ .db $00, $00, $00, $00, $78, $00, $0C, $00, $7C, $00, $CC, $00, $76, $00, $00, $00
208
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
209
+ ; 0x62 'b'
210
+ .db $E0, $00, $60, $00, $60, $00, $7C, $00, $66, $00, $66, $00, $DC, $00, $00, $00
211
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
212
+ ; 0x63 'c'
213
+ .db $00, $00, $00, $00, $78, $00, $CC, $00, $C0, $00, $CC, $00, $78, $00, $00, $00
214
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
215
+ ; 0x64 'd'
216
+ .db $1C, $00, $0C, $00, $0C, $00, $7C, $00, $CC, $00, $CC, $00, $76, $00, $00, $00
217
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
218
+ ; 0x65 'e'
219
+ .db $00, $00, $00, $00, $78, $00, $CC, $00, $FC, $00, $C0, $00, $78, $00, $00, $00
220
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
221
+ ; 0x66 'f'
222
+ .db $38, $00, $6C, $00, $60, $00, $F0, $00, $60, $00, $60, $00, $F0, $00, $00, $00
223
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
224
+ ; 0x67 'g'
225
+ .db $00, $00, $00, $00, $76, $00, $CC, $00, $CC, $00, $7C, $00, $0C, $00, $F8, $00
226
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
227
+ ; 0x68 'h'
228
+ .db $E0, $00, $60, $00, $6C, $00, $76, $00, $66, $00, $66, $00, $E6, $00, $00, $00
229
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
230
+ ; 0x69 'i'
231
+ .db $30, $00, $00, $00, $70, $00, $30, $00, $30, $00, $30, $00, $78, $00, $00, $00
232
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
233
+ ; 0x6A 'j'
234
+ .db $0C, $00, $00, $00, $0C, $00, $0C, $00, $0C, $00, $CC, $00, $CC, $00, $78, $00
235
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
236
+ ; 0x6B 'k'
237
+ .db $E0, $00, $60, $00, $66, $00, $6C, $00, $78, $00, $6C, $00, $E6, $00, $00, $00
238
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
239
+ ; 0x6C 'l'
240
+ .db $70, $00, $30, $00, $30, $00, $30, $00, $30, $00, $30, $00, $78, $00, $00, $00
241
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
242
+ ; 0x6D 'm'
243
+ .db $00, $00, $00, $00, $CC, $00, $FE, $00, $FE, $00, $D6, $00, $C6, $00, $00, $00
244
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
245
+ ; 0x6E 'n'
246
+ .db $00, $00, $00, $00, $F8, $00, $CC, $00, $CC, $00, $CC, $00, $CC, $00, $00, $00
247
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
248
+ ; 0x6F 'o'
249
+ .db $00, $00, $00, $00, $78, $00, $CC, $00, $CC, $00, $CC, $00, $78, $00, $00, $00
250
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
251
+ ; 0x70 'p'
252
+ .db $00, $00, $00, $00, $DC, $00, $66, $00, $66, $00, $7C, $00, $60, $00, $F0, $00
253
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
254
+ ; 0x71 'q'
255
+ .db $00, $00, $00, $00, $76, $00, $CC, $00, $CC, $00, $7C, $00, $0C, $00, $1E, $00
256
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
257
+ ; 0x72 'r'
258
+ .db $00, $00, $00, $00, $DC, $00, $76, $00, $66, $00, $60, $00, $F0, $00, $00, $00
259
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
260
+ ; 0x73 's'
261
+ .db $00, $00, $00, $00, $7C, $00, $C0, $00, $78, $00, $0C, $00, $F8, $00, $00, $00
262
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
263
+ ; 0x74 't'
264
+ .db $10, $00, $30, $00, $7C, $00, $30, $00, $30, $00, $34, $00, $18, $00, $00, $00
265
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
266
+ ; 0x75 'u'
267
+ .db $00, $00, $00, $00, $CC, $00, $CC, $00, $CC, $00, $CC, $00, $76, $00, $00, $00
268
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
269
+ ; 0x76 'v'
270
+ .db $00, $00, $00, $00, $CC, $00, $CC, $00, $CC, $00, $78, $00, $30, $00, $00, $00
271
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
272
+ ; 0x77 'w'
273
+ .db $00, $00, $00, $00, $C6, $00, $D6, $00, $FE, $00, $FE, $00, $6C, $00, $00, $00
274
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
275
+ ; 0x78 'x'
276
+ .db $00, $00, $00, $00, $C6, $00, $6C, $00, $38, $00, $6C, $00, $C6, $00, $00, $00
277
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
278
+ ; 0x79 'y'
279
+ .db $00, $00, $00, $00, $CC, $00, $CC, $00, $CC, $00, $7C, $00, $0C, $00, $F8, $00
280
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
281
+ ; 0x7A 'z'
282
+ .db $00, $00, $00, $00, $FC, $00, $98, $00, $30, $00, $64, $00, $FC, $00, $00, $00
283
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
284
+ ; 0x7B '{'
285
+ .db $1C, $00, $30, $00, $30, $00, $E0, $00, $30, $00, $30, $00, $1C, $00, $00, $00
286
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
287
+ ; 0x7C '|'
288
+ .db $18, $00, $18, $00, $18, $00, $00, $00, $18, $00, $18, $00, $18, $00, $00, $00
289
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
290
+ ; 0x7D '}'
291
+ .db $E0, $00, $30, $00, $30, $00, $1C, $00, $30, $00, $30, $00, $E0, $00, $00, $00
292
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
293
+ ; 0x7E '~'
294
+ .db $76, $00, $DC, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
295
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
296
+ ; 0x7F 'del'
297
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
298
+ .db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
8
299
 
9
300
  palfont:
10
- .db 0, 0, 0, 0, 0, 0, 0, 0
301
+ ; 16-colour text palette (32 bytes, BGR555): colour 0 transparent
302
+ ; (backdrop shows through), colour 1 white (the text colour).
303
+ .db $00, $00 ; 0 transparent
304
+ .db $FF, $7F ; 1 white
305
+ .db $00, $00, $00, $00, $00, $00, $00, $00
306
+ .db $00, $00, $00, $00, $00, $00, $00, $00
307
+ .db $00, $00, $00, $00, $00, $00, $00, $00
308
+ .db $00, $00
11
309
 
12
310
  tilsprite:
13
311
  ; Tile 0 — player (filled diamond, colour 1)
@@ -24,6 +24,10 @@
24
24
  extern char tilfont, palfont;
25
25
  extern char tilsprite, palsprite;
26
26
 
27
+ /* consoleVblank() copies the dirty text tilemap to VRAM during VBlank.
28
+ * No public prototype in console.h, so declare it; call once per frame. */
29
+ extern void consoleVblank(void);
30
+
27
31
  typedef struct { s16 x, y, w, h; } Rect;
28
32
 
29
33
  #define WORLD_W 512
@@ -69,9 +73,13 @@ int main(void) {
69
73
 
70
74
  consoleSetTextMapPtr(0x6800);
71
75
  consoleSetTextGfxPtr(0x3000);
72
- consoleSetTextOffset(0x0100);
76
+ consoleSetTextOffset(0x0000); /* tile index = (char-0x20); font is at the BG char base */
73
77
  consoleInitText(0, 16 * 2, &tilfont, &palfont);
74
78
  setMode(BG_MODE1, 0);
79
+ /* consoleInitText DMAs the font but does NOT set the PPU BG base
80
+ * registers — point BG0 at the same font ($3000) + map ($6800). */
81
+ bgSetGfxPtr(0, 0x3000);
82
+ bgSetMapPtr(0, 0x6800, SC_32x32);
75
83
  bgSetDisable(1);
76
84
  bgSetDisable(2);
77
85
 
@@ -137,6 +145,7 @@ done: ;
137
145
  oamSetXY(0, (px >> 4) - camX, py >> 4);
138
146
  oamUpdate();
139
147
  WaitForVBlank();
148
+ consoleVblank();
140
149
  }
141
150
  return 0;
142
151
  }