ATARI Italian Forum
|
Hardware e Software inerente la storica società di Sunnyvale
|
|
Autore |
Messaggio |
Qwe Apprendista
Iscritti
Registrato: 15/12/10 21:59 Messaggi: 89
Località: Bologna
|
|
Un saluto a tutti i cybernauti on line appassionati di computer Atari.
Probabilmente vi sembrerà strano programmare in assembler al giorno d'oggi ma vorrei raccontarvi la mia esperienza.
Qualche anno fa girovagando su internet venni a sapere che un polacco di nome Pawel Rosowski chiedeva aiuto per convertire il gioco IK+ per gli atari 8 bit.
Il progetto di Pawel mi pareva intrigante e io mi resi disponibile; lui mi chiese se mi sentivo in grado di mostrare il logo di IK+ in alta risoluzione, ovviamente il lavoro doveva essere fatto in assembler.
Non avevo mai programmato in assembler per gli atari 8 bit; alle superiori avevo studiato l'assembler dello Z80 per cui avevo un'infarinatura di programmazione in assembler ma il processore degli atari è il 6502.
Pensai che se mi mettevo a studiare un libro di assembler 6502 non sarei mai riuscito nell'impresa se non in tempi biblici.
Provai allora un altro approccio che si rivelò vincente.
Sapevo dell'esistenza di un compilatore C per processori 6502 che si chiama cc65.
Questo compilatore, volendo, genera codice assembler; è molto istruttivo vedere come ogni riga del codice in linguaggio C viene convertita in assembler.
Io ho scritto in linguaggio C l'algoritmo di decompressione memoria e di visualizzazione del logo ed il compilatore ha fatto il lavoro per me.
Ovviamente il compilatore fa un po' di “porcherie” che vanno poi sistemate a mano ma usando questo approccio i tempi di sviluppo sono molto veloci.
In pratica un esempio è meglio di 100 libri di assembler e l'esempio lo fornisce il nostro compilatore cc65.
Io ho imparato a programmare in assembler 6502 cercando di capire il codice che generava il compilatore; se avessi iniziato a studiare un libro di programmazione Pawel sarebbe ancora ad aspettare il suo bel logo .
A proposito, se volete vedere il logo che ho fatto andate qui: Solo gli utenti registrati possono vedere i link! Registrati o Entra nel forum! | e scaricate l'ultima versione di IK+.
Il logo viene mostrato durante il caricamento del programma.
Prossimamente vi posterò i miei sorgenti così potete vedere come si imposta la grafica 8 in assembler e come si scrive sulla memoria video.
Programmare in assembler è difficile ma non impossibile; se ci son riuscito io che non l'avevo mai fatto prima sicuramente ci riuscirete anche voi, basta solo partire con il piede giusto.
Se volete provare anche voi, il divertimento è assicurato; io mi sono divertito di più a programmare in assembler che a giocare al più bel videogioco.
Alla prossima.
Bye |
|
Torna in cima |
|
Adv
|
|
Torna in cima |
|
ataricomputers Guru
Admin
Sesso:
Registrato: 14/01/10 16:15 Messaggi: 406
Località: Cagliari
|
|
Grazie 1000 QWE per la tua disponibilità, davvero un'ottima iniziativa.
Il gioco IK+ l'avevo già scaricato un paio di settimane fà e provato sul mio 130XE e dove dire che l'impressione che ho avuto è stata ottima.
Quando vuoi cominciare con le basi di programmazione fai pure, l'idea è molto molto intrigante.
Thx _________________ Atari Italian site
Solo gli utenti registrati possono vedere i link! Registrati o Entra nel forum! |
|
|
Torna in cima |
|
Qwe Apprendista
Iscritti
Registrato: 15/12/10 21:59 Messaggi: 89
Località: Bologna
|
|
Grazie per l'entusiasmo Maurizio, vediamo se riusciamo a coinvolgere anche qualcun altro.
Vi consiglio intanto di prendere un po' di confidenza con gli strumenti del mestiere.
Ormai non c'è più nessuno che usa un assemblatore che gira sugli atari, oggi si usano assemblatori più evoluti che girano sui pc moderni.
L'assemblatore che adesso va per la maggiore è mads: Solo gli utenti registrati possono vedere i link! Registrati o Entra nel forum! |
I ragazzi di Yoomp hanno usato questo assemblatore per realizzare il gioco.
Purtroppo ora vedo che adesso il manuale per questo assemblatore è solo in polacco.
Pawel Rosowski usa invece un altro assemblatore + linker fatto da lui.
Se non riuscite ad usare mads potete usare l'assemblatore incluso in cc65, solo come ultima spiaggia vi consiglio di usare l'assemblatore che uso io perchè il linker fatto da Pawel Rosowski è veramente complicato da usare.
Per programmare in assembler è indispensabile conoscere l'hardware del computer sul quale si vuole lavorare.
Potete trovare tutti i manuali che vi servono qui: Solo gli utenti registrati possono vedere i link! Registrati o Entra nel forum! |
La bibbia dei computer Atari 8 bit si chiama “De Re Atari” ma anche i libri che spiegano la mappa della memoria sono molto istruttivi.
Io ho ritrovato i sorgenti del programma che ho fatto ma vedo che su questo forum ci sono un po' di problemi nel fare upload/download.
Chiedo al buon Maurizio come devo procedere per condividere i sorgenti in assembler.
Nel prossimo post vi spiegherò come Pawel Rosowski voleva il logo di IK+ e le specifiche di progetto poi appena i sorgenti saranno accessibili a tutti faremo un full immersion nel codice assembler. |
|
Torna in cima |
|
Qwe Apprendista
Iscritti
Registrato: 15/12/10 21:59 Messaggi: 89
Località: Bologna
|
|
Un po' di storia...
Pawel Rosowski aveva bisogno di visualizzare nel suo gioco il logo di IK+ in alta risoluzione come nella versione degli Atari ST o Amiga.
Pawel mi aveva passato una bitmap di 160x105; dato che il gioco occupa molta memoria Pawel aveva bisogno di comprimere la grafica del logo.
Decidemmo di usare l'algoritmo di compressione MNP5.
L'MNP5 è un semplice algoritmo usato dai modem che comprime sequenze di byte ripetuti.
L'algoritmo funziona cosi: se ci sono più di 2 byte che si ripetono si scrivono i primi 2 byte mentre il terzo byte indica quante volte si devono ripetere i byte, es:
0000000000 si comprime in
008
La bitmap di 160x105 occupa in memoria 2100 byte, con l'algoritmo MNP5 sono riuscito a comprimere l'immagine fino a circa 1700 byte.
Per realizzare il programmino in assembler ho dovuto affrontare diversi problemi:
1)impostare la grafica a 320x192 (grafica 8 del basic)
2)comprimere e decomprimere il logo
3)centrare il logo nello schermo
In basic tutto ciò è semplice mentre in assembler non è proprio banale.
Ho fatto 2 versioni del programma; nella prima versione ho usato l'indirizzamento indiretto per scrivere nella memoria video, nella seconda versione ho sostituito l'indirizzamento indiretto con l'indirizzamento assoluto.
L'indirizzamento indiretto l'ho rimosso per il semplice motivo che è molto inefficiente; solo per scrivere un byte in memoria il 6502 ci impiega una quarantina di cicli di clock.
Per simulare l'indirizzamento indiretto usando l'indirizzamento assoluto occorre usare una tecnica molto avanzata che vi spiegherò più avanti... |
|
Torna in cima |
|
Qwe Apprendista
Iscritti
Registrato: 15/12/10 21:59 Messaggi: 89
Località: Bologna
|
|
Non riuscendo a fare l'upload dei sorgenti ve li mostro sul forum anche se non è proprio adatto perchè non vengono visualizzate le tabulazioni:
;show the initial logo in hi-res
;subroutine calls:
; incPSource
; incPDestination
;input:
; dListGr8
; compressedLogo
; lastByteOfLogo
;output:
; scrFirstHalfAdr
include "system.inc"
include "ikp.inc"
org loadBlockAdr-2
dw loadBlockAdr ;start address
org loadBlockAdr
pSource = $0080
pDestination = $0082
scrFirstHalfAdr = $8150
scrSecondHalfAdr = $9000
lda #$00 ;disable antic
sta dmactls
lda #lo(dListGr8) ;change pointer to dlist (enable gr.8+16)
sta dlptrs
lda #hi(dListGr8)
sta dlptrs+1
lda #$22 ;enable antic
sta dmactls ;now screen should be 320x192
lda #$00
sta colpf2s
lda #$3F
sta colpf1s
lda #lo(compressedLogo)
sta pSource
lda #hi(compressedLogo)
sta pSource+1
lda #lo(scrFirstHalfAdr)
sta pDestination
lda #hi(scrFirstHalfAdr)
sta pDestination+1
ldy #$06
lda #$9A;
clc
adc pDestination ;pDestination mast center the logo...
sta pDestination
bcc addHi
iny
addHi:
tya
adc pDestination+1
sta pDestination+1
; now pDestination point to row 43 and col 80
;
;draw first byte
ldy #$00
lda (pSource), Y
sta (pDestination), y
sta lastByte
mainLoop:
lda pSource+1
cmp #hi(lastByteOfLogo)
bne continueDrawing
lda pSource
cmp #lo(lastByteOfLogo)
beq endJob
continueDrawing:
jsr incPSource
jsr incPDestination
ldy #$00
lda (pSource), y
sta (pDestination), y
sta currentByte
cmp lastByte
bne updateLast
jsr incPSource
lda (pSource), y
sta repetitions
ldx #$00
repeatByte:
cpx repetitions
beq mainLoop
jsr incPDestination
inx
lda lastByte
ldy #$00
sta (pDestination), y
jmp repeatByte
updateLast:
lda currentByte
sta lastByte
jmp mainLoop
incPSource:
inc pSource
bne returnPsource
inc pSource+1
returnPsource:
rts
incPDestination:
lda currentColOfLogo
cmp #$14
bne simpleIncrement
lda #$00
sta currentColOfLogo
lda pDestination
clc
adc #$14
sta pDestination
bcc simpleIncrement
inc pDestination+1
simpleIncrement:
inc currentColOfLogo
inc pDestination
bne returnPsource
inc pDestination+1
returnPDestination:
rts
;
endJob:
forEver:
jmp forEver
rts
dListGr8:
db $70, $70, $70, $4F, lo(scrFirstHalfAdr), hi(scrFirstHalfAdr) ;; $50, $81
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
db $0F, $0F, $0F, $4F, lo(scrSecondHalfAdr), hi(scrSecondHalfAdr) ;; $00, $90
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $41, lo(dListGr8), hi(dListGr8) ;; $36, $80
currentColOfLogo:
db $01
currentByte:
db $00
lastByte:
db $00
repetitions:
db $00
compressedLogo:
db $00, $00, $07, $F0, $00, $00, $10, $01, $F8, $00, $00, $0B, $F0, $00, $00, $02
db $03, $18, $00, $00, $0A, $01, $9C, $00, $00, $02, $02, $FC, $00, $00, $0A, $01
db $7F, $00, $00, $02, $03, $FC, $00, $00, $0A, $01, $FF, $C0, $00, $00, $01, $03
db $FE, $00, $00, $0A, $01, $FF, $F0, $00, $00, $01, $03, $FE, $00, $00, $0A, $01
db $FF, $FC, $00, $00, $01, $03, $FE, $00, $00, $0A, $01, $FF, $FF, $00, $00, $00
db $01, $01, $FF, $00, $00, $0A, $01, $FF, $FF, $00, $C0, $00, $00, $00, $01, $FF
db $00, $00, $0A, $01, $FF, $FF, $00, $F0, $00, $00, $00, $01, $FF, $00, $00, $0A
db $01, $FF, $FF, $00, $FC, $00, $00, $00, $01, $FF, $00, $00, $02, $1C, $00, $00
db $05, $01, $FF, $FF, $01, $00, $00, $01, $FF, $80, $00, $00, $01, $3F, $00, $00
db $05, $01, $FF, $FF, $01, $80, $00, $00, $00, $FF, $80, $00, $00, $01, $63, $C0
db $00, $00, $05, $FF, $FF, $01, $80, $00, $00, $00, $FF, $80, $00, $00, $01, $DF
db $F0, $00, $00, $05, $FF, $FF, $01, $80, $00, $00, $00, $FF, $80, $00, $00, $00
db $01, $FF, $FC, $00, $00, $05, $FF, $FF, $01, $00, $00, $01, $7F, $80, $00, $00
db $00, $03, $FF, $FF, $00, $00, $00, $05, $FF, $FF, $00, $FC, $00, $00, $01, $7F
db $C0, $00, $00, $00, $07, $FF, $FF, $00, $C0, $00, $00, $04, $FF, $FF, $00, $F0
db $00, $00, $01, $7F, $C0, $00, $00, $00, $0F, $FF, $FF, $00, $F0, $00, $00, $04
db $FF, $FF, $00, $C0, $00, $00, $01, $7F, $C0, $00, $00, $00, $1F, $FF, $FF, $00
db $FC, $00, $00, $04, $FF, $FF, $00, $00, $00, $02, $7F, $C0, $00, $00, $00, $3F
db $FF, $FF, $00, $FE, $00, $00, $04, $FF, $FE, $00, $00, $02, $3F, $C0, $00, $00
db $00, $7F, $FF, $FF, $00, $FE, $00, $00, $04, $FF, $FE, $00, $00, $02, $3F, $E0
db $00, $00, $00, $FF, $FF, $01, $FE, $00, $00, $0A, $3F, $E0, $00, $01, $FF, $FF
db $01, $F8, $00, $00, $01, $7F, $FF, $FF, $04, $FA, $00, $3F, $E0, $00, $03, $FF
db $FF, $01, $F0, $00, $00, $01, $C7, $FF, $FF, $05, $00, $3F, $E0, $00, $07, $FF
db $FF, $01, $C0, $00, $00, $01, $BF, $FF, $FF, $04, $FE, $00, $3F, $E0, $00, $0F
db $FF, $FF, $01, $80, $00, $00, $01, $FF, $FF, $05, $D8, $00, $3F, $E0, $00, $1F
db $FF, $FF, $01, $00, $00, $02, $7F, $FF, $FF, $03, $FE, $00, $00, $00, $3F, $F0
db $00, $3F, $FF, $FF, $00, $FC, $00, $00, $02, $3F, $FF, $FF, $03, $80, $00, $00
db $00, $3F, $F0, $00, $7F, $FF, $FF, $00, $F8, $00, $00, $02, $1F, $FF, $FF, $02
db $E0, $00, $00, $01, $3F, $F0, $00, $FF, $FF, $01, $F0, $00, $00, $02, $0F, $FF
db $FF, $01, $80, $00, $00, $02, $3F, $F0, $01, $FF, $FF, $01, $C0, $00, $00, $02
db $07, $FF, $FF, $00, $F0, $7E, $00, $00, $02, $1F, $F0, $07, $FF, $FF, $01, $80
db $00, $00, $02, $03, $FF, $FF, $00, $8F, $FE, $00, $00, $02, $1F, $F0, $0F, $FF
db $FF, $00, $FE, $00, $00, $03, $01, $FF, $F0, $7F, $FE, $00, $00, $02, $1F, $F0
db $1F, $FF, $FF, $00, $F8, $00, $00, $04, $FF, $C0, $7F, $FE, $00, $00, $02, $1F
db $F8, $7F, $FF, $FF, $00, $F0, $00, $08, $00, $00, $02, $7F, $80, $7F, $FE, $00
db $00, $02, $1F, $F8, $FF, $FF, $01, $C0, $00, $1E, $00, $00, $02, $3F, $00, $7F
db $FE, $00, $00, $02, $1F, $FB, $FF, $FF, $01, $00, $00, $00, $3F, $80, $00, $00
db $01, $1C, $00, $3F, $FC, $00, $00, $02, $1F, $F7, $FF, $FF, $00, $FC, $00, $00
db $00, $33, $E0, $00, $00, $03, $3F, $FC, $00, $00, $02, $1F, $CF, $FF, $FF, $00
db $F0, $00, $00, $00, $2F, $F8, $00, $00, $03, $3F, $FC, $00, $00, $02, $1F, $3F
db $FF, $FF, $00, $C0, $00, $00, $00, $3F, $FE, $00, $00, $03, $3F, $FC, $00, $00
db $02, $1C, $FF, $FF, $01, $00, $00, $01, $3F, $FF, $80, $00, $00, $02, $3F, $FC
db $00, $00, $02, $13, $FF, $FF, $00, $F8, $00, $00, $01, $1F, $FF, $E0, $00, $00
db $02, $3F, $FC, $00, $00, $02, $0F, $FF, $FF, $00, $E0, $00, $00, $01, $1F, $FF
db $F8, $00, $00, $02, $3F, $FC, $00, $00, $02, $3F, $FF, $FF, $00, $00, $00, $02
db $1F, $FF, $FC, $00, $00, $02, $3F, $FC, $00, $00, $02, $FF, $FF, $00, $FC, $00
db $00, $02, $1F, $FF, $F8, $00, $00, $02, $3F, $FC, $00, $00, $01, $03, $FF, $FF
db $00, $E0, $00, $00, $02, $1F, $FF, $F0, $00, $00, $02, $3F, $FC, $00, $00, $01
db $0F, $FF, $FF, $00, $00, $00, $03, $0F, $FF, $C0, $00, $00, $02, $3F, $FC, $00
db $00, $01, $3F, $FF, $F8, $00, $00, $03, $0F, $FF, $00, $00, $03, $3F, $FC, $00
db $00, $01, $7F, $FF, $E4, $00, $00, $03, $0F, $FE, $00, $00, $03, $3F, $FC, $00
db $00, $01, $7F, $FF, $1C, $00, $00, $03, $0F, $FE, $00, $00, $03, $3F, $FC, $00
db $00, $01, $3F, $F0, $FC, $00, $00, $0A, $3F, $FC, $00, $00, $02, $0F, $FC, $00
db $00, $02, $FF, $FF, $02, $F0, $00, $00, $01, $3F, $FC, $00, $00, $01, $0C, $1F
db $FC, $00, $00, $01, $01, $1F, $FF, $FF, $01, $F8, $00, $00, $01, $1F, $F8, $00
db $00, $01, $1E, $1F, $FC, $00, $00, $01, $02, $FF, $FF, $02, $F0, $00, $00, $01
db $1F, $F8, $00, $00, $01, $1F, $1F, $00, $FE, $00, $00, $01, $03, $FF, $FF, $01
db $FE, $00, $00, $02, $1F, $F8, $00, $00, $01, $0F, $9F, $FE, $00, $00, $01, $03
db $FF, $FF, $01, $C0, $00, $00, $02, $1F, $F8, $00, $00, $01, $07, $CF, $FE, $00
db $00, $01, $01, $FF, $FF, $00, $C0, $00, $00, $03, $1F, $F8, $00, $00, $01, $07
db $F7, $FE, $00, $00, $02, $FF, $F8, $3C, $00, $00, $03, $1F, $F8, $00, $00, $01
db $03, $FB, $FE, $00, $00, $02, $7F, $E7, $FC, $00, $00, $03, $1F, $F8, $00, $00
db $01, $01, $FD, $FE, $00, $00, $02, $3F, $C7, $FC, $00, $00, $03, $1F, $F8, $00
db $00, $01, $01, $FE, $FE, $00, $00, $00, $02, $1F, $07, $FC, $00, $00, $03, $1F
db $F8, $00, $00, $02, $FF, $3E, $00, $00, $02, $0E, $07, $FC, $00, $00, $03, $1F
db $F8, $00, $00, $02, $7F, $CE, $00, $00, $02, $04, $03, $F8, $00, $00, $03, $1F
db $F8, $00, $00, $02, $3F, $F6, $00, $00, $03, $03, $F8, $00, $00, $03, $1F, $F8
db $00, $00, $02, $1F, $F8, $00, $00, $03, $03, $F8, $00, $00, $03, $1F, $F8, $00
db $00, $02, $1F, $FE, $00, $00, $03, $03, $F8, $00, $00, $03, $1F, $F8, $00, $00
db $02, $2F, $FF, $80, $00, $00, $02, $03, $F8, $00, $00, $03, $1F, $F8, $00, $00
db $02, $37, $FF, $E0, $00, $00, $02, $03, $F8, $00, $00, $03, $0F, $F0, $00, $00
db $02, $37, $FF, $F0, $00, $00, $02, $03, $F8, $00, $00, $03, $0F, $F0, $00, $00
db $02, $3B, $FF, $FC, $00, $00, $02, $03, $F8, $00, $00, $03, $0F, $F0, $00, $00
db $02, $7D, $FF, $FF, $00, $00, $00, $02, $01, $F0, $00, $00, $03, $0F, $F0, $00
db $00, $02, $7E, $FF, $FF, $00, $E0, $00, $00, $01, $01, $F0, $00, $00, $03, $0F
db $F0, $00, $00, $02, $7F, $7F, $00, $FF, $F8, $00, $00, $01, $01, $F0, $00, $00
db $03, $0F, $F0, $00, $00, $02, $7F, $BF, $FF, $FE, $00, $00, $01, $01, $F0, $00
db $00, $03, $0F, $F0, $00, $00, $02, $7F, $DF, $FF, $FF, $00, $80, $00, $00, $00
db $01, $F0, $00, $00, $09, $FF, $EF, $FF, $FF, $00, $F0, $00, $00, $01, $E0, $00
db $00, $00, $7F, $FF, $FF, $04, $FE, $00, $FF, $F7, $FF, $FF, $00, $FC, $00, $00
db $01, $40, $00, $00, $00, $C7, $FF, $FF, $05, $00, $FF, $FB, $FF, $FF, $01, $80
db $00, $00, $03, $BF, $FF, $FF, $04, $FE, $00, $FF, $FD, $FF, $FF, $01, $E0, $00
db $00, $03, $FF, $FF, $05, $F8, $00, $FF, $FE, $7F, $FF, $FF, $00, $FC, $00, $00
db $03, $7F, $FF, $FF, $03, $FE, $00, $00, $00, $FF, $FE, $3F, $FF, $FF, $01, $80
db $00, $00, $02, $3F, $FF, $FF, $03, $80, $00, $01, $FF, $FE, $1F, $FF, $FF, $01
db $F0, $00, $00, $02, $1F, $FF, $FF, $02, $E0, $00, $00, $00, $01, $FF, $FE, $0F
db $FF, $FF, $01, $FE, $00, $00, $02, $0F, $FF, $FF, $01, $80, $00, $00, $01, $01
db $FF, $FF, $00, $03, $FF, $FF, $02, $80, $00, $00, $01, $07, $FF, $FF, $00, $F0
db $60, $00, $00, $01, $01, $FF, $FF, $00, $01, $FF, $FF, $02, $C0, $00, $00, $01
db $03, $FF, $FF, $00, $87, $E0, $00, $00, $01, $01, $FF, $FF, $00, $00, $FF, $FF
db $02, $E0, $00, $00, $01, $01, $FF, $F0, $07, $E0, $00, $00, $01, $01, $FF, $FF
db $00, $00, $7F, $FF, $FF, $01, $E0, $00, $00, $02, $FF, $C0, $07, $E0, $00, $00
db $01, $03, $FF, $FF, $00, $00, $1F, $FF, $FF, $01, $C0, $00, $00, $02, $7F, $80
db $07, $E0, $00, $00, $01, $03, $FF, $FF, $00, $00, $0F, $FF, $FF, $01, $80, $00
db $00, $02, $3F, $00, $07, $E0, $00, $00, $01, $03, $FF, $FF, $00, $00, $07, $FF
db $FF, $01, $00, $00, $03, $1C, $00, $07, $E0, $00, $00, $01, $03, $FF, $FF, $00
db $00, $01, $FF, $FF, $00, $FE, $00, $00, $05, $07, $E0, $00, $00, $01, $03, $FF
db $FF, $00, $00, $00, $00, $FF, $FF, $00, $FC, $00, $00, $05, $07, $E0, $00, $00
db $01, $03, $FF, $FE, $00, $00, $00, $3F, $FF, $F8, $00, $00, $05, $07, $E0, $00
db $00, $01, $03, $FF, $FE, $00, $00, $00, $0F, $FF, $F0, $00, $00, $05, $07, $E0
db $00, $00, $01, $03, $FF, $FE, $00, $00, $00, $03, $FF, $E0, $00, $00, $05, $03
db $C0, $00, $00, $01, $03, $FF, $FE, $00, $00, $01, $FF, $C0, $00, $00, $05, $03
db $C0, $00, $00, $01, $03, $FF, $FE, $00, $00, $01, $3F, $80, $00, $00, $05, $03
db $C0, $00, $00, $01, $03, $FF, $FC, $00, $00, $01, $0F, $00, $00, $06, $01, $80
db $00, $00, $01, $01, $FF, $FC, $00, $00, $01, $02, $00, $00, $0B, $01, $FF, $FC
db $00, $00, $10, $FF, $F8, $00, $00, $10, $7F, $F0, $00, $00, $10, $3F, $E0, $00
db $00, $10, $0F, $80, $00, $00
lastByteOfLogo:
db $07
endOfCode: |
|
Torna in cima |
|
Qwe Apprendista
Iscritti
Registrato: 15/12/10 21:59 Messaggi: 89
Località: Bologna
|
|
Nel precedente listato si nota che il programma parte impostando il nuovo Display List per abilitare la grafica a 320x192 (grafica 8+16) .
Per chi non lo sapesse il Displey List è un programma speciale che viene eseguito dal chip Antic; le istruzioni del display list non hanno niente a che fare col 6502.
Questa è una caratteristica unica degli Atari 8 bit, gli altri computer non hanno il concetto del display list.
Il resto del programma non fa altro che leggere il logo compresso e copiare i dati nella memoria video.
pSoure e pDestination sono i puntatori di input ed output.
Se non avete già il mal di testa e avete delle domande sono a vostra disposizione. |
|
Torna in cima |
|
ataricomputers Guru
Admin
Sesso:
Registrato: 14/01/10 16:15 Messaggi: 406
Località: Cagliari
|
|
Grazie QWE per questa prima guida alla programmazione in assembler.
Se devo fare una piccola puntualizzazione, mi sarebbe piaciuto partire dalle fondamenta, ad esempio cosa sono le sigle che si usano in assembler LDA, JMP, ecc, magari seguiti da piccoli esempi di codice (startabile direttamente sul computer atari) che ne dimostrano il funzionamento.
Cosa sono i puntatori di input e output (pSource e pDestination)?
Puoi fare un parallelismo con i comandi Basic?
Ancora grazie per questo tuo contributo
Maurizio
PS: Per fare gli upload prova a comprimere il file/s in formato zip. La compressione non è necessaria se i files sono immagini gif o jpg. Purtroppo non ho molto tempo per configurare il forum...quindi abbiate un pò di pazienza. _________________ Atari Italian site
Solo gli utenti registrati possono vedere i link! Registrati o Entra nel forum! |
|
|
Torna in cima |
|
Qwe Apprendista
Iscritti
Registrato: 15/12/10 21:59 Messaggi: 89
Località: Bologna
|
|
Ciao a tutti.
Scusate ma non ho proprio avuto tempo per entrare nei dettagli.
Il 6502 è un processore con un numero molto limitato di registri che sono:
Il Program Counter
Lo Stack Pointer (puntatore di catasta)
L'Accumulator
Index Register X
Index Register Y
Processor Status
Il Program Counter tiene traccia della prossima istruzione da eseguire
Lo stack è una particolare area di memoria, viene usata per salvare i valori dei registri o per passare parametri alle subroutine; lo Stack Pointer punta all'ultimo elemento inserito nello stack.
L'Accumulatore è il registro più importante, è l'unico registro su cui vengono eseguire operazioni logico/matematiche
I registri X e Y di solito vengono usati per contenere indirizzi di memoria o valori temporanei
Il Processor Status è un registro speciale che cambia il valore dei suoi bit in funzione del risultato contenuto nell'Accumulatore; serve per fare i confronti.
I registri A, X, Y possono essere caricati con valori assoluti o con variabili della memoria.
I bit dei registri possono scorrere a destra o a sinistra.
I programmi in assembler non fanno altro che leggere e scrivere valori sulla memoria.
LDA significa carica l'Accumulatore (Load Accumulator)
STA significa memorizza l'accumulatore (Store Accumulator)
La stessa cosa vale per i registri indice
LDX e LDY caricano i registri indice
STX e STY memorizzano i registri indice
Per chi vuole approfondire l'argomento c'è questo libro in italiano:
Solo gli utenti registrati possono vedere i link! Registrati o Entra nel forum! |
|
|
Torna in cima |
|
ataricomputers Guru
Admin
Sesso:
Registrato: 14/01/10 16:15 Messaggi: 406
Località: Cagliari
|
|
Grazie qwe per spiegazione e il link... _________________ Atari Italian site
Solo gli utenti registrati possono vedere i link! Registrati o Entra nel forum! |
|
|
Torna in cima |
|
|
|
|
Non puoi inserire nuovi Topic in questo forum Non puoi rispondere ai Topic in questo forum Non puoi modificare i tuoi messaggi in questo forum Non puoi cancellare i tuoi messaggi in questo forum Non puoi votare nei sondaggi in questo forum Non puoi allegare files in questo forum Non puoi downloadare files da questo forum
|
|