Grafikausgabe


Grafikausgabe

von Ingo70 » Fr 29. Mär 2019, 19:17
Hallo,
bin gerade an meinem ersten Assembler-Projekt. Ich will eine Verbrauchserfassung für Gas, Wasser und Strom programmieren.
Hierzu hab ich das Fenster zweigeteilt: Oben das Textfenster (Antic 2) und unten Hires (Antic 15). Oben soll die Texteingabe der Verbräuche erfolgen und unten will ich diese als Diagramm zeichnen. Dazu wollte ich die DrawTo-Routinen benutzen. Beim Atmas-Assembler ist ein Beispielprogramm, mit dem man sowas realisieren kann.
Nur funktioniert das bei mir nicht und ich weiß nicht, was da falsch ist.
Vielleicht kann ja mal einer drüberschauen.
Ich hab mal meinen und den Quelltext von der Grafiklib angehängt.
Code: Alles auswählen

*********************************
*         GRAFLIB.SRC
*
*        Makro-Bibliothek
*
*          GRAPHIK
*
*       Fuer ATMAS-II
*                      PETER FINZEL
***********************************
*
* IOCB-Struktur:
*
ICCOM    EQU $342
ICSTA    EQU $343
ICBAL    EQU $344
ICBAH    EQU $345
ICBLL    EQU $348
ICBLH    EQU $349
ICAX1    EQU $34A
ICAX2    EQU $34B

CIOV     EQU $E456

* CIO-Befehle

COPEN    EQU   3
CCLSE    EQU  12
CGTXT    EQU   5
CPTXT    EQU   9
CGBIN    EQU   7
CPBIN    EQU  11
CDRAW    EQU $11

* ATARI Graphik-Variable

ATACHR   EQU  $2FB
ROWCRS   EQU  $54 CURSOR-
COLCRS   EQU  $55 POSITION

*
* GRAPHICS-Befehl
*
* Aufruf: GRAPHICS <stufe>
*
* <stufe> 0 bis 15 (XLs)
*         0 bis 11 (400/800)
*
GRAPHICS MACRO STUFE
         JMP GR1@

DEV@     ASC "S:"

GR1@     LDX #$60
         LDA #CCLSE        ZUERST KANAL 6
         STA ICCOM,X       SCHLIESSEN
         JSR CIOV
         LDA #STUFE        JETZT NEUE GRAPHIK
         STA ICAX2,X       STUFE ANWAEHLEN
         AND #$F0
         EOR #$10
         ORA #$0C
         STA ICAX1,X
         LDA #COPEN
         STA ICCOM,X
         LDA #DEV@
         STA ICBAL,X
         LDA #DEV@/256
         STA ICBAH,X
         JSR CIOV
         MEND
*
* Auswahl der Zeichenfarbe
*
* Aufruf: COLOR <farbe>
*
* <farbe> von 0 bis 255, je nach
*         Graphikmodus, muss eine
*         Konstante sein.
*

COLOR    MACRO COL
         LDA #COL
         STA ATACHR
         MEND

*
* Positionierung des Cursors
*
* Aufruf: POSITION <x>,<y>
*
* <x>,<y> je nach Graphikmodus, beide
*         muessen Konstante sein
*
*
POSITION MACRO X,Y
         LDA #X
         STA COLCRS
         LDA #X/256
         STA COLCRS+1
         LDA #Y
         STA ROWCRS
         MEND

* Graphik-Punkte setzen
*
* Aufruf: PLOT <x>,<y>
*
* <x>,<y> je nach Graphikmodus,
*         muss sich um Konstane
*         handeln
*
PLOT     MACRO X,Y
         POSITION X,Y
         LDX #$60          KANAL 6
         LDA #CPBIN
         STA ICCOM,X
         LDA #0
         STA ICBLL,X
         STA ICBLH,X
         LDA ATACHR
         JSR CIOV
         MEND

*
* Graphik-Linien ziehen
*
* Aufruf: DRAWTO <x>,<y>
*
* <x>,<y> je nach Graphikmodus
*         Konstante
*
DRAWTO   MACRO X,Y
         POSITION X,Y
         LDX #$60          KANAL 6
         LDA #CDRAW
         STA ICCOM,X
         LDA #CCLSE
         STA ICAX1,X
         LDA #0
         STA ICAX2,X
         JSR CIOV
         MEND

