Newsgroup: it.comp.retrocomputing
Titolo: C64 e misurazione del tempo

Tanto per contribuire e non lasciare dubbi a riguardo, anche il C64 ha
il suo bel RTC o come cavolo lo volete chiamare :)
Le locazioni $dc08->$dc0b (56328->31) sono aggiornate dal CIA timer e
contengono in fomato BCD l'ora i minuti i secondi i decimi di secondo e
il flag AM/PM
per visualizzarlo in basic (notare il casino per convertire un BCD in
decimale):
------8<--------8<--------8<--------8<--------8<--------8<--------8<--
1 rem TOD by iAN CooG
10 rt=56328
11 rem 11:59:50 in BCD
15 pokert+3,(1*16)+1:pokert+2,(5*16)+9:pokert+1,(5*16):pokert,0
20 z=peek(rt+3):if(zand128)=128thenap$="pm":goto 22
21 ap$="am"
22 p=peek(rt+3):z=(pAND16 )/1.6+(pAND15):print"{clear}"z;
23 p=peek(rt+2):z=(pAND240)/1.6+(pAND15):print":"z;
24 p=peek(rt+1):z=(pAND240)/1.6+(pAND15):print":"z;
25 print"."peek(rt);
26 print" "ap$
30 goto 20
------8<--------8<--------8<--------8<--------8<--------8<--------8<--
Mentre in assembler ecco un bel "tsr", visualizza l'orologio durante il
ciclo di interrupt.
Sembra piu' lungo ma ci ho impiegato meno a scrivere questo che la
controparte in basic :)
------8<--------8<--------8<--------8<--------8<--------8<--------8<--
; real time clock display
; iAN CooG/HokutoForce for ICR community
*=$0801
    .word $080b
    .word $1bbe
    .byte $9e
    .text "2064"
    .word $0000
    .word $0000
*=$0810
timer_d=$dc08
timer_s=$dc09
timer_m=$dc0a
timer_h=$dc0b
        lda #$11 ;BCD
        ldx #$59
        ldy #$50
        sta timer_h
        stx timer_m
        sty timer_s
        lda #0
        sta timer_d
        lda #<loop1
        ldx #>loop1
        sei
        sta $0314
        stx $0315
        cli
        rts
loop1
        lda timer_h ; print hours
        pha         ; keep for high bit test (am/pm)
        and #$7f    ; high bit not needed now
        jsr dexit
        sta mask+1
        stx mask
        lda timer_m ; print minutes
        jsr dexit
        stx mask+3
        sta mask+4
        lda timer_s ; print seconds
        jsr dexit
        stx mask+6
        sta mask+7
        lda timer_d ; print 1/10th seconds
        jsr dexit
        sta mask+9
        pla         ; high bit set=PM
        and #$80
        lsr
        lsr
        lsr
        lsr
        lsr
        lsr
        lsr
        tax
        lda ampm,x
        sta mask+11
        ldy #(ampm-mask)-1
printh  lda mask,y
        sta $0400,y
        dey
        bpl printh
        jmp $ea31
;BCD -> ASCII/SCREENCODES
;input A ($1F) output XA ("1" "F")
dexit
        pha
        lsr
        lsr
        lsr
        lsr
        jsr check
        tax
next    pla
        and #$0f
        jsr check
        rts
check
        cmp #$0a
        bcs hex
        clc
        adc #$30
        rts
hex    ;sec       ; ascii
       ;sbc #$0a
       ;clc
       ;adc #$41
        sec
        sbc #$09  ; screencodes: A=$01
        rts
mask .scru "00:00:00.0 AM"
ampm .scru "AP"
------8<--------8<--------8<--------8<--------8<--------8<--------8<--
-- 
-=[]=---iAN CooG/HokutoForce+TWT---=[]=-
Alla fine del mondo, Dio separera' chi usa Linux da chi usa Windows

 il flag AM/PM
...ed e' anche possibile impostare la funzione di "alarm clock", una
sveglia che "scatta" ad un orario predeterminato :)
-- 
Agenda per eventi retrocomputeristici:
http://www.retroagenda.bbk.com
Retrocensimento:
http://www.retrocensimento.bbk.com

 di rete, mentre il meccanismo descritto da Gennaro M. sullo Specturm si :P
