Ready64 Forum
Commodore 64 => Aiuto & Domande => Topic aperto da: Hal9000 - 15 Novembre 2019, 19:59:04
-
Salve,
se per la somma di due byte (aritmetica senza segno) l'eventuale riporto (carry) può essere memorizzato in un ulteriore locazione di memoria (parte bassa-parte alta contenente carry), nel caso della differenza fra due byte, l'eventuale prestito, che comporta l'azzeramento del carry (precedentemento impostato tramite sec) come viene gestito?
Grazie
-
1. Imposti il flag di carry con SEC
2. Esegui la SBC
3. Verifichi il flag carry
3a. Se il carry è ancora impostato, non c'è stato prestito e non devi fare nulla di particolare
3b. Se il carry è stato resettato, c'è stato prestito e devi tenerne conto nella prosecuzione del programma
Un esempio semplice: hai un puntatore (byte basso-byte alto) a $FB-$FC. Vuoi aggiornare il puntatore facendolo puntare ad un indirizzo $20 byte più in basso.
LDA $FB ; byte basso
SEC
SBC #$20
BCS noprest
DEC $FC ; byte alto
.noprest
STA $FB
N.B. qui assumiamo che $FC non contenga già uno zero in partenza, perché si tratta di un puntatore. Di solito, quando si programma, i puntatori non contengono valori arbitrari, ma punteranno da qualche parte in RAM e non in pagina zero. Se operi con numeri arbitrari, in base a cosa stai facendo, può essere necessario aggiungere un qualche controllo.
-
Grazie
-
https://i.imgur.com/3DvE1pq.png
se ho ben capito...
MOD - Sostituita immagine con link. -eregil
-
Per cortesia, prendi visione del Regolamento (http://ready64.org/smf/index.php?action=rules), in particolare riguardo l'invio di immagini (art. 6). Sposto anche in Aiuto perché l'argomento si evolve verso le basi piuttosto che verso una produzione di codice (che è lo scopo della sezione Programmazione).
L'immagine che riporti, oltre a fare confusione tra operazioni di interi con segno e senza segno, non è corretta. La sottrazione 260-5=255 in binario viene scritta:
1 0000 0100 -
0000 0101 =
1111 1111
Torniamo all'esempio del puntatore in $FB (anche se poco realistico in questo caso). All'inizio hai
$FB: 04
$FC: 01
corrispondenti al byte basso e al byte alto di 260. Durante l'esecuzione di un blocco simile a quello di cui sopra si avrebbe:
LDA $FB ; A ora vale #$04
SEC ; imposta il flag carry
SBC #$05 ; ora A vale #$FF e il carry è resettato (prestito)
BCS noprest ; branch non eseguita, si passa alla DEC
DEC $FC ; ora il valore in $FC passa a #$00
.noprest
STA $FB ; e in $FB viene scritto #$FF
Se invece il valore in $FB fosse inizialmente #$08 (corrispondente alla sottrazione: 264-5=259), dopo la SBC nell'accumulatore sarebbe #$03, e il carry non sarebbe resettato (nessun prestito). Quindi la BCS eseguirebbe il salto alla STA, che scriverebbe #$03 in $FB, e la DEC non verrebbe eseguita, lasciando #$01 nella locazione $FC.
-
Ciao, si in effetti dopo aver pubblicato l'immagine, mi sono reso conto che avevo fatto confusione tra signed/unsigned, volevo correggere il danno, ma il forum dopo un tot di tempo non mi permetteva di correggere... :headshake:
L' ultimo esempio esempio da te postato ha chiarito ogni dubbio.
Grazie e ....ovviamente vi disturberò spesso :mattsid: