User Tools

Site Tools


content:retrocomputing:assembly

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
content:retrocomputing:assembly [2024/07/14 16:43] admincontent:retrocomputing:assembly [2024/09/10 21:27] (current) – [Sintassi] admin
Line 217: Line 217:
  
 Le righe $0345 e $0347 possono essere spiegate così: **CPX** (//'compare X'//) in realtà effettua una sottrazione del valore immediato $06 dal registro X. In questo modo, si ottiene un valore, che se non è zero (**BNE**, che verifica il //flag Zero//) comporta un //branch//, creando così il //loop//. Le righe $0345 e $0347 possono essere spiegate così: **CPX** (//'compare X'//) in realtà effettua una sottrazione del valore immediato $06 dal registro X. In questo modo, si ottiene un valore, che se non è zero (**BNE**, che verifica il //flag Zero//) comporta un //branch//, creando così il //loop//.
 +
 +Il //branch// è sempre //relativo//, con valori +-127 byte rispetto a dove è stato invocato.
  
 Il **//flag Carry//**, oltre che dalle operazioni aritmetiche, viene **influenzato anche dalle operazioni di comparazione CPX, CPY e CMP**, come indicato qui di seguito. Il **//flag Carry//**, oltre che dalle operazioni aritmetiche, viene **influenzato anche dalle operazioni di comparazione CPX, CPY e CMP**, come indicato qui di seguito.
Line 642: Line 644:
 ==== Indirizzamento Indirect, Indexed ==== ==== Indirizzamento Indirect, Indexed ====
  
-L'indirizzamento di tipo **//Indirect, Indexed//** consente di raggiungere più tutte le locazioni di memoria da una singola istruzione. Un limite di questo tipo di indirizzamento è che **l'//indirect address// (quello specificato tra parentesi) deve risiedere nell'area di memoria //Zero Page//**, da $0000 a $00FF, a differenza dell'**[[#indirizzamento_indirect|indirizzamento indirect]]**. +L'indirizzamento di tipo **//Indirect, Indexed//** consente di raggiungere tutte le locazioni di memoria con poche istruzioni. Un limite di questo tipo di indirizzamento è che **l'//indirect address// (quello specificato tra parentesi) deve risiedere nell'area di memoria //Zero Page//**, da $0000 a $00FF, a differenza dell'**[[#indirizzamento_indirect|indirizzamento indirect]]**. 
 Il problema è che la //Zero Page// è preziosa e ci sono pochissimi indirizzi che possono essere usati senza problemi, ad es. il range da $FC a $FF, che consente l'utilizzo di due //indirect address// completi (2 byte ciascuno). Il problema è che la //Zero Page// è preziosa e ci sono pochissimi indirizzi che possono essere usati senza problemi, ad es. il range da $FC a $FF, che consente l'utilizzo di due //indirect address// completi (2 byte ciascuno).
  
Line 665: Line 667:
 <note tip> <note tip>
 Il metodo di indirizzamento di tipo **//Indirect, Indexed//** consente di raggiungere/modificare tutte le locazioni di memoria perché consente di incrementare il MSB e, tramite il registro Y, il LSB; così facendo si raggiungono 256x256=65536 locazioni di memoria, cioè 64K. Il metodo di indirizzamento di tipo **//Indirect, Indexed//** consente di raggiungere/modificare tutte le locazioni di memoria perché consente di incrementare il MSB e, tramite il registro Y, il LSB; così facendo si raggiungono 256x256=65536 locazioni di memoria, cioè 64K.
-</node>+</note>
  
 In realtà le locazioni della //screen RAM// sono solo 1000, quindi il codice sopra non è ottimizzato, andando a inserire $20 in altre locazioni, tra cui i puntamenti degli //sprite//: In realtà le locazioni della //screen RAM// sono solo 1000, quindi il codice sopra non è ottimizzato, andando a inserire $20 in altre locazioni, tra cui i puntamenti degli //sprite//:
Line 717: Line 719:
 Quindi, nella posizione $801 viene inserito il programma 10 SYS2064, che quindi rimanderà alla locazione 2064 ($810), dove sarà presente il codice //main://. Quindi, nella posizione $801 viene inserito il programma 10 SYS2064, che quindi rimanderà alla locazione 2064 ($810), dove sarà presente il codice //main://.
  
 +===== Turbo Macro Pro =====
 +
 +**Turbo Macro Pro (TMP)** è un altro assembler/monitor. Si può scaricare da **[[https://csdb.dk/release/?id=182920|qua]]**.
 +
 +==== Avvio ====
 +
 +  * effettuare un //Attach// del disco .d64 scaricato sopra
 +  * dare LOAD "$",8
 +  * dare LOAD "TMP ...non REU",8,1 (:!: il ",1" finale è fondamentale)
 +  * eseguirlo con SYS 32768
 +
 +TMP si avvierà:
 +
 +{{:content:retrocomputing:tmp01.png?600|}}
 +
 +==== Sintassi ====
 +
 +Sembra sia fondamentale che, in questa versione, i comandi siano scritti in **minuscolo**, pena comparsa messaggio d'errore //"illegal pseudo-op"//:
 +
 +{{:content:retrocomputing:tmp02.png?600|}}
 +
 +Per **assemblare** si usa la "<-" freccia a sinistra dell'"1"; in Vice si usa **"Fn+cursore dx"**:
 +
 +{{:content:retrocomputing:tmp03.png?600|}}
 +
 +e poi "S".
 +
 +Nel caso specifico si esegue il programma con 'SYS 4096' (che è pari a $1000) per ottenere:
 +
 +{{:content:retrocomputing:tmp04.png?600|}}
 +
 +Per ritornare all'editor basta digitare:
  
 +  SYS 32768
 ===== VIC 20 ===== ===== VIC 20 =====
  
content/retrocomputing/assembly.1720968222.txt.gz · Last modified: 2024/07/14 16:43 by admin