Hallo, guten Tag.
Ich suche eine sehr schnelle Kopierroutine von #4000 nach #c000 (16kb) ?
Die hab ich mir angefertigt:
public static void copy_40_c0()
asm inline (Indirections.Values())
{
ld de,#c000
ld hl,#4000
ld bc,#4000
ldir
}
Gibt es eine schnellere?
danke.
Gruss
Die einzige schnellere ist F_MOVE in FutureOS. Spart pro Byte 1 us (5 us anstatt 6 us pro Byte). Das sind aber nur 16,7%.
Wenn es nur darum geht ein Byte zu schreiben, dann kann man mit 2 us pro Byte arbeiten (F_FILL).
Danke.
Wie sehen deine Lösungen bitte aus in ASM.
Gruss
Schreibe ich Dir gerne, aber wie gesagt, das ist unter FutureOS. Willst Du damit was machen?
Ja, ich möchte einen Speicherbereich schnell umsetzen.
Weiterhin interessiert mit jede Neuigkeit in ASM.
Danke.
Gruss
Hallo TFM, könnstest du mir mal bitte eine schnelle Kopierroutine zukommen lassen ?
Danke.
Gruss
Gerne!
- Welches OS (natives OS, CP/M, SymbOS, FutureOS)?
- Welche Sprache? (ASM, BASIC)?
Danke.
natives Os und ASM.
Gruss
Wenn sich die Blöcke nicht überschneiden:
LD HL,Quelle
LD DE,Ziel
LD BC,Länge
LDIR
Bei Überschneidungen von Quell- und Ziel-Block ist eventuell LDDR anstatt LDIR zu benutzen. Aber dann bitte auch HL und DE anpassen - spricht auf's Bockende setzen.
Danke, die Routine habe ich schon im Einsatz.
Ist noch zu langsam.
Wie machst du das das eigentlich in FutureOS ?
F_MOVE......
Danke.
Gruss
Was hast du denn mit der Routine vor?
Möchtest du Animationen spielen, oder wofür ist es gedacht?
Problem wird vermutlich hier dann weniger die Geschwindigkeit sein, sondern dass sich das Bild Scheibchenweise aufbaut, kann das sein?
Schau dir mal die 4 SNA im JavaCPC an: (Wichtig: 4mb Erweiterung benötigt)
Ich möchte bei einer Animation den Bereich von $4000 nach $c000 kopieren.
Danke.
Gruss.
Ja genau das mache ich hier auch, allerdings muss man die Bilder vorher auch speziell nach &4000 kopieren, da der Aufbau eben nicht Scheibchenweise ist...
Die Routine (Eine komplette RSX Erweiterung, mit Sprites usw...) ist noch nicht fertig, da fehlen noch ein paar Dinge, wenn sie fertig ist, poste ich sie hier...
Danke.
RSX mache ich nicht.
Ich spiele mit dem CCZ80++-Compiler.
Brauche den Code in ASM.
Gruss
Die Routine ist ja in Assembler...
Ich such dir grad mal die Ausschnitte aus, die du brauchst...
Einige Sachen, wie Bankswitching, habe ich hier nicht berücksichtigt, das wirst du bestimmt selber wissen, das musst du hier also abändern
Falls dein Compiler "repeat" und "rend" nicht kennt: Du benötigst hier 80x LDI
;
; SCRCOPY - Copy the Screen line by Line for Re-Rendering
;
ScreenCopy:
or a ; Has any Parameter Been Passed?
jp z,BankOutOfRange ; Check we are in Range of Memory Banks Available
call bank ; Switch in the Selected bank.
ld de,#4000
call PreCalculateScreenAddress; Ensuire not corrupted
DI ; Disable Interrupts
ScreenCopy1:
ld (RestoreSP1),sp ; Save Stack Pointer
ld sp,scrAddrTable+2 ; Point to the Bottom of the Pre-Calculated Stack
ld a,200 ; 200 Lines of Screen
ScreenCopyLoop:
pop HL
;
; LDI Stack - Quicker at loading memory at fixed 16 T-States per insturction
;
LDI80
repeat 80
LDI
rend
dec a ; decrease counter
jp nz,ScreenCopyLoop
ld sp,0000 ; Restore Stack Pointer
RestoreSP1 equ $-2
EI ; Enable interrupts again.
ret
;
; Paste the Screen with data from the buffer at #4000
;
ScreenPaste:
or a ; Has any Parameter Been Passed?
jp z,BankOutOfRange
ld hl,ScreenPasteLoop
cp 1 ; One Paramater Passed?
jr z,ScreenPaste1 ; Increment IX
ld hl,ScreenPasteLoopSync ; Which Routine?
inc ix
inc ix
ScreenPaste1
ld (PasteWithFlyback),hl ; Set Proper Routine
call Bank ; Set the correct bank to paste from
call PreCalculateScreenAddress ; Gets Corrupts
DI
ld HL,#4000
ld (RestoreSP2),sp ; Save Stack Pointer
ld sp,scrAddrTable+2 ; Point to the Bottom of the Pre-Calculated Stack
ld a,200 ; 200 Lines of Screen
ScreenPasteLoopSync:
PUSH AF
call frameFly
pop AF
ScreenPasteLoop:
pop DE
;
; LDI Stack - Quicker at loading memory at fixed 16 T-States per insturction
;
LDI80b
repeat 80
LDI
rend
dec a ; decrease counter
jp nz,ScreenPasteLoop
PasteWithFlyback equ $-2
ld sp,0000 ; Restore Stack Pointer
RestoreSP2 equ $-2
EI ; Enable interrupts again.
ret
Quote from: cpcman on 16. November 2018, 08:54:54
Wie machst du das das eigentlich in FutureOS ?
F_MOVE......
Bei F_MOVE läd man die Register genau so wie bei LDIR, nur dass bei F_MOVE eine Reihe von LDI Befehlen hintereinander stehen. Pro Byte benötigt der Transfer also nur noch 5 anstatt 6 Mikrosekunden. Schneller geht es nicht.
Ja, danke für eure Hilfe.
Welchen Compiler nimmst du für dein Beispiel-ASM ?
Gruss
Normalerweise benutze ich den MAXAM Assembler im ROM. Ist zwar nicht der schnellste, aber absolut zuverlässig und fehlerfrei. Bei Nutzung im Emulator ist er auch bei Source Codes von über 100 KB schnell genug.
Ich assembliere alles mit JavaCPC.... Der reicht mir für das Bisschen Blödsinn, was ich so mache ;-)
Ja , ich nehme den Pasmo.
Der kommt gut klar mit dem ASM-Code vom CCZ80++.
Der von JavaCPC schluckt noch nicht alles.
Gruss
Der sollte alles Maxam-Kompatible schlucken...
Wo gibt es denn Probleme?