Schneider / Amstrad CPC Forum

Amstrad / Schneider CPC => Programmierung => Topic started by: oobdoo on 31. March 2015, 20:10:55

Title: LD LX,D
Post by: oobdoo on 31. March 2015, 20:10:55
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.  :(
Title: Re: LD LX,D
Post by: Devilmarkus on 31. March 2015, 21:01:39
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
Title: Re: LD LX,D
Post by: oobdoo on 31. March 2015, 21:05:25
Also WinCPC schluckt kein LD LX,D.
Was soll das darstellen? Illegale Befehle?
Title: Re: LD LX,D
Post by: 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?!?
Title: Re: LD LX,D
Post by: oobdoo on 31. March 2015, 21:09:34
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:
Title: Re: LD LX,D
Post by: 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?
Title: Re: LD LX,D
Post by: 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...
Title: Re: LD LX,D
Post by: Devilmarkus on 31. March 2015, 21:12:58
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
Title: Re: LD LX,D
Post by: oobdoo on 31. March 2015, 21:15:24
Nein, der WinCPC meldet immer Syntaxfehler wenn er auf das LX oder LY trifft.
Title: Re: LD LX,D
Post by: Devilmarkus on 31. March 2015, 21:17:11
Hast recht, ich vergass: LX und HY sind reelle Register.
Schimpf mal mit dem Flynn dann....
Title: Re: LD LX,D
Post by: Devilmarkus on 31. March 2015, 21:19:00
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..
Title: Re: LD LX,D
Post by: Devilmarkus on 31. March 2015, 21:20:54
WinCPC Lösung:
Statt der LD.....

Nimmst Du:
DB &DD, &6A
DB &FD, &63
Title: Re: LD LX,D
Post by: TFM on 02. April 2015, 18:19:23
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.

Title: Re: LD LX,D
Post by: 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?
Title: Re: LD LX,D
Post by: Devilmarkus on 03. April 2015, 01:29:24
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...
Title: Re: LD LX,D
Post by: TFM on 03. April 2015, 18:25:39
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.  :)