Ne sei sicuro? Sulla mailing-list "CBM Hackers", poco tempo fa, in un thread
relativo alla frequenza alternata dell'alimentazione del C64, è saltato
fuori che il TOD prende come riferimento la frequenza di rete...
-- 
  ___                                                          __
 / __|___  Daniele Gratteri, Italian Commodore-Amiga user...  ///
| /  |__/  Nickname: FIAT1100D - ICQ: 53943994           __  ///
| \__|__\  Home page: 
http://www.gratteri.tk
             \\\///
 \___|     E-MAIL: 
dan...@gratteri.tk
     ...since 1990  \///

 fuori che il TOD prende come riferimento la frequenza di rete...
Lo dico perche' usando TI e TI$ con una tensione di 50Hz, la TI viene
incrementata in realta' ogni 50mo di secondo. Il TOD invece e' sempre
preciso. Ora pero' mi hai messo un dubbio, approfondiro'...


 preciso. Ora pero' mi hai messo un dubbio, approfondiro'...
"sempre preciso" in che senso? La frequenza di rete è un ottimo riferimento
per misurare il trascorrere del tempo! 50 oscillazioni al secondo,
garantite: nel caso che, in un momento della giornata, non ci siano proprio
50Hz, si fa in modo di far tornare i conti...
Questo schema:
http://www.funet.fi/pub/cbm/schematics/computers/c64/c64-powersupply.gif
dovrebbe chiarirti le idee circa la generazione del TOD clock.


 50Hz, si fa in modo di far tornare i conti...
Quindi ci sarebbero due tipi di TOD, uno per la rete a 50Hz ed uno
per la rete a 60Hz?


 per la rete a 60Hz?
Scusate l'intrusione, ma...
Mmmmhh... come mi suona strano!

 per la rete a 60Hz?
Il TOD è un registro dei CIA 6526, che non esistono in versioni
differenziate PAL/NTSC: il KERNAL dovrebbe distinguere se il computer su cui
è in esecuzione è un sistema NTSC (60Hz) o PAL (50Hz) e cambiare di
conseguenza i conteggi. Nel primo caso, 1s = 60 impulsi, nel secondo, 1s =
50 impulsi.


 50 impulsi.
Consiglio questo link:
http://www.funet.fi/pub/cbm/documents/chipdata/6526cia.zip


 
http://www.funet.fi/pub/cbm/documents/chipdata/6526cia.zip
Mmmhhh... in che senso programmabile?
"The clock requires an external 60 Hz or 50 Hz (programmable) TTL level
input on the TOD pin for accurate time-keeping."
4a riga di timetoday.htm nello ZIP che hai inviato.
E immagino sia l'uscita del 74LS08... o sbaglio?

 E immagino sia l'uscita del 74LS08... o sbaglio?
Programmabile nel senso che, da software, puoi impostare il 6526 per contare
50 o 60 impulsi di clock, a seconda della frequenza di rete: tale operazione
dovrebbe effettuarla il kernal.
Il circuito con quel 74LS08 dovrebbe servire per trasformare il segnale
sinusoidale in un clock TTL compatibile, non so, perņ, che componenti siano
quelli indicati con "CRn".


 rete...
L'altro timer, la variabile TI e' alle locazioni di pag. zero $a0-$a2 e
funziona come quelle dello spectrum da quanto ho capito, $a2
incrementato ogni 1/60 di sec, poi $a1 ogni 256 incrementi e $a0 ogni
256*256, e si azzerano allo scoccare delle 24 ore.
Ora non so se questi 60esimi di sec siano legati alla frequenza PAL/NTSC
o meno. Ora mi leggero' il doc che hai proposto tu.
-- 
-=[]=---iAN CooG/HokutoForce+TWT---=[]=-
Let him that hath understanding count the number of the pirla,
for it is the number of a man; and his number is
six seven five slash nineteen ninety six    (Thorin, ICSVarie)

 quelli indicati con "CRn".
...semplice rete RC?

 Mmmmhh... come mi suona strano!
Anche a me... infatti non e' cosi' (risp. di D.Gratteri).
Cmq TI/TI$ (160/161/162) ed il TOD non vanno in sincrono...