*************************************
* Demo-Programm f. Graphik-Bibliothek
*
* zeichnet Raute in GRAPHICS 7
*************************************

*
* befindet sich im reservierten
* Speicherplatz fuer Objektcode
*
         ORG $A800

         GRAPHICS 7+16
         COLOR 1
         PLOT 79,0
         DRAWTO 159,47
         DRAWTO 79,95
         DRAWTO 0,47
         DRAWTO 79,0

ENDLOS   JMP ENDLOS
*
* Abruch mit <RESET>


Code: Alles auswählen
*************************
* VERBRAUCHSERFASSUNG
*
* START: 21.03.2019
*************************

SDLSTL   EQU $230

ROWCRS   EQU $54
COLCRS   EQU $55
CRSINH   EQU $2F0          CRSR SICHTBAR

COL1     EQU $2C5          ZEICHEN COL
COL2     EQU $2C6          HG COL
COL4     EQU $2C8          RAHMEN COL

COLRA    EQU $F8
COLHG    EQU $06
COLZ     EQU $C

ICCOM    EQU $342
ICSTA    EQU $343
ICBAL    EQU $344
ICBAH    EQU $345
ICBLL    EQU $348
ICBLH    EQU $349
ICAX1    EQU $34A
ICAX2    EQU $34B

CIOV     EQU $E456

* CIO-Befehle

COPEN    EQU   3
CCLSE    EQU  12
CGTXT    EQU   5
CPTXT    EQU   9
CGBIN    EQU   7
CPBIN    EQU  11
CDRAW    EQU $11

* ATARI Graphik-Variable

ATACHR   EQU  $2FB


*
* GRAPHICS-Befehl
*
* Aufruf: GRAPHICS <stufe>
*
* <stufe> 0 bis 15 (XLs)
*         0 bis 11 (400/800)
*
GRAPHICS MACRO STUFE
         JMP GR1@

DEV@     ASC "S:"

GR1@     LDX #$60
         LDA #CCLSE        ZUERST KANAL 6
         STA ICCOM,X       SCHLIESSEN
         JSR CIOV
         LDA #STUFE        JETZT NEUE GRAPHIK
         STA ICAX2,X       STUFE ANWAEHLEN
         AND #$F0
         EOR #$10
         ORA #$0C
         STA ICAX1,X
         LDA #COPEN
         STA ICCOM,X
         LDA #DEV@
         STA ICBAL,X
         LDA #DEV@/256
         STA ICBAH,X
         JSR CIOV
         MEND

*
* Auswahl der Zeichenfarbe
*
* Aufruf: COLOR <farbe>
*
* <farbe> von 0 bis 255, je nach
*         Graphikmodus, muss eine
*         Konstante sein.
*

COLOR    MACRO COL
         LDA #COL
         STA ATACHR
         MEND

*
* Positionierung des Cursors
*
* Aufruf: POSITION <x>,<y>
*
* <x>,<y> je nach Graphikmodus, beide
*         muessen Konstante sein
*
*
POSITION MACRO X,Y
         LDA #X
         STA COLCRS
         LDA #X/256
         STA COLCRS+1
         LDA #Y
         STA ROWCRS
         MEND

* Graphik-Punkte setzen
*
* Aufruf: PLOT <x>,<y>
*
* <x>,<y> je nach Graphikmodus,
*         muss sich um Konstane
*         handeln
*
PLOT     MACRO X,Y
         POSITION X,Y
         LDX #$60          KANAL 6
         LDA #CPBIN
         STA ICCOM,X
         LDA #0
         STA ICBLL,X
         STA ICBLH,X
         LDA ATACHR
         JSR CIOV
         MEND

*
* Graphik-Linien ziehen
*
* Aufruf: DRAWTO <x>,<y>
*
* <x>,<y> je nach Graphikmodus
*         Konstante
*
DRAWTO   MACRO X,Y
         POSITION X,Y
         LDX #$60          KANAL 6
         LDA #CDRAW
         STA ICCOM,X
         LDA #CCLSE
         STA ICAX1,X
         LDA #0
         STA ICAX2,X
         JSR CIOV
         MEND


         ORG $9000

         JSR INIT

         JMP *

