Commit 70c4eb4

Nick committed on
Working on music stuff
commit 70c4eb483c86c2d785e7358b125f8bb9d20937bb parent 49ffb75
19 changed files +1392−49
Modified.gitignore +6−1
@@ -5,4 +5,9 @@ ConverterBackup
5 lib 5 lib
6 *.exe 6 *.exe
7 *.dll 7 *.dll
8 *.lps 8 *.lps
9 *.gb
10 *.obj
11 *.sym
12 *.lnk
13 *.map
Added3ify.py +8−0
@@ -0,0 +1,8 @@
1 orig = open('meaty.raw', 'rb').read()
2 newf = open('meaty2.raw', 'wb')
3
4 for byte in orig:
5 new = int((byte/255)*15)
6 newf.write(bytes([new]))
7
8 newf.close()
Added808nokickbreak.wavcrush.dat +0−0
File metadata changed without textual changes.
ModifiedCpu/z80cpu.pas +1−0
@@ -3185,6 +3185,7 @@ end;
3185 3185
3186 function PFX_FD: byte; 3186 function PFX_FD: byte;
3187 begin 3187 begin
3188 Writeln('[DEBUG] 0xFD Called, A = ', af.h);
3188 Result := 0; 3189 Result := 0;
3189 end; 3190 end;
3190 3191
ModifiedGBEmu.lpi +11−1
@@ -26,7 +26,7 @@
26 <RunParams> 26 <RunParams>
27 <local> 27 <local>
28 <FormatVersion Value="1"/> 28 <FormatVersion Value="1"/>
29 <CommandLineParams Value="C:\Projects\GB-Stuff\sml.gb"/> 29 <CommandLineParams Value="C:\Projects\GB-Stuff\uge\driver.gb"/>
30 </local> 30 </local>
31 </RunParams> 31 </RunParams>
32 <RequiredPackages Count="2"> 32 <RequiredPackages Count="2">
@@ -103,6 +103,16 @@
103 <SyntaxMode Value="Delphi"/> 103 <SyntaxMode Value="Delphi"/>
104 </SyntaxOptions> 104 </SyntaxOptions>
105 </Parsing> 105 </Parsing>
106 <CodeGeneration>
107 <Optimizations>
108 <OptimizationLevel Value="0"/>
109 </Optimizations>
110 </CodeGeneration>
111 <Linking>
112 <Debugging>
113 <DebugInfoType Value="dsDwarf2Set"/>
114 </Debugging>
115 </Linking>
106 <Other> 116 <Other>
107 <CustomOptions Value="-dBorland -dVer150 -dDelphi7 -dCompiler6_Up -dPUREPASCAL"/> 117 <CustomOptions Value="-dBorland -dVer150 -dDelphi7 -dCompiler6_Up -dPUREPASCAL"/>
108 </Other> 118 </Other>
AddedHARDWARE.INC +744−0
@@ -0,0 +1,744 @@
1 ;*
2 ;* Gameboy Hardware definitions
3 ;*
4 ;* Based on Jones' hardware.inc
5 ;* And based on Carsten Sorensen's ideas.
6 ;*
7 ;* Rev 1.1 - 15-Jul-97 : Added define check
8 ;* Rev 1.2 - 18-Jul-97 : Added revision check macro
9 ;* Rev 1.3 - 19-Jul-97 : Modified for RGBASM V1.05
10 ;* Rev 1.4 - 27-Jul-97 : Modified for new subroutine prefixes
11 ;* Rev 1.5 - 15-Aug-97 : Added _HRAM, PAD, CART defines
12 ;* : and Nintendo Logo
13 ;* Rev 1.6 - 30-Nov-97 : Added rDIV, rTIMA, rTMA, & rTAC
14 ;* Rev 1.7 - 31-Jan-98 : Added _SCRN0, _SCRN1
15 ;* Rev 1.8 - 15-Feb-98 : Added rSB, rSC
16 ;* Rev 1.9 - 16-Feb-98 : Converted I/O registers to $FFXX format
17 ;* Rev 2.0 - : Added GBC registers
18 ;* Rev 2.1 - : Added MBC5 & cart RAM enable/disable defines
19 ;* Rev 2.2 : Fixed NR42,NR43, & NR44 equates
20 ;* Rev 2.3 - : Fixed incorrect _HRAM equate
21 ;* Rev 2.4 - : Completed CART defines
22 ;* Rev 2.5 - : Fixed bug in CART defines
23
24 ; If all of these are already defined, don't do it again.
25
26 IF !DEF(HARDWARE_INC)
27 HARDWARE_INC SET 1
28
29 rev_Check_hardware_inc: MACRO
30 ;NOTE: REVISION NUMBER CHANGES MUST BE ADDED
31 ;TO SECOND PARAMETER IN FOLLOWING LINE.
32 IF \1 > 2.2 ;PUT REVISION NUMBER HERE
33 WARN "Version \1 or later of 'hardware.inc' is required."
34 ENDC
35 ENDM
36
37 _HW EQU $FF00
38
39 _VRAM EQU $8000 ; $8000->$A000
40 _SCRN0 EQU $9800 ; $9800->$9BFF
41 _SCRN1 EQU $9C00 ; $9C00->$9FFF
42 _RAM EQU $C000 ; $C000->$E000
43 _HRAM EQU $FF80 ; $FF80->$FFFE
44 _OAMRAM EQU $FE00 ; $FE00->$FE9F
45 _AUD3WAVERAM EQU $FF30 ; $FF30->$FF3F
46
47 ; *** MBC5 Equates ***
48
49 rRAMG EQU $0000 ; $0000->$1fff
50 rROMB0 EQU $2000 ; $2000->$2fff
51 rROMB1 EQU $3000 ; $3000->$3fff
52 rRAMB EQU $4000 ; $4000->$5fff
53
54
55 ; --
56 ; -- OAM flags
57 ; --
58
59 OAMF_PRI EQU %10000000 ; Priority
60 OAMF_YFLIP EQU %01000000 ; Y flip
61 OAMF_XFLIP EQU %00100000 ; X flip
62 OAMF_PAL0 EQU %00000000 ; Palette number; 0,1
63 OAMF_PAL1 EQU %00010000 ; Palette number; 0,1
64
65
66 ;***************************************************************************
67 ;*
68 ;* Custom registers
69 ;*
70 ;***************************************************************************
71
72 ; --
73 ; -- P1 ($FF00)
74 ; -- Register for reading joy pad info. (R/W)
75 ; --
76 rP1 EQU $FF00
77
78 P1F_5 EQU %00100000 ; P15 out port
79 P1F_4 EQU %00010000 ; P14 out port
80 P1F_3 EQU %00001000 ; P13 in port
81 P1F_2 EQU %00000100 ; P12 in port
82 P1F_1 EQU %00000010 ; P11 in port
83 P1F_0 EQU %00000001 ; P10 in port
84
85 ; --
86 ; -- SB ($FF01)
87 ; -- Serial Transfer Data (R/W)
88 ; --
89 rSB EQU $FF01
90
91 ; --
92 ; -- SC ($FF02)
93 ; -- Serial I/O Control (R/W)
94 ; --
95 rSC EQU $FF02
96
97 ; --
98 ; -- DIV ($FF04)
99 ; -- Divider register (R/W)
100 ; --
101 rDIV EQU $FF04
102
103
104 ; --
105 ; -- TIMA ($FF05)
106 ; -- Timer counter (R/W)
107 ; --
108 rTIMA EQU $FF05
109
110
111 ; --
112 ; -- TMA ($FF06)
113 ; -- Timer modulo (R/W)
114 ; --
115 rTMA EQU $FF06
116
117
118 ; --
119 ; -- TAC ($FF07)
120 ; -- Timer control (R/W)
121 ; --
122 rTAC EQU $FF07
123
124 TACF_START EQU %00000100
125 TACF_STOP EQU %00000000
126 TACF_4KHZ EQU %00000000
127 TACF_16KHZ EQU %00000011
128 TACF_65KHZ EQU %00000010
129 TACF_262KHZ EQU %00000001
130
131 ; --
132 ; -- IF ($FF0F)
133 ; -- Interrupt Flag (R/W)
134 ; --
135 rIF EQU $FF0F
136
137 ; --
138 ; -- LCDC ($FF40)
139 ; -- LCD Control (R/W)
140 ; --
141 rLCDC EQU $FF40
142
143 LCDCF_OFF EQU %00000000 ; LCD Control Operation
144 LCDCF_ON EQU %10000000 ; LCD Control Operation
145 LCDCF_WIN9800 EQU %00000000 ; Window Tile Map Display Select
146 LCDCF_WIN9C00 EQU %01000000 ; Window Tile Map Display Select
147 LCDCF_WINOFF EQU %00000000 ; Window Display
148 LCDCF_WINON EQU %00100000 ; Window Display
149 LCDCF_BG8800 EQU %00000000 ; BG & Window Tile Data Select
150 LCDCF_BG8000 EQU %00010000 ; BG & Window Tile Data Select
151 LCDCF_BG9800 EQU %00000000 ; BG Tile Map Display Select
152 LCDCF_BG9C00 EQU %00001000 ; BG Tile Map Display Select
153 LCDCF_OBJ8 EQU %00000000 ; OBJ Construction
154 LCDCF_OBJ16 EQU %00000100 ; OBJ Construction
155 LCDCF_OBJOFF EQU %00000000 ; OBJ Display
156 LCDCF_OBJON EQU %00000010 ; OBJ Display
157 LCDCF_BGOFF EQU %00000000 ; BG Display
158 LCDCF_BGON EQU %00000001 ; BG Display
159 ; "Window Character Data Select" follows BG
160
161
162 ; --
163 ; -- STAT ($FF41)
164 ; -- LCDC Status (R/W)
165 ; --
166 rSTAT EQU $FF41
167
168 STATF_LYC EQU %01000000 ; LYCEQULY Coincidence (Selectable)
169 STATF_MODE10 EQU %00100000 ; Mode 10
170 STATF_MODE01 EQU %00010000 ; Mode 01 (V-Blank)
171 STATF_MODE00 EQU %00001000 ; Mode 00 (H-Blank)
172 STATF_LYCF EQU %00000100 ; Coincidence Flag
173 STATF_HB EQU %00000000 ; H-Blank
174 STATF_VB EQU %00000001 ; V-Blank
175 STATF_OAM EQU %00000010 ; OAM-RAM is used by system
176 STATF_LCD EQU %00000011 ; Both OAM and VRAM used by system
177 STATF_BUSY EQU %00000010 ; When set, VRAM access is unsafe
178
179
180 ; --
181 ; -- SCY ($FF42)
182 ; -- Scroll Y (R/W)
183 ; --
184 rSCY EQU $FF42
185
186
187 ; --
188 ; -- SCY ($FF43)
189 ; -- Scroll X (R/W)
190 ; --
191 rSCX EQU $FF43
192
193
194 ; --
195 ; -- LY ($FF44)
196 ; -- LCDC Y-Coordinate (R)
197 ; --
198 ; -- Values range from 0->153. 144->153 is the VBlank period.
199 ; --
200 rLY EQU $FF44
201
202
203 ; --
204 ; -- LYC ($FF45)
205 ; -- LY Compare (R/W)
206 ; --
207 ; -- When LYEQUEQULYC, STATF_LYCF will be set in STAT
208 ; --
209 rLYC EQU $FF45
210
211
212 ; --
213 ; -- DMA ($FF46)
214 ; -- DMA Transfer and Start Address (W)
215 ; --
216 rDMA EQU $FF46
217
218
219 ; --
220 ; -- BGP ($FF47)
221 ; -- BG Palette Data (W)
222 ; --
223 ; -- Bit 7-6 - Intensity for %11
224 ; -- Bit 5-4 - Intensity for %10
225 ; -- Bit 3-2 - Intensity for %01
226 ; -- Bit 1-0 - Intensity for %00
227 ; --
228 rBGP EQU $FF47
229
230
231 ; --
232 ; -- OBP0 ($FF48)
233 ; -- Object Palette 0 Data (W)
234 ; --
235 ; -- See BGP for info
236 ; --
237 rOBP0 EQU $FF48
238
239
240 ; --
241 ; -- OBP1 ($FF49)
242 ; -- Object Palette 1 Data (W)
243 ; --
244 ; -- See BGP for info
245 ; --
246 rOBP1 EQU $FF49
247
248
249 ; --
250 ; -- WY ($FF4A)
251 ; -- Window Y Position (R/W)
252 ; --
253 ; -- 0 <EQU WY <EQU 143
254 ; --
255 rWY EQU $FF4A
256
257
258 ; --
259 ; -- WX ($FF4B)
260 ; -- Window X Position (R/W)
261 ; --
262 ; -- 7 <EQU WX <EQU 166
263 ; --
264 rWX EQU $FF4B
265
266
267 ; --
268 ; -- KEY 1 ($FF4D)
269 ; -- Select CPU Speed (R/W)
270 ; --
271 rKEY1 EQU $FF4D
272
273
274 ; --
275 ; -- VBK ($FF4F)
276 ; -- Select Video RAM Bank (R/W)
277 ; --
278 rVBK EQU $FF4F
279
280
281 ; --
282 ; -- HDMA1 ($FF51)
283 ; -- Horizontal Blanking, General Purpose DMA (W)
284 ; --
285 rHDMA1 EQU $FF51
286
287
288 ; --
289 ; -- HDMA2 ($FF52)
290 ; -- Horizontal Blanking, General Purpose DMA (W)
291 ; --
292 rHDMA2 EQU $FF52
293
294
295 ; --
296 ; -- HDMA3 ($FF53)
297 ; -- Horizontal Blanking, General Purpose DMA (W)
298 ; --
299 rHDMA3 EQU $FF53
300
301
302 ; --
303 ; -- HDMA4 ($FF54)
304 ; -- Horizontal Blanking, General Purpose DMA (W)
305 ; --
306 rHDMA4 EQU $FF54
307
308
309 ; --
310 ; -- HDMA5 ($FF55)
311 ; -- Horizontal Blanking, General Purpose DMA (R/W)
312 ; --
313 rHDMA5 EQU $FF55
314
315
316 ; --
317 ; -- RP ($FF56)
318 ; -- Infrared Communications Port (R/W)
319 ; --
320 rRP EQU $FF56
321
322
323 ; --
324 ; -- BCPS ($FF68)
325 ; -- Background Color Palette Specification (R/W)
326 ; --
327 rBCPS EQU $FF68
328
329
330 ; --
331 ; -- BCPD ($FF69)
332 ; -- Background Color Palette Data (R/W)
333 ; --
334 rBCPD EQU $FF69
335
336
337 ; --
338 ; -- BCPS ($FF6A)
339 ; -- Object Color Palette Specification (R/W)
340 ; --
341 rOCPS EQU $FF6A
342
343
344 ; --
345 ; -- BCPD ($FF6B)
346 ; -- Object Color Palette Data (R/W)
347 ; --
348 rOCPD EQU $FF6B
349
350
351 ; --
352 ; -- SVBK ($FF4F)
353 ; -- Select Main RAM Bank (R/W)
354 ; --
355 rSVBK EQU $FF70
356
357
358 ; --
359 ; -- IE ($FFFF)
360 ; -- Interrupt Enable (R/W)
361 ; --
362 rIE EQU $FFFF
363
364
365 IEF_HILO EQU %00010000 ; Transition from High to Low of Pin number P10-P13
366 IEF_SERIAL EQU %00001000 ; Serial I/O transfer end
367 IEF_TIMER EQU %00000100 ; Timer Overflow
368 IEF_LCDC EQU %00000010 ; LCDC (see STAT)
369 IEF_VBLANK EQU %00000001 ; V-Blank
370
371
372
373
374 ;***************************************************************************
375 ;*
376 ;* Sound control registers
377 ;*
378 ;***************************************************************************
379
380 ; --
381 ; -- AUDVOL/NR50 ($FF24)
382 ; -- Channel control / ON-OFF / Volume (R/W)
383 ; --
384 ; -- Bit 7 - Vin->SO2 ON/OFF (Vin??)
385 ; -- Bit 6-4 - SO2 output level (volume) (# 0-7)
386 ; -- Bit 3 - Vin->SO1 ON/OFF (Vin??)
387 ; -- Bit 2-0 - SO1 output level (volume) (# 0-7)
388 ; --
389 rNR50 EQU $FF24
390 rAUDVOL EQU rNR50
391
392
393 ; --
394 ; -- AUDTERM/NR51 ($FF25)
395 ; -- Selection of Sound output terminal (R/W)
396 ; --
397 ; -- Bit 7 - Output sound 4 to SO2 terminal
398 ; -- Bit 6 - Output sound 3 to SO2 terminal
399 ; -- Bit 5 - Output sound 2 to SO2 terminal
400 ; -- Bit 4 - Output sound 1 to SO2 terminal
401 ; -- Bit 3 - Output sound 4 to SO1 terminal
402 ; -- Bit 2 - Output sound 3 to SO1 terminal
403 ; -- Bit 1 - Output sound 2 to SO1 terminal
404 ; -- Bit 0 - Output sound 0 to SO1 terminal
405 ; --
406 rNR51 EQU $FF25
407 rAUDTERM EQU rNR51
408
409
410 ; --
411 ; -- AUDENA/NR52 ($FF26)
412 ; -- Sound on/off (R/W)
413 ; --
414 ; -- Bit 7 - All sound on/off (sets all audio regs to 0!)
415 ; -- Bit 3 - Sound 4 ON flag (doesn't work!)
416 ; -- Bit 2 - Sound 3 ON flag (doesn't work!)
417 ; -- Bit 1 - Sound 2 ON flag (doesn't work!)
418 ; -- Bit 0 - Sound 1 ON flag (doesn't work!)
419 ; --
420 rNR52 EQU $FF26
421 rAUDENA EQU rNR52
422
423
424 ;***************************************************************************
425 ;*
426 ;* SoundChannel #1 registers
427 ;*
428 ;***************************************************************************
429
430 ; --
431 ; -- AUD1SWEEP/NR10 ($FF10)
432 ; -- Sweep register (R/W)
433 ; --
434 ; -- Bit 6-4 - Sweep Time
435 ; -- Bit 3 - Sweep Increase/Decrease
436 ; -- 0: Addition (frequency increases???)
437 ; -- 1: Subtraction (frequency increases???)
438 ; -- Bit 2-0 - Number of sweep shift (# 0-7)
439 ; -- Sweep Time: (n*7.8ms)
440 ; --
441 rNR10 EQU $FF10
442 rAUD1SWEEP EQU rNR10
443
444
445 ; --
446 ; -- AUD1LEN/NR11 ($FF11)
447 ; -- Sound length/Wave pattern duty (R/W)
448 ; --
449 ; -- Bit 7-6 - Wave Pattern Duty (00:12.5% 01:25% 10:50% 11:75%)
450 ; -- Bit 5-0 - Sound length data (# 0-63)
451 ; --
452 rNR11 EQU $FF11
453 rAUD1LEN EQU rNR11
454
455
456 ; --
457 ; -- AUD1ENV/NR12 ($FF12)
458 ; -- Envelope (R/W)
459 ; --
460 ; -- Bit 7-4 - Initial value of envelope
461 ; -- Bit 3 - Envelope UP/DOWN
462 ; -- 0: Decrease
463 ; -- 1: Range of increase
464 ; -- Bit 2-0 - Number of envelope sweep (# 0-7)
465 ; --
466 rNR12 EQU $FF12
467 rAUD1ENV EQU rNR12
468
469
470 ; --
471 ; -- AUD1LOW/NR13 ($FF13)
472 ; -- Frequency lo (W)
473 ; --
474 rNR13 EQU $FF13
475 rAUD1LOW EQU rNR13
476
477
478 ; --
479 ; -- AUD1HIGH/NR14 ($FF14)
480 ; -- Frequency hi (W)
481 ; --
482 ; -- Bit 7 - Initial (when set, sound restarts)
483 ; -- Bit 6 - Counter/consecutive selection
484 ; -- Bit 2-0 - Frequency's higher 3 bits
485 ; --
486 rNR14 EQU $FF14
487 rAUD1HIGH EQU rNR14
488
489
490 ;***************************************************************************
491 ;*
492 ;* SoundChannel #2 registers
493 ;*
494 ;***************************************************************************
495
496 ; --
497 ; -- AUD2LEN/NR21 ($FF16)
498 ; -- Sound Length; Wave Pattern Duty (R/W)
499 ; --
500 ; -- see AUD1LEN for info
501 ; --
502 rNR21 EQU $FF16
503 rAUD2LEN EQU rNR21
504
505
506 ; --
507 ; -- AUD2ENV/NR22 ($FF17)
508 ; -- Envelope (R/W)
509 ; --
510 ; -- see AUD1ENV for info
511 ; --
512 rNR22 EQU $FF17
513 rAUD2ENV EQU rNR22
514
515
516 ; --
517 ; -- AUD2LOW/NR23 ($FF18)
518 ; -- Frequency lo (W)
519 ; --
520 rNR23 EQU $FF18
521 rAUD2LOW EQU rNR23
522
523
524 ; --
525 ; -- AUD2HIGH/NR24 ($FF19)
526 ; -- Frequency hi (W)
527 ; --
528 ; -- see AUD1HIGH for info
529 ; --
530 rNR24 EQU $FF19
531 rAUD2HIGH EQU rNR24
532
533
534 ;***************************************************************************
535 ;*
536 ;* SoundChannel #3 registers
537 ;*
538 ;***************************************************************************
539
540 ; --
541 ; -- AUD3ENA/NR30 ($FF1A)
542 ; -- Sound on/off (R/W)
543 ; --
544 ; -- Bit 7 - Sound ON/OFF (1EQUON,0EQUOFF)
545 ; --
546 rNR30 EQU $FF1A
547 rAUD3ENA EQU rNR30
548
549
550 ; --
551 ; -- AUD3LEN/NR31 ($FF1B)
552 ; -- Sound length (R/W)
553 ; --
554 ; -- Bit 7-0 - Sound length
555 ; --
556 rNR31 EQU $FF1B
557 rAUD3LEN EQU rNR31
558
559
560 ; --
561 ; -- AUD3LEVEL/NR32 ($FF1C)
562 ; -- Select output level
563 ; --
564 ; -- Bit 6-5 - Select output level
565 ; -- 00: 0/1 (mute)
566 ; -- 01: 1/1
567 ; -- 10: 1/2
568 ; -- 11: 1/4
569 ; --
570 rNR32 EQU $FF1C
571 rAUD3LEVEL EQU rNR32
572
573
574 ; --
575 ; -- AUD3LOW/NR33 ($FF1D)
576 ; -- Frequency lo (W)
577 ; --
578 ; -- see AUD1LOW for info
579 ; --
580 rNR33 EQU $FF1D
581 rAUD3LOW EQU rNR33
582
583
584 ; --
585 ; -- AUD3HIGH/NR34 ($FF1E)
586 ; -- Frequency hi (W)
587 ; --
588 ; -- see AUD1HIGH for info
589 ; --
590 rNR34 EQU $FF1E
591 rAUD3HIGH EQU rNR34
592
593
594 ; --
595 ; -- AUD4LEN/NR41 ($FF20)
596 ; -- Sound length (R/W)
597 ; --
598 ; -- Bit 5-0 - Sound length data (# 0-63)
599 ; --
600 rNR41 EQU $FF20
601 rAUD4LEN EQU rNR41
602
603
604 ; --
605 ; -- AUD4ENV/NR42 ($FF21)
606 ; -- Envelope (R/W)
607 ; --
608 ; -- see AUD1ENV for info
609 ; --
610 rNR42 EQU $FF21
611 rAUD4ENV EQU rNR42
612
613
614 ; --
615 ; -- AUD4POLY/NR43 ($FF22)
616 ; -- Polynomial counter (R/W)
617 ; --
618 ; -- Bit 7-4 - Selection of the shift clock frequency of the (scf)
619 ; -- polynomial counter (0000-1101)
620 ; -- freqEQUdrf*1/2^scf (not sure)
621 ; -- Bit 3 - Selection of the polynomial counter's step
622 ; -- 0: 15 steps
623 ; -- 1: 7 steps
624 ; -- Bit 2-0 - Selection of the dividing ratio of frequencies (drf)
625 ; -- 000: f/4 001: f/8 010: f/16 011: f/24
626 ; -- 100: f/32 101: f/40 110: f/48 111: f/56 (fEQU4.194304 Mhz)
627 ; --
628 rNR43 EQU $FF22
629 rAUD4POLY EQU rNR43
630
631
632 ; --
633 ; -- AUD4GO/NR44 ($FF23)
634 ; -- (has wrong name and value (ff30) in Dr.Pan's doc!)
635 ; --
636 ; -- Bit 7 - Inital
637 ; -- Bit 6 - Counter/consecutive selection
638 ; --
639 rNR44 EQU $FF23
640 rAUD4GO EQU rNR44 ; silly name!
641
642 ;***************************************************************************
643 ;*
644 ;* Cart related
645 ;*
646 ;***************************************************************************
647
648 CART_ROM EQU 0 ; ROM
649 CART_ROM_MBC1 EQU 1 ; ROM+MBC1
650 CART_ROM_MBC1_RAM EQU 2 ; ROM+MBC1+RAM
651 CART_ROM_MBC1_RAM_BAT EQU 3 ; ROM+MBC1+RAM+BATTERY
652 CART_ROM_MBC2 EQU 5 ; ROM+MBC2
653 CART_ROM_MBC2_BAT EQU 6 ; ROM+MBC2+BATTERY
654 CART_ROM_RAM EQU 8 ; ROM+RAM
655 CART_ROM_RAM_BAT EQU 9 ; ROM+RAM+BATTERY
656 CART_ROM_MMM EQU $b ; ROM+MMM01
657 CART_ROM_RAM_MMM EQU $c ; ROM+RAM+MMM01
658 CART_ROM_RAM_MMM_BAT EQU $d ; ROM+RAM+MMM01+BATTERY
659 CART_ROM_MBC3_TIM_BAT EQU $f ; ROM+MBC3+TIMER+BATTERY
660 CART_ROM_MBC3_TIM_RAM_BAT EQU $10 ; ROM+MBC3+TIMER+RAM+BATTERY
661 CART_ROM_MBC3 EQU $11 ; ROM+MBC3
662 CART_ROM_MBC3_RAM EQU $12 ; ROM+MBC3+RAM
663 CART_ROM_MBC3_RAM_BAT EQU $13 ; ROM+MBC3+RAM+BATTERY
664 CART_ROM_MBC4 EQU $15 ; ROM+MBC4
665 CART_ROM_MBC4_RAM EQU $16 ; ROM+MBC4+RAM
666 CART_ROM_MBC4_RAM_BAT EQU $17 ; ROM+MBC4+RAM+BATTERY
667 CART_ROM_MBC5 EQU $19 ; ROM+MBC5
668 CART_ROM_MBC5_RAM EQU $1a ; ROM+MBC5+RAM
669 CART_ROM_MBC5_RAM_BAT EQU $1b ; ROM+MBC5+RAM+BATTERY
670 CART_ROM_MBC5_RUM EQU $1c ; ROM+MBC5+RUMBLE
671 CART_ROM_MBC5_RUM_RAM EQU $1d ; ROM+MBC5+RUMBLE+RAM
672 CART_ROM_MBC5_RUM_RAM_BAT EQU $1e ; ROM+MBC5+RUMBLE+RAM+BATTERY
673 CART_CAMERA EQU $fc ; Camera ROM
674 CART_TAMA5 EQU $fd ; Bandai Tama 5
675 CART_HuC3 EQU $fe ; HuC3
676 CART_HuC1_RAM_BAT EQU $ff ; HuC1+RAM+BATTERY
677
678 CART_ROM_256K EQU 0
679 CART_ROM_512K EQU 1
680 CART_ROM_1M EQU 2
681 CART_ROM_2M EQU 3
682 CART_ROM_4M EQU 4
683 CART_ROM_8M EQU 5
684 CART_ROM_16M EQU 6
685
686 CART_RAM_NONE EQU 0
687 CART_RAM_16K EQU 1
688 CART_RAM_64K EQU 2
689 CART_RAM_256K EQU 3
690
691 CART_RAM_ENABLE EQU $0a
692 CART_RAM_DISABLE EQU $00
693
694 ;***************************************************************************
695 ;*
696 ;* Keypad related
697 ;*
698 ;***************************************************************************
699
700 PADF_DOWN EQU $80
701 PADF_UP EQU $40
702 PADF_LEFT EQU $20
703 PADF_RIGHT EQU $10
704 PADF_START EQU $08
705 PADF_SELECT EQU $04
706 PADF_B EQU $02
707 PADF_A EQU $01
708
709 PADB_DOWN EQU $7
710 PADB_UP EQU $6
711 PADB_LEFT EQU $5
712 PADB_RIGHT EQU $4
713 PADB_START EQU $3
714 PADB_SELECT EQU $2
715 PADB_B EQU $1
716 PADB_A EQU $0
717
718 ;***************************************************************************
719 ;*
720 ;* Screen related
721 ;*
722 ;***************************************************************************
723
724 SCRN_X EQU 160 ; Width of screen in pixels
725 SCRN_Y EQU 144 ; Height of screen in pixels
726 SCRN_X_B EQU 20 ; Width of screen in bytes
727 SCRN_Y_B EQU 18 ; Height of screen in bytes
728
729 SCRN_VX EQU 256 ; Virtual width of screen in pixels
730 SCRN_VY EQU 256 ; Virtual height of screen in pixels
731 SCRN_VX_B EQU 32 ; Virtual width of screen in bytes
732 SCRN_VY_B EQU 32 ; Virtual height of screen in bytes
733
734 NINTENDO_LOGO: MACRO
735 ;*
736 ;* Nintendo scrolling logo
737 ;* (Code won't work on a real GameBoy)
738 ;* (if next six lines are altered.)
739 DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D
740 DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99
741 DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E
742 ENDM
743
744 ENDC ;HARDWARE_INC
ModifiedUnitMain.lfm +7−6
@@ -1,13 +1,14 @@
1 object frmGameboy: TfrmGameboy 1 object frmGameboy: TfrmGameboy
2 Left = 1200 2 Left = 1519
3 Height = 354 3 Height = 354
4 Top = 83 4 Top = 129
5 Width = 318 5 Width = 318
6 Caption = 'Gameboy' 6 Caption = 'Gameboy'
7 ClientHeight = 334 7 ClientHeight = 324
8 ClientWidth = 318 8 ClientWidth = 318
9 Color = clYellow 9 Color = clYellow
10 DefaultMonitor = dmMainForm 10 DefaultMonitor = dmMainForm
11 DesignTimePPI = 144
11 Font.CharSet = ANSI_CHARSET 12 Font.CharSet = ANSI_CHARSET
12 Font.Color = clWindowText 13 Font.Color = clWindowText
13 Font.Height = -12 14 Font.Height = -12
@@ -24,8 +25,8 @@ object frmGameboy: TfrmGameboy
24 LCLVersion = '1.8.4.0' 25 LCLVersion = '1.8.4.0'
25 object StatusBar: TStatusBar 26 object StatusBar: TStatusBar
26 Left = 0 27 Left = 0
27 Height = 23 28 Height = 36
28 Top = 311 29 Top = 288
29 Width = 318 30 Width = 318
30 Panels = < 31 Panels = <
31 item 32 item
@@ -45,7 +46,7 @@ object frmGameboy: TfrmGameboy
45 end 46 end
46 object PaintBox1: TPaintBox 47 object PaintBox1: TPaintBox
47 Left = 0 48 Left = 0
48 Height = 311 49 Height = 288
49 Top = 0 50 Top = 0
50 Width = 318 51 Width = 318
51 Align = alClient 52 Align = alClient
ModifiedUnitMain.pas +57−41
@@ -14,7 +14,7 @@ unit UnitMain;
14 interface 14 interface
15 15
16 uses 16 uses
17 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 17 Windows, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
18 lcl_out, vars, z80cpu, mainloop, machine, debugger, sound, 18 lcl_out, vars, z80cpu, mainloop, machine, debugger, sound,
19 StdCtrls, ExtCtrls, ComCtrls, Menus; 19 StdCtrls, ExtCtrls, ComCtrls, Menus;
20 20
@@ -130,12 +130,15 @@ type
130 { Private-Deklarationen} 130 { Private-Deklarationen}
131 fullwindow: boolean; 131 fullwindow: boolean;
132 FDiff: integer; // Caption Height 132 FDiff: integer; // Caption Height
133 procedure Emulation(var msg: TMessage); message wm_user; 133 RomFile: String;
134
135 procedure Emulation;
134 procedure SetWindow; 136 procedure SetWindow;
135 procedure LoadRom(Rom: String); 137 procedure LoadRom(Rom: String);
136 138
137 procedure ShowCaption; 139 procedure ShowCaption;
138 procedure RemoveCaption; 140 procedure RemoveCaption;
141
139 public 142 public
140 { Public-Deklarationen} 143 { Public-Deklarationen}
141 timervar: byte; 144 timervar: byte;
@@ -203,7 +206,7 @@ const
203 CyclesPerFrame : Integer = 70224; 206 CyclesPerFrame : Integer = 70224;
204 TimePerFrame: Double = 1.0 / 60.0; 207 TimePerFrame: Double = 1.0 / 60.0;
205 208
206 procedure TfrmGameboy.Emulation(var Msg: TMessage); 209 procedure TfrmGameboy.Emulation;
207 var 210 var
208 li: Large_Integer; 211 li: Large_Integer;
209 tickFreq, cycles: Integer; 212 tickFreq, cycles: Integer;
@@ -223,10 +226,16 @@ begin
223 application.ProcessMessages; 226 application.ProcessMessages;
224 227
225 // Pause 228 // Pause
226 if f_stopped then 229 if f_stopped then begin
227 while f_stopped do 230 while f_stopped do
228 application.ProcessMessages; 231 application.ProcessMessages;
229 232
233 frameEnd := 0;
234
235 QueryPerformanceCounter(@li);
236 frameStart := li.QuadPart;
237 end;
238
230 while (cycles < CyclesPerFrame) do 239 while (cycles < CyclesPerFrame) do
231 cycles += z80_decode; 240 cycles += z80_decode;
232 241
@@ -237,6 +246,7 @@ begin
237 frameEnd := li.QuadPart; 246 frameEnd := li.QuadPart;
238 247
239 frameElapsedInSec := (frameEnd - frameStart) / tickFreq; 248 frameElapsedInSec := (frameEnd - frameStart) / tickFreq;
249 sleep(1);
240 until (frameElapsedInSec > TimePerFrame) and (not SoundBufferTooFull); 250 until (frameElapsedInSec > TimePerFrame) and (not SoundBufferTooFull);
241 251
242 frameStart := frameEnd; 252 frameStart := frameEnd;
@@ -256,6 +266,8 @@ begin
256 gb_speed := 1; 266 gb_speed := 1;
257 loadstat.Enabled := True; 267 loadstat.Enabled := True;
258 savestat.Enabled := True; 268 savestat.Enabled := True;
269
270 RomFile := Rom;
259 end; 271 end;
260 272
261 procedure TfrmGameboy.FileOpenClick(Sender: TObject); 273 procedure TfrmGameboy.FileOpenClick(Sender: TObject);
@@ -294,10 +306,12 @@ begin
294 306
295 frmGameboy.DoubleBuffered := True; 307 frmGameboy.DoubleBuffered := True;
296 SetPaintBox(PaintBox1); 308 SetPaintBox(PaintBox1);
297 postmessage(handle, wm_user, 0, 0);
298 309
310 //postmessage(handle, wm_user, 0, 0);
299 if ParamCount >= 1 then 311 if ParamCount >= 1 then
300 LoadRom(ParamStr(1)); 312 LoadRom(ParamStr(1));
313
314 Emulation;
301 end; 315 end;
302 316
303 procedure TfrmGameboy.Exit1Click(Sender: TObject); 317 procedure TfrmGameboy.Exit1Click(Sender: TObject);
@@ -355,6 +369,7 @@ begin
355 VK_DOWN: k_down := 1; 369 VK_DOWN: k_down := 1;
356 VK_LEFT: k_left := 1; 370 VK_LEFT: k_left := 1;
357 VK_RIGHT: k_right := 1; 371 VK_RIGHT: k_right := 1;
372 Ord('R'): LoadRom(RomFile);
358 end; 373 end;
359 end; 374 end;
360 375
@@ -387,43 +402,44 @@ begin
387 end; 402 end;
388 403
389 procedure TfrmGameboy.setPriority(Sender: TObject); 404 procedure TfrmGameboy.setPriority(Sender: TObject);
390 var
391 ProcessID: DWORD;
392 ProcessHandle: THandle;
393 Priority: integer;
394 begin 405 begin
395 { HIGH_PRIORITY_CLASS, 406 //var
396 IDLE_PRIORITY_CLASS, 407 // ProcessID: DWORD;
397 NORMAL_PRIORITY_CLASS 408 // ProcessHandle: THandle;
398 REALTIME_PRIORITY_CLASS} 409 // Priority: integer;
399 {THREAD_PRIORITY_ABOVE_NORMAL, 410 //begin
400 THREAD_PRIORITY_BELOW_NORMAL, 411 //{ HIGH_PRIORITY_CLASS,
401 THREAD_PRIORITY_HIGHEST, 412 // IDLE_PRIORITY_CLASS,
402 THREAD_PRIORITY_IDLE, 413 // NORMAL_PRIORITY_CLASS
403 THREAD_PRIORITY_LOWEST, 414 // REALTIME_PRIORITY_CLASS}
404 THREAD_PRIORITY_NORMAL, 415 //{THREAD_PRIORITY_ABOVE_NORMAL,
405 THREAD_PRIORITY_TIME_CRITICAL} 416 // THREAD_PRIORITY_BELOW_NORMAL,
406 417 // THREAD_PRIORITY_HIGHEST,
407 priority1.Checked := False; 418 // THREAD_PRIORITY_IDLE,
408 priority2.Checked := False; 419 // THREAD_PRIORITY_LOWEST,
409 priority3.Checked := False; 420 // THREAD_PRIORITY_NORMAL,
410 priority4.Checked := False; 421 // THREAD_PRIORITY_TIME_CRITICAL}
411 tmenuitem(Sender).Checked := True; 422 //
412 423 // priority1.Checked := False;
413 if Sender = priority1 then 424 // priority2.Checked := False;
414 priority := IDLE_PRIORITY_CLASS; 425 // priority3.Checked := False;
415 if Sender = priority2 then 426 // priority4.Checked := False;
416 priority := NORMAL_PRIORITY_CLASS; 427 // tmenuitem(Sender).Checked := True;
417 if Sender = priority3 then 428 //
418 priority := HIGH_PRIORITY_CLASS; 429 // if Sender = priority1 then
419 if Sender = priority4 then 430 // priority := IDLE_PRIORITY_CLASS;
420 priority := REALTIME_PRIORITY_CLASS; 431 // if Sender = priority2 then
421 432 // priority := NORMAL_PRIORITY_CLASS;
422 ProcessID := GetCurrentProcessID; 433 // if Sender = priority3 then
423 ProcessHandle := OpenProcess(PROCESS_SET_INFORMATION, False, ProcessID); 434 // priority := HIGH_PRIORITY_CLASS;
424 SetPriorityClass(ProcessHandle, Priority); 435 // if Sender = priority4 then
425 { ThreadHandle := GetCurrentThread; 436 // priority := REALTIME_PRIORITY_CLASS;
426 SetThreadPriority(ThreadHandle, THREAD_PRIORITY_HIGHEST);} 437 //
438 // ProcessID := GetCurrentProcessID;
439 // ProcessHandle := OpenProcess(PROCESS_SET_INFORMATION, False, ProcessID);
440 // SetPriorityClass(ProcessHandle, Priority);
441 //{ ThreadHandle := GetCurrentThread;
442 // SetThreadPriority(ThreadHandle, THREAD_PRIORITY_HIGHEST);}
427 end; 443 end;
428 444
429 procedure TfrmGameboy.setResolution(Sender: TObject); 445 procedure TfrmGameboy.setResolution(Sender: TObject);
Addedbuild.bat +11−0
@@ -0,0 +1,11 @@
1 @echo off
2 rgbasm -odriver.obj driver.z80
3 if %errorlevel% neq 0 call :exit 1
4 rgblink -mgame.map -ndriver.sym -odriver.gb driver.obj
5 if %errorlevel% neq 0 call :exit 1
6 rgbfix -p0 -v driver.gb
7 if %errorlevel% neq 0 call :exit 1
8 call :exit 0
9
10 :exit
11 exit
Addedconstants.inc +75−0
@@ -0,0 +1,75 @@
1 ;; hUGETracker constants
2 ;; Written by SuperDisk 2019
3
4 C3 EQU 0
5 C#3 EQU 1
6 D3 EQU 2
7 D#3 EQU 3
8 E3 EQU 4
9 F3 EQU 5
10 F#3 EQU 6
11 G3 EQU 7
12 G#3 EQU 8
13 A3 EQU 9
14 A#3 EQU 10
15 B3 EQU 11
16 C4 EQU 12
17 C#4 EQU 13
18 D4 EQU 14
19 D#4 EQU 15
20 E4 EQU 16
21 F4 EQU 17
22 F#4 EQU 18
23 G4 EQU 19
24 G#4 EQU 20
25 A4 EQU 21
26 A#4 EQU 22
27 B4 EQU 23
28 C5 EQU 24
29 C#5 EQU 25
30 D5 EQU 26
31 D#5 EQU 27
32 E5 EQU 28
33 F5 EQU 29
34 F#5 EQU 30
35 G5 EQU 31
36 G#5 EQU 32
37 A5 EQU 33
38 A#5 EQU 34
39 B5 EQU 35
40 C6 EQU 36
41 C#6 EQU 37
42 D6 EQU 38
43 D#6 EQU 39
44 E6 EQU 40
45 F6 EQU 41
46 F#6 EQU 42
47 G6 EQU 43
48 G#6 EQU 44
49 A6 EQU 45
50 A#6 EQU 46
51 B6 EQU 47
52 C7 EQU 48
53 C#7 EQU 49
54 D7 EQU 50
55 D#7 EQU 51
56 E7 EQU 52
57 F7 EQU 53
58 F#7 EQU 54
59 G7 EQU 55
60 G#7 EQU 56
61 A7 EQU 57
62 A#7 EQU 58
63 B7 EQU 59
64 C8 EQU 60
65 C#8 EQU 61
66 D8 EQU 62
67 D#8 EQU 63
68 E8 EQU 64
69 F8 EQU 65
70 F#8 EQU 66
71 G8 EQU 67
72 G#8 EQU 68
73 A8 EQU 69
74 A#8 EQU 70
75 B8 EQU 71
Addeddebug_macros.inc +6−0
@@ -0,0 +1,6 @@
1 ;; hUGETracker playback macros
2 ;; Written by SuperDisk 2019
3
4 print_a: MACRO
5 db $fd
6 ENDM
Addeddriver.z80 +337−0
@@ -0,0 +1,337 @@
1 ;; hUGETracker playback routine
2 ;; Written by SuperDisk 2019
3
4 include "hardware.inc"
5 include "constants.inc"
6 include "debug_macros.inc"
7
8 ; Constants
9 STACK_SIZE EQU $200
10 SCREEN_WIDTH_TILES EQU 20
11 CANVAS_WIDTH_TILES EQU 32
12 SCREEN_HEIGHT_TILES EQU 18
13 CANVAS_HEIGHT_TILES EQU 32
14
15 ; $0000 - $003F: RST handlers.
16
17 SECTION "restarts", ROM0[$0000]
18 ret
19 REPT 7
20 nop
21 ENDR
22 ; $0008
23 ret
24 REPT 7
25 nop
26 ENDR
27 ; $0010
28 ret
29 REPT 7
30 nop
31 ENDR
32 ; $0018
33 ret
34 REPT 7
35 nop
36 ENDR
37 ; $0020
38 ret
39 REPT 7
40 nop
41 ENDR
42 ; $0028
43 ret
44 REPT 7
45 nop
46 ENDR
47 ; $0030
48 ret
49 REPT 7
50 nop
51 ENDR
52 ; $0038
53 ret
54 REPT 7
55 nop
56 ENDR
57
58 ; Interrupt addresses
59 SECTION "Vblank interrupt", ROM0[$0040]
60 jp _dosound
61 reti
62
63 SECTION "LCD controller status interrupt", ROM0[$0048]
64 reti
65
66 SECTION "Timer overflow interrupt", ROM0[$0050]
67 jp _dosound
68 reti
69
70 SECTION "Serial transfer completion interrupt", ROM0[$0058]
71 reti
72
73 SECTION "P10-P13 signal low edge interrupt", ROM0[$0060]
74 jp _dosound
75
76 ; Reserved stack space
77 SECTION "Stack", WRAM0[$d000 - STACK_SIZE]
78 ds STACK_SIZE
79
80
81 ; Control starts here, but there's more ROM header several bytes later, so the
82 ; only thing we can really do is immediately jump to after the header
83 SECTION "init", ROM0[$0100]
84 nop
85 jp $0150
86
87 SECTION "romname", ROM0[$0134]
88 ; $0134 - $013E: The title, in upper-case letters, followed by zeroes.
89 DB "HUGE"
90 DS 7 ; padding
91 ; $013F - $0142: The manufacturer code. Empty for now
92 DS 4
93 DS 1
94 ; $0144 - $0145: "New" Licensee Code, a two character name.
95 DB "NF"
96
97 SECTION "Shit", ROM0
98 sequence:
99 db A#5
100 db A#4
101 db F5
102 db A#5
103 db G#5
104 db A#4
105 db F5
106 db G#5
107 db G5
108 db A#4
109 db D#5
110 db G5
111 db G#5
112 db A#4
113 db F5
114 db G#5
115 db A#5
116 db A#4
117 db F5
118 db A#5
119 db G#5
120 db A#4
121 db F5
122 db G#5
123 db G5
124 db A#4
125 db D#5
126 db G5
127 db G#5
128 db A#4
129 db F5
130 db G#5
131 db A#5
132 db A#4
133 db F5
134 db A#5
135 db G#5
136 db A#4
137 db F5
138 db G#5
139 db G5
140 db A#4
141 db D#5
142 db G5
143 db G#5
144 db A#4
145 db F5
146 db G#5
147 db A#5
148 db A#4
149 db F5
150 db A#5
151 db G#5
152 db A#4
153 db F5
154 db G#5
155 db G5
156 db A#4
157 db D#5
158 db G5
159 db G#5
160 db A#4
161 db F5
162 db G#5
163
164
165 db F4
166 db G#4
167 db C5
168 db F5
169 db G#5
170 db F5
171 db C5
172 db G#4
173 db F4
174 db G#4
175 db C5
176 db F5
177 db G#5
178 db F5
179 db C5
180 db G#4
181 db F4
182 db C5
183 db D#5
184 db G#5
185 db C6
186 db G#5
187 db D#5
188 db C5
189 db G#4
190 db C5
191 db D#5
192 db G#5
193 db C6
194 db G#5
195 db D#5
196 db C5
197 db A#4
198 db D5
199 db F5
200 db A#5
201 db D6
202 db A#5
203 db F5
204 db D5
205 db A#4
206 db D5
207 db F5
208 db A#5
209 db D6
210 db A#5
211 db F5
212 db D5
213 db F4
214 db C5
215 db F5
216 db C6
217 db F6
218 db C6
219 db F5
220 db C5
221 db F4
222 db C5
223 db F5
224 db C6
225 db F6
226 db C6
227 db F5
228 db C5
229
230 SECTION "Ram Shit", WRAM0
231 counter: ds 1
232 tick: ds 1
233
234 ; Initialization and whatnot
235 SECTION "main", ROM0[$0150]
236 di
237
238 ; Set LCD palette for grayscale mode; yes, it has a palette
239 ld a, %11100100
240 ld [$FF00+$47], a
241
242 ;; Fill with vertical bars
243 ld hl, $8000
244 ld bc, `01201201
245 REPT 8
246 ld a, b
247 ld [hl+], a
248 ld a, c
249 ld [hl+], a
250 ENDR
251
252 ; Enable sound globally
253 ld a, $80
254 ldh [rAUDENA], a
255 ; Enable channel 1 in stereo
256 ld a, $11
257 ldh [rAUDTERM], a
258 ; Set volume
259 ld a, $77
260 ldh [rAUDVOL], a
261
262 ;; enable the timer
263 ld a, TACF_START | TACF_4KHZ
264 ld [rTAC], a
265
266 ld a, IEF_VBLANK ; IEF_HILO | IEF_TIMER
267 ld [rIE], a
268 ei
269
270 jp _halt
271
272 _dosound:
273 ld a, [tick]
274 cp 6
275 jp z, _continue
276 inc a
277 ld [tick], a
278 reti
279 _continue:
280 ld a, 0
281 ld [tick], a
282
283 ld a, [counter]
284
285 ld h, 0
286 ld l, a
287 ld de, sequence
288 add hl, de
289 ld a, [hl]
290
291 ;; A now contains the note thing.. need to look it up in the table now
292
293 add a, a ;; double it to get index into hi/lo table
294
295 LD H, 0
296 LD L, A
297 LD DE, note_table
298 ADD HL, DE
299 LD A, [HL]
300 INC HL
301 LD H, [HL]
302 LD L, A
303
304 ; ld a, $1e
305 ; ldh [rAUD1SWEEP], a
306 ld a, %10111111 ; $10
307 ldh [rAUD1LEN], a
308 ld a, %11110000
309 ldh [rAUD1ENV], a
310
311 ld a, l
312 ldh [rAUD1LOW], a
313 ; ld a, %10000000
314 ld a, h
315 or %10000000
316 ldh [rAUD1HIGH], a
317
318 ld a, [counter]
319 inc a
320
321 cp 128
322 jp c, skip
323 ld a, 0
324 skip:
325 ld [counter], a
326
327 reti
328
329 _halt:
330 ; Do nothing, forever
331 halt
332 nop
333 jr _halt
334
335 SECTION "Note Table", ROM0
336 note_table:
337 include "music.inc"
Addedeevee_resamp.py +48−0
@@ -0,0 +1,48 @@
1 import wave
2 import sys
3
4 sys.argv.append('808nokickbreak.wav')
5
6 TARGET_RATE = int(8192)
7
8 with wave.open(sys.argv[1]) as w:
9 nchannels, sample_width, framerate, nframes, _, _ = w.getparams()
10 outdata = bytearray()
11 gbdata = bytearray()
12
13 frames_per_note = framerate // TARGET_RATE
14 nybble = None
15 while True:
16 data = w.readframes(frames_per_note)
17 if not data:
18 break
19
20 n = 0
21 total = 0
22 # Left and right channels are interleaved; this will pick up data from only channel 0
23 for i in range(0, len(data), nchannels * sample_width):
24 frame = int.from_bytes(data[i : i + sample_width], 'little', signed=True)
25 n += 1
26 total += frame
27
28 # Crush the new sample to a nybble
29 crushed_frame = int(total / n) >> (sample_width * 8 - 4)
30 # Expand it back to the full sample size, to make a WAV simulating how it should sound
31 encoded_crushed_frame = (crushed_frame << (sample_width * 8 - 4)).to_bytes(2, 'little', signed=True)
32 outdata.extend(encoded_crushed_frame * (nchannels * frames_per_note))
33
34 # Combine every two nybbles together. The manual shows that the high nybble plays first.
35 # WAV data is signed, but Game Boy nybbles are not, so add the rough midpoint of 7
36 if nybble is None:
37 nybble = crushed_frame + 7
38 else:
39 byte = (nybble << 4) | (crushed_frame + 7)
40 #gbdata.append(byte)
41 nybble = None
42
43 with wave.open(f'{sys.argv[1]}crush.wav', 'wb') as wout:
44 wout.setparams(w.getparams())
45 wout.writeframes(outdata)
46
47 with open(f'{sys.argv[1]}crush.dat', 'wb') as f:
48 f.write(gbdata)
Addedmusic.inc +81−0
@@ -0,0 +1,81 @@
1 ;; hUGETracker note table.
2 ;; Written by SuperDisk 2019
3
4 ;; Gameboy sound frequences are represented as 11 byte periods.
5 ;; this note table was generated from http://www.devrs.com/gb/files/sndtab.html
6
7 ;; Since they're 11 bytes, and to avoid doing a bunch of anding and shuffling stuff
8 ;; through HL at playtime, we store them here for a total of 142 bytes of rom.
9
10 db 44, 0 ;; C_3 = 44
11 db 156, 0 ;; C#_3 = 156
12 db 6, 1 ;; D_3 = 7
13 db 107, 1 ;; D#_3 = 107
14 db 201, 1 ;; E_3 = 201
15 db 35, 2 ;; F_3 = 35
16 db 119, 2 ;; F#_3 = 119
17 db 198, 2 ;; G_3 = 198
18 db 18, 3 ;; G#_3 = 19
19 db 86, 3 ;; A_3 = 87
20 db 155, 3 ;; A#_3 = 155
21 db 218, 3 ;; B_3 = 219
22 db 22, 4 ;; C_4 = 22
23 db 78, 4 ;; C#_4 = 78
24 db 131, 4 ;; D_4 = 135
25 db 181, 4 ;; D#_4 = 181
26 db 229, 4 ;; E_4 = 229
27 db 17, 5 ;; F_4 = 21
28 db 59, 5 ;; F#_4 = 63
29 db 99, 5 ;; G_4 = 103
30 db 137, 5 ;; G#_4 = 141
31 db 172, 5 ;; A_4 = 173
32 db 206, 5 ;; A#_4 = 207
33 db 237, 5 ;; B_4 = 237
34 db 10, 6 ;; C_5 = 14
35 db 39, 6 ;; C#_5 = 39
36 db 66, 6 ;; D_5 = 70
37 db 91, 6 ;; D#_5 = 95
38 db 114, 6 ;; E_5 = 118
39 db 137, 6 ;; F_5 = 143
40 db 158, 6 ;; F#_5 = 158
41 db 178, 6 ;; G_5 = 182
42 db 196, 6 ;; G#_5 = 198
43 db 214, 6 ;; A_5 = 214
44 db 231, 6 ;; A#_5 = 231
45 db 247, 6 ;; B_5 = 247
46 db 6, 7 ;; C_6 = 7
47 db 20, 7 ;; C#_6 = 23
48 db 33, 7 ;; D_6 = 39
49 db 45, 7 ;; D#_6 = 47
50 db 57, 7 ;; E_6 = 63
51 db 68, 7 ;; F_6 = 71
52 db 79, 7 ;; F#_6 = 79
53 db 89, 7 ;; G_6 = 95
54 db 98, 7 ;; G#_6 = 103
55 db 107, 7 ;; A_6 = 111
56 db 115, 7 ;; A#_6 = 119
57 db 123, 7 ;; B_6 = 127
58 db 131, 7 ;; C_7 = 135
59 db 138, 7 ;; C#_7 = 143
60 db 144, 7 ;; D_7 = 151
61 db 151, 7 ;; D#_7 = 151
62 db 157, 7 ;; E_7 = 159
63 db 162, 7 ;; F_7 = 167
64 db 167, 7 ;; F#_7 = 167
65 db 172, 7 ;; G_7 = 175
66 db 177, 7 ;; G#_7 = 183
67 db 182, 7 ;; A_7 = 183
68 db 186, 7 ;; A#_7 = 191
69 db 190, 7 ;; B_7 = 191
70 db 193, 7 ;; C_8 = 199
71 db 196, 7 ;; C#_8 = 199
72 db 200, 7 ;; D_8 = 207
73 db 203, 7 ;; D#_8 = 207
74 db 206, 7 ;; E_8 = 207
75 db 209, 7 ;; F_8 = 215
76 db 212, 7 ;; F#_8 = 215
77 db 214, 7 ;; G_8 = 215
78 db 217, 7 ;; G#_8 = 223
79 db 219, 7 ;; A_8 = 223
80 db 221, 7 ;; A#_8 = 223
81 db 223, 7 ;; B_8 = 223