Autore Topic: Visualizzare immagine durante il caricamento  (Letto 2053 volte)

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Visualizzare immagine durante il caricamento
« il: 11 Ottobre 2016, 10:57:55 »
Salve ragazzi,
volevo aggiungere un piccolo programma scritto con dasm,un caricamento simile a quello che si vedevano nei giochi in cassetta:
- Visualizzazione immagine
- raster bar durante il caricamento
- eventuale musica
Qualcuno può indirizzarmi verso qualche documento/tutorial?


Raffox

  • Administrator
  • Utente
  • *****
  • Post: 653
    • http://www.raffox.com
  • Gioco Preferito: Moonshadow (Idea)
Re:Visualizzare immagine durante il caricamento
« Risposta #1 il: 12 Ottobre 2016, 01:55:41 »
Ciao Antonio,

Intanto puoi dare un'occhiata a questo tool, ed eventualmente alla relativa discussione nel forum di CSDb. In altenativa c'è quest'altro tool: Dreamload (versione del 2007, compatibile anche con la SD2IEC). Entrambi i programmi sono provvisti di documentazione esplicativa ed esempi.

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Re:Visualizzare immagine durante il caricamento
« Risposta #2 il: 12 Ottobre 2016, 12:40:00 »
Avevo visto quei loader ma li avevo scartati perchè non ho ben capito come compilarli (Jam?)
Preferire utilizzare qualcosa compilabile con dasm (tipo ocean freeload) ma se riesco a far andare questi va bene lo stesso! :)

Flavioweb

  • Utente
  • **
  • Post: 58
    • http://www.flavioweb.it
  • Gioco Preferito: Maniac Mansion
Re:Visualizzare immagine durante il caricamento
« Risposta #3 il: 12 Ottobre 2016, 20:42:00 »
Prima di tutto bisogna capire se vuoi caricare da disco o da nastro.
Te lo chiedo perchè, inizialmente parli di tape, poi sembrano interessarti i software che ti ha elencato Raffox, ma poi torni a nominare il Freeload che è un turbo tape...

Fatta chiarezza su questo punto, tieni presente che qualsiasi strada decidi di percorrere, non c'è niente di -facile- o -scontato-: entrambi gli argomenti richiedono una discreta padronanza dell'assembler e conoscenza della macchina.

Se il tuo problema è solo quello di visualizzare dei "colori" ed una schermata grafica durante il load (quindi niente turbo o robe simili), il tutto si può fare abbastanza facilmente in assembly ma, anche qui, devi avere un infarinatura delle routine I/O e sapere, almeno, come si visualizza una schermata grafica (koala o simili...)

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Re:Visualizzare immagine durante il caricamento
« Risposta #4 il: 13 Ottobre 2016, 11:40:50 »
Innanzi tutto grazie per l'interessamento!
Non mi definisco un guru ma ormai credo di avere una discreta preparazione sulla programmazione assembler (C64/6502)....
Detto questo, mi interesserebbe approfondire principalmente il caricamento "turbo tape" partendo da un sorgente compilato con dasm + exomizer -sfx. Avevo puntato sul Freeload perchè mi sembrava il più adatto ma sono ovviamente aperto a qualsiasi alternativa.

In seconda battuta anche il caricamento da disco dello stesso prg, sfruttando un loader che mi consenta di visualizzare un'immagine, delle raster bar ed eventualmente della musica di sottofondo.

Non mi aspetto una soluzione "facile o scontata" ma vorrei fare un po di chiarezza sull'argomento per poter ottenere il risultato desiderato con cognizione di causa!

tsm_carmine

  • Redazione
  • Utente
  • ****
  • Post: 489
  • Gioco Preferito: Krakout
Re:Visualizzare immagine durante il caricamento
« Risposta #5 il: 13 Ottobre 2016, 16:28:22 »
Ciao!
Per quanto riguarda il nastro, potresti optare per Tape Master Pro di Richard Bayliss. Non so quanto ti convenga imbarcarti nell'impresa di progettare un sistema tutto tuo. Comunque qui trovi una spiegazione approfondita sulle tecniche più usate: Analyzing Loaders (articolo di Luigi Di Fraia, probabilmente il massimo esperto nazionale in materia). Tempo fa ho dato un'occhiata al famoso Freeload e mi pare di ricordare che per la musica si è costretti ad utilizzare la routine predisposta, il che significa doverla scrivere in modo testuale seguendo la particolare sintassi prevista.

