'=========================================================================== ' Subject: ANSI SCREEN CAPTURE TSR Date: 10-09-95 (00:00) ' Author: Jamshid Khoshrangi Code: PB32 ' Origin: FidoNet POWER_BAS Echo Packet: PB.ABC '=========================================================================== $IF 0 SCR2ANS.BAS ScreenToAnsi SCR2ANS.BAS Version 1.0 Copyright 1995 by AhuraMazda(tm) Software Written by Jamshid Khoshrangi NOTES: Since this program uses pointers, it is PB 3.2 compatible only. This rough and dirty little TSR captures an 80x25 text screen to a file called SCREEN.ANS in the root directory of the c: drive. The file contains the appropriate ANSI codes to reproduce the captured screen exactly either in an ANSI emulator, or through an ANSI console driver like ANSI.SYS. The codes themselves are not optimized as well as they could be. Jamshid $ENDIF $ERROR ALL OFF $LIB ALL OFF $STRING 1 $COM 0 $SOUND 1 DEFINT A-Z %Black = 0 : %LowBlue = 1 : %LowGreen = 2 : %LowCyan = 3 %LowRed = 4 : %LowMagenta = 5 : %Brown = 6 : %LowWhite = 7 %Gray = 8 : %HighBlue = 9 : %HighGreen = 10: %HighCyan = 11 %HighRed = 12: %HighMagenta= 13: %Yellow = 14: %HighWhite = 15 %Blink = 16: %CursorOff = 0 : %CursorOn = 1 %FOREGROUND = 1 %BACKGROUND = 2 TYPE Video char AS BYTE attr AS BYTE END TYPE DIM cell AS Video PTR ' Program begins here! IF BIT(pbvScrnCard, 0) THEN cell = &HB000?? * 65536?? ELSE cell = &HB800?? * 65536?? END IF X& = SETMEM(-700000) X& = SETMEM(10000) POPUP KEY CHR$(12, 30, 247) ' CTRL-ALT-A DO POPUP SLEEP USING EMS IF DIR$("C:\SCREEN.ANS") <> "" THEN KILL "C:\SCREEN.ANS" END IF OPEN "C:\SCREEN.ANS" FOR BINARY AS #1 Temp$ = CHR$(27) + "[0m" + CHR$(27) + "[2J" PUT #1, , Temp$ OldForeColor = 7 OldBackColor = 0 FOR Row = 1 TO 25 $IF 0 Temp$ = CHR$(27) + "[" + LTRIM$(RTRIM$(STR$(Row))) + "H" PUT #1, , Temp$ OldForeColor = 7 OldBackColor = 0 OldBold = 0 OldBlink = 0 $ENDIF FOR Column = 1 TO 80 attr = @cell.attr ForeColor = Attr MOD 16 BackColor = Attr \ 16 Bold = BIT(ForeColor, 3) Blink = BIT(BackColor, 3) OutAnsi$ = "" IF Bold <> OldBold OR Blink <> OldBlink THEN OutAnsi$ = CHR$(27) + "[0" OldBold = Bold OldBlink = Blink END IF IF ForeColor <> OldForeColor OR BackColor <> OldBackColor THEN SELECT CASE OutAnsi$ CASE "" OutAnsi$ = CHR$(27) + "[" CASE ELSE OutAnsi$ = OutAnsi$ + ";" END SELECT IF ForeColor <> OldForeColor THEN OldForeColor = ForeColor OutAnsi$ = OutAnsi$ +_ ToAnsiColor(ForeColor, %FOREGROUND) END IF IF BackColor <> OldBackColor THEN IF LEN(OutAnsi$) > 2 THEN OutAnsi$ = OutAnsi$ + ";" END IF OldBackColor = BackColor OutAnsi$ = OutAnsi$ +_ ToAnsiColor(BackColor, %BACKGROUND) END IF OutAnsi$ = OutAnsi$ + "m" PUT #1, , OutAnsi$ ELSE SELECT CASE OutAnsi$ CASE "" CASE ELSE OutAnsi$ = OutAnsi$ + "m" PUT #1, , OutAnsi$ END SELECT END IF PUT #1, , @cell.char INCR cell, 2 NEXT Column NEXT Row Temp$ = CHR$(27) + "[8m" PUT #1, , Temp$ CLOSE #1 BEEP 2 LOOP FUNCTION ToAnsiColor (_ Attr AS INTEGER,_ Ground AS INTEGER) AS STRING SELECT CASE Attr CASE %Black : Temp$ = "x0" CASE %LowBlue : Temp$ = "x4" CASE %LowGreen : Temp$ = "x2" CASE %LowCyan : Temp$ = "x6" CASE %LowRed : Temp$ = "x1" CASE %LowMagenta : Temp$ = "x5" CASE %Brown : Temp$ = "x3" CASE %LowWhite : Temp$ = "x7" CASE %Gray : Temp$ = "n;x0" CASE %HighBlue : Temp$ = "n;x4" CASE %HighGreen : Temp$ = "n;x2" CASE %HighCyan : Temp$ = "n;x6" CASE %HighRed : Temp$ = "n;x1" CASE %HighMagenta : Temp$ = "n;x5" CASE %Yellow : Temp$ = "n;x3" CASE %HighWhite : Temp$ = "n;x7" END SELECT SELECT CASE Ground CASE %FOREGROUND REPLACE "x" WITH "3" IN Temp$ REPLACE "n" WITH "1" IN Temp$ CASE %BACKGROUND REPLACE "x" WITH "4" IN Temp$ REPLACE "n" WITH "5" IN Temp$ END SELECT FUNCTION = Temp$ END FUNCTION