Skip to content

Commit

Permalink
Math routine, fix divide by zero bug, add Sublime Text syntax file
Browse files Browse the repository at this point in the history
  • Loading branch information
Bananattack committed Feb 27, 2014
1 parent c6ad805 commit 482f135
Show file tree
Hide file tree
Showing 8 changed files with 735 additions and 94 deletions.
92 changes: 92 additions & 0 deletions examples/gameboy/common/math.wiz
@@ -0,0 +1,92 @@
package math do
// Quick 16 x 16 unsigned multiply.
//
// By: Jon Tara
// MicroControl Software
// 1300 E. Lafayette #2808
// Detroit, Michigan 48207
// (313) 393-2916
//
// This software is placed in the public domain.
//
// Jon Tara (1982-01-21): Initial release
// Jeff Frohwein (1997-04-25): Bug fixes
// Andrew G. Crowell (2013-05-28): Ported to wiz.
//
// Arguments:
// de = multiplicand
// hl = multiplier
// Returns:
// bcde = product
// Dirty:
// All registers.
//
func multiply_16x16 do
// Save MSBs of multiplier.
c = h
// Save LSBs to accumulator for an 8x16 multiply.
a = l
// Set B = 0, for carry propagation.
b = 0
// Init LSBs of product
h = b
l = b
unroll 7 do
// Test multiplier bit.
a = a + a
if is carry then
// Add multiplicand to product in AHL.
hl = hl + de
a = a +# b
end
// Shift product left.
hl = hl + hl
end
// Test multiplier bit.
a = a + a
if is carry then
// Add multiplicand to product in AHL.
hl = hl + de
a = a +# b
end

// Save LSBs on stack.
push hl
// Zero second product.
h = b
l = b
// Save MSBs of first product in B.
b = a
// Get MSBs of multiplier.
a = c
// Set C = 0, for carry propagation.
c = h
unroll 7 do
// Test multiplier bit.
a = a + a
if is carry then
// Add multiplicand to product in AHL.
hl = hl + de
a = a +# c
end
// Shift product left.
hl = hl + hl
end
// Test multiplier bit.
a = a + a
if is carry then
// Add multiplicand to product in AHL.
hl = hl + de
a = a +# c
end

// Pop LSBs from stack.
de = pop
// Add partial products.
c = a
d = d + l via a
h = b +# h via a
b = c +# 0 via a
c = h
end
end
106 changes: 85 additions & 21 deletions examples/gameboy/supaboy/hijack.wiz
Expand Up @@ -17,7 +17,7 @@ package hijack do
hl = ram.t0
call sgb.send_packet

call video.disable
/*call video.disable
hl = (snes_code + 4096)
bc = 4096
de = gb.ram.tile
Expand All @@ -33,7 +33,7 @@ package hijack do
bc = 12
call memset
hl = ram.t0
call sgb.send_packet
call sgb.send_packet*/

hl = ram.t0
[hl++] = gb.super.JUMP | 1 via a
Expand All @@ -43,14 +43,15 @@ package hijack do
[hl++] = 0x7F via a
// NMI
[hl++] = 0x00 via a
[hl++] = 0x10 via a
[hl++] = 0x08 via a
[hl++] = 0x7F via a
a = 0
bc = 9
call memset
hl = ram.t0
call sgb.send_packet

/*
c = 4
loop
call video.delay_frame
Expand All @@ -77,7 +78,7 @@ package hijack do
return
end
end

*/
call video.disable

hl = gb.ram.map
Expand Down Expand Up @@ -127,26 +128,89 @@ package hijack do

func step do
call video.buffer_open
de = gb.ram.tile
[hl++] = d via a
[hl++] = e via a
[hl++] = 0x01 via a
e++
[hl++] = d via a
[hl++] = e via a
[hl++] = 0x0F via a
e++
[hl++] = d via a
[hl++] = e via a
[hl++] = [ram.hijack.mosaic] via a
[hl] = 0 via a
[hl++] = gb.lcd.CTRL_ON via a
[hl++] = [ram.hijack.row] via a
[hl++] = [ram.hijack.row] via a
[hl++] = [ram.hijack.scroll.x] via a
[hl++] = [ram.hijack.scroll.y] via a
hl++
hl++
de = 8
hl = hl + de

a = 0x01
bc = 32
call memset
a = 0x1C
bc = 32
call memset
a = 0x01
bc = 32
call memset
a = 0x1C
bc = 32
call memset

call video.buffer_close

