006
Heute, 10:58 Uhr
KaGa
|
Zum Verstehen der Videosteuerung eignet sich am besten die Routine "Plot" auf %083A. Sie ist ziemlich direkt an der Hardware. Die Routine setzt genau einen Punkt an der Position X,Y mit der Farbe Z. X,Y,Z entsprechen den Basic Variablen X,Y,Z (Register: X=%4E/%4F, Y=%50/%51 und Z=%52/%53)
Um die RAM Zelle im Video RAM zu ermitteln wird auch von Plot die Routine auf %0FBB genutzt. Diese Routine bedient sich einer Tabelle auf %0B00..%0BC0 (%C0=192=Anzahl der Bildschirmzeilen) Auch %0BC1..%0BFF gehört aber noch zu dieser Tabelle. Es erfolgt die Umrechnung der XY Punktkoordinaten in eine Adresse und Bitmaske im Video RAM
Eingabe %4E/%4F = X 320 (0..319) %51 = Y 192 (0..191)
Ausgabe %60/%61 Adresse, Zeiger auf das Byte im Video RAM (%4000.. %63 Bitmaske auf Bit in diesem Byte
In der Routine "Plot" auf %083A wird dann nacheinander (RL r5) die jeweilige Bank (V/H, R,G,B) selektiert (Low-aktiv) und das Bit gemäß Maske in Register %63 in der Speicherzelle %60/%61 gesetzt.
;---------------------------------------------------------------------------- PLOT: PUSH %FD ;70 FD Registerpointer sichern SRP #%60 ;31 60 Registersatz %60 CALL BWS ;D6 0F BB liefert Video RAM Adresse(%60/%61)und Bitmaske(%63) LD r10,%53 ;A8 53 "Z" (Farbe) nach Arbeitsreg 10 (%6A) LD r6,#%FF ;6C FF XOR r6,r3 ;B2 63 alle Bits in der Bitmaske(%63) aus BWS "umdrehen" LD r2,#%00 ;2C 00 LD r4,#%60 ;4C 60 Zeiger auf %60EF (rr4) LD r5,#%EF ;5C EF Steuerregister Video RAM: %6000..%63FF LD %F8,#%B2 ;E6 F8 B2 P01M %10110010 Adress/Datenbus,Stack extern,Timing erweitert
;Freigabe durch die Video CPU abwarten PLOT1: TM %03,#%04 ;76 03 04 Port3 Bit2 "VIDEO CPU BUSY" gesetzt ? JR NZ,PLOT1 ;EB FB ja -> warten, keine Bildstörung verursachen
;Pixel im Video RAM setzen PLOT2: LDE @rr4,r5 ;92 54 %EF (1110 1111) nach %60EF schreiben: Auswahl der Bank "V/H"
LD r8,#%31 ;8C 31 (0011 0001) RRC r10 ;C0 EA 0F->07->83->C1-E0 RLC r8 ;10 E8 31->63 00110001 -> 01100011
LDE r9,@rr0 ;82 90 Byte aus dem Video RAM (Zeiger) lesen AND r9,r6 ;52 96 mit Bitmaske verknüpfen OR r9,@r8 ;43 98 r9 OR r%31/r%63 LDE @rr0,r9 ;92 90 Byte im Video RAM (Zeiger) schreiben RL r5 ;90 E5 nächste Bank -> 1110 1111 wird zu 1101 1111 Bank "BLAU" C=1 ; nächste Bank -> 1101 1111 wird zu 1011 1111 Bank "GRÜN" C=1 ; nächste Bank -> 1011 1111 wird zu 0111 1111 Bank "ROT" C=1 ; nächste Bank -> 0111 1111 wird zu 1111 1110 Bank "NONE" C=0 ! JR C,PLOT2 ;7B EC Bit 7 wurde ins Carry geschoben, fertig wenn C=0
;Rücksprung vorbereiten LD %F8,#%92 ;E6 F8 92 P01M %10010010 Adress/Datenbus,Stack extern,Timing normal POP %FD ;50 FD Registerpointer wiederherstellen RET ;AF Rücksprung zum Aufrufer
;---------------------------------------------------------------------------- ;Umrechnung der XY Punktkoordinaten in eine Adresse und Bitmaske im Video RAM ;ein: %4E/%4F = X 320 0000 0001 / 0100 0000 (1/64) ; %51 = Y 192 ;aus: %60/%61 Adresse auf das Byte im Video RAM ; %63 Bitmaske auf Bit in diesem Byte ;Registerpointer steht auf %60
; Adresse %0FBB BWS: CP %51,#%C0 ;A6 51 C0 ist Y (Zeile) >=192 ? JR NC,BWS2 ;FB 40 ja -> Bereichsüberschreitung (Code: Byte0 im org. Zeichengen.) OR %4E,%4E ;44 4E 4E ist X Highbyte %4E = 0 ? JR Z,BWS1 ;6B 05 ja -> alles OK, max 255 im Lowbyte und weiter CP %4F,#%40 ;A6 4F 40 nein, ist X Lowbyte bei Highbyte>0 selbst >=64 JR NC,BWS2 ;FB 36 ja -> Bereichsüberschreitung BWS1: LD r11,%51 ;B8 51 Zeiger (%6A/%6B) auf BWSTAB (%0B00) LD r10,#%0B ;AC 0B zuzüglich dem Offset aus Y, Reg %61 (Zeile) setzen LDC r0,@rr10 ;C2 0A r0 (%60) mit Wert aus BWSTAB via Zeiger (%6A/%6B) laden
LD r3,#%E0 ;3C E0 Zeiger rr2 (%62/%63) vorbereiten AND r3,r0 ;52 30 SWAP r3 ;F0 E3 RR r3 ;E0 E3
ADD r3,#%C0 ;06 E3 C0 Offset %C0(192) aufaddieren -> BWSTAB2 LD r2,#%0B ;2C 0B Zeiger rr2 (%62/%63) zeigt auf BWSTAB2 (%0BCx) LDC r1,@rr2 ;C2 12 Reg %61 mit Wert aus %0BCx via Zeiger rr2 laden
LD r2,%4E ;28 4E X Highbyte -> Zeiger rr2 (%62/%63) vorbereiten LD r3,#%19 ;3C 19 LD r10,%4F ;A8 4F X Lowbyte RRC r2 ;C0 E2 X 32 Bit (Highbyte+Lowbyte) /2 RRC r10 ;C0 EA Übertrag in das Lowbyte RLC r3 ;10 E3 RRC r10 ;C0 EA X Lowbyte RLC r3 ;10 E3 RRC r10 ;C0 EA X Lowbyte RLC r3 ;10 E3
ADD r1,r10 ;02 1A Rückgabewert Reg %61 Zeiger auf Video RAM Low-Teil LD r2,#%0B ;2C 0B Zeiger rr2 auf %0Bxx LDC r3,@rr2 ;C2 32 Rückgabewert Reg %63 Bitmaske (1 aus 8) AND r0,#%1F ;56 E0 1F ADD r0,#%40 ;06 E0 40 Rückgabewert Reg %60 Zeiger auf Video RAM High-Teil RET ;AF Rücksprung zum Aufrufer ;---------------------------------------------------------------------------- ;BWS Rückgabe einer unsichtbaren Adresse falls X oder Y außer Bereich waren ;%50/%51 = %40/%79 und %53 = %01 Video RAM %4079 mit Bitmaske %01 ;das erste der ungenutzten 8 Bytes zwischen Ende Zeile 3 und Anfang Zeile 4
;Adresse %1000 (eigentlich schon der Zeichensatz, Zeichen 0)
BWS2: ;LD R0,#%40 ;0C 40 ;diese Befehle stehen als ASCII %00 ;LD R1,#%79 ;1C 79 ;im Zeichengenerator (8 Byte) ;LD R3,#1 ;3C 01 ;der eigentliche Zeichengenerator fängt 8 Bytes ;RET ;AF ;später mit ASCII %01 an ;NOP ;FF
;----------------------------------------------------------------------------
Da die Banken V/H,R,G,B sozusagen auf %4000.. "übereinander" liegen und auch gemeinsam beschrieben werden können (00xxh) dürfte 4 * 8KByte zu 32KByte machen nicht mit ES40 machbar sein.
Auch der Videoprozessor spricht die 8K Bänke gleichzeitig an. Er ist eigentlich kein richtiger Videoprozessor, sondern mehr eine Takt- und Ablaufsteuerung. Auf den Inhalt der Video RAMs hat er keinen Zugriff. Er adressiert die RAMs nur und löst eine Übertragung der Daten in Schieberegister aus. Außerdem erzeugt er die Zeilen und Bildsyncronimpulse.
Da der Videoprozessor im special bootstrap mode betrieben wird um seinen internen ROM durch einen externen ROM ersetzen zu können werden leider die meisten PortPins zur Ansteuerung des externen Speichers benötigt. Die verbleibenden Ports reichen nicht um hier noch einen Video RAM separat anzusteuern. Daher adressiert der Videoprozessor die unteren Adressen des Video RAM (128 Bit) identisch mit seinem Programm ROM. Da aber eine Zeile 320 Punkte hat, was 320/8=40 Byte bedeutet und 3 Zeilen 120 Byte benötigen, werden nach jeder 3.Zeile 8 Byte übersprungen. Darum wird bei der Zuordnung X/Y Koordinate zu Adresse im Video RAM auch der Aufwand mit der Tabelle gemacht. |