BBS: Inland Empire Archive Date: 07-28-92 (21:55) Number: 98 From: MATT HART Refer#: NONE To: MARK KO Recvd: NO Subj: Graphics Screen Conf: (2) Quik_Bas
MK> Does anyone know how to save the graphics screen for 640x480x16, VGA? MK> Also, using a binary file?"BSAVE", not a text file... ' ' GSAVES.BAS by Matt Hart ' Save/Restore multiple graphics screens in ' any mode to a single file. ' ' Compile with /AH for huge arrays and ' /X for error trapping with RESUME NEXT ' ' The data is stored as follows: ' 1 Byte : Monitor Type ' 1 Byte : Screen Mode (0-13) ' For VGA monitors, the palette (long integers) ' is stored next for screens 11, 12, and 13 ' ' Screen Mode Number of Bytes Number of Attributes ' 11 8 2 ' 12 64 16 ' 13 1024 256 ' DEFINT A-Z DECLARE FUNCTION CalcBytes&(X,Y,BPP,P) TYPE RegTypeX ax AS INTEGER bx AS INTEGER cx AS INTEGER dx AS INTEGER bp AS INTEGER si AS INTEGER di AS INTEGER flags AS INTEGER ds AS INTEGER es AS INTEGER END TYPE ' CONST False = 0 CONST True = NOT False ' ON ERROR GOTO ErrorTrap ' REDIM NumBytes&(0 TO 13) NumBytes&(0) = 4000& NumBytes&(1) = CalcBytes&(320,200,2,1) NumBytes&(2) = CalcBytes&(640,200,1,1) NumBytes&(3) = CalcBytes&(720,348,1,1) NumBytes&(7) = CalcBytes&(320,200,1,4) NumBytes&(8) = CalcBytes&(640,200,1,4) NumBytes&(9) = CalcBytes&(640,350,1,4) NumBytes&(10) = CalcBytes&(640,350,1,2) NumBytes&(11) = CalcBytes&(640,480,1,1) NumBytes&(12) = CalcBytes&(640,480,1,4) NumBytes&(13) = CalcBytes&(320,200,8,1) ' FileName$ = "SCREENS.BIN" ' Example 1 : Screen 0 CLS : PRINT "This is Screen 0" COLOR 14 : PRINT " This is Screen 0" Mon = 0 : ScrMode = 0 : ScreenNum = 1 CALL SaveScreen(FileName$, Mon, ScrMode, ScreenNum, NumBytes&(), Ecode) CLS CALL RestoreScreen(FileName$, ScreenNum, NumBytes&(), Ecode) END ' Parameters are: ' FileName$ = File to save the screen to ' Mon = Monitor Type ' 0 = Monochrome/Text Only ' 1 = Hercules ' 2 = CGA ' 3 = EGA ' 4 = VGA ' ScrMode = Current Screen Mode (0-13) ' ScreenNum = Screen Number to Save ' Will return with the last screen ' number in the file if ScreenNum ' was greater than the last screen + 1 ' NumBytes&() = Array containing the number of bytes ' needed to save a screen ' Ecode = 0 if no error, 1 if ' ScreenNum already exists and ' is not the same ScrMode and Mon, ' or -1 if some other error. ' ErrorTrap: Ecode = True RESUME NEXT ' SUB SaveScreen(FileName$, Mon, ScrMode, ScreenNum, NumBytes&(), Ecode) Ecode = False Buf = FreeFile OPEN "B",Buf,FileName$ : IF Ecode THEN EXIT SUB CurScr = 1 : CurPos& = 1 DO IF EOF(Buf) THEN EXIT DO M$=" " : S$=" " : GET Buf,,M$ : GET Buf,,S$ M=ASC(M$) : S=ASC(S$) : CurPos& = CurPos& + 2 IF CurScr = ScreenNum THEN IF M=Mon AND S=ScrMode THEN SEEK #Buf, CurPos& - 2 EXIT DO ELSE Ecode = 1 EXIT DO ENDIF ELSE IF M=4 THEN SELECT CASE S CASE 11 : CurPos& = CurPos& + 8& CASE 12 : CurPos& = CurPos& + 64& CASE 13 : CurPos& = CurPos& + 1024& END SELECT ENDIF CurPos& = CurPos& + NumBytes&(S) SEEK #Buf, CurPos& IF Ecode THEN EXIT DO ' a DOS Error CurScr = CurScr + 1 ENDIF LOOP IF Ecode <> 0 THEN GOTO SS.Ending ScreenNum = CurScr A$=CHR$(Mon)+CHR$(ScrMode) : PUT #Buf,,A$ IF Ecode THEN GOTO SS.Ending ' DOS Error REDIM Saver&(1 TO NumBytes&(ScrMode)) SaveSeg = VARSEG(Saver&(1)) SaveAdd& = VARPTR(Saver&(1)) SELECT CASE ScrMode CASE 0 FOR P=0 TO 3999 DEF SEG = &HB000 : Z=PEEK(P) DEF SEG = SaveSeg : POKE SaveAdd&+P,Z NEXT P DEF SEG CASE 1,7,13 : GET (0,0)-(319,199),Saver& CASE 2,8 : GET (0,0)-(639,199),Saver& CASE 3 : GET (0,0)-(719,347),Saver& CASE 9,10 : GET (0,0)-(639,349),Saver& CASE 11,12 : GET (0,0)-(639,479),Saver& END SELECT IF Ecode THEN GOTO SS.Ending ' Wrong Screen mode probably IF Mon = 4 THEN SELECT CASE S CASE 11 : NumPal = 2 CASE 12 : NumPal = 16 CASE 13 : NumPal = 256 CASE ELSE : NumPal = 0 END SELECT IF NumPal > 0 THEN DIM InRegs AS RegTypeX
Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET