Difference between revisions of "Module:Address"

From ALttP Speedrunning Wiki
Jump to: navigation, search
Line 37: Line 37:
 
length = 4
 
length = 4
 
elseif addr10short <= 0x7FFF then
 
elseif addr10short <= 0x7FFF then
if localaddr then
+
title = 'Hardware register'
title = 'Local address'
+
length = 4
else
+
elseif localaddr and addr10 <= 0x10000 then
title = 'Hardware register'
+
title = 'Local address'
end
 
 
length = 4
 
length = 4
 
else
 
else

Revision as of 11:33, 9 April 2019

Documentation for this module may be created at Module:Address/doc

local p = {}

local HEX = require('Module:Base convert')

function p.main(frame)
	local args = frame:getParent().args
	local addr = args[1] or 'FF'
	local size = args[2] or 1

	local trimmed, title, len = p._main(addr, size)

	local ret = mw.html.create('code')
		:attr('title', title)
		:wikitext(trimmed)
		:wikitext(len)

	return ret
end

function p._main(addr, size, localaddr)
	
	local addr10 = tonumber(HEX._convert(addr, 10, 16))
	local addr10short = addr10 % 0x10000
	local bank = (addr10 - addr10short) / 0x10000

	local size10 = tonumber(HEX._convert(size or 1, 10, 16))

	local title = ''
	local length = 0
	local len = ''

	if addr10short <= 0xFF then
		title = 'Direct Page address'
		length = 2
	elseif addr10short <= 0x1FFF then
		title = 'Short address'
		length = 4
	elseif addr10short <= 0x7FFF then
		title = 'Hardware register'
		length = 4
	elseif localaddr and addr10 <= 0x10000 then
		title = 'Local address'
		length = 4
	else
		title = string.format('Long address $%06X; Bank %02X', addr10, bank)
		length = 6
	end

	local ret = string.format('$%0'..length..'X', addr10)

	if size10 > 1 then
		lent = string.format('[0x%X]', size10)
		title = title .. string.format('; 0x%X bytes (%s bytes) in length', size10, size10)
	end

	return ret, title, len
end

return p