81 lines
2.6 KiB
Python
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__)
|