Felcsigáztál, nosztalgiáztam picit és elővettem a témát cc65 fordítóval és C64 emulátorral.
Egyik tanulsága, hogy ha nem szolgai módon az algoritmus akarom leprogramozni assembly-ben (ahogy néhány évtizede), akkor tényleg elég a 40-es szorzás és néhány felesleges jobbra shift majd felesleges balra shift elmaradhat.
// x: 0..319, y: 0..199
void setpixel(uint16_t x, uint8_t y) {
// ha itt nem (y >> 3) van, hanem (y & 0xf8), akkor nem kell később 3-szor felshift
uint8_t rowX8 = y & 0xf8;
// 40 = (2*2 +1x)*2*2*2
uint16_t idx = ((( (rowX8 << 2) + rowX8) << 3) + (x & 0xfff8)) | (y & 7);
pixelmem[idx] |= (0x80 >> (x & 7));
}
A teljes példakódot itt megtalálod, fordítási és vice-ben való futtatási instrukciókkal együtt. Egyébként ez lefordítva 913 byte.
(vice telepítése után a sourceforge repóban levő forráskódból kell még a basic chargen kernal a /usr/share/vice/C64/ mappába, hogy fusson.)
További hasznos:
https://www.commodore.ca/manuals/c64_programmers_reference/c64-programm… pdf 27. 28. oldala (könyvben 125, 126) leírja a memória kiszámítást.
https://www.commodore.ca/commodore-manuals/commodore-64-users-guide/
https://www.commodore.ca/commodore-manuals/commodore-64-programmers-ref…