Za obliczenia odpowiada chip Suzy, który jest 16-bitowy. Wszystkie jego rejestry są 16-bitowe i mają tę samą właściwość - zapis młodszego bajtu zeruje starszy, ale nie jest to traktowane jako zapis do starszego bajtu, tylko jako zapis liczby 16-bitowej, gdzie starsze 8 bitów jest uzupełnione zerami. Zapis do A jest konieczny, gdyż w przypadku mnożenia pod zapis starszego bajtu pary AB podpięty jest start mnożenia. Z tego co widzę w unupkr jest poprawnie - najpierw zapis do D (co zeruje C), potem do B (zerując A) a na końcu do A startując mnożenie.
Fox napisał/a:Czy te rejestry są też do odczytu?
Wszystkie rejestry matematyczne są też do odczytu, mają jednak specyficzne funkcje. Rejestry AB i CD służą do przyjmowania argumentów dla mnożenia, za to jest do nich zapisywany wynik dzielenia. Nigdy tego nie sprawdzałem, ale zakładam, że po wykonaniu mnożenia są w nich niezmienione argumenty - tak przynajmniej zrobiłem w emulatorze i żadna aplikacja do tej pory się nie wywróciła na operacjach arytmetycznych, więc chyba tak jest.
Co do szczegółów działania można poczytać emulator: zapis i odczyt rejestrów oraz same obliczenia
Jeszcze jedna rzecz - w przypadku mnożenia bez znaku i bez akumulacji (domyślnie jest to wyłączone, można to aktywować w rejestrze SPRSYS) mnożenie trwa 44 cykle 16 MHz. Odczyt dowolnego rejestru Suzy zajmuje minimalnie 5 + 4 + 4 + 9 = 22 cykle, a np operacja RMW zerostronicowa minimalnie 5 + 4 + 5 + 4 + 5 = 23, więc "INC $xx; LDA H" powinno wystarczyć, ale trzeba byłoby to sprawdzić. Tak jak pisałem w drugim temacie - znajdę wystarczająco czasu, to napiszę test.
Ostatnio edytowany przez laoo/ng (2024-07-06 10:44:24)