rubygb 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.DS_Store +0 -0
- data/Gemfile.lock +13 -1
- data/README.md +3 -3
- data/lib/galp/memory.inc +153 -0
- data/lib/rgbds/LICENSE +32 -0
- data/lib/rubygb/cli.rb +26 -2
- data/lib/rubygb/template/template.rb +99 -0
- data/lib/rubygb/version.rb +1 -1
- data/lib/rubygb.rb +1 -0
- data/rubygb.gemspec +2 -0
- data/scrap/example/gbhw.inc +645 -0
- data/{lib/galp/EXAMPLE1.TXT → scrap/example/hello-world-with-comments.asm} +123 -113
- data/scrap/example/hello-world-with-comments.gb +0 -0
- data/scrap/example/hello-world-with-comments.map +65 -0
- data/scrap/example/hello-world-with-comments.obj +0 -0
- data/scrap/example/hello-world-with-comments.sym +12 -0
- data/scrap/example/ibmpc1.inc +2400 -0
- data/scrap/test/lib/gbhw.inc +645 -0
- data/scrap/test/lib/ibmpx1.inc +2400 -0
- data/scrap/test/lib/memory.inc +153 -0
- data/scrap/test/test.gb +0 -0
- data/scrap/test/test.map +65 -0
- data/scrap/test/test.obj +0 -0
- data/scrap/test/test.s +91 -0
- data/scrap/test/test.sym +12 -0
- metadata +37 -31
- data/lib/galp/AND.GIF +0 -0
- data/lib/galp/ARROW.GIF +0 -0
- data/lib/galp/C.BAT +0 -5
- data/lib/galp/CHANGES.TXT +0 -5
- data/lib/galp/EXAMPLE.LNK +0 -7
- data/lib/galp/GBSPEC.TXT +0 -1761
- data/lib/galp/INDEX.HTM +0 -23
- data/lib/galp/INSTR.HTM +0 -563
- data/lib/galp/MEM1.HTM +0 -199
- data/lib/galp/OPCODES.HTM +0 -351
- data/lib/galp/OR.GIF +0 -0
- data/lib/galp/README.TXT +0 -4
- data/lib/galp/REGS.HTM +0 -77
- data/lib/galp/RL.GIF +0 -0
- data/lib/galp/RLC.GIF +0 -0
- data/lib/galp/RR.GIF +0 -0
- data/lib/galp/RRC.GIF +0 -0
- data/lib/galp/SETUP.BAT +0 -7
- data/lib/galp/SLA.GIF +0 -0
- data/lib/galp/SRA.GIF +0 -0
- data/lib/galp/SRL.GIF +0 -0
- data/lib/galp/START.HTM +0 -24
- data/lib/galp/SWAP.GIF +0 -0
- data/lib/galp/VID1.HTM +0 -34
- data/lib/galp/XOR.GIF +0 -0
- /data/lib/galp/{GBHW.TXT → gbhw.inc} +0 -0
- /data/lib/galp/{IBMPC1.TXT → ibmpx1.inc} +0 -0
- /data/{lib/galp/MEMORY.TXT → scrap/example/memory.asm} +0 -0
@@ -1,27 +1,27 @@
|
|
1
|
-
;
|
2
|
-
;
|
3
|
-
;
|
4
|
-
;
|
5
|
-
|
6
|
-
;
|
7
|
-
;
|
8
|
-
;
|
9
|
-
;
|
10
|
-
|
11
|
-
; GameBoy assemblers (and most other assembly
|
1
|
+
; Hello World
|
2
|
+
; John Harrison
|
3
|
+
; With lots o' code borrowed from all over the place
|
4
|
+
; some tutorial-like comments stolen from "hello world" by GABY
|
5
|
+
|
6
|
+
; VERSIONS
|
7
|
+
; 1.01 02/09/07
|
8
|
+
; fixed typos and clarified a few things in the comments
|
9
|
+
; 1.00 02/02/07
|
10
|
+
|
11
|
+
; Most GameBoy assemblers (and most other assembly
|
12
12
|
; language assemblers) use a semicolon to indicate
|
13
13
|
; that everything following it on a particular line
|
14
14
|
; is to be ignored and be treated purely as comments
|
15
15
|
; rather than code.
|
16
|
-
|
17
|
-
;
|
16
|
+
|
17
|
+
; gbhw.inc contains the
|
18
18
|
; 'Hardware Defines' for our program. This has
|
19
19
|
; address location labels for all of the GameBoy
|
20
20
|
; Hardware I/O registers. We can 'insert' this file
|
21
21
|
; into the present EXAMPLE1.ASM file by using the
|
22
22
|
; assembler INCLUDE command:
|
23
23
|
|
24
|
-
|
24
|
+
INCLUDE "gbhw.inc" ; standard hardware definitions from devrs.com
|
25
25
|
|
26
26
|
; Next we want to include a file that contains a font
|
27
27
|
; macro. A macro is a portion of code or data that
|
@@ -31,14 +31,23 @@
|
|
31
31
|
; inserted into a program until you invoke a macro which
|
32
32
|
; we will do later. For now, we are just making the macro
|
33
33
|
; name recognizable by our program.
|
34
|
-
;
|
35
|
-
; This is but just one method for including a font into
|
36
|
-
; a program. Many different methods may be used including
|
37
|
-
; using the INCBIN command. The INCBIN command allows
|
38
|
-
; including raw font data or any type of raw binary data
|
39
|
-
; into a program.
|
40
34
|
|
41
|
-
|
35
|
+
INCLUDE "ibmpc1.inc" ; ASCII character set from devrs.com
|
36
|
+
|
37
|
+
; We are going to keep interrupts disabled for this program.
|
38
|
+
; However, it is good practice to leave the reserved memory locations for interrupts with
|
39
|
+
; executable code. It make for a nice template as well to fill in code when we use interrupts
|
40
|
+
; in the future
|
41
|
+
SECTION "Vblank",HOME[$0040]
|
42
|
+
reti
|
43
|
+
SECTION "LCDC",HOME[$0048]
|
44
|
+
reti
|
45
|
+
SECTION "Timer_Overflow",HOME[$0050]
|
46
|
+
reti
|
47
|
+
SECTION "Serial",HOME[$0058]
|
48
|
+
reti
|
49
|
+
SECTION "p1thru4",HOME[$0060]
|
50
|
+
reti
|
42
51
|
|
43
52
|
; Next we need to include the standard GameBoy ROM header
|
44
53
|
; information that goes at location $0100 in the ROM. (The
|
@@ -55,10 +64,9 @@
|
|
55
64
|
; start at address $100 by using the following SECTION assembler
|
56
65
|
; command:
|
57
66
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
jp begin
|
67
|
+
SECTION "start",HOME[$0100]
|
68
|
+
nop
|
69
|
+
jp begin
|
62
70
|
|
63
71
|
; To include the standard ROM header information we
|
64
72
|
; can just use the macro ROM_HEADER. We defined this macro
|
@@ -71,12 +79,15 @@
|
|
71
79
|
; Next we indicate the cart ROM size and then the cart RAM size.
|
72
80
|
; We don't need any cart RAM for this program so we set this to 0K.
|
73
81
|
|
74
|
-
|
82
|
+
; ****************************************************************************************
|
83
|
+
; ROM HEADER and ASCII character set
|
84
|
+
; ****************************************************************************************
|
85
|
+
; ROM header
|
86
|
+
ROM_HEADER ROM_NOMBC, ROM_SIZE_32KBYTE, RAM_SIZE_0KBYTE
|
75
87
|
|
76
88
|
; Next we need to include some code for doing
|
77
89
|
; RAM copy, RAM fill, etc.
|
78
|
-
|
79
|
-
INCLUDE "memory.asm"
|
90
|
+
INCLUDE "memory.asm"
|
80
91
|
|
81
92
|
; Next, let's actually include font tile data into the ROM
|
82
93
|
; that we are building. We do this by invoking the chr_IBMPC1
|
@@ -86,85 +97,57 @@
|
|
86
97
|
; whole IBM-PC font set and not just parts of it.
|
87
98
|
;
|
88
99
|
; Right before invoking this macro we define the label
|
89
|
-
; TileData. Whenever a label is defined with
|
90
|
-
; it (except possibly a colon) it is given the value of the
|
91
|
-
; current ROM location.
|
100
|
+
; TileData. Whenever a label is defined with a colon
|
92
101
|
; As a result, TileData now has a memory location value that
|
93
102
|
; is the same as the first byte of the font data that we are
|
94
103
|
; including. We shall use the label TileData as a "handle" or
|
95
104
|
; "reference" for locating our font data.
|
96
105
|
|
97
106
|
TileData:
|
98
|
-
|
107
|
+
chr_IBMPC1 1,8 ; LOAD ENTIRE CHARACTER SET
|
99
108
|
|
100
109
|
; The NOP and then JP located at $100 in ROM are executed
|
101
110
|
; which causes the the following code to be executed next.
|
102
111
|
|
112
|
+
; ****************************************************************************************
|
113
|
+
; Main code Initialization:
|
114
|
+
; set the stack pointer, enable interrupts, set the palette, set the screen relative to the window
|
115
|
+
; copy the ASCII character table, clear the screen
|
116
|
+
; ****************************************************************************************
|
103
117
|
begin:
|
104
|
-
|
105
118
|
; First, it's a good idea to Disable Interrupts
|
106
119
|
; using the following command. We won't be using
|
107
120
|
; interrupts in this example so we can leave them off.
|
108
121
|
|
109
|
-
|
122
|
+
di
|
110
123
|
|
111
124
|
; Next, we should initialize our stack pointer. The
|
112
125
|
; stack pointer holds return addresses (among other things)
|
113
126
|
; when we use the CALL command so the stack is important to us.
|
114
127
|
;
|
115
|
-
; The CALL command is similar to
|
116
|
-
; in the BASIC language and it is similar to executing
|
128
|
+
; The CALL command is similar to executing
|
117
129
|
; a procedure in the C & PASCAL languages.
|
118
130
|
;
|
119
131
|
; We shall set the stack to the top of high ram + 1.
|
120
|
-
; (For more information on the Stack Pointer register
|
121
|
-
; read the section on Registers.)
|
122
|
-
;
|
123
|
-
|
124
|
-
ld sp,$ffff
|
125
|
-
|
126
|
-
; Next we shall turn the Liquid Crystal Display (LCD)
|
127
|
-
; off so that we can copy data to video RAM. We can
|
128
|
-
; copy data to video RAM while the LCD is on but it
|
129
|
-
; is a little more difficult to do and takes a little
|
130
|
-
; bit longer. Video RAM is not always available for
|
131
|
-
; reading or writing when the LCD is on so it is
|
132
|
-
; easier to write to video RAM with the screen off.
|
133
|
-
; ( In future examples, writing to video RAM while the
|
134
|
-
; screen is on will be covered.)
|
135
|
-
;
|
136
|
-
; To turn off the LCD we do a CALL to the StopLCD
|
137
|
-
; subroutine at the bottom of this file. The reason
|
138
|
-
; we use a subroutine is because it takes more than
|
139
|
-
; just writing to a memory location to turn the
|
140
|
-
; LCD display off. The LCD display should be in
|
141
|
-
; Vertical Blank (or VBlank) before we turn the display
|
142
|
-
; off. Weird effects can occur if you don't wait until
|
143
|
-
; VBlank to do this and code written for the Super
|
144
|
-
; GameBoy won't work sometimes you try to turn off
|
145
|
-
; the LCD outside of VBlank.
|
146
132
|
;
|
147
|
-
;
|
148
|
-
; The RET command is similar to the RETURN command in
|
149
|
-
; BASIC.
|
150
|
-
|
151
|
-
call StopLCD
|
133
|
+
ld sp, $ffff ; set the stack pointer to highest mem location we can use + 1
|
152
134
|
|
153
135
|
; Here we are going to setup the background tile
|
154
136
|
; palette so that the tiles appear in the proper
|
155
137
|
; shades of grey.
|
156
138
|
;
|
157
|
-
; To do this, we need to write the value
|
139
|
+
; To do this, we need to write the value %11100100 to the
|
158
140
|
; memory location $ff47. In the 'gbhw.inc' file we
|
159
141
|
; INCLUDEd there is a definition that rBGP=$ff47 so
|
160
142
|
; we can use the rGBP label to do this
|
161
143
|
;
|
162
|
-
; The first instruction loads the value
|
144
|
+
; The first instruction loads the value %11100100 into the
|
163
145
|
; 8-bit register A and the second instruction writes
|
164
146
|
; the value of register A to memory location $ff47.
|
165
147
|
|
166
|
-
|
167
|
-
|
148
|
+
init:
|
149
|
+
ld a, %11100100 ; Window palette colors, from darkest to lightest
|
150
|
+
ld [rBGP], a ; CLEAR THE SCREEN
|
168
151
|
|
169
152
|
; Here we are setting the X/Y scroll registers
|
170
153
|
; for the tile background to 0 so that we can see
|
@@ -178,10 +161,31 @@ begin:
|
|
178
161
|
; We set the scroll registers to 0 so that we can
|
179
162
|
; view the upper left corner of the 'canvas'.
|
180
163
|
|
181
|
-
|
182
|
-
|
183
|
-
|
164
|
+
ld a,0 ; SET SCREEN TO TO UPPER RIGHT HAND CORNER
|
165
|
+
ld [rSCX], a
|
166
|
+
ld [rSCY], a
|
167
|
+
|
168
|
+
; Next we shall turn the Liquid Crystal Display (LCD)
|
169
|
+
; off so that we can copy data to video RAM. We can
|
170
|
+
; copy data to video RAM while the LCD is on but it
|
171
|
+
; is a little more difficult to do and takes a little
|
172
|
+
; bit longer. Video RAM is not always available for
|
173
|
+
; reading or writing when the LCD is on so it is
|
174
|
+
; easier to write to video RAM with the screen off.
|
175
|
+
;
|
176
|
+
; To turn off the LCD we do a CALL to the StopLCD
|
177
|
+
; subroutine at the bottom of this file. The reason
|
178
|
+
; we use a subroutine is because it takes more than
|
179
|
+
; just writing to a memory location to turn the
|
180
|
+
; LCD display off. The LCD display should be in
|
181
|
+
; Vertical Blank (or VBlank) before we turn the display
|
182
|
+
; off. Weird effects can occur if you don't wait until
|
183
|
+
; VBlank to do this and code written for the Super
|
184
|
+
; GameBoy won't work sometimes you try to turn off
|
185
|
+
; the LCD outside of VBlank.
|
184
186
|
|
187
|
+
call StopLCD ; YOU CAN NOT LOAD $8000 WITH LCD ON
|
188
|
+
|
185
189
|
; In order to display any text on our 'canvas'
|
186
190
|
; we must have tiles which resemble letters that
|
187
191
|
; we can use for 'painting'. In order to setup
|
@@ -195,52 +199,62 @@ begin:
|
|
195
199
|
; location, DE is used as a destination memory location,
|
196
200
|
; and BC is used as a data length indicator.
|
197
201
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
202
|
+
ld hl, TileData
|
203
|
+
ld de, _VRAM ; $8000
|
204
|
+
ld bc, 8*256 ; the ASCII character set: 256 characters, each with 8 bytes of display data
|
205
|
+
call mem_CopyMono ; load tile data
|
206
|
+
|
207
|
+
; We turn the LCD on. Parameters are explained in the I/O registers section of The GameBoy reference under I/O register LCDC
|
208
|
+
ld a, LCDCF_ON|LCDCF_BG8000|LCDCF_BG9800|LCDCF_BGON|LCDCF_OBJ16|LCDCF_OBJOFF
|
209
|
+
ld [rLCDC], a
|
210
|
+
|
203
211
|
; Next, we clear our 'canvas' to all white by
|
204
212
|
; 'setting' the canvas to ascii character $20
|
205
213
|
; which is a white space.
|
206
214
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
215
|
+
ld a, 32 ; ASCII FOR BLANK SPACE
|
216
|
+
ld hl, _SCRN0
|
217
|
+
ld bc, SCRN_VX_B * SCRN_VY_B
|
218
|
+
call mem_SetVRAM
|
219
|
+
|
220
|
+
|
221
|
+
; ****************************************************************************************
|
222
|
+
; Main code:
|
223
|
+
; Print a character string in the middle of the screen
|
224
|
+
; ****************************************************************************************
|
225
|
+
; Now we need to paint the message
|
213
226
|
; " Hello World !" onto our 'canvas'. We do this with
|
214
227
|
; one final memory copy routine call.
|
215
|
-
;
|
216
|
-
; The routine 'mem_Copy' is a 'true' memory copying routine.
|
217
|
-
; The routine 'mem_CopyMono' used above served two functions:
|
218
|
-
; One was to unpack the font tile data and the other was
|
219
|
-
; to copy this data to tile RAM.
|
220
|
-
|
221
|
-
ld hl,Title ; Draw title
|
222
|
-
ld de,$9800+3+(SCRN_VY_B*7)
|
223
|
-
ld bc,13
|
224
|
-
call mem_Copy
|
225
|
-
|
226
|
-
; Now we turn on the LCD display to view the results!
|
227
|
-
|
228
|
-
ld a,LCDCF_ON|LCDCF_BG8000|LCDCF_BG9800|LCDCF_BGON|LCDCF_OBJ16|LCDCF_OBJOFF
|
229
|
-
ld [rLCDC],a ; Turn screen on
|
230
228
|
|
229
|
+
ld hl,Title
|
230
|
+
ld de, _SCRN0+3+(SCRN_VY_B*7) ;
|
231
|
+
ld bc, TitleEnd-Title
|
232
|
+
call mem_CopyVRAM
|
233
|
+
|
234
|
+
; ****************************************************************************************
|
235
|
+
; Prologue
|
236
|
+
; Wait patiently 'til somebody kills you
|
237
|
+
; ****************************************************************************************
|
231
238
|
; Since we have accomplished our goal, we now have nothing
|
232
239
|
; else to do. As a result, we just Jump to a label that
|
233
240
|
; causes an infinite loop condition to occur.
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
241
|
+
wait:
|
242
|
+
halt
|
243
|
+
nop
|
244
|
+
jr wait
|
245
|
+
|
246
|
+
; ****************************************************************************************
|
247
|
+
; hard-coded data
|
248
|
+
; ****************************************************************************************
|
238
249
|
Title:
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
;
|
243
|
-
|
250
|
+
DB "Hello World !"
|
251
|
+
TitleEnd:
|
252
|
+
|
253
|
+
; ****************************************************************************************
|
254
|
+
; StopLCD:
|
255
|
+
; turn off LCD if it is on
|
256
|
+
; and wait until the LCD is off
|
257
|
+
; ****************************************************************************************
|
244
258
|
StopLCD:
|
245
259
|
ld a,[rLCDC]
|
246
260
|
rlca ; Put the high bit of LCDC into the Carry flag
|
@@ -260,7 +274,3 @@ StopLCD:
|
|
260
274
|
ld [rLCDC],a
|
261
275
|
|
262
276
|
ret
|
263
|
-
|
264
|
-
|
265
|
-
;* End of File *
|
266
|
-
|
Binary file
|
@@ -0,0 +1,65 @@
|
|
1
|
+
ROM Bank #0 (HOME):
|
2
|
+
SECTION: $0040-$0040 ($0001 bytes)
|
3
|
+
SECTION: $0048-$0048 ($0001 bytes)
|
4
|
+
SECTION: $0050-$0050 ($0001 bytes)
|
5
|
+
SECTION: $0058-$0058 ($0001 bytes)
|
6
|
+
SECTION: $0060-$0060 ($0001 bytes)
|
7
|
+
SECTION: $0100-$09AC ($08AD bytes)
|
8
|
+
$0952 = begin
|
9
|
+
$099C = StopLCD
|
10
|
+
$0150 = TileData
|
11
|
+
$098F = Title
|
12
|
+
$099C = TitleEnd
|
13
|
+
SECTION: $0061-$00B6 ($0056 bytes)
|
14
|
+
$007B = mem_CopyMono
|
15
|
+
$008B = mem_SetVRAM
|
16
|
+
$00A1 = mem_CopyVRAM
|
17
|
+
$0061 = mem_Set
|
18
|
+
$006D = mem_Copy
|
19
|
+
SLACK: $36F8 bytes
|
20
|
+
|
21
|
+
WRAM Bank #0:
|
22
|
+
EMPTY
|
23
|
+
|
24
|
+
WRAM Bank #1:
|
25
|
+
EMPTY
|
26
|
+
|
27
|
+
WRAM Bank #2:
|
28
|
+
EMPTY
|
29
|
+
|
30
|
+
WRAM Bank #3:
|
31
|
+
EMPTY
|
32
|
+
|
33
|
+
WRAM Bank #4:
|
34
|
+
EMPTY
|
35
|
+
|
36
|
+
WRAM Bank #5:
|
37
|
+
EMPTY
|
38
|
+
|
39
|
+
WRAM Bank #6:
|
40
|
+
EMPTY
|
41
|
+
|
42
|
+
WRAM Bank #7:
|
43
|
+
EMPTY
|
44
|
+
|
45
|
+
VRAM Bank #0:
|
46
|
+
EMPTY
|
47
|
+
|
48
|
+
VRAM Bank #1:
|
49
|
+
EMPTY
|
50
|
+
|
51
|
+
HRAM:
|
52
|
+
EMPTY
|
53
|
+
|
54
|
+
SRAM Bank #0:
|
55
|
+
EMPTY
|
56
|
+
|
57
|
+
SRAM Bank #1:
|
58
|
+
EMPTY
|
59
|
+
|
60
|
+
SRAM Bank #2:
|
61
|
+
EMPTY
|
62
|
+
|
63
|
+
SRAM Bank #3:
|
64
|
+
EMPTY
|
65
|
+
|
Binary file
|