Robotrontechnik-Forum

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

Robotrontechnik-Forum » Technische Diskussionen » KC85 EDAS: Assembler-Programm kann nur einmal Pixel verschieben » Themenansicht

Autor Thread - Seiten: -1-
000
01.12.2024, 20:26 Uhr
eudatux23

Avatar von eudatux23

Hallo zusammen,

Habe mich die letzten Tage mit Assembler (EDAS 1.64) auf dem KC85/4 beschäftigt. Jetzt als kleines erstes Mini-Projekt wollte ich die linke Text-spalte pixelweise nach oben scrollen lassen.

Das Programm scheint eigentlich zu funktionieren, denn die linke Text-Spalte wird auch ein Pixel nach oben geschoben. Bei jedem weiteren Start des Programms passiert jedoch nichts weiter, der Bildschirminhalt bleibt von da an gleich.

Das Programm wird ab Adresse 3000H im RAM abgelegt.

Was mache ich falsch, habe ich irgend etwas offensichtliches übersehen? Bisher bin ich noch komplett neu in dem Thema und versuche mich da so gut es geht einzuarbeiten.

Hier einmal ein Screen-Capture vom bisherigen Code:



Vielen Dank im Voraus!


Schöne Grüße
Alexander
--
Youtube-Videos über den KC 85/4:
https://www.youtube.com/@eudatux23
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
01.12.2024, 22:14 Uhr
Dresdenboy



Hallo Alexander,

vorweg: ich habe bisher weder mit KC 85 noch EDAS gearbeitet. Aber bisschen Z80 Assembler kann ich. Daher versuche ich es mal mit ersten Hinweisen bzw. Auffälligkeiten als Gedankenanstöße:
- COUNT wird einmal beim Assemblieren auf 0 gesetzt, dann im Loop verändert, hat somit bei einem neuen Aufruf der Routine den letzten Wert aus dem vorherigen Aufruf.
- LD B, 256 funktioniert auf dem Prozessor so nicht, da 256 (hex: 100h) ja schon mehr als die 8 bit benötigt. Ich weiß nicht, was EDAS hier macht, ggf. eine 0 nach B laden?
- Die DB-Werte (Edit: außer der Header natürlich) zu Beginn (wie COUNT) sollten besser woanders abgelegt werden.
- CCF hebt SCF wieder auf

Da kann man sicher noch mehr dazu sagen, aber vllt. hilft es schon.

Viele Grüße,
Matthias
--
___________________________________
Produktionen im Rahmen der "The Computer Art Community" (Demoszene): https://demozoo.org/sceners/64936/, YT-Kanal: https://www.youtube.com/@4lpha0ne/videos
Programmierung seit '86 in BASIC: KC85/3, C64, A1200, PC | ASM: LC-80, C64, KC87, A1200, NeoGeo, PC, Mega 65, µC | Turbo Pascal: BIC, PC | C: RS/6000, Alpha, PC, µC | C++, Java, Javascript, Rust, Lua, Perl, PHP u.a. auf PC
HW: LC-80, BIC A5105 komplett, KC87, KC85/2-4, KCC, C64s, C16, Plus/4s, A500s, A1200, Mega 65, ESP32s, RasPis, PCs, Laptops, MR 610, ...

Dieser Beitrag wurde am 02.12.2024 um 00:05 Uhr von Dresdenboy editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
01.12.2024, 22:29 Uhr
HeikoS



Guten Abend in die Runde,

EDAS kenne ich auch nicht, ich benutzte immer den Arnold Assembler unter Windows/Ubuntu und teste alles im JKCEMU. Aber was mir bei deiner Aufgabenstellung sofort einfiel, war der Befehl LDIR.



Quellcode:

    db    1
    db    7Fh,7Fh
    db    'WORT'
    db    1
    
    ld    hl, 8001h
    ld    de, 8000h
    ld    bc, 0FFh
    ldir
    ret



Der transportiert alles von HL nach DE mit der Länge von BC. Das kann man beim KC85/4 nutzen um genau das zu machen, was du wolltest, eine "Spalte" noch oben schieben.



PS: LDIR ist einer der schönsten Z80/U880 Befehle ... (ED B0 HEX-Code), dass man sich sowas merken kann ;-) , ist schon komisch.
Grüße, Heiko

Dieser Beitrag wurde am 01.12.2024 um 23:14 Uhr von HeikoS editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
01.12.2024, 23:21 Uhr
eudatux23