Per il disco non saprei, ma se fossi in te cercherei di adottare un sistema che non tagli fuori i dispositivi IEC generici come la SD2IEC. Ricordo che anni fa apparve su CSDb un loader che utilizzava le routine standard ma consentendo comunque di visualizzare degli effetti durante il caricamento. Ma purtroppo non ricordo il titolo e sarebbe un'impressa ritrovarlo.
Riusciremo a costruire un mondo dove più nessuno osi pronunciare le parole... "lettore floppy"?

tsm_carmine

  • Redazione
  • Utente
  • ****
  • Post: 489
  • Gioco Preferito: Krakout
Re:Visualizzare immagine durante il caricamento
« Risposta #6 il: 13 Ottobre 2016, 18:21:49 »
Ricordo che anni fa apparve su CSDb un loader che utilizzava le routine standard ma consentendo comunque di visualizzare degli effetti durante il caricamento. Ma purtroppo non ricordo il titolo e sarebbe un'impressa ritrovarlo.

Trovato: Testrun by Meta ma manca il sorgente...
Riusciremo a costruire un mondo dove più nessuno osi pronunciare le parole... "lettore floppy"?

Flavioweb

  • Utente
  • **
  • Post: 58
    • http://www.flavioweb.it
  • Gioco Preferito: Maniac Mansion
Re:Visualizzare immagine durante il caricamento
« Risposta #7 il: 13 Ottobre 2016, 23:07:05 »
Perfetto... allora prendiamo il Freelooader che è, originariamente, per DASM.
Faccio qui un discorso abbastanza breve (per quanto possibile), poi dimmi tu cosa approfondire... se ne senti il bisogno.
Partiamo dall'inizio: il freeloader è composto da 2 parti. Il "loader" che può essere multi o single load, e il saver.
Il multiload è "un pezzo in più" rispetto al single... nel senso che serve tutto il necessario per il single load, più un altra porzione di codice con il multiloader da inserire in ciascuna parte del programma che necessita di ulteriori caricamenti dal nastro...
Ma procediamo con ordine... si prende il loader e lo si compila, chiamando il file eseguibile risultante "A".
"A" perchè è sempre il primo file caricato dalla routine di "boot strap" (passami il termine) del loader stesso.
Prima di compilare il loader bisogna settare alcuni parametri:
Codice: [Seleziona]
RESETVECS      EQU NO                   ;should the IO vectors get reset
GAMESTART      EQU $080D                ;game start here
ONEVAL         EQU $37                  ;the value that DDR A is set to
SCREENCOL      EQU 0                    ;screen colour when bitmap is on
BORCUL         EQU 0                    ;border colour when bitmap is on
LOAD_FLAG      EQU 2                    ;load in progress flag
MESS           EQU $FE                  ;indirect address of scrolling text
FILE_COUNTER   EQU $0100+3              ;which file we are up to
MUSIC_TRIGGER  EQU $0101+3              ;music triggering flag
SCROLL_TRIGGER EQU $0102+3              ;scroll triggering flag
SMOOTH_X       EQU $0103+3              ;smooth x position for hardware
STACK_LOAD     EQU $0112                ;loader's position on stack
REFRESH        EQU $B4A3                ;Jon's sound refresh
TUNE           EQU $B43E                ;Jon's tune initialise
LOADER_MAX     EQU $0C40                ;maximum address of loader
...che evito di spiegare uno per uno... se hai dubbi chiedi.
Poi bisogna settare i "files triggers", cioè le azioni che farà il loader dopo aver caricato ogni file:
Codice: [Seleziona]
FILE_TRIGGERS  dc.b 00                   ;overload       (A)
               dc.b 02                   ;music          (C)
               dc.b 00                   ;colour ram     (D)
               dc.b 00                   ;screen colour  (E)
               dc.b 01                   ;bitmap         (F)
               dc.b 03                   ;code           (G)
               dc.b 04                   ;code           (H)
               dc.b 00                   ;code           (I)
               dc.b 00                   ;code           (J)
               dc.b 05                   ;overload       (A)

