1

https://www.monlynx.de/lynx/lynx9.html

Writing to B,D,F,H,K, or M will force a '0' to be written to A,C,E,G,J, or L, respectfully. Therefore, if you only have 8 bits in a particular number, there is no need to write the upper byte to '0'. (except for signed multiplies)
Writing to A will start a 16 bit multiply.

W upkr potrzebuję mnożenia 8x8. Jestem skonfudowany stwierdzeniem, że zapis do B zeruje A. Czy to startuje mnożenie, czy i tak trzeba zapisać do A? Jeśli tak, to jaki ma sens pisanie o zerowaniu A?
Czy te rejestry są też do odczytu?

https://www.youtube.com/watch?v=jofNR_WkoCE

2 Ostatnio edytowany przez laoo/ng (2024-07-06 10:44:24)

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.

3

Dziękuję za wyczerpujące wyjaśnienie!

W upkr jest tylko mnożenie 8x8, więc znaki 16-bitowe są bez znaczenia. O akumulacji myślałem, ale najpierw chciałbym wiedzieć, czy działa bez niej. Poza tym niezależność od konfiguracji (znakowości i akumulacji) ma wiele zalet.

Zapis do A lepiej byłoby zrobić STZ, ale xasm nie ma, DTA nie chcę zaciemniać, a w mads blokuje mnie https://github.com/tebe6502/Mad-Assembler/issues/40 :)
Wtedy możnaby całe mnożenie wystartować przed aktualizacją "probs", czyli w trakcie mnożenia robimy 30 cykli potrzebnych operacji na 6502.

https://www.youtube.com/watch?v=jofNR_WkoCE

4

Laoo popełniłeś emulatora Lynxa? to teraz dodaj parę fancy features i startujesz z fantasy console :)

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

5

Weź mi nie wspominaj o tej dekadenckiej manierze ;)

6

Fox napisał/a:

Zapis do A lepiej byłoby zrobić STZ, ale xasm nie ma, DTA nie chcę zaciemniać, a w mads blokuje mnie https://github.com/tebe6502/Mad-Assembler/issues/40 :)
Wtedy możnaby całe mnożenie wystartować przed aktualizacją "probs", czyli w trakcie mnożenia robimy 30 cykli potrzebnych operacji na 6502.

mads poprawiony, STZ wstawione wcześniej, czekanie na SPRSYS usunięte. Dodatkowo tryb adresowania pośredni nieideksowany. Sprawdzisz?

https://www.youtube.com/watch?v=jofNR_WkoCE