cura di Tommaso Pantuso
I
Cross Reference
di Lorenzo Fontani - Siena
Il programma che vi propongo esegue il Cross-Reference di un programma redatto in Basic.
Esso è scritto interamente in Assembler ed è una rielaborazione di un programma analogo per il CBM 3032 apparso sul n. 16 di MCmicrocomputer.
Del programma originario è rimasta
inalterata la struttura dati, mentre sono state apportate modifiche sia al
Oow-chart, per togliere alcuni bug, sia
all'output generato nell'intento di renderlo più leggibile.
Il programma in oggetto realizza
una tabella contenente, per ogni variabile utilizzata dal programma Basic, i
numeri delle linee in cui tale variabile
è presente.
Ciò risulta molto utile nell'analisi di
programmi piuttosto lunghi anche se
scritti da noi stessi.
Passiamo alla descrizione generale
del programma rimandandovi al listato per ulteriori e più approfonditi dettagli.
Come struttura dati viene usata una
lista multipla: nella lista principale
vengono annotati i nomi delle variabili e per ognuna di esse si ha una sottolista contenente i numeri delle linee
nelle quali sono presenti.
Ogni elemento della lista delle variabili è formato da 8 byte mentre
quelli delle sottoliste sono lunghi 4 byte.
Viene effettuata una scansione del
testo Basic alla ricerca delle variabili e
quando se ne trova una la si memorizza in un buffer (BUF).
L'algoritmo che riconosce le variabili si basa sul fatto che il loro identificatore deve iniziare con una lettera la
quale può essere seguita da un certo
numero di lettere o numeri (anche se il
C64 riconosce le variabili solo con i
primi due caratteri), seguiti a loro volta da un «%» per gli interi, «$» per le
stringhe, niente per i reali o eventual-
MCmicrocomputer
n. 53 - giugno 1986
mente seguiti da una parentesi aperta
«(» per gli array.
L'algoritmo considererà uguali due
variabili se hanno i primi due caratteri
degli identificatori
corrispondentemente uguali, ignorando i caratteri
successivi.
Questo era un bug del vecchio programma, in quanto non ignorava i caratteri successivi ai primi due.
Quindi per esempio, se avesse incontrato una variabile di nome PIPPO
alla linea 100, l'output sarebbe stato:
PI100
PP 100
O 100
Trovata una variabile si deve vedere
se essa era già stata incontrata oppure
no: se no, ci dovremo annotare il nome e corrispondentemente
il numero
di linea nella quale era presente; se invece era già stata incontrata, annotiamo il nuovo numero di linea solo se
quest'ultimo non era già presente.
Nella scansione del testo Basic particolare attenzione va rivolta verso
quelle linee nelle quali siano presenti
comandi come «DATA», «REM»,
«FN» o semplicemente delle virgolette.
Quando troviamo un «DATA» occorrerà effettuare una scansione cieca
fino ai primi due punti «:» non compresi tra virgolette.
La routine che effettua tale scansione è già presente nel Sistema Operativo e, guarda caso, non è altro che la
routine alla quale salta il Basic quan-
A
f\$
B$
11313
1213
125
co
le
fl
P
se
:..;
90
1303
10
130
125
127
203
100
1:35
20
130
303
1313
1403
303
135
1:35
Un esempio di Olllptll del Cross-Reference.
140
do incontra il token corrispondente all'istruzione «DATA».
In tal modo è stato eliminato un altro inconveniente della routine originale la quale considerava allo stesso
modo «DATA» e «REM».
Per il «REM» dovremo effettuare
una scansione cieca fino in fondo alla
linea, eseguita anche qui dalla routine
Basic Rem.
Quando viene incontrato il token
corrispondente a FN ($a5), esso viene
memorizzato nel buffer come primo
carattere, seguito dal nome della variabile, mentre in stampa viene sostituito
da un asterisco.
Per le virgolette non esiste nel Sistema una routine che faccia al caso nostro: quindi occorre costruirne una la
quale dopo aver incontrato le virgolette, ignori tutto quello che viene dopo,
fino a quelle successive.
Anche il mio programma, purtroppo, ha un bug!!! (speriamo che sia il
solo!).
Se nel testo è presente un numero in
forma esponenziale, tipo 123E3, riconoscerà come variabile E3!!!.
Ho preferito non eliminare questo
errore in quanto il programma già abbastanza lungo si sarebbe ulteriormente complicato (si dovrebbe scartare la
variabile se il carattere precedente è
un numero).
Comunque chi ha voglia di correggerlo si faccia pure avanti!!!
Trovata dunque la variabile si entra
nella parte di programma riguardante
la gestione della lista multipla.
Si scandisce la lista principale alla
ricerca del nome della variabile memorizzato nel buffer, tenendo conto
dell'ordine alfabetico.
Se la variabile c'è, si va a scandire la
sottolista per vedere se il numero di linea corrente (CURLIN) è già presente.
In caso affermativo si tornerà alla
scansione del testo, altrimenti accoderemo il nuovo numero di linea che risulterà
automaticamente
ordinato
(grazie al S.O.! l).
143
----------------------------------------------------------------------
Se invece la variabile
non è stata
trovata,
allora
la dovremo
inserire
stando attenti di mantenere
ordinata
la lista.
Dovremo poi creare una sottolista e
memorizzarci
il numero di linea.
Tutti i vari inserimenti
di elementi e
creazioni di liste vengono effettuati attingendo
dalla cosiddetta
lista libera,
la quale inizialmente
è implementata
idealmente
nello spazio di memoria
compreso
tra la fine del programma
Basic e il tetto del Basic (MEMSIZ).
c.ioè la più alta locazione usata dal BaSIC.
Se il programma
richiede
più memoria di quella disponibile
si ha iI
messaggio
OUT OF MEMORY
ERROR e il ritorno al Basic.
In questo caso non sarà possibile effettuare il Cross-Reference
(comunque
questa eventualità
si presenta
molto
raramente).
Uso
Dopo aver digitato il programma
e
averlo salvato date il RU
e, se non
avrete commesso
nessun errore nella
battitura
dei data, vi sarà chiesto se
volete salvare il codice eseguibile
su
disco o su nastro, altrimenti
apparirà
il numero di linea corrispondente
all'istruzione
DATA nella quale c'è stato
l'errore di battitura
e il list della linea
errata.
Dopo questa semplice operazione
il
programma
sarà pronto e, per usarlo,
basterà
averlo
caricato
in memoria
con LOAD «nome prog.»,
< n. device>, I ed effettuato
un
EW per reinizializzare
i puntatori
Basic.
Potete quindi caricare il programma
di cui volete il Cross-Reference.
La sintassi
da eseguire
per avere
l'output è la seguente:
SYS 49152 [,WIDTHJ
dove width è il numero massimo di colonne su cui si vuole l'output (che per
default è pari a 40).
Per il video è sufficiente
allora digitare
SYS 49152
Da notare
che mediante
i tasti
CTRL o SHIFT o Commodore
si può
fermare e far ripartire il listato, mentre
con il tasto STOP si ha il ritorno al BaSIC.
Per inviare
digitare:
OPEN1,4
PRINT#1
se avete
l'output
alla
stampante
CMD1
SYS49152,80
CLOSE1
una
stampante
da 80 colon-
ne.
Una parola sui tempi di esecuzione:
per programmi
di ca. 10-15 kb sono
sufficienti
4-5 sec., mentre per quelli
più corti si ha una risposta quasi istantanea!
144
Note per la copiatura dei listati per il 64
Nel numero 44 (settembre
85) è stato pubblicato
un programma
di Checksum
per
aiutare i lettori nella copiatura
dei listati per il Commodore
64 pubblicati
sulla rivista.
Il funzionamento
è il seguente:
- copiate il programma
Checksum
del numero 44 e salvatelo su disco o cassetta:
- per la successiva
copiatura
di un listato (con Checksum),
caricate (dal vostro
disco o dal vostro nastro) il programma
di Checksum
e fatelo partire; a questo punlO
potete copiare le varie linee del listato, compresi
i due punti ed il numero che trovate
alla fine di ciascuna
riga. Alla pressione
del return, se la linea è stata copiata bene si
può passare a copiare la successiva,
altrimenti
il programma
di Checksum
vi lascerà
"inchiodati"
sulla linea mal copiata obbligandovi
a correggere
l'errore prima di proseguire.
A quanto detto nel numero 44 riguardo al programma
Checksum
in questione,
aggiungiamo
che la routine di Checksum
in LM si avvia con SYS 52480 mentre. in caso
di arresto con Run-SlOp/ReslOre,
il restart si effettua con SYS 53072.
Attenzione:
chi non vuole usare il Checksum,
O
DEVE copiare i due punti e il
numero alla fine delle righe, pena la segnalazione
di "syntax error" da parte del computer.
1
:2
;:
4
'5
.;
".~""'.".".Ill"."••••*••••• '
fi'Ef1
11134
P(I1 14'5
F'EM CPI)'S'3-REFEREHCE LOADER' 177'5
"'EM 14'7
REM
B't" LOREtlZO FOHTANI I 154)
REM 149
SIE~IA - 1062'
;-' ""EH
>3 PEI1 l'51
!? !"EM ••.•.•••••••.••.•••••••••••.•
11~2
113 SA-49152
"'EH '3TART AOORES$ .ceeo 2089
20 EA-49i'19
"'EH EHO
A[)()pESS SC237 , 1987
r"
~27e
j.;)
PRtNT":1lII:
';1
2.12.
LOROEP
4') PRIHT"
•
CROSS - PEFEPEt-CE
'W1"
21 '3'3
'51.3 PRIMT"
r
~e PRINTSPCc'52)"St(C>1986
8••.•LORENZO FONTANl:'1" 2627
70 PPl~n" .• ICAPICAHENTO RrJUTIHE:'" 28-37
ee PPINT"Wl INDIRIZZO 01 PAPTOIZA ".'SR 2203
90 PPINT"
WDIPl22a
01 FItlE
",EA 1987
100 UI.460
PS.10' 11046
110 Fafi' I.'5R TO EA 'STEP 16 1'368
120 'SM.e '506
:313 FaR J.e TO 1'5'921
1413 "'EAD P POte'E I+J.P
SM.('SM+P)AND2~~ 22137
1"50 IF I+J.EA THEN GOSU8 380' GOT02ee, le'5e
1';13 ~lEXT J '396
1713 GOSUB ::;ee' ~98
1$') U1-U1+PS 999
19~) ~lEXT l' ~2~
21.313
PPI~lT"1Il IREOISTRFlZIONE ROUTI~IE:'1"'23~9
218 INPUT":-l NOMEDEL FILE ",H.'l~'3.5
2213 PRItIT":.l
;) N "STRO
o
;I o !Il 'SCO." '2172
230 GETA. IFRt,·"N"THEN "'.-"LA
CACSSETTA:0-1 'GOTa 260 )177
NO IFA.(>"O"THEN2-)0·1288
C""50 11S·"IL DISCO" 0-8' U520
;:60 PRINT"lll I~ISE"'ISCI ";11.,"
E PREMI UN TASTO." 24040
270 POk.EI98,0'420
2e0 GETAf IFA•••••• THEH2eo' 11.52
~ge EA-EA+ l 700
3ee 'SH.IHT<SA .•..
256) SL.SA-2.56.SH
2316
'310 EH.IHT<EA .•..
2S6i EL-EA-2.56tEH 2256
320 POKE 193,SL PQt(E 194.SH 1206
3'30 POI(E 174.EL POKE 175,EH·1196
~40 S,",'$ 57812 H•• D. l '889
350 SVS 629.54 -REM SAVE .F5EA' 1.•044
360 ENO1233
.37113
'17.3
313e IO'EAOCl( I F CK-SM THEN PETURl'4'1~ 16
'3913 PRINT")IllG IEP'P'ORE NELLI1 LItIEA". L~112e42
4CO PRINT"XCLI'ST" ,Ul ..":-rTII'" 16.59
410 F'OKE631. 1504'POKE632, 13' POKE198, 2 '010' 1817
421-")
"22.3
·no REM USARE STESSI NUMERI 01 Lll'lEA !! '2491
44t) ,",EM"
':)523
4'50 ' '25:)
460 CATA 32. 121.0. ~49. 10,'32.0,226.224,
12, 176,~. 76, 72,178,162.30
''3097
4710 DATA 0410,1:)",2.165.122.72.165.123.72,·32.142.166,169.1
5.169.9.43
3178
04813DATA 145.4'5,1"36,
16. 2~1, 1~2. 168.8,145.4.5,208,192.12,209.2451.165.91
3'3'53
499 DATA 045.13:).7:).165.46.13:),74.32.119,193.160.6.16'5.
7'3. 145,4"5.71
3227
'599 ORTA 208,165,
704, 14~, 4~,32~ l 19. 19.'3. 160,2. 177.122,24.
28e. 3, 76,289' 327'3
'510 ORTA 153.193,200,177.
1~2. 133.~7 • 20EL 177, 122. 133,~8. 1"52,191,122.
1'3'3. le~ 3615
529 DATA 122,144,2,2'39,123
• .32. 11~,e, 170,249.221,162,
13.134,107,134.1044
'3889
"5'39 DATA 188, 1'34,195.281.131.2013,6,32,249,16'3.76.110,19'3.291,
104'3.298.228 32&9
'540 DATA 6.32. ~9, 169.76.72.192,
2el. 304,200.12,32,
l1S,0. 168,2"13,80'2906
'5'513DATA 183.201,34.298.246.2413.206.201.
165.208.6,13'3.106.232,32.
Il.5.212
3299
"i6e DATA a, 32, 121.0,32,19,177,1044,188,149,166,.32,115,
e. 144,5.249
2907
'570 [)FITA32.19.177,144.13.2.3,,(,149.1%.32.115,8,144.
251. ~~. 19. 177,106
3128
'580 DATA lU;, 246, 201. 16, 24'0, 4, 281 ,37,2138.6.232.149.1&6,32,115,9,197·3087
'590 DATA 201,40'.208,3.232,
149.106.165.4~,
133.95.165,46,
113.96, 169, 185 '3214
€.00 DATA 0.185,
196.9.299.9.5.288.34.280.192.4,298,244,2913,32,
1'39,8 3806
';;1'3 DATA 193,208.4.169,2,298.
se. 160. 121.177,95. 197 .~7. 2013. 7.290.164
3036
";~13 DATA 177,515.197.58,2
.•0.104. 169.3,20€L226,
1044.16, 165.9"3, 133,29,2"31
'3250
6313 DATA 165,96.13.'3,21.160,7.32.139.193.204.
144. 19~. 165. 7'3. 13'3.9"3.2.39' 3228
';;40 DATI1 165.704,1:33,96,32.119,193,160.6,177.29,1045.95.200,177.
29. 20 -1162
':·"56 OATrrl 14.5.9.5.165.96.145,20.
136. 16~. 9~, 14~. 20.160.3,
18!5, 106, 0, 104~11175
';;613 DATA 14~. 9~, 136. 16. 248. 160.4,165,
71. 14~. 9~. 208.165.74,145·9'5.169
J2!58
"S7'J DATA 165.74,133.96.165.73.133,95.32.116.193,1616.0,16'5.57.
14'5. 19' 3199
.;ee DATA 9'5,200,16'5,58.145,9.5,169.0.20121,145.9'5,2138,14'5.
9'5,32.121.168"32'58
O;:9(l
DATA 0.76,104,192,169.4.44,169.8.24,101.7'3.133.7'),144,2,36
2960
7'1313ORTA 2"30.74.165.74.197.5'3,208,16,
76, ~3, 164, 177,9'5,2040.9,72,114
3290
;'"113OATA 1'36,177.95.133.9'5.104.133,96.96,16'5,4.5.72.165.4';;,
72,104.1983317
:'2'3 DATA 133,96, lO", 133. 9~. 169.7,32,139·
193. 32. 215,170,168.113,177.'54
:)2'38
73:13DATA 95,281.2'5'5.248.124.281.16.5,2049,7,177.
9S, 2138. 5,169, '3;2,44, 219 '3297
:'413 DATA 169,42.32,12.225.200,192.
",,298,239,32.
63,171.16'3,9'5,72.129
1264
=''50 DATA 165. %. 7;2, 200,169,5,133.73,
'32. 1'39,193,2040,194.16.5.73.204.181
-3336
-6113DFlTrrl18~,6. 197,2,144,13,32.215,170.160
• .5,32,63.171.136.298.123
3211
:"70 DATA 250.169,
Il. 133, 73.32. 225,2~~.204e.53.
173, 1.1,2,208.246.
32. 19~· '3127
7S0 DATA 63.171.
169,0. 177. 9~. 133.99.200,177,
9~, 1:3).98,162.1"4,'56,171
'3118
:"90 DATFl"32.73.188,32,223.189.
32. 1~. 189,32.
166, 182. 170. 168. 192. '5. 207·3167
'300 [)FITA H'b,&'~,~
.200,208,246,32,37.171.160,'3.208.169,104,194,3112
810 DATA 10.·104.11'3.12'3.19
•• 13'3.122.96.151
1870
M
MCmicrocomputer
n. 53 - giugno 1986
(]l
-I:>
O)
<Xl
ill
o
lO
:J
c
lO
W
(]l
:J
c
eD
....•
"O
o
3
on
o"
3
s::
()
~
:>o
~
':::"
~
~
''""
ti
~
ft
..-..•'"
'"
<:>-
s"
:>.
:::
~
~
~
;;;
;:;
è
r--
<:;"
o
-
BV
I
LORENZO
21/02/1986
26/01/1986
COM 64
FONTANI
WIoTH
SINTASSI
:
SVS
lt9152
[, WIDTHl
NUMERO MAX DI CARATTERI
PER RIGA
WIDTH "" 40 PER DEFAUL T
:
i •••••••••••••••••••••••••••••••••
REVISIONE
ADATTAMENTO
PER
N.16
R E F E R E N C E
DA Me MICROCOMPUTER
S 5
VERSIONE
TRATTO
C R
** .****** •••••••••••.••••.•••••••••
2060
2070
2080
2090
2100
2110
2120
""~o
2010
2020
2030
2040
2000
1570
15BO
1590
1600
1610
1620
1630
1640
16:50
1660
1670
1680
1690
1700
1710
1720
1730
1740
1750
1760
1770
1780
1790
1800
1810
1820
1830
18ltO
1850
1860
1870
1880
1890
1900
1910
1920
1930
1940
1950
1960
1970
1980
1990
INIT3
,
INIT2
INIT1
PARl
NOPR
ILL
;
CHRGOT
NOPR
COMBYT
ILLEG
}SR
BEa
JSR
JMP
LDV
LDA
CLC
~***
l
LDA
STA
LOA
STA
JSR
LDY
LDA
STA
INV
LDA
STA
JSR
I
.2
($7A),
V
SCANSIONE
PUNLIB+l
(VARTAB),
LSTLBe
VARTAB
PUNLIB
VARTAB+ 1
PUNLIB+l
LSTLB8
••6
PUNLIB
(VARTAB),
(VARTAB),
.12
INIT2
CPV
BNE
.e
INITI
(VARTAB)
~~~
STA
DEV
BPL
TVA
LOV
POINT
(
;SETTA
IltO
COLONNE
(VIDEO)
ERROR
E LEGGE
UN
INTERO
IL
8
BVTES
DEL
;PARTE
TESTO
ALTA
BASIC
DEL
***
LINK
SKIP5
SKIPI0
CONT2
3070
3060
30~0
3020
3030
3040
2980
2990
3000
3010
2960
2970
2950
2930
2940
2920
2910
2900
2880
2890
3180
3190
3200
3130
3140
3150
3160
3170
LOOP3
LOOpe
LOOP4
SKIP8
SKIP7
28:50
2860
2870 SKIP6
2810
2820
2830
2840
2790
2800
3120
DI
CARATTERI
LINEA
2740
27:50
2760
2770
2780
2730
2700
2710
2720
~~~g;
2660
2670
2640
2650
SKIP4
X
Y
jSE
E'
'SE
jSR
BNE
LDV
;***
INV
X
~~~N~ST),
••o
SCANSIONE
VARTAB
PUNLST
VARTAB+l
PUNLST+l
C'E'
LA
SCAN
LISTA3
•• e
NUMERO
DELLA
PROGRAMMA
E'
CODICE
DI
' DATA'
IL
CODICE
DI
' REM'
I L COMMANDO I DATA"
PROSS I MO STATEMENT
IL
LINEA
I MO CARATTERE
DELLA
BUFFER
PROSS
E'
IL
ALLE
?
DI
I
FN'
VIRGOLETTE
MEMORIZZA
ALFABETICO
NEL
BUFFER
MEMORIZZA
NEL
I MQ CARATTERE
jO
j5E
('
LISTA
IL
DELLA
LISTA
:~~EE~ceI~~h
DELLA
t
DEI
'$'
DI
DELLA
VARIABILI
ALLA
BUFFER
LINEA
***
(cont;nua a pago /46)
(SOTTOLISTA)
NUMERICO
BUFFER
VARIABILE
***
LISTA
CARATTERE
BUFFER
E'
NUMERI
NOME
DELLE
PUNTATORE
NEL
PROSSIMO
MEMORIZZA
=
jSETTA
;LO
jSE
IL
NEL
TERMINATORE
MEMORIZZA
''''
IL
;LEGGE
IL PROSSIMO
CARATTERE
;FINO
AL PRIMO
CARATTERE
NE'
;E NE'
ALPABETICO
;LO
jO
;ALTRIMENTI
LO
; LEGGE
I L PROSS
;SE
E'
NUMERICO
LINEA
IL CODICE
NEL BUFFER
PUNTATO RE AL BUFFER
PROSSIMO
CARATTERE
CODICE
PROSSIME
PUNTATORE
LINEA
; LEGGE
IL CARATTERE
CORRENTE
; SE NON E'
ALFABET I CO
;CONTINUA
LA SCANSIONE
DELLA
jMEMORIZZA
; INCR.
IL
;lEGGE
IL
jSE
jFINO
IL
;VIRGOLETTE
; INCR.
VF:lRIABILE
jSCANSIONA
LA SOTTOLISTR
;SE
121
FINE
SOTTOLISTA
SCF:lNSIONE
BNE LISTAl
INV
CPY '4
BNE LOOP2
~~~
LDY
STA
LOA
STA
l
;***
l
LOA
BUF,
IL
DEL
jESEGUE
IL COMMANOO 'REM'
jVA ALLA
PROSSIMA
LINEA
jSE
; ESEGUE
; VA AL
jLEGGE
.'
(
SKIP8
IL
jSE
=0 FINE
i CACELLA
IL
j LEGGE
jLO
CMP
BNE
INX
STA
FINE
; INCR.
IL PUNTATO RE FINO
jALL"
INIZIO
DELLA
LINEA
INX
.'.
SKIP6
.'"
SKIP7
CHRGET
SKIPI0
ISLETC
SKIPI0
BUF,
CONTe:
ISLETC
SKIP:5
-o
;MEMORIZZA
;SE
~è~g~~1;h
CMP
BEa
CMP
BNE
JSR
BCC
JSR
BCS
INX
STA
BCC
JSR
BCC
CHRGOT
ISLETC
INIT4
CHRGET
~~~g~~IlT
JSR
JSR
BCC
BNE
STA
INX
JSR
SKIP4
BUF
CMP '.A:5
2600
2610
2620
2630
2590
SKIP3
BEn
2580
INIT3
BNE
LOOPl
"
INIT4
BEn
CMP
2570
.'
.,.,
SKIP3
2560
CMP
8NE
2520
2530
2:540
2:550
LOOPl
CHRGET
V
PUNLIB
; INCR.
***
AI
PER
~HIP2
CMP
ElNE
JSR
JMP
••• 8F
SKIP2
REM
INIT3
••• 83
CONTI
DATA
LISTA7
STX
CMP
BNE
JSR
JMP
INIT3
BUF+2
8UF+3
*0
BUF+l
CHRGET
HA
INIT4
HB
.7A
t~~~~N~l
~~~~~~/
CONT
OUTTAB
STX
TAX
8En
LOX
STX
JSR
INV
LDA
STA
INV
LDA
STA
TVA
AOC
STA
8CC
INC
BNE
JMP
JSR
TAV
2490
2500
2510
~m
24:50
2460
2440
2430
V
PUNLIB
,SETTA
L I STA
PUNTATORE
NUMERO MASSIMO
DI CARATTERI
IL PUNTATORE
AI CARATTERI
DELLA
;DEFAULT
;SETTA
;SALVA
aUANTITV
12
VARIABILE
CORRENTE
NOME DELLA
IL CARATTERE
FINE
LINEA
UNA VIRGOLA
DEL
~ONTl
INIT:5
INIT4
CONT
~:~g
2400
2350
2360
2370
2380
2390
2310
2320
2330
2340
2300
2270
2280
2290
2260
22:50
2230
2240
2200
2210
2220
2190
2150
2160
2170
2180
2130
2140
3080
3090
3100
3110
V
V
X
; ILLEGAL
,SE
,LEGGE
;SE
Z-l
,SALTA
***
;BUFFER
:~fA~~~oe~
~~~I~é~INGA
TEMPORANEA
;COTROLLA
LA PRESSIONE
DEL TASTO'
STOP'
,SALTA
UNA VIRGOLA
E LEGGE UN INTERO
;STAMPA
UN FINE
LINEA
SUL FILE
DI USCITA
,STAMPA
UNO SPAZIO
SUL FILE
DI USCITA
; STAMPA 'ooT
OF MEMORV ERROR'
,STAMPA'
ILLEGAL
QUANTITV
ERROR'
,STAMPA
UN CARATTERE
;RIINIZIALIZZA
IL PUNTATORE
DEL CARATTERE
CORRENTE
,COMMANDO BASIC
'DATA'
,COMMANDO BASIC
' REM'
,CONTROLLA
IL CARATTERE
IN A
,LEGGE
IL PROSSIMO
CARATTERE
,LEGGE
I L CARATTERE
CORRENTE
; SETTA
IL FLP ACCUM.
;CONVERTE
FLP ACCUM.
IN STRINGA
,SPOSTA
IL DESCR.
DI STRINGA
NEL FLP ACCUM.
INIZIALIZZAZIONE
STXPT
.7B
MAXCHR
.7A
'40
~OV .15
LDA IO
:***
STX
LDA
PHA
LOA
PHA
JSR
LDX
it~~A~l
ENTRV
:***
-.6A
6UTMEM ·.A43S
ILLEG
-.8248
9CHOUT -.EIOC
5r XPT
-.ASSE
DATA
-SA8F8
REM
·.A93B
ISLETC -.9113
CHRGET ·$0073
CHRGOT -.0079
INTOFC -.BC49
FVOUT ·.BDDF
STRIL T ·.9487
FRESTR
-.B6A6
OUTSTR
-.AB25
STOP
·.FFEI
COMBVT -.E200
OUTRET
-.AAo7
auTSPC
·.AB3F
~~~gAUF
1380
1390
1400
1410
1420
1430
1440
1450
1460
1470
1480
llt90
1500
1510
1520
1530
15ltO
ti~g
1230
i •••••••••••••••••••••••••••••••••
1240
1250
*-.COOO
1260
1270
;
;PUNTATOREI
INIZIO
DELLE
VARIABILI
BASIC
1280 VARTAB -.20
;PUNTFHOREI
LISTA
LIBERA
1290 PUNLIB ·.49
l PUNTATORE I ELEMENTO
CORRENTE
DELLA LISTA
1300 PUNLST -.~F
; PUNTATO RE I ELEMENTO
PRECEDENTE
DELLA LISTA
1310 PUNELM ·$14
,NUMERO
DI LINEA
CORRENTE
1320 CURLJ N -.39
; PUNTATO RE I INDIRIZZO
PIU'
ALTO USATO DAL BAsrc
1330 MEMBIl
-$37
jNUMERO MASSIMO
DI CARATTERI
PER LINEA
1340 MAXCHR ·.02
,FLAGI
TASTI
SHIFT,
CTRL,
C13:50 SHFLAG ·.0280
1220
1040
10:50
1060
1070
1080
1090
1100
1110
1120
1130
1140
Il:50
1160
1170
1180
1190
1200
1210
1030
1000
1010
1020
2
..,.
:J
Q)
co
<D
o
I
4300
4270
4280
4290
4240
4250
4260-
4230
C
4210
4190
4200
4180
4160
4170
4130
4140
4150
4120
4080
4090
4100
4110
4060
4070
4010
4020
4030
4040
4050
3990
4000
3980
3950
3960
3970
3940
3860
3870
3880
3890
3900
3910
3920
3930
3840
38~O
3820
3830
3800
3810
3760
3770
3780
3790
3730
3740
3750
-4220
te
LISTA6
lISTA1
LISTA2
LISTA3
BNE
LISTA:5
(PUNLST>,
i~TLBB
PUNLIB
PUNLST
PUNLIB+1
PUNLST+ 1
~~~N~ST),
JSR
JMP
LDA
STA
INV
LDA
STA
LDA
STA
LDA
STA
JSR
LDV
LDA
STA
INV
LDA
STA
LDA
INV
STA
INV
STA
l
1**
CHRGOT
INIT5
PUNLIB+l
MEMSIl + 1
EXT
OUTMEM
Y
LDA (PUNLST l , Y
BEO EXT
PHA
DEV
LDA (PUNLST>, Y
STA PUNLST
PLA
l****·******
SCAN
LDA
CMP
BNE
JMP
PUNLI8
PUNLI8
CHECK
PUNLIB+l
18
LOA 14
.2C
LDA
CLC
ADC
STA
BCC
INC
I
I
Y
(PUNLST>
(PUNLST>
Y
Y
I
Y
Y
CURLIN+l
(PUNLST),
IO
CURLIN
(PUNLST>
.0
PUNLIB+1
(PUNLST),
PUNLIB+l
PUNLST+l
PUNLIB
PUNLST
LSTLB4
PUNLIB
(PUNLST>,
:**********;*
5 C A N *
CHECK
• BYTE
LSTLB8
Y
Y
Y
Y
Y
Y
Y
INSERIMENTO
DEV
BPL LOOP~
LOY 14
~~~
Y
V
INSERIMENTO
LDA (PUNELM),
STA (PUNLST>,
INV
LDA (PUNELM),
STA (PUNLST>,
LDA PUNLST+1
STA CPUNELM),
DEV
LDA PUNLST
STA (PUNELM),
LOY 13
r5~
LDA
STA
LDA
STA
;
:*.
CLC
BCC LOOP4
LISTA6
PUNLST
PUNELM
PUNLST + 1
PUNELM+ 1
~~AN
LOOP3
J~~
BCC
LDA
STA
LDA
STA
BNE
LOY .3
BEG1 LISTA?
CMP CURLIN+l
INV
LDA
BNE LISTA2
LOV .0
LDA
«PUNLST),
CMP CURLIN
;************
;* LSTLIB
*
;************
LSTLB4
LISTA7
LISTA5
3610
3620
3630
3640
3650
3660 LOOPS
3670
3680
3690
3700
3710
3720
3600
3560
3570
3580
3590
3540
3550
3:510
3520
3530
3500
3480
3490
3470
3460
3440
3450
3430
3420
3410
3400
3360
3370
3380
3390
3350
3280
3290
3300
3310
3320
3330
3340
3260
3270
3250
3230
3240
3210
3220
(segue da pago /45)
te
w
(]l
:J
ro.,
"lJ
C
o
3
()
o
o·
3
5:
o
Q)
,VA
AD
,SE
GHP
CONTINUA
PRESENTE
LA
ALLA
DELLE
PUNLST
LISTA
ALL'
LISTA
LA
PARTE
CURLIN
;SCANSIONE
LINEA
PUNTATO RE DELL'
ELEMENTO
E CONTROLLA
NELt.'
A PUNLIB
DI
INSERITO
SPAZIO
ELEMENTO
INSERITO
8
4
PROSSIMA
LISTA
SPAZIO
DELLA
LO
IN
E DELLA
MEMORIA
ISTRUZIONE
SOTTOLISTA
IN
IN
(NIL)
LO SPAZ IO
(SOTTOLISTA)
ELEMENTO
LO
LINEA
ME,.,.
***
MEM.
SOTTOLISTA
DELLA
CARATTERE CORRENTE
LA SCANSIONE
DEL PROGRAMMA 8ASIC
4
LIBERA
***
LISTA
SUCCESSIVO
CONTROLLA
NELL'
NUMERI
BUFFER
DEI
IL
PUNTATO RE PUNL I B
;CONTROLLA
; AL
;AGGIUNGE
;AGGIUNGE
;SALTA
LA
;LEGGE
IL
;CONTINUA
;AZZERA
,MEMORIZZA
;AGGIUNGE
,INSERIMENTO
NELLA
;MEMORIZZA
LISTA
VARIABILI
DELLA
SCANSIONE
VARIABILI
SOTTOlISTA
(CURLIN)
LISTA
DELLE
CORRENTE
DELLA
ELEMENTO
SCANSIONE
~~~~~~~~~EBL~Er~~~~~oE
;SETTA
NELLA
LA
PUNLST
;CONTINUA
; SETTA
LA
CON
NELLA
SCANSIONE
CONTINUA
LINEA
L'ELEMENTO
NUMERO DI
; INSERZIONE
ORDINATA
NELLA
I SETTA PUNELM ALL' ELEMENTO
;ALTRIMENTI
IL
INSERIRE
;COMPARA
3
PRLN1
5380
5370
5360
5350
5340
5320
5330
5310
5300
EXTl
5~~g
~m
5290
5260
5250
5210
5220
5230
5240
5200
5140
:5150
5160
PRLN2
5170
DESTRA
5180
5190
5130
5110
5120
5070
5080
5090
5100
1'*
*3
CICL03
OUTSTR
PRLN2
PRLNl
OUTSPC
.5
INTOFC
FYOUT
STRILT
FRESTR
•• 90
STAMPA
(PUNLST),
.62
i~~NLST),
STOP
EXT2
SHFLAG
STOPI
OUTSPC
.0
PUNLIB
OUTS
*11
OUTSPC
16
MAXCHR
OUT4
OUTRET
15
SCAN
CICL02
PUNLIB
15
PUNLIB
.END
Y
Y
Y
V
IL
IN
IL
CONTATORE
DEI
LISTA
DELLE
IL
CONTATORE
DEI
;E
***
NEL
A
16
FLP
LINEA
ACCUM.
,CONTINUA
;STAMPA
;JMP
;STAMPA
LEN
LA
SCANSIONE
;E
RITORNA
AL
SASIC
AI
PER
ACCUM.
A
4
cassetta presso la redazione. Vedere l'elenco dei programmi disponibili e le
istruzioni per l'acquisto a pago J 60.
Q-u--e-s-IO--p-r-o-g-ra-n-1-m-a--è-d-i-s-p-o-n-ib-i
I-e-s-u-'
CARATTERI
FLP
BLOCCATA
L'ALLINEAMENTO
SOTTOLISTA
SPAZI
DELLA
STRINGA)
STRINGA
-
DELLE VARIABILI
,RIPRISTINA
IL PUNTATORE
LA
(S
NEL
STAMPA
SETTA
I L FLP ACCUM.
CONVERTE FLP ACCUM.
IN STRINGA
MEMORIZZA
IL DESCR. DELLA STRINGA
DE-ALLOCA
UNA STRINGA
TEMPORANEA
L'ESPONENTE
LINEA
1SETTA
DI
LO MEMORIZZA
;STAMPA
SPAZ IO
jLEGGE
IL NUMERO DI
CARATTERI
OUTPUT
STAMPATI
VARIABILI
CARATTERI
; CONTROLLO PRESS IONE TASTO STOP
; SE PREMUTO FINE
STAMPA
;SE PREMUTI
SHIFT
o CTRL O CE I
,RI-INIZIALIZZA
OUTPUT
VARIABILE
;E'
) o = MAXCHR ALLORA
;STAMPA
UN FINE
LINEA
SUL FILE
DI
;STAMPA 6 SPAZI
PER L'ALLINEAMENTO
;+ 6
;SCANSIONA
LA SOTTOLISTA
;SE Z-l
FINE
DELLA SOTTOLISTA
; SE I L CONTATORE DE I CARATTER I
; INIZIALIZZA
A
ISTRUZIONE
CARATTERE
*'
PROSSIMA
DELLA
DI
VARIABILI
FILE
VARIABILE
'FN'
; STAMPA UNO SPAZ I o
;SALVA
IL PUNTATO RE ALLA
STAMPA
LISTA
'FN'
;STAMPA
;SE
DI
NOME DELLA
,*,
STAMPA'
IL
;SAL TA LA
;STAMPA
SUL
DELLE
PRIMO CARATTERE
FINE
DELLA LISTA
LINEA
LISTA
UN FINE
LA
PUNLST
***
;SE E'
IL CODICE
;STAMPA UN
;LEGGEIL
,SE =.FF
;STAMPA
;SCANSIONA
; RIPRISTINA
NUMERI
PUNLST+ 1
CICLOI
OUTSPC
PUNLST
.4
BCHOUT
~FINE
DELLA
LA
PLA
~FINE
DELLA
LA
STA $"78
PLA
STA .7A
RTS
LDY
BNE
JSR
8CS
JSR
INV
BNE
CPY
LDX
SEC
JSR
JSR
JSR
JSR
TAX
TAV
;**
~~~
JSR
BEe
LOA
BNE
JSR
LDY
STA
JSR
DEV
BNE
LDA
JSR
BEO
LDA
CLC
ADC
CMP
BCC
JSR
LDV
LDA
STA
INV
JSR
INY
CPV
BNE
JSR
LDA
PHA
LDA
PHA
LDA
5050
5060.
5020
ri~~~LST),
EXT1
•• A5
OUT3
~~W~LST),
.0
SCAN
OUTRET
.7
PUNLST
PUNLST+l
VARTAB
COSTRUITA
I SALVA
TABELLA
VARTAB+ 1
VARTAB
DELLA
PUNLST+ 1
LDA 132
• BYTE .2C
~~~
PLA
STA
PLA
STA
LDV
JSR
JSR
LDV
LDA
CMP
BEe
CMP
BEe
LDA
PHA
LDA
PHA
STAMPA
RTS
STA
5030
5040
,
STOPI
OUT4
aUT5
CICL03
OUT2
OUT3
CICL01
CICL02
6UTTAB
;***
;
EXT
INV
LDA
STA
5010
4990
5000
4970
4980
4960
4940
4950
4790
4800
4810
4820
4830
4B40
4850
4860
4870
4880
4890
4900
4910
4920
4930
4780
4610
4620
4630
4640
46~0
4660
4670
4680
4690
4700
4710
4720
4730
4740
4750
4760
4770
4600
4~20
4530
4540
4550
4560
4570
4580
4590
4510
4500
4490
4,+70
4'+80
4460
4410
4420
4430
4440
4450
4390
4400
4310
4320
4330
4340
4350
4360
4370
4380
i
a,
cn
Scarica

ICross Reference