*************************
INIT     LDA #DLIST
         STA SDLSTL
         LDA #DLIST/256
         STA SDLSTL+1

         LDA #COLRA
         STA COL4
         LDA #COLHG
         STA COL2
         LDA #COLZ
         STA COL1

         LDA #$45
         STA ATACHR

         LDA #$18
         STA $58
         LDA #$AD
         STA $59


         PLOT 79,0
         DRAWTO 159,47
         DRAWTO 79,95
         DRAWTO 0,47

         RTS

*************************
DLIST    DFB $10
         DFB $42
         DFW $AAE8
         DFB $02,$02,$02,$02,$02,$02
         DFB $02,$02,$02,$02,$02,$02
         DFB $02
         DFB $30
         DFB $4F
         DFW $AD18
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $4F
         DFW $B6A0
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F
         DFB $41
         DFW DLIST


Gruß
Ingo

Re: Grafikausgabe

von pps » Di 2. Apr 2019, 21:13
Ich schätze, dass es nicht klappt, weil PLOT und DRAWTO den Screenhandler nutzen, den Du ja nicht initialisiert hast.

Re: Grafikausgabe

von Ingo70 » Mi 3. Apr 2019, 09:13
Du meinst, dass ich vorher das Macro "GRAPHICS" aufrufen soll?
Das hab ich mal gemacht, dann wird auch eine Linie gezeichnet, allerdings verschoben.
Hab mal die Screenshots angehängt.
Code.pngCode.png
Bildschirm.pngBildschirm.png

Re: Grafikausgabe

von pps » Mi 3. Apr 2019, 14:12
Das ist zumindest schon mal ein Ansatz. Jetzt gilt es die richtigen Bereiche des "S:" Bildschirms auch in die eigene DL einzutragen. Der Grafikmüll, der zu sehen ist, ist wahrscheinlich ein Teil der DL.

Es ist bei Nutzung der OS Routinen wichtig, den Bildschirmbereich da zu haben, wo es die Routine mit einem normalen Grafikbefehl halt erwartet.

Re: Grafikausgabe

von Ingo70 » Mi 3. Apr 2019, 15:11
Ich habe es gerade auf meinem Atari ausprobiert und da sieht es anders aus, obwohl die x-Koordinate gleich ist.
P1090391.JPGP1090391.JPG

Re: Grafikausgabe

von pps » Mi 3. Apr 2019, 17:56
Wie gesagt, es ist wichtig den Start des Grafik 8 Bildschirms an den zuvor mit der init Routine erstellten Bildschirm anzupassen, damit das klappen kann.

Schaue in der DL nach dem Grafik 8 Init nach, wo der Bildschirm beginnt und passe das in Deiner DL an.

Normal startet die DL ja so:

Code: Alles auswählen
$70 $70 $70 $4f


Danach kommt dann direkt die BS Adresse, die Du dann auch bei Dir nutzen musst.

Re: Grafikausgabe

von Ingo70 » Fr 5. Apr 2019, 09:59
Ich habe die Display List jetzt nach $A150 gelegt (Da ist sie auch bei dem GRAPHICS 8-Modus zu finden)
Die Zeilen hab ich auf 91 beschränkt. Da brauch dann zwischendurch keine neue BS-Sdresse geladen zu werden.
Anbei das Bild des Draw-Befehls von 0,0 bis 319,90. Das sieht richtig gut aus.
ABER: Auf echter Hardware liefert der gleiche Code andere Ergebnisse(sieht man auf dem Bild aus einem Post davor) - aber warum?

Hier die DL:
Code: Alles auswählen
DLIST    DFB $40
         DFB $42
         DFW $9EA8
         DFB $02,$02,$02,$02,$02,$02
         DFB $02,$02,$02,$02,$02,$02
         DFB $02,$02,$02,$02
         DFB $B0
         DFB $4F
         DFW $A150
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $41
         DFW DLIST
Grafik.pngGrafik.png

Re: Grafikausgabe

von pps » Fr 5. Apr 2019, 11:01
Das sieht doch zunächst gut aus.

Wie startest Du das Programm am Emulator und am ATARI?
Falls Du am Emulator immer direkt startest, versuche doch mal ein .atr mit DOS drauf und starte dann mal am Emulator mit und ohne BASIC.

