In meinem Spiel taucht folgende Befehlsreihenfolge auf:
ENV 1,100,2,2,1,1,1
ENT 1,100,-2,2
SOUND 1,284,200,1,1,1
Wie setzt man sowas in Assembler um? :(
Ich hab schon auf dem CPCWiki geschaut, aber die arbeiten nur mit Byte-Werten. Bei mir gibt es aber den Wert 284, also mehr wie acht Bit.
Werd aus dem englischen Zeuchs nicht schlau draus. >:(
Hat sich erledigt. Hab auf CPCWiki einen Hinweis bekommen mit dem es funktioniert hat. :00008351:
org &4000
.sque equ &bcaa
ld a,1
ld hl,env
call &bcbc
ld a,1
ld hl,ent
call &bcbf
ld hl,sdata
call sque
ret
.sdata defb 1
defb 1
defb 1
defw 284
defb 0
defb 1
defw 200
.env defb 1,100,2,2,1,1,1
.ent defb 1,100,-2,2
Nächstes Problem mit dem Sound. Beim ersten Beispiel klingt BASIC genauso wie Assembler.
Nicht aber beim anderen Sound.
BASIC aus dem Programm
for qwe=7 to 0 step -1
sound 4,0,1,qwe,4,0,31
next
Z80 als Beispiel
.bla
ld hl,env2+7
call &bcaa
LD HL,5000
.loop1400
DEC HL
LD A,H
OR L
JR NZ,loop1400
ld hl,env2+7
call &bcaa
LD HL,5000
.loop14001
DEC HL
LD A,H
OR L
JR NZ,loop14001
ld hl,env2+14
call &bcaa
LD HL,5000
.loop14002
DEC HL
LD A,H
OR L
JR NZ,loop14002
ld hl,env2+21
call &bcaa
LD HL,5000
.loop14003
DEC HL
LD A,H
OR L
JR NZ,loop14003
ld hl,env2+28
call &bcaa
LD HL,5000
.loop14004
DEC HL
LD A,H
OR L
JR NZ,loop14004
ld hl,env2+35
call &bcaa
LD HL,5000
.loop14005
DEC HL
LD A,H
OR L
JR NZ,loop14005
ld hl,env2+42
call &bcaa
LD HL,5000
.loop14006
DEC HL
LD A,H
OR L
JR NZ,loop14006
ld hl,env2+49
call &bcaa
ret
.env2
defb 4,0,1,7,4,0,31
defb 4,0,1,6,4,0,31
defb 4,0,1,5,4,0,31
defb 4,0,1,4,4,0,31
defb 4,0,1,3,4,0,31
defb 4,0,1,2,4,0,31
defb 4,0,1,1,4,0,31
defb 4,0,1,0,4,0,31
Klingt total nach was anderem. :(
Hm, einen Fehler habe ich schon gefunden. Da darf ja nicht nur DEFB stehen, sondern bei Byte 2-3 und 7-8 ein DEFW.
Aber dann hör ich gar nix mehr. :o
K.A. welche DB oder DW Anweisungen es sind. Aber bei DW / DEFW wird das low Byte zuerst im RAM abgelegt. Findet hier eine Verwechslung statt?
Egal ob ich DW oder DEFW schreibe, da ändert sich nix. :'(
Nein ich meinte, dass bei DW von der Z80 zuerst mal das Low-Byte, dann das High-Byte abelegt wird.
Kannst Du bitte ein Beispiel in BASIC und eines in Assembler angeben? (da wo ein Problem auftritt).
EDIT: Ich habe gerade dein BASIC Beispiel von oben probiert. Die drei Zeilen machen gar keinen Sound. Also da fehlt wohl etwas (von deinem Listing).
Und das fehlt wohl auch im Asselmbler-Program!?!
Ich komme aber weiterhin ins Schleudern mit den Begriffen.
Sound in BASIC hat die Parameter...
01. Kanalstatus
02. Tonperiode
03. Dauer
04. Lautstärke
05. Lautstärkenhüllkurve
06. Tonhüllkurve
07. Geräuschperiode
Sound in Z80 mit &BCAA laut meinem deutschen Firmwarehandbuch...
Byte 0 Kanalangabe und Rendezvouserfordernisse
Byte 1 Amplituden-Hüllkurve
Byte 2 Ton-Hüllkurve
Byte 3..4 Tin-Periode
Byte 5 Geräuschperiode
Byte 6 Anfangsamplitude
Byte 7..8 Dauer oder Hüllkurven-Wiederholungszähler
Byte 0 würde ich 01. zuordnen.
Byte 5 zu 07.
Byte 7..8 zu 03.
Und der Rest? Irgendwie bringe ich den Begriffe nicht zueinander.
Sounddaten umwandeln (BASIC => Z80)
Da die Reihenfolge bei der Parameterübergabe in Assembler eine andere als in BASIC ist, habe ich mal was in Excel gebastelt.
Vielleicht kann es ja einer auch gebrauchen.
SOUND 2,284,10,2,2,1,10 ergibt
defb 2,2,1
defw 284
defb 10,2
defw 10
Da sind zu viele 2en drin, aber das Bild erklärt es super. Danke. :smiley027:
Was für zweien? Dat funktioniert!!! ;)
Neter Sound
Quote from: oobdoo on 13. February 2015, 18:30:50
Was für zweien? Dat funktioniert!!! ;)
Ja, klar, ist nur schwierig bei den ganzen
Doppelten Zweien zu verfolgen wo die hinkommen. Prost!