a = [ram.hijack.delay]; a--
if is zero then
[ram.hijack.mosaic] = [ram.hijack.mosaic] & 0xF0 + 0x10 | 0x0F via a
a = 8
[ram.hijack.row] = [ram.hijack.row] + 1 & 0x1F via a
//[ram.hijack.scroll.x] = [ram.hijack.scroll.x] + 1 via a
//[ram.hijack.scroll.y] = [ram.hijack.scroll.y] + 1 via a
end

func load_palette do

end

func load_tileset do
e = c
d = b
de = de << 1

[ram.t0] = d via a

loop
push hl // source
push bc // (source, count)
call update

call video.buffer_open
[hl++] = 0x05 via a
[hl++] = 0 via a
bc = pop // (source)
push bc // (source, count)
bc = bc << 1
[hl++] = [ram.t0] - b via a

a = 0
bc = 8 + 5
call memset

bc = pop // (source)
de = pop // ()
push hl // (dest)
push de // (dest, source)
hl = pop // (dest)
de = pop // ()
push hl // (source)
push bc // (source, count)
push de // (source, count, dest)
bc = 128
call memcpy

hl = pop // (source, count)
call video.buffer_close


bc = pop // (source)
c = c - 128 via a
b = b -# 0 via a
hl = pop // ()
l = l + 128 via a
h = h +# 0 via a
a = b | c
until zero
end
[ram.hijack.delay] = a
end
end
68 changes: 47 additions & 21 deletions examples/gameboy/supaboy/main.wiz
Expand Up @@ -117,6 +117,7 @@ func main do
call hijack.init
end


// If not a legitimate SGB, fallback to DMG.
a = b
if compare a is zero then
Expand All @@ -141,7 +142,7 @@ func main do
[gb.window.x] = 7 via a
[gb.window.y] = 8 via a
[gb.lcd.ctrl] = gb.lcd.CTRL_ON | gb.lcd.CTRL_OBJ_ON | gb.lcd.CTRL_TILESET1 | gb.lcd.CTRL_BG_ON | gb.lcd.CTRL_WIN_MAP2 via a

end // FIXME
hl = ram.t0
[hl++] = gb.super.MASK_EN | 1 via a
[hl++] = 0x00 via a
Expand All @@ -150,38 +151,63 @@ func main do
call memset
hl = ram.t0
call sgb.send_packet
end
// end


// Enable some basic interrupts.
[gb.interrupt.enable] = gb.interrupt.VBLANK | gb.interrupt.STAT via a
[gb.lcd.stat] = 0 via a
interrupt = 1

[ram.hijack.delay] = 8 via a
[ram.hijack.mosaic] = 0 via a

loop
call joy.check
hl = ram.hijack.start
bc = (ram.hijack.eof - ram.hijack.start)
a = 0
call memset

a = [ram.hardware.type]
if compare a to ram.hardware.SGB is ~= then
a = [ram.joy.pressed] & 0xF
if compare a to 0xF is == then
goto! main
end
end
call video.buffer_rewind
call video.buffer_open
[hl++] = 0x00 via a
call video.buffer_close

hl = ram.video.oam.data
a = 0x00
bc = 160
call memset
call video.oam_rewind
call video.buffer_rewind
a = [ram.hardware.type]
if compare a to ram.hardware.SGB is == then
c = 0
loop
call video.refresh
c--
until zero end

hl = tileset
bc = (tileset_eof - tileset)
call hijack.load_tileset
end

loop
call update
call hijack.step
end
end

func update do
call video.refresh
call video.refresh

call joy.check

call video.refresh
a = [ram.hardware.type]
if compare a to ram.hardware.SGB is ~= then
a = [ram.joy.pressed] & 0xF
if compare a to 0xF is == then
goto! main
end
end

hl = ram.video.oam.data
a = 0x00
bc = 160
call memset
call video.oam_rewind
call video.buffer_rewind
end

inline func stack_cleanup do
Expand Down
12 changes: 9 additions & 3 deletions examples/gameboy/supaboy/ram.wiz
Expand Up @@ -29,9 +29,11 @@ in ram, 0xC000:
package buffer do
var ptr_lo : byte
var ptr_hi : byte
// GB/GBC:
// hi, lo, value
// hi = 0x00 terminates the buffer.
var data : byte * 256
// SGB: 320 byte memory buffer.
var data : byte * 320
end
end

Expand Down Expand Up @@ -63,8 +65,12 @@ in ram, 0xC000:
end

package hijack do
var delay : byte
var mosaic : byte
var start : byte * 0
var row : byte
package scroll do
var x, y : byte
end
var eof : byte * 0
end

// Here is some dumb stuff that needs to be located in fixed RAM locations.
Expand Down

0 comments on commit 482f135

Please sign in to comment.