'=========================================================================== ' Subject: SVGA LIBRARY V2.00 Date: 12-16-98 (13:23) ' Author: Joshua Penman Code: QB, PDS ' Origin: jpenman@hotmail.com Packet: GRAPHICS.ABC '=========================================================================== ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' ³ SVGA Library for QuickBasic 4.5 version 2.00 ³ ' ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ' ³ þ WHAT THIS IS: ³ ' ³ This is a the second version of a library that I wrote for QuickBasic ³ ' ³ to draw graphics on the VESA card. It's been enhanced from version ³ ' ³ 1.00 in that it now supports 5 VESA modes. I have also removed page ³ ' ³ features at this stage, but will add them again when I learn how to ³ ' ³ switch video pages. ³ ' ³ þ DISCLAIMER: ³ ' ³ Okay, here's the legal side of it. I, Joshua Penman, take 100% full ³ ' ³ credit for this code, and I retain all rights to it. I will however, ³ ' ³ allow any programmers to use this in their on code without any thanks ³ ' ³ to me. Sure, a little bit of thanks in the credits would be nice, but ³ ' ³ all I really would want is a couple of the program that uses this ³ ' ³ library. You are *NOT* however, allowed to distribute modified copies ³ ' ³ of the library, as that wouldn't be kind to me, and you may also not ³ ' ³ use this code as a "copy/paste" thing for you're own SVGA libraries, ³ ' ³ in other words, don't copy and of this and claim it's you're own. And ³ ' ³ finally, if you're moniter blows up, you're computer starts smoking, ³ ' ³ or 14 SB channels stuff up, it's you're problem, not mine. I, and ³ ' ³ Cybersoft Software will not be held responsible for anything like ³ ' ³ that, or for that matter anything else happening to you're computer, ³ ' ³ even if it can be proven that SVGALIB caused the trouble. Okay, so I ³ ' ³ don't take 100% credit, but I don't really know who wrote the screen ³ ' ³ switching routines, so I can't give them credit... ³ ' ³ þ ABOUT ME: ³ ' ³ Before we actually get into explaining the code, here's a bit about ³ ' ³ me. I live in New Zealand, which, unlike many of you will no-doubt ³ ' ³ think - it's not in Sydney harbour. This is my second SVGA library & ³ ' ³ it's a lot better than my first, but I've done no speed enhancing. I ³ ' ³ will do that in the next version 2.10, which will make it heaps ³ ' ³ faster. ³ ' ³ þ THANKS TO: ³ ' ³ I have to thank a few people for the help in this program, mainly the ³ ' ³ following people: Jim Emptage for his Beizer curve routine, although ³ ' ³ I didn't actually use his code in the end, and while I said last time ³ ' ³ that I'd put it sometime, I still haven't, but he still gets credit ³ ' ³ and Rich Geldreich for his Eclipse routine, because there's no easy ³ ' ³ way to do circles, but his way did it great. I'd also like to thank ³ ' ³ Andrew L Agers for his Blast! library, and really the sub on Line ³ ' ³ drawing. I didn't copy any of his code, but it made me get a move on ³ ' ³ with my own programming code. ³ ' ³ þ HOW TO USE: ³ ' ³ SVGALib requires QB.QLB and QB.BI, so load QB with QB /l, and the ³ ' ³ first line of you're program needs to be '$include: 'qb.bi', and then ³ ' ³ it's really up to you. You need to call SVGASetMode, to start it up. ³ ' ³ You give different parameters to the sub to specify different modes: ³ ' ³ &H3 - DOS text (call this before you end ³ ' ³ &H100 - 640x400x256 ³ ' ³ &H101 - 640x480x256 ³ ' ³ &H103 - 800x600x256 ³ ' ³ &H105 - 1024x768x256 ³ ' ³ &H107 - 1280x1024x256 ³ ' ³ þ VERSION INFO: ³ ' ³ Version 1.00 * origional version ³ ' ³ Version 2.00 * Added switch-banks ³ ' ³ * Slightly optimised line drawing ³ ' ³ þ WHERE'S SVGALIB GOING FROM HERE: ³ ' ³ In future, I hope to expand to 100s more VESA modes, and add more ³ ' ³ rotines to duplicate the QB routines better. I'll try to add a 16.8 ³ ' ³ million colour mode too. I also hope to add heaps more SUBs like ³ ' ³ POINT and GET. ³ ' ³ þ CONTACTING ME: ³ ' ³ While I've got heaps of E-mails addresses, use jpenman@hotmail.com, ³ ' ³ that way I know exactly what you're talking about. ³ ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Declare SUBs ' ÄÄÄÄÄÄÄÄÄÄ DECLARE SUB SVGABox (x1%, y1%, x2%, y2%, C%) DECLARE SUB SVGAFilledBox (x1%, y1%, x2%, y2%, C%) DECLARE SUB SVGACircle (ox!, oy!, prx!, pry!, co%) DECLARE SUB SVGALine (x1%, y1%, x2%, y2%, C%) DECLARE SUB SVGASwitchBank (NewBank%) DECLARE SUB SVGAPset (x%, y%, C%) DECLARE SUB SVGASetMode (ModeNumber%) ' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' Other stuff needed ' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ '$DYNAMIC '$INCLUDE: 'qb.bi' DEFINT A-Z DIM SHARED InRegs AS RegType DIM SHARED OutRegs AS RegType DIM SHARED Bank% DIM SHARED Table&(0 TO 1) DIM SHARED Xres AS LONG DIM SHARED YRes AS LONG ' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ' My Demo - delete ' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ SVGASetMode &H101 FOR x = 0 TO Xres - 1 FOR y = 0 TO YRes - 1 SVGAPset x, y, 10 NEXT y NEXT x SVGALine 0, 0, Xres - 1, YRes - 1, 2 SVGACircle Xres / 2 - 1, YRes / 2 - 1, Xres / 2 - 1, YRes / 2 - 1, 1 SVGABox Xres / 2 - (Xres / 6), YRes / 2 - (YRes / 6), Xres / 2 + (Xres / 6), YRes / 2 + (YRes / 6), 4 SVGAFilledBox Xres / 2 - (Xres / 6) + (Xres / 12), YRes / 2 - (YRes / 6) + (YRes / 12), Xres / 2 + (Xres / 6) - (Xres / 12), YRes / 2 + (YRes / 6) - (YRes / 12), 5 a$ = INPUT$(1) SVGASetMode &H3 REM $STATIC DEFSNG A-Z ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' ³ SVGABox ³ ' ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ' ³ ³ ' ³ Purpose: This draws a box using the routine SVGALine from x1%, y1% to ³ ' ³ x2%, y2% in colour c% ³ ' ³ ³ ' ³ Alogrithm: A simple alogrithm. Draw's four lines, the first one being ³ ' ³ The top, the second the bottom, the third the left and the ³ ' ³ fourth is the right. ³ ' ³ ³ ' ³ Input: x1% - Left edge ³ ' ³ x2% - Right edge ³ ' ³ y1% - Top edge ³ ' ³ y2% - Bottom edge ³ ' ³ c% - Colour of circle ³ ' ³ ³ ' ³ Output: None ³ ' ³ ³ ' ³ Interface Assumptions: None ³ ' ³ ³ ' ³ Modification History: version 1.00 - * initial release ³ ' ³ * Removed assumptions ³ ' ³ ³ ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SUB SVGABox (x1%, y1%, x2%, y2%, C%) IF x1% < 0 THEN EXIT SUB 'off the left, then exit IF x2% > Xres - 1 THEN EXIT SUB 'off the right, then exit IF y1% < 0 THEN EXIT SUB 'off the top, then exit IF y2% > YRes - 1 THEN EXIT SUB 'off the bottom, then exit SVGALine x1%, y1%, x2%, y1%, C% 'top line SVGALine x1%, y2%, x2%, y2%, C% 'bottom line SVGALine x1%, y1%, x1%, y2%, C% 'left line SVGALine x2%, y1%, x2%, y2%, C% 'right line END SUB ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' ³ SVGACircle ³ ' ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ' ³ ³ ' ³ Purpose: This draws a circle with it's centre at ox, oy, color co% ³ ' ³ with the X width of PRX and the Y width of PYR ³ ' ³ ³ ' ³ Alogrithm: A comlex alogrithm - no-one understands it... (copied from ³ ' ³ an ABC packet and modified for SVGA) ³ ' ³ ³ ' ³ Input: ox - X center of circle ³ ' ³ oy - Y center of circle ³ ' ³ prx - X width of circle ³ ' ³ pry - Y width of circle ³ ' ³ co% - Colour of circle ³ ' ³ ³ ' ³ Output: None ³ ' ³ ³ ' ³ Interface Assumptions: None ³ ' ³ ³ ' ³ Modification History: version 1.00 - * initial release ³ ' ³ version 2.00 - * removed assumptions ³ ' ³ * fixed problem with lines ³ ' ³ ³ ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SUB SVGACircle (ox, oy, prx, pry, co%) DIM xe AS LONG, ye AS LONG, e AS LONG IF pry = 0 THEN SVGALine (ox - prx), (oy), (ox + prx), (oy), co% EXIT SUB END IF IF prx = 0 THEN SVGALine (ox), (oy - pry), (ox), (oy + pry), co% EXIT SUB END IF IF pry <= prx THEN x = 0: y = pry xe = 0: ye = CLNG(prx) * prx e = -ye \ 2: C = ye \ pry DO IF e <= 0 THEN DO SVGAPset (ox + x), (oy + y), co%: SVGAPset (ox - x), (oy + y), co% SVGAPset (ox + x), (oy - y), co%: SVGAPset (ox - x), (oy - y), co% x = x + 1 xe = xe + pry e = e + xe LOOP WHILE e <= 0 ELSE SVGAPset (ox + x), (oy + y), co%: SVGAPset (ox - x), (oy + y), co% SVGAPset (ox + x), (oy - y), co%: SVGAPset (ox - x), (oy - y), co% END IF y = y - 1 ye = ye - C e = e - ye LOOP UNTIL y = 0 SVGAPset (ox + x), (oy), co%: SVGAPset (ox - x), (oy), co% SVGAPset (ox + x), (oy), co%: SVGAPset (ox - x), (oy), co% ELSE x = 0: y = prx xe = 0: ye = CLNG(pry) * pry e = -ye \ 2: C = ye \ prx DO IF e <= 0 THEN DO SVGAPset (ox + y), (oy + x), co%: SVGAPset (ox - y), (oy + x), co% SVGAPset (ox + y), (oy - x), co%: SVGAPset (ox - y), (oy - x), co% x = x + 1 xe = xe + prx e = e + xe LOOP WHILE e <= 0 ELSE SVGAPset (ox + y), (oy + x), co%: SVGAPset (ox - y), (oy + x), co% SVGAPset (ox + y), (oy - x), co%: SVGAPset (ox - y), (oy - x), co% END IF y = y - 1 ye = ye - C e = e - ye LOOP UNTIL y = 0 SVGAPset (ox), (oy + x), co%: SVGAPset (ox), (oy + x), co% SVGAPset (ox), (oy - x), co%: SVGAPset (ox), (oy - x), co% END IF END SUB DEFINT A-Z ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' ³ SVGAFilledBox ³ ' ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ' ³ ³ ' ³ Purpose: This draws a box using the routine SVGALine from x1%, y1% to ³ ' ³ x2%, y2% in colour c% ³ ' ³ ³ ' ³ Alogrithm: A simple alogrithm. ³ ' ³ ³ ' ³ Input: x1% - Left edge ³ ' ³ x2% - Right edge ³ ' ³ y1% - Top edge ³ ' ³ y2% - Bottom edge ³ ' ³ c% - Colour of circle ³ ' ³ ³ ' ³ Output: None ³ ' ³ ³ ' ³ Interface Assumptions: None ³ ' ³ ³ ' ³ Modification History: version 1.00 - * initial release ³ ' ³ version 2.00 - * removed assumptions ³ ' ³ ³ ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SUB SVGAFilledBox (x1%, y1%, x2%, y2%, C%) IF x1% < 0 THEN EXIT SUB 'off the left, then exit IF x2% > Xres - 1 THEN EXIT SUB 'off the right, then exit IF y1% < 0 THEN EXIT SUB 'off the top, then exit IF y2% > YRes - 1 THEN EXIT SUB 'off the bottom, then exit FOR y% = y1% TO y2% 'start loop SVGALine x1%, y%, x2%, y%, C% 'draw the line NEXT y% 'loop... END SUB DEFSNG A-Z ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' ³ SVGALine ³ ' ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ' ³ ³ ' ³ Purpose: Draws a line in SVGA from x1%, y1% to x2%, y2% in colour c% ³ ' ³ ³ ' ³ Alogrithm: This alogrithm has changed quite a lot since version 1.00, ³ ' ³ in that it can now be up to 500% faster (only on lines that ³ ' ³ were 2 pixels big). I'm using Pythagora's Therom to calcula- ³ ' ³ te the number of pixels to be drawn, and I'm only drawing ³ ' ³ that many, unlike version 1.00 which drew 1000 no matter how ³ ' ³ long it was. ³ ' ³ ³ ' ³ Input: x1% - Left edge ³ ' ³ x2% - Right edge ³ ' ³ y1% - Top edge ³ ' ³ y2% - Bottom edge ³ ' ³ c% - Colour of line ³ ' ³ ³ ' ³ Output: None ³ ' ³ ³ ' ³ Interface Assumptions: None ³ ' ³ ³ ' ³ Modification History: version 1.00 - * initial release ³ ' ³ version 2.00 - * Put in an alogrythim ³ ' ³ * removed assumptions ³ ' ³ ³ ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SUB SVGALine (x1%, y1%, x2%, y2%, C%) IF x2% < x1% THEN SWAP x1%, x2% 'switch if varibles are wrong IF y2% < y1% THEN SWAP y1%, y2% 'switch if varibles are wrong IF x1% < 0 THEN x1% = 0 'if off the left IF x2% > Xres - 1 THEN x2% = Xres - 1 'if off the right IF y1% < 0 THEN y1% = 0 'if off the top IF y2% > YRes - 1 THEN y2% = YRes - 1 'if off the bottom IF C% < 0 THEN EXIT SUB 'invalid colour, then exit WHILE C% > 255 'loop until c% is valid C% = C% - 255 'subtract 255 WEND 'loop TotalMoveSqrd = ((x2% - x1%) ^ 2) + ((y2% - y1%) ^ 2)'calculate the total TotalMove = SQR(TotalMoveSqrd) 'number of pixels in the line (Pythagoras) XStep = (x2% - x1%) / TotalMove 'calculate x move per step YStep = (y2% - y1%) / TotalMove 'calculate y move per step StartX = x1% 'set for later calculations StartY = y1% 'set for later calculations FOR i = 1 TO TotalMove 'start the loop SVGAPset StartX + (XStep * (i - 1)), StartY + (YStep * (i - 1)), C% NEXT i ' <<< loop ^^^ Pset at right place END SUB ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' ³ SVGAPset ³ ' ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ' ³ ³ ' ³ Purpose: Draws a dot at location x%, y%, in colour c% ³ ' ³ ³ ' ³ Alogrithm: None. ³ ' ³ ³ ' ³ Input: x% - Pixel X co-ord ³ ' ³ x% - Pixel Y co-ord ³ ' ³ c% - Colour of pixel ³ ' ³ ³ ' ³ Output: None ³ ' ³ ³ ' ³ Interface Assumptions: None ³ ' ³ ³ ' ³ Modification History: version 1.00 - * initial release ³ ' ³ version 2.00 - * Added "lookup" table ³ ' ³ * Added Switch banks ³ ' ³ * Removed all assumptions ³ ' ³ ³ ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SUB SVGAPset (x%, y%, C%) IF x% < 0 THEN EXIT SUB 'off the left, then exit IF y% < 0 THEN EXIT SUB 'off the top, then exit IF x% > Xres - 1 THEN EXIT SUB 'off the right, then exit IF y% > YRes - 1 THEN EXIT SUB 'off the bottom, then exit IF C% < 0 THEN EXIT SUB 'invalid colour, then exit WHILE C% > 255 'loop until c% is valid C% = C% - 255 'subtract 255 WEND 'loop DEF SEG = &HA000 'set video segment NewBank% = (Table&(y%) + x%) \ 65536 'calculate bank IF NewBank% <> Bank% THEN SVGASwitchBank NewBank% 'Switchbank POKE (Table&(y%) + x% + 1) MOD 65536, C% 'Actual PSET END SUB ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' ³ SVGASetMode ³ ' ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ' ³ ³ ' ³ Purpose: Sets screen to and compatible mode ³ ' ³ ³ ' ³ Alogrithm: None ³ ' ³ ³ ' ³ Input: ModeNumber% - &H100 (640x400x256) ³ ' ³ &H101 (640x480x256) ³ ' ³ &H103 (800x600x256) ³ ' ³ &H105 (1024x768x256) ³ ' ³ &H107 (1280x1024x256) ³ ' ³ &H3 (Standard DOS text) ³ ' ³ ³ ' ³ Output: None ³ ' ³ ³ ' ³ Interface Assumptions: Mode number one of the above ³ ' ³ ³ ' ³ Modification History: version 1.00 - * Initial release ³ ' ³ version 2.00 - * Added different mode numbers ³ ' ³ * Added a "look-up" table ³ ' ³ * Added "switch-bank" support ³ ' ³ * Added XRes and YRes for errors ³ ' ³ * Added a standard mode return ³ ' ³ ³ ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SUB SVGASetMode (ModeNumber%) InRegs.ax = &H4F02 'Set function number InRegs.bx = ModeNumber% 'Set varible INTERRUPT &H10, InRegs, OutRegs 'Call Interrupt IF ModeNumber% = &H3 THEN EXIT SUB 'If Text, then quit now IF ModeNumber% = &H100 THEN Xres = 640: YRes = 400 'case mode IF ModeNumber% = &H101 THEN Xres = 640: YRes = 480 'case mode IF ModeNumber% = &H103 THEN Xres = 800: YRes = 600 'case mode IF ModeNumber% = &H105 THEN Xres = 1024: YRes = 768 'case mode IF ModeNumber% = &H107 THEN Xres = 1280: YRes = 1024 'case mode IF Xres = 0 THEN Xres = 1: YRes = 1 'stops error if non-standard mode REDIM Table&(0 TO YRes - 1) 're-setup's Lookup table FOR x% = 0 TO YRes - 1 'Start make loop Table&(x%) = x% * Xres - 1 'Stick in info NEXT x% 'Loop... END SUB ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' ³ SVGASwitchBank ³ ' ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ' ³ ³ ' ³ Purpose: Switches the bank ³ ' ³ ³ ' ³ Alogrithm: None ³ ' ³ ³ ' ³ Input: NewBank% ³ ' ³ ³ ' ³ Output: None ³ ' ³ ³ ' ³ Interface Assumptions: Valid NewBank% ³ ' ³ ³ ' ³ Modification History: version 2.00 - * Initial release ³ ' ³ ³ ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SUB SVGASwitchBank (NewBank%) InRegs.ax = &H4F05 'set function number InRegs.bx = 0 'set to 0 InRegs.dx = NewBank% 'set to new bank INTERRUPT &H10, InRegs, OutRegs 'call interrupt Bank% = NewBank% 'update bank varible END SUB