Autor Thema: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?  (Gelesen 8595 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-2
Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« am: 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

Online TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 3288
  • Liked: 780
  • Karma: +39/-0
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #1 am: 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).
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 29.12.2020)
http://futureos.cpcwiki.de/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 21.01.2021)

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-2
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #2 am: 11. November 2018, 09:06:10 »
Danke.
Wie sehen deine Lösungen bitte aus in ASM.

Gruss

Online TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 3288
  • Liked: 780
  • Karma: +39/-0
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #3 am: 11. November 2018, 14:08:38 »
Schreibe ich Dir gerne, aber wie gesagt, das ist unter FutureOS. Willst Du damit was machen?
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 29.12.2020)
http://futureos.cpcwiki.de/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 21.01.2021)

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-2
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #4 am: 11. November 2018, 20:14:05 »
Ja, ich möchte einen Speicherbereich schnell umsetzen.

Weiterhin interessiert mit jede Neuigkeit in ASM.

Danke.
Gruss

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-2
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #5 am: 15. November 2018, 08:51:26 »
Hallo TFM, könnstest du mir mal bitte eine schnelle Kopierroutine zukommen lassen ?

Danke.
Gruss

Online TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 3288
  • Liked: 780
  • Karma: +39/-0
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #6 am: 15. November 2018, 17:12:44 »
Gerne!

- Welches OS (natives OS, CP/M, SymbOS, FutureOS)?
- Welche Sprache? (ASM, BASIC)?
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 29.12.2020)
http://futureos.cpcwiki.de/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 21.01.2021)

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-2
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #7 am: 15. November 2018, 22:01:51 »
Danke.
natives Os und ASM.

Gruss

Online TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 3288
  • Liked: 780
  • Karma: +39/-0
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #8 am: 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.
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 29.12.2020)
http://futureos.cpcwiki.de/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 21.01.2021)

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-2
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #9 am: 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

Offline Devilmarkus

  • Administrator
  • CPC 464+
  • *****
  • Beiträge: 1113
  • Liked: 367
  • Karma: +39/-0
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #10 am: 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)
« Letzte Änderung: 16. November 2018, 10:27:45 von Devilmarkus »
http://cpcwiki.de
Dein Deutsches CPCWiki!

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-2
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #11 am: 16. November 2018, 11:40:25 »
Ich möchte bei einer Animation den Bereich von $4000 nach $c000 kopieren.

Danke.
Gruss.

Offline Devilmarkus

  • Administrator
  • CPC 464+
  • *****
  • Beiträge: 1113
  • Liked: 367
  • Karma: +39/-0
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #12 am: 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...
http://cpcwiki.de
Dein Deutsches CPCWiki!

Offline cpcman

  • CPC 664
  • ***
  • Beiträge: 184
  • Liked: 11
  • Karma: +5/-2
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #13 am: 16. November 2018, 12:38:23 »
Danke.

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

Gruss

Offline Devilmarkus

  • Administrator
  • CPC 464+
  • *****
  • Beiträge: 1113
  • Liked: 367
  • Karma: +39/-0
Re: Schnelle Kopierroutine von #4000 nach #c000 (16kb)?
« Antwort #14 am: 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
« Letzte Änderung: 16. November 2018, 12:58:42 von Devilmarkus »
http://cpcwiki.de
Dein Deutsches CPCWiki!