Autore Topic: Espansione Di Memoria Gratuita..  (Letto 1976 volte)

Yurif999

  • Utente
  • **
  • Post: 86
    • http://www.facebook.com/juri.fossaroli
  • Gioco Preferito: Turrican
Espansione Di Memoria Gratuita..
« il: 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!!!

Codice: [Seleziona]
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!
JMP $EA31

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Espansione Di Memoria Gratuita..
« Risposta #1 il: 05 Marzo 2008, 21:19:14 »
Molto carino l'uso della ram del VDC.
Citazione
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.
Codice: [Seleziona]
;-----------------------------------------------
; 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 ;)
« Ultima modifica: 21 Gennaio 2015, 23:03:46 da eregil »
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

eregil

  • Administrator
  • Utente
  • *****
  • Post: 706
  • Gioco Preferito: Impossible Mission
Espansione Di Memoria Gratuita..
« Risposta #2 il: 05 Marzo 2008, 21:49:39 »
Citazione da: yurif999
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).

Citazione da: yurif999
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...
« Ultima modifica: 21 Gennaio 2015, 23:04:53 da eregil »
Non rispondo a richieste private, di qualunque genere esse siano.
Per domande tecniche leggete le FAQ e usate l'apposito forum.
Per questioni amministrative contattate lo staff tramite il form Contatti sul sito.

Yurif999

  • Utente
  • **
  • Post: 86
    • http://www.facebook.com/juri.fossaroli
  • Gioco Preferito: Turrican
Espansione Di Memoria Gratuita..
« Risposta #3 il: 05 Marzo 2008, 23:56:03 »
 @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

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

Citazione
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:
JMP $EA31