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 10:49] – [Indirizzamento Indirect] admincontent:retrocomputing:assembly [2024/09/10 21:27] (current) – [Sintassi] admin
Line 214: Line 214:
   - può essere implementato, assieme all'accumulatore, per ottenere un indirizzamento di tipo //Absolute Indexed mode// (vedi riga $033e)   - può essere implementato, assieme all'accumulatore, per ottenere un indirizzamento di tipo //Absolute Indexed mode// (vedi riga $033e)
  
-<note tip>Un indirizzamento di tipo //absolute indexed mode// è limitato a soli 256 byte; per incrementare questo limite si può usare un tipo di indirizzamento //[[#indirizzamento_indirect_indexed|Indirect, Indexed]]//</note>+<note tip>Un indirizzamento di tipo //absolute indexed mode// è limitato a soli 256 byte (il valore del registro X o Y); per incrementare questo limite si può usare un tipo di indirizzamento //[[#indirizzamento_indirect_indexed|Indirect, Indexed]]//</note>
  
 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 600: Line 602:
   JMP ($380)   JMP ($380)
      
-dove $380 non è la destinazione del //jump//, come nel caso usuale per questa istruzione; in $380 è contenuto il LSB della destinazione vera e propria (e nel successivo $381 c'è il MSB). In sostanza $380 è un //puntatore// alla destinazione vera e propria:+dove $380 non è la destinazione del //jump//, come nel caso usuale per questa istruzione; in $380 è contenuto il LSB della destinazione vera e propria (e nel successivo $381 c'è il MSB). $380 è un **//indirect address//** (in sostanza, un //puntatore//alla destinazione vera e propria:
  
 {{:content:retrocomputing:indirect01.png?400|}} {{:content:retrocomputing:indirect01.png?400|}}
Line 642: Line 644:
 ==== Indirizzamento Indirect, Indexed ==== ==== Indirizzamento Indirect, Indexed ====
  
-L'indirizzamento di tipo **//Indirect, Indexed//** consente di raggiungere più di 256 byte di memoria. +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). 
 + 
 +Di seguito un esempio che **cancella lo schermo**; usa lo //screen code// dello 'spazio' (non ASCII code) per riempire le locazioni della **//screen RAM//** ($0400-$07e7): 
 + 
 +<file> 
 +.C:033c  A2 04       LDX #$04 
 +.C:033e  A9 00       LDA #$00 
 +.C:0340  85 FB       STA $FB 
 +.C:0342  A9 04       LDA #$04 
 +.C:0344  85 FC       STA $FC    ; imposta l'indirect address $FB:FC a $0400 (inizio della memoria video del C64) 
 +.C:0346  A9 20       LDA #$20   ; screen code per 'spazio' 
 +.C:0348  91 FB       STA ($FB),Y; salva lo screen code di 'spazio' al puntatore $FB:FC (inizialmente $0400) + Y (inizialmente 0) 
 +.C:034a  C8          INY 
 +.C:034b  D0 FB       BNE $0348  ; cicla fino a che Y=255 
 +.C:034d  E6 FC       INC $FC    ; incrementa MSB (inizialmente da $04 a $05) 
 +.C:034f  CA          DEX        ; decrementa X, così da fare 4 cicli totali (256x4=1024 byte di memoria video interessata) 
 +.C:0350  D0 F6       BNE $0348  ;  
 +.C:0352  60          RTS 
 +</file> 
 + 
 +<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. 
 +</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//: 
 + 
 +{{:content:retrocomputing:screen_ram_e_sprite.png?400|}} 
 + 
 +{{:content:retrocomputing:screen_ram_e_sprite02.png?400|}} 
 ==== Start & End of Basic ==== ==== Start & End of Basic ====
  
Line 687: 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.1720946954.txt.gz · Last modified: 2024/07/14 10:49 by admin