Eigentlich sollte das Programm dann sofort genauso reagieren, wie am ATARI. Der Emulator startet Dateien ja direkt, indem alles exakt an die stelle im RAM gesetzt wird, wie das Programm es verlangt, dann wird der Rechner direkt angeschaltet, quasi wie ein Freezer. Daher gibt es manchmal Unterschiede im Programmverhalten zum Laden von Diskette.

Einige Programme starten sogar (als .xex), ohne dass man einen run oder init Befehl gesetzt hat, da zumindest Altirra scheinbar dann einfach alleine zum Programmanfang springt.

Edit sagt: Wenn Du Dich wunderst, warum ich nicht direkt in Deinem Code rumschreibe... Ich habe seit Jahren nicht mehr mit ATMAS II gearbeitet, verstehe zwar, was der da so macht, aber mal eben eintippen und probieren und verbessern kann ich nicht mehr - ich habe neulich nicht mal mehr gewusst, wie man im ATMAS II Editor einen Source lädt und dann assemblieren kann...

Re: Grafikausgabe

von Ingo70 » Fr 5. Apr 2019, 11:34
Wie startest Du das Programm am Emulator und am ATARI?

Eigentlich gleich: Ich assembliere in ATMAS II, dann gehe ich in den Monitor und starte das Programm mit "G 9000".

Das mit ATMAS ist ja so ein Thema. Das ist glaub ich der einzige Assembler ohne diese Zeilennummern, wie z.B. der BIBO. Damit komme ich ja überhaupt nicht zurecht. ATMAS ist ja auch schon seeeehr gewöhnungsbedürftig.
Aber ich würde halt gern auf reeller Hardware programmieren.
Am C64 war das mit Turbo Macro Pro + REU - Assembler schon sehr komfortabel. Das scheint's bei Atari so wohl nicht zu geben.
Da bliebe dann nur noch das Crossassembeln.

Re: Grafikausgabe

von pps » Fr 5. Apr 2019, 12:47
Ich habe mal etwas mit meinem ATMAS II (v.1.0) gespielt. Auf dem Altirra und dem ATARI sieht es da exakt gleich aus, nämlich so:
test_src.png
test_src.png (7.09 KiB) 3210-mal betrachtet

Der Code dazu:
Code: Alles auswählen
*************************
* VERBRAUCHSERFASSUNG
*
* START: 21.03.2019
*************************

SDLSTL   EQU $230

ROWCRS   EQU $54
COLCRS   EQU $55
CRSINH   EQU $2F0          CRSR SICHTBAR

COL1     EQU $2C5          ZEICHEN COL
COL2     EQU $2C6          HG COL
COL4     EQU $2C8          RAHMEN COL

COLRA    EQU $F8
COLHG    EQU $06
COLZ     EQU $C

ICCOM    EQU $342
ICSTA    EQU $343
ICBAL    EQU $344
ICBAH    EQU $345
ICBLL    EQU $348
ICBLH    EQU $349
ICAX1    EQU $34A
ICAX2    EQU $34B

CIOV     EQU $E456

* CIO-BEFEHLE

COPEN    EQU   3
CCLSE    EQU  12
CGTXT    EQU   5
CPTXT    EQU   9
CGBIN    EQU   7
CPBIN    EQU  11
CDRAW    EQU $11

* ATARI GRAPHIK-VARIABLE

ATACHR   EQU  $2FB


*
* GRAPHICS-BEFEHL
*
* AUFRUF: GRAPHICS <STUFE>
*
* <STUFE> 0 BIS 15 (XLS)
*         0 BIS 11 (400/800)
*
GRAPHICS MACRO STUFE
         JMP GR1@

DEV@     ASC "S:"

GR1@     LDX #$60
         LDA #CCLSE        ZUERST KANAL 6
         STA ICCOM,X       SCHLIESSEN
         JSR CIOV
         LDA #STUFE        JETZT NEUE GRAPHIK
         STA ICAX2,X       STUFE ANWAEHLEN
         AND #$F0
         EOR #$10
         ORA #$0C
         STA ICAX1,X
         LDA #COPEN
         STA ICCOM,X
         LDA #DEV@
         STA ICBAL,X
         LDA #DEV@/256
         STA ICBAH,X
         JSR CIOV
         MEND

