grafik mit dem atasm
grafik mit dem atasm
von robbifan » Mo 18. Jun 2007, 16:47
hallo, kennt ihr die grafik-romroutinen für den 800/130 oder wo kann man die routinen nachlesen?
ich möchte mit dem atasm mal die grafikroutien ansprechen als übung und zum ausbauen.
mfg
von HiassofT » Mo 18. Jun 2007, 17:23
Die OS Routinen sind im Profibuch ab Seite 128 erklärt (sie laufen über CIO Aufrufe). Üblicherweise nimmt die aber niemand, da sie relativ langsam sind.
Besser, Du bastelst Dir selber eine Display List inkl. Bildschirmspeicher und schreibst da direkt rein. Antic Modus $0F (unter Basic Graphics 8) ist zum Anfangen recht einfach: Monochrom-Modus, pro Pixel 1 Bit.
BTW: Antic Display Lists sind wirklich sehr einfach. Denk Dir, das ist quasi eine kleine CPU. Schleifen (im herkömmlichen Sinn) gibt's nicht, nur einen JMP Befehl (eigentlich 2: einer macht eine Leerzeile, der andere wartet auf den VBI bevor er springt). Jeder "Opcode" ist dann eine Zeile in einem Grafikmodus (bzw ein oder mehrere Leerzeilen).
so long,
Hias
von robbifan » Mo 18. Jun 2007, 17:38
he , das hört sich gut an. erklär mir das bitte einmal näher, interessant.
vielleicht hast du mal ein anfangsbeispiel in atasm.
mfg
von HiassofT » Mo 18. Jun 2007, 18:31
Schau mal da:
- Code: Alles auswählen
.BANK
START = $2000
SCREEN = $3000
* = START
LDX #39 ; eine Zeile hat 40 Bytes
GLOOP LDA #0
STA SCREEN,X ; Zeile 1
LDA #$55
STA SCREEN+40,X ; Zeile 2
LDA #$AA
STA SCREEN+80,X ; Zeile 3
LDA #$FF
STA SCREEN+120,X ; Zeile 4
DEX
BPL GLOOP
LDA #<DLIST
STA 560
LDA #>DLIST
STA 561
X JMP X
DLIST .BYTE $70,$70,$70 ; 3*8 Leerzeilen
.BYTE $47 ; ganz grosse schrift, 20 Zeichen + Bildschirmspeicher laden
.WORD TEXT
.BYTE $70 ; 8 Leerzeilen
.BYTE $4F ; Graphics 8
.WORD SCREEN
.BYTE $F,$F,$F ; nochmal 3 Zeilen Gr.8
.BYTE $70
.BYTE $4E ; Graphics 15, der selbe Bildschirmspeicher
.WORD SCREEN
.BYTE $E,$E,$E
.BYTE $41 ; Ende der Dlist, JMP VBI
.WORD DLIST
; 20 Zeichen text
TEXT .SBYTE " HALLO! "
.BANK
; startadresse für DOS .COM Files
* = $02E0
.WORD START
3 Grafikmodi (Grosser Text, dann 4 Zeilen monochrom Hires mit einem Testmuster und 4 Zeilen 4-color 160 Pixel/Zeile, mit dem selben Testmuster - ergibt hier 3 Farben).
so long,
Hias
von robbifan » Mo 18. Jun 2007, 19:29
hallo, sieht gut aus im emu diese verschiedenen modis.
sind das jetz 4 zeilen oder immer 3 zeilen?
warum muss da immer screen zwischen ?
was macht das erste teilprogramm ?
danke.
mfg
von pps » Mo 18. Jun 2007, 20:06
Im Profibuch ist das alles sehr ausführlich und mit einer tollen Tabelle erklärt.
Ab Seite 99 im Nachschlagteil 2 steht alles über den Antic. Auf Seite 103 ist die Tabelle über alle Befehle des Antic.
von robbifan » Mo 18. Jun 2007, 20:17
welchen bezug haben in der tabelle(s. 103) die oberen schwarzen kästchen?
von pps » Mo 18. Jun 2007, 20:43
Wenn der in der Tabelle angegebene Wert in der DL steht, macht der Antic den passenden Befehl.
z.Bsp.
Am Anfang einer Gr.0 DL muß man ja die Bildschirmadresse laden. Das geschieht mit dem folgenden Befehl:
$42,$00,$80
Hier wird eine Gr.0 Zeile erstellt ($02) und die BS-Adresse soll geladen werden (+$40), danach kommt die Adresse, ab der der Bildschirm im Speicher ist (hier $8000 in low/high). Die folgenden Zeilen sehen so aus: $02
Hier mal ein komplettes Beispiel für Gr.0:
.org $7800 -> DL soll ab $7800 liegen
$70,$70,$70 -> Jede Standard Grafik hat beim ATARI 3 komplette (also 3*8 Scanlines) Leerzeilen
$42,$00,$80 -> wir setzen die erste Zeile und Setzen den Bildschrim auf $8000
$2,$2,$2,$2,$2
$2,$2,$2,$2,$2
$2,$2,$2,$2,$2 -> die anderen 23 Gr.0 Zeilen
$2,$2,$2,$2,$2
$2,$2,$2
$41,$00,$78 -> Wir wollen den Bildschirm ja auch sehen, also soll der Antic jetzt den VBI erlauben und beim nächsten mal wieder ab $7800 arbeiten.
Im Programm muß noch dem Antic "gesagt" werden, wo er die DL findet, also schreiben wir ihm diesen Wert nochmal in den Vektor $230/$231.
von robbifan » Mo 18. Jun 2007, 21:59
LDX #39 ; eine Zeile hat 40 Bytes
GLOOP LDA #0
STA SCREEN,X ; Zeile 1
LDA #$55
STA SCREEN+40,X ; Zeile 2
LDA #$AA
STA SCREEN+80,X ; Zeile 3
LDA #$FF
STA SCREEN+120,X ; Zeile 4
DEX
BPL GLOOP
was macht diese zeile für den ANTIC?
von robbifan » Mo 18. Jun 2007, 22:53
wo gibt es denn noch die grafikroutinen für draw-line und plot/pset
von HiassofT » Di 19. Jun 2007, 10:31
robbifan hat geschrieben:was macht diese zeile für den ANTIC?
Damit werden 160 Bytes Bildschirmspeicher mit Werten gefüllt. Jede Zeile ist 40 Bytes, im monochrom modus 1 Bit pro Pixel (320 Pixel) bzw 2 Bit Pro Pixel im Farbmodus (160 Pixel).
Die erste Zeile enthält nur 0er (->Hintergrundfarbe), die 2. Zeile das Bitmuster 01010101 (Farbe 1 im 4-Farb Modus), die 3. 10101010 (Farbe 2) und die 4. 11111111 (Farbe 3).
Wegen Plot/Draw Line/Circle etc. Routinen müsste ich noch etwas suchen (irgendwo hab ich Code liegen). Am besten Du schaust mal in die Infothek unter "APG", dort hat Carsten jede Menge Code gesammelt. Vielleicht ist da ja was dabei.
so long,
Hias
von robbifan » Di 19. Jun 2007, 14:51
jub danke. kannst dich noch einmal melden wenn du was rausgestöbert hast.
mfg
von robbifan » Di 19. Jun 2007, 14:53
.BYTE $47 ; ganz grosse schrift, 20 Zeichen + Bildschirmspeicher laden
.WORD TEXT
woher weis diese zeile, das der screen bei $3000 anfängt, bei den anderen werten hast du ".word screen" immer vorangesetzt.
mfg
von pps » Di 19. Jun 2007, 19:13
In der Zeile, wird nicht der Screen eingebunden, sondern der Text, der genau ab TEXT steht.
Das .SBYTE sorgt dafür, daß der Text gleich im internen ATARI-Format assembliert wird, sonst würdest Du etwas anderes auf dem BS sehen.
von robbifan » Di 19. Jun 2007, 20:49
woher weiss der text das er am anfang des screens anfangen muss.
wie könnte ich einen 2. text in die 2. zeile setzen in diesem antic-bereich?
mfg
von HiassofT » Di 19. Jun 2007, 21:27
robbifan hat geschrieben:woher weiss der text das er am anfang des screens anfangen muss.[/quote
wie könnte ich einen 2. text in die 2. zeile setzen in diesem antic-bereich?
Die Display List ist einfach eine folge der Grafik/Textmodi, die dargestellt werden sollen. Sie beginnt oben am Screen (meist mit 3*8 Leerzeilen), dann kommt zB hier eine Zeile Text. Wenn Bit 6 gesetzt ist ($47 statt nur 7), heisst das, daß direkt danach die Adresse des Bildschirmspeichers kommt. Kommt danach zB eine weitere "7" wird die Adresse einfach hochgezählt (je nach dem wie viel Bytes der Modus pro Zeile braucht, hier bei dem Text sind's 20).
wie könnte ich einen 2. text in die 2. zeile setzen in diesem antic-bereich?
Einfach unter nach dem ".BYTE $47 .WORD TEXT" noch ein ".BYTE 7" schreiben. Den Speicher für die Textzeile musst Du natürlich auch irgendwie setzen. zB nach TEXT .SBYTE... noch ein .SBYTE "bla bla bla...".
Ich hab' übrigens die Line-Draw Routine gefunden. Ist schon etwas älter (knapp 20 Jahre) und Teil einer kleinen Demo die ich damals geschrieben hatte. Sie verwendet den (standard) Bresenham Algorithmus, der grösste Teil dabei sind die ganzen Fallunterscheidungen.
Die Plot Routine ist auch etwas spezieller, ich nehme hier abwechselnd den GTIA-Modus "16 Farben" und "16 Helligkeiten". Ein Pixel braucht 4 bit und ist 4mal so breit wie hoch (80 Pixel pro Zeile). Damit hat man sozusagen einfach 256 Farben am Bildschirm.
Ganz oben am Bildschirm ist noch eine kleine Laufschrift, die verwendet sowohl Hardware Feinscrolling als auch "normales" Scrolling (dabei wird einfach die Startadresse der Textzeile hochgezählt).
Hier für's Forum ist das ganze wohl etwas zu groß (ca 600 Zeilen), deshalb hab ich den Source Code (ATasm) hochgeladen:
http://www.horus.com/~hias/tmp/kaleido.src.
Ich hoffe Du kommst damit halbwegs klar, leider sind so gut wie keine Kommentare im Code (hatte damals mit ATMAS am Atari entwickelt, da war der Speicher immer knapp).
so long,
Hias
von robbifan » Di 19. Jun 2007, 23:32
hallo, danke für den source.
habe jetzt schon viel gelernt in der kurzen zeit dank euer aller hilfe.
ich verwende nur den emu und bin voll begeistert wie der atari funktioniert. fängt mit dem dos an....turbobasic....bosx.....atasm....banking....usw
mfg