' -ž TurboAnsi Emulator, (c) by SpaceArts 1995 ž- TTY/Ansi/AnsiMusic/Avt/Avt 0+ ' programmiert fuer das BASiC Forum EPG (Echo Programmer's Group) von ' Oliver Maske ' BildschirmProtokoll kann folgende Werte annehmen: ' Nr. 76543210 ' Bit 00000000 ' +---------- TTY ' +--------- Ansi/VT102 ' +-------- AnsiMusic ' +------- Avatar ' +------ Avatar 0+ ' +----- reserviert ' +---- reserviert ' +--- reserviert ' Falls das _TTY Bit_ geloescht ist, kann keine Ausgabe erfolgen! ' Es wurden drei Ansi Sequenzen nicht bercksichtigt, da sie von der Sicht ' des Autors nicht h„ufig benutzt werden und auch sonst unn”tiger Ballast ' sind. MS-DOS ANSI.SYS kompatible Sequenzen ' ' (SM) Bildschirmmodus setzen ESC [ = n h 1 ' oder ESC [ = h 1 ' oder ESC [ ? n h ' (RM) Bildschirmmodus r.setzen ESC [ = n 1 ' oder ESC [ = 1 ' oder ESC [ ? n 1 ' (KB) Zuordnung einer Taste ESC [ n ; n ;... n p ' ' Weiterhin ist noch kein Avatar und ANSI Music implemtiert ' ' ** Wichtiger Hinweis ******************************** ' * * ' * In der SUB "GebeCPRaus" muį evtl. der Modem- bzw. * ' * Kommunikationsaufruf angepasst werden!!! * ' ***************************************************** ' ž> -------------------------------------------------------------------------- ' ž> $METASTATEMENT's $DIM ALL ' ž> -------------------------------------------------------------------------- ' ž> Konstanten %Blink = 7 ' laeszt die Farbe blinken %White = &B111 %BackBlack = &B0000000 %DefaultColor = %BackBlack + %White %VorderGrundSchwarz = 30 %VorderGrundRot = 31 %VorderGrundGruen = 32 %VorderGrundGelb = 33 %VorderGrundBlau = 34 %FALSE = 0 %TRUE = NOT %FALSE %Leerzeichen = 32 %Mono = &H0b000 %Color = &H0b800 %TTY = &B10000000 %Ansi = &B01000000 %AnsiMusic = &B00100000 %Avatar = &B00010000 %Avatar0Plus = &B00001000 ' ž> -------------------------------------------------------------------------- ' ž> DECLAREationen DECLARE SUB AnsiPrint (Char AS BYTE) DECLARE SUB AnsiPrintString (Text AS STRING) DECLARE SUB ClearLine (BYVAL SpaltenC AS INTEGER) DECLARE SUB ClearScreen () DECLARE SUB Cursor (dummy AS INTEGER) DECLARE SUB FastPrint (BYVAL Char AS INTEGER) DECLARE SUB FastPrintString (Text AS STRING) DECLARE SUB GebeCPRaus () DECLARE SUB GetParameter (Parameter AS STRING, ParameterZahl AS INTEGER, ParameterList() AS INTEGER) DECLARE SUB MoveScreenDOWN () DECLARE SUB MoveScreenUP () DECLARE SUB ProcessAnsi (Char AS BYTE) DECLARE SUB ProcessLinefeed (Anzahl AS INTEGER) DECLARE SUB ProcessLinefeedBack (Anzahl AS INTEGER) DECLARE SUB SetCursor () DECLARE FUNCTION GetScreenSegment?? () DECLARE FUNCTION AnsiInit% (x AS INTEGER, z AS INTEGER, s AS INTEGER, b AS BYTE) DECLARE FUNCTION IsVGA% () ' ž> -------------------------------------------------------------------------- ' ž> DIMensionierungen DIM StartXScreen AS SHARED INTEGER DIM LineCompare AS SHARED INTEGER DIM CursorXPos AS SHARED INTEGER DIM CursorYPos AS SHARED INTEGER DIM CurrentColor AS SHARED BYTE DIM ShowCursorDuringPrint AS SHARED INTEGER DIM CurLinesPerScreen AS SHARED BYTE DIM ScreenSegment AS SHARED WORD DIM BildschirmProtokoll AS SHARED BYTE DIM AnsiLevel AS SHARED INTEGER DIM Temp AS INTEGER ' ž> -------------------------------------------------------------------------- ' ž> Code ' ž> TurboAnsi Emulator Init. Falls ein Fehler auftritt wird der Errorlevel ' ž> 255 ausgegeben WIDTH 80, 25: CLS Temp% = AnsiInit (1, 1, %FALSE, %TTY + %Ansi) IF Temp% > 5000 THEN WIDTH 80, 25: CLS PRINT " Interner Programmfehler:"; Temp%: PRINT END 255 END IF LOCATE CurLinesPerScreen, 1: COLOR 14, 4: PRINT " -ž TurboAnsi Emulator, (c) by SpaceArts 1995 ž- TTY/Ansi/AnsiMusic/Avt/Avt 0+ "; DIM Taste AS STRING Cursor %TRUE DO Taste$ = "" WHILE NOT INSTAT WEND Taste$ = INKEY$ IF Taste$ = CHR$ (255) THEN EXIT ELSEIF Taste$ = "S" THEN ProcessLinefeedBack 1 Taste$ = "" ELSE AnsiPrint ASC (Taste$) END IF LOOP END ' ž> -------------------------------------------------------------------------- ' ž> SUB's und FUNCTION's FUNCTION AnsiInit% (x AS INTEGER, z AS INTEGER, s AS INTEGER, b AS BYTE) ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Initialisiert den Ansi Emulator ' weist Variablen Werte zu. ' IN: s = ob der Cursor waehrend einer Ausgabe ' mitbewegt werden soll (boolean) ' x = 1. Zeilenposition ' z = Hoehe (Zeilenanzahl) ' b = Bildschirm Protokoll (TTY, Ansi, Avt) s.o. ' OUT: AnsiInit 5000 - alles in Ordnung ' 5001 - Startposition von X groeszer/kleiner als erlaubt ' 5002 - Zeilen pro Bild groeszer/kleiner als erlaubt ' 5003 - mit den Einstellungen des LineCompares und ' StartXScreen ist keine aktive Zeichenflaeche ' vorhanden StartXScreen = x LineCompare = z ShowCursorDuringPrint = s BildschirmProtokoll = b ! push bp ; musz gePUSHed werden, da INT 10 Fkt. 11 ! ; Unterfunktion 30 BP veraendert ! mov ax, &H1130 ; Zeichensatzinfo ! mov bh, 1 ; im Prinzip unwichtig, da wir nur die Zeilen- ! ; Anzahl haben moechten ! int &H10 ! pop bp ; und BP wieder restaurieren ! mov CurLinesPerScreen, dl IF IsVGA% THEN INCR CurLinesPerScreen ' akt. Zeilen pro Bildschirm FUNCTION = 5000 SELECT CASE StartXScreen CASE > CurLinesPerScreen FUNCTION = 5001 EXIT FUNCTION CASE <= 0 FUNCTION = 5001 EXIT FUNCTION END SELECT IF (LineCompare < 0) OR (LineCompare => CurLinesPerScreen) THEN FUNCTION = 5002: EXIT FUNCTION IF StartXScreen > CurLinesPerScreen - LineCompare THEN FUNCTION = 5003: EXIT FUNCTION ScreenSegment = GetScreenSegment?? ClearScreen END FUNCTION SUB AnsiPrint (Char AS BYTE) DIM Temp AS LOCAL INTEGER ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' parst die Ansi Sequenzen und fuehrt dessen ' Funktion aus. ' IN: Char = zu parsendes Zeichen ' OUT: -/- IF AnsiLevel => 1 THEN ProcessAnsi Char: EXIT SUB ' ein Escape empfangen IF BIT (BildschirmProtokoll, 7) THEN IF Char > 31 THEN FastPrint Char: Char = 0 END IF SELECT CASE Char ' ž> --------- 00 - Nichts (Null) --------------------------------------------- CASE 0 ' ž> --------- 07 - Bell (Glocke) --------------------------------------------- CASE 7 SOUND 1500, 1 SOUND 2500, 2 ' ž> --------- 08 - Backspace (Rckschritt) ----------------------------------- CASE 8 ! dec CursorYPos IF CursorYPos =< 0 THEN CursorYPos = 1 SetCursor ' ž> --------- 09 - Tabulator (Zeichensprung) --------------------------------- CASE 9 CursorYPos = ((CursorYPos \ 8) + 1) * 8 IF CursorYPos > 80 THEN CursorYPos = 80 SetCursor ' ž> --------- 10 - Linefeed (Zeilenvorschub) --------------------------------- CASE 10 Temp = CursorYPos ProcessLinefeed 1 CursorYPos = Temp SetCursor ' ž> --------- 11 - Cursor Down (Zeilenvorschub) --------------------------------- CASE 11 ProcessLinefeed 1 ' ž> --------- 12 - Bildschirmloeschen ---------------------------------------- CASE 12 ClearScreen ' ž> --------- 13 - Carriage Return (Wagenruecklauf) -------------------------- CASE 13 CursorYPos = 1 SetCursor ' ž> --------- 27 - Ansi Sequenz (ESCape) ------------------------------------- CASE 27 IF BIT (BildschirmProtokoll, 6) THEN AnsiLevel = 1 ELSE ' nur TTY FastPrint Char END IF ' ž> --------- 29 - Backspace (Rckschritt) ----------------------------------- CASE 29 ! dec CursorYPos IF CursorYPos =< 0 THEN CursorYPos = 1 SetCursor ' ž> --------- Andere Zeichen ausgeben ---------------------------------------- CASE ELSE FastPrint Char END SELECT END IF END SUB SUB AnsiPrintString (Text AS STRING) DIM TempCur AS LOCAL INTEGER DIM AdressePTR AS LOCAL BYTE PTR DIM LaengeDesStrings AS LOCAL INTEGER ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' gibt einen kompletten String auf den Bildschirm aus ' Steuerzeichen (CR, LF, Beep, etc) werden bercksichtigt! ' IN: Text$ = Auszugebender String ' OUT: -/- ' ž> Cursorstatus retten und loeschen TempCur = ShowCursorDuringPrint Cursor %FALSE LaengeDesStrings = LEN (Text) IF LaengeDesStrings = 0 THEN EXIT SUB ' ž> Adresse des Strings AdressePTR = STRPTR32 (Text) ' ž> ausgeben FOR AdressePTR = AdressePTR TO AdressePTR + LaengeDesStrings - 1 AnsiPrint @AdressePTR NEXT Adresse ' ž> CursorStatus wiederherstellen Cursor TempCur END SUB SUB ClearLine (BYVAL SpaltenC AS INTEGER) ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' loescht die Zeichen von der aktuellen ' Cursorposition bis zum Zeilenende ' IN: -/- ' OUT: -/- ! mov ax, ScreenSegment ! mov es, ax ; Segment Adresse ! mov ax, StartXScreen ; Erste Zeile... ! add ax, CursorXPos ! sub ax, 2 ; zwei subtrahieren ! mov bx, ax ! mov cl, 7 ; mit 128 malnehmen ! shl ax, cl ! mov cl, 5 ! shl bx, cl ! add ax, bx ; ! mov bx, SpaltenC ; Spaltenberechnung ! push bx ; bx sichern (Cursor Y Position) ! shl bx, 1 ! add ax, bx ! sub ax, 2 ! mov di, ax ; entgueltige Offset Adresse ! pop bx ; Cursor Y Position restaurieren ! mov cx, 80 ; wieviele Words ueberschreiben? ! sub cx, bx ! add cx, 1 ! mov ah, %DefaultColor ; Attribute Byte bestimmen ! mov al, %Leerzeichen ; mit Leerzeichen Bildschirm loeschen ! rep stosw END SUB SUB ClearScreen () DIM Temp AS LOCAL WORD ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' l”scht nur den aktiven Bereich ' IN: -/- ' OUT: -/- Temp?? = CurLinesPerScreen - LineCompare - StartXScreen + 1 ! mov dx, Temp?? ! push dx ! mov ax, ScreenSegment ! mov es, ax ; Segment Adresse ! mov ax, StartXScreen ; Erste Zeile... ! dec ax ; eins subtrahieren ! mov bx, ax ! mov cl, 7 ; mit 128 multiplizieren ! shl ax, cl ! mov cl, 5 ! shl bx, cl ! add ax, bx ; ! mov di, ax ; entgueltige Offset Adresse ! mov ah, %DefaultColor ; Attribute Byte bestimmen ! mov al, 32 ; mit Leerzeichen Bildschirm loeschen ! pop dx ; DX aus dem Stack holen (Zeilenanzahl, die ! ; ueberschrieben werden soll) LoescheScreenWeiter: ! mov cx, 80 ; eine Zeile ueberschreiben ! rep stosw ; " ! dec dx ! cmp dx, 0 ! jne LoescheScreenWeiter ; falls noch nicht alle Zeilen ueberschrieben ! ; worden sind -> weitermachen CursorXPos = 1 CursorYPos = 1 CurrentColor = %DefaultColor SetCursor ' Cursorposition updaten END SUB SUB Cursor (dummy AS INTEGER) ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' schaltet den Cursor an/aus ' IN: dummy% = boolean ' OUT: -/- ShowCursorDuringPrint = dummy SetCursor END SUB SUB FastPrint (BYVAL Char AS INTEGER) DIM Temp AS LOCAL WORD ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' gibt ein Zeichen auf den Bildschirm aus ' IN: Char% = Auszugebendes Zeichen ' OUT: -/- ! mov ax, ScreenSegment ! mov es, ax ; Segment Adresse ! mov ax, StartXScreen ; Erste Zeile... ! add ax, CursorXPos ! sub ax, 2 ; zwei subtrahieren ! mov bx, ax ! mov cl, 7 ; mit 128 malnehmen ! shl ax, cl ! mov cl, 5 ! shl bx, cl ! add ax, bx ; ! mov bx, CursorYPos ; Spaltenberechnung ! shl bx, 1 ! add ax, bx ! sub ax, 2 ! mov di, ax ; endgueltige Offset Adresse ! mov bh, CurrentColor ; abschicken ! mov bl, Char ! mov es:[di], bx ; Bildschirmschreiben ! inc CursorYPos IF CursorYPos > 80 THEN CursorYPos = 1 ! inc CursorXPos IF CursorXPos + StartXScreen > CurLinesPerScreen - LineCompare + 1 THEN ! dec CursorXPos MoveScreenUP END IF END IF IF ShowCursorDuringPrint THEN LOCATE CursorXPos + StartXScreen - 1, CursorYPos, %TRUE END IF END SUB SUB FastPrintString (Text AS STRING) DIM TempCur AS LOCAL INTEGER DIM AdressePTR AS LOCAL BYTE PTR DIM LaengeDesStrings AS LOCAL INTEGER ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' gibt einen kompletten String auf den Bildschirm aus. Steuer- ' zeichen (CR, LF, Beep, etc) werden nicht bercksichtigt! ' IN: Text$ = Auszugebender String ' OUT: -/- LaengeDesStrings = LEN (Text) IF LaengeDesStrings = 0 THEN EXIT SUB ' ž> Adresse des Strings AdressePTR = STRPTR32 (Text) ' ž> ausgeben FOR AdressePTR = AdressePTR TO AdressePTR + LaengeDesStrings - 1 FastPrint @AdressePTR NEXT Adresse END SUB SUB GebeCPRaus () DIM CPRsequenz AS LOCAL STRING DIM YK AS LOCAL STRING DIM XK AS LOCAL STRING ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' sendet die CPR Sequenz. An dieser Stelle musz der ' Kommunikationsaufruf angepasst werden. ' IN: -/- ' OUT: -/- ' ž> Zusammenstellung der CPR Sequenz XK$ = REMOVE$ (STR$ (CursorXPos), " ") YK$ = REMOVE$ (STR$ (CursorYPos), " ") CPRsequenz$ = CHR$ (27) + "[" + XK$ + ";" + YK$ + "R" ' ž> Ausgabe der CPR Sequenz (Modem- bzw. Kommunikationsaufruf) PRINT CPRsequenz$ END SUB SUB GetParameter (Parameter AS STRING, ParameterZahl AS INTEGER, ParameterList() AS INTEGER) DIM i AS LOCAL INTEGER DIM a AS LOCAL STRING DIM Dummy AS LOCAL STRING ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' wertet einen Ansi Parameter String "0;37;47" aus ' IN: Parameter$ = String ' ParameterZahl% = ... ' ParameterList% = ein Integer Array ' OUT: ParameterZahl% = Anzahl der Parameter ' ParameterList% = eigentliche Parameter als Array ParameterZahl% = 0 IF INSTR (Parameter$, ";") > 0 THEN FOR i% = 1 TO LEN (Parameter$) Dummy$ = MID$ (Parameter$, i%, 1) a$ = a$ + Dummy$ IF Dummy$ = ";" THEN INCR ParameterZahl% ParameterList(ParameterZahl%) = VAL (MID$(a$, 1, LEN (a$)-1)) a$ = "" END IF NEXT i% INCR ParameterZahl% ParameterList(ParameterZahl%) = VAL (a$) ELSE ParameterZahl% = 1 IF LEN(Parameter$) > 0 THEN ParameterList(ParameterZahl%) = VAL (Parameter$) ELSE ParameterList(ParameterZahl%) = 1 END IF END IF END SUB FUNCTION GetScreenSegment?? () DIM dummy AS LOCAL WORD ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' liefert das Screensegment fr ' den Textmodus zurck. ' mono = &H0b000 ' color = &H0b800 ' IN: -/- ' OUT: GetScreenSegment?? = Segment zum Beschreiben des ' Textmodusspeichers ! xor ax, ax ; segment 0 ! mov es, ax ! mov di, &H0463 ; Adresse des CRTC ! mov ax, es:[di] ; dummy mit CRTC Adresse beschreiben ! mov dummy, ax IF dummy = &H03b4 THEN ' Monochrom Monitor angeschlossen FUNCTION = %Mono ELSE FUNCTION = %Color ' Farb Monitor angeschlossen END IF END FUNCTION SUB MoveScreenDOWN () ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' verschiebt den Bildschirm um eine ' Zeile nach unten und fuellt die neue ' Zeile mit dem aktuellen CurrentColor ' IN: -/- ' OUT: -/- ! push ds ! push si ' ž> Anzahl der zu verschiebenen Words ausrechnen ! mov ax, StartXScreen ; Bildschirmstart ! mov bx, LineCompare ; Statuszeile ! mov dx, CurLinesPerScreen ; Gesamtzahl der Bildschirmzeilen ! sub dx, ax ; CurLinesPerScreen - StartXScreen ! sub dx, bx ; CurLinesPerScreen - LineCompare ' Zeilen ! mov ax, dx ; Zeilen * 80 (80 Words pro Zeile) ! mov cl, 6 ; *64 ! shl ax, cl ; " ! mov cl, 4 ; *16 ! shl dx, cl ; " ! add dx, ax ; (Zeilen *64) + (Zeilen *16) ! mov cx, dx ' ž> wohin soll das Ganze? ! mov ax, ScreenSegment ! mov es, ax ! mov ds, ax ! mov di, dx ! shl di, 1 ! add di, 158 ! mov si, di ! sub si, 160 ! std ! rep movsw ! cld ' ž> Stack restaurieren ! pop si ! pop ds ' ž> 'freie' Zeile ueberschreiben ! xor di, di ! mov ah, CurrentColor ; Farbe ! mov al, %Leerzeichen ; Zeichen "Leerzeichen" ! mov cx, 80 ; 80 Words ! repne stosw ; Bildschirmschreiben END SUB SUB MoveScreenUP () ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' verschiebt den Bildschirm um eine ' Zeile nach oben und fuellt die neue ' Zeile mit dem aktuellen CurrentColor ' IN: -/- ' OUT: -/- ! push ds ; lebensnotwendige Register sichern ! push si ' ž> Anzahl der zu verschiebenen Words ausrechnen ! cld ! mov ax, StartXScreen ; Bildschirmstart ! mov bx, LineCompare ; Statuszeile ! mov dx, CurLinesPerScreen ; Gesamtzahl der Bildschirmzeilen ! sub dx, ax ; CurLinesPerScreen - StartXScreen ! sub dx, bx ; CurLinesPerScreen - LineCompare ' Zeilen ! mov ax, dx ; Zeilen * 80 (80 Words pro Zeile) ! mov cl, 6 ; *64 ! shl ax, cl ; " ! mov cl, 4 ; *16 ! shl dx, cl ; " ! add dx, ax ; (Zeilen *64) + (Zeilen *16) ' ž> wohin soll das Ganze ! mov ax, ScreenSegment ! mov es, ax ; Ziel Segment Adresse ! mov ax, StartXScreen ; Erste Zeile... ! dec ax ; eins subtrahieren ! mov bx, ax ! mov cl, 7 ; mit 160 malnehmen ! shl ax, cl ; " ! mov cl, 5 ; " ! shl bx, cl ; " ! add ax, bx ; ! mov di, ax ; endgueltige Offset Adresse ! mov si, di ; Quell Offset Adresse ! mov ax, es ! mov ds, ax ; Quell Segment Adresse ! add si, 160 ; Quell Offset Adresse (naechste Zeile) ' ž> kopieren ! mov cx, dx ! rep movsw ! pop si ; DS und SI restaurieren ! pop ds ; da auf CurrentColor zugegriffen wird ' ž> 'freie' Zeile ueberschreiben ! mov ah, CurrentColor ; Farbe ! mov al, %Leerzeichen ; Zeichen "Leerzeichen" ! mov cx, 80 ; 80 Words ! repne stosw ; Bildschirmschreiben END SUB FUNCTION IsVGA% () DIM Dummy AS LOCAL INTEGER ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Testet, ob eine VGA Karte vorhanden ist ' IN: -/- ' OUT: IsVGA% = %TRUE oder %FALSE Dummy% = %FALSE ! mov ax, &h1a00 ! int &h10 ! cmp al, &h1a ! jne KeineVGA Dummy% = %TRUE KeineVGA: IsVGA =Dummy% END FUNCTION SUB ProcessAnsi (Char AS BYTE) DIM BrightCol AS STATIC INTEGER DIM CursorPosSaved AS STATIC INTEGER DIM CursorXPosSaved AS STATIC INTEGER DIM CursorYPosSaved AS STATIC INTEGER DIM Parameter AS STATIC STRING DIM ParameterList(1 TO 16) AS LOCAL INTEGER DIM ParameterZahl AS LOCAL INTEGER DIM i AS LOCAL INTEGER ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' nimmt eine Ansi Sequenz auseinander. ' vorher wurde schon ein Escape geparst ' IN: Char = Sequenzzeichen ' OUT: -/- IF AnsiLevel = 2 THEN IF (Char > 47 AND Char < 58) OR Char = 59 THEN ' ž> Parameter sammeln Parameter$ = Parameter$ + CHR$ (Char): Char = 0: EXIT SUB END IF IF Char = 65 THEN ' ž> --------- CUU (Cursor nach oben) ----------------------------------------- GetParameter Parameter, ParameterZahl, ParameterList() DECR CursorXPos, ParameterList(1) IF CursorXPos <= 0 THEN CursorXPos = 1 SetCursor ELSEIF Char = 66 THEN ' ž> --------- CUD (Cursor nach unten) ---------------------------------------- GetParameter Parameter, ParameterZahl, ParameterList() INCR CursorXPos, ParameterList(1) IF CursorXPos > CurLinesPerScreen - StartXScreen - LineCompare + 1 THEN CursorXPos = CurLinesPerScreen - StartXScreen - LineCompare + 1 SetCursor ELSEIF Char = 67 THEN ' ž> --------- CUF (Cursor nach rechts) --------------------------------------- GetParameter Parameter, ParameterZahl, ParameterList() INCR CursorYPos, ParameterList(1) IF CursorYPos > 80 THEN CursorYPos = 80 SetCursor ELSEIF Char = 68 THEN ' ž> --------- CUF (Cursor nach rechts) --------------------------------------- GetParameter Parameter, ParameterZahl, ParameterList() DECR CursorYPos, ParameterList(1) IF CursorYPos <= 0 THEN CursorYPos = 1 SetCursor ELSEIF Char = 69 THEN ' ž> --------- Wiederholender CRLF -------------------------------------------- GetParameter Parameter, ParameterZahl, ParameterList() IF ParameterList (1) > 0 THEN ProcessLinefeed ParameterList(1) END IF ELSEIF Char = 70 THEN ' ž> --------- Rckw„rtiger CRLF ---------------------------------------------- GetParameter Parameter, ParameterZahl, ParameterList() IF ParameterList (1) > 0 THEN ProcessLinefeedBack ParameterList(1) END IF ELSEIF Char = 115 THEN ' ž> --------- SCP (Cursor Position speichern) -------------------------------- CursorPosSaved = %TRUE CursorXPosSaved = CursorXPos CursorYPosSaved = CursorYPos ELSEIF Char = 117 THEN ' ž> --------- RCP (Cursor Position wiederherstellen) ------------------------- IF CursorPosSaved THEN CursorXPos = CursorXPosSaved CursorYPos = CursorYPosSaved ELSE CursorXPos = 1 CursorYPos = 1 END IF SetCursor ELSEIF Char = 72 OR Char = 102 THEN ' ž> --------- CUP und HVP (Cursor Position) ---------------------------------- GetParameter Parameter, ParameterZahl, ParameterList() IF ParameterZahl = 2 THEN CursorXPos = ParameterList(1) CursorYPos = ParameterList(2) IF CursorYPos > 80 THEN CursorYPos = 80 IF CursorYPos <= 0 THEN CursorYPos = 1 IF CursorXPos <= 0 THEN CursorXPos = 1 IF CursorXPos > CurLinesPerScreen - StartXScreen - LineCompare + 1 THEN CursorXPos = CurLinesPerScreen - StartXScreen - LineCompare + 1 ELSEIF ParameterZahl = 1 THEN CursorXPos = ParameterList(1) IF CursorXPos <= 0 THEN CursorXPos = 1 IF CursorXPos > CurLinesPerScreen - StartXScreen - LineCompare + 1 THEN CursorXPos = CurLinesPerScreen - StartXScreen - LineCompare + 1 END IF SetCursor ELSEIF Char = 110 THEN ' ž> --------- DSR (Ger„testatusbericht anfordern) ---------------------------- GetParameter Parameter, ParameterZahl, ParameterList() IF ParameterList(1) = 6 THEN GebeCPRaus END IF ELSEIF Char = 74 THEN ' ž> --------- ED (Bildschirm loeschen) -------------------------------------- GetParameter Parameter, ParameterZahl, ParameterList() IF ParameterList(1) = 2 THEN ClearScreen END IF ELSEIF Char = 75 THEN ' ž> --------- EL (Zeile loeschen) ------------------------------------------- GetParameter Parameter, ParameterZahl, ParameterList() IF ParameterList(1) = 0 THEN ClearLine 1 END IF ELSEIF Char = 109 THEN ' ž> --------- SGR (Grafische Wiedergabe; setzen der Farbe) ------------------- GetParameter Parameter, ParameterZahl, ParameterList() ' ž> Auswertung *ANFANG* FOR i% = 1 TO ParameterZahl IF ParameterList(i%) = 0 THEN CurrentColor = %DefaultColor ELSEIF ParameterList(i%) = 1 THEN BIT SET CurrentColor, 3 ELSEIF ParameterList(i%) = 4 THEN IF ScreenSegment = %Mono THEN CurrentColor = CurrentColor AND &B10001001 CurrentColor = CurrentColor OR &B00000001 END IF ELSEIF ParameterList(i%) = 5 THEN BIT SET CurrentColor, %Blink ELSEIF ParameterList(i%) = 7 THEN CurrentColor = &B01110000 ELSEIF ParameterList(i%) = 8 THEN CurrentColor = 0 ELSEIF ParameterList(i%) = %VorderGrundSchwarz THEN CurrentColor = CurrentColor AND &B11111000 ELSEIF ParameterList(i%) = %VorderGrundRot THEN CurrentColor = CurrentColor OR &B00000100 CurrentColor = CurrentColor AND &B11111100 ELSEIF ParameterList(i%) = %VorderGrundGruen THEN CurrentColor = CurrentColor OR &B00000010 CurrentColor = CurrentColor AND &B11111010 ELSEIF ParameterList(i%) = %VorderGrundGelb THEN CurrentColor = CurrentColor OR &B00000110 CurrentColor = CurrentColor AND &B11111110 ELSEIF ParameterList(i%) = %VorderGrundBlau THEN CurrentColor = CurrentColor OR &B00000001 CurrentColor = CurrentColor AND &B11111001 ELSEIF ParameterList(i%) = 35 THEN CurrentColor = CurrentColor OR &B00000101 CurrentColor = CurrentColor AND &B11111101 ELSEIF ParameterList(i%) = 36 THEN CurrentColor = CurrentColor OR &B00000011 CurrentColor = CurrentColor AND &B11111011 ELSEIF ParameterList(i%) = 37 THEN CurrentColor = CurrentColor OR &B00000111 ELSEIF ParameterList(i%) = 40 THEN CurrentColor = CurrentColor AND &B10001111 ELSEIF ParameterList(i%) = 41 THEN CurrentColor = CurrentColor AND &B11001111 CurrentColor = CurrentColor OR &B01000000 ELSEIF ParameterList(i%) = 42 THEN CurrentColor = CurrentColor AND &B10101111 CurrentColor = CurrentColor OR &B00100000 ELSEIF ParameterList(i%) = 43 THEN CurrentColor = CurrentColor AND &B11101111 CurrentColor = CurrentColor OR &B01100000 ELSEIF ParameterList(i%) = 44 THEN CurrentColor = CurrentColor AND &B11101111 CurrentColor = CurrentColor OR &B00010000 ELSEIF ParameterList(i%) = 45 THEN CurrentColor = CurrentColor AND &B11011111 CurrentColor = CurrentColor OR &B01010000 ELSEIF ParameterList(i%) = 46 THEN CurrentColor = CurrentColor AND &B10111111 CurrentColor = CurrentColor OR &B00110000 ELSEIF ParameterList(i%) = 47 THEN CurrentColor = CurrentColor OR &B01110000 END IF NEXT i% ' ž> Auswertung *ENDE* ELSE ' ž> --------- Unbekannte Ansi Sequenz ---------------------------------------- END IF AnsiLevel = 0 EXIT SUB END IF IF AnsiLevel = 1 THEN IF Char = 91 THEN ' korrekter Sequenzanfang "ESC[" AnsiLevel = 2 Parameter$ = "" ELSE AnsiLevel = 0 FastPrint Char END IF END IF END SUB SUB SetCursor () ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' setzt den Cursor neu ' IN: -/- ' OUT: -/- IF ShowCursorDuringPrint THEN LOCATE CursorXPos + StartXScreen - 1, CursorYPos, %TRUE END IF END SUB SUB ProcessLinefeed (Anzahl AS INTEGER) DIM Zaehler AS LOCAL INTEGER ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' bewegt den Cursor eins runter ' IN: Anzahl der Linefeeds ' OUT: -/- CursorYPos = 1 FOR Zaehler% = 1 TO Anzahl% ! inc CursorXPos IF CursorXPos > CurLinesPerScreen - StartXScreen - LineCompare + 1 THEN ! dec CursorXPos MoveScreenUP END IF NEXT Zaehler% SetCursor END SUB SUB ProcessLinefeedBack (Anzahl AS INTEGER) DIM Zaehler AS LOCAL INTEGER ' ž> ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' bewegt den Cursor eins runter ' IN: Anzahl der Linefeeds ' OUT: -/- CursorYPos = 1 FOR Zaehler% = 1 TO Anzahl% ! dec CursorXPos IF CursorXPos = 0 THEN CursorXPos = 1 MoveScreenDown END IF NEXT Zaehler% SetCursor END SUB