ROUT_LOOKUP    dc.w ROUT_LOOKUP          ;dummy
               dc.w BITMAP_ON            ;01 (this also turns the scroll off)
               dc.w TUNE_ON              ;02
               dc.w BITMAP_OFF           ;03
               dc.w TUNE_OFF             ;04
               dc.w FIRE_UP_STACK        ;05
               dc.w SCROLL_ON            ;06
               dc.w SCROLL_OFF           ;07
Questa sequenza significa:
- carica il primo file e non fare niente (0 = dummy)
- carica il secondo file ed inizializza la musica
- carica terzo e quarto file ma non fare niente
- carica il quinto e visualizza l'immagine
- carica il sesto e "spegni" l'immagine
- carica il settimo e "spegni la musica"
- carica l'ottavo e il nono senza fare niente
- carica il decimo ed esegui.

Eventualmente, più avanti nel codice, c'è lo scrolltext da editare...

Poi bisogna editare il sorgente del saver, per fargli sapere quali files caricare, le zone di memoria che occupano, e l'indirizzo di partenza del LOADER caricato...
I -parametri- si tovano qui:
Codice: [Seleziona]
;-----------------------------------------------------------------------------
; Freeload file data
;
; WHICHDISK & FLNAM are read backwards !
;-----------------------------------------------------------------------------
HOWMANY        EQU 14

FILEDATA       dc.w $0800,$0C40          ;A  Freeloader control software
               dc.w $4000,$5000          ;B  $D000-$E000
               dc.w $0800,$0C40          ;A  Overload of control software
               dc.w $B43E,$C800          ;C  Music
               dc.w $4000,$43FF          ;D  Colram
               dc.w $C800,$CBFF          ;E  Scrcol
               dc.w $E000,$FF40          ;F  Bitmap
               dc.w $0C40,$B43E          ;G  Game Code
               dc.w $C800,$CFFF          ;H  Game Code
               dc.w $E000,$FFFA          ;I  Game Code
               dc.w $0200,$02A6          ;J  Stack destroyer
               dc.w $0800,$0C40          ;A  Overload again !
               dc.w $B43E,$C800          ;K  Game Code
               dc.w $0400,$0C40          ;L  Game Code

FLNAM          dc.b "LKAJIHGFEDCABA"

WHICHDISK      dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0

STARTUP        EQU $0800
Nota bene: gli indirizzi di inizio e fine di ciascun file sono ripetuti ogni volta che il file viene caricato. Ogni file ha un nome che corrisponde ad una sola lettera.
L'ordine di caricamento è scritto a FLNAM in ordine INVERSO... cioè "LKAJIHGFEDCABA" significa che verrà caricato il file A (il loader), poi il file "B", poi nuovamente il file "A", poi il "C"... e via discorrendo.
WHICHDISK invece serve se i files da salvare su nastro sono contenuti in più dischi. In questo caso, indicando in corrispondenza di ciascun file il numero del disco di appartenenza, verrà chiesto un cambio disco durante la fase di save.
STARTUP è l'indirizzo di start del nostro LOADER.

Una volta compilato, occorre preparare i files da "masterizzare" su nasto con i nomi corretti che abbiamo scelto per loro.
Dopodichè si prepara un bel disco contenente il saver, il loader e tutti i files, lo si mette nel drive, si esegue il saver e si seguono le istruzioni a video.
Se tutto va bene, avremo il nostro programma masterizzato su nastro, con la pic, la musica, lo scrolltext e le "barre colorate".

Penso che per ora... possa bastare.
Fammi sapere come procede.

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Re:Visualizzare immagine durante il caricamento
« Risposta #8 il: 14 Ottobre 2016, 15:47:56 »
Grande!

Ho fatto una prima prova (fallimentare) ma almeno ho cominciato a capire come muovermi....

Per cominciare con una cosa semplice ho impostato nel loader un solo elemento in "FILE_TRIGGERS" che dovrebbe essere il mio demo:
Codice: [Seleziona]
FILE_TRIGGERS 
               dc.b 05                   ;overload       (A)
