2015-12-15 18:57:32 +00:00
|
|
|
-- feos, 2015
|
|
|
|
|
|
|
|
--== Globals ==--
|
2015-12-27 20:25:29 +00:00
|
|
|
local lastcfg = 0
|
|
|
|
local dcfg = 0
|
|
|
|
local rngcount = 0
|
|
|
|
local rngobject = 0
|
|
|
|
local rngroutine = 0
|
|
|
|
local rngcolor = "white"
|
|
|
|
local MsgTime = 16
|
|
|
|
local MsgStep = 256/MsgTime
|
|
|
|
local MsgTable = {}
|
|
|
|
|
|
|
|
--== Slow stuff ==--
|
|
|
|
local drawwalls = 1
|
|
|
|
local drawfloor = 1
|
|
|
|
local drawbg = 1
|
|
|
|
local drawrng = 1
|
2015-12-15 18:57:32 +00:00
|
|
|
|
|
|
|
--== Shortcuts ==--
|
2015-12-27 20:25:29 +00:00
|
|
|
local rb = memory.read_u8
|
|
|
|
local rbs = memory.read_s8
|
|
|
|
local rw = memory.read_u16_be
|
|
|
|
local rws = memory.read_s16_be
|
|
|
|
local rl = memory.read_u32_be
|
|
|
|
local box = gui.drawBox
|
|
|
|
local text = gui.pixelText
|
|
|
|
local line = gui.drawLine
|
|
|
|
local AND = bit.band
|
|
|
|
local SHIFTL = bit.lshift
|
|
|
|
local SHIFTR = bit.rshift
|
|
|
|
|
|
|
|
event.onframestart(function()
|
|
|
|
rngcount = 0
|
|
|
|
rngcolor = "white"
|
|
|
|
rngobject = 0
|
|
|
|
end)
|
|
|
|
|
|
|
|
event.onmemorywrite(function()
|
|
|
|
rngcount = rngcount+1
|
|
|
|
rngcolor = "red"
|
|
|
|
rngobject = emu.getregister("M68K A1")
|
|
|
|
rngroutine = emu.getregister("M68K A0")
|
|
|
|
for i = 1, 30 do
|
|
|
|
if MsgTable[i] == nil then
|
|
|
|
MsgTable[i] = {
|
|
|
|
timer_ = MsgTime + emu.framecount(),
|
|
|
|
object_ = rngobject-0xff0000,
|
|
|
|
routine_ = rngroutine
|
|
|
|
}
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end, 0xffa1d4)
|
|
|
|
|
|
|
|
local function PostRngRoll(object,x,y)
|
|
|
|
if drawrng==0 then return end
|
|
|
|
for i = 1, #MsgTable do
|
|
|
|
if (MsgTable[i]) then
|
|
|
|
if object==MsgTable[i].object_ then
|
|
|
|
local color = 0x00ff0000+SHIFTL((MsgTable[i].timer_-emu.framecount())*MsgStep,24)
|
|
|
|
line(130,7*i+8,x,y,color)
|
|
|
|
text(120,7*i+8,string.format("%X",MsgTable[i].routine_),color)
|
|
|
|
end
|
|
|
|
if (MsgTable[i].timer_<emu.framecount()) then
|
|
|
|
MsgTable[i] = nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2015-12-15 18:57:32 +00:00
|
|
|
|
2015-12-27 20:25:29 +00:00
|
|
|
local function Objects(base0, amount)
|
|
|
|
for i=0,amount do
|
|
|
|
local base = base0+i*0x6e
|
|
|
|
local id = rb(base)
|
|
|
|
local color = 0xff00ff00
|
|
|
|
local of = 128
|
|
|
|
if id~=0 then
|
|
|
|
-- attributes --
|
|
|
|
local hp = rbs(base+ 1)
|
|
|
|
local x = rw (base+ 2)-0x1000-camx
|
|
|
|
local y = rw (base+ 4)-0x1000-camy
|
|
|
|
local facing = rbs(base+ 9)
|
|
|
|
local hbbase = rl (base+0x14)
|
|
|
|
local d = rb (base+0x35)
|
|
|
|
PostRngRoll(base,x,y)
|
|
|
|
if (id>0 and id<130 and hbbase<0x300000) then
|
|
|
|
-- hitbox --
|
|
|
|
local x1 = rb(hbbase+2,"MD CART")
|
|
|
|
local x2 = rb(hbbase+4,"MD CART")
|
|
|
|
local y1 = rb(hbbase+3,"MD CART")
|
|
|
|
local y2 = rb(hbbase+5,"MD CART")
|
|
|
|
if x1>0 and x2>0 and y1>0 and y2>0 then
|
|
|
|
if facing==-1 then
|
|
|
|
x1 = 256-x1
|
|
|
|
x2 = 256-x2
|
|
|
|
end
|
|
|
|
if d==-1 then
|
|
|
|
y1 = 256-y1
|
|
|
|
y2 = 256-y2
|
|
|
|
end
|
|
|
|
x1 = x+x1-of
|
|
|
|
x2 = x+x2-of
|
|
|
|
y1 = y+y1-of
|
|
|
|
y2 = y+y2-of
|
|
|
|
if id>=120 and id<=124 then color = 0xffff0000 end
|
|
|
|
box(x1,y1,x2,y2,color,0)
|
|
|
|
if hp>0 and id~=120 then text(x,y-2,hp,color) end
|
|
|
|
--text(x,y,string.format("%X",id),"yellow")
|
|
|
|
end
|
|
|
|
-- whip
|
|
|
|
if base==0xa20e then
|
|
|
|
local wx = rb(hbbase+6,"MD CART")
|
|
|
|
local wy = rb(hbbase+7,"MD CART")
|
|
|
|
local ww = rb(0xff0c)
|
|
|
|
local wh = rb(0xff0d)
|
|
|
|
if facing==-1 then wx = 256-wx end
|
|
|
|
if d ~= 0 then wy = 256-wy end
|
|
|
|
wx = wx+x-of
|
|
|
|
wy = wy+y-of
|
|
|
|
box(wx-ww,wy-wh,wx+ww,wy+wh,0xffff0000,0)
|
|
|
|
if invcount>0 then text(x,y,invcount) end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function GetFloor(x, y)
|
|
|
|
if drawfloor==0 then return {0,0} end
|
|
|
|
x = x*16+AND(camx,0xfff0)
|
|
|
|
y = y*16+AND(camy,0xfff0)
|
|
|
|
local d6 = SHIFTR(AND(y,0xfff0),3)
|
|
|
|
local a0 = rw(d6+0xb4e8)
|
|
|
|
local d0 = SHIFTR(x+0x10,4)
|
|
|
|
local d2 = AND(x,0xf)
|
|
|
|
local a1 = 0xb806+rw(0xfb9e)
|
|
|
|
local a2 = 0x273e1e
|
|
|
|
local d3 = SHIFTR(rw(a0+d0*2),1)
|
|
|
|
local d5 = SHIFTL(rb(a1+d3),4)+d2
|
|
|
|
local newd5 = SHIFTL(rb(a1+d3),4)+d2+15
|
|
|
|
local newd0 = AND(rb(a2+newd5,"MD CART"),0x1f)
|
|
|
|
return {AND(rb(a2+d5,"MD CART"),0x1f), newd0}
|
|
|
|
end
|
|
|
|
|
|
|
|
local function GetWall(x, y)
|
|
|
|
if drawwalls==0 then return 0 end
|
|
|
|
x = x*16+AND(camx,0xfff0)
|
|
|
|
y = y*16+AND(camy,0xfff0)
|
|
|
|
if y<0 then return 0 end
|
|
|
|
local d6 = SHIFTR(AND(y+6,0xfff0),3)
|
|
|
|
local a0 = rw(d6+0xb4e6)
|
|
|
|
local d0 = rw(a0+SHIFTR(x,4)*2)
|
|
|
|
return rb(0xb808+SHIFTR(d0,1))
|
|
|
|
end
|
|
|
|
|
|
|
|
local function DrawBG()
|
|
|
|
if drawbg==0 then return end
|
|
|
|
for j=1,15 do
|
|
|
|
for i=1,21 do
|
|
|
|
local a0 = GetWall(i,j)
|
|
|
|
if a0>0 then
|
|
|
|
x1 = i*16-AND(camx,0xf)-16
|
|
|
|
y1 = j*16-AND(camy,0xf)-16
|
|
|
|
x2 = i*16-AND(camx,0xf)-1
|
|
|
|
y2 = j*16-AND(camy,0xf)-1
|
|
|
|
if a0==255 then -- normal
|
|
|
|
box(x1,y1,x2,y2,0xff00ffff,0x4400ffff)
|
|
|
|
elseif a0==228 then -- snot
|
|
|
|
box(x1,y1,x2,y2,0xff00ff00,0x4400ff00)
|
|
|
|
elseif a0==117 then -- right
|
|
|
|
box(x1,y1,x2,y2,0x4400ffff,0x4400ffff)
|
|
|
|
line(x2,y1,x2,y2,0xff00ffff)
|
|
|
|
elseif a0==116 then -- left
|
|
|
|
box(x1,y1,x2,y2,0x4400ffff,0x4400ffff)
|
|
|
|
line(x1,y1,x1,y2,0xff00ffff)
|
|
|
|
elseif a0==113 or a0==114 then -- grab corner
|
|
|
|
box(x1,y1,x2,y2,0x66ffff00,0x66ffff00)
|
|
|
|
elseif a0==60 or a0==61
|
|
|
|
or a0>=74 and a0<=77
|
|
|
|
or a0==58 or a0==59 then -- stomack
|
|
|
|
box(x1,y1,x2,y2,0xffff0000,0x44ff0000)
|
|
|
|
elseif a0==73 then -- stomack
|
|
|
|
box(x1,y1,x2,y2,0x44ff0000,0x44ff0000)
|
|
|
|
elseif a0==54 or a0==40 then -- kitchen
|
|
|
|
box(x1,y1,x2,y2,0xffff0000,0x44ff0000)
|
|
|
|
elseif a0==41 then -- kitchen
|
|
|
|
box(x1,y1,x2,y2,0x44ff0000,0x44ff0000)
|
|
|
|
else -- other occasional crap
|
|
|
|
box(x1,y1,x2,y2,0x66ffffff,0x66ffffff)
|
|
|
|
--text(x1,y1,a0)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local d0 = GetFloor(i,j)[1]
|
|
|
|
if d0>0 then
|
|
|
|
local newd0 = GetFloor(i,j)[2]
|
|
|
|
if newd0>0 then
|
|
|
|
x1 = i*16-AND(camx,0xf)
|
|
|
|
y1 = j*16-AND(camy,0xf)+d0
|
|
|
|
x2 = i*16-AND(camx,0xf)+15
|
|
|
|
y2 = j*16-AND(camy,0xf)+newd0
|
|
|
|
else
|
|
|
|
for k=-2,2 do
|
|
|
|
newd0 = GetFloor(i+1,j+k)[1]
|
|
|
|
if newd0>0 then
|
|
|
|
local add = 1
|
|
|
|
if k==-2 then
|
|
|
|
k = 0
|
|
|
|
add = -1
|
|
|
|
elseif k==-1 then
|
|
|
|
add = 2
|
|
|
|
elseif k==2 then
|
|
|
|
add = 1
|
|
|
|
end
|
|
|
|
x1 = i*16-AND(camx,0xf)
|
|
|
|
y1 = j*16-AND(camy,0xf)+d0
|
|
|
|
x2 = i*16-AND(camx,0xf)+16
|
|
|
|
y2 = j*16-AND(camy,0xf)-newd0+k*16+add
|
|
|
|
--text(x1,y2,k,"red")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
line(x1,y1,x2,y2,0xff00ff00)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function Configs()
|
2015-12-15 18:57:32 +00:00
|
|
|
local rng = rl(0xa1d4)
|
|
|
|
text(120,0,string.format("rng: %08X:%d",rng,rngcount),rngcolor)
|
|
|
|
local cfg0 = rl(0xfc2a)
|
|
|
|
if cfg0==0 then return end
|
|
|
|
local cfg1 = rl(0xfc9a)
|
|
|
|
text(220,0,string.format("cfg old: %X\ncfg step: %d",cfg1,dcfg))
|
|
|
|
if lastcfg~=cfg0 then dcfg = cfg0-lastcfg end
|
|
|
|
lastcfg = cfg0
|
|
|
|
local h = 7
|
|
|
|
for i=0,20 do
|
|
|
|
local config = rl(0xfc2a)+i
|
|
|
|
local action = rb(config,"MD CART")
|
|
|
|
local newaction = memory.readbyte(config+1,"MD CART")
|
|
|
|
if action==0x62
|
|
|
|
or (action==0xe and newaction==8)
|
|
|
|
or action==8
|
|
|
|
or action==3 then color = "red"
|
|
|
|
elseif action>=0x63 and action<=0x64 then color = "orange"
|
|
|
|
elseif action>=0x30 and action<=0x32 then color = 0xff00ff00
|
|
|
|
elseif action>=0x65 and action<=0x70 then color = 0xff00cc00
|
|
|
|
elseif action==0x7a then color = "white"
|
|
|
|
else color = 0xffaaaaaa
|
|
|
|
end
|
|
|
|
text(270,i*h+42,string.format("%X:%02X",config,action),color)
|
|
|
|
if i>0
|
|
|
|
and action==0x7a
|
|
|
|
or action==0x2b
|
|
|
|
or action==0x2d
|
|
|
|
then break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
Bounce()
|
|
|
|
Seek()
|
|
|
|
end
|
|
|
|
|
2015-12-27 20:25:29 +00:00
|
|
|
local function Seek()
|
2015-12-15 18:57:32 +00:00
|
|
|
bytes = 0
|
|
|
|
waves = 0
|
|
|
|
steps = 0
|
|
|
|
local ret = ""
|
|
|
|
for bytes=0,10000 do
|
|
|
|
local cfg = rl(0xfc2a)+bytes
|
|
|
|
local action = rb(cfg, "MD CART")
|
|
|
|
local newaction = rb(cfg+1, "MD CART")
|
|
|
|
if action==0x7a then
|
|
|
|
waves=waves+1
|
|
|
|
steps=steps+1
|
|
|
|
end
|
|
|
|
if action==0x63 or action==0x64 or (action==0 and newaction==0) then
|
|
|
|
steps=steps+1
|
|
|
|
end
|
|
|
|
if action>=0x30 and action<=0x32 then
|
|
|
|
if newaction==0x70 then
|
|
|
|
steps=steps+1
|
|
|
|
elseif newaction==0x62 then
|
|
|
|
ret = string.format("BOMB in %d waves %d steps",waves,steps,bytes)
|
|
|
|
break
|
|
|
|
end
|
|
|
|
elseif action==3 then
|
|
|
|
ret = string.format("Forth in %d waves %d steps",waves,steps,bytes)
|
|
|
|
break
|
|
|
|
elseif action==0xe and newaction==8 then
|
|
|
|
ret = string.format("Back in %d waves %d steps",waves,steps,bytes)
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
text(120,7,ret)
|
|
|
|
end
|
|
|
|
|
2015-12-27 20:25:29 +00:00
|
|
|
local function Bounce()
|
2015-12-15 18:57:32 +00:00
|
|
|
if rb(0xa515)==0x60
|
|
|
|
then offset = 8
|
|
|
|
else offset = 0
|
|
|
|
end
|
|
|
|
local counter = rb(0xfc87)
|
|
|
|
local a0 = 0xfc88
|
2015-12-27 20:25:29 +00:00
|
|
|
local d0 = SHIFTL(rb(a0+counter),5)+offset
|
2015-12-15 18:57:32 +00:00
|
|
|
local vel = rw(0x25d482+d0, "MD CART")
|
|
|
|
if vel == 0x200 then bounce = 3
|
|
|
|
elseif vel == 0x3e0 then bounce = 1
|
|
|
|
else bounce = 2
|
|
|
|
end
|
|
|
|
text(60,0,string.format("bounce: %X",bounce))
|
|
|
|
end
|
|
|
|
|
|
|
|
while true do
|
|
|
|
camx = rw(0xa172)
|
|
|
|
camy = rw(0xa174)
|
2015-12-27 20:25:29 +00:00
|
|
|
scrx = rw(0xa176)-0x1000
|
|
|
|
scry = rw(0xa178)-0x1000
|
|
|
|
absx = rw(0xa17e)-0x1000
|
|
|
|
absy = rw(0xa180)-0x1000
|
|
|
|
invcount = rb(0xfbd6)
|
|
|
|
if rb(0xa313)==4 then
|
|
|
|
DrawBG()
|
|
|
|
Objects(0xa2ea, 0x23)
|
|
|
|
Objects(0xa20e, 0)
|
|
|
|
Configs()
|
|
|
|
end
|
2015-12-15 18:57:32 +00:00
|
|
|
emu.frameadvance()
|
|
|
|
end
|