Rivista: Commodore Computer Club (IT) – N.ro: 14 / ottobre 1984 – Trascrizione: AmigOS
Un ultimo estratto dal numero 14 di Commodore Computer Club, che abbiamo ormai completato per quanto riguarda la digitalizzazione dei listati apparsi sulla rivista della Systems Editoriale. Un programma assemblatore di codice macchina per il C64, scritto totalmente in BASIC, con la sua sintassi e le sue specifiche regole di utilizzo.
Assembler consente di assemblare in linguaggio macchina nella memoria del computer brevi programmi codificati con operandi classici del processore 6502/6510. I programmi vanno scritti in coda al programma principale (che di fatto è l’assembler) usando le linee DATA del BASIC ed una sintassi precisa, simile a quella di assembler più famosi come Turbo Assembler e molti altri. Assemblare un programma in linguaggio macchina significa in pratica tradurre i codici mnemonici che fanno parte della logica del programma ed i relativi dati usati, nei numeri esadecimali corrispondenti e poi memorizzarli in RAM a partire da un indirizzo di start. Questo indirizzo potrà poi essere invocato dal comando SYS per far girare il programma stipato in memoria. Per tutte le informazioni su come è stato concepito e sviluppato il programma Assembler, nonché su tutto quanto serve per utilizzarlo, vi rimandiamo a pag. 27 di CCC n. 14.
Il listato completo include l’assemblatore ed un programma dimostrativo a partire dalla linea 1170 che segue la sintassi imposta dall’assembler. La prima riga DATA deve contenere tra virgolette il nome del programma, l’ultima riga DATA le virgolette “a vuoto” cioè DATA “”. Con il comando SYS826 il programmino in L.M. agisce su tutti i caratteri dello schermo tramite la visualizzazione “in reverse”.
Per assemblare un nuovo programma occorrerà cancellare le righe da 1170 in avanti e sostituirle con quelle del nuovo listato scritto nel linguaggio assembly di questo particolare tool. Dopo aver scritto il nuovo programma in coda al listato principale basterà dare il RUN e attendere che il compilatore controlli il codice e segnali eventuali errori. Se tutto sarà andato bene, il programma sarà memorizzato in RAM e potrà essere lanciato con il comando SYS. Ovviamente si deve aver cura di memorizzare il codice del programma in L.M. in un’area di memoria diversa da quella del BASIC, dove opera il programma assemblatore.

Titolo: Assembler
Piattaforma: Commodore 64
Genere: Utility
Linguaggio: BASIC
Autore versione originale: –
Pubblicazione: Commodore Computer Club n. 14, ottobre 1984
Digitazione/Elaborazione: AmigOS
Anno: 2026 (aprile)
Download: file .PRG
Note: revisione e correzioni di David “CercamonX” La Monaca


