Hallo Leute,

ich arbeite momentan an einem Projekt, welches mit dem Gameboy zu tun hat. An diesem Projekt arbeite ich jetzt seit ca. 2 Monaten (BLL im Fach Informatik) und da ich jetzt erst auf diese Thema hier gestoßen bin wollte ich jetzt einfach mal meine Erfahrungen zum Thema hier schreiben.

Ich habe damit angefangen mich über die Gameboy-Hardware schlau zu machen. Dabei waren die meisten hier aufgezählten Seiten, die bisher echt hilfreich waren. Das Ergebnis war, wie hier auch schon bemerkt, die eingeschränkte Rechenleistung des Classic-GBs, allerdings auch der enorme Vorteil eines Timers, eines Displays, eines parallelen und seriellen Ports, die schon vorhandene (Mini-)Tastatur und einiges mehr.
Die meisten Spiele des Gameboys basieren auf einen (von Nintendo entwickelten) Memory Bank Controller, bei dem es gar nicht so leicht ist ihn anzusteuern (Vorteil ist natürlich die Anhebung der ROM-Größe von 32KB auf bis zu 2MB, sowie auch des RAM).

Meine bisherige Hardware zum auslesen bestand daher aus einem AT90S2313 der mittels zweier 8Bit-Datenlatches den Address-Bus setzen und den Daten-Bus direkt über einen 8Bit-Port am Controller auslesen kann.
Damit habe ich es dann schonmal geschafft ein altes Gameboy-Cartridge auszulesen (Kwirk, Snoopy's Magic Show, ...).
Probleme gabs wie gesagt, bei dem MBC auf den Cartridges (Einteilung in 16KB-Speicherblöcke). Bei den MBC-Karten hab ich immer nur den ersten Speicherblock auslesen können. Die nächsten Blöcke waren nur Wdh. des ersten Blocks. (Wird wohl irgendwann noch klappen - Falls es bei einem von euch klappt bitte schreien und bescheid sagen...).

Beflügelt von diesem Erfolgsergebnis hab ich mir dann mein erstes GB-Modul selbst gebastelt: Ein altes Spiel auseinander genommen, Litze an die Kontakte gelötet und daran ein 32KB-EEPROM angeschlossen, weil ich dies komplett durchaddressieren kann ohne einen anderen IC benutzen zu müssen - Problem: Dieses Modul ist mir komplett auseinander gefallen...(Bild davon folgt)
Es scheint mir also nur sinnvoll (allein) das ROM zu ersetzen und den Rest beizubehalten - mehr RAM ist ja auch sehr praktisch....
Da ich meine weiteren Spiele also nicht auch noch zerhacken wollte hab ich mir Eagle geschnappt und mir ne eigene kleine Platine zusammengeklickt - zwar eher schlecht als recht aber sie funktioniert - und ausgefräst (Das war bisher die erste Platine bei der es richtig funktioniert hat ... noch ein Erfolg...).. Naja mehr brauch ich dazu nicht sagen... Bilder sind unten weiter...

Also hab ich den AVR-Controller so umprogrammiert, damit er jetzt auch ROMs beschreiben kann. Ein ausgelesenes ROM (Kwirk) aufgespielt und siehe da.. es funktioniert....


Jetzt kommt mein Projekt für die Schule: (eine Entwicklungsumgebung für den GB)
Der Assembler (bisher von der E. fertig)... Hmm, da ihr ja auf bestehende Software zurückgreifen wollt vlt. nicht ganz so interessant aber ich will jetzt ja auch ein bisschen angeben
Ohne genug Planung wird so etwas natürlich nichts... Das musste ich selbst auch merken, deswegen ist die erste Version komplett in den Papierkorb geflogen und wurde komplett neu aufgesetzt (Mit nem ausreichenden Konzept, usw.). Damit hab ich dann immerhin schon mein erstes Programm geschrieben...
Code:
.CODEDEFINITION "GB.inc"

.equ StackTop = $FFFE

RST_00:	
	jp	Main
	DS	5
RST_08:	
	jp	Main
	DS	5
RST_10:	
	jp	Main
	DS	5
RST_18:	
	jp	Main
	DS	5
RST_20:	
	jp	Main
	DS	5
RST_28:	
	jp	Main
	DS	5
RST_30:	
	jp	Main
	DS	5
RST_38:	
	jp	Main
	DS	5
	jp	irq_VBlank
	DS	5
	jp	irq_LCDC
	DS	5
	jp	irq_Timer
	DS	5
	jp	irq_Serial
	DS	5
	jp	irq_HiLo
	DS	5

.org $100


nop
	jp	Main

	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

		;0123456789ABCDEF
	DB	"                "
	DB	0,0,0	;SuperGameboy
	DB	0	;CARTTYPE
			;--------
			;0 - ROM ONLY
			;1 - ROM+MBC1
			;2 - ROM+MBC1+RAM
			;3 - ROM+MBC1+RAM+BATTERY
			;5 - ROM+MBC2
			;6 - ROM+MBC2+BATTERY

	DB	0	;ROMSIZE
			;-------
			;0 - 256 kBit ( 32 kByte,  2 banks)
			;1 - 512 kBit ( 64 kByte,  4 banks)
			;2 -   1 MBit (128 kByte,  8 banks)
			;3 -   2 MBit (256 kByte, 16 banks)
			;3 -   4 MBit (512 kByte, 32 banks)

	DB	0	;RAMSIZE
			;-------
			;0 - NONE
			;1 -  16 kBit ( 2 kByte, 1 bank )
			;2 -  64 kBit ( 8 kByte, 1 bank )
			;3 - 256 kBit (32 kByte, 4 banks)

	DW	$0000	;Manufacturer

	DB	0	;Version
	DB	0	;Complement check
	DW	0	;Checksum

; --
; -- Initialize the Gameboy
; --

main:
	di							;Disable Interrupts
	.wait:							;Wait for V_Blank
		ld	a,[$FF44]				;LY LCDC compare
		cp	a,144
		jr	nc,.wait
	
		ld a,0
		ld [$FF40],a					;lcdc
	
		ld a,%11100100					;set palette to normal
		ld [$FF47],a
	
		ld a,0
		ld [$FF42],a					;set the scrollx and scrolly
		ld [$FF43],a

		call clearscreen
	
		ld hl,tiledata
		ld de,$8000
		ld bc,4096
		call ldir					;defined lower in the source..
	
		ld hl,tilemap					;tile map
		ld de,$9800
		ld bc,1024					;size of the tilemap
		call ldir
		
		ld a,%00000001					;Enable VBlank-Interrupt
		ld [$FFFF],a

		ld a,%10010001
		ld [$FF40],a					;turn the screen on
	ei							;Enable Interrupts
; --
; -- mainloop does nothing
; --
mainloop:
	jp mainloop					;neverending loop


; --
; -- clearscreen emties the gb-screen
; --
clearscreen:
	ld hl, emptyspace
	ld de,$9800
	ld bc, 1024
	call ldir
	ret	


; --
; -- ldir - Copies a specified memory-location to another location
; -- Parameters:
; --	- hl: Source
; -- 	- de: Destination
; --	- bc: Count
ldir:;there is no ldir command
.ldir:
 ld a,[hl]
 inc hl
 ld [de],a
 inc de
 dec bc
 ld a,c
 or a,b
 jr nz,.ldir
 ret

tilemap:
	;.include "fontmap.inc"
	db "Hallo Roboternetz..............."
	db "................................"
	db "................................"
	db "................................"
	db "................................"
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 
	db "................................" 

tiledata:
 	.include "ibmfont.inc"

; --
; -- Some interrupts
; --

irq_VBLANK:
	;ld a,[$FF43]
	;inc a
	;ld [$FF42],a					;set the scrollx and scrolly
	;ld a,104
	;ld [$FF43],a
	reti
irq_LCDC:	
	reti
irq_Timer:
	reti
irq_Serial:
	reti
irq_HiLo:
	reti

emptySpace:
	ds 1024
Ich weiß ja nicht genau inwieweit ihr euch mit dem GB beschäftigen wollt, aber die Hardware ist echt faszinierend. Steuerungstechnisch auch: Es gibt echt viel Zusatzhardware mit der man super am GB arbeiten kann (z.b. eine Tastatur am seriellen Port des GBs). Am parallelen Port kann man eigentlich soviel machen wie man will.(Ein Software-I2C Bus sollte ja nicht allzuschwer sein...) Von den erweiterung ganz zu schweigen... man muss nur die Ideen alle umsetzen können. Wem der Classic-GB zu langsam ist, kann ja auf den GBA ausweichen. Der ist um einiges schneller und hat ein super Display...

Soviel erstmal von mir... Wer fragen hat kann sie stellen...

Hier mal einige Bilder:

Der Schreiberling:
Bild hier  
Das kaputte (umgebaute) GB-Cartridge:
Bild hier  
Der Gameboy, welcher gerade ein Programm ausführt:
Bild hier  
Das komplett selbstgebaute Cartridge:
Bild hier