Sind die besoffen auf dem CPC Wiki??
Quote;Entry: BC = Sprite address, D = width, E = height, HL = screen address
LD LX,D ;LX = width
LD HY,E ;HY = height
EX DE,HL
LD H,andmasks / 256
.rowloop
LD HX,LX ;HX <= width
.dobyte
LD A,(BC):INC C
LD L,A:LD A,(DE)
AND (HL):INC H:OR (HL):DEC H
LD (DE),A:INC E
DEC HX
JR NZ,dobyte
DEC HY
RET Z
LD A,E
SUB LX
LD E,A
LD A,D
ADD 8
LD D,A
JR NC,rowloop
LD A,E
ADD #40
LD E,A
LD A,D
ADC #C0
LD D,A
JR rowloop
bzw. http://www.cpcwiki.eu/index.php/Programming:Fast_Sprites (http://www.cpcwiki.eu/index.php/Programming:Fast_Sprites)
Das ist mir mal wieder zu hoch. :(
Wo ist das Problem?
;Entry: BC = Sprite address, D = width, E = height, HL = screen address
LX EQU &xxxx
HY EQU &xxxx
LD LX,D ;LX = width
LD HY,E ;HY = height
Oder:
;Entry: BC = Sprite address, D = width, E = height, HL = screen address
LX: DB 0
HY: DB 0
LD LX,D ;LX = width
LD HY,E ;HY = height
Also WinCPC schluckt kein LD LX,D.
Was soll das darstellen? Illegale Befehle?
Quote from: oobdoo on 31. March 2015, 21:05:25
Also WinCPC schluckt kein LD LX,D.
Was soll das darstellen? Illegale Befehle?
Hab ich doch gerade beantwortet?!?
Quote from: Devilmarkus on 31. March 2015, 21:06:04
Quote from: oobdoo on 31. March 2015, 21:05:25
Also WinCPC schluckt kein LD LX,D.
Was soll das darstellen? Illegale Befehle?
Hab ich doch gerade beantwortet?!?
Wo? Das ist mir jetzt zu hoch. Oder ich seh den Wald vor lauter Bäumen nicht. :banghead:
Einfach Label LX und HY setzen, ein DB 0 jeweils dahinter, sollte doch gehen?
Oder Variablen LX und HY mit EQU einer Adresse jeweils zuweisen?
Quote from: Devilmarkus on 31. March 2015, 21:10:47
Einfach Label LX und HY setzen, ein DB 0 jeweils dahinter, sollte doch gehen?
Oder Variablen LX und HY mit EQU einer Adresse jeweils zuweisen?
Der WinCPC kann es schonmal nicht. Hm, müßte ich umsteigen...
Quote from: oobdoo on 31. March 2015, 21:12:19
Quote from: Devilmarkus on 31. March 2015, 21:10:47
Einfach Label LX und HY setzen, ein DB 0 jeweils dahinter, sollte doch gehen?
Oder Variablen LX und HY mit EQU einer Adresse jeweils zuweisen?
Der WinCPC kann es schonmal nicht. Hm, müßte ich umsteigen...
Versuch mal:
.LX
DEFB 0
.HY
DEFB 0
WinCPC ist leider eh recht unflexibel, was den darin integrierten Assembler anbelangt...
Nimm lieber Maxam am CPC oder einen flexibleren Emulator ;)
Geht DEFB / DB auch nicht, nimm stattdessen je ein NOP
Nein, der WinCPC meldet immer Syntaxfehler wenn er auf das LX oder LY trifft.
Hast recht, ich vergass: LX und HY sind reelle Register.
Schimpf mal mit dem Flynn dann....
Kurz mal assembliert:
000001 0000 ANDMASKS:
000002 0000 DB 200 C8
000004 0001 LD LX,D DD 6A
000005 0003 LD HY,E FD 63
000006 0005 EX DE,HL EB
000007 0006 LD H,ANDMASKS / 256 26 00
000008 0008 ROWLOOP:
000009 0008 LD HX,LX DD 65
000010 000A DOBYTE:
000011 000A LD A,(BC) 0A
000011 000B INC C 0C
000012 000C LD L,A 6F
000012 000D LD A,(DE) 1A
000013 000E AND (HL) A6
000013 000F INC H 24
000013 0010 OR (HL) B6
000013 0011 DEC H 25
000014 0012 LD (DE),A 12
000014 0013 INC E 1C
000015 0014 DEC HX DD 25
000016 0016 JR NZ,DOBYTE 20 F2
000017 0018 DEC HY FD 25
000018 001A RET Z C8
000019 001B LD A,E 7B
000020 001C SUB LX DD 95
000021 001E LD E,A 5F
000022 001F LD A,D 7A
000023 0020 ADD 8 C6 08
000024 0022 LD D,A 57
000025 0023 JR NC,ROWLOOP 30 E3
000026 0025 LD A,E 7B
000027 0026 ADD &40 C6 40
000028 0028 LD E,A 5F
000029 0029 LD A,D 7A
000030 002A ADC &C0 CE C0
000031 002C LD D,A 57
000032 002D JR ROWLOOP 18 D9
_______________________________________________________
Assembled in 0.08s from &0000 to &002E length is &002F
Im JavaCPC Assembler..
WinCPC Lösung:
Statt der LD.....
Nimmst Du:
DB &DD, &6A
DB &FD, &63
Also es gibt ja die beiden 16 Bit Index-Register IX und IY.
Wenn man 8 Bit Werte speichern will, und zwar schneller als im RAM, dann kann man die in die oberen bzw. unteren 8 Bits des IX oder IY speichern / oder lesen.
LD IX_high, Register wäre dann:
DB &DD:LD H,Register
LD IX_low, Register wäre dann:
DB &DD:LD L,Register
LD IY_high, Register wäre dann:
DB &FD:LD H,Register
LD IY_low, Register wäre dann:
DB &FD:LD L,Register
Persoenlich empfehle ich einen Syntax wie z.B.:
LD XL,B --- läd Register IX low (untere 8 Bits) mit Inhalt von Register B.
oder...
LD E,YH --- läd Register E mit dem Inhalt von Indexregister IY high (obere 8 Bits)
Beachte: H und L können NICHT verwendet werden. Denn &DD bzw. &FD schalten von HL auf IX bzw. IY um. Es geht also nur mit A, B, C, D und E
Ok, auch ein DB &FD:LD H,L geht. Dabei wird dann von IY low in IY high geschrieben.
Alles klar?
btw: Das sind undokumentierte Befehle, die illegalen sind noch mal was anderes.
Quote from: TFM on 02. April 2015, 18:19:23
btw: Das sind undokumentierte Befehle, die illegalen sind noch mal was anderes.
Kann man denn beide ohne Bedenken verwenden?
Quote from: oobdoo on 02. April 2015, 21:37:42
Quote from: TFM on 02. April 2015, 18:19:23
btw: Das sind undokumentierte Befehle, die illegalen sind noch mal was anderes.
Kann man denn beide ohne Bedenken verwenden?
Die Illegalen bitte nur Nachts...
Quote from: oobdoo on 02. April 2015, 21:37:42
Quote from: TFM on 02. April 2015, 18:19:23
btw: Das sind undokumentierte Befehle, die illegalen sind noch mal was anderes.
Kann man denn beide ohne Bedenken verwenden?
Am CPC sowieso. Generell ist es so, dass alle Z80 und Clones (auch Z280 etc.) die undokumentierten Befehle verstehen. Aber nur die Z80 selber kann auch die illegalen Befehle.
Am CPC ist das alles ok, da nur gute Z80 verwendet werden, habe noch nie von Problemen gehoert. :)