*
* AUSWAHL DER ZEICHENFARBE
*
* AUFRUF: COLOR <FARBE>
*
* <FARBE> VON 0 BIS 255, JE NACH
*         GRAPHIKMODUS, MUSS EINE
*         KONSTANTE SEIN.
*

COLOR    MACRO COL
         LDA #COL
         STA ATACHR
         MEND

*
* POSITIONIERUNG DES CURSORS
*
* AUFRUF: POSITION <X>,<Y>
*
* <X>,<Y> JE NACH GRAPHIKMODUS, BEIDE
*         MUESSEN KONSTANTE SEIN
*
*
POSITION MACRO X,Y
         LDA #X
         STA COLCRS
         LDA #X/256
         STA COLCRS+1
         LDA #Y
         STA ROWCRS
         MEND

* GRAPHIK-PUNKTE SETZEN
*
* AUFRUF: PLOT <X>,<Y>
*
* <X>,<Y> JE NACH GRAPHIKMODUS,
*         MUSS SICH UM KONSTANE
*         HANDELN
*
PLOT     MACRO X,Y
         POSITION X,Y
         LDX #$60          KANAL 6
         LDA #CPBIN
         STA ICCOM,X
         LDA #0
         STA ICBLL,X
         STA ICBLH,X
         LDA ATACHR
         JSR CIOV
         MEND

*
* GRAPHIK-LINIEN ZIEHEN
*
* AUFRUF: DRAWTO <X>,<Y>
*
* <X>,<Y> JE NACH GRAPHIKMODUS
*         KONSTANTE
*
DRAWTO   MACRO X,Y
         POSITION X,Y
         LDX #$60          KANAL 6
         LDA #CDRAW
         STA ICCOM,X
         LDA #CCLSE
         STA ICAX1,X
         LDA #0
         STA ICAX2,X
         JSR CIOV
         MEND


         ORG $9000

         JSR INIT

         JMP *

*************************
INIT     GRAPHICS 8+16
         LDA #DLIST
         STA SDLSTL
         LDA #DLIST/256
         STA SDLSTL+1

         LDA #COLRA
         STA COL4
         LDA #COLHG
         STA COL2
         LDA #COLZ
         STA COL1

         LDA #$45
         STA ATACHR

         LDA #$18
         STA $58
         LDA #$AD
         STA $59


         PLOT 0,0
         DRAWTO 319,90

         RTS

*************************
DLIST    DFB $40
         DFB $42
         DFW $9EA8
         DFB $02,$02,$02,$02,$02,$02
         DFB $02,$02,$02,$02,$02,$02
         DFB $02,$02,$02,$02
         DFB $B0
         DFB $4F
         DFW $A150
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $0F,$0F,$0F,$0F,$0F,$0F
         DFB $41
         DFW DLIST
Es scheint so, als sei es wichtig nicht fest einen Bereich zu nehmen, sondern immer nach dem Graphics 8+16 in der DL zu lesen, wo der Bereich ist und diesen dann in die eigene DL einzutragen.
Dass es bei Dir unterschiedlich aussieht könnte am Emulator Profil liegen, dass eventuell anders als der originale Rechner ist (z.B. Alltirra OS statt ATARI OS - obwohl nur der OS Tausch bei mir nichts anderes zeigt).

Re: Grafikausgabe

von slx » Fr 5. Apr 2019, 13:54
Wenn DU die OS-Screen-Handler-Routinen für Grafik verwenden willst, ist es evt. leichter, die Grafik oben und den Text unten zu machen. Dann kannst Du den Schirm im gewünschten Grafik-Mode aufmachen und anschließend die Display-List so ändern, dass Du unten Grafikzeilen in Textzeilen verwandelst und dorthin mit einer eigenen Routine direkt in den Bildschirmspeicher ausgibst.

Re: Grafikausgabe

von Ingo70 » Fr 5. Apr 2019, 18:22
ES FUNKTIONIERT JETZT!!!! :D
Es war das LDA #$45 STA ATACHR - seltsamerweise. Egal, was für einen Wert man da rein schreibt, dann geht's.
Warum - keine Ahnung.
Und der Bildschirm muß bei $A150 liegen.

Danke erst mal an alle !