Uutiset:

C=Foorumi suosittelee: Skrolli
http://www.skrolli.fi

Main Menu

CIAn asetukset ja näppäimistön skannaus

Aloittaja Syypori6510, lokakuu 21, 2020, 21:41

« edellinen - seuraava »

Syypori6510

Kyllä meni 2 iltaa tätä vikaa etsiessä...

Olen ottanut projektissani käyttöön tällaisen näppärän autostart menetelmän "METHOD #1: RTS TO STACK" @ https://codebase64.org/doku.php?id=base:autostarting_disk_files eikä siinä mitään, hienosti toimii. Kävi kuitenkin niin, että kun myöhemmin lisäsin projektiin näppäimistön skannaus koodin (ei kernalia käytössä) niin sen kanssa oli ihme murheita, mm. joskus se melkein toimi, joskus luki vain muutamaa näppäintä, parhaimmillaankin pimeänä kuitenkin aina yksi näppäinmatriisin sarake (se jossa mm Q,E,T,U,O). Tätä sitten tosiaan pari iltaa debuggasin enkä osannut yhdistää sitä mitenkään tuohon autostarttiin, vaan luulin, että vika oli muutoksissa jotka minun piti tehdä löytämääni skannauskoodiin. Mutta vihdoin hokasin, että autostartin kolme ensimmäistä riviä

lda #$7f ;suppress any irq&nmi
sta $dc0d ;to disallow abort load by R/S
sta $dc0e

ovat syypäänä ongelmiini.
Paikat joihin se kirjoittaa %01111111 ovat CIA#1:n "Interrupt control and status register" ja "Timer A control register".

En saa mitään tolkkua miksi rutiinin kirjoittaja tekee noin ja tekeekö nuo rivit edes sen mitä kommenteissa lukee? Tulkintani mukaan siinä nimenomaan pistetään timeri ja keskeytykset päälle, mutta onko näin?

Kaikki toimii hienosti kun rivit poistaa (itseasiassa vain sta $dc0e poisto riittää), mutta jokin tarkoitus kai niillä on? Että pitäisikö ne jättää siihen ja konffata CIA myöhemmin oletusasetuksiin, kunhan nekin jostain löytäisi.

Sekin olisi tietty tietää mikä saa näppäimistön skannauksen sekoilemaan kun CIA on kyseisellä tavalla konffattu.

virgo

#1
On kyllä melko outo tapa nollata keskeytykset ?!?

$DC0D puoli menee kyllä ihan oikein,,, Mutta
$DC0E taas asetetaan kaikken mahdolliset päälle ainoastaan 50/60hz TOD tilaan ei kosketa ??!

bit 1 CIA timer A (ON) pitääkin olla 1
bit 2 asettaa PB6 pinnin (user-port) lähettämään A laskurin keskeytyksiä ulospäin
bit 3 Timer A output Toggle
bit 4 Timer A Run mode one shot ( A Ajastin keskeytys tehdään vain kerran ja se tarvitsee asettaa sen jälkeen uudelleen)
bit 5 Force load Timer YES ( Nollataan A ajastiin laskuri laskenta aloitetaan alusta )
bit 6 A Ajastin laskee ulkoisia CNT singnaaleja ei ajastimia (user-port shift reg.)
bit 7 CIA asetetaan ulkoisen lähetyksen tilaan (user-port shift reg.)
bit 8 TOD taajuus 50/60hz (PAL koneissa def. 50Hz)

kun asetat keskeytykset ($DC0D) takaisin päälle kaikki seuraavat jutut aktivoituvat :/

jos basicissa $DC0E asettaa tuon $7f =127 (poke56334,127)
aito kone lukkiintuu heti. Kaikki emulaattorit eivät reagoi mitenkään (esim. TC)

Basic jää jumiin näppäimistö rutiiniin odottamaan keskeysten aikaansaamaa näppis toimintaan
mutta keskeytykset eivät ole päällä muutamasta syystä

