Files
ZiFi/_sd/tests/test_resident.py

81 lines
2.6 KiB
Python

"""Resident routines; build resident with --sym=resident_syms_new.txt first."""
import re
from test_fat_offsets import Driver, ROOT, SYMS, BODY
SYMS.update((name, int(value, 16)) for name, value in re.findall(
r'^(\w+): EQU 0x([0-9A-Fa-f]+)$', (ROOT/'resident_syms_new.txt').read_text(), re.M))
def driver():
d = Driver()
d.m.set_memory_block(0x2000, (ROOT/'zc_sd_driver.bin').read_bytes())
return d
def test_depacker():
d = driver()
d.m.set_memory_block(0, bytes(len(BODY)))
assert d.call('drv_dos_swp') == 0
assert bytes(d.m.memory[:len(BODY)]) == BODY
assert bytes(d.m.memory[0x2000:0x2000+(ROOT/'zc_sd_driver.bin').stat().st_size]) == (ROOT/'zc_sd_driver.bin').read_bytes()
def test_free_chain():
for broken in (False, True):
d = driver()
chain = [319, 500, 320, 1023]
for i, n in enumerate(chain):
d.fat(n, chain[i+1] if i+1 < len(chain) else 0x0ffffff8)
d.cluster(chain[0])
if broken:
d.fail_reads.add(49+chain[0]//128)
assert d.call('core_free_chain') != 0
assert not [x for x in d.io if x[0].startswith('sdwrite')]
else:
assert d.call('core_free_chain') == 0
for n in chain:
sector, offset = divmod(n*4, 512)
assert d.disk[49+sector][offset:offset+4] == bytes(4)
def test_file_abi():
d = driver()
d.put('rtc_cached', 1, 1)
for s in range(49, 113):
d.disk[s] = bytearray(512)
d.fat(2, 0x0fffffff)
d.disk[1017] = bytearray(512)
d.disk[1018] = bytearray(512)
d.put('root_cluster_lo', 2)
d.put('next_search_valid', 1, 1)
d.put('next_search_lo', 319)
d.call('core_setroot')
def arg(data):
d.m.set_memory_block(0x9000, data+b'\0')
d.m.hl = 0x9000
arg(b'\0'+(1024).to_bytes(4, 'little')+b'Example long file.bin')
d.m.ix = 0xabcd
assert d.call('wrap_mkfile') == 0
assert d.m.ix == 0xabcd
arg(b'\0Example long file.bin')
assert d.call('drv_fentry') == 1
assert (d.m.de, d.m.hl) == (0, 1024)
arg(b'\0Example long file.bin')
d.m.set_memory_block(0x9200, b'Renamed long file.bin\0')
d.m.de = 0x9200
assert d.call('core_renam') == 1
arg(b'\0Renamed long file.bin')
assert d.call('drv_fentry') == 1
arg(b'\0Example long file.bin')
assert d.call('drv_fentry') == 0
arg(b'\0Renamed long file.bin')
assert d.call('core_delfl') == 1
arg(b'\0Renamed long file.bin')
assert d.call('drv_fentry') == 0
if __name__ == '__main__':
for test in (test_depacker, test_free_chain, test_file_abi):
test()
print('PASS:', test.__name__)