Qui di seguito trovate il codice in linguaggio BASIC da copiare sul vostro Commodore 64 originale oppure su un emulatore. Per PC Windows 10/11 suggeriamo VICE con il supporto dell’editor e compilatore CBM Prg Studio.
Di seguito le istruzioni per caricare il listato sull’emulatore VICE:
– Copiare il listato qui sotto e incollatelo in CBM Prg Studio.
– I codici dei caratteri speciali presenti nel listato saranno trattati da CBM Prg Studio e convertiti nei corrispondenti simboli del BASIC V2.
– Selezionare Generate .prg (current file) per ottenere il file programma con estensione .prg (ad es. assembler.prg)
– Lanciare l’emulatore VICE e dal menu File > Smart attach… > assembler.prg
– Digitare RUN e premere il tasto Return per far partire il gioco
Buon divertimento!
Download link: ccc14-assembler.prg
Attenzione – Nel listato i caratteri ‘>’ e ‘<‘ potrebbero essere stati sostituiti dai rispettivi codici di encoding HTML ‘>’ e ‘<’. Nel caso siano presenti, sostituite questi valori nel listato prima di caricarlo nell’editor CBM Prg Studio.
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124 100 rem *** a s s e m b l e r 6502-6510 ***
105 rem typing-in by amigos - fixing by cercamonx/rmw
107 rem april 26, 2026
110 :
120 print"{clear}":input"stampante o video";pg$:w8=4:ifpg$="v"thenw8=3
130 open1,w8:print#1:print#1
140 input"distanza colonne (consigl.5; max=12)";w7
150 w7=12-w7:ifw8=4thenprint"{clear}"
160 siz=25:dimsy$(siz),ad(siz):op=56:dimop$(op)
170 fori=1toop:readop$(i):nexti
180 readb$:print#1,tab(20)"{reverse on}"b$
190 readb$:ifb$=""then260:rem pass1
200 c$=left$(b$,1):l$=mid$(b$,2)
210 ifc$="<"then190
220 ifc$=";"thenpc=pc+1
230 ifc$="="thengosub650:print#1,b$:goto190
240 ifc$="@"thengosub550:pc=v:goto190
250 pc=pc+1:goto190
260 restore:fori=0toop:readt$:nexti:print#1:print#1:rem pass2
270 readb$
280 ifb$=""thenprint#1,"{reverse on} programma sintatt. corretto ":end
290 t=22:ifasc(b$)>63andasc(b$)<91thent=18
300 kk=t-w7:c$=left$(b$,1):l$=mid$(b$,2)
310 ifc$="<"thenprint#1,tab(kk+20)"{reverse on}"b$:goto270
320 ifc$="="thenv=pc:goto390
330 ifc$="@"thengosub550:pc=v:goto390
340 ifc$="#"orc$="$"orc$="'"thenl$="."+b$:goto400
350 ifc$=";"orc$="."orc$="+"thenl$=b$:goto400
360 gosub770:l$=".$"+op$:goto400
370 ifl=1thenl=0:print#1,tab(kk-10)b$:return
380 print#1,tab(kk)b$:return
390 gosub590:print#1,"{reverse on}"v$"{reverse off}";:goto410
400 gosub420
410 gosub370:goto270
420 c$=left$(l$,1):l$=mid$(l$,2):rem mem.val.
430 ifc$<>"."andc$<>";"andc$<>"+"thenprint#1,"operando err. "b$:end
440 gosub570
450 ifc$="+"thenv=v-(pc+1):if(v<0andv>-129)orv>127thenv=v+256
460 ifc$<>";"and(v<0orv>255)thenprint#1,"byte troppo grande "b$:end
470 h=int(v/256):v=v-256*h:pokepc,v:pc=pc+1:gosub500
480 ifc$<>";"thenreturn
490 v=h:pokepc,v:pc=pc+1:gosub500:l=1:return
500 gosub590:t$=v$:v=pc-1:gosub590:print#1,"{reverse on}"v$"{reverse off}"t$;:return
510 v=0:rem esadec.
520 t=asc(v$)-48:ift>9thent=t-7
530 v=16*v+t:v$=mid$(v$,2):ifv$<>""then520
540 return
550 gosub600:ifup%>0thenv=val(l$):rem get num.
560 return
570 gosub600:ifup%>0thengosub670:rem get val.
580 return
590 v$=right$("{space*4}"+str$(v),5):return:rem giustif.
600 up%=0:l1$=left$(l$,1):l2$=mid$(l$,2)
610 ifl1$="#"thenv=val(l2$):return
620 ifl1$="$"thenv$=l2$:gosub510:return
630 ifl1$="'"thenv=asc(l2$):gosub850:return
640 up%=1:return
650 ifsy>sizthenprint#1,"troppe labels "b$:end
660 sy$(sy)=l$:ad(sy)=pc:sy=sy+1:return
670 rem riesame
680 fori=len(l$)to1step-1:t$=mid$(l$,i,1)
690 ift$="+"ort$="-"then710:rem esame
700 nexti:v=0:goto730
710 sv$=left$(l$,i-1):l$=mid$(l$,i+1)
720 gosub550:l$=sv$:ift$="-"thenv=-v
730 ifsy=0then760
740 fori=0tosy-1:ifsy$(i)=l$thenv=ad(i)+v:return
750 nexti
760 print#1,"label non definita "b$:end
770 t$=left$(b$,3):sf$=mid$(b$+"{space*2}",4,2)
780 fori=1toop:op$=op$(i):rem ricerca codice
790 ifleft$(op$,3)=t$then820
800 nexti
810 print#1,"codice scorretto "b$:end
820 fori=4tolen(op$)step5:ifmid$(op$,i,2)=sf$then840
830 nexti:goto810
840 ty$=mid$(op$,i+4,1):op$=mid$(op$,i+2,2):return
850 ifmid$(l$,2,1)<>"'"orlen(l$)=2thenreturn
860 v=asc(mid$(l$,2)):ifv<96andv>63thenv=v-64
870 return
880 data"adc{space*2}6d;x 7d;y 79;. 65..x75.@x61.@y71.# 69."
890 data"and{space*2}2d;x 3d;y 39;. 25..x35.@x21.@y31.# 29."
900 data"asl{space*2}0e;x 1e;. 06..x16.a 0a-"
910 data"bcc{space*2}90+","bcs{space*2}b0+","beq{space*2}f0+"
920 data"bit{space*2}2c;. 24.","bmi{space*2}30+","bne{space*2}d0+","bpl{space*2}10+"
930 data"brk{space*2}00-","bvc{space*2}50+","bvs{space*2}70+"
940 data"clc{space*2}18-","cld{space*2}d8-","cli{space*2}58-","clv{space*2}b8-"
950 data"cmp{space*2}cd;x dd;y d9;. c5..xd5.@xc1.@yd1.# c9."
960 data"cpx{space*2}ec;. e4.# e0.","cpy{space*2}cc;. c4.# c0."
970 data"dec{space*2}ce;x de;. c6..xd6.","dex{space*2}ca-","dey{space*2}88-"
980 data"eor{space*2}4d;x 5d;y 59;. 45..x55.@x41.@y51.# 49."
990 data"inc{space*2}ee;x fe;. e6..xf6.","inx{space*2}e8-","iny{space*2}c8-"
1000 data"jmp{space*2}4c;@ 6c;","jsr{space*2}20;"
1010 data"lda{space*2}ad;x bd;y b9;. a5..xb5.@xa1.@yb1.# a9."
1020 data"ldx{space*2}ae;y be;. a6..yb6.# a2."
1030 data"ldy{space*2}ac;x bc;. a4..xb4.# a0."
1040 data"lsr{space*2}4e;x 5e;. 46..x56.a 4a-"
1050 data"nop{space*2}ea-"
1060 data"ora{space*2}0d;x 1d;y 19;. 05..x15.@x01.@y11.# 09."
1070 data"pha{space*2}48-","php{space*2}08-","pla{space*2}68-","plp{space*2}28-"
1080 data"rol{space*2}2e;x 3e;. 26..x36.a 2a-"
1090 data"ror{space*2}6e;x 7e;. 66..x76.a 6a-"
1100 data"rti{space*2}40-","rts{space*2}60-"
1110 data"sbc{space*2}ed;x fd;y f9;. e5..xf5.@xe1.@yf1.# e9."
1120 data"sec{space*2}38-","sed{space*2}f8-","sei{space*2}78-"
1130 data"sta{space*2}8d;x 9d;y 99;. 85..x95.@x81.@y91."
1140 data"stx{space*2}8e;. 86..y96.","sty{space*2}8c;. 84..x94."
1150 data"tax{space*2}aa-","tay{space*2}a8-","tsx{space*2}ba-"
1160 data"txa{space*2}8a-","txs{space*2}9a-","tya{space*2}98-"
1161 :
1162 rem *** inserire il programma in codice mnemonico
1163 rem *** sottoforma di data a partire dalla riga
1164 rem *** 1170. ricordarsi che il primo data contiene
1165 rem *** il nome del programma.
1166 :
1170 data" inversione schermo"
1180 data@1024,=crt,@2,=ptr,@128,=bit7,@826,=top
1190 datalda,;crtadr,sta.,.ptr,lda,;crtadr+1,sta.,.ptr+1,ldx#,#0
1200 data=outer,ldy#,#0,=inner,lda@y,.ptr
1210 datacmp#,"' ",beq,+skip,eor#,.bit7
1220 datasta@y,.ptr,=skip,iny,cpy#,#250,bne,+inner,clc,lda.,.ptr
1230 dataadc#,#250,sta.,.ptr,lda.,.ptr+1,adc#,#0,sta.,.ptr+1
1240 datainx,cpx#,#4,bne,+outer,rts,=crtadr,;crt
1250 data""
