Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: Yurif999 - 05 Marzo 2008, 13:41:45
-
Purtroppo questo trucco funziona solo sul Commodore 128 (sia in modalita' C64 che in modalita' C128)
Accendete il computer, entrate in modalita' C64 e digitate il seguente listato (oppure con vice caricate X128 ed entrate in modalita' 64)
attenzione questo programma non funziona su C64 standard o emulato!!!
c000 A9 04 LDA #$04
c002 8D 13 C0 STA $C013
c005 20 15 C0 JSR $C015
c008 EE 13 C0 INC $C013
c00b AD 13 C0 LDA $C013
c00e C9 08 CMP #$08
c010 D0 F3 BNE $C005
c012 60 RTS
c013 08 PHP
c014 00 BRK
c015 A2 00 LDX #$00
c017 A0 12 LDY #$12
c019 8C 00 D6 STY $D600
c01c 2C 00 D6 BIT $D600
c01f 10 FB BPL $C01C
c021 AC 13 C0 LDY $C013
c024 88 DEY
c025 88 DEY
c026 88 DEY
c027 88 DEY
c028 8C 01 D6 STY $D601
c02b A0 13 LDY #$13
c02d 8C 00 D6 STY $D600
c030 2C 00 D6 BIT $D600
c033 10 FB BPL $C030
c035 8E 01 D6 STX $D601
c038 A0 1F LDY #$1F
c03a 8C 00 D6 STY $D600
c03d 2C 00 D6 BIT $D600
c040 10 FB BPL $C03D
c042 AD 13 C0 LDA $C013
c045 8D 4A C0 STA $C04A
c048 BD 00 07 LDA $0700,X
c04b 8D 01 D6 STA $D601
c04e E8 INX
c04f E0 00 CPX #$00
c051 D0 C4 BNE $C017
c053 60 RTS
c054 A9 04 LDA #$04
c056 8D 67 C0 STA $C067
c059 20 69 C0 JSR $C069
c05c EE 67 C0 INC $C067
c05f AD 67 C0 LDA $C067
c062 C9 08 CMP #$08
c064 D0 F3 BNE $C059
c066 60 RTS
c067 08 PHP
c068 00 BRK
c069 A2 00 LDX #$00
c06b A0 12 LDY #$12
c06d 8C 00 D6 STY $D600
c070 2C 00 D6 BIT $D600
c073 10 FB BPL $C070
c075 AC 67 C0 LDY $C067
c078 88 DEY
c079 88 DEY
c07a 88 DEY
c07b 88 DEY
c07c 8C 01 D6 STY $D601
c07f A0 13 LDY #$13
c081 8C 00 D6 STY $D600
c084 2C 00 D6 BIT $D600
c087 10 FB BPL $C084
c089 8E 01 D6 STX $D601
c08c A0 1F LDY #$1F
c08e 8C 00 D6 STY $D600
c091 2C 00 D6 BIT $D600
c094 10 FB BPL $C091
c096 AC 67 C0 LDY $C067
c099 8C A1 C0 STY $C0A1
c09c AD 01 D6 LDA $D601
c09f 9D 00 07 STA $0700,X
c0a2 E8 INX
c0a3 E0 00 CPX #$00
c0a5 D0 C4 BNE $C06B
c0a7 60 RTS
a questo punto senza ripulire lo schermo (oppure ripulitelo e fate un bel disegnino con i caratteri grafici) digitate SYS49152
date un bel SYS64738
ed infine dopo che e' avvenuto il reset: SYS49236
A prima vista sembrerebbe un semplice programmino che salva lo schermo in memoria con SYS49152 e lo ripristina con SYS49236...
c'e' un piccolo dettaglio... se esaminate la memoria del commodore 64 alla ricerca della schermata salvata... non la troverete ovviamente!
Ma allora dove viene salvata questa schermata? se guardate il listato (e ci capite un minimo di ASM) noterete che si lavora con i registri $D600 e $D601; la prima routine ci scrive tutto il Kb della schermata, mentre la seconda lo legge.
Alcuni di voi penseranno che viene salvata negll'altro banco da 64k presente nel C128.... MAGARI! (e scusatemi il maiuscolo ma qui' ci voleva proprio..)
purtroppo quando si entra in modalita' C64 la MMU del C128 viene disabilitata e quindi l'altro banco da 64K non e' piu' disponibile...
ma allora dove caspita viene salvata quella schermata?????
semplice: praticamente tutti i C128 non hanno 128K di memoria bensi' 144K!! addirittura alcuni modelli hanno ben 192K!!! di memoria disponibile
chi ha usato l'emulatore ha gia' capito il trucco... viene usata la memoria video del VDC (il chip ad 80 colonne del C128) a cui sono collegati 16Kb di ram (ed in alcuni rari casi 64Kb)
Sfortunatamente (o fortunatamente) la commodore si e' dimenticata di disabilitare anche questo chip in modalita' C64... o magari lo ha fatto di proposito..... chissa'...
ciao!
-
Molto carino l'uso della ram del VDC.
Accendete il computer, entrate in modalita' C64 e digitate il seguente listato (oppure con vice caricate X128 ed entrate in modalita' 64)
Ah? Da modo C64 digitare questo implica usare un monitor esterno, e da modo C128 a $C000 c'e' la rom. Non si puo' in qualche modo sfruttare il monitor del C128?
Ad ogni modo l'ho convertito manualmente in un sorgente da compilare con un assembler (dasm preferibilmente), ho notato MOLTO codice ridondante che ho rimosso raggruppando alcuni pezzi e anche per capire come funzionasse l'ho anche commentato.
;-----------------------------------------------
; c128 modo c64
; salva schermo usando la memoria VDC
; chiamate:
; sys 49152 per savescreen
; sys 49155 per loadscreen
; programma originale : Yurif999
; riduzione e commenti: iAN CooG/HokutoForce
;-----------------------------------------------
; per passare a modo c64 evitando la richiesta
; dare sysdec("e24b") o da vicemonitor g e24b
;-----------------------------------------------
*=$c000
jmp savescr
loadscr ldx #<fetch
ldy #>fetch
lda #$9D ;STA $ffff,X
bne setup
savescr ldx #<stash
ldy #>stash
lda #$BD ;LDA $ffff,X
setup sta opc
stx here+1
sty here+2
lda #>$0400
sta opc+2
loop1 jsr move
inc opc+2
lda opc+2
cmp #$08
bne loop1
rts
;---------------------------------------
move ldx #$00
mvlp ldy #$12 ;vdc: set
jsr waitd600;dest.hibyte
lda opc+2
and #$03
sta $d601
ldy #$13 ;vdc: set
jsr waitd600;dest.lobyte
stx $d601
ldy #$1F ;vdc:
jsr waitd600;r/w byte
here jsr $ffff
inx
bne mvlp
rts
;---------------------------------------
fetch lda $d601
opc sta $0400,x;sta/lda
rts
stash jsr opc
sta $d601
rts
;---------------------------------------
waitd600
sty $d600
w8_1 bit $d600; wait ack?
bpl w8_1
rts
Gradirei delle spiegazioni sull'uso delle porte VDC $D600/D601 (non so se ho azzeccato il significato di ogni comando, ho solo usato l'intuito) cosi' da risparmiarmi la ricerca nella C128 PRG, visto che ce l'ho solo in PDF non ricercabile e mi scazza parecchio non averla in molto piu' comodo TXT ;)
-
c'e' un piccolo dettaglio... se esaminate la memoria del commodore 64 alla ricerca della schermata salvata... non la troverete ovviamente!
Interessante come idea. In x128 poi si riconosce il contenuto della schermata salvata nello schermo a 80 colonne.
Qualcosa sull'utilizzo del chip video a 80 colonne (8563) si trova su CCC numero 48, pagina 76 e seguenti, per chi fosse interessato. L'articolo รจ sufficiente a capire come avviene l'accesso all'8563 e a cosa servano istruzioni apparentemente superflue come quel BIT $D600 (per i pigri, si tratta in soldoni di un ciclo di attesa della "risposta" dell'8563, che funziona in maniera asincrona).
semplice: praticamente tutti i C128 non hanno 128K di memoria bensi' 144K!! addirittura alcuni modelli hanno ben 192K!!! di memoria disponibile
Affermazione capziosa: in base alla stessa logica, si potrebbe dire di un PC con 512 MB di RAM e scheda video con 256 MB dedicati che "ha 768 MB di memoria", il che sarebbe ingannevole. ;) Comunque fra di noi ci capiamo...
-
@Ian-Coog
assolutamente esatto!
Il registro $D600 serve per inviare i comandi al VDC
Mentre il registro $D601 invia il dato del comando, la cosa e' un po macchinosa e cerchero' di essere piu' chiaro possibile:
si carica in $d600 il numero del registro su cui si vuole operare
BIT $D600
serve esattamente come hai capito tu ad attendere che il VDC "agganci" il registro richiesto alla locazione $D601
$D601 ha una duplice funzione:
questa contiene il valore contenuto nel registro richiamato prima
LDA$D601 carica nell'accumulatore il valore del registro (richiamato con $d600) contenuto in $D601
oppure
STA$D601 (o STX STY ecc) INSERISCE in $D601 un valore
nel mio programma ho usato 3 registri:
$12 = ADDRESS POINTER HI
$13 = ADDRESS POINTER LOW
$1F = DATA BYTE
piccolo esempio: si carica in $D600 il valore $12: questa operazione rende disponibile alla locazione $D601 il puntatore HI BYTE dell'indirizzo della memoria del VDC
scriviamo per esempio il valore $20
si carica il valore $13 in $D600 otterremo quindi in $D601 il puntatore LOW BYTE
dell'indirizzo della memoria VDC.
scriviamoci per esempio il valore $00
in questo momento esatto il VDC punta alla locazione $2000 della sua memoria video
con il comando $1F si va a curiosare (LDA) o scrivere (STA) il valore in quella esatta locazione di memoria.
Quindi Ian-Coog ha capito perfettamente il funzionamento!
per un elenco dei registri del VDC leggete questo numero di transactor:
http://cbm.csbruce.com/~csbruce/cbm/transa...v7/i3/p057.html (http://cbm.csbruce.com/~csbruce/cbm/transactor/v7/i3/p057.html)
usare il monitor del c128 si puo' basta rilocare il codice da un altra parte (esempio $2000) oppure provando nell'altro banco da 64k (non so pero' se in questo caso funziona) :P
@eregil
Affermazione capziosa: in base alla stessa logica, si potrebbe dire di un PC con 512 MB di RAM e scheda video con 256 MB dedicati che "ha 768 MB di memoria", il che sarebbe ingannevole
il C128 ha 2 schede video... quando se ne usa 1 (VIC-II 40 colonne) beh nessuno ci vieta di usare la memoria dell'altra (VDC 80 colonne) come memoria tampone... ;)
ciao
ps: grazie per l'ottimizzazione del codice Ian, io in LM "arranco" hehehe :lol: