Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Z80 Assembler Fragen » Themenansicht

Autor Thread - Seiten: -1-
000
04.10.2012, 18:28 Uhr
PeterSieg



Hallo.

Ich möchte auf Speicherzellen zeigen lassen, die in einer Tabelle hintereinander stehen und den festen Abstand von 6 Byte/Zeichen haben.
Wie macht man sowas?


Quellcode:
org     1000h

main:        ld     e,200            ;delay value char
w0:        ld     ix, words0
        call    dak2
        call     delay1
            dec     e
            jp     nz,w0                ;times e

        ld     e,200            ;delay value char
w1:        ld    ix, words0+6
        call    dak2
        call     delay1
            dec     e
            jp     nz,w1                ;times e
        jp    main

;------------------------------------------------------------------------------
delaye:     call delay1            ;256 x NOP
            dec e
            jp nz,delaye            ;times e
            ret

delay1:     ld a,0                ;256 x NOP; A is destroyed
del11:      nop
            inc a
            jp nz,del11
del12:      ret

;------------------------------------------------------------------------------
        
words0:
        db 0h,0h,0h,0cah,0aeh,021h ;"1ST   "
        db 0h,0h,0h,0e9h,068h,0cdh ;"2ND   "
        db "2BE   "


Frage 2: Wie erzeugt man Pseudo-Zufallszahlen?
ld a,R ; load Refresh Register?

Peter

Dieser Beitrag wurde am 04.10.2012 um 18:30 Uhr von PeterSieg editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
04.10.2012, 18:40 Uhr
ambrosius



Sollen nur zwei Durchläufe des o.g. Programmes ausgeführt werden, kannst Du das so machen. Eine Schleife lohnt sich nicht wirklich. Das bringt codeseitig erst etwas, wenn mehrere Durchläufe ausgeführt werden sollen. Allerdings kann ich jetzt nicht sagen, welche Register DAK2 zerstört, weshalb evtl. das Register E gerettet werden muß (push de). Sollte sich der Befehl jp nz, xx auf das dec e beziehen, so funktioniert das nicht, denn der DEC-Befehl beeinflusst keine Flags. Das trifft auch auf die Befehle innerhalb der Routinen delay und delay1 zu!

Wenn Du nur einmal in einem Programm eine Zufallszahl brauchst und das Programm schon eine undefinierte Zeit lang läuft, kannst Du durchaus das R-Register nehmen. Bei relativ regelmäßigen Abfragen ergibt das aber keine Zufallszahl mehr, da es ja bei jedem Befehlsdurchlauf inkrementiert wird. Ich würde dann bei öfterer Nutzung ein paar andere Register einfach zuaddieren, wenn die sich durch Eingaben o.a. ständig unkontrolliert ändern.

Beste Grüße
Holger
--
viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
04.10.2012, 18:49 Uhr
PeterSieg




Zitat:
ambrosius schrieb
Sollen nur zwei Durchläufe des o.g. Programmes ausgeführt werden, kannst Du das so machen. Eine Schleife lohnt sich nicht wirklich. Das bringt codeseitig erst etwas, wenn mehrere Durchläufe ausgeführt werden sollen.

Hi Holger.
Danke für die Rückmeldung. Nein es sollen nicht nur 2 Durchläufe sein ;-)
Eigentlich möchte ich eine Zufallszahl erzeugen und damit den String/Ausgabe ab Adresse der Tabelle der 6-Bytes Strings auswählen, der dann mit DAK2 ausgegeben wird.. (LC80).

Habe gerade nochmals in meinem Z80 Assemblerbuch nachgeschaut bei DEC.
Dort wird gesagt, das sehr wohl die Flags abhängig vom Ergebnis der Operation gesetzt werden..?

Peter
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
04.10.2012, 19:13 Uhr
sas



Hallo Peter,

zu 2. professionell nur mit Rauschgeneratoren, z.B an einem PIO Pin.
z.B.: http://scz.bplaced.net/t10x.html#t151
mit Vierschichtdioden ist abzuraten: http://scz.bplaced.net/t10x.html#t105

Zu 1. einen Editor finden in dem Du die Tabulatoren-weiten Einstellen kannst

Jörg.


Zitat:
PeterSieg schrieb
Hallo.

Ich möchte auf Speicherzellen zeigen lassen, die in einer Tabelle hintereinander stehen und den festen Abstand von 6 Byte/Zeichen haben.
Wie macht man sowas?


Quellcode:
org     1000h

main:        ld     e,200            ;delay value char
w0:        ld     ix, words0
        call    dak2
        call     delay1
            dec     e
            jp     nz,w0                ;times e

        ld     e,200            ;delay value char
w1:        ld    ix, words0+6
        call    dak2
        call     delay1
            dec     e
            jp     nz,w1                ;times e
        jp    main

;------------------------------------------------------------------------------
delaye:     call delay1            ;256 x NOP
            dec e
            jp nz,delaye            ;times e
            ret

delay1:     ld a,0                ;256 x NOP; A is destroyed
del11:      nop
            inc a
            jp nz,del11
del12:      ret

;------------------------------------------------------------------------------
        
words0:
        db 0h,0h,0h,0cah,0aeh,021h ;"1ST   "
        db 0h,0h,0h,0e9h,068h,0cdh ;"2ND   "
        db "2BE   "


Frage 2: Wie erzeugt man Pseudo-Zufallszahlen?
ld a,R ; load Refresh Register?

Peter

Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
04.10.2012, 20:15 Uhr
rm2
Default Group and Edit
Avatar von rm2

Hallo an alle,

ich habe mit LD A,R gute Erfahrungen im K 1520 System gemacht.


mfg ralph
--
.
http://www.ycdt.net/mc80.3x . http://www.ycdtot.com/p8000
http://www.k1520.com/robotron http://www.audatec.net/audatec
http://www.ycdt.de/kkw-stendal
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
04.10.2012, 20:24 Uhr
ambrosius



Hallo Peter,

so, nun habe ich erst einmal meine LC80-Handbücher wieder vorgekramt:
DAK2 zerstört nur AF im Hauptregistersatz.

Betreffs Flagbeeinflussung:
Du hast recht, ich hatte bei den Doppelregistern geschaut. INC/DEC bei den Einzelregistern beeinflusst die Flags. Nur bei den Doppelregistern (z.B. DEC HL) läßt die Flags unbeeinflußt.

Zum Programm:
wenn ich das richtig verstanden habe, willst Du aus einer (beliebig großen) Tabelle im Sechserabstand Adressen auswählen und die 6 folgenden Bytes mittels DAK2 eine gewisse Zeit lang darstellen. Dann brauchst Du also eine zufällige Zahl in einem Bereich, der die Anzahl der Tabelleneinträge (jeweils 6 Byte) abdeckt. Beim LC80 wird das, je nach Speicherausbau, maximal eine 2-3 stellige Zahl sein. Du mußt Deine Zufallszahl also auf diesen Wert 'normieren'.

Beste Grüße
Holger

-------
edit: Rechtschreibfehler
--
viele Grüße
Holger

Dieser Beitrag wurde am 04.10.2012 um 20:28 Uhr von ambrosius editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
04.10.2012, 20:49 Uhr
susowa




Zitat:
PeterSieg schrieb
Eigentlich möchte ich eine Zufallszahl erzeugen und damit den String/Ausgabe ab Adresse der Tabelle der 6-Bytes Strings auswählen

Du musst eine Zufallszahl erzeugen, welche kleiner bzw. gleich der Anzahl-1 der Tabelleneinträge der Stringtabelle ist. Die multiplizierst Du mit 6 und erhälst dann nach Addition mit der Tabellenadresse die Adresse des Strings in der Tabelle für die Ausgabe.

Als Anregung 2 Links aus den KC-News:

http://www.iee.et.tu-dresden.de/~kc-club/02/KCN96-03/KCN96-03-08.HTML

http://www.iee.et.tu-dresden.de/~kc-club/02/KCN95-02/KCN95-02-18.HTML



Zitat:
Habe gerade nochmals in meinem Z80 Assemblerbuch nachgeschaut bei DEC.
Dort wird gesagt, das sehr wohl die Flags abhängig vom Ergebnis der Operation gesetzt werden..?

DEC/INC auf 8 Bit Register verändert Flags.

DEC/INC auf 16 Bit Register verändert keine Flags.

Kann zu recht unangenehmen Folgen in ASM Programmen führen :-).
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
05.10.2012, 06:35 Uhr
sas



Hallo susowa ,
Die Folgen des LSF sind berechenbar und für sichere Zufallszahlen ungeeignet.
jörg

Zitat:
susowa schrieb

Zitat:
PeterSieg schrieb
Eigentlich möchte ich eine Zufallszahl erzeugen und damit den String/Ausgabe ab Adresse der Tabelle der 6-Bytes Strings auswählen

Du musst eine Zufallszahl erzeugen, welche kleiner bzw. gleich der Anzahl-1 der Tabelleneinträge der Stringtabelle ist. Die multiplizierst Du mit 6 und erhälst dann nach Addition mit der Tabellenadresse die Adresse des Strings in der Tabelle für die Ausgabe.

Als Anregung 2 Links aus den KC-News:

