Rivista: Compute! – Numero: 43 – Anno 1983 – Trascrizione: Francesco Fiorentini
Nell’attesa di presentarvi un ben piú corposo listato, ho deciso di regalarvi questo veloce listato Basic per il Commodore 64.
Questo programmino, utilizzando una routine in Assembly, stampa un comodo orologio per il nostro amato C64. Per rendere completo il regalo, troverete, dopo il listato Basic del programma, la routine Assembly decodificata tramite l’interpretazione delle righe DATA presenti nel programma.
Il listato originale di 64 Clock e’ stato pubblicato sulla rivista Compute! numero 43 di Dicembre 1983, edita da COMPUTE! Publications Inc. ABC.
Titolo: 64 Clock
Piattaforma: Commodore 64
Linguaggio: Basic V2
Versione originale: Paul F. Schatz
Pubblicazione: Compute! – numero 43
Anno: 1983
Trascrizione: Francesco Fiorentini
Anno: 2021
Download: C64 Clock
Note: Il codice é stato leggermente modificato dall’originale.
Istruzioni
Per impostare l’orologio – run 200
Per cambiare il colore – poke 49263,colore
Per cambiare la posizione – poke 49207,colonna
–> 0-sinistra, 14-metà, 28-destra
Per rimuovere il display – sys 49152
Per attivare il display – sys 49155
Qui di seguito trovate il codice da copiare sul vostro Commodore 64.
Il codice é stato ottimizzato per essere copiato su CBM prg Studio. Gli Screen Codes presenti nel listato originale, sono stati manualmente sostituiti da quelli standard utilizzati da CBM prg Studio.
Attenzione – Ci siamo resi conto che nel listato i caratteri ‘>’ e ‘<‘ potrebbero venir sostituiti dai rispettivi encoding html ‘>’ e ‘<’. Nel caso, sostituite questi valori nel listato prima di copiarlo sull’emulatore.
Listato: 64 Clock – Commodore 64 – Basic V2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 5 rem compute! issue 43 - december 1983
6 rem RetroLiPS project
10 a=0:fori=49152to49296:readj:pokei,j:a=a+j:nexti
20 if a<>16834 then print "error in data statements" : end
25 sys 49155
30 print "{clear}{down}{down}{reverse on} clock for c64 {reverse off}"
40 print : print "to set the clock - run 200"
50 print "to change the color - poke 49263,color"
52 print "to change position - poke 49207,column"
56 print " 0-left, 14-mid, 28-right"
60 print "to remove display - sys 49152"
70 print "to activate display - sys 49155"
90 end
100 data 76,30,192,120,173,20,3,141,28,192,169,45,141,20,3,173,21
110 data 3,141,29,192,169,192,141,21,3,88,96,49,234,120,173,28,192
120 data 141,20,3,173,29,192,141,21,3,88,96,173,24,208,41,240,74
130 data 74,133,254,169,0,133,253,160,0,173,11,220,72,41,127,162,186
140 data 32,120,192,173,10,220,32,120,192,173,9,220,162,174,32,120,192
150 data 173,8,220,32,137,192,104,16,3,169,144,44,169,129,32,141,192
160 data 169,141,145,253,169,216,133,254,169,1,145,253,136,16,251,108,28
170 data 192,72,32,133,192,104,32,137,192,138,32,141,192,96,74,74,74
180 data 74,41,15,9,176,145,253,200,96
200 rem clock setting routine
210 print "{clear}{down}{down}{reverse on} set the clock " : print
220 poke 56335, peek(56335) and 127 : rem set time of day clock
230 input "am or pm"; a$
240 a=128 : if left$(a$, 1)="a" then a=0
250 input "hour"; a$ : if len(a$)>2 then print "error" : goto 250
260 gosub 500 : if n>18 then print "error" : goto 250
270 poke 56331,a+n : rem set hours
280 input "minutes"; a$ : if len(a$)>2 then print "error" : goto 280
290 gosub 500 : if n>89 then print "error" : goto 280
300 poke 56330,n : rem set minutes
310 input "seconds"; a$ : if len(a$)>2 then print "error" : goto 310
320 gosub 500 : if n>89 then print "error" : goto 310
330 poke 56329,n : rem set seconds
340 print "when you are ready to start the clock,"
350 print "press any key."
360 get a$:if a$=""then 360
370 poke 56328,0 : rem start clock
380 goto 30
500 if len(a$)=1 then t=0 : goto 520
510 t=val(left$(a$,1))
520 u=val(right$(a$,1))
530 n=16*t+u : return
Per completezza, forniamo la routine Assembly presente nel listato nelle righe tra 100 e 180.
Il listato Assembly é stato decodificato tramite il programma Decomp v. 1.1 creato da Marco Pistorio.
Listato: 64 Clock – Commodore 64 – Assembly
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 .pc=$C000
jmp lbc01e
sei
lda $0314 //irq
sta $c01c
lda #$2d
sta $0314 //irq
lda $0315 //irq
sta $c01d
lda #$c0
sta $0315 //irq
cli
rts
and ($ea),y
lbc01e: sei
lda $c01c
sta $0314 //irq
lda $c01d
sta $0315 //irq
cli
rts
lda $d018 //vic memory control register
and #$f0
lsr
lsr
sta $fe
lda #$00
sta $fd
ldy #$00
lda $dc0b //cia1, time-of-day clock, hours + am/pm fla
pha
and #$7f
ldx #$ba
jsr lbc078
lda $dc0a //cia1, time-of-day clock, minutes
jsr lbc078
lda $dc09 //cia1, time-of-day clock, seconds
ldx #$ae
jsr lbc078
lda $dc08 //cia1, time-of-day clock, 1/10 seconds
jsr lbc089
pla
bpl $c061
lda #$90
bit $81a9
jsr lbc08d
lda #$8d
sta ($fd),y
lda #$d8
sta $fe
lda #$01
lbc070: sta ($fd),y
dey
bpl lbc070
jmp ($c01c)
lbc078: pha
jsr lbc085
pla
jsr lbc089
txa
jsr lbc08d
rts
lbc085: lsr
lsr
lsr
lsr
lbc089: and #$0f
ora #$b0
lbc08d: sta ($fd),y
iny
rts
One thought on “64 Clock – Commodore 64 – Basic V2”