Discussion about software development for the old-school Gameboys, ranging from the "Gray brick" to Gameboy Color
(Launched in 2008)
You are not logged in.
So I'm starting ASM for a new project and I just wanted to display a full GB screen.
This is my first time trying assembly so forgive me if there is a lot of mistakes.
The thing is, when I try to compile my program with RGBDS, it give me an error message at line 1 which is ".org $0000"...
I don't understand what's going on so if you guys can help me, it will be awesome !
I let you my code below
-----------------------------------------------------------------------------------------------
.org $0000
.org $0040 ; VBlank IRQ
reti ; do nothing
.org $0048 ; LCDC Status IRQ
reti ; Do nothing
.org $0050 ; Timer Owerflow
reti ; Do nothing
.org $0058 ; Serial Transfear Completion
reti ; Do nothing
.org $0060 ; Hmm, this is a wierd on
; Im not sure how this one works
; Transition from high to low
; of pin p10-p13
; I think Its a hardware thing
reti ; Do nothing
; Irqs done..
.org $0100
nop
jp start
.ORG $0104
;Logo Nintendo, obligatoire
.db $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C
.db $00,$0D,$00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6
.db $DD,$DD,$D9,$99,$BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC
.db $99,$9F,$BB,$B9,$33,$3E
.db "WUTR_TEST " ; Cart name 16bytes
.db $00,$00,$00 ; Not used
.db $00 ; Cart type ROM Only
.db $00 ; ROM Size 32k
.db $00 ; RAM Size 0k
.db $cf,$08 ; Maker ID Matthew Johnson
.db $01 ; Version =1
.db $DA ; Complement check (Important)
.db $ff,$ff ; Cheksum, fix this if you are going to
; run this in VGB, or simpy use the -NOCRC
; switch in the VGB-DOS command line.
;************************************************
; Code start here *
;************************************************
.org $150
start:
; This is addr $0150
ld sp,$fff4 ; Put the stack where the GB wants it
ld a,%00000001 ; No IRQs but VBlank <<<vblank interrupt on
ldh ($ff),a
sub a ; Misc standard init things..
ldh ($41),a ; LCDC Status
call waitvbl ; Must be in VBL before turning the screen off
ld a,%00000000 ; LCD Controller = Off (No picture on screen)
; WindowBank = $9800 (Not used)
; Window = OFF
; BG Chr = $8000
; BG Bank= $9800
; Sprites= 8x8 (Size Assembly, 1=8x16)
; Sprites= Off (Sprites on or off)
; BG = Off
ldh ($40),a
;****************************************
; Functions *
;****************************************
;****************************************
; setup *
;****************************************
setup:
ld bc,chrset
call mchar ; Moving background tiles
ld bc,chrmap
call map ; Moving background map
call nor_col ; Setting up palette
call waitvbl ; Must be in VBL before turning the screen off
ld a,%10001001 ; LCD Controller = On
; WindowBank = $9800 (Not used)
; Window = OFF
; BG Chr = $8000
; BG Bank= $9800
; Sprites= 8x8 (Size Assembly, 0=8x8)
; Sprites= Off
; BG = On
ldh ($40),a
;****************************************
; Wait for VBlank *
;****************************************
waitvbl:
.db $f0,$40 ; ld a,($40)
add a,a
ret nc
;****************************************
; Moving background tiles *
;****************************************
mchar:
ld hl,$8000
ld d,$00 ; move 256 bytes
ld e,$12 ; x2=512. Increase this value
; to copy more of the character set.
mchar_loop:
ldh a,($41) ; There are only certain times you
and 2 ; can write out scrn/tile. This
jr nz,mchar_loop ; loop waits for those times.
ld a,(bc)
ld (hli),a
inc bc
dec d
jp nz,mchar_loop
dec e
jp nz,mchar_loop
ret
;****************************************
; Moving background map *
;****************************************
map:
ld hl,$9800
ld d,$00
ld e,$04 ; 256*4=1024=32x32=One whole GB Screen
map_loop:
ldh a,($41) ; There are only certain times you
and 2 ; can write out scrn/tile. This
jr nz,map_loop ; loop waits for those times.
ld a,(bc)
ld (hli),a
inc bc
dec d
jp nz,map_loop
dec e
jp nz,map_loop
ret
;****************************************
; Setting up palette *
;****************************************
nor_col:
; Sets the colors to normal palette
ld a,%11100100 ; grey 3=11 (Black)
; grey 2=10 (Dark grey)
; grey 1=01 (Ligth grey)
; grey 0=00 (Transparent)
ldh ($47),a
ret
chrset:
#include "bkg_tiles.bin" ;my tiles
chrmap:
#include "bkg_map.inc" ;my map
.block $008000-$
.end start
Offline
I'm pretty sure that's WLA assembly, not RGBDS. https://github.com/vhelin/wla-dx
Offline
Yeah agreed. Definitely WLA assembly, not RGBDS.
Edit: to convert to RGBDS, change .db to db, and use SECTION headings instead of .org.
EDIT2: Here's the header info for a project I was working on, so you can see how I did it, etc. I copied the template from somewhere (ASMSchool, I think?), feel free to copy or whatever. Project at https://github.com/l0k1/superhappyfunbubbletime.
;* SUPER HAPPY FUN BUBBLE TIME
;*
;* Includes
;constants:
INCLUDE "globals.asm"
;* cartridge header
SECTION "Org $00",HOME[$00]
RST_00:
jp $100
SECTION "Org $08",HOME[$08]
RST_08:
jp $100
SECTION "Org $10",HOME[$10]
RST_10:
jp $100
SECTION "Org $18",HOME[$18]
RST_18:
jp $100
SECTION "Org $20",HOME[$20]
RST_20:
jp $100
SECTION "Org $28",HOME[$28]
RST_28:
jp $100
SECTION "Org $30",HOME[$30]
RST_30:
jp $100
SECTION "Org $38",HOME[$38]
RST_38:
jp $100
SECTION "V-Blank IRQ Vector",HOME[$40]
VBL_VECT:
call V_Blank_Int
reti
SECTION "LCD IRQ Vector",HOME[$48]
LCD_VECT:
reti
SECTION "Timer IRQ Vector",HOME[$50]
TIMER_VECT:
call Timer_Update
reti
SECTION "Serial IRQ Vector",HOME[$58]
SERIAL_VECT:
reti
SECTION "Joypad IRQ Vector",HOME[$60]
JOYPAD_VECT:
call Controller ;in seperate file named "controller.asm"
reti
SECTION "Start",HOME[$100]
nop
jp Main
; $0104-$0133 (Nintendo logo - do _not_ modify the logo data here or the GB will not run the program)
DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D
DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99
DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E
; $0134-$013E (Game title - up to 11 upper case ASCII characters; pad with $00)
DB "SHFBT",0,0,0,0,0,0
;0123456789A
; $013F-$0142 (Product code - 4 ASCII characters, assigned by Nintendo, just leave blank)
DB " "
;0123
; $0143 (Color GameBoy compatibility code)
DB $00 ; $00 - DMG
; $80 - DMG/GBC
; $C0 - GBC Only cartridge
; $0144 (High-nibble of license code - normally $00 if $014B != $33)
DB $0F
; $0145 (Low-nibble of license code - normally $00 if $014B != $33)
DB $0F
; $0146 (GameBoy/Super GameBoy indicator)
DB $00 ; $00 - GameBoy
; $0147 (Cartridge type - all Color GameBoy cartridges are at least $19)
DB $1B ; $1B - ROM + MBC5 + RAM + BATT
; $0148 (ROM size)
DB $08 ; $08 - 64MBit = 8MByte = 512 Banks
; $0149 (RAM size)
DB $04 ; $04 - 1 Mbit = 128kB = 16 Banks
; $014A (Destination code)
DB $01 ; $01 - All others
; $00 - Japan
; $014B (Licensee code - this _must_ be $33)
DB $33 ; $33 - Check $0144/$0145 for Licensee code.
; $014C (Mask ROM version - handled by RGBFIX)
DB $00
; $014D (Complement check - handled by RGBFIX)
DB $00
; $014E-$014F (Cartridge checksum - handled by RGBFIX)
DW $00Last edited by l0k1 (2016-01-05 10:44:00)
Offline