http://www.iee.et.tu-dresden.de/~kc-club/02/KCN96-03/KCN96-03-08.HTML

http://www.iee.et.tu-dresden.de/~kc-club/02/KCN95-02/KCN95-02-18.HTML



Zitat:
Habe gerade nochmals in meinem Z80 Assemblerbuch nachgeschaut bei DEC.
Dort wird gesagt, das sehr wohl die Flags abhängig vom Ergebnis der Operation gesetzt werden..?

DEC/INC auf 8 Bit Register verändert Flags.

DEC/INC auf 16 Bit Register verändert keine Flags.

Kann zu recht unangenehmen Folgen in ASM Programmen führen :-).

Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
05.10.2012, 08:38 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

Hallo Peter,

schau Dir mal den Quelltext "Jagdspiel" für den LC80 an (http://hc-ddr.hucki.net/wiki/doku.php/lc80:40_software). Dort gibt es beides: Auswahl und Anzeige eines Texts und eine Zufallsfunktion "rnd".

Unter http://baze.au.com/misc/z80bits.html#4.1 findest Du weitere Zufalls-generatoren.
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)

Dieser Beitrag wurde am 05.10.2012 um 08:38 Uhr von volkerp editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
05.10.2012, 09:00 Uhr
PeterSieg



Danke für die sehr hilfreichen Tips!
Diese und etwas googeln brachten nun eine erste lauffähige Version:


Quellcode:
; Programm
;------------------------------------------------------------------------------
; Start auf Adr. 1000 (Zusatz-ROM 3)
;------------------------------------------------------------------------------

        CPU Z80
;        include    lc80-2x1        ;2x1k Rom U505
        include    lc80-1x2        ;1x2k Rom 2716

;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
        org     1000h
        ld    a,R            ; read refresh register as seed
        ld    l,a            ; in to reg a
        jp    nz,seed2        ; if not zero continue
          ld     l,3                       ; else set to 3
seed2:        push    hl            ; seed on stack
main:
;------------------------------------------------------------------------------
; generate random index value
;------------------------------------------------------------------------------

        pop    hl            ; L = alte Zufallszahl

        LD     A,L
        AND     08EH            ; RKM L
        JP     PE,S1
        CCF
S1:        RL     L            ; L = neue Zufallszahl
        push    hl            ; save on stack


        ld    a,l
        and    a,7            ; just 8 values 0-7
        ld    l,a
        ld    h,0

;------------------------------------------------------------------------------
; multiply by 6 since our words array is fixed length on 6 bytes
;------------------------------------------------------------------------------

          add     hl,hl                      ; HL = Index * 2
          ld     d,h                        ; DE = Index * 2
          ld     e,l
          add     hl,hl                   ; HL = Index * 4
          add     hl,de                   ; HL = Index * 6

;------------------------------------------------------------------------------
; now point to start of words array and add index value times 6 (element length)
;------------------------------------------------------------------------------

          ld     de,words0        ; start of array address
          add     hl,de                   ; HL = ArrayAddress + Index * 6

;------------------------------------------------------------------------------
; just get hl into ix for subroutine dak2
;------------------------------------------------------------------------------

        push     hl            ; hl on stack
          pop     ix            ; get hl as ix from stack

        ld     e,200            ; delay value char
w0:        call    dak2
        call     delay1
            dec     e
            jp     nz,w0                ; times e
        jp    main


;------------------------------------------------------------------------------
; simle delay routine of 256 nop's
;------------------------------------------------------------------------------

delay1:     ld a,0                ; 256 x NOP; A is destroyed
del11:      nop
            inc a
            jp nz,del11
del12:      ret

;------------------------------------------------------------------------------
; our array of words in LC80 7-segment byte values
;------------------------------------------------------------------------------
        
words0:
        db 000h,000h,000h,0cah,0aeh,021h ;"1ST   "
        db 000h,000h,000h,0e9h,068h,0cdh ;"2ND   "
        db 000h,000h,000h,0ceh,0eah,0cdh ;"2BE   "
        db 000h,000h,000h,0e8h,0e9h,0cdh ;"2DO   "
        db 000h,000h,0ceh,020h,0e9h,0cdh ;"2DIE  "
        db 000h,000h,0c2h,0c2h,06fh,02bh ;"4ALL  "
        db 000h,06bh,0cah,048h,06fh,0ceh ;"EARTH "
        db 000h,000h,0ceh,04fh,0e8h,06bh ;"HOPE  "

;------------------------------------------------------------------------------

        end
        

Natürlich noch mit sicher viel Verbesserungspotential..

Peter

Dieser Beitrag wurde am 05.10.2012 um 09:50 Uhr von PeterSieg editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek