Articolo pubblicato sul n. 36 di MCmicrocomputer (Edizioni Technimedia Srl - Roma) nel dicembre 1984
Commodore 64 (seconda parte) Continua la serie di articoli sull'implementazione di nuove istruzioni Basic sul vostro Commodore 64. Dopo aver visto le istruzioni piu' o meno standard per l'uso di una unita' a dischetti, in questo numero vedremo comandi un po' piu' evoluti, meno banali, sempre per la gestione del driver 1541. Potremo cambiare nome a un dischetto, visionare un programma senza occupare la memoria, curiosare tra tracce e settori di un floppy ecc.ecc.
Divideremo questo articolo in due sezioni. Nella prima daremo una descrizione dei comandi implementati, loro uso e sintassi (tipo manuale di istruzioni) senza scendere nei dettagli organizzativi. Nella seconda sezione, spiegheremo come e perche' tali comandi funzionano a livello di interprete Basic, riferendoci ai disassemblati listati in queste pagine. Al lettore la scelta su cosa leggere in queste pagine. E' ovvio che per intenderci sulla seconda sezione e' richiesta una seppur minima conoscenza di linguaggio macchina 6510, o 6502 se preferite. Altri 8 comandi In comandi presentati questo mese sono in tutto 8 , alcuni dei quali veramante inediti. Inizieremo dal comando EXE che carica e manda in esecuzione un programma da disco. La sua sintassi e': EXE "NomeProgramma" dove "NomeProgramma" e' il file da caricare e mandare in esecuzione. Equivale a un DLOAD (visto nel numero scorso) seguito a fine caricamento da un RUN€£+€£[RETURN]. Anche questo comando di caricamento e' possibile darlo da Directory, semplicemente posizionandosi sul programma scelto (dopo il CAT) e digitando EXE seguito da qualche spazio per cancellare il tipo di file mostrato su video insieme al nome vero e proprio. BLOAD "NomeProgramma" Questo comando carica da disco un programma (presumibilmente, ma non necessariamente) in linguaggio macchina, posizionamdolo non all'inizio area Ram utente, ma nello stesso punto da dove era stato salvato. Corrisponde alla sequenza Basic LOAD€£"NomeProgramma",8,1. BSAVE "NomeProgamma,Inizio,Fine" Serve per salvare programmi L.M. o piu' in generale sezioni di memoria, diverse da quella occupata da un programma Basic. L'indirizzo iniziale e finale vanno espressi in esadecimale, di 4 cifre, e (molto importante !) inseriti fra apici di seguito al NomeProgramma. Esempio: vogliamo salvare su disco la Rom del Basic (indirizzi $A000-$BFFF): BSAVE "RomBasic,A000,BFFF" [RETURN] Il quarto comando di questo mese e' RANGE e serve per conoscere, senza caricare nulla, dove sara' posizionato un programma usando il comando BLOAD. La sua sintassi e': RANGE "NomeProgramma" e stampa su video in decimale l'indirizzo iniziale e finale. Se ad esempio, dopo aver salvato con BSAVE la Rom del basic digitiamo: RANGE "RomBasic" [RETURN] Vedremo apparire su video i valori 40960 e 49151 (corrispondenti a $A000 e $BFFF). TRSE Traccia,Settore E' usato per leggere un settore di una daterminata traccia di un dischetto. Dato che non tutte le tracce hanno uguale numero di settori, in figura 3 e' riportata la corrispondenza NumeroTraccia-NumeroSettori. APPEND "NomeProgramma" Serve per saldare brutalmente due programmi Basic, uno in memoria e l'altro su disco. Brutalmente vuol dire che i numeri linea dei due programmi non hanno voce in capitolo: dopo l'ultima linea del primo programma e' posizionata la prima linea del secondo. Si dia uno sguardo alla foto 3. Per cambiare il nome a un dischetto senza riformattarlo, ossia senza perdita di file, e' disponibile il comando: DISKNAME "NuovoNome" In una primitiva versione di questo comando era possibile cambiare anche l'identificatore. Poi qualcuno (grazie Fulvio, come farei senza di te, n.d.r) mi ha ricordato che l'identificatore non sta solo nella Directory ma inciso al momento del formattamento nell'header di tutte i settori. Cambiarlo solo nella directory non ha effetto: per il driver, l'ID e' quello inciso su tutto il dischetto. Cambiarlo in tutti i settori non e' possibile da computer, ma solo da parte del sistema operativo del disco (leggi lavoraccio da cani), morale della favola: chi si accontenta gode. L'ultimo comando di questo mese e': VIEW "NomeProgramma" e serve per visionare un programma, vedere il suo listato, senza caricarlo in memoria: direttamente dal disco su video (o sui vostri teleschermi, se vi fa piu' comodo). Per bloccare lo scroll e' possibile agire sul tasto Run/Stop. General Remarks Il listato 1 implementa l'istruzione EXE. Come facilmente prevedibile, il suo funzionamento e' abbastanza semplice: si limita a inserire nel buffer di tastiera la sequenza "[CLR] [R] [Shift U] [RETURN]" e di cedere il controllo al normale DLOAD (indirizzo $C4AC). Il primo carattere (corrispondente a un cuoricino reverse) serve per cancellare il video; il secondo unito al terzo sono l'abbreviazione del comando RUN, il quarto e' il Return da tastiera. Appena caricato il programma, il buffer di tastiera si svuota cancellando il video e dando RUN al programma. Il listato 2 mostra l'implementazione del comando BLOAD: anch'esso molto semplice. Come DLOAD, non fa che settare ancuni byte prima di cedere il controllo al LOAD del Basic standard. Oltre a indicare come periferica il disco (device #€£8), inserisce in $B9 il numero 1. $B9 e' appunto l'indirizzo secondario del LOAD. L'istruzione BSAVE e' implementata dal listato 4; la subroutine del listato 3 e' adoperata da BSAVE per convertire il codice ascii di una cifra Hex (0,1,2,3,4,5,6,7, 8,9,A,B,C,D,E,F) nel suo effettivo valore, compreso cioe' tra 0 e 15. Fino all'indirizzo Hex $C667, il programma BSAVE non fa altro che convertire i parametri di inizio e fine passati insieme al nome del file, ponendoli nelle locazioni FB-FC e A8-A9. Naturalmente controlla la sintassi (numero cifre e presenza di virgole al punto giusto) eventualmente inviando messaggi di errore al video. Dall'indirizzo C66B in poi, dopo aver aperto un file di tipo programma (indirizzo secondario 1, siamo nel caso di scrittura) e aver spedito al disco il puntatore di inizio, manda al driver tutti i byte da salvare. Termina chiudendo ogni canale e il file di tipo PRG, saltando infine all'istruzione FLASH per visualizzare un eventuale messaggio del disco. Il comando RANGE (listato 5) apre un file di tipo programma (indirizzo secondario 0, lettura) col nome passato come parametro. Legge i primi due byte, interpretandoli come indirizzo iniziale, e stampa il loro valore (primo byte + secondo byte * 256) su video. Continua a leggere byte, incrementando opportunamente un contatore, fino a quando ST diventa 64. Termina stampando l'indirizzo di fine e saltando all'istruzione FLASH per eventuali errori di disco. Il listato 6 implementa il comando TRSE. Il salto alla subroutine $B7EB serve per leggere i parametri passati. Al suo ritorno X conterra' il Settore, $14 la Traccia. Per il resto fa esattamente quanto indicato (in basic) nel riquadro a pag. XX. Il comando APPEND pone in X e in Y l'inizio dell'area di caricamento (indirizzo di fine programma in memoria - 2) e salta alla subroutine Kernal $FFD5 (load from device). Il salto a $A533 serve per concatenare linee Basic. Prima di terminare, scorre i link delle nuove linee per settare i vari puntatori di fine Basic, inizio variabili ecc. Piu' in dettaglio vedremo le ultime due istruzioni, fiore all'occhiello di questa puntata. Il comando DISKNAME (listato 8) dopo aver letto il nuovo nome passato come parametro (JSR $E1D4) prepara un buffer di 18 byte a partire dalla locazione $340, inizialmente riempendolo di "shift spazi". Successivamente pone il nuovo nome nel buffer (ciclo $C7D6...$C7DE). A questo punto apre il canale di comunicazione, da' un INIT al disco e apre un file dati di nome "#" (allocazione di area Ram del disco per trasferimanto dati). Il comando spedito e' "U1:3,0,18,0" (stivato nelle locazioni $CFF0 e seguenti) e serve per trasferire nell'area Ram allocata il settore 0 della traccia 18 che contiene il nome del dischetto. Dalla Ram del disco il settore e' trasferito nelle locazioni $A000-$A0FF, nella Ram che doppia la Rom del Basic. A partire da $A090 e' posto il nuovo nome. Dopo aver spedito il comando "B-P:3,0" per inizializzare il puntatore alla Ram del driver, inizia il trasferimento opposto, dal 64 all'area precedentemente allocata. Per fare questo e' necessario sganciara la Rom del Basic per accedere in lettura alla Ram nascosta. Cio' avviene modificando il bit 0 del byte 1. Terminato questo trasferimento si "riaggancia" il basic e si ricopia il tutto nel settore 0 della traccia 18. Si spedisce il comando "U2:3,0,18,0" ottenuto modificando in 2 l'uno di U1 stivato alla locazione $CFF1. Dopo aver chiuso tutti i file, non resta che riconvertire in U1 l'U2 di cui sopra e saltare a $C400 dove e' implementata l'istruzione INIT. Il comando VIEW (listato 9), dopo aver letto il nome del programma da listare, apre un file di tipo PRG e il canale di comunicazione col disco di tipo input per leggere un eventuale messaggio di errore. Cio' puo' avvenire se il programma non e' presente sul disco. Subito dopo inizia la visualizzazione del programma prelevando byte dopo byte tutte le linee fino a quando non se ne incontra una (l'ultima del programma) con il link a (0,0). Come per la routine di LIST vista sul numero scorso per ogni byte maggiore di 127 incontrato al di fuori degli apici, e' necessaria la dovuta detokenizzazione, la riconversione in caratteri del comando basic tokenizzato. La tabella di tutte le istruzioni Basic (vecchie e nuove) e' locata a partire dal byte $CD00, nell'area occupata dall'ADP Basic. Terminata la visualizzazione sono chiusi i vari canali aperti, e lasciato il controllo all'istruzione DATA.
Impaginato originale... Articolo pubblicato su www.digiTANTO.it - per ulteriori informazioni clicca qui |