-
habe mir erstmal bei €bay nen gameboy ersteigert. da bist de mit 15euronen schon dabei... Bin ihc mal gespannt. werde mir bei der nächsten reichelt-bestellung nen flash mitbestellen und dann mal probieren...
Sollte es laufen, werde ich mal ne platine entwerfen... die idee mit dem i/o controller drauf gefällt mir zunehmend...
-
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 :cheesy: :cheesy: :cheesy:
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
-
Woooow. Krass!
Du hast ja wirklich schon was geschafft! Das ist echt mal ein guter Antrieb . . .
Also wenn ich dann mal irgendwann Zeit habe, ein neues Projekt anzufangen, dann wird auf jeden Fall der GB ausgebuddelt. :D
Andun
-
@enoritz: weisst du ob man die rom files die man im netz findet einfach in ein rom programmieren kann? (oder sind die anders adressiert irgenwie?)ich habe einen Flash-Hoschi der die roms beschreiben kann. (standard eeprom programmer) aber bevor ich anfange an der falschen stelle nach fehlern zu suchen......
-
Also wenn du ein simples 32KB-ROM auf ein ROM schreiben willst, ist das gar kein Problem. Bei den MBC-Cartridges (ROM>32KB) bin ich mir nicht ganz sicher, sollte allerdings auch funktionieren. Ich würds mal in nem Emulator (no$gmb z.B.) testen. Wenns dort fehlerfrei läuft, wird es wohl auch auf nem GB funktionieren.
Wie groß ist denn das ROM, dass du aufspielen möchtest?
-
habe ein 512k eeprom (29f040b-90) das werde ich auf ein Marioland-2 cartridge bauen.
die größe des roms wiss ich ned, müsst ich mal schauen, habe einige liegen. auf der cartridge ist ein MBC drauf. der neue rom wird anstelle des alten 1zu1 montiert (reinerziegler.de) ich frage mich halt nur, ob ich die roms auch auf nem stino-progger brennen kann, oder ob ich einen brauche der mit dem mbc umgehen kann..
-
wie ist denn die Pinbelegung von so einer Cartridge?
-
hat sich schon erledigt :)
( http://marc.rawer.de/Gameboy/ )
-
Hallo!
Ich will auch dabei sein. Möchte handheld Speicherosci bauen, also wegen Display und RAM. Kann den Z80 in ASM programmieren, was für schnelle Bildschirmausgaben nutzlich wäre.
MfG
-
Also wenn das Cartridge von Marioland2 benutzt wirst du wohl nich umhin kommen einen Programmer dafür zu verwenden, der mit den MBCs umgehen kann.
Hier wird der Aufbau der Memorymap des Gameboys beschrieben und hier gibts Infos zur programmierung und den MBCs, falls du dir nen Programmer selber bauen willst.