aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile8
-rw-r--r--src/example/gb.asm86
-rw-r--r--src/gbout.c40
3 files changed, 77 insertions, 57 deletions
diff --git a/src/Makefile b/src/Makefile
index 6ac1bdf..baadcb4 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -79,14 +79,14 @@ clean:
alias.o: alias.c global.h basetype.h util.h state.h alias.h
casm.o: casm.c global.h basetype.h util.h state.h expr.h label.h macro.h \
cmd.h parse.h codepage.h stack.h listing.h alias.h output.h rawout.h \
- specout.h t64out.h zx81out.h z80.h 6502.h gbcpu.h
+ specout.h t64out.h zx81out.h gbout.h z80.h 6502.h gbcpu.h
codepage.o: codepage.c global.h basetype.h util.h state.h codepage.h \
parse.h cmd.h
expr.o: expr.c global.h basetype.h util.h state.h expr.h label.h
gbcpu.o: gbcpu.c global.h basetype.h util.h state.h expr.h label.h \
parse.h cmd.h codepage.h varchar.h gbcpu.h
-gbout.o: gbout.c global.h basetype.h util.h state.h codepage.h parse.h \
- cmd.h gbout.h
+gbout.o: gbout.c global.h basetype.h util.h state.h expr.h codepage.h \
+ parse.h cmd.h gbout.h
label.o: label.c global.h basetype.h util.h state.h codepage.h parse.h \
cmd.h stack.h label.h
listing.o: listing.c global.h basetype.h util.h state.h label.h macro.h \
@@ -94,7 +94,7 @@ listing.o: listing.c global.h basetype.h util.h state.h label.h macro.h \
macro.o: macro.c global.h basetype.h util.h state.h codepage.h parse.h \
cmd.h varchar.h macro.h
output.o: output.c global.h basetype.h util.h state.h output.h parse.h \
- cmd.h rawout.h specout.h t64out.h zx81out.h
+ cmd.h rawout.h specout.h t64out.h zx81out.h gbout.h
parse.o: parse.c global.h basetype.h util.h state.h codepage.h parse.h \
cmd.h
rawout.o: rawout.c global.h basetype.h util.h state.h rawout.h parse.h \
diff --git a/src/example/gb.asm b/src/example/gb.asm
index 10381e9..2f52e0e 100644
--- a/src/example/gb.asm
+++ b/src/example/gb.asm
@@ -1,22 +1,26 @@
+ ;
+ ; This example is poor, and leaves lots of junk lymg in memory.
+ ; Still, it works enough to test
+ ;
cpu gameboy
option output-file,gb.gb
option output-format,gameboy
- ;option gameboy-irq,vbl,vbl_code
+ option gameboy-irq,vbl,vbl_code
VRAM equ $8000
SCRN equ $9800
OAM equ $fe00
LCDC equ $ff40
STAT equ $ff41
+ISWITCH equ $ffff
BGRDPAL equ $ff47
OBJ0PAL equ $ff48
OBJ1PAL equ $ff49
CURLINE equ $ff44
-READY equ $ff81
XPOS equ $ff82
VBLANK macro
@@ -39,31 +43,29 @@ VBLANK macro
org $150
di
- xor a
- ldh (READY),a
ld sp,$fffe
- ; Set LCD so only sprites show
+ ; Switch of display during setup
;
VBLANK
+ xor a
+ ld (LCDC),a
+
+ ld (XPOS),a
- ld a,$81
- ldh (LCDC),a
- ld a,$10
- ldh (STAT),a
ld a,$e4
- ldh (BGRDPAL),a
ldh (OBJ0PAL),a
ldh (OBJ1PAL),a
- ; Copy to VRAM
+ swap a
+ ldh (BGRDPAL),a
+
+ ; Copy to VRAM and set up
;
ld hl,VRAM
ld de,sprite
ld c,16
- VBLANK
-
.copy
ld a,(de)
ld (hl+),a
@@ -71,12 +73,6 @@ VBLANK macro
dec c
jr nz,copy
- ld a,1
- ldh (READY),a
-
- ei
-
- VBLANK
; Set sprite numbers
;
@@ -92,9 +88,24 @@ VBLANK macro
ld (OAM+7),a
ld (OAM+11),a
+ ; Set LCD back on
+ ;
+ ld a,$83
+ ldh (LCDC),a
+
+ ; Activate VBL
+ ;
+ ld a,1
+ ldh (ISWITCH),a
+
+ ei
+
.idle
- VBLANK
+ halt
+ nop
+ jr idle
+vbl_code:
ldh a,(XPOS)
inc a
ldh (XPOS),a
@@ -110,23 +121,6 @@ VBLANK macro
ld (OAM+8),a
ld (OAM+9),a
- jr idle
-
-vbl_code:
- ldh a,(READY)
- or a
- jr z,finish
-
- ldh a,(XPOS)
- inc a
- ldh (XPOS),a
- ld (OAM),a
- ld (OAM+1),a
- xor a
- ld (OAM+2),a
- ld (OAM+3),a
-
-.finish
reti
sprite:
@@ -141,3 +135,21 @@ sprite:
defb $ff,$ff
defb $00,00
+ ;
+ ; Assembly checks
+ ;
+ stop
+ swap a
+ swap b
+ swap c
+ swap d
+ swap e
+ swap h
+ swap l
+ swap (hl)
+ ld a,(hl+)
+ ld a,(hli)
+ ldi a,(hl)
+ ld a,(hl-)
+ ld a,(hld)
+ ldd a,(hl)
diff --git a/src/gbout.c b/src/gbout.c
index 24e365a..71547f9 100644
--- a/src/gbout.c
+++ b/src/gbout.c
@@ -41,7 +41,6 @@ enum option_t
OPT_SUPER,
OPT_CART_RAM,
OPT_CART_TYPE,
- OPT_RST,
OPT_IRQ
};
@@ -51,7 +50,7 @@ static const ValueTable option_set[] =
{"gameboy-color", OPT_COLOUR},
{"gameboy-super", OPT_SUPER},
{"gameboy-cart-ram", OPT_CART_RAM},
- {"gameboy-cart-type", OPT_CART_RAM},
+ {"gameboy-cart-type", OPT_CART_TYPE},
{"gameboy-irq", OPT_IRQ},
{NULL}
};
@@ -193,8 +192,8 @@ int GBOutput(const char *filename, const char *filename_bank,
int f;
int offset;
int rom_size;
- unsigned global_csum = 0;
- unsigned hdr_csum = 0;
+ Word global_csum = 0;
+ Byte hdr_csum = 0;
Byte *mem;
if (!fp)
@@ -374,35 +373,43 @@ int GBOutput(const char *filename, const char *filename_bank,
/* Header checksum
*/
+ hdr_csum = 0;
+
for(f = 0x134 ; f < 0x14d; f++)
{
- hdr_csum -= mem[f] - 1;
+ hdr_csum = hdr_csum - mem[f] - 1u;
}
PokeB(mem, 0x14d, hdr_csum);
/* Global checksum
*/
+ global_csum = 0;
+
if (count == 1)
{
- for(f = 0; f < 0x8000; f++)
+ for(f = 0; f < 0x14e; f++)
{
- if (f < 0x14e || f > 0x14f)
- {
- global_csum += mem[f];
- }
+ global_csum += mem[f];
+ }
+
+ for(f = 0x150; f < 0x8000; f++)
+ {
+ global_csum += mem[f];
}
}
else
{
int r;
- for(f = 0; f < 0x4000; f++)
+ for(f = 0; f < 0x14e; f++)
{
- if (f < 0x14e || f > 0x14f)
- {
- global_csum += mem[f];
- }
+ global_csum += mem[f];
+ }
+
+ for(f = 0x150; f < 0x4000; f++)
+ {
+ global_csum += mem[f];
}
for(r = 1; r < count; r++)
@@ -414,7 +421,8 @@ int GBOutput(const char *filename, const char *filename_bank,
}
}
- PokeW(mem, 0x14e, global_csum);
+ PokeB(mem, 0x14e, global_csum >> 8);
+ PokeB(mem, 0x14f, global_csum);
/* Output the ROM contents
*/