Avatar von eudatux23

Vielen Dank für die schnellen Tipps!

Es lag daran, dass "Count" wie beschrieben nicht wieder auf 0 zurückgesezt wurde.
Jetzt wird "Count" jeden start mit 0 initialisiert, und es funktioniert prima!

Nochmals herzlichen Dank!

Bei der Gelegenheit habe ich zusammen mit einem Freund das Ganze so weit umgebaut, dass nun die gesamte Höhe dieser Breite durchgescrollt wird und somit die ersten Zeiche "nach oben fliegen". Hier einmal der (natürlich noch nicht optimierte) Sourcecode. Die Header-Zeilen fehlen, aber die sind ja im vorherigen Screenshot enthalten. Bitte entschuldigt die Bildqualität, alles fand auf einem echten KC85/4 statt und wurde per Composite gecaptued:


Und hier eine Demo, wie der Effekt aussieht:


Morgen wird weiter gebastelt, ich halte euch auf dem Laufenden!


Schöne Grüße
Alexander
--
Youtube-Videos über den KC 85/4:
https://www.youtube.com/@eudatux23
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
02.12.2024, 09:41 Uhr
HeikoS



Super ! Ein sehr schöner Effekt zum Einstieg in Assembler - und auch noch auf Original-HW assembliert. Optimieren könnte man da noch einiges (s. DJNZ e, Laden von Doppelregistern LD HL, ...). Weiter so !!!

Grüße, Heiko

EDIT: Ein sehr ausführlicher Assembler-Kurs ist hier zu finden:
http://kc85.info/index.php/download.html?view=download&id=149:asm-kurskc85&catid=3

Da ich gerade gestern das alles für die GleEst-Demo gelesen hatte, kann ich das so weitergeben. Bisher hatte ich noch nichts für den KC85 gemacht. Es ist alles hervorragend dokumentiert !

Dieser Beitrag wurde am 02.12.2024 um 09:48 Uhr von HeikoS editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
02.12.2024, 12:47 Uhr
Dresdenboy



@Alexander:
Heiko und ich hatten erst kürzlich über die KCC-Demo, die du auch auf deinem Kanal zeigst, bzgl. der Rasterbars diskutiert. Falls dich auch so etwas (d.h. Demo-Effekte) interessiert, bist du bei uns richtig.

@Heiko:
Bzgl. des ASM-Kurses kann ich nur zustimmen. Ich habe von meinem Onkel ja auch einen Stapel KC-Club-Magazine erhalten (Ende der 90er bis Anfang 2000er). Da las ich erst letzte Woche zufällig von dem Kurs und habe mir den mal herausgesucht.

VG,
Matthias
--
___________________________________
Produktionen im Rahmen der "The Computer Art Community" (Demoszene): https://demozoo.org/sceners/64936/, YT-Kanal: https://www.youtube.com/@4lpha0ne/videos
Programmierung seit '86 in BASIC: KC85/3, C64, A1200, PC | ASM: LC-80, C64, KC87, A1200, NeoGeo, PC, Mega 65, µC | Turbo Pascal: BIC, PC | C: RS/6000, Alpha, PC, µC | C++, Java, Javascript, Rust, Lua, Perl, PHP u.a. auf PC
HW: LC-80, BIC A5105 komplett, KC87, KC85/2-4, KCC, C64s, C16, Plus/4s, A500s, A1200, Mega 65, ESP32s, RasPis, PCs, Laptops, MR 610, ...
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
02.12.2024, 18:59 Uhr
wpwsaw
Default Group and Edit


@eudatux23

Hallo,

ja, mit EDAS kann man schon sehr viel machen, vorallem gleich testen....

Ich nutze EDAS seit 1985, damals am 3er und von Kassette und danach vom M027 Development Modul.

Heute ist ja im 5er ASM mit extra Editor schon drin.

Man kann Assembler nur durch echte Übungen lernen und wird dadurch besser.

In 000 passen aber einige deiner Kommentare nicht zu deinen Befehlen z.B. LD H,128 ; HL=8000

es existieren auch 16bit Ladebefehle z.B. LD HL,8000H
man sollte auch versuchen immer die selben Zahlensysteme zu nutzen z.B. Hex mit H

hier mal ein Link zum originalen Handbuch Development M027
https://magentacloud.de/s/qiws28TBYAw6yS6


oder hier ein Assemler Kurs vom KC-Club erstellt und zur Verfügung gestellt
https://magentacloud.de/s/X4rySDkPrbHDpB7


