Schneider / Amstrad CPC Forum

Amstrad / Schneider CPC => Programmierung => Topic started by: cpcman on 09. November 2018, 22:09:02

Title: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: cpcman on 09. November 2018, 22:09:02
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
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: TFM on 11. November 2018, 04:35:52
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).
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: cpcman on 11. November 2018, 09:06:10
Danke.
Wie sehen deine Lösungen bitte aus in ASM.

Gruss
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: TFM on 11. November 2018, 14:08:38
Schreibe ich Dir gerne, aber wie gesagt, das ist unter FutureOS. Willst Du damit was machen?
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: cpcman on 11. November 2018, 20:14:05
Ja, ich möchte einen Speicherbereich schnell umsetzen.

Weiterhin interessiert mit jede Neuigkeit in ASM.

Danke.
Gruss
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: cpcman on 15. November 2018, 08:51:26
Hallo TFM, könnstest du mir mal bitte eine schnelle Kopierroutine zukommen lassen ?

Danke.
Gruss
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: TFM on 15. November 2018, 17:12:44
Gerne!

- Welches OS (natives OS, CP/M, SymbOS, FutureOS)?
- Welche Sprache? (ASM, BASIC)?
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: cpcman on 15. November 2018, 22:01:51
Danke.
natives Os und ASM.

Gruss
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: TFM on 15. November 2018, 23:50:28
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.
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: cpcman on 16. November 2018, 08:54:54
Danke, die Routine habe ich schon im Einsatz.
Ist noch zu langsam.

Wie machst du das das eigentlich in FutureOS ?
F_MOVE......

Danke.
Gruss
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: Devilmarkus on 16. November 2018, 10:19:25
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)
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: cpcman on 16. November 2018, 11:40:25
Ich möchte bei einer Animation den Bereich von $4000 nach $c000 kopieren.

Danke.
Gruss.
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: Devilmarkus on 16. November 2018, 11:46:07
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...
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: cpcman on 16. November 2018, 12:38:23
Danke.

RSX mache ich nicht.
Ich spiele mit dem CCZ80++-Compiler.
Brauche den Code in ASM.

Gruss
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: Devilmarkus on 16. November 2018, 12:54:23
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
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: TFM on 16. November 2018, 14:12:09
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.
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: cpcman on 16. November 2018, 15:55:40
Ja, danke für eure Hilfe.

Welchen Compiler nimmst du für dein Beispiel-ASM ?

Gruss
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: TFM on 16. November 2018, 16:14:49
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.
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: Devilmarkus on 16. November 2018, 17:58:15
Ich assembliere alles mit JavaCPC.... Der reicht mir für das Bisschen Blödsinn, was ich so mache ;-)
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: cpcman on 16. November 2018, 23:10:18
Ja , ich nehme den Pasmo.
Der kommt gut klar mit dem ASM-Code vom CCZ80++.
Der von JavaCPC schluckt noch nicht alles.

Gruss
Title: Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
Post by: Devilmarkus on 17. November 2018, 11:32:27
Der sollte alles Maxam-Kompatible schlucken...
Wo gibt es denn Probleme?