Partielles kopieren ist erst der übernächste Schritt, weil das verkompliziert das Vorgehen ein wenig, da Du ja wissen musst, an welche Stelle wieviel bytes neu sollen ![]()
Mal eben runtergeklimpert, ungestet. Es ist Freitag Abend und ein Glas Wein ist anwesend, somit keine Garantie - allerdings hoffe ich, das indirekte-indexierte Adressierung einigermassen verständlich rüber kommt...
Der Kram setzt voraus, dass alle PETSCII-Screens hintereinander liegen (Screen 1 ab framePetscii0000, Screen 2 ab framePetscii0000 + $0400, Screen 3 ab framePetscii0000 + $0400 * 2, etc.) und selbiges für Color-Ram, welches ab frameColor0000 liegt.
Vielleicht habe ich da auch noch nen Klopper drin, ich weiss es nicht.
// get current frame
lda frameCounter
// multiply by 4
// 1st frame starts at $0000 (plus offset framePetscii0000)
// 2nd frame starts at $0400 plus offset
// 3rd frame starts at $0800
// so on
asl
asl
// save calculated values for later use. no need for pha and pla
tax
// screen ram current frame
// init by setting offset
ldy #< framePetscii0000
sty $80
ldy #> framePetscii0000
sty $81
// add accu. contains calculated offset: $00, $04, $08, etc.
adc $81
sta $81
// restore calculated value for new value
txa
// color ram current frame
ldy #< frameColor0000
sty $82
ldy #> frameColor0000
sty $83
// add accu. contains calculated offset: $00, $04, $08, etc.
adc $83
sta $83
drawFrameInit:
// init destination addresses for (next) frame
// screen ram destination
ldy #$00
sty $84
ldy #$04
sty $85
// color ram destination
ldy #$00
sty $86
ldy #$d8
sty $87
// set counter for 4 pages
ldx #$03
ldy #$00
drawMe:
// get current Petscii frame
lda ($80),y
// write to screen ram
sta ($84),y
// get current color frame
lda ($82),y
// write to color ram
sta ($86),y
iny
// do 256 bytes
bne drawMe
// increase high bytes
inc $81
inc $83
inc $85
inc $87
dex
bne drawMe
frameCounter:
.byte $00
Alles anzeigen
Der nächste frame wäre dann ein inc frameCounter und anschliessender Aufruf von drawFrameInit.
Vielleicht habe ich da auch noch nen Klopper dirn, ich weiss es nicht, weil ungetestet.
Nachtrag:
Je nachdem auf welcher Raster-Position man die Routine aufruft, sieht man sehr wahrscheinlich, wenn das Schreiben der Daten für den neuen frame stattfindet. Eine Lösung wäre hierfür mit double-buffering (zwei Screens) zu arbeiten. So kann der eine Screen aktualisiert werden, während der andere angezeigt wird. Wenn die Aktualisierung erfolgt ist, wird auf den fertigen Screen umgeschaltet. Glas ist leer...