diff --git a/emulators/beebem.yml b/emulators/beebem.yml index aca83321..77088628 100644 --- a/emulators/beebem.yml +++ b/emulators/beebem.yml @@ -81,10 +81,11 @@ files: system: bbc-micro-b required: true bundled: true - size: 16384 + min_size: 16384 md5: 0a59a5ba15fe8557b5f7fee32bbd393a sha1: 0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d validation: [size] + on_mismatch: warn note: "OS ROM slot. Read into 0xc000; an error is reported unless 16384 bytes are read." source_ref: "Src/BeebMem.cpp:1291-1308, Src/RomConfigFile.cpp:43" @@ -133,10 +134,11 @@ files: system: bbc-micro-b required: true bundled: true - size: 16384 + min_size: 16384 md5: 0a59a5ba15fe8557b5f7fee32bbd393a sha1: 0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d validation: [size] + on_mismatch: warn note: "OS ROM slot for Model::IntegraB. Same dump as BeebFile/BBC/OS12.rom." source_ref: "Src/RomConfigFile.cpp:63, Src/BeebMem.cpp:1291-1308" @@ -223,10 +225,11 @@ files: system: bbc-micro-bplus required: true bundled: true - size: 16384 + min_size: 16384 md5: 978370cc7ab8589a137ada34388a6e32 sha1: d9426dd7454ca199cdef9435daa332cdf405c965 validation: [size] + on_mismatch: warn note: "OS ROM slot for Model::BPlus." source_ref: "Src/RomConfigFile.cpp:83, Src/BeebMem.cpp:1291-1308" @@ -290,10 +293,11 @@ files: system: bbc-master-128 required: true bundled: true - size: 16384 + min_size: 16384 md5: 9087f772447038a00178488b3591347b sha1: 04d5876999f93fc61a18f172b1fbb3b75db733ac validation: [size] + on_mismatch: warn note: "OS ROM slot for Model::Master128, read into 0xC000 by BeebReadRoms (Src/BeebMem.cpp:1291-1308)." source_ref: "Src/RomConfigFile.cpp:103" @@ -415,10 +419,11 @@ files: system: bbc-master-et required: true bundled: true - size: 16384 + min_size: 16384 md5: 4d4afbf220abaa702026f42f98eb5807 sha1: c9483ef3ebd66930e635674a3776d171785ae959 validation: [size] + on_mismatch: warn note: "OS ROM slot for Model::MasterET." source_ref: "Src/RomConfigFile.cpp:123, Src/BeebMem.cpp:1291-1308" @@ -468,10 +473,11 @@ files: system: bbc-micro-b required: false bundled: true - size: 2048 + min_size: 2048 md5: cd6ba85e22adec70b6d863de4c053db7 sha1: 05980c296e1a7800c4aa21d6bed16323b6d859d5 validation: [size] + on_mismatch: warn note: > Copied into tube RAM at 0xf800 on every 65C02 reset. An error is reported unless 2048 bytes are read. @@ -483,10 +489,11 @@ files: system: bbc-micro-b required: false bundled: true - size: 4096 + min_size: 4096 md5: c4c72ceb73300253dc69c865af32f5ac sha1: d05de861922fed73041cc8ac2666886d95bae15b validation: [size] + on_mismatch: warn note: > Loaded for TubeDevice::AcornZ80. An error is reported unless 4096 bytes are read. Jonathan Harston's v1.21; the Acorn v1.20 ships as Z80-1.20.rom and is @@ -514,10 +521,11 @@ files: system: bbc-master-128 required: false bundled: true - size: 16384 + min_size: 16384 md5: de72efe184f74f1cb98f92b1fbf532bb sha1: eb2a043d139ae0f3d512b4f1afa32286510c886c validation: [size] + on_mismatch: warn note: > Loaded at 0xf0000 and mirrored three times to fill the top of the 1 MB space. An error is reported unless 0x4000 bytes are read. diff --git a/tests/test_profile_checks.py b/tests/test_profile_checks.py index 21c7ae1c..883cbf80 100644 --- a/tests/test_profile_checks.py +++ b/tests/test_profile_checks.py @@ -34,11 +34,14 @@ class _Probe(unittest.TestCase): self._tmp = tempfile.TemporaryDirectory() self.addCleanup(self._tmp.cleanup) - def accepts(self, emulator: str, name: str, data: bytes) -> bool: + def accepts(self, emulator: str, name: str, data: bytes, strict: bool = False) -> bool: + """strict counts a check the code only warns about.""" index = _build_validation_index({emulator: _profile(emulator)}) path = Path(self._tmp.name) / name path.write_bytes(data) - return check_file_validation(str(path), name, index, emulators={emulator}) is None + return check_file_validation( + str(path), name, index, emulators={emulator}, strict=strict + ) is None class BeebEmTeletextFont(_Probe): @@ -52,5 +55,26 @@ class BeebEmTeletextFont(_Probe): self.assertTrue(self.accepts("beebem", "Teletext.fnt", b"\0" * 4000)) +class BeebEmSystemRoms(_Probe): + """The OS, Tube, Z80 and Master 512 ROMs are read with one fread of the + slot's size. A short read reports an error and BeebEm runs with what it + read; bytes past the slot are never read (Src/BeebMem.cpp:1291-1308, + Src/Tube.cpp:1540-1553, Src/Z80Support.cpp:247-261, + Src/Master512CoPro.cpp:3777-3790 at a982ba6).""" + + CASES = (("OS12.rom", 16384), ("B+MOS.rom", 16384), ("MOS.rom", 16384), + ("MOS400.rom", 16384), ("6502Tube.rom", 2048), ("Z80.rom", 4096), + ("BIOS.rom", 16384)) + + def test_longer_is_read_and_shorter_only_warns(self): + for name, size in self.CASES: + with self.subTest(name=name): + self.assertTrue(self.accepts("beebem", name, b"\0" * (size * 2))) + self.assertTrue(self.accepts("beebem", name, b"\0" * (size // 2))) + self.assertFalse( + self.accepts("beebem", name, b"\0" * (size // 2), strict=True) + ) + + if __name__ == "__main__": unittest.main()