Se ho capito bene il valore 05 dovrebbe appunto corrispondere a: "Carica ed esegui"

Nel saver invece due righe:
Codice: [Seleziona]
HOWMANY        EQU 2

FILEDATA       dc.w $0800,$0C0E          ;A  Freeloader control software
               dc.w $0801,$E379          ;A  Overload of control software
Le locazioni le ho recuperate in fase di compilazione.
Qui la prima domanda:
E' lecito definire in FILEDATA locazioni sovrapposte?
Posso ricompilare eventualmente il loader e spostarlo un po più su oppure devo riorganizzare il mio codice per liberare da   $0800 a $0C0E?

Dopo aver generato il TAP (con vice) parte il caricamento con righe colorate e testo "RAINBOW" (non l'ho modificato nel saver) ma, dopo 8 giri di nastro,appare lo scroller (vuoto) e  l'emulatore lancia un errore: "Main CPU:  JAM at $0849"

Flavioweb

  • Utente
  • **
  • Post: 58
    • http://www.flavioweb.it
  • Gioco Preferito: Maniac Mansion
Re:Visualizzare immagine durante il caricamento
« Risposta #9 il: 14 Ottobre 2016, 19:10:22 »
Per cominciare con una cosa semplice ho impostato nel loader un solo elemento in "FILE_TRIGGERS" che dovrebbe essere il mio demo:
Codice: [Seleziona]
FILE_TRIGGERS 
               dc.b 05                   ;overload       (A)
Se ho capito bene il valore 05 dovrebbe appunto corrispondere a: "Carica ed esegui"
Durante i miei test ha sempre funzionato usando uno $00 per A come primo valore... quindi:
Codice: [Seleziona]
FILE_TRIGGERS
               dc.b 00                   ; dummy (A)
               dc.b 05                   ; tuodemo  (B)
Come intuisci, il filename del loader è A e quello del tuo demo è B.
Ma POTREBBE ESSERE che funzioni solo specificando B... ma serve un test per saperlo. Dai sorgenti pare che si debba specificare anche il dummy per il loader.
Citazione
E' lecito definire in FILEDATA locazioni sovrapposte?
No... il file da caricare NON si deve sovrapporre al loader.

Riprova che dovremmo esserci...

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Re:Visualizzare immagine durante il caricamento
« Risposta #10 il: 17 Ottobre 2016, 12:22:30 »
Ciao F,
anche su lemon64 (dove avevo postato una richiesta d'aiuto tempo fa) mi hanno suggerito di utilizzare solo il saver impostando un solo file (il programma da eseguire)
Mi hanno anche fornito un d64 con saver e programma che, una volta eseguito, genera il tap funzionante, quindi ti confermo che può funzionare anche cosi!

Purtroppo credo che il mio problema sia proprio nella definizione degli indirizzi (start-end) del mio prg e della locazione di start:
Codice: [Seleziona]
FILEDATA dc.w $0801,$16E2          ;A  Overload of control software

FLNAM          dc.b "A" ;Ordine inverso

WHICHDISK      dc.b 0

STARTUP        EQU $080D

Mi hanno suggerito di caricare il mio prg con una cartuccia tipo action replay per verificare start ed end address ma non ci sono riuscito....

Questa è la parte iniziale del mio codice (comando basic con il sys e locazione di partenza):
Codice: [Seleziona]
org $0801
    include "lib\_basicline.asm" ;sys command

org $080D ;Inizio del programma
L'indirizzo "end" lo recupero in fase di compilazione con il dasm ma probabilmente è qui che sbaglio...

Flavioweb

  • Utente
  • **
  • Post: 58
    • http://www.flavioweb.it
  • Gioco Preferito: Maniac Mansion
Re:Visualizzare immagine durante il caricamento
« Risposta #11 il: 17 Ottobre 2016, 17:12:50 »
A me sta cosa del loader che NON va specificato NON torna. Per niente.
Compila il loader, diciamo a $C000.
Segnati l'indirizzo finale.
Chiamalo "A" e il tuo file chiamalo "B".
Configura il SAVER di conseguenza.

NOTA BENE:
Dovrai mettere l'indirizzo di esecuzione del LOADER nel saver e l'indirizzo di esecuzione del tuo programma nel LOADER.

PS: da quel che vedo, gli indirizzi li prendi correttamente... quindi non è quello il problema.

Questa è una configurazione funzionante che ho ritrovato fra i miei files di lavoro:
Codice: [Seleziona]
;---------------------------------------
; Freeload file data
; WHICHDISK & FLNAM are read backwards !
;-------------------
HOWMANY = $02
FILEDATA
    .WORD $C000,$C117                   ; A  Freeloader control software
    .WORD $0801,$4890                   ; B  Game

FLNAM
    .TEXT "BA"                          ; BACKWARDS !!!
WHICHDISK
    .BYTE $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
STARTUP = $C000                         ; Freeload control software start address
dalla quale si evince anche che l'indirizzo di caricamento e di esecuzione del loader sono uguali...

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Re:Visualizzare immagine durante il caricamento
« Risposta #12 il: 18 Ottobre 2016, 12:47:52 »
Devo sicuramente riprovare ad utilizzare il loader per beneficiare delle utili funzionalità esposte (musica,bitmap,ecc...).

Ieri sera intanto ho fatto un po di test semplificando al massimo tutto per capire dove il flusso si interrompe.
- Caricando direttamente con il saver un piccolo prg liscio tutto funziona.
- Utilizzando un prg exomized (sfx $080d), il file viene caricato ma al momento dell'esecuzione comincia a fare il decrunch ma dopo meno di un secondo il nastro riparte e va in crash....
- Utilizzando il prg exomized (non so con che parametri) che mi hanno passato su lemon64 tutto funziona correttamente compreso il decrunch (il nastro si ferma)
A questo punto mi viene logico pensare che il problema sia, o nei parametri da passare ad exomizer , oppure nella configurazione di FILEDATA/STARTUP nel saver...
Che ne pensi?

Flavioweb

  • Utente
  • **
  • Post: 58
    • http://www.flavioweb.it
  • Gioco Preferito: Maniac Mansion
Re:Visualizzare immagine durante il caricamento
« Risposta #13 il: 18 Ottobre 2016, 21:36:04 »
Penso che invece di parlare per niente e andare per presupposti, era ora che mi "sporcassi le mani" per vedere un po' quali problemi ci sono nell'usare il codice DASM rilasciato.
Ti premetto che io uso il 64tass, quindi ho dovuto convertire il sorgente in -qualcosa- di compilabile per il mio compilatore.
Ho notato una cosa, che può essere solo un mio problema con il 64tass, perchè NON so come si comporta il DASM.
La seguente porzione di codice del SAVER:
Codice: [Seleziona]
FILEDATA
    .WORD $C000, $C118                   ; A  Freeloader control software
    .WORD $0801, $19CF                   ; B  Game
viene compilata dal 64tass come:
Codice: [Seleziona]
$C0, $00, $C1, $18, $08, $01, $19, $CF
ma il codice del SAVER si aspetta l'ordine basso/alto dei bytes, cioè:
Codice: [Seleziona]
$00, $C0, $18, $C1, $01, $08, $CF, $19
quindi verifica l'esattezza di questa cosa, prima di tutto.

Poi, nei miei precedenti esperimenti, avevo usato la versione MULTILOAD che non implementa alcuna automazione per la visualizzazione delle Pictures, per la musica o per lo scrolltext, ma si limita a caricare un file da nastro dato "un numero" che l'identifica.
Anche qui la questione non è chiara: il "numero che identifica" dovrebbe essere il numero del file da caricare partendo da quello attuale.
Esempio veloce: carichiamo il primo file su nastro, lo eseguima e al termine dell'esecuzione dobbiamo caricare il secondo file: specifichiamo sempre 1 come numero del file da caricare... cioè "non saltare" alcun file, ma carica subito.
Ma questo è un altro discorso... che ho fatto per dire che con il "multiloader" riesco a creare TAP funzionanti, mentre con il SINGLE loader (che è quello con lo scrolltext, gli effetti etc... etc... ho qualche problema anch'io).
Un esempio di TAP funzionante è questo.

Altro dettaglio è la "lunghezza" dei files da salvare su nastro: il valore corretto da usare è quello riportato dalla cartuccia Action Replay (per esempio) e non quello riportato dal compilatore.
Esempio: il mio loader occupa la ram da $C000 a $C117.
Se lo carico con l'ActionReplay, la cart riporta $C000-$C118, mentre il compilatore riporta la prima coppia di indirizzi.
Il saver funziona correttamente solo se gli si "passa" la versione con "un byte in più" della ram realmente occupata dal codice.

Per tornare al LOADER... il codice della versione "mono" è altamente customizzata per qualche tipo di software che l'autore stava sviluppando...
Infatti nel bel mezzo del codice c'è:
Codice: [Seleziona]
;---------------------------------------
; RELOCATE - Relocates code from
; $4000 to $D000
;-------------------
RELOCATE
SEI
    LDA #$30
    STA $01                             ; relocate code
    LDY #$00
    LDX #$10
TLOP
    LDA $4000,Y
TO
    STA $D000,Y
    INY
    BNE TLOP
    INC TLOP+$0002
    INC TO+$0002
    DEX
    BNE TLOP
    LDA #$35
    STA $01
    CLI
    LDA #$60                            ; self modifying CLI to RTS
    STA $02D4
    JMP $02A7                           ; re-initialise the loader
richiamato in questo punto
Codice: [Seleziona]
LOAD_D000
    JSR CHECKSTOP
    LDX LOAD_FLAG                       ; $4000 relocating up to $D000
    BEQ LOAD_D000
    INX
    STX LOAD_FLAG
    JSR RELOCATE                        ; relocate code to $D000
ma non è di alcuna utilità in un programma generico...
Poi c'è la parte per rilevare le "expert cartridge" che è pressochè inutile oggi.

Nei miei tests riesco ad eseguire lo scrolltext, caricare le pic, suonare la musica... ma NON ad eseguire correttamente un programma...
L'ultima porzione del caricamento viene gestita da un loader nello stack pointer, cioè quando il loader incontra il "trigger" per il FIRE_UP_STACK, butta nello stack il codice e lo esegue. Questo codice carica ancora almeno un file e poi, dopo alcune operazioni, salta all'indirizzo di partenza specificato in fase di compilazione...

Non riesco a capire se sia più utile studiare la versione "single load" per "rimetterla in funzione" o crearne una nuova usando il "multiloader"...
Confesso che il passaggio DASM -> 64Tass ha creato qualche difficoltà...

Tu sei riuscito ad ottenere risultati migliori?

antoniomauro

  • Utente
  • **
  • Post: 91
  • Gioco Preferito: IK+
Re:Visualizzare immagine durante il caricamento
« Risposta #14 il: 19 Ottobre 2016, 10:51:51 »
Ciao F,
ieri ho avuto poco tempo ed ho solo fatto qualche test utilizzando solamente il metodo "saver+mio prg".
Sono riuscito a far caricare con successo un semplice programma ed anche un gioco (exomized) che mi hanno passato su lemon64.

Tuttavia testando il tutto con il mio demo completo ho incontrato diversi problemi:
- Il decrunch termina, il codice sembra correttamente caricato ma al momento dell'esecuzione non va...
- Gran parte dei dati caricati tra $2187 e $4ce9 sono corrotti (in pratica tutto il charset)
- Anche la musica messa su $A000 suona storpiata
- Altre locazioni non le ho controllate....

A questo punto credo che, per far funzionare questo metodo,sia necessario rispettare un particolare setup della memoria.
Io ho adottato questo:
;$DD00 = %xxxxxx10 -> bank1: $4000-$7fff
;$D018 = %0000xxxx -> screenmem is at $0000
;$D018 = %xxxx001x -> charmem is at $0800
musica: $A000
dati extra $D000 <-> $FFFF (switching $01)

ps:
Non riesco a trovare un'immagine di action replay funzionante su VICE che mi mostri "start,end address" in fase di caricamento....
Me ne indicheresti una?
« Ultima modifica: 19 Ottobre 2016, 10:55:44 da antoniomauro »