Jó lenne ilyeneket összeszedni! Van is erre a hw rovat mélyén elsüllyedve Nick és Dave topikunk, amit régen nem látott Tigrian barátunk indított.
Néhány kiegészítés a DAVE dokumentációjához; ez még mindig nem teljes, és nem biztos, hogy mind pontos, de talán van ezek között olyan információ, amit még nem tud mindenki:
A0h-A5h port:
A hanggenerátorok működése: egy 12 bites számláló a megadott frekvencia értéktől visszafelé számol 250 kHz sebességgel (ez 4 MHz-es gépre értendő, ha a BFh port 1. bitje nincs beállítva). Amikor túlcsordul (azaz 0 után -1 következne), akkor -1 helyett a regiszterekben megadott 12 bites érték kerül újra a számlálóba, és a következők egyike történik a polinom számláló torzítástól függően:
- ha nincs torzítás, akkor a négyszöggenerátor (flip-flop) kimenete egyszerűen átbillen
- ha van torzítás, akkor a kimenetre a választott polinom számláló (álvéletlenszám generátor) aktuális kimenete kerül; a polinom számlálók folyamatosan futnak 250 kHz órajellel, ami egyben például azt is jelenti, hogy ha a beállított frekvencia a polinom számláló hosszának az egész számú többszöröse (pl. 4 bites számlálónál 15-1, 30-1, 45-1, stb.), akkor nincs hang, mert a mintavételezésnél mindig ugyanaz az érték van
A felüláteresztő szűrő azt jelenti, hogy az órajelnek használt csatorna kimenetének (amely tartalmazza az esetleges torzítást, szűrőt, és gyűrűmodulációt is) minden lefutó élére a flip-flop kimenete 0-ra állítódik. Ezért ha az órajel csatorna frekvenciája nagyobb, mint a szűrt csatornáé, akkor egyben a frekvencia kétszereződik:
_____ _____ _____ _____ _____
|____| |____| |____| |____| |____| | 1. csatorna
________ ________ ________
_______| |_______| |_______| |___ 0. csatorna szűrés nélkül
___ _____ _______ ________ ___
|______| |____| |__| || |_______| | 0. csatorna szűrésselA gyűrűmoduláció a felüláteresztű szűrő (ha az engedélyezett) után történik, és XNOR műveletet végez a másik csatorna (esetleg már torzított, szűrt, gyűrűmodulált) kimenetével:
_____ _____ _____ _____ _____
|____| |____| |____| |____| |____| | 0. csatorna
________ ________ ________
_______| |_______| |_______| |___ 2. csatorna
_____ ___ ___ _____ ____ _ __ _
|_| |_________| |_| || |___||____| |__| gyűrűmoduláció eredményeÉrdekesség, hogy igazi gépen a hanggenerátorok nem működnek a legnagyobb (0) frekvenciával, tehát nem lehet 125 kHz-es négyszögjelet előállítani. A számláló talán fut ilyenkor is (pl. megszakítás céljára, de ilyen gyors megszakításnak nem sok értelme van), és lehet, hogy polinom számlálót választva van hang, de ezt ellenőrizni kellene valódi gépen.
A6h port:
A zajcsatornához használt polinom számláló az órajel csatorna (esetleg már torzított, szűrt, gyűrűmodulált) kimenetének lefutó élére frissítődik, és nem fix 250 kHz-es sebességgel, mint a hangcsatornáknál. A 31.25 kHz-es mód megfelel egy 4-1 frekvenciájú órajel csatorna használatának.
A 4. bit (7 és 17 bites számláló felcserélése) beállítása azt jelenti, hogy a választható hosszúságú (9/11/15/17 bites) számlálót használhatják a hangcsatornák a 7 bites helyett (és ilyenkor ennek is 250 kHz-es órajele lesz), illetve a zajcsatorna polinom számlálója lesz a 7 bites (250 kHz helyett a választható órajellel).
A zajcsatornánál az effektusok sorrendje (ha engedélyezettek):
- 1. aluláteresztő szűrő: csak a 2. csatorna (torzított, szűrt, stb.) kimenetének a lefutó éleire mintavételeződik a polinom számláló kimenete (de egyébként az ilyenkor is fut a beállított frekvencián), az órajel lefutó élei helyett
- 2. felüláteresztő szűrő: hasonló a hangcsatornákhoz: a 0. csatorna lefutó éleire 0-ra állítódik a tároló kimenete a polinom számláló következő mintavételezéséig
- 3. gyűrűmoduláció: a hangcsatornákhoz hasonlóan XNOR műveletet végez az 1. csatornával
Polinom számlálókA DAVE 4 polinom számlálót tartalmaz:
- egy 4 bites, amely mindig 250 kHz órajellel fut, és csak a hangcsatornák használhatják
- egy 5 bites, amely mindig 250 kHz órajellel fut, és csak a hangcsatornák használhatják
- egy 7 bites, amely vagy 250 kHz-es órajellel működik és a hangcsatornák használhatják (A6h port bit 4 = 0), vagy az A6h porton beállított órajellel a zajcsatorna bemenete (A6h port bit 4 = 1)
- egy választható hosszúságú 9/11/15/17 bites, amely vagy az A6h porton beállított órajellel a zajcsatorna bemenete (A6h port bit 4 = 0), vagy 250 kHz-es órajellel működik és a hangcsatornák használhatják (A6h port bit 4 = 1)
A számlálók működése, amikor a kimenetük frissítődik:
- a számláló értéke egy bittel balra léptetődik
- az új 0. bit két (az adott számlálóhoz választott) bit léptetés előtti értéke között végzett XOR művelet eredménye
- a kimenet az új 0. bit lesz
A bitek, amelyek között XOR művelet történik, azaz a bináris "polinom":
- 4 bites számlálónál a 3. és 2. bit
- 5 bites számlálónál a 4. és 2. bit
- 7 bites számlálónál a 6. és 5. bit
- 9 bites számlálónál a 8. és 4. bit
- 11 bites számlálónál a 10. és 8. bit
- 15 bites számlálónál a 14. és 13. bit
- 17 bites számlálónál a 16. és 13. bit
Az álvéletlenszám sorozat hossza 2^N-1 (tehát 5 bites számlálónál pl. 31), ugyanis a számláló értéke nem lehet 0, mert akkor végtelen ciklusban csak 0 lehetne a kimenet (0 XOR 0 = 0). A kezdőérték bekapcsoláskor talán minden bit = 1, de ezt nem lehet biztosan tudni, és jelentősége sem sok van.
A7h port:
b0-b2: itt a "szinkronizálás" bekapcsolása azt jelenti, hogy:
- az adott hangcsatorna számlálója nem fut
- a számlálót folyamatosan az A0h-A5h regiszterekben beállított frekvencia értéken tartja
- a négyszöggenerátor flip-flop kimenetét 0-ra állítja
b3-b4: a D/A mód bekapcsolásakor a kimeneten az A8h vagy ACh porton beállított hangerő négyszerese van (azaz a hatása olyan, mintha mind a négy csatorna kimenete folyamatosan 1 lenne, és a hangerejük megegyezne a 0. csatornával)
b5-b6: itt a megszakítást nem a hanggenerátorok torzított, szűrt, stb. kimenete vezérli, hanem az adott hanggenerátor számlálója közvetlenül, amelynek minden 0-ra való lefutása után a B4h port 0. bitje átbillen, és (ha engedélyezett) beállítódik az 1. bit. Az 1 kHz-es megszakítás megfelel 250-1 hanggenerátor frekvenciának, az 50 Hz-es pedig 5000-1-nek, azaz ez nem a video megszakítás sebessége, hanem pontosan 80000 Z80 ciklus (vagy 120000, ha a BFh port 1. bitje be van állítva).
B4h port:
- bit 0-1: 50 Hz/1 kHz/hanggenerátor megszakítás
- bit 2-3: 1 Hz megszakítás
- bit 4-5: video megszakítás
- bit 6-7: INT2 megszakítás (nem használt ?)
- a 0., 2., 4., és 6. bit mindig olvasható, akkor is, ha az adott megszakítás le van tiltva; ezekbe a bitekbe '1'-et írva engedélyezhető, '0'-t írva tiltható a megszakítás
- az 1., 3., 5., és 7. bit csak akkor működik, ha engedélyezett a megfelelő megszakítás, egyébként mindig 0.; ha engedélyezett a megszakítás, akkor az 1. és 3. bit a 0. és 2. bit minden (fel- és lefutó) élére beállítódik, az 5. és 7. bit pedig csak a 4. és 6. bit lefutó éleire
- a Z80-hoz a megszakítás kérés az 1., 3., 5., és 7. bit között végzett OR művelet eredménye; ezeket a biteket vagy '1' bit visszaírásával, vagy az adott megszakítás letiltásával lehet törölni. Egyébként amíg nem törlődik mind a 4 bit, a Z80 folyamatosan megszakítást generál
- a 4. bit a NICK-től érkezik, és az adott sorban az aktuális LPB-ből olvasott VINT bit másolata; ezt szerintem a NICK minden sor elején újraolvassa az LPB-ből (de talán jobb lenne ellenőrizni igazi gépen)
_____________
_________________| |_____________________________ VINT
_____________
_________________| |_____________________________ B4h:b4 olvasás
_
...............................................||........... B4h:b5 írás
_________________
______________________________| |____________ B4h:b5 olvasásEbből az is látható, hogy a video megszakítás csak a megszakításkérést tartalmazó LPB utáni első, már VINT bit nélküli sor elején történik. Ugyanez az oka annak, hogy nem lehet két egymást követő sorban video megszakítás.
B5h port:
Írás:
- bit 0-3: billentyűzetmátrix sor kiválasztása (csak a 0.-9. sorban van billentyű)
- bit 4: nem használt ? (vagy SERIAL, NET, stb. használja, amit nem ismerek)
- bit 5: magnóhang kikapcsolása (ha a bit 1, akkor nincs magnóhang)
- bit 6: REM1 bekapcsolása (ha a bit 1, akkor REM1 be van kapcsolva)
- bit 7: REM2 bekapcsolása (ha a bit 1, akkor REM2 be van kapcsolva)
Olvasás:
- bit 0-7: a billentyűzetmátrix választott sorának aktuális állapota; ha egy billentyű le van nyomva, akkor a megfeleleő bit '0', egyébként '1'.
\ bit+-------+-------+-------+-------+-------+-------+-------+-------+
\ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
sor\ | | | | | | | | |
+------+-------+-------+-------+-------+-------+-------+-------+-------+
| 0 | N | \ | B | C | V | X | Z | SHF_L |
+------+-------+-------+-------+-------+-------+-------+-------+-------+
| 1 | H | LOCK | G | D | F | S | A | CTRL |
+------+-------+-------+-------+-------+-------+-------+-------+-------+
| 2 | U | Q | Y | R | T | E | W | TAB |
+------+-------+-------+-------+-------+-------+-------+-------+-------+
| 3 | 7 | 1 | 6 | 4 | 5 | 3 | 2 | ESC |
+------+-------+-------+-------+-------+-------+-------+-------+-------+
| 4 | F4 | F8 | F3 | F6 | F5 | F7 | F2 | F1 |
+------+-------+-------+-------+-------+-------+-------+-------+-------+
| 5 | 8 | | 9 | - | 0 | ^ | ERASE | |
+------+-------+-------+-------+-------+-------+-------+-------+-------+
| 6 | J | | K | ; | L | : | ] | |
+------+-------+-------+-------+-------+-------+-------+-------+-------+
| 7 | STOP | LE | JOBB | FEL | PAUSE | BAL | ENTER | ALT |
+------+-------+-------+-------+-------+-------+-------+-------+-------+
| 8 | M | DEL | , | / | . | SHF_R | SPACE | INS |
+------+-------+-------+-------+-------+-------+-------+-------+-------+
| 9 | I | | O | @ | P | [ | | |
+------+-------+-------+-------+-------+-------+-------+-------+-------+B6h port:
Olvasás:
- bit 0: a billentyűzetmátrix sorával együtt választható joystick irány állapota ('0': aktív, '1': nem aktív)
\ bit+---------+
\ | 0 |
sor\ | |
+------+---------+
| 0 | J1 TŰZ |
+------+---------+
| 1 | J1 FEL |
+------+---------+
| 2 | J1 LE |
+------+---------+
| 3 | J1 BAL |
+------+---------+
| 4 | J1 JOBB |
+------+---------+
| 5 | J2 TŰZ |
+------+---------+
| 6 | J2 FEL |
+------+---------+
| 7 | J2 LE |
+------+---------+
| 8 | J2 BAL |
+------+---------+
| 9 | J2 JOBB |
+------+---------+ - bit 1-3: nem használt/ismeretlen/mindig 1 (?)
- bit 4-5: nem használt/ismeretlen/mindig 0 (?)
- bit 6: magnó bemenet szint (ha nincs bemenet, akkor '1'; '0' = magas szint, '1' = alacsony szint ?)
- bit 7: magnó adatbemenet (ha nincs bemenet, akkor '1')
BFh port:
Írás:
- bit 0: beépített RAM mérete ('0': 64K, '1': 16K); ennek a hatását nem ismerem, meg kellene nézni igazi gépen. Mindenesetre normál esetben mindig '0'-t kell írni.
- bit 1: frekvencia osztó: ha nincs beállítva, akkor a fent említett "250 kHz" frekvencia a Z80 órajelének a 16-od része, egyébként 24-el kell osztani. Tehát ha ez be van állítva, akkor minden DAVE frekvencia (számlálók, hanggenerátorok, 1 Hz/50 Hz/1 kHz megszakítás) másfélszer alacsonyabb lesz, turbós gépen pedig minden frekvenciát a Z80 megváltozott órajelével arányosan szorozni kell.
- bit 3: 1: memória várakozás letiltása (video memóriánál nincs hatása)
- bit 2: memória várakozás mód (csak akkor, ha nincs a 3. bittel letiltva, és nem video memóriához történik hozzáférés):
- ha 0, akkor várakozás minden memóriaműveletnél
- ha 1, akkor várakozás csak M1 olvasásnál - ez az alapértelmezett mód. Az M1 olvasás a Z80 utasítások első byte-ját jelenti; DDh, EDh, és FDh prefixnél a prefix utáni utasításbyte is M1 olvasásnak számít, CBh prefixnél pedig a következő utasításbyte csak akkor M1 olvasás, ha nem volt a CBh előtt DDh vagy FDh prefix is:
- NN
- CBh NN
- DDh NN
- EDh NN
- FDh NN
- DDh CBh
- FDh CBh
az M1 olvasásoknál történik egyébként az R regiszter frissítése is
A várakozás normál 4 MHz-es gépen 1 Z80 ciklus, turbós (6 vagy 7.119 MHz) gépen pedig 2 Z80 ciklus. Az 1. bitnek nincs hatása a várakozás mértékére. Video RAM-nál az itt beállítható várakozásoknak nincs hatása, ott ugyanis 889846 Hz-es frekvenciához kell szinkronizálni a hozzáféréseket. Ezt 4 MHz-es gépen egyszerűen úgy lehet - nem túl pontosan - közelíteni, hogy a két video RAM vagy video I/O port (ugyanis a NICK 80h-8Fh portjainál is van ilyen várakozás) között eltelt Z80 ciklusok számához hozzá kell adni 1.5-öt, majd ha az eredmény nem osztható 4.5-el, akkor felfelé kerekíteni, hogy osztható legyen. A várakozás ennek és az eredeti (1.5 hozzáadása előtti) ciklusszámnak a különbsége 0.5 Z80 ciklus egységekben. Lényeges azonban, hogy a memóriaműveletek az utasításon belül pontosan mikor történnek:
- M1 olvasás: teljes időtartam 4 ciklus, az olvasás időpontja ezen belül 2.0 ciklus
- normál memória olvasás és írás: teljes időtartam 3 ciklus, a memóriaművelet időpontja 2.5 ciklus
- I/O port olvasás és írás: 4 ciklus, ezen belül 3.5 ciklusnál történik a tényleges I/O művelet