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