$dc0e
bit 6 Timer A counts 1=CNT
asettaa laskurin A laskemaan (user-port shift registeri ) ulkoista synkronisointi kellotusta
niitä ei yleensä tule Shift rekisteri on melko tuntematon CIA ominaisuus eikä sitä käytetä oikeastaan mihinkään
aikanaan VIC levari liikenne piti kulkea tämän lävitse mutta 6522;ssa oli valmistus virhe ja se dumpattiin
eikä siihen palattu kuin vasta C128+1571 ulkaisun yhteydessä vaikka vika oli korjattu 6526 myötä
kernaali siis jää odottamaan ulkoista keskeytys lähdettä jota ei tule ( Jumi )

bit 4 Timer A run mode 1= one shot
pakottaa A ajastimen suorittamaan yhden keskeytyksen
jos haluaa lisää pitää bitti 0 asettaa uudelleen jokaisen keskeytyksen jälkeen ( jumi )

bit 2 Timer A output on PB6=1
alkaa syöttämään näppis matriisiin ( ROW 6 )
Ajastin keskeytys A taajuutta sekoittaa näppiksen lukemisen melko hyvin

oletukseni on että tässä on käynyt joku käpy
tekijä on olettanut $DC0E rekisterin toimivan samoin kuin $DC0D
mutta näin ei ole 

itse en tuota Stack käynnisystä käytä koska se on melko arvaamaton
ja tila on kortilla helpompi tapa ja systeemi ystavallisempi on kassu puskuri
jota itse usein käytän

keskeytysten kieltämiseen riittää usein pelkästään $DC0E 1 bitin nollaaminen joka lopettaa irq keskeytykset vähän sama kuin SEI komento
Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500

Syypori6510

No näinpä arvelinkin, että jotain kummaa tuossa oli, kiitos varmistuksesta.

Mitä tarkoitat, että stack käynnistys on arvaamaton? Itse en keksi miten voisi olla. Minusta tuo on kaikessa nerokkuudessaan ja yksinkertaisuudessaan lyömätön. Eikä se tilaakaan vie, sinnehän se autostart koodi stackiin hautautuu ketään sen koommin häiritsemättä.

Onko se kassupuskuri menetelmä joku noista codebase64:ssa esitellyistä? Tai löytyykö jostain muualta? Voisihan sitä nimittäin siihenkin tutustua.

virgo

eipä kestä oli mielenkiintoinen selvitettävä :)
kumma et tuollainen on jäänyt kenenkään huomaamatta tuolla
vaikuttaa aika moneen juttuun muutenkin kuin ja vain näppiksen lukuun

Lähinnä kai ajan takaa sitä että sellaisen testaaminen on hankalaa koska Stack tosiaa sekoittaa koodin heti kun kernal tms. lähtee käyntiin
eikä tilaan mahdun paljon tavaraa se on myös melko vaikea tehdä pelkällä editorilla

Kassu  puskuri käynnistys on METHOD #4: 'READY.'-TRAP
sen voi kirjoittaa editorillakin ja savettaa myös helppo ja yksinkertainen eikä sekoita mitään toimintoja
plus jos haluaa siihen voi lisätä lataus turbonkin joka lähtee käyntiin heti seuraavasta fileestä ja tuhoutuu kun ohjelma käynnistyy tms.


* = $326   ;DO NOT CHANGE, else the autostart will fail

.word boot   ;autostart from charout vector ($f1ca)
.word $f6ed   ;$328 kernal stop routine Vector ($f6ed)
.word $f13e   ;$32a kernal getin routine ($f13e)
.word $f32f   ;$32c kernal clall routine vector ($f32f)
.word $fe66   ;$32e user-defined vector ($fe66)
.word $f4a5   ;$330 kernal load routine ($f4a5)
.word $f5ed   ;$332 kernal save routine ($f5ed)

;* = $334 (cassette buffer)

boot   sei
   lda #$ca   ;repair charout vector ($f1ca)
   sta $326
   lda #$f1
   sta $327

   ...   ;decruncher routine
   
.binary crushed.bin   ;crunched file   


Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500