Hallo, guten Tag. Wie kann man einen eigenen ASCII-Code für den Screen 8 (VGA) nutzen. Wo wird er hingepackt und wie kann man bitte da drauf greifen. Ich möchte einen Emulator im Tetxmodus herstellen. Danke.
Das S in ASCII steht für Standard (das C für Code) Demnach gibt es kein eigenes ASCII Möchtest du einen anderen Font/Symbole benutzen oder die Zuordnung vom Code zum darzustellendem Zeichen ändern?
Peter B. schrieb: > Wie kann man einen eigenen ASCII-Code für den Screen 8 (VGA) nutzen. Was ist ein "eigener ASCII-Code"?
Ich kann mir denken, was das werden soll. Damals(tm) gab es auf fast allen Treiberdisketten zu den VGA-Karten ein Tool um Zeichen im Zeichensatz "umzumalen". Ich habe dies benutzt um ASCII-Spiele etwas ansehnlicher zu machen. Hatte allerdings den Nachteil, dass auch die Texte manchmal unleserlich wurden. (Die sahen dann aus wie Hieroglyphen) Ich bezweifle aber, dass dies noch unter modernen Betriebssystemen geht...
Ich möchte die Zeichen(Chars) selber schreiben und dann mit den Tasten auf den Screen sichtbar machen. Es soll die ROM-Chars ersetzen. Wie kann man bitte meinen Charsatz dem Programm (Turbo Pascal , Borland c++ , PDS 7.1) zugänglich machen.
:
Bearbeitet durch User
Ich hatte mal mit lcd-image-converter[1] die einzelnen Zeichen gemalt. [1] https://www.riuson.com/lcd-image-converter
Danke für die info. Malen kann ich sie. Wie bekomme ich den Charset auf einem MS-DOS-Rechner 386 sichtbar , ohne in den Grafikmodus zu schalten.
Mit Hilfe des VGA-BIOS: Die Beschreibung gibt es noch: http://www.mcamafia.de/pdf/ibm_vgaxga_trm2.pdf
:
Bearbeitet durch User
Hier findet man ausführliche Informationen: [[https://borncity.com/web/Library/DOSProgHB.PDF]] Suche nach "Bitmuster" führt zum INT 1F. Gruß WIRO
Danke für die Info. Da es drin, was mir weiter hilft.
noch ein Literatur Hinweis https://www.springer.com/de/book/9783322872395 Systemnahe Programmierung mit Borland Pascal Dort ist in Kapitel 7 die VGA Programmierung beschrieben INT 11h subfunktion 21h ist die Funktion zum Laden von Zeichensätzen im Textmode Das Buch kann man noch kaufen, die Diskette bei Springer runterladen. Das Buch gibt's auch auf Google books und div anderen Anbietern und es ist auf Deutsch.
Hallo, guten Tag. Ich verstehe hier die Antwort nicht im Bild. Wenn ich jetzt AL=1 nehme, muss da alles festgelegt werden? Wo wird da ES:BP übergeben die ich bekomme? danke
:
Bearbeitet durch User
Peter B. schrieb: > Wenn ich jetzt AL=1 nehme Bei AL=1 werden die eingebauten Zeichensätze benutzt. Da hat nur noch BL einfluss.
Danke für die Info. Jetzt funktioniert es im Textmodus mit den selbst erstellten Font.
Hallo, guten Tag. Mit welchen Befehl kann man bitte die Textzeichen setzen ohne das ein Zwischenraum ist? Ich habe die Werte mit $FF gefüllt bei meinen erstellten Buchstaben, eigentlich sollte kein Zwischenraum sein. Danke.
:
Bearbeitet durch User
Tja, das ist leider so. Die VGA Karte fügt eine neunte Spalte selbst ein. Ausnahmen sind hier die Zeichen 0xc0 bis 0xdf. Das sind die Box Drawing Characters im original Zeichensatz. Dort wird die neunte Spalte durch Wiederholung des achten Pixels des Zeichens erzeugt.
Danke. Kann man da irgend etwas mit ASM ändern?
Du kannst die Register der VGA-KArte auch mit anderen Sprachen beschreiben (sofern sie das unterstützt)
Unter https://web.stanford.edu/class/cs140/projects/pintos/specs/freevga/vga/vga.htm ist ein Link zu den Sequencer Registers https://web.stanford.edu/class/cs140/projects/pintos/specs/freevga/vga/seqreg.htm Da gibt es ein Bit, das den 9/8 Dot Mode kontrolliert.
Oder auf den Zeichensatz im Grafikmodus komplett verzichten und Punkt für Punkt selbst zeichen. Dann kannst Du bauen was immer Du möchtest. Welche Auflösung war denn Screen 8? Unter DOS war es doch gar nicht so einfach, an die höheren Auflösungen oder True-Color-Modi dranzukommen. Wenn ich mich recht erinnere, musste man dafür doch die Grafikkarte direkt ansprechen.
Im Grafikmodus VGA320x200 kann ich Zeichnen. Ich suche eine Lösung ob man irgendwie die 9. Zeile zusammenrücken kann im Tetxmodus. Ich verstehe die Tabellen oben nicht so, das ich da eine Lösung finde welchen Port ich wie setzen muss. Danke
Wie schafft man es hier bei diesen Text-Fenster durchgehende Kästchen zu Zeichnen ohne die fehlende Linie? Findet man fast in jeder Programmiersprache. Danke.
:
Bearbeitet durch User
Nils schrieb: > Ausnahmen sind hier > die Zeichen 0xc0 bis 0xdf. Das sind die Box Drawing Characters im > original Zeichensatz. immer alles lesen
Danke. Hatte ich nicht so verstanden. Kann man die eigenen Zeichen mit den Befehl ausstatten?
:
Bearbeitet durch User
Peter B. schrieb: > Danke. > Hatte ich nicht so verstanden. > > Kann man die eigenen Zeichen mit den Befehl ausstatten? Wenn sie im Bereich 0xc0 bis 0xdf liegen.
Peter B. schrieb: > Ich verstehe die Tabellen oben nicht so, das ich da eine Lösung finde > welchen Port ich wie setzen muss. Du musst einzelne Bits in den Registern setzen oder löschen. Wie das geht, hängt von der Programmiersprache ab. Für C müsste es im Forum auch ein Tutorial geben. Edit: da ist es ja: https://www.mikrocontroller.net/articles/Bitmanipulation
:
Bearbeitet durch User
Danke. Diese suche ich, damit ich die Strichlinie weg bekomme. --------------------------------- Du musst einzelne Bits in den Registern setzen oder löschen. ---------------------------------
Dirk B. schrieb: > Peter B. schrieb: >> Ich verstehe die Tabellen oben nicht so, das ich da eine Lösung finde >> welchen Port ich wie setzen muss. > > Du musst einzelne Bits in den Registern setzen oder löschen. > > Wie das geht, hängt von der Programmiersprache ab. > Für C müsste es im Forum auch ein Tutorial geben. > > Edit: da ist es ja: > https://www.mikrocontroller.net/articles/Bitmanipulation er weiss nicht welche Bits
cppbert schrieb: > er weiss nicht welche Bits Das Bit 0 (9/8 Dot) im Clocking Mode Register (Index 01h). Eine Belegung hatte ich schon verlinkt.
Peter B. schrieb: > Wie schafft man es hier bei diesen Text-Fenster durchgehende Kästchen zu > Zeichnen ohne die fehlende Linie? Findet man fast in jeder > Programmiersprache. in dem du nur die Blockzeichen verwendest die im Bereich 0xc0 bis 0xdf liegen, so macht das die Applikation auf dem Screenshot - ohne eigenen Font und Register-Programmierung
Danke für die Hilfe. Ich brauche 90 Blockgrafiken. Jetzt funktioniert es. Ich habe 6 neue Blöcke erzeugt als Muster die jetzt zusammen abgebildet werden zum Test. 3x2 -------------------------------- Program neuchar; Uses Dos,Crt; var ofss : word; segm : word; CONST chardata : Array[1..96] of Byte = ( $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff, $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff, $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff, $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff, $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff, $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff ); Procedure setlinie; BEGIN asm mov dx,3c5h mov al,1 out dx,al end; END; Procedure loadchar; BEGIN segm:=seg(chardata); ofss:=ofs(chardata); asm mov ah,11h mov al,00h mov bh,10h mov bl,00h mov cx,6 mov dx,65 mov es,segm mov bp,ofss int 10h end; END; begin setlinie; loadChar; ClrScr; Write(#65); Write(#66); Write(#67); Writeln(''); Write(#68); Write(#69); Write(#70); Writeln(''); readln; end. ---------------------------------------------
Peter B. schrieb: > Procedure setlinie; > BEGIN > asm > mov dx,3c5h > mov al,1 > out dx,al > end; > END; So einfach geht es nicht. Steht aber alles in dem Link. https://web.stanford.edu/class/cs140/projects/pintos/specs/freevga/vga/vgareg.htm#indexed Das Sequencer-Register besteht aus mehreren Unterregister, die rst noch adressiert weerden müssen. zudem musst du unbedingt den alten Wert lesen und mit dem gewünschten Wert manipulieren, damit keine Nebeneffekte auftauchen.
............................. zudem musst du unbedingt den alten Wert lesen und mit dem gewünschten Wert manipulieren, damit keine Nebeneffekte auftauchen. ............................ Das ist logisch. Ich habe es nur auf die schnelle getestet nach dem ich lange gesucht habe wie man es machen kann. Ich kann alle Chars ändern, kann sie wie Sprite bewegen , nur in Achterschritten , kann die Farbe ändern. Alles ohne Störungen. Ich habe mein Ziel erreicht.
:
Bearbeitet durch User
Peter B. schrieb: > Das ist logisch. > > Ich habe es nur auf die schnelle getestet nach dem ich lange gesucht > habe wie man es machen kann. dein Code programmier aber deine VGA Karte gar nicht richtig 1. du must den Index 1 in 3c4 schreiben 2. die Daten in 3c5 ändern - nicht überschreiben alles andere ist einfach falsch und auch nicht richtig nur weil das bei dir richtig "aussieht"
cppbert schrieb: > Peter B. schrieb: >> Das ist logisch. >> >> Ich habe es nur auf die schnelle getestet nach dem ich lange gesucht >> habe wie man es machen kann. > > dein Code programmier aber deine VGA Karte gar nicht richtig > > 1. du must den Index 1 in 3c4 schreiben > 2. die Daten in 3c5 ändern - nicht überschreiben > > alles andere ist einfach falsch und auch nicht richtig nur weil das bei > dir richtig "aussieht" du hast scheinbar nur Glück das dein Index schon auf 1 steht oder sowas - ist aber nicht garantiert und kann jederzeit anders sein und dann schreibst du mit 1 was völlig anderes als du denkst mach es richtig dann funktioniert es auch IMMER richtig
cppbert schrieb: > cppbert schrieb: >> Peter B. schrieb: >>> Das ist logisch. >>> >>> Ich habe es nur auf die schnelle getestet nach dem ich lange gesucht >>> habe wie man es machen kann. >> >> dein Code programmier aber deine VGA Karte gar nicht richtig >> >> 1. du must den Index 1 in 3c4 schreiben >> 2. die Daten in 3c5 ändern - nicht überschreiben >> >> alles andere ist einfach falsch und auch nicht richtig nur weil das bei >> dir richtig "aussieht" > > du hast scheinbar nur Glück das dein Index schon auf 1 steht oder sowas > - ist aber nicht garantiert und kann jederzeit anders sein und dann > schreibst du mit 1 was völlig anderes als du denkst > > mach es richtig dann funktioniert es auch IMMER richtig also eher so
1 | mov dx,3c4h // sequencer index register |
2 | out dx,1 // 1 = clocking mode register |
3 | |
4 | mov dx,3c5h // sequencer data register |
5 | in al,dx // ist-wert lesen |
6 | |
7 | or al,1 // das 1. bit auf 1 den rest belassen |
8 | out dx,al |
Also dieses: mit cli /sti ? ------------------- mov dx,3c4h mov al,1 out dx,al mov dx,3c5h in al,dx or al,00000001h out dx,al -------------------- Danke
Peter B. schrieb: > or al,00000001h Das wäre von der Notation ein 32-Bit Wert. Bisschen dick augetragen für 1 Byte. 01h oder 0000001b oder 1 Der Wert ist derselbe. Aber bei 00000010h sieht es dann schon anders aus.
Da ich mich hier verschrieben.
Bei dem OR oben habe ich mich verschrieben. Wenn ich jetzt in den VGA-Modus 7 schalte : Grafik 320x200 und Text ( 8 Seiten), kann ich die Buchstaben nicht ändern. Geht da die Änderung nicht ? Oder muss ich da bitte andere Daten setzen? Und welche? -------------------------- Les BP,SegAddr mov ah,11h mov al,00h mov bh,10h mov bl,0 mov cx,11 mov dx,65 int 10h ------------------------- Danke.
:
Bearbeitet durch User
Kannst Du die finale Lösung bitte noch zeigen? Danke! Gruß WIRO
Welche Lösung meinst du bitte?
Ich habe Dein Programm vom 01.04.2020 16:59 erfolgreich getestet, da es für mich auch interessant ist. In der Zwischenzeit kamen doch noch diverse Kommentare zu Fehlerquellen. Was müsste diesbezüglich an Deinem Programm (s. o.) korrigiert werden? (Interessant wäre noch, wie man den Standardzeichensatz wieder aktiviert.) Gruß WIRO
Peter B. schrieb: > Wenn ich jetzt in den VGA-Modus 7 schalte : > Grafik 320x200 und Text ( 8 Seiten), kann ich die Buchstaben nicht > ändern Für die Grafikmodi muss man die Subfunktionen ab 20h nehmen. https://dos4gw.org/INT_10h_11h_17_Character_Generator_EGA
Hier ist die bereinigte Version TP 6.0 : Mit Q/A wechselt man die jeweils 6 Chars , die ohne Zwischenlinie erscheinen. Mit "menge" gehe ich die Anzahl der Char an und mit "anfang" ab welcher Charnummer man beginnen soll. Bei mir sind es 12 Char die bei Nummer 65 anfangen. Hier waren Fehler drin : Procedure setlinie; Die ich bereinigt haben nach besten wissen. -------------------------------------------- Program neuchar; Uses Dos,Crt; var ofss : word; segm : word; ch: char; CONST chardata : Array[1..192] of Byte = ( $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff, $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff, $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff, $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff, $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff, $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff, $ff,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80, $ff,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0, $ff,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1, $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$ff, $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$ff, $1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1,$ff ); Procedure setlinie; BEGIN asm cli mov dx,3c4h mov al,1 out dx,al mov dx,3c5h in al,dx or al,1 out dx,al sti end; END; Procedure loadchar(menge,anfang:word); BEGIN segm:=seg(chardata); ofss:=ofs(chardata); asm mov ah,11h mov al,00h mov bh,10h mov bl,00h mov cx,menge mov dx,anfang mov bp,ofss int 10h end; END; Procedure set1; BEGIN ClrScr; Write(#65); Write(#66); Write(#67); Writeln(''); Write(#68); Write(#69); Write(#70); END; Procedure set2; BEGIN ClrScr; Write(#71); Write(#72); Write(#73); Writeln(''); Write(#74); Write(#75); Write(#76); Writeln(''); END; begin setlinie; loadChar(12,65); ClrScr; repeat ch := ReadKey; case ch of 'q': set1; 'a': set2; end; until ch = #27; end. ------------------------------------- Ich wollte mal ein Spiel mit 70 Jahren erstellen ohne den Grafikmodus. So wie man es in den Anfängen gemacht hat. https://de.wikibooks.org/wiki/Interrupts_80x86/_INT_10 Unter Funktion 11h ist eine Liste wie man auf die einzelnen ROM schalte.
:
Bearbeitet durch User
Danke Mario. -------------------------------- 20h - Load user-defined 8 x 8 character font (graphics mode) ES:BP Pointer to user graphics table for graphics characters 128-255. INT 1Fh is set to this pointer -------------------------------- Diesen Satz verstehe ich nicht: INT 1Fh is set to this pointer Geht dieses auch bitte: ------------------------------ 21h - Load user-defined character font (graphics mode) ES:BP Pointer to user graphics table for graphics characters 0-255 CX Bytes per Character BL Number of Rows 00h - DL contains number of rows 01h - 14 (0Eh) rows 02h - 25 (19h) rows 03h - 43 (2Bh) rows ----------------------------- danke.
:
Bearbeitet durch User
Das BIOS muss ja speichern, wo Deine Zeichentabelle liegt. Das tut es indem der Interruptvektor Int 1Fh mit der übergebenen Adresse geladen wird. Er zeigt also nicht auf eine Interruptroutine, sondern auf die Zeichentabelle.
:
Bearbeitet durch User
Danke. Wie wird der INT 1F bitte hier untergebracht? --------------------------- Procedure loadchar(menge,anfang:word); BEGIN segm:=seg(chardata); ofss:=ofs(chardata); asm mov ah,11h mov al,00h mov bh,10h mov bl,00h mov cx,menge mov dx,anfang mov bp,ofss int 10h end; END; -----------------------------
Die bereinigte Version TP 6.0 funktioniert nicht. Da stimmt mit der procedure setlinie irgendwas nicht. (Die Unit "DOS" wird nicht benötigt.) Gruß WIRO
------------------------------ Da stimmt mit der procedure setlinie irgendwas nicht. ------------------------------ Hier steht auch noch etwas über VGA Chars für TP : http://swag.outpostbbs.net/CHARS/index.html Und hier über die Linie 9: Grafik im Textmodus. https://guru-home.dyndns.org/Grafik-Textmodus.html Was geht genau nicht bei dir. Ich habe das Programm auf meine 2 Pc-MiniOltimer getestet unter DOS 3.2 und mit der DosBox. Es funktioniert.
:
Bearbeitet durch User
Die erste Version funktioniert einwandfrei. Mit der "bereinigten Version" erscheint am Monitor "Signal außerhalb des Bereiches" und das OS stürzt gnadenlos ab. Meine Konfiguration: Intel 486DX2, DOS 6.00, TP 6.0 Gruß WIRO
Meine erste Version ist falsch. Es wurde hier durch Fachleute gesagt , das es nur zufällig funktioniert. Ich habe die zweite Version nach wissen der Ratschläge hier gemacht. Die nach meiner nochmaligen Kontrolle richtig ist. Lies den Text hier unten: (https://guru-home.dyndns.org/Grafik-Textmodus.html) ------------------------------ VGA-Karten müssen – im Gegensatz zu EGA-Grafikadaptern – zusätzlich von der 9 Bit breiten Zeichenmaske, bei der die letzte Bitspalte ja lediglich angehängt ist, auf die Darstellung der wirklich vorhandenen 8 Bit breiten Maske umgeschaltet werden. Hierzu wird das Clocking-Mode-Register des Sequencers umprogrammiert. Heute übliche Multisync- oder Multiscan-Monitore haben keine Probleme, diese um 1/9 je Rasterzeile kürzeren Videosignale zu synchronisieren. Sollten sie mit Ihrem Monitor jedoch Probleme haben, so müssen die Register des CRT-Controllers neu programmiert werden. ------------------------------
:
Bearbeitet durch User
Der Absturz erfolgt bei: out dx,al Gruß WIRO
Ich muss mich revidieren, es ist kein Absturz, es ist tatsächlich der Monitor, der das nicht darstellen kann. (Tschuldigung!)
Was für einen alten Monitor hast du denn?
WIRO schrieb: > Ich muss mich revidieren, es ist kein Absturz, es ist tatsächlich der > Monitor, der das nicht darstellen kann. > (Tschuldigung!) Dann musst du wohl noch den Pixelclock mit ändern (verringern), da jetzt nur noch 640 Pixel statt 720 kommen und die VGA Karte jetzt eine Zeile schneller fertig bekommt.
:
Bearbeitet durch User
Hier steht oben drin: ----------------------------------------- ...müssen die Register des CRT-Controllers neu programmiert werden. ----------------------------------------- Wenn es bei dir läuft erzähl mal was du wie geändert hast im CRT?
:
Bearbeitet durch User
Mein Monitor ist ein BenQ FP91G X, der bisher auch bei unterschiedlichen Auflösungen keine Probleme gezeigt hat.
So einen ähnlichen 15 Euro Monitor habe ich noch im Schrank stehen. Der macht auch nicht viele Auflösungen mit , gerade wenn es um verschiedene Auflösungen geht mit Frequenzen verändern usw. Da ich gerne Experimente mache (keine Basteleien) habe ich mir einen gekauft der automatisch einen großen Bereich abdeckt.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.