es existieren noch viele Bücher dazu, z.B. Kieser/Meder die U880 Biebel oder ich nutze immer die Arbeitsbücher vom Poly-880


gruß
wpw
--
RECORD, CRN1; CRN2; PicoDat; LC80; Poly880; KC85/2,3,4,5 ; KC87; Z1013; BIC; PC1715; K8915; K8924; A7100; A7150; EC1834; und P8000 ab jetzt ohne Tatra813-8x8 aber mit W50LA/Z/A; P3; ES175/2 und Multicar M25 3SK; Barkas B1000 HP
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
02.12.2024, 22:08 Uhr
eudatux23

Avatar von eudatux23



Update: Mit den Tipps optimierter Code, der jetzt deutlich schneller läuft. Nochmal vielen Dank für die zahlreiche Hilfe!

Schöne Grüße
Alexander
--
Youtube-Videos über den KC 85/4:
https://www.youtube.com/@eudatux23
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
03.12.2024, 03:31 Uhr
Crawler

Avatar von Crawler

Hallo Alexander,

es freut mich zu sehen, daß du dich momentan mit dem EDAS auf dem KC 85/4 auseinandersetzt.
Ich fand das damals Ende der 80er (anfangs sogar noch mit reinem Maschinencode, also ohne Assembler) unglaublich faszinierend, was man alles so mit den verschiedenen Befehlen anfangen kann und es macht mir noch immer Spaß damit herumzuexperimentieren.

Was ich hier noch beisteuern möchte ist Folgendes:

Leerzeilen kannst du einfach mit einem Semikolon am Zeilenanfang realisieren.
Neben den Pseudooperationen DEFB und DEFS gibt es auch noch DEFW und DEFM.
Mit DEFW kannst du gleich ein ganzes Wort (2-Byte-Wert) im Speicher ablegen. Daher kann man den Prolog des Vorspanns auch so schreiben:


Quellcode:

        DEFW    7F7FH



DEFM kann dann für das Ablegen der Zeichenkette verwendet werden


Quellcode:

        DEFM    'WORT'



und DEFB für den Epilog des Vorspanns:


Quellcode:

        DEFB    1



Mit dem EDAS 1.64 kann der komplette Vorspann mittels DB sogar in nur einer Zeile geschrieben werden:


Quellcode:

        DB      7FH,7FH,'WORT',1



SCF setzt das Carry-Flag und CCF liefert das Komplement des jeweils aktuellen Zustands des Carry-Flags. Die Sequenz


Quellcode:

        SCF
        CCF



ist zum Löschen des Carry-Flags vorgesehen, was hier zur korrekten Berechnung des Ergebnisses von SBC HL,DE notwendig ist.
Allerdings kann man das Löschen des Carry-Flags auch auf andere Weise und dazu noch einfacher bewerkstelligen:


Quellcode:

        AND     A



Aber die 16-Bit-Arithmetik ist an der Stelle auch gar nicht nötig, wie du inzwischen bereits weißt.

Die Variable(n), würde man, wie Matthias bereits angedeutet hat, eher am Ende des Programms definieren, damit die CPU bei der Ausführung nicht einfach drüber läuft.
In deinem Beispiel funktioniert das zufällig(?), da zu Beginn hier 0 gespeichert ist, was einem NOP-Befehl (No Operation) entspricht, welcher einfach nichts macht und die Ausführung mit dem nächsten Befehl fortsetzt. Nachdem der Wert geändert wurde, wird der betreffende Teil des Codes auch nicht mehr erreicht.

Man kann sich die Variable in 007 auch komplett sparen, indem man den Inhalt von B auf dem Stack zwischenspeichert. Das ist nicht nur kürzer sondern auch schneller.

B kann für 256 Schleifendurchläufe mit 0 initialisiert werden, da DJNZ zunächst das Dekrement durchführt und dann erst auf != 0 prüft.

Damit ergibt sich in etwa folgender Code:


Quellcode:

;
        DB      7FH,7FH,'WORT',1
;
        LD      B,0
;
LOOP:
;
        PUSH    BC
;
        LD      HL,8001H
        LD      DE,8000H
        LD      BC,255
        LDIR
;
        POP     BC
;
        DJNZ    LOOP
;
        RET



Der Effekt wird übrigens beim Z 9001 zum Löschen des Bildschirms verwendet und geht dort allerdings über die komplette Bildschirmbreite.

Schöne Grüße,
Stefan
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