From bc7026f20fadb4c98e0dbf4786296731e69c849f Mon Sep 17 00:00:00 2001 From: sparky4 <sparky4@cock.li> Date: Thu, 12 Nov 2015 14:05:10 -0600 Subject: [PATCH] in the process of converting xlib into watcom friendly --- modex105/ASM.BAT | 1 - modex105/DEMOS/BASIC7/CHARDEMO.BAS | 164 -- modex105/DEMOS/BASIC7/MAKE-LIB.BAT | 5 - modex105/DEMOS/BASIC7/MODEX.BI | 63 - modex105/DEMOS/BASIC7/MODEX.QLB | Bin 11141 -> 0 bytes modex105/DEMOS/BASIC7/TEST6.BAS | 562 ---- modex105/DEMOS/BASIC7/UASM-BC7.BAT | 1 - modex105/DEMOS/BASIC7/UTILS.ASM | 406 --- modex105/DEMOS/BASIC7/UTILS.BI | 51 - modex105/DEMOS/C/C_UTILS.ASM | 405 --- modex105/DEMOS/C/C_UTILS.H | 117 - modex105/DEMOS/C/C_UTILS.LST | 597 ---- modex105/DEMOS/C/C_UTILS.SBR | Bin 1731 -> 0 bytes modex105/DEMOS/C/MODEX.ASM | 3295 ---------------------- modex105/DEMOS/C/MODEX.BI | 63 - modex105/DEMOS/C/MODEX.H | 76 - modex105/DEMOS/C/UTLS-ASM.BAT | 1 - modex105/DEMOS/C/X-DEMO.C | 780 ------ modex105/DEMOS/C/X-DEMO.EXE | Bin 41090 -> 0 bytes modex105/DEMOS/C/X-DEMO.PRJ | Bin 5188 -> 0 bytes modex105/DEMOS/C/x.exe | Bin 41090 -> 0 bytes modex105/DEMOS/CHARDEMO.EXE | Bin 13066 -> 0 bytes modex105/DEMOS/PASCAL/TEST5.PAS | 488 ---- modex105/DEMOS/QB45/MAKE-LIB.BAT | 5 - modex105/DEMOS/QB45/MODEX.BI | 63 - modex105/DEMOS/QB45/MODEX.QLB | Bin 9739 -> 0 bytes modex105/DEMOS/QB45/TEST6A.BAS | 561 ---- modex105/DEMOS/QB45/TEST6A.EXE | Bin 40544 -> 0 bytes modex105/DEMOS/QB45/UASM-QB4.BAT | 1 - modex105/DEMOS/QB45/UTILS.ASM | 406 --- modex105/DEMOS/QB45/UTILS.BI | 51 - modex105/DEMOS/ROM_8X8.FNT | Bin 1024 -> 0 bytes modex105/DEMOS/SPACEAGE.FNT | Bin 1024 -> 0 bytes modex105/DEMOS/SYSTEM.FNT | Bin 1024 -> 0 bytes modex105/DEMOS/TEST6.EXE | Bin 19990 -> 0 bytes modex105/FONTEDIT/CHARSETS.CS | Bin 2144 -> 0 bytes modex105/FONTEDIT/CSEDIT.DOC | 196 -- modex105/FONTEDIT/CSEDIT.EXE | Bin 68368 -> 0 bytes modex105/FONTEDIT/INVERSE.FNT | Bin 1024 -> 0 bytes modex105/FONTEDIT/MOUSEIMG.CS | Bin 128 -> 0 bytes modex105/FONTEDIT/PALETTE.CS | Bin 768 -> 0 bytes modex105/FONTEDIT/ROM_8X8.FNT | Bin 1024 -> 0 bytes modex105/FONTEDIT/SPACEAGE.FNT | Bin 1024 -> 0 bytes modex105/FONTEDIT/SYSTEM.FNT | Bin 1024 -> 0 bytes modex105/MODE-X.TXT | 44 - modex105/MODEX.ASM | 3295 ---------------------- modex105/MODEX.BI | 63 - modex105/MODEX.H | 76 - modex105/MODEX.LST | 4122 ---------------------------- modex105/MODEX.SBR | Bin 12235 -> 0 bytes modex105/PACKING.LST | 87 - modex105/PALEDIT/BAKAPI.PAL | Bin 768 -> 0 bytes modex105/PALEDIT/CHARSETS.CS | Bin 2144 -> 0 bytes modex105/PALEDIT/DIAGONAL.PAL | Bin 768 -> 0 bytes modex105/PALEDIT/GAMECOLR.PAL | Bin 768 -> 0 bytes modex105/PALEDIT/MOUSEIMG.CS | Bin 128 -> 0 bytes modex105/PALEDIT/PALEDIT.DOC | 166 -- modex105/PALEDIT/PALEDIT.EXE | Bin 70230 -> 0 bytes modex105/PALEDIT/PALVIEW.EXE | Bin 10358 -> 0 bytes modex105/PALEDIT/PRIME.PAL | Bin 768 -> 0 bytes modex105/PALEDIT/RGB.PAL | Bin 768 -> 0 bytes modex105/PALEDIT/SCROLL.PAL | Bin 768 -> 0 bytes modex105/README.DOC | 76 - modex105/modex105.zip | Bin 264999 -> 0 bytes 64 files changed, 16287 deletions(-) delete mode 100755 modex105/ASM.BAT delete mode 100755 modex105/DEMOS/BASIC7/CHARDEMO.BAS delete mode 100755 modex105/DEMOS/BASIC7/MAKE-LIB.BAT delete mode 100755 modex105/DEMOS/BASIC7/MODEX.BI delete mode 100755 modex105/DEMOS/BASIC7/MODEX.QLB delete mode 100755 modex105/DEMOS/BASIC7/TEST6.BAS delete mode 100755 modex105/DEMOS/BASIC7/UASM-BC7.BAT delete mode 100755 modex105/DEMOS/BASIC7/UTILS.ASM delete mode 100755 modex105/DEMOS/BASIC7/UTILS.BI delete mode 100755 modex105/DEMOS/C/C_UTILS.ASM delete mode 100755 modex105/DEMOS/C/C_UTILS.H delete mode 100755 modex105/DEMOS/C/C_UTILS.LST delete mode 100755 modex105/DEMOS/C/C_UTILS.SBR delete mode 100755 modex105/DEMOS/C/MODEX.ASM delete mode 100755 modex105/DEMOS/C/MODEX.BI delete mode 100755 modex105/DEMOS/C/MODEX.H delete mode 100755 modex105/DEMOS/C/UTLS-ASM.BAT delete mode 100755 modex105/DEMOS/C/X-DEMO.C delete mode 100755 modex105/DEMOS/C/X-DEMO.EXE delete mode 100755 modex105/DEMOS/C/X-DEMO.PRJ delete mode 100755 modex105/DEMOS/C/x.exe delete mode 100755 modex105/DEMOS/CHARDEMO.EXE delete mode 100755 modex105/DEMOS/PASCAL/TEST5.PAS delete mode 100755 modex105/DEMOS/QB45/MAKE-LIB.BAT delete mode 100755 modex105/DEMOS/QB45/MODEX.BI delete mode 100755 modex105/DEMOS/QB45/MODEX.QLB delete mode 100755 modex105/DEMOS/QB45/TEST6A.BAS delete mode 100755 modex105/DEMOS/QB45/TEST6A.EXE delete mode 100755 modex105/DEMOS/QB45/UASM-QB4.BAT delete mode 100755 modex105/DEMOS/QB45/UTILS.ASM delete mode 100755 modex105/DEMOS/QB45/UTILS.BI delete mode 100755 modex105/DEMOS/ROM_8X8.FNT delete mode 100755 modex105/DEMOS/SPACEAGE.FNT delete mode 100755 modex105/DEMOS/SYSTEM.FNT delete mode 100755 modex105/DEMOS/TEST6.EXE delete mode 100755 modex105/FONTEDIT/CHARSETS.CS delete mode 100755 modex105/FONTEDIT/CSEDIT.DOC delete mode 100755 modex105/FONTEDIT/CSEDIT.EXE delete mode 100755 modex105/FONTEDIT/INVERSE.FNT delete mode 100755 modex105/FONTEDIT/MOUSEIMG.CS delete mode 100755 modex105/FONTEDIT/PALETTE.CS delete mode 100755 modex105/FONTEDIT/ROM_8X8.FNT delete mode 100755 modex105/FONTEDIT/SPACEAGE.FNT delete mode 100755 modex105/FONTEDIT/SYSTEM.FNT delete mode 100755 modex105/MODE-X.TXT delete mode 100755 modex105/MODEX.ASM delete mode 100755 modex105/MODEX.BI delete mode 100755 modex105/MODEX.H delete mode 100755 modex105/MODEX.LST delete mode 100755 modex105/MODEX.SBR delete mode 100755 modex105/PACKING.LST delete mode 100755 modex105/PALEDIT/BAKAPI.PAL delete mode 100755 modex105/PALEDIT/CHARSETS.CS delete mode 100755 modex105/PALEDIT/DIAGONAL.PAL delete mode 100755 modex105/PALEDIT/GAMECOLR.PAL delete mode 100755 modex105/PALEDIT/MOUSEIMG.CS delete mode 100755 modex105/PALEDIT/PALEDIT.DOC delete mode 100755 modex105/PALEDIT/PALEDIT.EXE delete mode 100755 modex105/PALEDIT/PALVIEW.EXE delete mode 100755 modex105/PALEDIT/PRIME.PAL delete mode 100755 modex105/PALEDIT/RGB.PAL delete mode 100755 modex105/PALEDIT/SCROLL.PAL delete mode 100755 modex105/README.DOC delete mode 100755 modex105/modex105.zip diff --git a/modex105/ASM.BAT b/modex105/ASM.BAT deleted file mode 100755 index 2e5785f9..00000000 --- a/modex105/ASM.BAT +++ /dev/null @@ -1 +0,0 @@ -MASM modex,modex,modex,nul \ No newline at end of file diff --git a/modex105/DEMOS/BASIC7/CHARDEMO.BAS b/modex105/DEMOS/BASIC7/CHARDEMO.BAS deleted file mode 100755 index 627e3278..00000000 --- a/modex105/DEMOS/BASIC7/CHARDEMO.BAS +++ /dev/null @@ -1,164 +0,0 @@ -DEFINT A-Z -DECLARE SUB PRINT.STRING (Text$, Xpos%, Ypos%, Colour%) -DECLARE FUNCTION MakePal$ (Red%, Green%, Blue%) -DECLARE SUB LOAD.FONT (FontFile$, FontNum%) -DECLARE SUB ERROR.OUT (Text$) - - REM $INCLUDE: 'MODEX.BI' - - REM $INCLUDE: 'UTILS.BI' - -TYPE FONT - SetData AS STRING * 1024 -END TYPE - - -TYPE VGAPalette - PalData AS STRING * 768 -END TYPE - - - ' Alternate form of LOAD_DAC_REGISTERS so we can pass an offset into - ' a String instead of the Address of the String - -DECLARE SUB LOAD.DACS ALIAS "LOAD_DAC_REGISTERS" (BYVAL Addr&, BYVAL StartReg%, BYVAL EndReg%, BYVAL VSync%) - - - ' - 'MODE X DEMO of Multiple Character Sets and Block Color Cycling - ' - 'By Matt Pritchard - ' - -COMMON SHARED CharSet() AS FONT - -DIM Pal AS VGAPalette - - REM $DYNAMIC - -DIM SHARED CharSet(0 TO 3) AS FONT - - - LOAD.FONT "SYSTEM.FNT", 0 - LOAD.FONT "ROM_8x8.FNT", 1 - LOAD.FONT "SPACEAGE.FNT", 2 - - - IF SET.MODEX(Mode320x240) = False THEN - ERROR.OUT "ERROR SETTING MODE X" - END IF - - - A$ = "": B$ = "" - FOR X = 0 TO 31: A$ = A$ + MakePal$(31 - X, X, 0): NEXT X - FOR X = 0 TO 31: A$ = A$ + MakePal$(0, 31 - X, X): NEXT X - FOR X = 0 TO 31: A$ = A$ + MakePal$(X, 0, 31 - X): NEXT X - - FOR X = 0 TO 31: B$ = B$ + MakePal$(31 - X, X, X): NEXT X - FOR X = 0 TO 31: B$ = B$ + MakePal$(X, 31 - X, X): NEXT X - FOR X = 0 TO 31: B$ = B$ + MakePal$(X, X, 31 - X): NEXT X - - Black$ = STRING$(192, 0) - White$ = STRING$(128 * 3, 48) - - Pal1$ = Black$ + A$ + A$ + B$ + B$ + A$ - - LOAD.DACS SSEGADD(Black$), 64, 127, 1 - LOAD.DACS SSEGADD(Black$), 20, 63, 0 - - LOAD.DACS SSEGADD(White$), 128, 255, 0 - - '*** Background *** - - FOR X = 0 TO 319 - FOR Y = 0 TO 239 - IF ((X + Y) AND 1) = 1 THEN SET.POINT X, Y, 64 + X \ 5 ELSE SET.POINT X, Y, 20 + Y \ 6 - NEXT Y - NEXT X - - '*** Draw Font Displays *** - - PRINT.STRING "FONT: SYSTEM.FNT", 11, 7, 15 - PRINT.STRING "FONT: ROM_8x8.FNT", 11, 17, 15 - PRINT.STRING "FONT: SPACEAGE.FNT", 11, 27, 15 - PRINT.STRING "PRESS ANY KEY TO CONTINUE", 8, 29, 14 - - - FOR F = 0 TO 2 - SET.DISPLAY.FONT CharSet(F), 1 - Yp = F * 80 + 10 - FOR Y = 0 TO 96 STEP 32 - FOR X = 0 TO 31 - TGPRINTC 128 + Y + X, X * 10 + 1, Yp, 128 + Y - NEXT X - Yp = Yp + 10 - NEXT Y - NEXT F - - DO - LOOP UNTIL SCAN.KEYBOARD - - Offset = 0 - Restart = 192 - MaxOfs = 192 + 96 * 6 - - Delay = 100 - - Offset2 = 0 - Offset2Dir = 3 - Offset2Min = 192 - Offset2Max = Offset2Min + 192 * 6 - - DO - LOAD.DACS SSEGADD(Pal1$) + Offset, 64, 127, 1 - Offset = Offset + 3 - IF Offset >= MaxOfs THEN Offset = Restart - IF Delay THEN - Delay = Delay - 1 - ELSE - LOAD.DACS SSEGADD(Pal1$) + Offset2, 20, 60, 0 - IF Offset2 = Offset2Max THEN Offset2Dir = -3 - IF Offset2 = Offset2Min THEN Offset2Dir = 3 - Offset2 = Offset2 + Offset2Dir - END IF - - LOOP UNTIL SCAN.KEYBOARD - - ERROR.OUT "DEMO OVER" - -REM $STATIC -SUB ERROR.OUT (Text$) - - SET.VIDEO.MODE 3 - - DOS.PRINT Text$ - - END - -END SUB - -SUB LOAD.FONT (FontFile$, FontNum) STATIC - - IF LEN(DIR$(FontFile$)) = 0 THEN ERROR.OUT "FILE NOT FOUND: " + FontFile$ - - OPEN FontFile$ FOR BINARY AS #1 - - SEEK #1, 1 - GET #1, , CharSet(FontNum) - - CLOSE #1 - -END SUB - -FUNCTION MakePal$ (Red, Green, Blue) STATIC - - MakePal$ = CHR$(Red) + CHR$(Green) + CHR$(Blue) - -END FUNCTION - -SUB PRINT.STRING (Text$, Xpos, Ypos, Colour) - - TPRINT.STR SSEG(Text$), SADD(Text$), LEN(Text$), Xpos * 8, Ypos * 8, Colour - -END SUB - diff --git a/modex105/DEMOS/BASIC7/MAKE-LIB.BAT b/modex105/DEMOS/BASIC7/MAKE-LIB.BAT deleted file mode 100755 index fc0b3b5c..00000000 --- a/modex105/DEMOS/BASIC7/MAKE-LIB.BAT +++ /dev/null @@ -1,5 +0,0 @@ -ECHO ... Building MODEX.QLB for BASIC PDS 7.1 -LIB MODEX -+MODEX,, -LIB MODEX -+UTILS,, -DEL MODEX.BAK -LINK /Q MODEX+UTILS, MODEX.QLB, NUL, C:\BC7\LIB\QBXQLB.LIB; diff --git a/modex105/DEMOS/BASIC7/MODEX.BI b/modex105/DEMOS/BASIC7/MODEX.BI deleted file mode 100755 index 6b1d7afe..00000000 --- a/modex105/DEMOS/BASIC7/MODEX.BI +++ /dev/null @@ -1,63 +0,0 @@ - - ' ===== SCREEN RESOLUTIONS ===== - -CONST Mode320x200 = 0, Mode320x400 = 1 -CONST Mode360x200 = 2, Mode360x400 = 3 -CONST Mode320x240 = 4, Mode320x480 = 5 -CONST Mode360x240 = 6, Mode360x480 = 7 - - ' ===== MODE X SETUP ROUTINES ===== - -DECLARE FUNCTION SET.VGA.MODEX% ALIAS "SET_VGA_MODEX" (BYVAL ModeType%, BYVAL MaxXpos%, BYVAL MaxYpos%, BYVAL Pages%) -DECLARE FUNCTION SET.MODEX% ALIAS "SET_MODEX" (BYVAL Mode%) - - ' ===== BASIC GRAPHICS PRIMITIVES ===== - -DECLARE SUB CLEAR.VGA.SCREEN ALIAS "CLEAR_VGA_SCREEN" (BYVAL ColorNum%) -DECLARE SUB SET.POINT ALIAS "SET_POINT" (BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorNum%) -DECLARE FUNCTION READ.POINT% ALIAS "READ_POINT" (BYVAL Xpos%, BYVAL Ypos%) -DECLARE SUB FILL.BLOCK ALIAS "FILL_BLOCK" (BYVAL Xpos1%, BYVAL Ypos1%, BYVAL Xpos2%, BYVAL Ypos2%, BYVAL ColorNum%) -DECLARE SUB DRAW.LINE ALIAS "DRAW_LINE" (BYVAL Xpos1%, BYVAL Ypos1%, BYVAL Xpos2%, BYVAL Ypos2%, BYVAL ColorNum%) - - ' ===== DAC COLOR REGISTER ROUTINES ===== - -DECLARE SUB SET.DAC.REGISTER ALIAS "SET_DAC_REGISTER" (BYVAL RegNo%, BYVAL Red%, BYVAL Green%, BYVAL Blue%) -DECLARE SUB GET.DAC.REGISTER ALIAS "GET_DAC_REGISTER" (BYVAL RegNo%, Red%, Green%, Blue%) -DECLARE SUB LOAD.DAC.REGISTERS ALIAS "LOAD_DAC_REGISTERS" (SEG PalData AS ANY, BYVAL StartReg%, BYVAL EndReg%, BYVAL VSync%) -DECLARE SUB READ.DAC.REGISTERS ALIAS "READ_DAC_REGISTERS" (SEG PalData AS ANY, BYVAL StartReg%, BYVAL EndReg%) - - - ' ===== PAGE FLIPPING AND SCROLLING ROUTINES ===== - -DECLARE SUB SET.ACTIVE.PAGE ALIAS "SET_ACTIVE_PAGE" (BYVAL PageNo%) -DECLARE FUNCTION GET.ACTIVE.PAGE% ALIAS "GET_ACTIVE_PAGE" -DECLARE SUB SET.DISPLAY.PAGE ALIAS "SET_DISPLAY_PAGE" (BYVAL PageNo%) -DECLARE FUNCTION GET.DISPLAY.PAGE% ALIAS "GET_DISPLAY_PAGE" -DECLARE SUB SET.WINDOW ALIAS "SET_WINDOW" (BYVAL DisplayPage%, BYVAL XOffset%, BYVAL YOffset%) -DECLARE FUNCTION GET.X.OFFSET% ALIAS "GET_X_OFFSET" () -DECLARE FUNCTION GET.Y.OFFSET% ALIAS "GET_Y_OFFSET" () -DECLARE SUB SYNC.DISPLAY ALIAS "SYNC_DISPLAY" - - ' ===== TEXT DISPLAY ROUTINES ===== - -DECLARE SUB GPRINTC (BYVAL CharacterNum%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%, BYVAL ColorB%) -DECLARE SUB TGPRINTC (BYVAL CharacterNum%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%) -DECLARE SUB PRINT.STR ALIAS "PRINT_STR" (BYVAL StrSeg%, BYVAL StrOfs%, BYVAL MaxLen%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%, BYVAL ColorB%) -DECLARE SUB TPRINT.STR ALIAS "TPRINT_STR" (BYVAL StrSeg%, BYVAL StrOfs%, BYVAL MaxLen%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%) -DECLARE SUB SET.DISPLAY.FONT ALIAS "SET_DISPLAY_FONT" (SEG FontData AS ANY, BYVAL FontNumber%) - - ' ===== BITMAP (SPRITE) DISPLAY ROUTINES ===== - -DECLARE SUB DRAW.BITMAP ALIAS "DRAW_BITMAP" (SEG Image AS ANY, BYVAL Xpos%, BYVAL Ypos%, BYVAL xWidth%, BYVAL Height%) -DECLARE SUB TDRAW.BITMAP ALIAS "TDRAW_BITMAP" (SEG Image AS ANY, BYVAL Xpos%, BYVAL Ypos%, BYVAL xWidth%, BYVAL Height%) - - ' ==== VIDEO MEMORY to VIDEO MEMORY COPY ROUTINES ===== - -DECLARE SUB COPY.PAGE ALIAS "COPY_PAGE" (BYVAL SourcePage%, BYVAL DestPage%) -DECLARE SUB COPY.BITMAP ALIAS "COPY_BITMAP" (BYVAL SourcePage%, BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%, BYVAL DestPage%, BYVAL DestX1%, BYVAL DestY1%) - - - - - - diff --git a/modex105/DEMOS/BASIC7/MODEX.QLB b/modex105/DEMOS/BASIC7/MODEX.QLB deleted file mode 100755 index 70d22db30925923e0b60160c34b8aa97949e70d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11141 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 Id>pg?6RC8QF#rGn diff --git a/modex105/DEMOS/BASIC7/TEST6.BAS b/modex105/DEMOS/BASIC7/TEST6.BAS deleted file mode 100755 index 220a67ba..00000000 --- a/modex105/DEMOS/BASIC7/TEST6.BAS +++ /dev/null @@ -1,562 +0,0 @@ -'File: TEST6.BAS -'Descp.: A Mode "X" demonstration -'Author: Matt Pritchard -'Date: 14 April, 1993 -' -DECLARE SUB DEMO.RES (Mode%, Xmax%, Ymax%) -DECLARE SUB ERROR.OUT (Message$) -DECLARE FUNCTION GET.KEY% () -DECLARE SUB LOAD.SHAPES () -DECLARE SUB PAGE.DEMO () -DECLARE SUB PRINT.TEXT (Text$, Xpos%, Ypos%, ColorF%, ColorB%) -DECLARE SUB TPRINT.TEXT (Text$, Xpos%, Ypos%, ColorF%) -DEFINT A-Z - - -TYPE ShapeType - ImgData AS STRING * 512 - xWidth AS INTEGER - yWidth AS INTEGER -END TYPE - -TYPE Sprite - Xpos AS INTEGER - Ypos AS INTEGER - XDir AS INTEGER - YDir AS INTEGER - Shape AS INTEGER -END TYPE - - -CONST MaxShapes = 32 - - REM $INCLUDE: 'UTILS.BI' - REM $INCLUDE: 'MODEX.BI' - -DIM SHARED Img(32) AS ShapeType -COMMON SHARED Img() AS ShapeType - - - CALL INIT.RANDOM - - CALL LOAD.SHAPES - - CALL DEMO.RES(Mode320x200, 320, 200) - CALL DEMO.RES(Mode320x400, 320, 400) - - CALL DEMO.RES(Mode360x200, 360, 200) - CALL DEMO.RES(Mode360x400, 360, 400) - - CALL DEMO.RES(Mode320x240, 320, 240) - CALL DEMO.RES(Mode320x480, 320, 480) - - CALL DEMO.RES(Mode360x240, 360, 240) - CALL DEMO.RES(Mode360x480, 360, 480) - - CALL PAGE.DEMO - - SET.VIDEO.MODE 3 - DOS.PRINT "THIS MODE X DEMO IS FINISHED" - END - -SUB DEMO.RES (Mode, Xmax, Ymax) - - IF SET.MODEX%(Mode) = 0 THEN - ERROR.OUT "Unable to SET_MODEX" + STR$(Mode) - END IF - - XCenter = Xmax \ 2 - - X1 = 10 - Y1 = 10 - X2 = Xmax - 1 - Y2 = Ymax - 1 - - FOR Z = 0 TO 3 - Colr = 31 - Z * 2 - DRAW.LINE X1 + Z, Y1 + Z, X2 - Z, Y1 + Z, Colr - DRAW.LINE X1 + Z, Y1 + Z, X1 + Z, Y2 - Z, Colr - DRAW.LINE X1 + Z, Y2 - Z, X2 - Z, Y2 - Z, Colr - DRAW.LINE X2 - Z, Y1 + Z, X2 - Z, Y2 - Z, Colr - NEXT Z - - XChars = Xmax \ 10 - YChars = Ymax \ 10 - - FOR X = 0 TO XChars - 1 - TGPRINTC 48 + ((X + 1) MOD 10), X * 10 + 1, 1, 9 + ((X \ 8) MOD 7) - DRAW.LINE X * 10 + 9, 0, X * 10 + 9, 3, 15 - NEXT X - - FOR Y = 0 TO YChars - 1 - TGPRINTC 48 + ((Y + 1) MOD 10), 1, Y * 10 + 1, 9 + ((Y \ 10) MOD 7) - DRAW.LINE 0, Y * 10 + 9, 3, Y * 10 + 9, 15 - NEXT Y - - ' Draw Lines - - FOR X = 0 TO 63 - N = 15 + X * .75 - SET.DAC.REGISTER 64 + X, N, N, N - SET.DAC.REGISTER 128 + X, 0, N, N - - DRAW.LINE 103 - X, 60, 40 + X, 123, 64 + X - DRAW.LINE 40, 60 + X, 103, 123 - X, 128 + X - - NEXT X - TPRINT.TEXT "LINE TEST", 37, 130, c.BLUE - - Y = 60: Gap = 0 - FOR X = 0 TO 9 - FILL.BLOCK 120, Y, 120 + X, Y + Gap, 64 + X - FILL.BLOCK 140 - (15 - X), Y, 150 + X, Y + Gap, 230 + X - FILL.BLOCK 170 - (15 - X), Y, 170, Y + Gap, 128 + X - Y = Y + Gap + 2 - Gap = Gap + 1 - NEXT X - TPRINT.TEXT "FILL TEST", 110, 46, c.GREEN - - - FOR X = 190 TO 250 STEP 2 - FOR Y = 60 TO 122 STEP 2 - SET.POINT X, Y, X + Y + X + Y - NEXT Y - NEXT X - - TPRINT.TEXT "PIXEL TEST", 182, 130, c.RED - - FOR X = 190 TO 250 STEP 2 - FOR Y = 60 TO 122 STEP 2 - IF READ.POINT(X, Y) <> ((X + Y + X + Y) AND 255) THEN - ERROR.OUT "READ.PIXEL Failure" - END IF - NEXT Y - NEXT X - - - - Msg$ = " This is a MODE X demo " - PRINT.TEXT Msg$, XCenter - (LEN(Msg$) * 4), 20, c.bRED, c.BLUE - Msg$ = "Screen Resolution is by " - Xp = XCenter - (LEN(Msg$) * 4) - PRINT.TEXT Msg$, Xp, 30, c.bGREEN, c.BLACK - - PRINT.TEXT LTRIM$(STR$(Xmax)), Xp + 8 * 21, 30, c.bPURPLE, c.BLACK - PRINT.TEXT LTRIM$(STR$(Ymax)), Xp + 8 * 28, 30, c.bWHITE, c.BLACK - - FOR X = 0 TO 15 - SET.DAC.REGISTER 230 + X, 63 - X * 4, 0, 15 + X * 3 - DRAW.LINE 30 + X, Ymax - 6 - X, Xmax - 20 - X, Ymax - 6 - X, 230 + X - NEXT X - TPRINT.TEXT "Press <ANY KEY> to Continue", XCenter - (26 * 4), Ymax - 18, c.YELLOW - - X = GET.KEY% - IF X = KyESC THEN ERROR.OUT "ABORT" - -END SUB - -SUB ERROR.OUT (Message$) - - SET.VIDEO.MODE 3 - DOS.PRINT Message$ - END - -END SUB - -FUNCTION GET.KEY% - - DO - X = SCAN.KEYBOARD - LOOP UNTIL X - - GET.KEY% = X - -END FUNCTION - -SUB LOAD.SHAPES - -DIM Grid(1 TO 32, 1 TO 32) - - FOR Shape = 0 TO MaxShapes - 1 - - FOR Y = 1 TO 32 - FOR X = 1 TO 32 - Grid(X, Y) = 0 - NEXT X - NEXT Y - - Style = RANDOM.INT(6) - Colour = 1 + RANDOM.INT(15) - - SELECT CASE Style - - CASE 0: ' Solid Box - - DO - xWidth = 3 + RANDOM.INT(30) - yWidth = 3 + RANDOM.INT(30) - LOOP UNTIL ((xWidth * yWidth) <= 512) - - FOR Y = 1 TO yWidth - FOR X = 1 TO xWidth - Grid(X, Y) = Colour - NEXT X - NEXT Y - - CASE 1: ' Hollow Box - - DO - xWidth = 5 + RANDOM.INT(28) - yWidth = 5 + RANDOM.INT(28) - LOOP UNTIL ((xWidth * yWidth) <= 512) - - FOR Y = 1 TO yWidth - FOR X = 1 TO xWidth - Grid(X, Y) = Colour - NEXT X - NEXT Y - - HollowX = 1 + RANDOM.INT(xWidth \ 2 - 1) - HollowY = 1 + RANDOM.INT(yWidth \ 2 - 1) - - FOR Y = HollowY + 1 TO yWidth - HollowY - FOR X = HollowX + 1 TO xWidth - HollowX - Grid(X, Y) = nil - NEXT X - NEXT Y - - CASE 2: ' Solid Diamond - - xWidth = 3 + 2 * RANDOM.INT(10) - yWidth = xWidth - Centre = xWidth \ 2 - - FOR Y = 0 TO Centre - FOR X = 0 TO Y - Grid(Centre - X + 1, Y + 1) = Colour - Grid(Centre + X + 1, Y + 1) = Colour - Grid(Centre - X + 1, yWidth - Y) = Colour - Grid(Centre + X + 1, yWidth - Y) = Colour - NEXT X - NEXT Y - - - CASE 3: ' Hollow Diamond - - - xWidth = 3 + 2 * RANDOM.INT(10) - yWidth = xWidth - Centre = xWidth \ 2 - sWidth = RANDOM.INT(Centre) - - FOR Y = 0 TO Centre - FOR X = 0 TO Y - IF X + (Centre - Y) >= sWidth THEN - Grid(Centre - X + 1, Y + 1) = Colour - Grid(Centre + X + 1, Y + 1) = Colour - Grid(Centre - X + 1, yWidth - Y) = Colour - Grid(Centre + X + 1, yWidth - Y) = Colour - END IF - NEXT X - NEXT Y - - CASE 4: ' Ball - - xWidth = 7 + 2 * RANDOM.INT(8) - yWidth = xWidth - Centre = 1 + xWidth \ 2 - - FOR Y = 1 TO yWidth - FOR X = 1 TO xWidth - D = SQR(((Centre - X) * (Centre - X)) + ((Centre - Y) * (Centre - Y))) - IF D < Centre THEN Grid(X, Y) = 150 + Colour * 2 + D * 3 - NEXT X - NEXT Y - - CASE 5: ' Ball - - - xWidth = 7 + 2 * RANDOM.INT(8) - yWidth = xWidth - Centre = 1 + xWidth \ 2 - sWidth = RANDOM.INT(xWidth) - - FOR Y = 1 TO yWidth - FOR X = 1 TO xWidth - D = SQR(((Centre - X) * (Centre - X)) + ((Centre - Y) * (Centre - Y))) - IF D < Centre AND D >= sWidth THEN Grid(X, Y) = 150 + Colour * 2 + D * 3 - NEXT X - NEXT Y - - END SELECT - - Img(Shape).xWidth = xWidth - Img(Shape).yWidth = yWidth - - A$ = STRING$(xWidth * yWidth, nil) - - c = 1 - FOR Y = 1 TO yWidth - FOR X = 1 TO xWidth - MID$(A$, c, 1) = CHR$(Grid(X, Y)) - c = c + 1 - NEXT X - NEXT Y - - Img(Shape).ImgData = A$ - - - NEXT Shape - -END SUB - -SUB PAGE.DEMO - -CONST MaxSprites = 64 - -DIM Obj(MaxSprites) AS Sprite -DIM LastX(MaxSprites, 1), LastY(MaxSprites, 1) -DIM LastObjects(1) - - ScreenX = 360: ScreenY = 240 - - IF SET.VGA.MODEX%(Mode320x200, ScreenX, ScreenY, 3) = 0 THEN - ERROR.OUT "Unable to SET_VGA_MODEX" + STR$(Mode) - END IF - - SET.ACTIVE.PAGE 0 - - CLEAR.VGA.SCREEN c.BLACK - - PRINT.TEXT "This is a Test of the Following Functions:", 10, 9, c.bWHITE, c.BLACK - - DRAW.LINE 10, 18, 350, 18, c.YELLOW - PRINT.TEXT "SET_ACTIVE_PAGE", 10, 20, c.bBLUE, c.BLACK - PRINT.TEXT "SET_DISPLAY_PAGE", 10, 30, c.GREEN, c.BLACK - PRINT.TEXT "SET_DAC_REGISTER", 10, 40, c.RED, c.BLACK - PRINT.TEXT "CLEAR_VGA_SCREEN", 10, 50, c.CYAN, c.BLACK - - PRINT.TEXT "TDRAW_BITMAP", 10, 60, c.PURPLE, c.BLACK - PRINT.TEXT "COPY_PAGE", 10, 70, c.GREEN, c.BLACK - PRINT.TEXT "COPY_BITMAP", 10, 80, c.CYAN, c.BLACK - - PRINT.TEXT "GPRINTC", 10, 90, c.BLUE, c.BLACK - PRINT.TEXT "TGPRINTC", 10, 100, c.GREEN, c.BLACK - PRINT.TEXT "SET_WINDOW", 10, 110, c.RED, c.BLACK - - PRINT.TEXT "VIRTUAL SCREEN SIZES", 190, 20, c.bBLUE, c.BLACK - PRINT.TEXT " SMOOTH SCROLLING", 190, 30, c.GREEN, c.BLACK - PRINT.TEXT " SPRITE ANIMATION", 190, 40, c.CYAN, c.BLACK - PRINT.TEXT " PAGE FLIPPING", 190, 50, c.RED, c.BLACK - PRINT.TEXT " COLOR CYCLING", 190, 60, c.PURPLE, c.BLACK - - - FOR X = 0 TO 60 - SET.DAC.REGISTER 50 + X, 3 + X, 0, 60 - X - SET.DAC.REGISTER 150 + X, 3 + X, 0, 60 - X - NEXT X - - c = 0: DC = 1 - FOR X = 0 TO ScreenX \ 2 - DRAW.LINE ScreenX \ 2 - 1, ScreenY \ 4, X, ScreenY - 1, c + 50 - DRAW.LINE ScreenX \ 2, ScreenY \ 4, ScreenX - X - 1, ScreenY - 1, c + 50 - c = c + DC - IF c = 0 OR c = 60 THEN DC = -DC - NEXT X - - TPRINT.TEXT "Press <ANY KEY> to Continue", 72, 190, c.bWHITE - TPRINT.TEXT "< > = Faster < > = Slower", 72, 204, c.bGREEN - TPRINT.TEXT "< > = Fewer Shapes < > = More Shapes", 32, 218, c.bCYAN - - TGPRINTC 43, 80, 204, c.YELLOW - TGPRINTC 45, 200, 204, c.YELLOW - - TGPRINTC 25, 40, 218, c.YELLOW - TGPRINTC 24, 200, 218, c.YELLOW - - COPY.PAGE 0, 1 - COPY.PAGE 0, 2 - - FOR X = 1 TO MaxSprites - DO - Obj(X).XDir = RANDOM.INT(7) - 3 - Obj(X).YDir = RANDOM.INT(7) - 3 - LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0) - - Obj(X).Shape = X MOD MaxShapes - - SpriteX = Img(Obj(X).Shape).xWidth - SpriteY = Img(Obj(X).Shape).yWidth - - Obj(X).Xpos = 1 + RANDOM.INT(ScreenX - SpriteX - 2) - Obj(X).Ypos = 1 + RANDOM.INT(ScreenY - SpriteY - 2) - - LastX(X, 0) = Obj(X).Xpos - LastX(X, 1) = Obj(X).Xpos - LastY(X, 0) = Obj(X).Ypos - LastY(X, 1) = Obj(X).Ypos - NEXT X - - CurrentPage = 0 - - 'View Shift... - - ViewX = 0 - ViewY = 0 - ViewMax = 3 - ViewCnt = 0 - ViewXD = 1 - ViewYD = 1 - - SetColor = 3: SDir = 1 - PrevColor = 0: PDir = 1 - - VisObjects = MaxSprites \ 2 - LastObjects(0) = 0 - LastObjects(1) = 0 - -DRAW.LOOP: - - - SET.ACTIVE.PAGE CurrentPage - - ' Erase Old Images - - FOR X = 1 TO LastObjects(CurrentPage) - - X1 = LastX(X, CurrentPage) AND &HFFFC - Y1 = LastY(X, CurrentPage) - X2 = ((LastX(X, CurrentPage) + Img(Obj(X).Shape).xWidth)) OR 3 - Y2 = Y1 + Img(Obj(X).Shape).yWidth - 1 - - COPY.BITMAP 2, X1, Y1, X2, Y2, CurrentPage, X1, Y1 - - NEXT X - - ' Draw new images - - FOR X = 1 TO VisObjects - - SpriteX = Img(Obj(X).Shape).xWidth - SpriteY = Img(Obj(X).Shape).yWidth - - ' Move Sprite - -REDOX: - NewX = Obj(X).Xpos + Obj(X).XDir - IF NewX < 0 OR NewX + SpriteX > ScreenX THEN - Obj(X).XDir = -Obj(X).XDir - IF RANDOM.INT(20) = 1 THEN - DO - Obj(X).XDir = RANDOM.INT(7) - 3 - Obj(X).YDir = RANDOM.INT(7) - 3 - LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0) - GOTO REDOX - END IF - END IF - Obj(X).Xpos = Obj(X).Xpos + Obj(X).XDir - -REDOY: - NewY = Obj(X).Ypos + Obj(X).YDir - IF NewY < 0 OR NewY + SpriteY > ScreenY THEN - Obj(X).YDir = -Obj(X).YDir - IF RANDOM.INT(20) = 1 THEN - DO - Obj(X).XDir = RANDOM.INT(7) - 3 - Obj(X).YDir = RANDOM.INT(7) - 3 - LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0) - GOTO REDOY - END IF - END IF - Obj(X).Ypos = Obj(X).Ypos + Obj(X).YDir - - 'Draw Sprite - - TDRAW.BITMAP Img(Obj(X).Shape), Obj(X).Xpos, Obj(X).Ypos, SpriteX, SpriteY - - LastX(X, CurrentPage) = Obj(X).Xpos - LastY(X, CurrentPage) = Obj(X).Ypos - - NEXT X - - LastObjects(CurrentPage) = VisObjects - - ' Pan Screen Back & Forth - - ViewCnt = ViewCnt + 1 - IF ViewCnt >= ViewMax THEN - ViewX = ViewX + ViewXD - IF ViewX = 0 OR ViewX = 39 THEN ViewXD = -ViewXD - IF ViewXD < 0 THEN - ViewY = ViewY + ViewYD - IF ViewY = 0 OR ViewY = 39 THEN ViewYD = -ViewYD - END IF - - SET.WINDOW CurrentPage, ViewX, ViewY - - ViewCnt = 0 - ELSE - SET.DISPLAY.PAGE CurrentPage - END IF - - ' Cycle Colors - - SET.DAC.REGISTER 50 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor - SET.DAC.REGISTER 50 + SetColor, SetColor, 10, 63 - SetColor - - SET.DAC.REGISTER 150 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor - SET.DAC.REGISTER 150 + SetColor, 63, 63, SetColor - - SetColor = SetColor + SDir - IF SetColor = 60 OR SetColor = 0 THEN SDir = -SDir - - PrevColor = PrevColor + PDir - IF PrevColor = 60 OR PrevColor = 0 THEN PDir = -PDir - - CurrentPage = 1 - CurrentPage - - Code = SCAN.KEYBOARD - - IF Code = False THEN GOTO DRAW.LOOP - - IF Code = KyPlus THEN - IF ViewMax < 12 THEN ViewMax = ViewMax + 1 - GOTO DRAW.LOOP - END IF - - IF Code = KyMinus THEN - IF ViewMax > 1 THEN ViewMax = ViewMax - 1 - IF ViewCnt >= ViewMax THEN ViewCnt = 0 - GOTO DRAW.LOOP - END IF - - IF Code = KyUp THEN - IF VisObjects < MaxSprites THEN VisObjects = VisObjects + 1 - GOTO DRAW.LOOP - END IF - - IF Code = KyDown THEN - IF VisObjects > 1 THEN VisObjects = VisObjects - 1 - GOTO DRAW.LOOP - END IF - - -END SUB - -SUB PRINT.TEXT (Text$, Xpos, Ypos, ColorF, ColorB) - - IF LEN(Text$) = 0 THEN EXIT SUB - - PRINT.STR SSEG(Text$), SADD(Text$), LEN(Text$), Xpos, Ypos, ColorF, ColorB - - -END SUB - -SUB TPRINT.TEXT (Text$, Xpos, Ypos, ColorF) - - IF LEN(Text$) = 0 THEN EXIT SUB - - TPRINT.STR SSEG(Text$), SADD(Text$), LEN(Text$), Xpos, Ypos, ColorF - -END SUB - diff --git a/modex105/DEMOS/BASIC7/UASM-BC7.BAT b/modex105/DEMOS/BASIC7/UASM-BC7.BAT deleted file mode 100755 index 5ad67fb5..00000000 --- a/modex105/DEMOS/BASIC7/UASM-BC7.BAT +++ /dev/null @@ -1 +0,0 @@ -MASM /DFARSTRINGS utils, utils, utils, nul; \ No newline at end of file diff --git a/modex105/DEMOS/BASIC7/UTILS.ASM b/modex105/DEMOS/BASIC7/UTILS.ASM deleted file mode 100755 index 811b8f8e..00000000 --- a/modex105/DEMOS/BASIC7/UTILS.ASM +++ /dev/null @@ -1,406 +0,0 @@ -;======================================================= -;=== UTILS.ASM - Asm Utilities for QuickBasic/BC7 === -;======================================================= - - PAGE 255, 132 - - .MODEL Medium - .286 - - ; ==== MACROS ==== - - ; macros to PUSH and POP multiple registers - -PUSHx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - push R1 ; Save R1 - PUSHx R2, R3, R4, R5, R6, R7, R8 - ENDIF -ENDM - -POPx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - pop R1 ; Restore R1 - POPx R2, R3, R4, R5, R6, R7, R8 - ENDIF -ENDM - - ; Macro to Clear a Register to 0 - -CLR MACRO Register - xor Register, Register ; Set Register = 0 -ENDM - - ; Macros to Decrement Counter & Jump on Condition - -LOOPx MACRO Register, Destination - dec Register ; Counter-- - jnz Destination ; Jump if not 0 -ENDM - -LOOPjz MACRO Register, Destination - dec Register ; Counter-- - jz Destination ; Jump if 0 -ENDM - - - ; ==== General Constants ==== - - False EQU 0 - True EQU -1 - nil EQU 0 - - b EQU BYTE PTR - w EQU WORD PTR - d EQU DWORD PTR - o EQU OFFSET - f EQU FAR PTR - s EQU SHORT - ?x4 EQU <?,?,?,?> - ?x3 EQU <?,?,?> - - -IFDEF FARSTRINGS - - EXTRN stringaddress:far - EXTRN stringlength:far - -ENDIF - - - .Data - - EVEN - -RND_Seed DW 7397, 29447, 802 -RND_Mult DW 179, 183, 182 -RND_ModV DW 32771, 32779, 32783 - -CR_LF DB 13, 10 ; the CRLF data - - .Code - -;================= -;DOS_PRINT (Text$) -;================= -; -; Prints Text Directly to DOS console w/ CR/LF -; - - PUBLIC DOS_PRINT - -DP_Stack STRUC - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - DP_Text DW ? ; Address of Text$ Descriptor -DP_Stack ENDS - - -DOS_PRINT PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - mov BP, SP ; Set up Stack Frame - - mov SI, [BP].DP_Text ; Get Addr of Text$ descriptor - -IFDEF FARSTRINGS - push SI ; Push Addr of BC7 Decriptor Ptr - call stringaddress ; Get Address + Len of string!!! - ; DX:AX = Addr CX = Len - mov DS, DX ; DS = DX = Segment of string - mov DX, AX ; DX = AX = Offset of String -ELSE - mov CX, [SI] ; put its length into CX - mov DX, [SI+02] ; now DS:DX points to the String -ENDIF - - jcxz @No_Print ; Don't Print if empty - - mov BX, 1 ; 1= DOS Handle for Display - mov AH, 40h ; Write Text Function - int 21h ; Call DOS to do it - -@No_Print: - mov AX, SEG DGROUP ; Restore DGroup - mov DS, AX - - mov DX, o CR_LF ; Get Addr of CR/LF pair - mov CX, 2 ; 2 Characters to Write - mov BX, 1 ; 1= DOS Handle for Display - - mov AH, 40h ; Write Text Function - int 21h ; Call DOS to do it - - cld ; Reset Direction Flag - POPx DI, SI, DS, BP ; Restore Saved Registers - ret 2 ; Exit & Clean Up Stack - -DOS_PRINT ENDP - - -;================== -;DOS_PRINTS (Text$) -;================== -; -; Print Text$ Directly to DOS console -; without a trailing CR/LF -; - - PUBLIC DOS_PRINTS - -DOS_PRINTS PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - mov BP, SP ; Set up Stack Frame - - mov SI, [BP].DP_Text ; Get Addr of Text$ descriptor - -IFDEF FARSTRINGS - push SI ; Push Addr of BC7 Decriptor Ptr - call stringaddress ; Get Address + Len of string!!! - ; DX:AX = Addr CX = Len - mov DS, DX ; DS = DX = Segment of string - mov DX, AX ; DX = AX = Offset of String -ELSE - mov CX, [SI] ; put its length into CX - mov DX, [SI+02] ; now DS:DX points to the String -ENDIF - - jcxz @DPS_Exit ; Don't Print if empty - - mov BX, 1 ; 1= DOS Handle for Display - mov AH, 40h ; Write Text Function - int 21h ; Call DOS to do it - -@DPS_Exit: - cld ; Reset Direction Flag - POPx DI, SI, DS, BP ; Restore Saved Registers - ret 2 ; Exit & Clean Up Stack - -DOS_PRINTS ENDP - - -;====================== -;SET_VIDEO_MODE (Mode%) -;====================== -; -; Sets the Video Mode through the BIOS -; - - PUBLIC SET_VIDEO_MODE - -SVM_Stack STRUC - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - SVM_Mode DB ?,? ; Desired Video Mode -SVM_Stack ENDS - - -SET_VIDEO_MODE PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - mov BP, SP ; Set up Stack Frame - - CLR AH ; Function 0 - mov AL, [BP].SVM_Mode ; Get Mode # - - int 10H ; Change Video Modes - -@SVM_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - ret 2 ; Exit & Clean Up Stack - -SET_VIDEO_MODE ENDP - - -;============== -;SCAN_KEYBOARD% -;============== -; -; Function to scan keyboard for a pressed key -; - - PUBLIC SCAN_KEYBOARD - -SCAN_KEYBOARD PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - - mov AH, 01H ; Function #1 - int 16H ; Call Keyboard Driver - jz @SK_NO_KEY ; Exit if Zero flag set - - mov AH, 00H ; Remove Key from Buffer - int 16H ; Get Keycode in AX - - or AL, AL ; Low Byte Set (Ascii?) - jz @SK_Exit ; if not, it's a F-Key - - CLR AH ; Clear ScanCode if Ascii - jmp s @SK_Exit ; Return Key in AX - -@SK_NO_KEY: - CLR AX ; Return Nil (no Keypress) - -@SK_Exit: - cld ; Reset Direction Flag - POPx DI, SI, DS, BP ; Restore Saved Registers - ret ; Exit & Clean Up Stack - -SCAN_KEYBOARD ENDP - - -;==================== -;RANDOM_INT (MaxInt%) -;==================== -; -; Returns a pseudo-random number in the range of (0.. MaxInt-1) -; - - - PUBLIC RANDOM_INT - -RI_Stack STRUC - DW ? ; BP - DD ? ; Caller - RI_MaxVal DW ? ; Maximum Value to Return + 1 -RI_Stack ENDS - - -RANDOM_INT PROC FAR - - push BP ; Preserve Important Registers - mov BP, SP ; Set up Stack Frame - - CLR BX ; BX is the data index - CLR CX ; CX is the accumulator - -REPT 3 - mov AX, RND_Seed[BX] ; load the initial seed - mul RND_Mult[BX] ; multiply it - div RND_ModV[BX] ; and obtain the Mod value - mov RND_Seed[BX], DX ; save that for the next time - - add CX, DX ; add it into the accumulator - inc BX - inc BX ; point to the next set of values -ENDM - - mov AX, CX ; AX = Random # - CLR DX ; DX = 0 - div [BP].RI_MaxVal ; DX = DX:AX / MAxVal Remainder - - mov AX, DX - - pop BP ; Restore BP - ret 2 ; back to BASIC with AX holding the result - -RANDOM_INT ENDP - - -;=========== -;INIT_RANDOM -;=========== -; -; Scrambles the psuedo-random number sequence -; (XOR's the seed value with the timer) -; - - PUBLIC INIT_RANDOM - -INIT_RANDOM PROC FAR - - clr AX ; Segment = 0000 - mov ES, AX - mov AX, ES:[046Ch] ; Get Timer Lo Word - - xor RND_Seed, AX ; Scramble 1st Seed - - ret ; Exit & Clean Up Stack - -INIT_RANDOM ENDP - - -;==================== -;INT_SQR (X%, Round%) -;==================== -; -; Returns the Integer Square Root of (X) -; Round allows the return value to be rounded to the -; nearest integer value by passing 0x80. Passing 0 -; return the Integer Portion only. The rounding amound is -; a number from 0 to 1 multiplied by 256, thus -; 0.5 * 0x100 = 0x80! -; - -ISQ_Stack STRUC - DW ?,? ; BP, DI - DD ? ; Caller - ISQ_Round DW ? ; Amount to Round Result * 256 - ISQ_X DW ? ; "X" -ISQ_Stack ENDS - - PUBLIC INT_SQR - -INT_SQR PROC FAR - - PUSHx BP, DI ; Save BP - mov BP, SP ; Set up Stack Frame - - xor AX, AX ; {xor eax,eax} - xor DX, DX ; {xor edx,edx} - mov DI, [BP].ISQ_X ; {mov edi,x} - - mov CX, 16 ; {mov cx, 32} - -@ISQ_L: - - shl DI, 1 ; {shl edi,1} - rcl DX, 1 ; {rcl edx,1} - shl DI, 1 ; {shl edi,1} - rcl DX, 1 ; {rcl edx,1} - shl AX, 1 ; {shl eax,1} - mov BX, AX ; {mov ebx,eax} - shl BX, 1 ; {shl ebx,1} - inc BX ; {inc ebx} - cmp DX, BX ; {cmp edx,ebx} - jl @ISQ_S - - sub DX, BX ; {sub edx,ebx} - inc AX ; {inc eax} - -@ISQ_S: - loop @ISQ_L - - add ax, [BP].ISQ_Round ; {add eax,$00008000} - ; {*round* result in hi word: ie. +0.5} - shr ax, 8 ; {shr eax,16} {to ax (result)} - - POPx DI, BP ; Restore Registers - ret 4 ; Exit - -INT_SQR ENDP - - -;============ -;TIMER_COUNT& -;============ -; -; Returns the current timer value as an integer/long integer -; - - - PUBLIC TIMER_COUNT - -TIMER_COUNT PROC FAR - - clr AX ; Segment = 0000 - mov ES, AX ; use ES to get at data - mov AX, ES:[046Ch] ; Get Timer Lo Word - mov DX, ES:[046Eh] ; Get Timer Hi Word - ret ; Exit & Return value in DX:AX - -TIMER_COUNT ENDP - - - END diff --git a/modex105/DEMOS/BASIC7/UTILS.BI b/modex105/DEMOS/BASIC7/UTILS.BI deleted file mode 100755 index aeafeef4..00000000 --- a/modex105/DEMOS/BASIC7/UTILS.BI +++ /dev/null @@ -1,51 +0,0 @@ - - ' Misc Constants - -CONST True = -1, False = 0, nil = 0 - - ' Keyboard Codes: Extended - -CONST KyF1 = &H3B00, KyF2 = &H3C00, KyF3 = &H3D00, KyF4 = &H3E00, KyF5 = &H3F00 -CONST KyF6 = &H4000, KyF7 = &H4100, KyF8 = &H4200, KyF9 = &H4300, KyF10 = &H4400 - -CONST KyUp = &H4800, KyLeft = &H4B00, KyRight = &H4D00, KyDown = &H5000 -CONST KySLeft = &HCB00, KySRight = &HCD00, KySUp = &HC800, KySDown = &HD000 - -CONST KyHome = &H4700, KyPgUp = &H4900, KyEnd = &H4F00, KyPgDn = &H5100 -CONST KySHome = &HC700, KySPgUp = &HC900, KySEnd = &HCF00, KySPgDn = &HD100 - -CONST KyIns = &H5200, KyDel = &H5300, KyRvsTab = &H8F00 -CONST KySIns = &HC200, KySDel = &HC300 - -CONST KyAltA = &H1E00, KyAltB = &H3000, KyAltC = &H2E00, KyAltD = &H2000 -CONST KyAltE = &H1200, KyAltF = &H2100, KyAltG = &H2200, KyAltH = &H2300 -CONST KyAltI = &H1700, KyAltJ = &H2400, KyAltK = &H2500, KyAltL = &H2600 -CONST KyAltM = &H3200, KyAltN = &H3100, KyAltO = &H1800, KyAltP = &H1900 -CONST KyAltQ = &H1000, KyAltR = &H1300, KyAltS = &H1F00, KyAltT = &H1400 -CONST KyAltU = &H1600, KyAltV = &H2F00, KyAltW = &H1100, KyAltX = &H2D00 -CONST KyAltY = &H1500, KyAltZ = &H2C00 - - ' Keyboard Codes: Ascii - -CONST KyBS = 8, KyTab = 9, KyCR = 13, KyESC = &H1B, KyClr = &H7F -CONST KyPlus = 45, KyMinus = 43 - - ' Color Constants - -CONST c.BLACK = 0, c.BLUE = 1, c.GREEN = 2, c.CYAN = 3 -CONST c.RED = 4, c.PURPLE = 5, c.BROWN = 6, c.WHITE = 7 -CONST c.GREY = 8, c.bBLUE = 9, c.bGREEN = 10, c.bCYAN = 11 -CONST c.bRED = 12, c.bPURPLE = 13, c.YELLOW = 14, c.bWHITE = 15 -CONST c.BRIGHT = 8 - - ' From UTILS.ASM - -DECLARE SUB DOS.PRINT ALIAS "DOS_PRINT" (Text$) -DECLARE SUB DOS.PRINTS ALIAS "DOS_PRINTS" (Text$) -DECLARE SUB SET.VIDEO.MODE ALIAS "SET_VIDEO_MODE" (BYVAL Mode%) -DECLARE FUNCTION SCAN.KEYBOARD% ALIAS "SCAN_KEYBOARD" -DECLARE FUNCTION RANDOM.INT ALIAS "RANDOM_INT" (BYVAL MaxInt%) -DECLARE SUB INIT.RANDOM ALIAS "INIT_RANDOM" -DECLARE FUNCTION TIMER.COUNT& ALIAS "TIMER_COUNT" -DECLARE FUNCTION INT.SQR ALIAS "INT_SQR" (BYVAL X%, BYVAL Round%) - diff --git a/modex105/DEMOS/C/C_UTILS.ASM b/modex105/DEMOS/C/C_UTILS.ASM deleted file mode 100755 index 8302561a..00000000 --- a/modex105/DEMOS/C/C_UTILS.ASM +++ /dev/null @@ -1,405 +0,0 @@ -;======================================================= -;=== C_UTILS.ASM - Asm Utilities for C/C++ === -;======================================================= - - PAGE 255, 132 - - .MODEL Medium - .286 - - ; ==== MACROS ==== - - ; macros to PUSH and POP multiple registers - -PUSHx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - push R1 ; Save R1 - PUSHx R2, R3, R4, R5, R6, R7, R8 - ENDIF -ENDM - -POPx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - pop R1 ; Restore R1 - POPx R2, R3, R4, R5, R6, R7, R8 - ENDIF -ENDM - - ; Macro to Clear a Register to 0 - -CLR MACRO Register - xor Register, Register ; Set Register = 0 -ENDM - - ; Macros to Decrement Counter & Jump on Condition - -LOOPx MACRO Register, Destination - dec Register ; Counter-- - jnz Destination ; Jump if not 0 -ENDM - -LOOPjz MACRO Register, Destination - dec Register ; Counter-- - jz Destination ; Jump if 0 -ENDM - - - ; ==== General Constants ==== - - False EQU 0 - True EQU -1 - nil EQU 0 - - b EQU BYTE PTR - w EQU WORD PTR - d EQU DWORD PTR - o EQU OFFSET - f EQU FAR PTR - s EQU SHORT - ?x4 EQU <?,?,?,?> - ?x3 EQU <?,?,?> - - - .Data - - EVEN - -RND_Seed DW 7397, 29447, 802 -RND_Mult DW 179, 183, 182 -RND_ModV DW 32771, 32779, 32783 - -CR_LF DB 13, 10 ; the CRLF data - - .Code - -;=========================================== -;void far pascal dos_print (far char *Text) -;=========================================== -; -; - Print Text Directly to DOS console w/ CR/LF -; - - PUBLIC DOS_PRINT - -DP_Stack STRUC - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - DP_Text DD ? ; Far Address of Text to print -DP_Stack ENDS - - -DOS_PRINT PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - mov BP, SP ; Set up Stack Frame - - lds DX, [BP].DP_Text ; Get Addr of Text$ descriptor - - ; Compute Length of string - - CLR CX ; Length = 0 - mov SI, DX ; DS:SI = String data - -@@DP_Scan_it: - - cmp b [SI], 0 ; Null Byte found? - je @@DP_Got_Len ; exit loop if so - - inc CX ; Len++ - inc SI ; Point to next char - jmp s @@DP_Scan_it ; check again... - -@@DP_Got_len: - - jcxz @No_Print ; Don't Print if empty - - mov BX, 1 ; 1= DOS Handle for Display - mov AH, 40h ; Write Text Function - int 21h ; Call DOS to do it - -@No_Print: - mov AX, SEG DGROUP ; Restore DGroup - mov DS, AX - - mov DX, o CR_LF ; Get Addr of CR/LF pair - mov CX, 2 ; 2 Characters to Write - mov BX, 1 ; 1= DOS Handle for Display - - mov AH, 40h ; Write Text Function - int 21h ; Call DOS to do it - - cld ; Reset Direction Flag - POPx DI, SI, DS, BP ; Restore Saved Registers - ret 4 ; Exit & Clean Up Stack - -DOS_PRINT ENDP - - -;=========================================== -;void far pascal dos_prints (char far *Text) -;=========================================== -; -; Print Text Directly to DOS console -; without a trailing CR/LF -; - - PUBLIC DOS_PRINTS - -DOS_PRINTS PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - mov BP, SP ; Set up Stack Frame - - lds DX, [BP].DP_Text ; Get Addr of Text$ descriptor - - ; Compute Length of string - - CLR CX ; Length = 0 - mov SI, DX ; DS:SI = String data - -@@DPS_Scan_it: - - cmp b [SI], 0 ; Null Byte found? - je @@DPS_Got_Len ; exit loop if so - - inc CX ; Len++ - inc SI ; Point to next char - jmp s @@DPS_Scan_it ; check again... - -@@DPS_Got_len: - - jcxz @DPS_Exit ; Don't Print if empty - - mov BX, 1 ; 1= DOS Handle for Display - mov AH, 40h ; Write Text Function - int 21h ; Call DOS to do it - -@DPS_Exit: - cld ; Reset Direction Flag - POPx DI, SI, DS, BP ; Restore Saved Registers - ret 2 ; Exit & Clean Up Stack - -DOS_PRINTS ENDP - - -;========================================= -;void far pascal set_video_mode (int Mode) -;========================================= -; -; Sets the Video Mode through the BIOS -; - - PUBLIC SET_VIDEO_MODE - -SVM_Stack STRUC - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - SVM_Mode DB ?,? ; Desired Video Mode -SVM_Stack ENDS - - -SET_VIDEO_MODE PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - mov BP, SP ; Set up Stack Frame - - CLR AH ; Function 0 - mov AL, [BP].SVM_Mode ; Get Mode # - - int 10H ; Change Video Modes - -@SVM_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - ret 2 ; Exit & Clean Up Stack - -SET_VIDEO_MODE ENDP - - -;=================================== -;int far pascal scan_keyboard (void) -;=================================== -; -; Function to scan keyboard for a pressed key -; - - PUBLIC SCAN_KEYBOARD - -SCAN_KEYBOARD PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - - mov AH, 01H ; Function #1 - INT 16H ; Call Keyboard Driver - JZ @SK_NO_KEY ; Exit if Zero flag set - - mov AH, 00H ; Remove Key from Buffer - INT 16H ; Get Keycode in AX - - OR AL, AL ; Low Byte Set (Ascii?) - JZ @SK_Exit ; if not, it's a F-Key - - CLR AH ; Clear ScanCode if Ascii - JMP s @SK_Exit ; Return Key in AX - -@SK_NO_KEY: - CLR AX ; Return Nil (no Keypress) - -@SK_Exit: - cld ; Reset Direction Flag - POPx DI, SI, DS, BP ; Restore Saved Registers - ret ; Exit & Clean Up Stack - -SCAN_KEYBOARD ENDP - - -;======================================== -;int far pascal random_int (int MaxValue) -;======================================== -; -; Returns a pseudo-random number in the range of (0.. MaxInt-1) -; - - - PUBLIC RANDOM_INT - -RI_Stack STRUC - DW ? ; BP - DD ? ; Caller - RI_MaxVal DW ? ; Maximum Value to Return + 1 -RI_Stack ENDS - - -RANDOM_INT PROC FAR - - push BP ; Preserve Important Registers - mov BP, SP ; Set up Stack Frame - - CLR BX ; BX is the data index - CLR CX ; CX is the accumulator - -REPT 3 - mov AX, RND_Seed[BX] ; load the initial seed - mul RND_Mult[BX] ; multiply it - div RND_ModV[BX] ; and obtain the Mod value - mov RND_Seed[BX], DX ; save that for the next time - - add CX, DX ; add it into the accumulator - inc BX - inc BX ; point to the next set of values -ENDM - - mov AX, CX ; AX = Random # - CLR DX ; DX = 0 - div [BP].RI_MaxVal ; DX = DX:AX / MAxVal Remainder - - mov AX, DX - - pop BP ; Restore BP - ret 2 ; back to BASIC with AX holding the result - -RANDOM_INT ENDP - - -;================================== -;void far pascal init_random (void) -;================================== -; -; Scrambles the psuedo-random number sequence -; (XOR's the seed value with the timer) -; - - PUBLIC INIT_RANDOM - -INIT_RANDOM PROC FAR - - CLR AX ; Segment = 0000 - mov ES, AX - mov AX, ES:[046Ch] ; Get Timer Lo Word - - xor RND_Seed, AX ; Scramble 1st Seed - - ret ; Exit & Clean Up Stack - -INIT_RANDOM ENDP - -;========================================= -;int far pascal int_sqr (int X, int Round) -;========================================= -; -; Returns the Integer Square Root of (X) -; Round allows the return value to be rounded to the -; nearest integer value by passing 0x80. Passing 0 -; return the Integer Portion only. The rounding amound is -; a number from 0 to 1 multiplied by 256, thus -; 0.5 * 0x100 = 0x80! -; - -ISQ_Stack STRUC - DW ?,? ; BP, DI - DD ? ; Caller - ISQ_Round DW ? ; Amount to Round Result * 256 - ISQ_X DW ? ; "X" -ISQ_Stack ENDS - - PUBLIC INT_SQR - -INT_SQR PROC FAR - - PUSHx BP, DI ; Save BP - mov BP, SP ; Set up Stack Frame - - xor AX, AX ; {xor eax,eax} - xor DX, DX ; {xor edx,edx} - mov DI, [BP].ISQ_X ; {mov edi,x} - - mov CX, 16 ; {mov cx, 32} - -@ISQ_L: - - shl DI, 1 ; {shl edi,1} - rcl DX, 1 ; {rcl edx,1} - shl DI, 1 ; {shl edi,1} - rcl DX, 1 ; {rcl edx,1} - shl AX, 1 ; {shl eax,1} - mov BX, AX ; {mov ebx,eax} - shl BX, 1 ; {shl ebx,1} - inc BX ; {inc ebx} - cmp DX, BX ; {cmp edx,ebx} - jl @ISQ_S - - sub DX, BX ; {sub edx,ebx} - inc AX ; {inc eax} - -@ISQ_S: - loop @ISQ_L - - add ax, [BP].ISQ_Round ; {add eax,$00008000} - ; {*round* result in hi word: ie. +0.5} - shr ax, 8 ; {shr eax,16} {to ax (result)} - - POPx DI, BP ; Restore Registers - ret 4 ; Exit - -INT_SQR ENDP - -;================================= -;int far pascal timer_count (void) -;================================= -; -; Returns the current timer value as an integer/long integer -; - - PUBLIC TIMER_COUNT - -TIMER_COUNT PROC FAR - - CLR AX ; Segment = 0000 - mov ES, AX - mov AX, ES:[046Ch] ; Get Timer Lo Word - mov DX, ES:[046Eh] ; Get Timer Hi Word - ret ; Exit & Clean Up Stack - -TIMER_COUNT ENDP - - - END diff --git a/modex105/DEMOS/C/C_UTILS.H b/modex105/DEMOS/C/C_UTILS.H deleted file mode 100755 index ed0e188f..00000000 --- a/modex105/DEMOS/C/C_UTILS.H +++ /dev/null @@ -1,117 +0,0 @@ - -#ifndef __C_UTILS_H -#define __C_UTILS_H - - - /* Misc Constants */ - -#define True -1 -#define False 0 -#define nil 0 - - /* Color Constants */ - -#define c_BLACK 0 -#define c_BLUE 1 -#define c_GREEN 2 -#define c_CYAN 3 -#define c_RED 4 -#define c_PURPLE 5 -#define c_BROWN 6 -#define c_WHITE 7 -#define c_GREY 8 -#define c_bBLUE 9 -#define c_bGREEN 10 -#define c_bCYAN 11 -#define c_bRED 12 -#define c_bPURPLE 13 -#define c_YELLOW 14 -#define c_bWHITE 15 -#define c_BRIGHT 16 - - -#define Ky_F1 0x3B00 -#define Ky_F2 0x3C00 -#define Ky_F3 0x3D00 -#define Ky_F4 0x3E00 -#define Ky_F5 0x3F00 -#define Ky_F6 0x4000 -#define Ky_F7 0x4100 -#define Ky_F8 0x4200 -#define Ky_F9 0x4300 -#define Ky_F10 0x4400 - -#define Ky_Up 0x4800 -#define Ky_Left 0x4B00 -#define Ky_Right 0x4D00 -#define Ky_Down 0x5000 -#define Ky_SUp 0xC800 -#define Ky_SLeft 0xCB00 -#define Ky_SRight 0xCD00 -#define Ky_SDown 0xD000 - -#define Ky_Home 0x4700 -#define Ky_End 0x4F00 -#define Ky_PgUp 0x4900 -#define Ky_PgDn 0x5100 -#define Ky_SHome 0xC700 -#define Ky_SEnd 0xCF00 -#define Ky_SPgUp 0xC900 -#define Ky_SPgDn 0xD100 - -#define Ky_Ins 0x5200 -#define Ky_Del 0x5300 -#define Ky_SIns 0xC200 -#define Ky_SDel 0xC300 - -#define Ky_Tab 0x0009 -#define Ky_RvsTab 0x8F00 -#define Ky_STab 0x8F00 - -#define Ky_BS 0x0008 -#define Ky_CR 0x000D -#define Ky_ESC 0x001B -#define Ky_Clr 0x007F - -#define Ky_Plus 0x002D -#define Ky_Minus 0x002B - -#define Ky_AltA 0x1E00 -#define Ky_AltB 0x3000 -#define Ky_AltC 0x2E00 -#define Ky_AltD 0x2000 -#define Ky_AltE 0x1200 -#define Ky_AltF 0x2100 -#define Ky_AltG 0x2200 -#define Ky_AltH 0x2300 -#define Ky_AltI 0x1700 -#define Ky_AltJ 0x2400 -#define Ky_AltK 0x2500 -#define Ky_AltL 0x2600 -#define Ky_AltM 0x3200 -#define Ky_AltN 0x3100 -#define Ky_AltO 0x1800 -#define Ky_AltP 0x1900 -#define Ky_AltQ 0x1000 -#define Ky_AltR 0x1300 -#define Ky_AltS 0x1F00 -#define Ky_AltT 0x1400 -#define Ky_AltU 0x1600 -#define Ky_AltV 0x2F00 -#define Ky_AltW 0x1100 -#define Ky_AltX 0x2D00 -#define Ky_AltY 0x1500 -#define Ky_AltZ 0x2C00 - - /* .ASM Functions From C_UTILS.ASM */ - -void far pascal dos_print (char far *Text); -void far pascal dos_prints (char far *Text); -void far pascal set_video_mode (int Mode); -int far pascal scan_keyboard (void); -int far pascal random_int (int MaxValue); -void far pascal init_random (void); -int far pascal int_sqr (int X, int Round); -int far pascal timer_count (void); - -#endif \ No newline at end of file diff --git a/modex105/DEMOS/C/C_UTILS.LST b/modex105/DEMOS/C/C_UTILS.LST deleted file mode 100755 index f9664ba0..00000000 --- a/modex105/DEMOS/C/C_UTILS.LST +++ /dev/null @@ -1,597 +0,0 @@ -Microsoft (R) Macro Assembler Version 6.11 07/03/14 12:38:18 -c_utils.asm Page 1 - 1 - - - ;======================================================= - ;=== C_UTILS.ASM - Asm Utilities for C/C++ === - ;======================================================= - - PAGE 255, 132 - - .MODEL Medium - .286 - - ; ==== MACROS ==== - - ; macros to PUSH and POP multiple registers - - PUSHx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - push R1 ; Save R1 - PUSHx R2, R3, R4, R5, R6, R7, R8 - ENDIF - ENDM - - POPx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - pop R1 ; Restore R1 - POPx R2, R3, R4, R5, R6, R7, R8 - ENDIF - ENDM - - ; Macro to Clear a Register to 0 - - CLR MACRO Register - xor Register, Register ; Set Register = 0 - ENDM - - ; Macros to Decrement Counter & Jump on Condition - - LOOPx MACRO Register, Destination - dec Register ; Counter-- - jnz Destination ; Jump if not 0 - ENDM - - LOOPjz MACRO Register, Destination - dec Register ; Counter-- - jz Destination ; Jump if 0 - ENDM - - - ; ==== General Constants ==== - - = 0000 False EQU 0 - =-0001 True EQU -1 - = 0000 nil EQU 0 - - = BYTE PTR b EQU BYTE PTR - = WORD PTR w EQU WORD PTR - = DWORD PTR d EQU DWORD PTR - = OFFSET o EQU OFFSET - = FAR PTR f EQU FAR PTR - = SHORT s EQU SHORT - = ?,?,?,? ?x4 EQU <?,?,?,?> - = ?,?,? ?x3 EQU <?,?,?> - - - 0000 .Data - - EVEN - - 0000 1CE5 7307 0322 RND_Seed DW 7397, 29447, 802 - 0006 00B3 00B7 00B6 RND_Mult DW 179, 183, 182 - 000C 8003 800B 800F RND_ModV DW 32771, 32779, 32783 - - 0012 0D 0A CR_LF DB 13, 10 ; the CRLF data - - 0000 .Code - - ;=========================================== - ;void far pascal dos_print (far char *Text) - ;=========================================== - ; - ; - Print Text Directly to DOS console w/ CR/LF - ; - - PUBLIC DOS_PRINT - - 0010 DP_Stack STRUC - 0000 0000 0000 0000 DW ?x4 ; DI, SI, DS, BP - 0000 - 0008 00000000 DD ? ; Caller - 000C 00000000 DP_Text DD ? ; Far Address of Text to print - DP_Stack ENDS - - - 0000 DOS_PRINT PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 0000 55 1 push BP ; Save R1 - 0001 1E 2 push DS ; Save R1 - 0002 56 3 push SI ; Save R1 - 0003 57 4 push DI ; Save R1 - 0004 8B EC mov BP, SP ; Set up Stack Frame - - 0006 C5 56 0C lds DX, [BP].DP_Text ; Get Addr of Text$ descriptor - - ; Compute Length of string - - CLR CX ; Length = 0 - 0009 33 C9 1 xor CX, CX ; Set Register = 0 - 000B 8B F2 mov SI, DX ; DS:SI = String data - - 000D @@DP_Scan_it: - - 000D 80 3C 00 cmp b [SI], 0 ; Null Byte found? - 0010 74 04 je @@DP_Got_Len ; exit loop if so - - 0012 41 inc CX ; Len++ - 0013 46 inc SI ; Point to next char - 0014 EB F7 jmp s @@DP_Scan_it ; check again... - - 0016 @@DP_Got_len: - - 0016 E3 07 jcxz @No_Print ; Don't Print if empty - - 0018 BB 0001 mov BX, 1 ; 1= DOS Handle for Display - 001B B4 40 mov AH, 40h ; Write Text Function - 001D CD 21 int 21h ; Call DOS to do it - - 001F @No_Print: - 001F B8 ---- R mov AX, SEG DGROUP ; Restore DGroup - 0022 8E D8 mov DS, AX - - 0024 BA 0012 R mov DX, o CR_LF ; Get Addr of CR/LF pair - 0027 B9 0002 mov CX, 2 ; 2 Characters to Write - 002A BB 0001 mov BX, 1 ; 1= DOS Handle for Display - - 002D B4 40 mov AH, 40h ; Write Text Function - 002F CD 21 int 21h ; Call DOS to do it - - 0031 FC cld ; Reset Direction Flag - POPx DI, SI, DS, BP ; Restore Saved Registers - 0032 5F 1 pop DI ; Restore R1 - 0033 5E 2 pop SI ; Restore R1 - 0034 1F 3 pop DS ; Restore R1 - 0035 5D 4 pop BP ; Restore R1 - 0036 CA 0004 ret 4 ; Exit & Clean Up Stack - - 0039 DOS_PRINT ENDP - - - ;=========================================== - ;void far pascal dos_prints (char far *Text) - ;=========================================== - ; - ; Print Text Directly to DOS console - ; without a trailing CR/LF - ; - - PUBLIC DOS_PRINTS - - 0039 DOS_PRINTS PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 0039 55 1 push BP ; Save R1 - 003A 1E 2 push DS ; Save R1 - 003B 56 3 push SI ; Save R1 - 003C 57 4 push DI ; Save R1 - 003D 8B EC mov BP, SP ; Set up Stack Frame - - 003F C5 56 0C lds DX, [BP].DP_Text ; Get Addr of Text$ descriptor - - ; Compute Length of string - - CLR CX ; Length = 0 - 0042 33 C9 1 xor CX, CX ; Set Register = 0 - 0044 8B F2 mov SI, DX ; DS:SI = String data - - 0046 @@DPS_Scan_it: - - 0046 80 3C 00 cmp b [SI], 0 ; Null Byte found? - 0049 74 04 je @@DPS_Got_Len ; exit loop if so - - 004B 41 inc CX ; Len++ - 004C 46 inc SI ; Point to next char - 004D EB F7 jmp s @@DPS_Scan_it ; check again... - - 004F @@DPS_Got_len: - - 004F E3 07 jcxz @DPS_Exit ; Don't Print if empty - - 0051 BB 0001 mov BX, 1 ; 1= DOS Handle for Display - 0054 B4 40 mov AH, 40h ; Write Text Function - 0056 CD 21 int 21h ; Call DOS to do it - - 0058 @DPS_Exit: - 0058 FC cld ; Reset Direction Flag - POPx DI, SI, DS, BP ; Restore Saved Registers - 0059 5F 1 pop DI ; Restore R1 - 005A 5E 2 pop SI ; Restore R1 - 005B 1F 3 pop DS ; Restore R1 - 005C 5D 4 pop BP ; Restore R1 - 005D CA 0002 ret 2 ; Exit & Clean Up Stack - - 0060 DOS_PRINTS ENDP - - - ;========================================= - ;void far pascal set_video_mode (int Mode) - ;========================================= - ; - ; Sets the Video Mode through the BIOS - ; - - PUBLIC SET_VIDEO_MODE - - 000E SVM_Stack STRUC - 0000 0000 0000 0000 DW ?x4 ; DI, SI, DS, BP - 0000 - 0008 00000000 DD ? ; Caller - 000C 00 00 SVM_Mode DB ?,? ; Desired Video Mode - SVM_Stack ENDS - - - 0060 SET_VIDEO_MODE PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 0060 55 1 push BP ; Save R1 - 0061 1E 2 push DS ; Save R1 - 0062 56 3 push SI ; Save R1 - 0063 57 4 push DI ; Save R1 - 0064 8B EC mov BP, SP ; Set up Stack Frame - - CLR AH ; Function 0 - 0066 32 E4 1 xor AH, AH ; Set Register = 0 - 0068 8A 46 0C mov AL, [BP].SVM_Mode ; Get Mode # - - 006B CD 10 int 10H ; Change Video Modes - - 006D @SVM_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - 006D 5F 1 pop DI ; Restore R1 - 006E 5E 2 pop SI ; Restore R1 - 006F 1F 3 pop DS ; Restore R1 - 0070 5D 4 pop BP ; Restore R1 - 0071 CA 0002 ret 2 ; Exit & Clean Up Stack - - 0074 SET_VIDEO_MODE ENDP - - - ;=================================== - ;int far pascal scan_keyboard (void) - ;=================================== - ; - ; Function to scan keyboard for a pressed key - ; - - PUBLIC SCAN_KEYBOARD - - 0074 SCAN_KEYBOARD PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 0074 55 1 push BP ; Save R1 -Microsoft (R) Macro Assembler Version 6.11 07/03/14 12:38:18 -c_utils.asm Page 2 - 1 - - - 0075 1E 2 push DS ; Save R1 - 0076 56 3 push SI ; Save R1 - 0077 57 4 push DI ; Save R1 - - 0078 B4 01 mov AH, 01H ; Function #1 - 007A CD 16 INT 16H ; Call Keyboard Driver - 007C 74 0C JZ @SK_NO_KEY ; Exit if Zero flag set - - 007E B4 00 mov AH, 00H ; Remove Key from Buffer - 0080 CD 16 INT 16H ; Get Keycode in AX - - 0082 0A C0 OR AL, AL ; Low Byte Set (Ascii?) - 0084 74 06 JZ @SK_Exit ; if not, it's a F-Key - - CLR AH ; Clear ScanCode if Ascii - 0086 32 E4 1 xor AH, AH ; Set Register = 0 - 0088 EB 02 JMP s @SK_Exit ; Return Key in AX - - 008A @SK_NO_KEY: - CLR AX ; Return Nil (no Keypress) - 008A 33 C0 1 xor AX, AX ; Set Register = 0 - - 008C @SK_Exit: - 008C FC cld ; Reset Direction Flag - POPx DI, SI, DS, BP ; Restore Saved Registers - 008D 5F 1 pop DI ; Restore R1 - 008E 5E 2 pop SI ; Restore R1 - 008F 1F 3 pop DS ; Restore R1 - 0090 5D 4 pop BP ; Restore R1 - 0091 CB ret ; Exit & Clean Up Stack - - 0092 SCAN_KEYBOARD ENDP - - - ;======================================== - ;int far pascal random_int (int MaxValue) - ;======================================== - ; - ; Returns a pseudo-random number in the range of (0.. MaxInt-1) - ; - - - PUBLIC RANDOM_INT - - 0008 RI_Stack STRUC - 0000 0000 DW ? ; BP - 0002 00000000 DD ? ; Caller - 0006 0000 RI_MaxVal DW ? ; Maximum Value to Return + 1 - RI_Stack ENDS - - - 0092 RANDOM_INT PROC FAR - - 0092 55 push BP ; Preserve Important Registers - 0093 8B EC mov BP, SP ; Set up Stack Frame - - CLR BX ; BX is the data index - 0095 33 DB 1 xor BX, BX ; Set Register = 0 - CLR CX ; CX is the accumulator - 0097 33 C9 1 xor CX, CX ; Set Register = 0 - - REPT 3 - mov AX, RND_Seed[BX] ; load the initial seed - mul RND_Mult[BX] ; multiply it - div RND_ModV[BX] ; and obtain the Mod value - mov RND_Seed[BX], DX ; save that for the next time - - add CX, DX ; add it into the accumulator - inc BX - inc BX ; point to the next set of values - ENDM - 0099 8B 87 0000 R 1 mov AX, RND_Seed[BX] ; load the initial seed - 009D F7 A7 0006 R 1 mul RND_Mult[BX] ; multiply it - 00A1 F7 B7 000C R 1 div RND_ModV[BX] ; and obtain the Mod value - 00A5 89 97 0000 R 1 mov RND_Seed[BX], DX ; save that for the next time - 00A9 03 CA 1 add CX, DX ; add it into the accumulator - 00AB 43 1 inc BX - 00AC 43 1 inc BX ; point to the next set of values - 00AD 8B 87 0000 R 1 mov AX, RND_Seed[BX] ; load the initial seed - 00B1 F7 A7 0006 R 1 mul RND_Mult[BX] ; multiply it - 00B5 F7 B7 000C R 1 div RND_ModV[BX] ; and obtain the Mod value - 00B9 89 97 0000 R 1 mov RND_Seed[BX], DX ; save that for the next time - 00BD 03 CA 1 add CX, DX ; add it into the accumulator - 00BF 43 1 inc BX - 00C0 43 1 inc BX ; point to the next set of values - 00C1 8B 87 0000 R 1 mov AX, RND_Seed[BX] ; load the initial seed - 00C5 F7 A7 0006 R 1 mul RND_Mult[BX] ; multiply it - 00C9 F7 B7 000C R 1 div RND_ModV[BX] ; and obtain the Mod value - 00CD 89 97 0000 R 1 mov RND_Seed[BX], DX ; save that for the next time - 00D1 03 CA 1 add CX, DX ; add it into the accumulator - 00D3 43 1 inc BX - 00D4 43 1 inc BX ; point to the next set of values - - 00D5 8B C1 mov AX, CX ; AX = Random # - CLR DX ; DX = 0 - 00D7 33 D2 1 xor DX, DX ; Set Register = 0 - 00D9 F7 76 06 div [BP].RI_MaxVal ; DX = DX:AX / MAxVal Remainder - - 00DC 8B C2 mov AX, DX - - 00DE 5D pop BP ; Restore BP - 00DF CA 0002 ret 2 ; back to BASIC with AX holding the result - - 00E2 RANDOM_INT ENDP - - - ;================================== - ;void far pascal init_random (void) - ;================================== - ; - ; Scrambles the psuedo-random number sequence - ; (XOR's the seed value with the timer) - ; - - PUBLIC INIT_RANDOM - - 00E2 INIT_RANDOM PROC FAR - - CLR AX ; Segment = 0000 - 00E2 33 C0 1 xor AX, AX ; Set Register = 0 - 00E4 8E C0 mov ES, AX - 00E6 26: A1 046C mov AX, ES:[046Ch] ; Get Timer Lo Word - - 00EA 31 06 0000 R xor RND_Seed, AX ; Scramble 1st Seed - - 00EE CB ret ; Exit & Clean Up Stack - - 00EF INIT_RANDOM ENDP - - ;========================================= - ;int far pascal int_sqr (int X, int Round) - ;========================================= - ; - ; Returns the Integer Square Root of (X) - ; Round allows the return value to be rounded to the - ; nearest integer value by passing 0x80. Passing 0 - ; return the Integer Portion only. The rounding amound is - ; a number from 0 to 1 multiplied by 256, thus - ; 0.5 * 0x100 = 0x80! - ; - - 000C ISQ_Stack STRUC - 0000 0000 0000 DW ?,? ; BP, DI - 0004 00000000 DD ? ; Caller - 0008 0000 ISQ_Round DW ? ; Amount to Round Result * 256 - 000A 0000 ISQ_X DW ? ; "X" - ISQ_Stack ENDS - - PUBLIC INT_SQR - - 00EF INT_SQR PROC FAR - - PUSHx BP, DI ; Save BP - 00EF 55 1 push BP ; Save R1 - 00F0 57 2 push DI ; Save R1 - 00F1 8B EC mov BP, SP ; Set up Stack Frame - - 00F3 33 C0 xor AX, AX ; {xor eax,eax} - 00F5 33 D2 xor DX, DX ; {xor edx,edx} - 00F7 8B 7E 0A mov DI, [BP].ISQ_X ; {mov edi,x} - - 00FA B9 0010 mov CX, 16 ; {mov cx, 32} - - 00FD @ISQ_L: - - 00FD D1 E7 shl DI, 1 ; {shl edi,1} - 00FF D1 D2 rcl DX, 1 ; {rcl edx,1} - 0101 D1 E7 shl DI, 1 ; {shl edi,1} - 0103 D1 D2 rcl DX, 1 ; {rcl edx,1} - 0105 D1 E0 shl AX, 1 ; {shl eax,1} - 0107 8B D8 mov BX, AX ; {mov ebx,eax} - 0109 D1 E3 shl BX, 1 ; {shl ebx,1} - 010B 43 inc BX ; {inc ebx} - 010C 3B D3 cmp DX, BX ; {cmp edx,ebx} - 010E 7C 03 jl @ISQ_S - - 0110 2B D3 sub DX, BX ; {sub edx,ebx} - 0112 40 inc AX ; {inc eax} - - 0113 @ISQ_S: - 0113 E2 E8 loop @ISQ_L - - 0115 03 46 08 add ax, [BP].ISQ_Round ; {add eax,$00008000} - ; {*round* result in hi word: ie. +0 - .5} - 0118 C1 E8 08 shr ax, 8 ; {shr eax,16} {to ax (result)} - - POPx DI, BP ; Restore Registers - 011B 5F 1 pop DI ; Restore R1 - 011C 5D 2 pop BP ; Restore R1 - 011D CA 0004 ret 4 ; Exit - - 0120 INT_SQR ENDP - - ;================================= - ;int far pascal timer_count (void) - ;================================= - ; - ; Returns the current timer value as an integer/long integer - ; - - PUBLIC TIMER_COUNT - - 0120 TIMER_COUNT PROC FAR - - CLR AX ; Segment = 0000 - 0120 33 C0 1 xor AX, AX ; Set Register = 0 - 0122 8E C0 mov ES, AX - 0124 26: A1 046C mov AX, ES:[046Ch] ; Get Timer Lo Word - 0128 26: 8B 16 046E mov DX, ES:[046Eh] ; Get Timer Hi Word - 012D CB ret ; Exit & Clean Up Stack - - 012E TIMER_COUNT ENDP - - - END -Microsoft (R) Macro Assembler Version 6.11 07/03/14 12:38:18 -c_utils.asm Symbols 3 - 1 - - - - -Macros: - - N a m e Type - -CLR . . . . . . . . . . . . . . Proc -LOOPjz . . . . . . . . . . . . . Proc -LOOPx . . . . . . . . . . . . . Proc -POPx . . . . . . . . . . . . . . Proc -PUSHx . . . . . . . . . . . . . Proc -Microsoft (R) Macro Assembler Version 6.11 07/03/14 12:38:18 -c_utils.asm Symbols 4 - 1 - - - - -Structures and Unions: - - N a m e Size - Offset Type - -DP_Stack . . . . . . . . . . . . 0010 - DP_Text . . . . . . . . . . . 000C DWord -ISQ_Stack . . . . . . . . . . . 000C - ISQ_Round . . . . . . . . . . 0008 Word - ISQ_X . . . . . . . . . . . . 000A Word -RI_Stack . . . . . . . . . . . . 0008 - RI_MaxVal . . . . . . . . . . 0006 Word -SVM_Stack . . . . . . . . . . . 000E - SVM_Mode . . . . . . . . . . . 000C Byte -Microsoft (R) Macro Assembler Version 6.11 07/03/14 12:38:18 -c_utils.asm Symbols 5 - 1 - - - - -Segments and Groups: - - N a m e Size Length Align Combine Class - -C_UTILS_TEXT . . . . . . . . . . 16 Bit 012E Word Public 'CODE' -DGROUP . . . . . . . . . . . . . GROUP -_DATA . . . . . . . . . . . . . 16 Bit 0014 Word Public 'DATA' -Microsoft (R) Macro Assembler Version 6.11 07/03/14 12:38:18 -c_utils.asm Symbols 6 - 1 - - - - -Procedures, parameters and locals: - - N a m e Type Value Attr - -DOS_PRINTS . . . . . . . . . . . P Far 0039 C_UTILS_TEXT Length= 0027 Public -DOS_PRINT . . . . . . . . . . . P Far 0000 C_UTILS_TEXT Length= 0039 Public -INIT_RANDOM . . . . . . . . . . P Far 00E2 C_UTILS_TEXT Length= 000D Public -INT_SQR . . . . . . . . . . . . P Far 00EF C_UTILS_TEXT Length= 0031 Public -RANDOM_INT . . . . . . . . . . . P Far 0092 C_UTILS_TEXT Length= 0050 Public -SCAN_KEYBOARD . . . . . . . . . P Far 0074 C_UTILS_TEXT Length= 001E Public -SET_VIDEO_MODE . . . . . . . . . P Far 0060 C_UTILS_TEXT Length= 0014 Public -TIMER_COUNT . . . . . . . . . . P Far 0120 C_UTILS_TEXT Length= 000E Public -Microsoft (R) Macro Assembler Version 6.11 07/03/14 12:38:18 -c_utils.asm Symbols 7 - 1 - - - - -Symbols: - - N a m e Type Value Attr - -?x3 . . . . . . . . . . . . . . Text ?,?,? -?x4 . . . . . . . . . . . . . . Text ?,?,?,? -@@DPS_Got_len . . . . . . . . . L Near 004F C_UTILS_TEXT -@@DPS_Scan_it . . . . . . . . . L Near 0046 C_UTILS_TEXT -@@DP_Got_len . . . . . . . . . . L Near 0016 C_UTILS_TEXT -@@DP_Scan_it . . . . . . . . . . L Near 000D C_UTILS_TEXT -@CodeSize . . . . . . . . . . . Number 0001h -@DPS_Exit . . . . . . . . . . . L Near 0058 C_UTILS_TEXT -@DataSize . . . . . . . . . . . Number 0000h -@ISQ_L . . . . . . . . . . . . . L Near 00FD C_UTILS_TEXT -@ISQ_S . . . . . . . . . . . . . L Near 0113 C_UTILS_TEXT -@Interface . . . . . . . . . . . Number 0000h -@Model . . . . . . . . . . . . . Number 0004h -@No_Print . . . . . . . . . . . L Near 001F C_UTILS_TEXT -@SK_Exit . . . . . . . . . . . . L Near 008C C_UTILS_TEXT -@SK_NO_KEY . . . . . . . . . . . L Near 008A C_UTILS_TEXT -@SVM_Exit . . . . . . . . . . . L Near 006D C_UTILS_TEXT -@code . . . . . . . . . . . . . Text C_UTILS_TEXT -@data . . . . . . . . . . . . . Text DGROUP -@fardata? . . . . . . . . . . . Text FAR_BSS -@fardata . . . . . . . . . . . . Text FAR_DATA -@stack . . . . . . . . . . . . . Text DGROUP -CR_LF . . . . . . . . . . . . . Byte 0012 _DATA -False . . . . . . . . . . . . . Number 0000h -RND_ModV . . . . . . . . . . . . Word 000C _DATA -RND_Mult . . . . . . . . . . . . Word 0006 _DATA -RND_Seed . . . . . . . . . . . . Word 0000 _DATA -True . . . . . . . . . . . . . . Number -0001h -b . . . . . . . . . . . . . . . Text BYTE PTR -d . . . . . . . . . . . . . . . Text DWORD PTR -f . . . . . . . . . . . . . . . Text FAR PTR -nil . . . . . . . . . . . . . . Number 0000h -o . . . . . . . . . . . . . . . Text OFFSET -s . . . . . . . . . . . . . . . Text SHORT -w . . . . . . . . . . . . . . . Text WORD PTR - - 0 Warnings - 0 Errors diff --git a/modex105/DEMOS/C/C_UTILS.SBR b/modex105/DEMOS/C/C_UTILS.SBR deleted file mode 100755 index 0301171bdd90f778ed3f244b37130f9388df7f0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1731 zcmZ8hU1(fY5dQAuK&p#UAC#&fKJ+1i$i~{%wn9$2yN#Fb?%mvb6JlMtU9-E%CfnU~ zf101hwzk#OG>vU+Qxyc!2N9n{@L3cD5qwebS;PmQL{UWW!I`<6G!~ZSyEEr}b7tn7 zf#VpY4i`@p2M@?E>mDuUymV$_FuA{&&g8tHn1VAIbvw0s`>9g<6zE0t(XKMmUJw<0 zHy?s-iluVL5`exDQx!objK<w`#*2g$^s|_!5Tu6l(eca+N4;S`4chInbsGL~KJDcq zr93328r-}aMzI}qLToc^3!`Av2d&EYEJ8Pz@uQSCCQs={qRcS{>acF3Q)yL8lNHdY z(+7JBZZH}JozmniXxuTJN{Wv@-hiJ^M?s}hMq&mu<d_B$HP9Xb^r(K8g}D#OCTu$< z*ejoN$a-F30knWbg}HX0hRrvlLaWy3fLbu8L7yT~6;}&3T?nGgLXBOYz_dV9y<2Tq z_C>*DsS$~{0n-MBnhI<O;)|nBz_9;*iQPqEEO?#+b2dfCbdi__{Q?0~pl=maL7NJ= z1}`b#L>>?z>CnI#*j%$*se|?l<vd=N$I=Hd^YS#RDd0OJQm6%_{3v@&J<Bj0nmv!n z#YLpDJ`&8c=9on-;}Hd1#s>w^L;Am0jr`8vA;!PtUtas20*?Hi0*+i(!2Hh%{}P54 z_G#P|n2N?_722Je1Nq{j!*c#C+FFi3V9shrA1PormzFJYr&ErZQ7#snRblNA+d*;C z6T-HvU7lI$73~$+6c;V1EivB_IdG1j_Y7zZ<{aoN{XZ!7^WX&1Qo0MOv0S&_QE5Hw zm<t+NyYMP2qtq$IgcXMy%5u5L0%o~pL1!Fu5tNbh%ycPcYL>^9=@G|V+G0ZTGHjWd zH094>s_NnCv^<L2^UBk?A--7AufbMJEx9$M4cu@{U9a(U*<JPjPuCT3(jm$1buh!1 zjO+@6@!Xa`zlK=>9gq`OFt0J}$u|(Chr?lQ$-gku%FnC7^3dP43Vsqdz2BReRUM4r z&SY>OS3z^Vxw#t8%}BEo)hj%!GcZ>rq*MyiYe<jy-dI6(vk0@MVfz)Z=6;0X`Qrxh zs<N_^?pjq}h@bwHM{_%_!3M{pyeC@=^efCY(BI-%S4TY6zrn17Saj>!n<pJp(+IrZ zEHAU2`>kJm^fWUJyos>YWht>1?8)m$MPs3x4WckJ5rSNp>pVkJ&l@Pnu910PcFYZ} z=06a?@BBdlx8ySgOm|rU=eI`yb$hznh;_vxm~+eqXi%#~18?D2sosvCf#gltN!GXq zJMWlTO@sHZ<$b%oe<#F2_sDL&1>fD0z<rLn1^T$x!p&X_x101K%qHkr4U6P$G`IH2 kZ4I(dO7b=uH5M9I1j%={1q%9Ja^<4G%SC6+Y1Qxj59E_l!T<mO diff --git a/modex105/DEMOS/C/MODEX.ASM b/modex105/DEMOS/C/MODEX.ASM deleted file mode 100755 index 2985fd80..00000000 --- a/modex105/DEMOS/C/MODEX.ASM +++ /dev/null @@ -1,3295 +0,0 @@ -;======================================================== -; MODEX.ASM - A Complete Mode X Library -; -; Version 1.04 Release, 3 May 1993, By Matt Pritchard -; With considerable input from Michael Abrash -; -; The following information is donated to the public domain in -; the hopes that save other programmers much frustration. -; -; If you do use this code in a product, it would be nice if -; you include a line like "Mode X routines by Matt Pritchard" -; in the credits. -; -; ========================================================= -; -; All of this code is designed to be assembled with MASM 5.10a -; but TASM 3.0 could be used as well. -; -; The routines contained are designed for use in a MEDIUM model -; program. All Routines are FAR, and is assumed that a DGROUP -; data segment exists and that DS will point to it on entry. -; -; For all routines, the AX, BX, CX, DX, ES and FLAGS registers -; will not be preserved, while the DS, BP, SI and DI registers -; will be preserved. -; -; Unless specifically noted, All Parameters are assumed to be -; "PASSED BY VALUE". That is, the actual value is placed on -; the stack. When a reference is passed it is assumed to be -; a near pointer to a variable in the DGROUP segment. -; -; Routines that return a single 16-Bit integer value will -; return that value in the AX register. -; -; This code will *NOT* run on an 8086/8088 because 80286+ -; specific instructions are used. If you have an 8088/86 -; and VGA, you can buy an 80386-40 motherboard for about -; $160 and move into the 90's. -; -; This code is reasonably optimized: Most drawing loops have -; been unrolled once and memory references are minimized by -; keeping stuff in registers when possible. -; -; Error Trapping varies by Routine. No Clipping is performed -; so the caller should verify that all coordinates are valid. -; -; Several Macros are used to simplify common 2 or 3 instruction -; sequences. Several Single letter Text Constants also -; simplify common assembler expressions like "WORD PTR". -; -; ------------------ Mode X Variations ------------------ -; -; Mode # Screen Size Max Pages Aspect Ratio (X:Y) -; -; 0 320 x 200 4 Pages 1.2:1 -; 1 320 x 400 2 Pages 2.4:1 -; 2 360 x 200 3 Pages 1.35:1 -; 3 360 x 400 1 Page 2.7:1 -; 4 320 x 240 3 Pages 1:1 -; 5 320 x 480 1 Page 2:1 -; 6 360 x 240 3 Pages 1.125:1 -; 7 360 x 480 1 Page 2.25:1 -; -; -------------------- The Legal Stuff ------------------ -; -; No warranty, either written or implied, is made as to -; the accuracy and usability of this code product. Use -; at your own risk. Batteries not included. Pepperoni -; and extra cheese available for an additional charge. -; -; ----------------------- The Author -------------------- -; -; Matt Pritchard is a paid programmer who'd rather be -; writing games. He can be reached at: P.O. Box 140264, -; Irving, TX 75014 USA. Michael Abrash is a living -; god, who now works for Bill Gates (Microsoft). -; -; -------------------- Revision History ----------------- -; 4-12-93: v1.02 - SET_POINT & READ_POINT now saves DI -; SET_MODEX now saves SI -; 5-3-93: v1.04 - added LOAD_DAC_REGISTERS and -; READ_DAC_REGISTERS. Expanded CLR Macro -; to handle multiple registers -; - - PAGE 255, 132 - - .MODEL Medium - .286 - - ; ===== MACROS ===== - - ; Macro to OUT a 16 bit value to an I/O port - -OUT_16 MACRO Register, Value - IFDIFI <Register>, <DX> ; If DX not setup - MOV DX, Register ; then Select Register - ENDIF - IFDIFI <Value>, <AX> ; If AX not setup - MOV AX, Value ; then Get Data Value - ENDIF - OUT DX, AX ; Set I/O Register(s) -ENDM - - ; Macro to OUT a 8 bit value to an I/O Port - -OUT_8 MACRO Register, Value - IFDIFI <Register>, <DX> ; If DX not setup - MOV DX, Register ; then Select Register - ENDIF - IFDIFI <Value>, <AL> ; If AL not Setup - MOV AL, Value ; then Get Data Value - ENDIF - OUT DX, AL ; Set I/O Register -ENDM - - ; macros to PUSH and POP multiple registers - -PUSHx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - PUSH R1 ; Save R1 - PUSHx R2, R3, R4, R5, R6, R7, R8 - ENDIF -ENDM - -POPx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - POP R1 ; Restore R1 - POPx R2, R3, R4, R5, R6, R7, R8 - ENDIF -ENDM - - ; Macro to Clear Registers to 0 - -CLR MACRO Register, R2, R3, R4, R5, R6 - IFNB <Register> - XOR Register, Register ; Set Register = 0 - CLR R2, R3, R4, R5, R6 - ENDIF -ENDM - - ; Macros to Decrement Counter & Jump on Condition - -LOOPx MACRO Register, Destination - DEC Register ; Counter-- - JNZ Destination ; Jump if not 0 -ENDM - -LOOPjz MACRO Register, Destination - DEC Register ; Counter-- - JZ Destination ; Jump if 0 -ENDM - - - ; ===== General Constants ===== - - False EQU 0 - True EQU -1 - nil EQU 0 - - b EQU BYTE PTR - w EQU WORD PTR - d EQU DWORD PTR - o EQU OFFSET - f EQU FAR PTR - s EQU SHORT - ?x4 EQU <?,?,?,?> - ?x3 EQU <?,?,?> - - ; ===== VGA Register Values ===== - - VGA_Segment EQU 0A000h ; Vga Memory Segment - - ATTRIB_Ctrl EQU 03C0h ; VGA Attribute Controller - GC_Index EQU 03CEh ; VGA Graphics Controller - SC_Index EQU 03C4h ; VGA Sequencer Controller - SC_Data EQU 03C5h ; VGA Sequencer Data Port - CRTC_Index EQU 03D4h ; VGA CRT Controller - CRTC_Data EQU 03D5h ; VGA CRT Controller Data - MISC_OUTPUT EQU 03C2h ; VGA Misc Register - INPUT_1 EQU 03DAh ; Input Status #1 Register - - DAC_WRITE_ADDR EQU 03C8h ; VGA DAC Write Addr Register - DAC_READ_ADDR EQU 03C7h ; VGA DAC Read Addr Register - PEL_DATA_REG EQU 03C9h ; VGA DAC/PEL data Register R/W - - PIXEL_PAN_REG EQU 033h ; Attrib Index: Pixel Pan Reg - MAP_MASK EQU 002h ; Sequ Index: Write Map Mask reg - READ_MAP EQU 004h ; GC Index: Read Map Register - START_DISP_HI EQU 00Ch ; CRTC Index: Display Start Hi - START_DISP_LO EQU 00Dh ; CRTC Index: Display Start Lo - - MAP_MASK_PLANE1 EQU 00102h ; Map Register + Plane 1 - MAP_MASK_PLANE2 EQU 01102h ; Map Register + Plane 1 - ALL_PLANES_ON EQU 00F02h ; Map Register + All Bit Planes - - CHAIN4_OFF EQU 00604h ; Chain 4 mode Off - ASYNC_RESET EQU 00100h ; (A)synchronous Reset - SEQU_RESTART EQU 00300h ; Sequencer Restart - - LATCHES_ON EQU 00008h ; Bit Mask + Data from Latches - LATCHES_OFF EQU 0FF08h ; Bit Mask + Data from CPU - - VERT_RETRACE EQU 08h ; INPUT_1: Vertical Retrace Bit - PLANE_BITS EQU 03h ; Bits 0-1 of Xpos = Plane # - ALL_PLANES EQU 0Fh ; All Bit Planes Selected - CHAR_BITS EQU 0Fh ; Bits 0-3 of Character Data - - GET_CHAR_PTR EQU 01130h ; VGA BIOS Func: Get Char Set - ROM_8x8_Lo EQU 03h ; ROM 8x8 Char Set Lo Pointer - ROM_8x8_Hi EQU 04h ; ROM 8x8 Char Set Hi Pointer - - ; Constants Specific for these routines - - NUM_MODES EQU 8 ; # of Mode X Variations - - ; Specific Mode Data Table format... - -Mode_Data_Table STRUC - M_MiscR DB ? ; Value of MISC_OUTPUT register - M_Pages DB ? ; Maximum Possible # of pages - M_XSize DW ? ; X Size Displayed on screen - M_YSize DW ? ; Y Size Displayed on screen - M_XMax DW ? ; Maximum Possible X Size - M_YMax DW ? ; Maximum Possible Y Size - M_CRTC DW ? ; Table of CRTC register values -Mode_Data_Table ENDS - - ; ===== DGROUP STORAGE NEEDED (42 BYTES) ===== - - .DATA? - -SCREEN_WIDTH DW 0 ; Width of a line in Bytes -SCREEN_HEIGHT DW 0 ; Vertical Height in Pixels - -LAST_PAGE DW 0 ; # of Display Pages -PAGE_ADDR DW 4 DUP (0) ; Offsets to start of each page - -PAGE_SIZE DW 0 ; Size of Page in Addr Bytes - -DISPLAY_PAGE DW 0 ; Page # currently displayed -ACTIVE_PAGE DW 0 ; Page # currently active - -CURRENT_PAGE DW 0 ; Offset of current Page -CURRENT_SEGMENT DW 0 ; Segment of VGA memory - -CURRENT_XOFFSET DW 0 ; Current Display X Offset -CURRENT_YOFFSET DW 0 ; Current Display Y Offset - -CURRENT_MOFFSET DW 0 ; Current Start Offset - -MAX_XOFFSET DW 0 ; Current Display X Offset -MAX_YOFFSET DW 0 ; Current Display Y Offset - -CHARSET_LOW DW 0, 0 ; Far Ptr to Char Set: 0-127 -CHARSET_HI DW 0, 0 ; Far Ptr to Char Set: 128-255 - - .CODE - - ; ===== DATA TABLES ===== - - ; Data Tables, Put in Code Segment for Easy Access - ; (Like when all the other Segment Registers are in - ; use!!) and reduced DGROUP requirements... - - ; Bit Mask Tables for Left/Right/Character Masks - -Left_Clip_Mask DB 0FH, 0EH, 0CH, 08H - -Right_Clip_Mask DB 01H, 03H, 07H, 0FH - - ; Bit Patterns for converting character fonts - -Char_Plane_Data DB 00H,08H,04H,0CH,02H,0AH,06H,0EH - DB 01H,09H,05H,0DH,03H,0BH,07H,0FH - - ; CRTC Register Values for Various Configurations - -MODE_Single_Line: ; CRTC Setup Data for 400/480 Line modes - DW 04009H ; Cell Height (1 Scan Line) - DW 00014H ; Dword Mode off - DW 0E317H ; turn on Byte Mode - DW nil ; End of CRTC Data for 400/480 Line Mode - -MODE_Double_Line: ; CRTC Setup Data for 200/240 Line modes - DW 04109H ; Cell Height (2 Scan Lines) - DW 00014H ; Dword Mode off - DW 0E317H ; turn on Byte Mode - DW nil ; End of CRTC Data for 200/240 Line Mode - -MODE_320_Wide: ; CRTC Setup Data for 320 Horz Pixels - DW 05F00H ; Horz total - DW 04F01H ; Horz Displayed - DW 05002H ; Start Horz Blanking - DW 08203H ; End Horz Blanking - DW 05404H ; Start H Sync - DW 08005H ; End H Sync - DW nil ; End of CRTC Data for 320 Horz pixels - -MODE_360_Wide: ; CRTC Setup Data for 360 Horz Pixels - DW 06B00H ; Horz total - DW 05901H ; Horz Displayed - DW 05A02H ; Start Horz Blanking - DW 08E03H ; End Horz Blanking - DW 05E04H ; Start H Sync - DW 08A05H ; End H Sync - DW nil ; End of CRTC Data for 360 Horz pixels - -MODE_200_Tall: -MODE_400_Tall: ; CRTC Setup Data for 200/400 Line modes - DW 0BF06H ; Vertical Total - DW 01F07H ; Overflow - DW 09C10H ; V Sync Start - DW 08E11H ; V Sync End/Prot Cr0 Cr7 - DW 08F12H ; Vertical Displayed - DW 09615H ; V Blank Start - DW 0B916H ; V Blank End - DW nil ; End of CRTC Data for 200/400 Lines - -MODE_240_Tall: -MODE_480_Tall: ; CRTC Setup Data for 240/480 Line modes - DW 00D06H ; Vertical Total - DW 03E07H ; Overflow - DW 0EA10H ; V Sync Start - DW 08C11H ; V Sync End/Prot Cr0 Cr7 - DW 0DF12H ; Vertical Displayed - DW 0E715H ; V Blank Start - DW 00616H ; V Blank End - DW nil ; End of CRTC Data for 240/480 Lines - - ; Table of Display Mode Tables - -MODE_TABLE: - DW o MODE_320x200, o MODE_320x400 - DW o MODE_360x200, o MODE_360x400 - DW o MODE_320x240, o MODE_320x480 - DW o MODE_360x240, o MODE_360x480 - - ; Table of Display Mode Components - -MODE_320x200: ; Data for 320 by 200 Pixels - - DB 063h ; 400 scan Lines & 25 Mhz Clock - DB 4 ; Maximum of 4 Pages - DW 320, 200 ; Displayed Pixels (X,Y) - DW 1302, 816 ; Max Possible X and Y Sizes - - DW o MODE_320_Wide, o MODE_200_Tall - DW o MODE_Double_Line, nil - -MODE_320x400: ; Data for 320 by 400 Pixels - - DB 063h ; 400 scan Lines & 25 Mhz Clock - DB 2 ; Maximum of 2 Pages - DW 320, 400 ; Displayed Pixels X,Y - DW 648, 816 ; Max Possible X and Y Sizes - - DW o MODE_320_Wide, o MODE_400_Tall - DW o MODE_Single_Line, nil - -MODE_360x240: ; Data for 360 by 240 Pixels - - DB 0E7h ; 480 scan Lines & 28 Mhz Clock - DB 3 ; Maximum of 3 Pages - DW 360, 240 ; Displayed Pixels X,Y - DW 1092, 728 ; Max Possible X and Y Sizes - - DW o MODE_360_Wide, o MODE_240_Tall - DW o MODE_Double_Line , nil - -MODE_360x480: ; Data for 360 by 480 Pixels - - DB 0E7h ; 480 scan Lines & 28 Mhz Clock - DB 1 ; Only 1 Page Possible - DW 360, 480 ; Displayed Pixels X,Y - DW 544, 728 ; Max Possible X and Y Sizes - - DW o MODE_360_Wide, o MODE_480_Tall - DW o MODE_Single_Line , nil - -MODE_320x240: ; Data for 320 by 240 Pixels - - DB 0E3h ; 480 scan Lines & 25 Mhz Clock - DB 3 ; Maximum of 3 Pages - DW 320, 240 ; Displayed Pixels X,Y - DW 1088, 818 ; Max Possible X and Y Sizes - - DW o MODE_320_Wide, o MODE_240_Tall - DW o MODE_Double_Line, nil - -MODE_320x480: ; Data for 320 by 480 Pixels - - DB 0E3h ; 480 scan Lines & 25 Mhz Clock - DB 1 ; Only 1 Page Possible - DW 320, 480 ; Displayed Pixels X,Y - DW 540, 818 ; Max Possible X and Y Sizes - - DW o MODE_320_WIDE, o MODE_480_Tall - DW o MODE_Single_Line, nil - -MODE_360x200: ; Data for 360 by 200 Pixels - - DB 067h ; 400 scan Lines & 28 Mhz Clock - DB 3 ; Maximum of 3 Pages - DW 360, 200 ; Displayed Pixels (X,Y) - DW 1302, 728 ; Max Possible X and Y Sizes - - DW o MODE_360_Wide, MODE_200_Tall - DW o MODE_Double_Line, nil - -MODE_360x400: ; Data for 360 by 400 Pixels - - DB 067h ; 400 scan Lines & 28 Mhz Clock - DB 1 ; Maximum of 1 Pages - DW 360, 400 ; Displayed Pixels X,Y - DW 648, 816 ; Max Possible X and Y Sizes - - DW o MODE_360_Wide, MODE_400_Tall - DW o MODE_Single_Line, nil - - - ; ===== MODE X SETUP ROUTINES ===== - -;====================================================== -;SET_VGA_MODEX% (ModeType%, MaxXPos%, MaxYpos%, Pages%) -;====================================================== -; -; Sets Up the specified version of Mode X. Allows for -; the setup of multiple video pages, and a virtual -; screen which can be larger than the displayed screen -; (which can then be scrolled a pixel at a time) -; -; ENTRY: ModeType = Desired Screen Resolution (0-7) -; -; 0 = 320 x 200, 4 Pages max, 1.2:1 Aspect Ratio -; 1 = 320 x 400, 2 Pages max, 2.4:1 Aspect Ratio -; 2 = 360 x 200, 3 Pages max, 1.35:1 Aspect Ratio -; 3 = 360 x 400, 1 Page max, 2.7:1 Aspect Ratio -; 4 = 320 x 240, 3 Pages max, 1:1 Aspect Ratio -; 5 = 320 x 480, 1 Page max, 2:1 Aspect Ratio -; 6 = 360 x 240, 3 Pages max, 1.125:1 Aspect Ratio -; 7 = 360 x 480, 1 Page max, 2.25:1 Aspect Ratio -; -; MaxXpos = The Desired Virtual Screen Width -; MaxYpos = The Desired Virtual Screen Height -; Pages = The Desired # of Video Pages -; -; EXIT: AX = Success Flag: 0 = Failure / -1= Success -; - -SVM_STACK STRUC - SVM_Table DW ? ; Offset of Mode Info Table - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - SVM_Pages DW ? ; # of Screen Pages desired - SVM_Ysize DW ? ; Vertical Screen Size Desired - SVM_Xsize DW ? ; Horizontal Screen Size Desired - SVM_Mode DW ? ; Display Resolution Desired -SVM_STACK ENDS - - PUBLIC SET_VGA_MODEX - -SET_VGA_MODEX PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - SUB SP, 2 ; Allocate workspace - MOV BP, SP ; Set up Stack Frame - - ; Check Legality of Mode Request.... - - MOV BX, [BP].SVM_Mode ; Get Requested Mode # - CMP BX, NUM_MODES ; Is it 0..7? - JAE @SVM_BadModeSetup ; If Not, Error out - - SHL BX, 1 ; Scale BX - MOV SI, w MODE_TABLE[BX] ; CS:SI -> Mode Info - MOV [BP].SVM_Table, SI ; Save ptr for later use - - ; Check # of Requested Display Pages - - MOV CX, [BP].SVM_Pages ; Get # of Requested Pages - CLR CH ; Set Hi Word = 0! - CMP CL, CS:[SI].M_Pages ; Check # Pages for mode - JA @SVM_BadModeSetup ; Report Error if too Many Pages - JCXZ @SVM_BadModeSetup ; Report Error if 0 Pages - - ; Check Validity of X Size - - AND [BP].SVM_XSize, 0FFF8h ; X size Mod 8 Must = 0 - - MOV AX, [BP].SVM_XSize ; Get Logical Screen Width - CMP AX, CS:[SI].M_XSize ; Check against Displayed X - JB @SVM_BadModeSetup ; Report Error if too small - CMP AX, CS:[SI].M_XMax ; Check against Max X - JA @SVM_BadModeSetup ; Report Error if too big - - ; Check Validity of Y Size - - MOV BX, [BP].SVM_YSize ; Get Logical Screen Height - CMP BX, CS:[SI].M_YSize ; Check against Displayed Y - JB @SVM_BadModeSetup ; Report Error if too small - CMP BX, CS:[SI].M_YMax ; Check against Max Y - JA @SVM_BadModeSetup ; Report Error if too big - - ; Enough memory to Fit it all? - - SHR AX, 2 ; # of Bytes:Line = XSize/4 - MUL CX ; AX = Bytes/Line * Pages - MUL BX ; DX:AX = Total VGA mem needed - JNO @SVM_Continue ; Exit if Total Size > 256K - - DEC DX ; Was it Exactly 256K??? - OR DX, AX ; (DX = 1, AX = 0000) - JZ @SVM_Continue ; if so, it's valid... - -@SVM_BadModeSetup: - - CLR AX ; Return Value = False - JMP @SVM_Exit ; Normal Exit - -@SVM_Continue: - - MOV AX, 13H ; Start with Mode 13H - INT 10H ; Let BIOS Set Mode - - OUT_16 SC_INDEX, CHAIN4_OFF ; Disable Chain 4 Mode - OUT_16 SC_INDEX, ASYNC_RESET ; (A)synchronous Reset - OUT_8 MISC_OUTPUT, CS:[SI].M_MiscR ; Set New Timing/Size - OUT_16 SC_INDEX, SEQU_RESTART ; Restart Sequencer ... - - OUT_8 CRTC_INDEX, 11H ; Select Vert Retrace End Register - INC DX ; Point to Data - IN AL, DX ; Get Value, Bit 7 = Protect - AND AL, 7FH ; Mask out Write Protect - OUT DX, AL ; And send it back - - MOV DX, CRTC_INDEX ; Vga Crtc Registers - ADD SI, M_CRTC ; SI -> CRTC Parameter Data - - ; Load Tables of CRTC Parameters from List of Tables - -@SVM_Setup_Table: - - MOV DI, CS:[SI] ; Get Pointer to CRTC Data Tbl - ADD SI, 2 ; Point to next Ptr Entry - OR DI, DI ; A nil Ptr means that we have - JZ @SVM_Set_Data ; finished CRTC programming - -@SVM_Setup_CRTC: - MOV AX, CS:[DI] ; Get CRTC Data from Table - ADD DI, 2 ; Advance Pointer - OR AX, AX ; At End of Data Table? - JZ @SVM_Setup_Table ; If so, Exit & get next Table - - OUT DX, AX ; Reprogram VGA CRTC reg - JMP s @SVM_Setup_CRTC ; Process Next Table Entry - - ; Initialize Page & Scroll info, DI = 0 - -@SVM_Set_Data: - MOV DISPLAY_PAGE, DI ; Display Page = 0 - MOV ACTIVE_PAGE, DI ; Active Page = 0 - MOV CURRENT_PAGE, DI ; Current Page (Offset) = 0 - MOV CURRENT_XOFFSET, DI ; Horz Scroll Index = 0 - MOV CURRENT_YOFFSET, DI ; Vert Scroll Index = 0 - MOV CURRENT_MOFFSET, DI ; Memory Scroll Index = 0 - - MOV AX, VGA_SEGMENT ; Segment for VGA memory - MOV CURRENT_SEGMENT, AX ; Save for Future LES's - - ; Set Logical Screen Width, X Scroll and Our Data - - MOV SI, [BP].SVM_Table ; Get Saved Ptr to Mode Info - MOV AX, [BP].SVM_Xsize ; Get Display Width - - MOV CX, AX ; CX = Logical Width - SUB CX, CS:[SI].M_XSize ; CX = Max X Scroll Value - MOV MAX_XOFFSET, CX ; Set Maximum X Scroll - - SHR AX, 2 ; Bytes = Pixels / 4 - MOV SCREEN_WIDTH, AX ; Save Width in Pixels - - SHR AX, 1 ; Offset Value = Bytes / 2 - MOV AH, 13h ; CRTC Offset Register Index - XCHG AL, AH ; Switch format for OUT - OUT DX, AX ; Set VGA CRTC Offset Reg - - ; Setup Data table, Y Scroll, Misc for Other Routines - - MOV AX, [BP].SVM_Ysize ; Get Logical Screen Height - - MOV CX, AX ; CX = Logical Height - SUB BX, CS:[SI].M_YSize ; CX = Max Y Scroll Value - MOV MAX_YOFFSET, CX ; Set Maximum Y Scroll - - MOV SCREEN_HEIGHT, AX ; Save Height in Pixels - MUL SCREEN_WIDTH ; AX = Page Size in Bytes, - MOV PAGE_SIZE, AX ; Save Page Size - - MOV CX, [BP].SVM_Pages ; Get # of Pages - MOV LAST_PAGE, CX ; Save # of Pages - - CLR BX ; Page # = 0 - MOV DX, BX ; Page 0 Offset = 0 - -@SVM_Set_Pages: - - MOV PAGE_ADDR[BX], DX ; Set Page #(BX) Offset - ADD BX, 2 ; Page#++ - ADD DX, AX ; Compute Addr of Next Page - LOOPx CX, @SVM_Set_Pages ; Loop until all Pages Set - - ; Clear VGA Memory - - OUT_16 SC_INDEX, ALL_PLANES_ON ; Select All Planes - LES DI, d CURRENT_PAGE ; -> Start of VGA memory - - CLR AX ; AX = 0 - CLD ; Block Xfer Forwards - MOV CX, 8000H ; 32K * 4 * 2 = 256K - REP STOSW ; Clear dat memory! - - ; Setup Font Pointers - - MOV BH, ROM_8x8_Lo ; Ask for 8x8 Font, 0-127 - MOV AX, GET_CHAR_PTR ; Service to Get Pointer - INT 10h ; Call VGA BIOS - - MOV CHARSET_LOW, BP ; Save Char Set Offset - MOV CHARSET_LOW+2, ES ; Save Char Set Segment - - MOV BH, ROM_8x8_Hi ; Ask for 8x8 Font, 128-255 - MOV AX, GET_CHAR_PTR ; Service to Get Pointer - INT 10h ; Call VGA BIOS - - MOV CHARSET_HI, BP ; Save Char Set Offset - MOV CHARSET_HI+2, ES ; Save Char Set Segment - - MOV AX, True ; Return Success Code - -@SVM_EXIT: - ADD SP, 2 ; Deallocate workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 8 ; Exit & Clean Up Stack - -SET_VGA_MODEX ENDP - - -;================== -;SET_MODEX% (Mode%) -;================== -; -; Quickie Mode Set - Sets Up Mode X to Default Configuration -; -; ENTRY: ModeType = Desired Screen Resolution (0-7) -; (See SET_VGA_MODEX for list) -; -; EXIT: AX = Success Flag: 0 = Failure / -1= Success -; - -SM_STACK STRUC - DW ?,? ; BP, SI - DD ? ; Caller - SM_Mode DW ? ; Desired Screen Resolution -SM_STACK ENDS - - PUBLIC SET_MODEX - -SET_MODEX PROC FAR - - PUSHx BP, SI ; Preserve Important registers - MOV BP, SP ; Set up Stack Frame - - CLR AX ; Assume Failure - MOV BX, [BP].SM_Mode ; Get Desired Mode # - CMP BX, NUM_MODES ; Is it a Valid Mode #? - JAE @SMX_Exit ; If Not, don't Bother - - PUSH BX ; Push Mode Parameter - - SHL BX, 1 ; Scale BX to word Index - MOV SI, w MODE_TABLE[BX] ; CS:SI -> Mode Info - - PUSH CS:[SI].M_XSize ; Push Default X Size - PUSH CS:[SI].M_Ysize ; Push Default Y size - MOV AL, CS:[SI].M_Pages ; Get Default # of Pages - CLR AH ; Hi Byte = 0 - PUSH AX ; Push # Pages - - CALL f SET_VGA_MODEX ; Set up Mode X! - -@SMX_Exit: - POPx SI, BP ; Restore Registers - RET 2 ; Exit & Clean Up Stack - -SET_MODEX ENDP - - - ; ===== BASIC GRAPHICS PRIMITIVES ===== - -;============================ -;CLEAR_VGA_SCREEN (ColorNum%) -;============================ -; -; Clears the active display page -; -; ENTRY: ColorNum = Color Value to fill the page with -; -; EXIT: No meaningful values returned -; - -CVS_STACK STRUC - DW ?,? ; DI, BP - DD ? ; Caller - CVS_COLOR DB ?,? ; Color to Set Screen to -CVS_STACK ENDS - - PUBLIC CLEAR_VGA_SCREEN - -CLEAR_VGA_SCREEN PROC FAR - - PUSHx BP, DI ; Preserve Important Registers - MOV BP, SP ; Set up Stack Frame - - OUT_16 SC_INDEX, ALL_PLANES_ON ; Select All Planes - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - MOV AL, [BP].CVS_COLOR ; Get Color - MOV AH, AL ; Copy for Word Write - CLD ; Block fill Forwards - - MOV CX, PAGE_SIZE ; Get Size of Page - SHR CX, 1 ; Divide by 2 for Words - REP STOSW ; Block Fill VGA memory - - POPx DI, BP ; Restore Saved Registers - RET 2 ; Exit & Clean Up Stack - -CLEAR_VGA_SCREEN ENDP - - -;=================================== -;SET_POINT (Xpos%, Ypos%, ColorNum%) -;=================================== -; -; Plots a single Pixel on the active display page -; -; ENTRY: Xpos = X position to plot pixel at -; Ypos = Y position to plot pixel at -; ColorNum = Color to plot pixel with -; -; EXIT: No meaningful values returned -; - -SP_STACK STRUC - DW ?,? ; BP, DI - DD ? ; Caller - SETP_Color DB ?,? ; Color of Point to Plot - SETP_Ypos DW ? ; Y pos of Point to Plot - SETP_Xpos DW ? ; X pos of Point to Plot -SP_STACK ENDS - - PUBLIC SET_POINT - -SET_POINT PROC FAR - - PUSHx BP, DI ; Preserve Registers - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - MOV AX, [BP].SETP_Ypos ; Get Line # of Pixel - MUL SCREEN_WIDTH ; Get Offset to Start of Line - - MOV BX, [BP].SETP_Xpos ; Get Xpos - MOV CX, BX ; Copy to extract Plane # from - SHR BX, 2 ; X offset (Bytes) = Xpos/4 - ADD BX, AX ; Offset = Width*Ypos + Xpos/4 - - MOV AX, MAP_MASK_PLANE1 ; Map Mask & Plane Select Register - AND CL, PLANE_BITS ; Get Plane Bits - SHL AH, CL ; Get Plane Select Value - OUT_16 SC_Index, AX ; Select Plane - - MOV AL,[BP].SETP_Color ; Get Pixel Color - MOV ES:[DI+BX], AL ; Draw Pixel - - POPx DI, BP ; Restore Saved Registers - RET 6 ; Exit and Clean up Stack - -SET_POINT ENDP - - -;========================== -;READ_POINT% (Xpos%, Ypos%) -;========================== -; -; Read the color of a pixel from the Active Display Page -; -; ENTRY: Xpos = X position of pixel to read -; Ypos = Y position of pixel to read -; -; EXIT: AX = Color of Pixel at (Xpos, Ypos) -; - -RP_STACK STRUC - DW ?,? ; BP, DI - DD ? ; Caller - RP_Ypos DW ? ; Y pos of Point to Read - RP_Xpos DW ? ; X pos of Point to Read -RP_STACK ENDS - - PUBLIC READ_POINT - -READ_POINT PROC FAR - - PUSHx BP, DI ; Preserve Registers - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - MOV AX, [BP].RP_Ypos ; Get Line # of Pixel - MUL SCREEN_WIDTH ; Get Offset to Start of Line - - MOV BX, [BP].RP_Xpos ; Get Xpos - MOV CX, BX - SHR BX, 2 ; X offset (Bytes) = Xpos/4 - ADD BX, AX ; Offset = Width*Ypos + Xpos/4 - - MOV AL, READ_MAP ; GC Read Mask Register - MOV AH, CL ; Get Xpos - AND AH, PLANE_BITS ; & mask out Plane # - OUT_16 GC_INDEX, AX ; Select Plane to read in - - CLR AH ; Clear Return Value Hi byte - MOV AL, ES:[DI+BX] ; Get Color of Pixel - - POPx DI, BP ; Restore Saved Registers - RET 4 ; Exit and Clean up Stack - -READ_POINT ENDP - - -;====================================================== -;FILL_BLOCK (Xpos1%, Ypos1%, Xpos2%, Ypos2%, ColorNum%) -;====================================================== -; -; Fills a rectangular block on the active display Page -; -; ENTRY: Xpos1 = Left X position of area to fill -; Ypos1 = Top Y position of area to fill -; Xpos2 = Right X position of area to fill -; Ypos2 = Bottom Y position of area to fill -; ColorNum = Color to fill area with -; -; EXIT: No meaningful values returned -; - -FB_STACK STRUC - DW ?x4 ; DS, DI, SI, BP - DD ? ; Caller - FB_Color DB ?,? ; Fill Color - FB_Ypos2 DW ? ; Y pos of Lower Right Pixel - FB_Xpos2 DW ? ; X pos of Lower Right Pixel - FB_Ypos1 DW ? ; Y pos of Upper Left Pixel - FB_Xpos1 DW ? ; X pos of Upper Left Pixel -FB_STACK ENDS - - PUBLIC FILL_BLOCK - -FILL_BLOCK PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - CLD ; Direction Flag = Forward - - OUT_8 SC_INDEX, MAP_MASK ; Set up for Plane Select - - ; Validate Pixel Coordinates - ; If necessary, Swap so X1 <= X2, Y1 <= Y2 - - MOV AX, [BP].FB_Ypos1 ; AX = Y1 is Y1< Y2? - MOV BX, [BP].FB_Ypos2 ; BX = Y2 - CMP AX, BX - JLE @FB_NOSWAP1 - - MOV [BP].FB_Ypos1, BX ; Swap Y1 and Y2 and save Y1 - XCHG AX, BX ; on stack for future use - -@FB_NOSWAP1: - SUB BX, AX ; Get Y width - INC BX ; Add 1 to avoid 0 value - MOV [BP].FB_Ypos2, BX ; Save in Ypos2 - - MUL SCREEN_WIDTH ; Mul Y1 by Bytes per Line - ADD DI, AX ; DI = Start of Line Y1 - - MOV AX, [BP].FB_Xpos1 ; Check X1 <= X2 - MOV BX, [BP].FB_Xpos2 ; - CMP AX, BX - JLE @FB_NOSWAP2 ; Skip Ahead if Ok - - MOV [BP].FB_Xpos2, AX ; Swap X1 AND X2 and save X2 - XCHG AX, BX ; on stack for future use - - ; All our Input Values are in order, Now determine - ; How many full "bands" 4 pixels wide (aligned) there - ; are, and if there are partial bands (<4 pixels) on - ; the left and right edges. - -@FB_NOSWAP2: - MOV DX, AX ; DX = X1 (Pixel Position) - SHR DX, 2 ; DX/4 = Bytes into Line - ADD DI, DX ; DI = Addr of Upper-Left Corner - - MOV CX, BX ; CX = X2 (Pixel Position) - SHR CX, 2 ; CX/4 = Bytes into Line - - CMP DX, CX ; Start and end in same band? - JNE @FB_NORMAL ; if not, check for l & r edges - JMP @FB_ONE_BAND_ONLY ; if so, then special processing - -@FB_NORMAL: - SUB CX, DX ; CX = # bands -1 - MOV SI, AX ; SI = PLANE#(X1) - AND SI, PLANE_BITS ; if Left edge is aligned then - JZ @FB_L_PLANE_FLUSH ; no special processing.. - - ; Draw "Left Edge" vertical strip of 1-3 pixels... - - OUT_8 SC_Data, Left_Clip_Mask[SI] ; Set Left Edge Plane Mask - - MOV SI, DI ; SI = Copy of Start Addr (UL) - - MOV DX, [BP].FB_Ypos2 ; Get # of Lines to draw - MOV AL, [BP].FB_Color ; Get Fill Color - MOV BX, SCREEN_WIDTH ; Get Vertical increment Value - -@FB_LEFT_LOOP: - MOV ES:[SI], AL ; Fill in Left Edge Pixels - ADD SI, BX ; Point to Next Line (Below) - LOOPjz DX, @FB_LEFT_CONT ; Exit loop if all Lines Drawn - - MOV ES:[SI], AL ; Fill in Left Edge Pixels - ADD SI, BX ; Point to Next Line (Below) - LOOPx DX, @FB_LEFT_LOOP ; loop until left strip is drawn - -@FB_LEFT_CONT: - - INC DI ; Point to Middle (or Right) Block - DEC CX ; Reset CX instead of JMP @FB_RIGHT - -@FB_L_PLANE_FLUSH: - INC CX ; Add in Left band to middle block - - ; DI = Addr of 1st middle Pixel (band) to fill - ; CX = # of Bands to fill -1 - -@FB_RIGHT: - MOV SI, [BP].FB_Xpos2 ; Get Xpos2 - AND SI, PLANE_BITS ; Get Plane values - CMP SI, 0003 ; Plane = 3? - JE @FB_R_EDGE_FLUSH ; Hey, add to middle - - ; Draw "Right Edge" vertical strip of 1-3 pixels... - - OUT_8 SC_Data, Right_Clip_Mask[SI] ; Right Edge Plane Mask - - MOV SI, DI ; Get Addr of Left Edge - ADD SI, CX ; Add Width-1 (Bands) - DEC SI ; To point to top of Right Edge - - MOV DX, [BP].FB_Ypos2 ; Get # of Lines to draw - MOV AL, [BP].FB_Color ; Get Fill Color - MOV BX, SCREEN_WIDTH ; Get Vertical increment Value - -@FB_RIGHT_LOOP: - MOV ES:[SI], AL ; Fill in Right Edge Pixels - ADD SI, BX ; Point to Next Line (Below) - LOOPjz DX, @FB_RIGHT_CONT ; Exit loop if all Lines Drawn - - MOV ES:[SI], AL ; Fill in Right Edge Pixels - ADD SI, BX ; Point to Next Line (Below) - LOOPx DX, @FB_RIGHT_LOOP ; loop until left strip is drawn - -@FB_RIGHT_CONT: - - DEC CX ; Minus 1 for Middle bands - JZ @FB_EXIT ; Uh.. no Middle bands... - -@FB_R_EDGE_FLUSH: - - ; DI = Addr of Upper Left block to fill - ; CX = # of Bands to fill in (width) - - OUT_8 SC_Data, ALL_PLANES ; Write to All Planes - - MOV DX, SCREEN_WIDTH ; DX = DI Increment - SUB DX, CX ; = Screen_Width-# Planes Filled - - MOV BX, CX ; BX = Quick Refill for CX - MOV SI, [BP].FB_Ypos2 ; SI = # of Line to Fill - MOV AL, [BP].FB_Color ; Get Fill Color - -@FB_MIDDLE_LOOP: - REP STOSB ; Fill in entire line - - MOV CX, BX ; Recharge CX (Line Width) - ADD DI, DX ; Point to start of Next Line - LOOPx SI, @FB_MIDDLE_LOOP ; Loop until all lines drawn - - JMP s @FB_EXIT ; Outa here - -@FB_ONE_BAND_ONLY: - MOV SI, AX ; Get Left Clip Mask, Save X1 - AND SI, PLANE_BITS ; Mask out Row # - MOV AL, Left_Clip_Mask[SI] ; Get Left Edge Mask - MOV SI, BX ; Get Right Clip Mask, Save X2 - AND SI, PLANE_BITS ; Mask out Row # - AND AL, Right_Clip_Mask[SI] ; Get Right Edge Mask byte - - OUT_8 SC_Data, AL ; Clip For Left & Right Masks - - MOV CX, [BP].FB_Ypos2 ; Get # of Lines to draw - MOV AL, [BP].FB_Color ; Get Fill Color - MOV BX, SCREEN_WIDTH ; Get Vertical increment Value - -@FB_ONE_LOOP: - MOV ES:[DI], AL ; Fill in Pixels - ADD DI, BX ; Point to Next Line (Below) - LOOPjz CX, @FB_EXIT ; Exit loop if all Lines Drawn - - MOV ES:[DI], AL ; Fill in Pixels - ADD DI, BX ; Point to Next Line (Below) - LOOPx CX, @FB_ONE_LOOP ; loop until left strip is drawn - -@FB_EXIT: - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 10 ; Exit and Clean up Stack - -FILL_BLOCK ENDP - - -;===================================================== -;DRAW_LINE (Xpos1%, Ypos1%, Xpos2%, Ypos2%, ColorNum%) -;===================================================== -; -; Draws a Line on the active display page -; -; ENTRY: Xpos1 = X position of first point on line -; Ypos1 = Y position of first point on line -; Xpos2 = X position of last point on line -; Ypos2 = Y position of last point on line -; ColorNum = Color to draw line with -; -; EXIT: No meaningful values returned -; - -DL_STACK STRUC - DW ?x3 ; DI, SI, BP - DD ? ; Caller - DL_ColorF DB ?,? ; Line Draw Color - DL_Ypos2 DW ? ; Y pos of last point - DL_Xpos2 DW ? ; X pos of last point - DL_Ypos1 DW ? ; Y pos of first point - DL_Xpos1 DW ? ; X pos of first point -DL_STACK ENDS - - PUBLIC DRAW_LINE - -DRAW_LINE PROC FAR - - PUSHx BP, SI, DI ; Preserve Important Registers - MOV BP, SP ; Set up Stack Frame - CLD ; Direction Flag = Forward - - OUT_8 SC_INDEX, MAP_MASK ; Set up for Plane Select - MOV CH, [BP].DL_ColorF ; Save Line Color in CH - - ; Check Line Type - - MOV SI, [BP].DL_Xpos1 ; AX = X1 is X1< X2? - MOV DI, [BP].DL_Xpos2 ; DX = X2 - CMP SI, DI ; Is X1 < X2 - JE @DL_VLINE ; If X1=X2, Draw Vertical Line - JL @DL_NOSWAP1 ; If X1 < X2, don't swap - - XCHG SI, DI ; X2 IS > X1, SO SWAP THEM - -@DL_NOSWAP1: - - ; SI = X1, DI = X2 - - MOV AX, [BP].DL_Ypos1 ; AX = Y1 is Y1 <> Y2? - CMP AX, [BP].DL_Ypos2 ; Y1 = Y2? - JE @DL_HORZ ; If so, Draw a Horizontal Line - - JMP @DL_BREZHAM ; Diagonal line... go do it... - - ; This Code draws a Horizontal Line in Mode X where: - ; SI = X1, DI = X2, and AX = Y1/Y2 - -@DL_HORZ: - - MUL SCREEN_WIDTH ; Offset = Ypos * Screen_Width - MOV DX, AX ; CX = Line offset into Page - - MOV AX, SI ; Get Left edge, Save X1 - AND SI, PLANE_BITS ; Mask out Row # - MOV BL, Left_Clip_Mask[SI] ; Get Left Edge Mask - MOV CX, DI ; Get Right edge, Save X2 - AND DI, PLANE_BITS ; Mask out Row # - MOV BH, Right_Clip_Mask[DI] ; Get Right Edge Mask byte - - SHR AX, 2 ; Get X1 Byte # (=X1/4) - SHR CX, 2 ; Get X2 Byte # (=X2/4) - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - ADD DI, DX ; Point to Start of Line - ADD DI, AX ; Point to Pixel X1 - - SUB CX, AX ; CX = # Of Bands (-1) to set - JNZ @DL_LONGLN ; jump if longer than one segment - - AND BL, BH ; otherwise, merge clip masks - -@DL_LONGLN: - - OUT_8 SC_Data, BL ; Set the Left Clip Mask - - MOV AL, [BP].DL_ColorF ; Get Line Color - MOV BL, AL ; BL = Copy of Line Color - STOSB ; Set Left (1-4) Pixels - - JCXZ @DL_EXIT ; Done if only one Line Segment - - DEC CX ; CX = # of Middle Segments - JZ @DL_XRSEG ; If no middle segments.... - - ; Draw Middle Segments - - OUT_8 DX, ALL_PLANES ; Write to ALL Planes - - MOV AL, BL ; Get Color from BL - REP STOSB ; Draw Middle (4 Pixel) Segments - -@DL_XRSEG: - OUT_8 DX, BH ; Select Planes for Right Clip Mask - MOV AL, BL ; Get Color Value - STOSB ; Draw Right (1-4) Pixels - - JMP s @DL_EXIT ; We Are Done... - - - ; This Code Draws A Vertical Line. On entry: - ; CH = Line Color, SI & DI = X1 - -@DL_VLINE: - - MOV AX, [BP].DL_Ypos1 ; AX = Y1 - MOV SI, [BP].DL_Ypos2 ; SI = Y2 - CMP AX, SI ; Is Y1 < Y2? - JLE @DL_NOSWAP2 ; if so, Don't Swap them - - XCHG AX, SI ; Ok, NOW Y1 < Y2 - -@DL_NOSWAP2: - - SUB SI, AX ; SI = Line Height (Y2-Y1+1) - INC SI - - ; AX = Y1, DI = X1, Get offset into Page into AX - - MUL SCREEN_WIDTH ; Offset = Y1 (AX) * Screen Width - MOV DX, DI ; Copy Xpos into DX - SHR DI, 2 ; DI = Xpos/4 - ADD AX, DI ; DI = Xpos/4 + ScreenWidth * Y1 - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - ADD DI, AX ; Point to Pixel X1, Y1 - - ;Select Plane - - MOV CL, DL ; CL = Save X1 - AND CL, PLANE_BITS ; Get X1 MOD 4 (Plane #) - MOV AX, MAP_MASK_PLANE1 ; Code to set Plane #1 - SHL AH, CL ; Change to Correct Plane # - OUT_16 SC_Index, AX ; Select Plane - - MOV AL, CH ; Get Saved Color - MOV BX, SCREEN_WIDTH ; Get Offset to Advance Line By - -@DL_VLoop: - MOV ES:[DI], AL ; Draw Single Pixel - ADD DI, BX ; Point to Next Line - LOOPjz SI, @DL_EXIT ; Lines--, Exit if done - - MOV ES:[DI], AL ; Draw Single Pixel - ADD DI, BX ; Point to Next Line - LOOPx SI, @DL_VLoop ; Lines--, Loop until Done - -@DL_EXIT: - - JMP @DL_EXIT2 ; Done! - - ; This code Draws a diagonal line in Mode X - -@DL_BREZHAM: - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - MOV AX, [BP].DL_Ypos1 ; get Y1 value - MOV BX, [BP].DL_Ypos2 ; get Y2 value - MOV CX, [BP].DL_Xpos1 ; Get Starting Xpos - - CMP BX, AX ; Y2-Y1 is? - JNC @DL_DeltaYOK ; if Y2>=Y1 then goto... - - XCHG BX, AX ; Swap em... - MOV CX, [BP].DL_Xpos2 ; Get New Starting Xpos - -@DL_DeltaYOK: - MUL SCREEN_WIDTH ; Offset = SCREEN_WIDTH * Y1 - - ADD DI, AX ; DI -> Start of Line Y1 on Page - MOV AX, CX ; AX = Xpos (X1) - SHR AX, 2 ; /4 = Byte Offset into Line - ADD DI, AX ; DI = Starting pos (X1,Y1) - - MOV AL, 11h ; Staring Mask - AND CL, PLANE_BITS ; Get Plane # - SHL AL, CL ; and shift into place - MOV AH, [BP].DL_ColorF ; Color in Hi Bytes - - PUSH AX ; Save Mask,Color... - - MOV AH, AL ; Plane # in AH - MOV AL, MAP_MASK ; Select Plane Register - OUT_16 SC_Index, AX ; Select initial plane - - MOV AX, [BP].DL_Xpos1 ; get X1 value - MOV BX, [BP].DL_Ypos1 ; get Y1 value - MOV CX, [BP].DL_Xpos2 ; get X2 value - MOV DX, [BP].DL_Ypos2 ; get Y2 value - - MOV BP, SCREEN_WIDTH ; Use BP for Line width to - ; to avoid extra memory access - - SUB DX, BX ; figure Delta_Y - JNC @DL_DeltaYOK2 ; jump if Y2 >= Y1 - - ADD BX, DX ; put Y2 into Y1 - NEG DX ; abs(Delta_Y) - XCHG AX, CX ; and exchange X1 and X2 - -@DL_DeltaYOK2: - MOV BX, 08000H ; seed for fraction accumulator - - SUB CX, AX ; figure Delta_X - JC @DL_DrawLeft ; if negative, go left - - JMP @DL_DrawRight ; Draw Line that slopes right - -@DL_DrawLeft: - - NEG CX ; abs(Delta_X) - - CMP CX, DX ; is Delta_X < Delta_Y? - JB @DL_SteepLeft ; yes, so go do steep line - ; (Delta_Y iterations) - - ; Draw a Shallow line to the left in Mode X - -@DL_ShallowLeft: - CLR AX ; zero low word of Delta_Y * 10000h - SUB AX, DX ; DX:AX <- DX * 0FFFFh - SBB DX, 0 ; include carry - DIV CX ; divide by Delta_X - - MOV SI, BX ; SI = Accumulator - MOV BX, AX ; BX = Add fraction - POP AX ; Get Color, Bit mask - MOV DX, SC_Data ; Sequence controller data register - INC CX ; Inc Delta_X so we can unroll loop - - ; Loop (x2) to Draw Pixels, Move Left, and Maybe Down... - -@DL_SLLLoop: - MOV ES:[DI], AH ; set first pixel, plane data set up - LOOPjz CX, @DL_SLLExit ; Delta_X--, Exit if done - - ADD SI, BX ; add numerator to accumulator - JNC @DL_SLLL2nc ; move down on carry - - ADD DI, BP ; Move Down one line... - -@DL_SLLL2nc: - DEC DI ; Left one addr - ROR AL, 1 ; Move Left one plane, back on 0 1 2 - CMP AL, 87h ; wrap?, if AL <88 then Carry set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - - MOV ES:[DI], AH ; set pixel - LOOPjz CX, @DL_SLLExit ; Delta_X--, Exit if done - - ADD SI, BX ; add numerator to accumulator, - JNC @DL_SLLL3nc ; move down on carry - - ADD DI, BP ; Move Down one line... - -@DL_SLLL3nc: ; Now move left a pixel... - DEC DI ; Left one addr - ROR AL, 1 ; Move Left one plane, back on 0 1 2 - CMP AL, 87h ; Wrap?, if AL <88 then Carry set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - JMP s @DL_SLLLoop ; loop until done - -@DL_SLLExit: - JMP @DL_EXIT2 ; and exit - - ; Draw a steep line to the left in Mode X - -@DL_SteepLeft: - CLR AX ; zero low word of Delta_Y * 10000h - XCHG DX, CX ; Delta_Y switched with Delta_X - DIV CX ; divide by Delta_Y - - MOV SI, BX ; SI = Accumulator - MOV BX, AX ; BX = Add Fraction - POP AX ; Get Color, Bit mask - MOV DX, SC_Data ; Sequence controller data register - INC CX ; Inc Delta_Y so we can unroll loop - - ; Loop (x2) to Draw Pixels, Move Down, and Maybe left - -@DL_STLLoop: - - MOV ES:[DI], AH ; set first pixel - LOOPjz CX, @DL_STLExit ; Delta_Y--, Exit if done - - ADD SI, BX ; add numerator to accumulator - JNC @DL_STLnc2 ; No carry, just move down! - - DEC DI ; Move Left one addr - ROR AL, 1 ; Move Left one plane, back on 0 1 2 - CMP AL, 87h ; Wrap?, if AL <88 then Carry set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - -@DL_STLnc2: - ADD DI, BP ; advance to next line. - - MOV ES:[DI], AH ; set pixel - LOOPjz CX, @DL_STLExit ; Delta_Y--, Exit if done - - ADD SI, BX ; add numerator to accumulator - JNC @DL_STLnc3 ; No carry, just move down! - - DEC DI ; Move Left one addr - ROR AL, 1 ; Move Left one plane, back on 0 1 2 - CMP AL, 87h ; Wrap?, if AL <88 then Carry set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - -@DL_STLnc3: - ADD DI, BP ; advance to next line. - JMP s @DL_STLLoop ; Loop until done - -@DL_STLExit: - JMP @DL_EXIT2 ; and exit - - ; Draw a line that goes to the Right... - -@DL_DrawRight: - CMP CX, DX ; is Delta_X < Delta_Y? - JB @DL_SteepRight ; yes, so go do steep line - ; (Delta_Y iterations) - - ; Draw a Shallow line to the Right in Mode X - -@DL_ShallowRight: - CLR AX ; zero low word of Delta_Y * 10000h - SUB AX, DX ; DX:AX <- DX * 0FFFFh - SBB DX, 0 ; include carry - DIV CX ; divide by Delta_X - - MOV SI, BX ; SI = Accumulator - MOV BX, AX ; BX = Add Fraction - POP AX ; Get Color, Bit mask - MOV DX, SC_Data ; Sequence controller data register - INC CX ; Inc Delta_X so we can unroll loop - - ; Loop (x2) to Draw Pixels, Move Right, and Maybe Down... - -@DL_SLRLoop: - MOV ES:[DI], AH ; set first pixel, mask is set up - LOOPjz CX, @DL_SLRExit ; Delta_X--, Exit if done.. - - ADD SI, BX ; add numerator to accumulator - JNC @DL_SLR2nc ; don't move down if carry not set - - ADD DI, BP ; Move Down one line... - -@DL_SLR2nc: ; Now move right a pixel... - ROL AL, 1 ; Move Right one addr if Plane = 0 - CMP AL, 12h ; Wrap? if AL >12 then Carry not set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - - MOV ES:[DI], AH ; set pixel - LOOPjz CX, @DL_SLRExit ; Delta_X--, Exit if done.. - - ADD SI, BX ; add numerator to accumulator - JNC @DL_SLR3nc ; don't move down if carry not set - - ADD DI, BP ; Move Down one line... - -@DL_SLR3nc: - ROL AL, 1 ; Move Right one addr if Plane = 0 - CMP AL, 12h ; Wrap? if AL >12 then Carry not set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - JMP s @DL_SLRLoop ; loop till done - -@DL_SLRExit: - JMP @DL_EXIT2 ; and exit - - ; Draw a Steep line to the Right in Mode X - -@DL_SteepRight: - CLR AX ; zero low word of Delta_Y * 10000h - XCHG DX, CX ; Delta_Y switched with Delta_X - DIV CX ; divide by Delta_Y - - MOV SI, BX ; SI = Accumulator - MOV BX, AX ; BX = Add Fraction - POP AX ; Get Color, Bit mask - MOV DX, SC_Data ; Sequence controller data register - INC CX ; Inc Delta_Y so we can unroll loop - - ; Loop (x2) to Draw Pixels, Move Down, and Maybe Right - -@STRLoop: - MOV ES:[DI], AH ; set first pixel, mask is set up - LOOPjz CX, @DL_EXIT2 ; Delta_Y--, Exit if Done - - ADD SI, BX ; add numerator to accumulator - JNC @STRnc2 ; if no carry then just go down... - - ROL AL, 1 ; Move Right one addr if Plane = 0 - CMP AL, 12h ; Wrap? if AL >12 then Carry not set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - -@STRnc2: - ADD DI, BP ; advance to next line. - - MOV ES:[DI], AH ; set pixel - LOOPjz CX, @DL_EXIT2 ; Delta_Y--, Exit if Done - - ADD SI, BX ; add numerator to accumulator - JNC @STRnc3 ; if no carry then just go down... - - ROL AL, 1 ; Move Right one addr if Plane = 0 - CMP AL, 12h ; Wrap? if AL >12 then Carry not set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - -@STRnc3: - ADD DI, BP ; advance to next line. - JMP s @STRLoop ; loop till done - -@DL_EXIT2: - POPx DI, SI, BP ; Restore Saved Registers - RET 10 ; Exit and Clean up Stack - -DRAW_LINE ENDP - - - ; ===== DAC COLOR REGISTER ROUTINES ===== - -;================================================= -;SET_DAC_REGISTER (Register%, Red%, Green%, Blue%) -;================================================= -; -; Sets a single (RGB) Vga Palette Register -; -; ENTRY: Register = The DAC # to modify (0-255) -; Red = The new Red Intensity (0-63) -; Green = The new Green Intensity (0-63) -; Blue = The new Blue Intensity (0-63) -; -; EXIT: No meaningful values returned -; - -SDR_STACK STRUC - DW ? ; BP - DD ? ; Caller - SDR_Blue DB ?,? ; Blue Data Value - SDR_Green DB ?,? ; Green Data Value - SDR_Red DB ?,? ; Red Data Value - SDR_Register DB ?,? ; Palette Register # -SDR_STACK ENDS - - PUBLIC SET_DAC_REGISTER - -SET_DAC_REGISTER PROC FAR - - PUSH BP ; Save BP - MOV BP, SP ; Set up Stack Frame - - ; Select which DAC Register to modify - - OUT_8 DAC_WRITE_ADDR, [BP].SDR_Register - - MOV DX, PEL_DATA_REG ; Dac Data Register - OUT_8 DX, [BP].SDR_Red ; Set Red Intensity - OUT_8 DX, [BP].SDR_Green ; Set Green Intensity - OUT_8 DX, [BP].SDR_Blue ; Set Blue Intensity - - POP BP ; Restore Registers - RET 8 ; Exit & Clean Up Stack - -SET_DAC_REGISTER ENDP - -;==================================================== -;GET_DAC_REGISTER (Register%, &Red%, &Green%, &Blue%) -;==================================================== -; -; Reads the RGB Values of a single Vga Palette Register -; -; ENTRY: Register = The DAC # to read (0-255) -; Red = Offset to Red Variable in DS -; Green = Offset to Green Variable in DS -; Blue = Offset to Blue Variable in DS -; -; EXIT: The values of the integer variables Red, -; Green, and Blue are set to the values -; taken from the specified DAC register. -; - -GDR_STACK STRUC - DW ? ; BP - DD ? ; Caller - GDR_Blue DW ? ; Addr of Blue Data Value in DS - GDR_Green DW ? ; Addr of Green Data Value in DS - GDR_Red DW ? ; Addr of Red Data Value in DS - GDR_Register DB ?,? ; Palette Register # -GDR_STACK ENDS - - PUBLIC GET_DAC_REGISTER - -GET_DAC_REGISTER PROC FAR - - PUSH BP ; Save BP - MOV BP, SP ; Set up Stack Frame - - ; Select which DAC Register to read in - - OUT_8 DAC_READ_ADDR, [BP].GDR_Register - - MOV DX, PEL_DATA_REG ; Dac Data Register - CLR AX ; Clear AX - - IN AL, DX ; Read Red Value - MOV BX, [BP].GDR_Red ; Get Address of Red% - MOV [BX], AX ; *Red% = AX - - IN AL, DX ; Read Green Value - MOV BX, [BP].GDR_Green ; Get Address of Green% - MOV [BX], AX ; *Green% = AX - - IN AL, DX ; Read Blue Value - MOV BX, [BP].GDR_Blue ; Get Address of Blue% - MOV [BX], AX ; *Blue% = AX - - POP BP ; Restore Registers - RET 8 ; Exit & Clean Up Stack - -GET_DAC_REGISTER ENDP - - -;=========================================================== -;LOAD_DAC_REGISTERS (SEG PalData, StartReg%, EndReg%, Sync%) -;=========================================================== -; -; Sets a Block of Vga Palette Registers -; -; ENTRY: PalData = Far Pointer to Block of palette data -; StartReg = First Register # in range to set (0-255) -; EndReg = Last Register # in Range to set (0-255) -; Sync = Wait for Vertical Retrace Flag (Boolean) -; -; EXIT: No meaningful values returned -; -; NOTES: PalData is a linear array of 3 byte Palette values -; in the order: Red (0-63), Green (0-63), Blue (0-63) -; - -LDR_STACK STRUC - DW ?x3 ; BP, DS, SI - DD ? ; Caller - LDR_Sync DW ? ; Vertical Sync Flag - LDR_EndReg DB ?,? ; Last Register # - LDR_StartReg DB ?,? ; First Register # - LDR_PalData DD ? ; Far Ptr to Palette Data -LDR_STACK ENDS - - PUBLIC LOAD_DAC_REGISTERS - -LOAD_DAC_REGISTERS PROC FAR - - PUSHx BP, DS, SI ; Save Registers - mov BP, SP ; Set up Stack Frame - - mov AX, [BP].LDR_Sync ; Get Vertical Sync Flag - or AX, AX ; is Sync Flag = 0? - jz @LDR_Load ; if so, skip call - - call f SYNC_DISPLAY ; wait for vsync - - ; Determine register #'s, size to copy, etc - -@LDR_Load: - - lds SI, [BP].LDR_PalData ; DS:SI -> Palette Data - mov DX, DAC_WRITE_ADDR ; DAC register # selector - - CLR AX, BX ; Clear for byte loads - mov AL, [BP].LDR_StartReg ; Get Start Register - mov BL, [BP].LDR_EndReg ; Get End Register - - sub BX, AX ; BX = # of DAC registers -1 - inc BX ; BX = # of DAC registers - mov CX, BX ; CX = # of DAC registers - add CX, BX ; CX = " " * 2 - add CX, BX ; CX = " " * 3 - cld ; Block OUTs forward - out DX, AL ; set up correct register # - - ; Load a block of DAC Registers - - mov DX, PEL_DATA_REG ; Dac Data Register - - rep outsb ; block set DAC registers - - POPx SI, DS, BP ; Restore Registers - ret 10 ; Exit & Clean Up Stack - -LOAD_DAC_REGISTERS ENDP - - -;==================================================== -;READ_DAC_REGISTERS (SEG PalData, StartReg%, EndReg%) -;==================================================== -; -; Reads a Block of Vga Palette Registers -; -; ENTRY: PalData = Far Pointer to block to store palette data -; StartReg = First Register # in range to read (0-255) -; EndReg = Last Register # in Range to read (0-255) -; -; EXIT: No meaningful values returned -; -; NOTES: PalData is a linear array of 3 byte Palette values -; in the order: Red (0-63), Green (0-63), Blue (0-63) -; - -RDR_STACK STRUC - DW ?x3 ; BP, ES, DI - DD ? ; Caller - RDR_EndReg DB ?,? ; Last Register # - RDR_StartReg DB ?,? ; First Register # - RDR_PalData DD ? ; Far Ptr to Palette Data -RDR_STACK ENDS - - PUBLIC READ_DAC_REGISTERS - -READ_DAC_REGISTERS PROC FAR - - PUSHx BP, ES, DI ; Save Registers - mov BP, SP ; Set up Stack Frame - - ; Determine register #'s, size to copy, etc - - les DI, [BP].RDR_PalData ; ES:DI -> Palette Buffer - mov DX, DAC_READ_ADDR ; DAC register # selector - - CLR AX, BX ; Clear for byte loads - mov AL, [BP].RDR_StartReg ; Get Start Register - mov BL, [BP].RDR_EndReg ; Get End Register - - sub BX, AX ; BX = # of DAC registers -1 - inc BX ; BX = # of DAC registers - mov CX, BX ; CX = # of DAC registers - add CX, BX ; CX = " " * 2 - add CX, BX ; CX = " " * 3 - cld ; Block INs forward - - ; Read a block of DAC Registers - - out DX, AL ; set up correct register # - mov DX, PEL_DATA_REG ; Dac Data Register - - rep insb ; block read DAC registers - - POPx DI, ES, BP ; Restore Registers - ret 8 ; Exit & Clean Up Stack - -READ_DAC_REGISTERS ENDP - - - ; ===== PAGE FLIPPING AND SCROLLING ROUTINES ===== - -;========================= -;SET_ACTIVE_PAGE (PageNo%) -;========================= -; -; Sets the active display Page to be used for future drawing -; -; ENTRY: PageNo = Display Page to make active -; (values: 0 to Number of Pages - 1) -; -; EXIT: No meaningful values returned -; - -SAP_STACK STRUC - DW ? ; BP - DD ? ; Caller - SAP_Page DW ? ; Page # for Drawing -SAP_STACK ENDS - - PUBLIC SET_ACTIVE_PAGE - -SET_ACTIVE_PAGE PROC FAR - - PUSH BP ; Preserve Registers - MOV BP, SP ; Set up Stack Frame - - MOV BX, [BP].SAP_Page ; Get Desired Page # - CMP BX, LAST_PAGE ; Is Page # Valid? - JAE @SAP_Exit ; IF Not, Do Nothing - - MOV ACTIVE_PAGE, BX ; Set Active Page # - - SHL BX, 1 ; Scale Page # to Word - MOV AX, PAGE_ADDR[BX] ; Get offset to Page - - MOV CURRENT_PAGE, AX ; And set for future LES's - -@SAP_Exit: - POP BP ; Restore Registers - RET 2 ; Exit and Clean up Stack - -SET_ACTIVE_PAGE ENDP - - -;================ -;GET_ACTIVE_PAGE% -;================ -; -; Returns the Video Page # currently used for Drawing -; -; ENTRY: No Parameters are passed -; -; EXIT: AX = Current Video Page used for Drawing -; - - PUBLIC GET_ACTIVE_PAGE - -GET_ACTIVE_PAGE PROC FAR - - MOV AX, ACTIVE_PAGE ; Get Active Page # - RET ; Exit and Clean up Stack - -GET_ACTIVE_PAGE ENDP - - -;=============================== -;SET_DISPLAY_PAGE (DisplayPage%) -;=============================== -; -; Sets the currently visible display page. -; When called this routine syncronizes the display -; to the vertical blank. -; -; ENTRY: PageNo = Display Page to show on the screen -; (values: 0 to Number of Pages - 1) -; -; EXIT: No meaningful values returned -; - -SDP_STACK STRUC - DW ? ; BP - DD ? ; Caller - SDP_Page DW ? ; Page # to Display... -SDP_STACK ENDS - - PUBLIC SET_DISPLAY_PAGE - -SET_DISPLAY_PAGE PROC FAR - - PUSH BP ; Preserve Registers - MOV BP, SP ; Set up Stack Frame - - MOV BX, [BP].SDP_Page ; Get Desired Page # - CMP BX, LAST_PAGE ; Is Page # Valid? - JAE @SDP_Exit ; IF Not, Do Nothing - - MOV DISPLAY_PAGE, BX ; Set Display Page # - - SHL BX, 1 ; Scale Page # to Word - MOV CX, PAGE_ADDR[BX] ; Get offset in memory to Page - ADD CX, CURRENT_MOFFSET ; Adjust for any scrolling - - ; Wait if we are currently in a Vertical Retrace - - MOV DX, INPUT_1 ; Input Status #1 Register - -@DP_WAIT0: - IN AL, DX ; Get VGA status - AND AL, VERT_RETRACE ; In Display mode yet? - JNZ @DP_WAIT0 ; If Not, wait for it - - ; Set the Start Display Address to the new page - - MOV DX, CRTC_Index ; We Change the VGA Sequencer - - MOV AL, START_DISP_LO ; Display Start Low Register - MOV AH, CL ; Low 8 Bits of Start Addr - OUT DX, AX ; Set Display Addr Low - - MOV AL, START_DISP_HI ; Display Start High Register - MOV AH, CH ; High 8 Bits of Start Addr - OUT DX, AX ; Set Display Addr High - - ; Wait for a Vertical Retrace to smooth out things - - MOV DX, INPUT_1 ; Input Status #1 Register - -@DP_WAIT1: - IN AL, DX ; Get VGA status - AND AL, VERT_RETRACE ; Vertical Retrace Start? - JZ @DP_WAIT1 ; If Not, wait for it - - ; Now Set Display Starting Address - - -@SDP_Exit: - POP BP ; Restore Registers - RET 2 ; Exit and Clean up Stack - -SET_DISPLAY_PAGE ENDP - - -;================= -;GET_DISPLAY_PAGE% -;================= -; -; Returns the Video Page # currently displayed -; -; ENTRY: No Parameters are passed -; -; EXIT: AX = Current Video Page being displayed -; - - PUBLIC GET_DISPLAY_PAGE - -GET_DISPLAY_PAGE PROC FAR - - MOV AX, DISPLAY_PAGE ; Get Display Page # - RET ; Exit & Clean Up Stack - -GET_DISPLAY_PAGE ENDP - - -;======================================= -;SET_WINDOW (DisplayPage%, Xpos%, Ypos%) -;======================================= -; -; Since a Logical Screen can be larger than the Physical -; Screen, Scrolling is possible. This routine sets the -; Upper Left Corner of the Screen to the specified Pixel. -; Also Sets the Display page to simplify combined page -; flipping and scrolling. When called this routine -; syncronizes the display to the vertical blank. -; -; ENTRY: DisplayPage = Display Page to show on the screen -; Xpos = # of pixels to shift screen right -; Ypos = # of lines to shift screen down -; -; EXIT: No meaningful values returned -; - -SW_STACK STRUC - DW ? ; BP - DD ? ; Caller - SW_Ypos DW ? ; Y pos of UL Screen Corner - SW_Xpos DW ? ; X pos of UL Screen Corner - SW_Page DW ? ; (new) Display Page -SW_STACK ENDS - - PUBLIC SET_WINDOW - -SET_WINDOW PROC FAR - - PUSH BP ; Preserve Registers - MOV BP, SP ; Set up Stack Frame - - ; Check if our Scroll Offsets are Valid - - MOV BX, [BP].SW_Page ; Get Desired Page # - CMP BX, LAST_PAGE ; Is Page # Valid? - JAE @SW_Exit ; IF Not, Do Nothing - - MOV AX, [BP].SW_Ypos ; Get Desired Y Offset - CMP AX, MAX_YOFFSET ; Is it Within Limits? - JA @SW_Exit ; if not, exit - - MOV CX, [BP].SW_Xpos ; Get Desired X Offset - CMP CX, MAX_XOFFSET ; Is it Within Limits? - JA @SW_Exit ; if not, exit - - ; Compute proper Display start address to use - - MUL SCREEN_WIDTH ; AX = YOffset * Line Width - SHR CX, 2 ; CX / 4 = Bytes into Line - ADD AX, CX ; AX = Offset of Upper Left Pixel - - MOV CURRENT_MOFFSET, AX ; Save Offset Info - - MOV DISPLAY_PAGE, BX ; Set Current Page # - SHL BX, 1 ; Scale Page # to Word - ADD AX, PAGE_ADDR[BX] ; Get offset in VGA to Page - MOV BX, AX ; BX = Desired Display Start - - MOV DX, INPUT_1 ; Input Status #1 Register - - ; Wait if we are currently in a Vertical Retrace - -@SW_WAIT0: - IN AL, DX ; Get VGA status - AND AL, VERT_RETRACE ; In Display mode yet? - JNZ @SW_WAIT0 ; If Not, wait for it - - ; Set the Start Display Address to the new window - - MOV DX, CRTC_Index ; We Change the VGA Sequencer - MOV AL, START_DISP_LO ; Display Start Low Register - MOV AH, BL ; Low 8 Bits of Start Addr - OUT DX, AX ; Set Display Addr Low - - MOV AL, START_DISP_HI ; Display Start High Register - MOV AH, BH ; High 8 Bits of Start Addr - OUT DX, AX ; Set Display Addr High - - ; Wait for a Vertical Retrace to smooth out things - - MOV DX, INPUT_1 ; Input Status #1 Register - -@SW_WAIT1: - IN AL, DX ; Get VGA status - AND AL, VERT_RETRACE ; Vertical Retrace Start? - JZ @SW_WAIT1 ; If Not, wait for it - - ; Now Set the Horizontal Pixel Pan values - - OUT_8 ATTRIB_Ctrl, PIXEL_PAN_REG ; Select Pixel Pan Register - - MOV AX, [BP].SW_Xpos ; Get Desired X Offset - AND AL, 03 ; Get # of Pixels to Pan (0-3) - SHL AL, 1 ; Shift for 256 Color Mode - OUT DX, AL ; Fine tune the display! - -@SW_Exit: - POP BP ; Restore Saved Registers - RET 6 ; Exit and Clean up Stack - -SET_WINDOW ENDP - - -;============= -;GET_X_OFFSET% -;============= -; -; Returns the X coordinate of the Pixel currently display -; in the upper left corner of the display -; -; ENTRY: No Parameters are passed -; -; EXIT: AX = Current Horizontal Scroll Offset -; - - PUBLIC GET_X_OFFSET - -GET_X_OFFSET PROC FAR - - MOV AX, CURRENT_XOFFSET ; Get current horz offset - RET ; Exit & Clean Up Stack - -GET_X_OFFSET ENDP - - -;============= -;GET_Y_OFFSET% -;============= -; -; Returns the Y coordinate of the Pixel currently display -; in the upper left corner of the display -; -; ENTRY: No Parameters are passed -; -; EXIT: AX = Current Vertical Scroll Offset -; - - PUBLIC GET_Y_OFFSET - -GET_Y_OFFSET PROC FAR - - MOV AX, CURRENT_YOFFSET ; Get current vertical offset - RET ; Exit & Clean Up Stack - -GET_Y_OFFSET ENDP - - -;============ -;SYNC_DISPLAY -;============ -; -; Pauses the computer until the next Vertical Retrace starts -; -; ENTRY: No Parameters are passed -; -; EXIT: No meaningful values returned -; - - PUBLIC SYNC_DISPLAY - -SYNC_DISPLAY PROC FAR - - MOV DX, INPUT_1 ; Input Status #1 Register - - ; Wait for any current retrace to end - -@SD_WAIT0: - IN AL, DX ; Get VGA status - AND AL, VERT_RETRACE ; In Display mode yet? - JNZ @SD_WAIT0 ; If Not, wait for it - - ; Wait for the start of the next vertical retrace - -@SD_WAIT1: - IN AL, DX ; Get VGA status - AND AL, VERT_RETRACE ; Vertical Retrace Start? - JZ @SD_WAIT1 ; If Not, wait for it - - RET ; Exit & Clean Up Stack - -SYNC_DISPLAY ENDP - - - ; ===== TEXT DISPLAY ROUTINES ===== - -;================================================== -;GPRINTC (CharNum%, Xpos%, Ypos%, ColorF%, ColorB%) -;================================================== -; -; Draws an ASCII Text Character using the currently selected -; 8x8 font on the active display page. It would be a simple -; exercise to make this routine process variable height fonts. -; -; ENTRY: CharNum = ASCII character # to draw -; Xpos = X position to draw Character at -; Ypos = Y position of to draw Character at -; ColorF = Color to draw text character in -; ColorB = Color to set background to -; -; EXIT: No meaningful values returned -; - -GPC_STACK STRUC - GPC_Width DW ? ; Screen Width-1 - GPC_Lines DB ?,? ; Scan lines to Decode - GPC_T_SETS DW ? ; Saved Charset Segment - GPC_T_SETO DW ? ; Saved Charset Offset - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - GPC_ColorB DB ?,? ; Background Color - GPC_ColorF DB ?,? ; Text Color - GPC_Ypos DW ? ; Y Position to Print at - GPC_Xpos DW ? ; X position to Print at - GPC_Char DB ?,? ; Character to Print -GPC_STACK ENDS - - PUBLIC GPRINTC - -GPRINTC PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - SUB SP, 8 ; Allocate WorkSpace on Stack - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - MOV AX, SCREEN_WIDTH ; Get Logical Line Width - MOV BX, AX ; BX = Screen Width - DEC BX ; = Screen Width-1 - MOV [BP].GPC_Width, BX ; Save for later use - - MUL [BP].GPC_Ypos ; Start of Line = Ypos * Width - ADD DI, AX ; DI -> Start of Line Ypos - - MOV AX, [BP].GPC_Xpos ; Get Xpos of Character - MOV CX, AX ; Save Copy of Xpos - SHR AX, 2 ; Bytes into Line = Xpos/4 - ADD DI, AX ; DI -> (Xpos, Ypos) - - ;Get Source ADDR of Character Bit Map & Save - - MOV AL, [BP].GPC_Char ; Get Character # - TEST AL, 080h ; Is Hi Bit Set? - JZ @GPC_LowChar ; Nope, use low char set ptr - - AND AL, 07Fh ; Mask Out Hi Bit - MOV BX, CHARSET_HI ; BX = Char Set Ptr:Offset - MOV DX, CHARSET_HI+2 ; DX = Char Set Ptr:Segment - JMP s @GPC_Set_Char ; Go Setup Character Ptr - -@GPC_LowChar: - - MOV BX, CHARSET_LOW ; BX = Char Set Ptr:Offset - MOV DX, CHARSET_LOW+2 ; DX = Char Set Ptr:Segment - -@GPC_Set_Char: - MOV [BP].GPC_T_SETS, DX ; Save Segment on Stack - - MOV AH, 0 ; Valid #'s are 0..127 - SHL AX, 3 ; * 8 Bytes Per Bitmap - ADD BX, AX ; BX = Offset of Selected char - MOV [BP].GPC_T_SETO, BX ; Save Offset on Stack - - AND CX, PLANE_BITS ; Get Plane # - MOV CH, ALL_PLANES ; Get Initial Plane mask - SHL CH, CL ; And shift into position - AND CH, ALL_PLANES ; And mask to lower nibble - - MOV AL, 04 ; 4-Plane # = # of initial - SUB AL, CL ; shifts to align bit mask - MOV CL, AL ; Shift Count for SHL - - ;Get segment of character map - - OUT_8 SC_Index, MAP_MASK ; Setup Plane selections - INC DX ; DX -> SC_Data - - MOV AL, 08 ; 8 Lines to Process - MOV [BP].GPC_Lines, AL ; Save on Stack - - MOV DS, [BP].GPC_T_SETS ; Point to character set - -@GPC_DECODE_CHAR_BYTE: - - MOV SI, [BP].GPC_T_SETO ; Get DS:SI = String - - MOV BH, [SI] ; Get Bit Map - INC SI ; Point to Next Line - MOV [BP].GPC_T_SETO, SI ; And save new Pointer... - - CLR AX ; Clear AX - - CLR BL ; Clear BL - ROL BX, CL ; BL holds left edge bits - MOV SI, BX ; Use as Table Index - AND SI, CHAR_BITS ; Get Low Bits - MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - JZ @GPC_NO_LEFT1BITS ; Skip if No Pixels to set - - MOV AH, [BP].GPC_ColorF ; Get Foreground Color - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@GPC_NO_LEFT1BITS: - XOR AL, CH ; Invert mask for Background - JZ @GPC_NO_LEFT0BITS ; Hey, no need for this - - MOV AH, [BP].GPC_ColorB ; Get background Color - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - - ;Now Do Middle/Last Band - -@GPC_NO_LEFT0BITS: - INC DI ; Point to next Byte - ROL BX, 4 ; Shift 4 bits - - MOV SI, BX ; Make Lookup Pointer - AND SI, CHAR_BITS ; Get Low Bits - MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - JZ @GPC_NO_MIDDLE1BITS ; Skip if no pixels to set - - MOV AH, [BP].GPC_ColorF ; Get Foreground Color - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@GPC_NO_MIDDLE1BITS: - XOR AL, ALL_PLANES ; Invert mask for Background - JZ @GPC_NO_MIDDLE0BITS ; Hey, no need for this - - MOV AH, [BP].GPC_ColorB ; Get background Color - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@GPC_NO_MIDDLE0BITS: - XOR CH, ALL_PLANES ; Invert Clip Mask - CMP CL, 4 ; Aligned by 4? - JZ @GPC_NEXT_LINE ; If so, Exit now.. - - INC DI ; Point to next Byte - ROL BX, 4 ; Shift 4 bits - - MOV SI, BX ; Make Lookup Pointer - AND SI, CHAR_BITS ; Get Low Bits - MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - JZ @GPC_NO_RIGHT1BITS ; Skip if No Pixels to set - - MOV AH, [BP].GPC_ColorF ; Get Foreground Color - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@GPC_NO_RIGHT1BITS: - - XOR AL, CH ; Invert mask for Background - JZ @GPC_NO_RIGHT0BITS ; Hey, no need for this - - MOV AH, [BP].GPC_ColorB ; Get background Color - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@GPC_NO_RIGHT0BITS: - DEC DI ; Adjust for Next Line Advance - -@GPC_NEXT_LINE: - ADD DI, [BP].GPC_Width ; Point to Next Line - XOR CH, CHAR_BITS ; Flip the Clip mask back - - DEC [BP].GPC_Lines ; Count Down Lines - JZ @GPC_EXIT ; Ok... Done! - - JMP @GPC_DECODE_CHAR_BYTE ; Again! Hey! - -@GPC_EXIT: - ADD SP, 08 ; Deallocate stack workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 10 ; Exit and Clean up Stack - -GPRINTC ENDP - - -;========================================== -;TGPRINTC (CharNum%, Xpos%, Ypos%, ColorF%) -;========================================== -; -; Transparently draws an ASCII Text Character using the -; currently selected 8x8 font on the active display page. -; -; ENTRY: CharNum = ASCII character # to draw -; Xpos = X position to draw Character at -; Ypos = Y position of to draw Character at -; ColorF = Color to draw text character in -; -; EXIT: No meaningful values returned -; - -TGP_STACK STRUC - TGP_Width DW ? ; Screen Width-1 - TGP_Lines DB ?,? ; Scan lines to Decode - TGP_T_SETS DW ? ; Saved Charset Segment - TGP_T_SETO DW ? ; Saved Charset Offset - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - TGP_ColorF DB ?,? ; Text Color - TGP_Ypos DW ? ; Y Position to Print at - TGP_Xpos DW ? ; X position to Print at - TGP_Char DB ?,? ; Character to Print -TGP_STACK ENDS - - PUBLIC TGPRINTC - -TGPRINTC PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - SUB SP, 8 ; Allocate WorkSpace on Stack - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - MOV AX, SCREEN_WIDTH ; Get Logical Line Width - MOV BX, AX ; BX = Screen Width - DEC BX ; = Screen Width-1 - MOV [BP].TGP_Width, BX ; Save for later use - - MUL [BP].TGP_Ypos ; Start of Line = Ypos * Width - ADD DI, AX ; DI -> Start of Line Ypos - - MOV AX, [BP].TGP_Xpos ; Get Xpos of Character - MOV CX, AX ; Save Copy of Xpos - SHR AX, 2 ; Bytes into Line = Xpos/4 - ADD DI, AX ; DI -> (Xpos, Ypos) - - ;Get Source ADDR of Character Bit Map & Save - - MOV AL, [BP].TGP_Char ; Get Character # - TEST AL, 080h ; Is Hi Bit Set? - JZ @TGP_LowChar ; Nope, use low char set ptr - - AND AL, 07Fh ; Mask Out Hi Bit - MOV BX, CHARSET_HI ; BX = Char Set Ptr:Offset - MOV DX, CHARSET_HI+2 ; DX = Char Set Ptr:Segment - JMP s @TGP_Set_Char ; Go Setup Character Ptr - -@TGP_LowChar: - - MOV BX, CHARSET_LOW ; BX = Char Set Ptr:Offset - MOV DX, CHARSET_LOW+2 ; DX = Char Set Ptr:Segment - -@TGP_Set_Char: - MOV [BP].TGP_T_SETS, DX ; Save Segment on Stack - - MOV AH, 0 ; Valid #'s are 0..127 - SHL AX, 3 ; * 8 Bytes Per Bitmap - ADD BX, AX ; BX = Offset of Selected char - MOV [BP].TGP_T_SETO, BX ; Save Offset on Stack - - AND CX, PLANE_BITS ; Get Plane # - MOV CH, ALL_PLANES ; Get Initial Plane mask - SHL CH, CL ; And shift into position - AND CH, ALL_PLANES ; And mask to lower nibble - - MOV AL, 04 ; 4-Plane # = # of initial - SUB AL, CL ; shifts to align bit mask - MOV CL, AL ; Shift Count for SHL - - ;Get segment of character map - - OUT_8 SC_Index, MAP_MASK ; Setup Plane selections - INC DX ; DX -> SC_Data - - MOV AL, 08 ; 8 Lines to Process - MOV [BP].TGP_Lines, AL ; Save on Stack - - MOV DS, [BP].TGP_T_SETS ; Point to character set - -@TGP_DECODE_CHAR_BYTE: - - MOV SI, [BP].TGP_T_SETO ; Get DS:SI = String - - MOV BH, [SI] ; Get Bit Map - INC SI ; Point to Next Line - MOV [BP].TGP_T_SETO, SI ; And save new Pointer... - - MOV AH, [BP].TGP_ColorF ; Get Foreground Color - - CLR BL ; Clear BL - ROL BX, CL ; BL holds left edge bits - MOV SI, BX ; Use as Table Index - AND SI, CHAR_BITS ; Get Low Bits - MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - JZ @TGP_NO_LEFT1BITS ; Skip if No Pixels to set - - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - - ;Now Do Middle/Last Band - -@TGP_NO_LEFT1BITS: - - INC DI ; Point to next Byte - ROL BX, 4 ; Shift 4 bits - - MOV SI, BX ; Make Lookup Pointer - AND SI, CHAR_BITS ; Get Low Bits - MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - JZ @TGP_NO_MIDDLE1BITS ; Skip if no pixels to set - - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@TGP_NO_MIDDLE1BITS: - XOR CH, ALL_PLANES ; Invert Clip Mask - CMP CL, 4 ; Aligned by 4? - JZ @TGP_NEXT_LINE ; If so, Exit now.. - - INC DI ; Point to next Byte - ROL BX, 4 ; Shift 4 bits - - MOV SI, BX ; Make Lookup Pointer - AND SI, CHAR_BITS ; Get Low Bits - MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - JZ @TGP_NO_RIGHT1BITS ; Skip if No Pixels to set - - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@TGP_NO_RIGHT1BITS: - - DEC DI ; Adjust for Next Line Advance - -@TGP_NEXT_LINE: - ADD DI, [BP].TGP_Width ; Point to Next Line - XOR CH, CHAR_BITS ; Flip the Clip mask back - - DEC [BP].TGP_Lines ; Count Down Lines - JZ @TGP_EXIT ; Ok... Done! - - JMP @TGP_DECODE_CHAR_BYTE ; Again! Hey! - -@TGP_EXIT: - ADD SP, 08 ; Deallocate stack workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 8 ; Exit and Clean up Stack - -TGPRINTC ENDP - - -;=============================================================== -;PRINT_STR (SEG String, MaxLen%, Xpos%, Ypos%, ColorF%, ColorB%) -;=============================================================== -; -; Routine to quickly Print a null terminated ASCII string on the -; active display page up to a maximum length. -; -; ENTRY: String = Far Pointer to ASCII string to print -; MaxLen = # of characters to print if no null found -; Xpos = X position to draw Text at -; Ypos = Y position of to draw Text at -; ColorF = Color to draw text in -; ColorB = Color to set background to -; -; EXIT: No meaningful values returned -; - -PS_STACK STRUC - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - PS_ColorB DW ? ; Background Color - PS_ColorF DW ? ; Text Color - PS_Ypos DW ? ; Y Position to Print at - PS_Xpos DW ? ; X position to Print at - PS_Len DW ? ; Maximum Length of string to print - PS_Text DW ?,? ; Far Ptr to Text String -PS_STACK ENDS - - PUBLIC PRINT_STR - -PRINT_STR PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - MOV BP, SP ; Set up Stack Frame - -@PS_Print_It: - - MOV CX, [BP].PS_Len ; Get Remaining text Length - JCXZ @PS_Exit ; Exit when out of text - - LES DI, d [BP].PS_Text ; ES:DI -> Current Char in Text - MOV AL, ES:[DI] ; AL = Text Character - AND AX, 00FFh ; Clear High Word - JZ @PS_Exit ; Exit if null character - - DEC [BP].PS_Len ; Remaining Text length-- - INC [BP].PS_Text ; Point to Next text char - - ; Set up Call to GPRINTC - - PUSH AX ; Set Character Parameter - MOV BX, [BP].PS_Xpos ; Get Xpos - PUSH BX ; Set Xpos Parameter - ADD BX, 8 ; Advance 1 Char to Right - MOV [BP].PS_Xpos, BX ; Save for next time through - - MOV BX, [BP].PS_Ypos ; Get Ypos - PUSH BX ; Set Ypos Parameter - - MOV BX, [BP].PS_ColorF ; Get Text Color - PUSH BX ; Set ColorF Parameter - - MOV BX, [BP].PS_ColorB ; Get Background Color - PUSH BX ; Set ColorB Parameter - - CALL f GPRINTC ; Print Character! - JMP s @PS_Print_It ; Process next character - -@PS_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 14 ; Exit and Clean up Stack - -PRINT_STR ENDP - - -;================================================================ -;TPRINT_STR (SEG String, MaxLen%, Xpos%, Ypos%, ColorF%, ColorB%) -;================================================================ -; -; Routine to quickly transparently Print a null terminated ASCII -; string on the active display page up to a maximum length. -; -; ENTRY: String = Far Pointer to ASCII string to print -; MaxLen = # of characters to print if no null found -; Xpos = X position to draw Text at -; Ypos = Y position of to draw Text at -; ColorF = Color to draw text in -; -; EXIT: No meaningful values returned -; - -TPS_STACK STRUC - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - TPS_ColorF DW ? ; Text Color - TPS_Ypos DW ? ; Y Position to Print at - TPS_Xpos DW ? ; X position to Print at - TPS_Len DW ? ; Maximum Length of string to print - TPS_Text DW ?,? ; Far Ptr to Text String -TPS_STACK ENDS - - PUBLIC TPRINT_STR - -TPRINT_STR PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - MOV BP, SP ; Set up Stack Frame - -@TPS_Print_It: - - MOV CX, [BP].TPS_Len ; Get Remaining text Length - JCXZ @TPS_Exit ; Exit when out of text - - LES DI, d [BP].TPS_Text ; ES:DI -> Current Char in Text - MOV AL, ES:[DI] ; AL = Text Character - AND AX, 00FFh ; Clear High Word - JZ @TPS_Exit ; Exit if null character - - DEC [BP].TPS_Len ; Remaining Text length-- - INC [BP].TPS_Text ; Point to Next text char - - ; Set up Call to TGPRINTC - - PUSH AX ; Set Character Parameter - MOV BX, [BP].TPS_Xpos ; Get Xpos - PUSH BX ; Set Xpos Parameter - ADD BX, 8 ; Advance 1 Char to Right - MOV [BP].TPS_Xpos, BX ; Save for next time through - - MOV BX, [BP].TPS_Ypos ; Get Ypos - PUSH BX ; Set Ypos Parameter - - MOV BX, [BP].TPS_ColorF ; Get Text Color - PUSH BX ; Set ColorF Parameter - - CALL f TGPRINTC ; Print Character! - JMP s @TPS_Print_It ; Process next character - -@TPS_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 12 ; Exit and Clean up Stack - -TPRINT_STR ENDP - - -;=========================================== -;SET_DISPLAY_FONT(SEG FontData, FontNumber%) -;=========================================== -; -; Allows the user to specify their own font data for -; wither the lower or upper 128 characters. -; -; ENTRY: FontData = Far Pointer to Font Bitmaps -; FontNumber = Which half of set this is -; = 0, Lower 128 characters -; = 1, Upper 128 characters -; -; EXIT: No meaningful values returned -; - -SDF_STACK STRUC - DW ? ; BP - DD ? ; Caller - SDF_Which DW ? ; Hi Table/Low Table Flag - SDF_Font DD ? ; Far Ptr to Font Table -SDF_STACK ENDS - - PUBLIC SET_DISPLAY_FONT - -SET_DISPLAY_FONT PROC FAR - - PUSH BP ; Preserve Registers - MOV BP, SP ; Set up Stack Frame - - LES DI, [BP].SDF_Font ; Get Far Ptr to Font - - MOV SI, o CHARSET_LOW ; Assume Lower 128 chars - TEST [BP].SDF_Which, 1 ; Font #1 selected? - JZ @SDF_Set_Font ; If not, skip ahead - - MOV SI, o CHARSET_HI ; Ah, really it's 128-255 - -@SDF_Set_Font: - MOV [SI], DI ; Set Font Pointer Offset - MOV [SI+2], ES ; Set Font Pointer Segment - - POP BP ; Restore Registers - RET 6 ; We are Done.. Outa here - -SET_DISPLAY_FONT ENDP - - - ; ===== BITMAP (SPRITE) DISPLAY ROUTINES ===== - -;====================================================== -;DRAW_BITMAP (SEG Image, Xpos%, Ypos%, Width%, Height%) -;====================================================== -; -; Draws a variable sized Graphics Bitmap such as a -; picture or an Icon on the current Display Page in -; Mode X. The Bitmap is stored in a linear byte array -; corresponding to (0,0) (1,0), (2,0) .. (Width, Height) -; This is the same linear manner as mode 13h graphics. -; -; ENTRY: Image = Far Pointer to Bitmap Data -; Xpos = X position to Place Upper Left pixel at -; Ypos = Y position to Place Upper Left pixel at -; Width = Width of the Bitmap in Pixels -; Height = Height of the Bitmap in Pixels -; -; EXIT: No meaningful values returned -; - -DB_STACK STRUC - DB_LineO DW ? ; Offset to Next Line - DB_PixCount DW ? ; (Minimum) # of Pixels/Line - DB_Start DW ? ; Addr of Upper Left Pixel - DB_PixSkew DW ? ; # of bytes to Adjust EOL - DB_SkewFlag DW ? ; Extra Pix on Plane Flag - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - DB_Height DW ? ; Height of Bitmap in Pixels - DB_Width DW ? ; Width of Bitmap in Pixels - DB_Ypos DW ? ; Y position to Draw Bitmap at - DB_Xpos DW ? ; X position to Draw Bitmap at - DB_Image DD ? ; Far Pointer to Graphics Bitmap -DB_STACK ENDS - - PUBLIC DRAW_BITMAP - -DRAW_BITMAP PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - SUB SP, 10 ; Allocate workspace - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - CLD ; Direction Flag = Forward - - MOV AX, [BP].DB_Ypos ; Get UL Corner Ypos - MUL SCREEN_WIDTH ; AX = Offset to Line Ypos - - MOV BX, [BP].DB_Xpos ; Get UL Corner Xpos - MOV CL, BL ; Save Plane # in CL - SHR BX, 2 ; Xpos/4 = Offset Into Line - - ADD DI, AX ; ES:DI -> Start of Line - ADD DI, BX ; ES:DI -> Upper Left Pixel - MOV [BP].DB_Start, DI ; Save Starting Addr - - ; Compute line to line offset - - MOV BX, [BP].DB_Width ; Get Width of Image - MOV DX, BX ; Save Copy in DX - SHR BX, 2 ; /4 = width in bands - MOV AX, SCREEN_WIDTH ; Get Screen Width - SUB AX, BX ; - (Bitmap Width/4) - - MOV [BP].DB_LineO, AX ; Save Line Width offset - MOV [BP].DB_PixCount, BX ; Minimum # pix to copy - - AND DX, PLANE_BITS ; Get "partial band" size (0-3) - MOV [BP].DB_PixSkew, DX ; Also End of Line Skew - MOV [BP].DB_SkewFlag, DX ; Save as Flag/Count - - AND CX, PLANE_BITS ; CL = Starting Plane # - MOV AX, MAP_MASK_PLANE2 ; Plane Mask & Plane Select - SHL AH, CL ; Select correct Plane - OUT_16 SC_Index, AX ; Select Plane... - MOV BH, AH ; BH = Saved Plane Mask - MOV BL, 4 ; BL = Planes to Copy - -@DB_COPY_PLANE: - - LDS SI, [BP].DB_Image ; DS:SI-> Source Image - MOV DX, [BP].DB_Height ; # of Lines to Copy - MOV DI, [BP].DB_Start ; ES:DI-> Dest pos - -@DB_COPY_LINE: - MOV CX, [BP].DB_PixCount ; Min # to copy - - TEST CL, 0FCh ; 16+PixWide? - JZ @DB_COPY_REMAINDER ; Nope... - - ; Pixel Copy loop has been unrolled to x4 - -@DB_COPY_LOOP: - MOVSB ; Copy Bitmap Pixel - ADD SI, 3 ; Skip to Next Byte in same plane - MOVSB ; Copy Bitmap Pixel - ADD SI, 3 ; Skip to Next Byte in same plane - MOVSB ; Copy Bitmap Pixel - ADD SI, 3 ; Skip to Next Byte in same plane - MOVSB ; Copy Bitmap Pixel - ADD SI, 3 ; Skip to Next Byte in same plane - - SUB CL, 4 ; Pixels to Copy=-4 - TEST CL, 0FCh ; 4+ Pixels Left? - JNZ @DB_COPY_LOOP ; if so, do another block - -@DB_COPY_REMAINDER: - JCXZ @DB_NEXT_LINE ; Any Pixels left on line - -@DB_COPY2: - MOVSB ; Copy Bitmap Pixel - ADD SI,3 ; Skip to Next Byte in same plane - LOOPx CX, @DB_COPY2 ; Pixels to Copy--, Loop until done - -@DB_NEXT_LINE: - - ; any Partial Pixels? (some planes only) - - OR CX, [BP].DB_SkewFlag ; Get Skew Count - JZ @DB_NEXT2 ; if no partial pixels - - MOVSB ; Copy Bitmap Pixel - DEC DI ; Back up to align - DEC SI ; Back up to align - -@DB_NEXT2: - ADD SI, [BP].DB_PixSkew ; Adjust Skew - ADD DI, [BP].DB_LineO ; Set to Next Display Line - LOOPx DX, @DB_COPY_LINE ; Lines to Copy--, Loop if more - - ; Copy Next Plane.... - - DEC BL ; Planes to Go-- - JZ @DB_Exit ; Hey! We are done - - ROL BH, 1 ; Next Plane in line... - OUT_8 SC_Data, BH ; Select Plane - - CMP AL, 12h ; Carry Set if AL=11h - ADC [BP].DB_Start, 0 ; Screen Addr =+Carry - INC w [BP].DB_Image ; Start @ Next Byte - - SUB [BP].DB_SkewFlag, 1 ; Reduce Planes to Skew - ADC [BP].DB_SkewFlag, 0 ; Back to 0 if it was -1 - - JMP s @DB_COPY_PLANE ; Go Copy the Next Plane - -@DB_Exit: - ADD SP, 10 ; Deallocate workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 12 ; Exit and Clean up Stack - -DRAW_BITMAP ENDP - - -;======================================================= -;TDRAW_BITMAP (SEG Image, Xpos%, Ypos%, Width%, Height%) -;======================================================= -; -; Transparently Draws a variable sized Graphics Bitmap -; such as a picture or an Icon on the current Display Page -; in Mode X. Pixels with a value of 0 are not drawn, -; leaving the previous "background" contents intact. -; -; The Bitmap format is the same as for the DRAW_BITMAP function. -; -; ENTRY: Image = Far Pointer to Bitmap Data -; Xpos = X position to Place Upper Left pixel at -; Ypos = Y position to Place Upper Left pixel at -; Width = Width of the Bitmap in Pixels -; Height = Height of the Bitmap in Pixels -; -; EXIT: No meaningful values returned -; - -TB_STACK STRUC - TB_LineO DW ? ; Offset to Next Line - TB_PixCount DW ? ; (Minimum) # of Pixels/Line - TB_Start DW ? ; Addr of Upper Left Pixel - TB_PixSkew DW ? ; # of bytes to Adjust EOL - TB_SkewFlag DW ? ; Extra Pix on Plane Flag - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - TB_Height DW ? ; Height of Bitmap in Pixels - TB_Width DW ? ; Width of Bitmap in Pixels - TB_Ypos DW ? ; Y position to Draw Bitmap at - TB_Xpos DW ? ; X position to Draw Bitmap at - TB_Image DD ? ; Far Pointer to Graphics Bitmap -TB_STACK ENDS - - PUBLIC TDRAW_BITMAP - -TDRAW_BITMAP PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - SUB SP, 10 ; Allocate workspace - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - CLD ; Direction Flag = Forward - - MOV AX, [BP].TB_Ypos ; Get UL Corner Ypos - MUL SCREEN_WIDTH ; AX = Offset to Line Ypos - - MOV BX, [BP].TB_Xpos ; Get UL Corner Xpos - MOV CL, BL ; Save Plane # in CL - SHR BX, 2 ; Xpos/4 = Offset Into Line - - ADD DI, AX ; ES:DI -> Start of Line - ADD DI, BX ; ES:DI -> Upper Left Pixel - MOV [BP].TB_Start, DI ; Save Starting Addr - - ; Compute line to line offset - - MOV BX, [BP].TB_Width ; Get Width of Image - MOV DX, BX ; Save Copy in DX - SHR BX, 2 ; /4 = width in bands - MOV AX, SCREEN_WIDTH ; Get Screen Width - SUB AX, BX ; - (Bitmap Width/4) - - MOV [BP].TB_LineO, AX ; Save Line Width offset - MOV [BP].TB_PixCount, BX ; Minimum # pix to copy - - AND DX, PLANE_BITS ; Get "partial band" size (0-3) - MOV [BP].TB_PixSkew, DX ; Also End of Line Skew - MOV [BP].TB_SkewFlag, DX ; Save as Flag/Count - - AND CX, PLANE_BITS ; CL = Starting Plane # - MOV AX, MAP_MASK_PLANE2 ; Plane Mask & Plane Select - SHL AH, CL ; Select correct Plane - OUT_16 SC_Index, AX ; Select Plane... - MOV BH, AH ; BH = Saved Plane Mask - MOV BL, 4 ; BL = Planes to Copy - -@TB_COPY_PLANE: - - LDS SI, [BP].TB_Image ; DS:SI-> Source Image - MOV DX, [BP].TB_Height ; # of Lines to Copy - MOV DI, [BP].TB_Start ; ES:DI-> Dest pos - - ; Here AH is set with the value to be considered - ; "Transparent". It can be changed! - - MOV AH, 0 ; Value to Detect 0 - -@TB_COPY_LINE: - MOV CX, [BP].TB_PixCount ; Min # to copy - - TEST CL, 0FCh ; 16+PixWide? - JZ @TB_COPY_REMAINDER ; Nope... - - ; Pixel Copy loop has been unrolled to x4 - -@TB_COPY_LOOP: - LODSB ; Get Pixel Value in AL - ADD SI, 3 ; Skip to Next Byte in same plane - CMP AL, AH ; It is "Transparent"? - JE @TB_SKIP_01 ; Skip ahead if so - MOV ES:[DI], AL ; Copy Pixel to VGA screen - -@TB_SKIP_01: - LODSB ; Get Pixel Value in AL - ADD SI, 3 ; Skip to Next Byte in same plane - CMP AL, AH ; It is "Transparent"? - JE @TB_SKIP_02 ; Skip ahead if so - MOV ES:[DI+1], AL ; Copy Pixel to VGA screen - -@TB_SKIP_02: - LODSB ; Get Pixel Value in AL - ADD SI, 3 ; Skip to Next Byte in same plane - CMP AL, AH ; It is "Transparent"? - JE @TB_SKIP_03 ; Skip ahead if so - MOV ES:[DI+2], AL ; Copy Pixel to VGA screen - -@TB_SKIP_03: - LODSB ; Get Pixel Value in AL - ADD SI, 3 ; Skip to Next Byte in same plane - CMP AL, AH ; It is "Transparent"? - JE @TB_SKIP_04 ; Skip ahead if so - MOV ES:[DI+3], AL ; Copy Pixel to VGA screen - -@TB_SKIP_04: - ADD DI, 4 ; Adjust Pixel Write Location - SUB CL, 4 ; Pixels to Copy=-4 - TEST CL, 0FCh ; 4+ Pixels Left? - JNZ @TB_COPY_LOOP ; if so, do another block - -@TB_COPY_REMAINDER: - JCXZ @TB_NEXT_LINE ; Any Pixels left on line - -@TB_COPY2: - LODSB ; Get Pixel Value in AL - ADD SI, 3 ; Skip to Next Byte in same plane - CMP AL, AH ; It is "Transparent"? - JE @TB_SKIP_05 ; Skip ahead if so - MOV ES:[DI], AL ; Copy Pixel to VGA screen - -@TB_SKIP_05: - INC DI ; Advance Dest Addr - LOOPx CX, @TB_COPY2 ; Pixels to Copy--, Loop until done - -@TB_NEXT_LINE: - - ; any Partial Pixels? (some planes only) - - OR CX, [BP].TB_SkewFlag ; Get Skew Count - JZ @TB_NEXT2 ; if no partial pixels - - LODSB ; Get Pixel Value in AL - DEC SI ; Backup to Align - CMP AL, AH ; It is "Transparent"? - JE @TB_NEXT2 ; Skip ahead if so - MOV ES:[DI], AL ; Copy Pixel to VGA screen - -@TB_NEXT2: - ADD SI, [BP].TB_PixSkew ; Adjust Skew - ADD DI, [BP].TB_LineO ; Set to Next Display Line - LOOPx DX, @TB_COPY_LINE ; Lines to Copy--, Loop if More - - ;Copy Next Plane.... - - DEC BL ; Planes to Go-- - JZ @TB_Exit ; Hey! We are done - - ROL BH, 1 ; Next Plane in line... - OUT_8 SC_Data, BH ; Select Plane - - CMP AL, 12h ; Carry Set if AL=11h - ADC [BP].TB_Start, 0 ; Screen Addr =+Carry - INC w [BP].TB_Image ; Start @ Next Byte - - SUB [BP].TB_SkewFlag, 1 ; Reduce Planes to Skew - ADC [BP].TB_SkewFlag, 0 ; Back to 0 if it was -1 - - JMP @TB_COPY_PLANE ; Go Copy the next Plane - -@TB_Exit: - ADD SP, 10 ; Deallocate workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 12 ; Exit and Clean up Stack - -TDRAW_BITMAP ENDP - - - ; ==== VIDEO MEMORY to VIDEO MEMORY COPY ROUTINES ===== - -;================================== -;COPY_PAGE (SourcePage%, DestPage%) -;================================== -; -; Duplicate on display page onto another -; -; ENTRY: SourcePage = Display Page # to Duplicate -; DestPage = Display Page # to hold copy -; -; EXIT: No meaningful values returned -; - -CP_STACK STRUC - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - CP_DestP DW ? ; Page to hold copied image - CP_SourceP DW ? ; Page to Make copy from -CP_STACK ENDS - - PUBLIC COPY_PAGE - -COPY_PAGE PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - MOV BP, SP ; Set up Stack Frame - CLD ; Block Xfer Forwards - - ; Make sure Page #'s are valid - - MOV AX, [BP].CP_SourceP ; Get Source Page # - CMP AX, LAST_PAGE ; is it > Max Page #? - JAE @CP_Exit ; if so, abort - - MOV BX, [BP].CP_DestP ; Get Destination Page # - CMP BX, LAST_PAGE ; is it > Max Page #? - JAE @CP_Exit ; if so, abort - - CMP AX, BX ; Pages #'s the same? - JE @CP_Exit ; if so, abort - - ; Setup DS:SI and ES:DI to Video Pages - - SHL BX, 1 ; Scale index to Word - MOV DI, PAGE_ADDR[BX] ; Offset to Dest Page - - MOV BX, AX ; Index to Source page - SHL BX, 1 ; Scale index to Word - MOV SI, PAGE_ADDR[BX] ; Offset to Source Page - - MOV CX, PAGE_SIZE ; Get size of Page - MOV AX, CURRENT_SEGMENT ; Get Video Mem Segment - MOV ES, AX ; ES:DI -> Dest Page - MOV DS, AX ; DS:SI -> Source Page - - ; Setup VGA registers for Mem to Mem copy - - OUT_16 GC_Index, LATCHES_ON ; Data from Latches = on - OUT_16 SC_Index, ALL_PLANES_ON ; Copy all Planes - - ; Note.. Do *NOT* use MOVSW or MOVSD - they will - ; Screw with the latches which are 8 bits x 4 - - REP MOVSB ; Copy entire Page! - - ; Reset VGA for normal memory access - - OUT_16 GC_Index, LATCHES_OFF ; Data from Latches = off - -@CP_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 4 ; Exit and Clean up Stack - -COPY_PAGE ENDP - - -;========================================================================== -;COPY_BITMAP (SourcePage%, X1%, Y1%, X2%, Y2%, DestPage%, DestX1%, DestY1%) -;========================================================================== -; -; Copies a Bitmap Image from one Display Page to Another -; This Routine is Limited to copying Images with the same -; Plane Alignment. To Work: (X1 MOD 4) must = (DestX1 MOD 4) -; Copying an Image to the Same Page is supported, but results -; may be defined when the when the rectangular areas -; (X1, Y1) - (X2, Y2) and (DestX1, DestY1) - -; (DestX1+(X2-X1), DestY1+(Y2-Y1)) overlap... -; No Paramter checking to done to insure that -; X2 >= X1 and Y2 >= Y1. Be Careful... -; -; ENTRY: SourcePage = Display Page # with Source Image -; X1 = Upper Left Xpos of Source Image -; Y1 = Upper Left Ypos of Source Image -; X2 = Lower Right Xpos of Source Image -; Y2 = Lower Right Ypos of Source Image -; DestPage = Display Page # to copy Image to -; DestX1 = Xpos to Copy UL Corner of Image to -; DestY1 = Ypos to Copy UL Corner of Image to -; -; EXIT: AX = Success Flag: 0 = Failure / -1= Success -; - -CB_STACK STRUC - CB_Height DW ? ; Height of Image in Lines - CB_Width DW ? ; Width of Image in "bands" - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - CB_DestY1 DW ? ; Destination Ypos - CB_DestX1 DW ? ; Destination Xpos - CB_DestP DW ? ; Page to Copy Bitmap To - CB_Y2 DW ? ; LR Ypos of Image - CB_X2 DW ? ; LR Xpos of Image - CB_Y1 DW ? ; UL Ypos of Image - CB_X1 DW ? ; UL Xpos of Image - CB_SourceP DW ? ; Page containing Source Bitmap -CB_STACK ENDS - - PUBLIC COPY_BITMAP - -COPY_BITMAP PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - SUB SP, 4 ; Allocate WorkSpace on Stack - MOV BP, SP ; Set up Stack Frame - - ; Prep Registers (and keep jumps short!) - - MOV ES, CURRENT_SEGMENT ; ES -> VGA Ram - CLD ; Block Xfer Forwards - - ; Make sure Parameters are valid - - MOV BX, [BP].CB_SourceP ; Get Source Page # - CMP BX, LAST_PAGE ; is it > Max Page #? - JAE @CB_Abort ; if so, abort - - MOV CX, [BP].CB_DestP ; Get Destination Page # - CMP CX, LAST_PAGE ; is it > Max Page #? - JAE @CB_Abort ; if so, abort - - MOV AX, [BP].CB_X1 ; Get Source X1 - XOR AX, [BP].CB_DestX1 ; Compare Bits 0-1 - AND AX, PLANE_BITS ; Check Plane Bits - JNZ @CB_Abort ; They should cancel out - - ; Setup for Copy processing - - OUT_8 SC_INDEX, MAP_MASK ; Set up for Plane Select - OUT_16 GC_Index, LATCHES_ON ; Data from Latches = on - - ; Compute Info About Images, Setup ES:SI & ES:DI - - MOV AX, [BP].CB_Y2 ; Height of Bitmap in lines - SUB AX, [BP].CB_Y1 ; is Y2 - Y1 + 1 - INC AX ; (add 1 since were not 0 based) - MOV [BP].CB_Height, AX ; Save on Stack for later use - - MOV AX, [BP].CB_X2 ; Get # of "Bands" of 4 Pixels - MOV DX, [BP].CB_X1 ; the Bitmap Occupies as X2-X1 - SHR AX, 2 ; Get X2 Band (X2 / 4) - SHR DX, 2 ; Get X1 Band (X1 / 4) - SUB AX, DX ; AX = # of Bands - 1 - INC AX ; AX = # of Bands - MOV [BP].CB_Width, AX ; Save on Stack for later use - - SHL BX, 1 ; Scale Source Page to Word - MOV SI, PAGE_ADDR[BX] ; SI = Offset of Source Page - MOV AX, [BP].CB_Y1 ; Get Source Y1 Line - MUL SCREEN_WIDTH ; AX = Offset to Line Y1 - ADD SI, AX ; SI = Offset to Line Y1 - MOV AX, [BP].CB_X1 ; Get Source X1 - SHR AX, 2 ; X1 / 4 = Byte offset - ADD SI, AX ; SI = Byte Offset to (X1,Y1) - - MOV BX, CX ; Dest Page Index to BX - SHL BX, 1 ; Scale Source Page to Word - MOV DI, PAGE_ADDR[BX] ; DI = Offset of Dest Page - MOV AX, [BP].CB_DestY1 ; Get Dest Y1 Line - MUL SCREEN_WIDTH ; AX = Offset to Line Y1 - ADD DI, AX ; DI = Offset to Line Y1 - MOV AX, [BP].CB_DestX1 ; Get Dest X1 - SHR AX, 2 ; X1 / 4 = Byte offset - ADD DI, AX ; DI = Byte Offset to (D-X1,D-Y1) - - MOV CX, [BP].CB_Width ; CX = Width of Image (Bands) - DEC CX ; CX = 1? - JE @CB_Only_One_Band ; 0 Means Image Width of 1 Band - - MOV BX, [BP].CB_X1 ; Get Source X1 - AND BX, PLANE_BITS ; Aligned? (bits 0-1 = 00?) - JZ @CB_Check_Right ; if so, check right alignment - JNZ @CB_Left_Band ; not aligned? well.. - -@CB_Abort: - CLR AX ; Return False (Failure) - JMP @CB_Exit ; and Finish Up - - ; Copy when Left & Right Clip Masks overlap... - -@CB_Only_One_Band: - MOV BX, [BP].CB_X1 ; Get Left Clip Mask - AND BX, PLANE_BITS ; Mask out Row # - MOV AL, Left_Clip_Mask[BX] ; Get Left Edge Mask - MOV BX, [BP].CB_X2 ; Get Right Clip Mask - AND BX, PLANE_BITS ; Mask out Row # - AND AL, Right_Clip_Mask[BX] ; Get Right Edge Mask byte - - OUT_8 SC_Data, AL ; Clip For Left & Right Masks - - MOV CX, [BP].CB_Height ; CX = # of Lines to Copy - MOV DX, SCREEN_WIDTH ; DX = Width of Screen - CLR BX ; BX = Offset into Image - -@CB_One_Loop: - MOV AL, ES:[SI+BX] ; Load Latches - MOV ES:[DI+BX], AL ; Unload Latches - ADD BX, DX ; Advance Offset to Next Line - LOOPjz CX, @CB_One_Done ; Exit Loop if Finished - - MOV AL, ES:[SI+BX] ; Load Latches - MOV ES:[DI+BX], AL ; Unload Latches - ADD BX, DX ; Advance Offset to Next Line - LOOPx CX, @CB_One_Loop ; Loop until Finished - -@CB_One_Done: - JMP @CB_Finish ; Outa Here! - - ; Copy Left Edge of Bitmap - -@CB_Left_Band: - - OUT_8 SC_Data, Left_Clip_Mask[BX] ; Set Left Edge Plane Mask - - MOV CX, [BP].CB_Height ; CX = # of Lines to Copy - MOV DX, SCREEN_WIDTH ; DX = Width of Screen - CLR BX ; BX = Offset into Image - -@CB_Left_Loop: - MOV AL, ES:[SI+BX] ; Load Latches - MOV ES:[DI+BX], AL ; Unload Latches - ADD BX, DX ; Advance Offset to Next Line - LOOPjz CX, @CB_Left_Done ; Exit Loop if Finished - - MOV AL, ES:[SI+BX] ; Load Latches - MOV ES:[DI+BX], AL ; Unload Latches - ADD BX, DX ; Advance Offset to Next Line - LOOPx CX, @CB_Left_Loop ; Loop until Finished - -@CB_Left_Done: - INC DI ; Move Dest Over 1 band - INC SI ; Move Source Over 1 band - DEC [BP].CB_Width ; Band Width-- - - ; Determine if Right Edge of Bitmap needs special copy - -@CB_Check_Right: - MOV BX, [BP].CB_X2 ; Get Source X2 - AND BX, PLANE_BITS ; Aligned? (bits 0-1 = 11?) - CMP BL, 03h ; Plane = 3? - JE @CB_Copy_Middle ; Copy the Middle then! - - ; Copy Right Edge of Bitmap - -@CB_Right_Band: - - OUT_8 SC_Data, Right_Clip_Mask[BX] ; Set Right Edge Plane Mask - - DEC [BP].CB_Width ; Band Width-- - MOV CX, [BP].CB_Height ; CX = # of Lines to Copy - MOV DX, SCREEN_WIDTH ; DX = Width of Screen - MOV BX, [BP].CB_Width ; BX = Offset to Right Edge - -@CB_Right_Loop: - MOV AL, ES:[SI+BX] ; Load Latches - MOV ES:[DI+BX], AL ; Unload Latches - ADD BX, DX ; Advance Offset to Next Line - LOOPjz CX, @CB_Right_Done ; Exit Loop if Finished - - MOV AL, ES:[SI+BX] ; Load Latches - MOV ES:[DI+BX], AL ; Unload Latches - ADD BX, DX ; Advance Offset to Next Line - LOOPx CX, @CB_Right_Loop ; Loop until Finished - -@CB_Right_Done: - - ; Copy the Main Block of the Bitmap - -@CB_Copy_Middle: - - MOV CX, [BP].CB_Width ; Get Width Remaining - JCXZ @CB_Finish ; Exit if Done - - OUT_8 SC_Data, ALL_PLANES ; Copy all Planes - - MOV DX, SCREEN_WIDTH ; Get Width of Screen minus - SUB DX, CX ; Image width (for Adjustment) - MOV AX, [BP].CB_Height ; AX = # of Lines to Copy - MOV BX, CX ; BX = Quick REP reload count - MOV CX, ES ; Move VGA Segment - MOV DS, CX ; Into DS - - ; Actual Copy Loop. REP MOVSB does the work - -@CB_Middle_Copy: - MOV CX, BX ; Recharge Rep Count - REP MOVSB ; Move Bands - LOOPjz AX, @CB_Finish ; Exit Loop if Finished - - ADD SI, DX ; Adjust DS:SI to Next Line - ADD DI, DX ; Adjust ES:DI to Next Line - - MOV CX, BX ; Recharge Rep Count - REP MOVSB ; Move Bands - - ADD SI, DX ; Adjust DS:SI to Next Line - ADD DI, DX ; Adjust ES:DI to Next Line - LOOPx AX, @CB_Middle_Copy ; Copy Lines until Done - -@CB_Finish: - OUT_16 GC_Index, LATCHES_OFF ; Data from Latches = on - -@CB_Exit: - ADD SP, 04 ; Deallocate stack workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 16 ; Exit and Clean up Stack - -COPY_BITMAP ENDP - - END ; End of Code Segment diff --git a/modex105/DEMOS/C/MODEX.BI b/modex105/DEMOS/C/MODEX.BI deleted file mode 100755 index 6b1d7afe..00000000 --- a/modex105/DEMOS/C/MODEX.BI +++ /dev/null @@ -1,63 +0,0 @@ - - ' ===== SCREEN RESOLUTIONS ===== - -CONST Mode320x200 = 0, Mode320x400 = 1 -CONST Mode360x200 = 2, Mode360x400 = 3 -CONST Mode320x240 = 4, Mode320x480 = 5 -CONST Mode360x240 = 6, Mode360x480 = 7 - - ' ===== MODE X SETUP ROUTINES ===== - -DECLARE FUNCTION SET.VGA.MODEX% ALIAS "SET_VGA_MODEX" (BYVAL ModeType%, BYVAL MaxXpos%, BYVAL MaxYpos%, BYVAL Pages%) -DECLARE FUNCTION SET.MODEX% ALIAS "SET_MODEX" (BYVAL Mode%) - - ' ===== BASIC GRAPHICS PRIMITIVES ===== - -DECLARE SUB CLEAR.VGA.SCREEN ALIAS "CLEAR_VGA_SCREEN" (BYVAL ColorNum%) -DECLARE SUB SET.POINT ALIAS "SET_POINT" (BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorNum%) -DECLARE FUNCTION READ.POINT% ALIAS "READ_POINT" (BYVAL Xpos%, BYVAL Ypos%) -DECLARE SUB FILL.BLOCK ALIAS "FILL_BLOCK" (BYVAL Xpos1%, BYVAL Ypos1%, BYVAL Xpos2%, BYVAL Ypos2%, BYVAL ColorNum%) -DECLARE SUB DRAW.LINE ALIAS "DRAW_LINE" (BYVAL Xpos1%, BYVAL Ypos1%, BYVAL Xpos2%, BYVAL Ypos2%, BYVAL ColorNum%) - - ' ===== DAC COLOR REGISTER ROUTINES ===== - -DECLARE SUB SET.DAC.REGISTER ALIAS "SET_DAC_REGISTER" (BYVAL RegNo%, BYVAL Red%, BYVAL Green%, BYVAL Blue%) -DECLARE SUB GET.DAC.REGISTER ALIAS "GET_DAC_REGISTER" (BYVAL RegNo%, Red%, Green%, Blue%) -DECLARE SUB LOAD.DAC.REGISTERS ALIAS "LOAD_DAC_REGISTERS" (SEG PalData AS ANY, BYVAL StartReg%, BYVAL EndReg%, BYVAL VSync%) -DECLARE SUB READ.DAC.REGISTERS ALIAS "READ_DAC_REGISTERS" (SEG PalData AS ANY, BYVAL StartReg%, BYVAL EndReg%) - - - ' ===== PAGE FLIPPING AND SCROLLING ROUTINES ===== - -DECLARE SUB SET.ACTIVE.PAGE ALIAS "SET_ACTIVE_PAGE" (BYVAL PageNo%) -DECLARE FUNCTION GET.ACTIVE.PAGE% ALIAS "GET_ACTIVE_PAGE" -DECLARE SUB SET.DISPLAY.PAGE ALIAS "SET_DISPLAY_PAGE" (BYVAL PageNo%) -DECLARE FUNCTION GET.DISPLAY.PAGE% ALIAS "GET_DISPLAY_PAGE" -DECLARE SUB SET.WINDOW ALIAS "SET_WINDOW" (BYVAL DisplayPage%, BYVAL XOffset%, BYVAL YOffset%) -DECLARE FUNCTION GET.X.OFFSET% ALIAS "GET_X_OFFSET" () -DECLARE FUNCTION GET.Y.OFFSET% ALIAS "GET_Y_OFFSET" () -DECLARE SUB SYNC.DISPLAY ALIAS "SYNC_DISPLAY" - - ' ===== TEXT DISPLAY ROUTINES ===== - -DECLARE SUB GPRINTC (BYVAL CharacterNum%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%, BYVAL ColorB%) -DECLARE SUB TGPRINTC (BYVAL CharacterNum%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%) -DECLARE SUB PRINT.STR ALIAS "PRINT_STR" (BYVAL StrSeg%, BYVAL StrOfs%, BYVAL MaxLen%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%, BYVAL ColorB%) -DECLARE SUB TPRINT.STR ALIAS "TPRINT_STR" (BYVAL StrSeg%, BYVAL StrOfs%, BYVAL MaxLen%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%) -DECLARE SUB SET.DISPLAY.FONT ALIAS "SET_DISPLAY_FONT" (SEG FontData AS ANY, BYVAL FontNumber%) - - ' ===== BITMAP (SPRITE) DISPLAY ROUTINES ===== - -DECLARE SUB DRAW.BITMAP ALIAS "DRAW_BITMAP" (SEG Image AS ANY, BYVAL Xpos%, BYVAL Ypos%, BYVAL xWidth%, BYVAL Height%) -DECLARE SUB TDRAW.BITMAP ALIAS "TDRAW_BITMAP" (SEG Image AS ANY, BYVAL Xpos%, BYVAL Ypos%, BYVAL xWidth%, BYVAL Height%) - - ' ==== VIDEO MEMORY to VIDEO MEMORY COPY ROUTINES ===== - -DECLARE SUB COPY.PAGE ALIAS "COPY_PAGE" (BYVAL SourcePage%, BYVAL DestPage%) -DECLARE SUB COPY.BITMAP ALIAS "COPY_BITMAP" (BYVAL SourcePage%, BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%, BYVAL DestPage%, BYVAL DestX1%, BYVAL DestY1%) - - - - - - diff --git a/modex105/DEMOS/C/MODEX.H b/modex105/DEMOS/C/MODEX.H deleted file mode 100755 index 7de25a63..00000000 --- a/modex105/DEMOS/C/MODEX.H +++ /dev/null @@ -1,76 +0,0 @@ - -#ifndef __MODEX_H -#define __MODEX_H - - /* ===== SCREEN RESOLUTIONS ===== */ - -#define Mode_320x200 0 -#define Mode_320x400 1 -#define Mode_360x200 2 -#define Mode_360x400 3 -#define Mode_320x240 4 -#define Mode_320x480 5 -#define Mode_360x240 6 -#define Mode_360x480 7 - - /* ===== MODE X SETUP ROUTINES ===== */ - -int far pascal set_vga_modex (int Mode, int MaxXpos, int MaxYpos, int Pages); -int far pascal set_modex (int Mode); - - /* ===== BASIC GRAPHICS PRIMITIVES ===== */ - -void far pascal clear_vga_screen (int Color); -void far pascal set_point (int Xpos, int Ypos, int Color); -int far pascal read_point (int Xpos, int Ypos); -void far pascal fill_block (int Xpos1, int Ypos1, int Xpos2, int Ypos2, - int Color); -void far pascal draw_line (int Xpos1, int Ypos1, int Xpos2, int Ypos2, - int Color); - - /* ===== DAC COLOR REGISTER ROUTINES ===== */ - -void far pascal set_dac_register (int RegNo, int Red, int Green, int Blue); -void far pascal get_dac_register (int RegNo, int* Red, int* Green, int* Blue); -void far pascal load_dac_registers (char far *PalData, int StartReg, - int EndReg, int VSync); -void far pascal readd_dac_registers (char far *PalData, int StartReg, - int EndReg); - - /* ===== PAGE FLIPPING AND SCROLLING ROUTINES ===== */ - -void far pascal set_active_page (int PageNo); -int far pascal get_active_page (void); -void far pascal set_display_page (int PageNo); -int far pascal get_display_page (void); -void far pascal set_window (int DisplayPage, int XOffset, int YOffset); -int far pascal get_x_offset (void); -int far pascal get_y_offset (void); -void far pascal sync_display (void); - - /* ===== TEXT DISPLAY ROUTINES ===== */ - -void far pascal gprintc (int CharNum, int Xpos, int Ypos, int ColorF, - int ColorB); -void far pascal tgprintc (int CharNum, int Xpos, int Ypos, int ColorF); -void far pascal print_str (char far *Text, int MaxLen, int Xpos, int Ypos, - int ColorF, int ColorB); -void far pascal tprint_str (char far *Text, int MaxLen, int Xpos, int Ypos, - int ColorF); -void far pascal set_display_font (char far *FontData, int FontNumber); - - /* ===== BITMAP (SPRITE) DISPLAY ROUTINES ===== */ - -void far pascal draw_bitmap (char far *Image, int Xpos, int Ypos, - int Width, int Height); -void far pascal tdraw_bitmap (char far *Image, int Xpos, int Ypos, - int Width, int Height); - - /* ==== VIDEO MEMORY to VIDEO MEMORY COPY ROUTINES ===== */ - -void far pascal copy_page (int SourcePage, int DestPage); -void far pascal copy_bitmap (int SourcePage, int X1, int Y1, int X2, int Y2, - int DestPage, int DestX1, int DestY1); - - -#endif diff --git a/modex105/DEMOS/C/UTLS-ASM.BAT b/modex105/DEMOS/C/UTLS-ASM.BAT deleted file mode 100755 index d996978f..00000000 --- a/modex105/DEMOS/C/UTLS-ASM.BAT +++ /dev/null @@ -1 +0,0 @@ -MASM c_utils, c_utils, c_utils, nul; \ No newline at end of file diff --git a/modex105/DEMOS/C/X-DEMO.C b/modex105/DEMOS/C/X-DEMO.C deleted file mode 100755 index 2d0621ee..00000000 --- a/modex105/DEMOS/C/X-DEMO.C +++ /dev/null @@ -1,780 +0,0 @@ -/* X-DEMO.C - a Mode "X" Demo */ -/* By Matt Pritchard, 14 Apr, 1993 */ - -#include <stdlib.h> -#include <stdio.h> - -#include "modex.h" -#include "c_utils.h" - -#define MAX_SHAPES 32 -#define MAX_SPRITES 64 - - /* routines in this file */ - -void demo_res (int, int, int); -int get_key (void); -void error_out (char*); -void load_shapes (void); -int int_sqrt (int, int); -void page_demo (void); - - /* Structures for Sprites */ - -struct Shape -{ - unsigned char Image[512]; - int X_Width; - int Y_Width; -} Img [MAX_SHAPES]; - -struct Sprite -{ - int X_pos; - int Y_pos; - int X_Dir; - int Y_Dir; - int Shape; - int Last_X [2]; - int Last_Y [2]; -} Obj [MAX_SPRITES]; - - - /* MAIN */ - - -int main(int argc, char *argv[]) -{ - - /* if (argc > 0) - { - while (argc > 0) - { - dos_print ("Unknown Argument: "); - dos_print (makefp argv[argc]); - argc--; - } - return (0); - - } - */ - - init_random (); - - load_shapes (); - - demo_res ( Mode_320x200, 320, 200 ); - demo_res ( Mode_320x400, 320, 400 ); - - demo_res ( Mode_360x200, 360, 200 ); - demo_res ( Mode_360x400, 360, 400 ); - - demo_res ( Mode_320x240, 320, 240 ); - demo_res ( Mode_320x480, 320, 480 ); - - demo_res ( Mode_360x240, 360, 240 ); - demo_res ( Mode_360x480, 360, 480 ); - - page_demo (); - - set_video_mode (3); - dos_print ("This Mode X Demo is Finished"); - return (0); - -} - - - /* Demonstrate a given resolution */ - - -void demo_res (int Screen_Mode, int X_max, int Y_max) -{ - -char *Error1 = "Failure while calling SET_MODEX"; -char *Error2 = "Failure during READ_PIXEL test"; - -char *Abort_Msg = "Demo aborted by User"; - -char *Demo_Msg = " This is a MODE X demo "; -char *Scrn_Msg = "Screen Resolution is by "; -char *Cont_Msg = "Press <ANY KEY> to Continue"; - -char *Line_Msg = "LINE TEST"; -char *Fill_Msg = "FILL TEST"; -char *Pixel_Msg = "PIXEL TEST"; - -char Text[10]; - -int x1, y1, x2, y2 = 0; -int x, y, z = 0; -int X_Center, gap = 0; - - - if (set_modex (Screen_Mode) == 0) - { - error_out (Error1); - } - - X_Center = X_max / 2; - - x1 = 10; - y1 = 10; - x2 = X_max - 1; - y2 = Y_max - 1; - - for (z = 0; z <= 3; z++) - { - y = 31 - z -z; - draw_line (x1+z, y1+z, x2-z, y1+z, y); - draw_line (x1+z, y1+z, x1+z, y2-z, y); - draw_line (x1+z, y2-z, x2-z, y2-z, y); - draw_line (x2-z, y1+z, x2-z, y2-z, y); - } - - for (x = 0; x < (X_max / 10); x++) - { - tgprintc (48 + ((x+1) % 10), x*10+1, 1, 9 + ((x/8) % 7) ); - draw_line (x*10+9, 0, x*10+9, 3, c_bWHITE); - } - - for (y = 0; y < (Y_max / 10); y++) - { - tgprintc (48 + ((y+1) % 10), 1, y*10+1, 9 + ((y/10) % 7) ); - draw_line (0, y*10+9, 3, y*10+9, c_bWHITE); - } - - for (x = 0; x <= 63; x++) - { - z = 15 + (x * 3 / 4); - set_dac_register (64+x, z, z, z); - set_dac_register (128+x, 0, z, z); - - draw_line (103-x, 60, 40+x, 123, 64+x); - draw_line (40, 60+x, 103, 123-x, 128+x); - - } - - tprint_str (Line_Msg, 9, 37, 130, c_BLUE); - - y = 60; - gap = 0; - for (x = 0; x <= 9; x++) - { - fill_block (120, y, 120+x, y+gap, 64+x); - fill_block (140 - (15-x), y, 150+x, y+gap, 230+x); - fill_block (170 - (15-x), y, 170, y+gap, 128+x); - y = y + gap + 2; - gap++; - } - - tprint_str (Fill_Msg, 9, 110, 46, c_GREEN); - - for (x = 190; x <= 250; x+=2) - { - for (y = 60; y <= 122; y+=2) - { - z = (x+x+y+y) & 0xff; - set_point (x, y, z); - } - } - - tprint_str (Pixel_Msg, 10, 182, 130, c_RED); - - for (x = 190; x <= 250; x+=2) - { - for (y = 60; y <= 122; y+=2) - { - z = (x+x+y+y) & 0xff; - if (read_point(x, y) != z) - { - error_out (Error2); - } - } - } - - print_str (Demo_Msg, 23, X_Center - 92, 20, c_bRED, c_BLUE); - - x = X_Center - 124; - print_str (Scrn_Msg, 28, x, 30, c_bGREEN, c_BLACK); - - sprintf (Text, "%3d", X_max); - print_str (Text, 3, x+168, 30, c_bPURPLE, c_BLACK); - - sprintf (Text, "%3d", Y_max); - print_str (Text, 3, x + 224, 30, c_bWHITE, c_BLACK); - - for (x = 0; x <= 15; x++) - { - set_dac_register (230+x, 63-x*4, 0, 15+x*3); - draw_line (30+x, Y_max-6-x, X_max-20-x, Y_max-6-x, 230+x); - } - - tprint_str (Cont_Msg, 27, X_Center - 103, Y_max-18, c_YELLOW); - - if (get_key () == Ky_ESC) - { - error_out (Abort_Msg); - } - - return ; - -} - - - /* Wait for a Keystroke */ - - -int get_key(void) -{ - -int c = 0; - - while (c == 0) - { - c = scan_keyboard (); - } - - return (c); - -} - - - /* Error Handling Routine */ - - -void error_out (char * text) -{ - - set_video_mode (3); - dos_print (text); - exit (EXIT_SUCCESS); - -} - - - /* Routine to generate random sprites */ - - -void load_shapes () -{ - -unsigned char Grid[33][33]; - -char *Error1 = "Bad Shape Selected Error"; - -int Shape; -int x, y, z; -int Style, Color; -int X_Width, Y_Width, Center, S_Width; -int Hollow_X, Hollow_Y; - - for (Shape = 0; Shape < MAX_SHAPES; Shape++) - { - for (y = 0; y <= 32; y++) - { - for (x = 0; x <= 32; x++) - { - Grid[x][y] = c_BLACK; - } - } - - Style = random_int (6); - Color = 1 + random_int (15); - - switch (Style) - - { - /* SOLID BOXES */ - - case 0: - - { - do - { - X_Width = 3 + random_int(30); - Y_Width = 3 + random_int(30); - - } while ( (X_Width * Y_Width) >= 512); - - for (x = 1; x <= X_Width; x++) - { - for (y = 1; y <= Y_Width; y++) - { - Grid[x][y] = Color; - } - } - - break; - - } - /* HOLLOW BOXES */ - - case 1: - - { - do { - X_Width = 6 + random_int(27); - Y_Width = 6 + random_int(27); - } while ( (X_Width * Y_Width) >= 512); - - for (y = 1; y <= Y_Width; y++) - { - for (x = 1; x <= X_Width; x++) - { - Grid[x][y] = Color; - } - } - - Hollow_X = 1 + random_int ((X_Width / 2) -1); - Hollow_Y = 1 + random_int ((Y_Width / 2) -1); - - for (y = Hollow_Y+1; y <= Y_Width-Hollow_Y; y++) - { - for (x = Hollow_X+1; x <= X_Width-Hollow_X; x++) - { - Grid[x][y] = c_BLACK; - } - } - - break; - - } - - /* SOLID DIAMOND */ - - case 2: - - { - - X_Width = 3 + 2 * random_int(10); - Y_Width = X_Width; - Center = X_Width / 2; - - for (y = 0; y <= Center; y++) - { - for (x = 0; x <= y; x++) - { - Grid [Center-x+1][y+1] = Color; - Grid [Center+x+1][y+1] = Color; - Grid [Center-x+1][Y_Width-y] = Color; - Grid [Center+x+1][Y_Width-y] = Color; - } - } - - break; - - } - - /* HOLLOW DIAMOND */ - - case 3: - - { - - X_Width = 3 + 2 * random_int(10); - Y_Width = X_Width; - Center = X_Width / 2; - S_Width = random_int (Center); - - for (y = 0; y <= Center; y++) - { - for (x = 0; x <= y; x++) - { - if ( x+(Center-y) >= S_Width ) - { - Grid [Center-x+1][y+1] = Color; - Grid [Center+x+1][y+1] = Color; - Grid [Center-x+1][Y_Width-y] = Color; - Grid [Center+x+1][Y_Width-y] = Color; - } - } - } - - break; - - } - - /* BALL */ - - case 4: - - { - - X_Width = 7 + 2 * random_int (8); - Y_Width = X_Width; - Center = 1 + X_Width / 2; - - for (y = 1; y <= Y_Width; y++) - { - for (x = 1; x <= X_Width; x++) - { - z = int_sqrt(Center-x, Center-y); - if (z < Center) - { - Grid[x][y] = 150 + Color * 2 + z * 3; - } - } - } - - break; - } - - /* HOLLOW BALLS */ - - case 5: - - { - X_Width = 7 + 2 * random_int (8); - Y_Width = X_Width; - Center = 1 + X_Width / 2; - S_Width = random_int (X_Width); - - for (y = 1; y <= Y_Width; y++) - { - for (x = 1; x <= X_Width; x++) - { - z = int_sqrt(Center-x, Center-y); - if ( (z < Center) && (z >= S_Width) ) - { - Grid[x][y] = 150 + Color * 2 + z * 3; - } - } - } - - - break; - } - - default: - - { - error_out (Error1); - break; - - } - - } - - z = 0; - for (y = 1; y <= Y_Width; y++) - { - for (x = 1; x <= X_Width; x++) - { - Img[Shape].Image[z] = Grid[x][y]; - z++; - } - } - - Img[Shape].X_Width = X_Width; - Img[Shape].Y_Width = Y_Width; - - } - - return; -} - - - /* Quickie Psuedo Integer Square Root Routine */ - - -int int_sqrt ( int x, int y ) -{ - -int Sqr_Table[12] = {1, 4, 9, 6, 25, 36, 49, 64, 81, 100, 121, 144}; - -int r, d; - - d = (x * x) + (y * y); - r = 0; - - while ( d >= Sqr_Table[r] ) - { - r++; - } - - return (r); - -} - - - /* The Bit Sprite Demo */ - - -void page_demo () -{ - -char *Error1 = "Failure during SET_VGA_MODEX (0, 360, 240, 3) call"; - -int Last_Objects[2], Visible_Objects; - -int Screen_X = 384; -int Screen_Y = 672; - -int x, y, z; -int c, dc; -int x1, y1, x2, y2; - -int Sprite_X, Sprite_Y; -int Current_Page; -int New_X, New_Y; - -int View_X, View_Y, View_Max, View_Cnt, View_XD, View_YD; -int Set_Color, Prev_Color, S_Dir, P_Dir; - -int Demo_Running = True; -int redo, code; - - if (set_vga_modex(Mode_320x200, Screen_X, Screen_Y, 3) == 0) - { - error_out (Error1); - } - - set_active_page (0); - clear_vga_screen (c_BLACK); - - print_str ("This is a Test of the Following Functions:", 99, 10, 9, c_bWHITE, c_BLACK); - - draw_line (10, 18, 350, 18, c_YELLOW); - print_str ("SET_ACTIVE_PAGE", 99, 10, 20, c_bBLUE, c_BLACK); - print_str ("SET_DISPLAY_PAGE", 99, 10, 30, c_GREEN, c_BLACK); - print_str ("SET_DAC_REGISTER", 99, 10, 40, c_RED, c_BLACK); - print_str ("CLEAR_VGA_SCREEN", 99, 10, 50, c_CYAN, c_BLACK); - - print_str ("TDRAW_BITMAP", 99, 10, 60, c_PURPLE, c_BLACK); - print_str ("COPY_PAGE", 99, 10, 70, c_GREEN, c_BLACK); - print_str ("COPY_BITMAP", 99, 10, 80, c_CYAN, c_BLACK); - - print_str ("GPRINTC", 99, 10, 90, c_BLUE, c_BLACK); - print_str ("TGPRINTC", 99, 10, 100, c_GREEN, c_BLACK); - print_str ("SET_WINDOW", 99, 10, 110, c_RED, c_BLACK); - - print_str ("VIRTUAL SCREEN SIZES", 20, 190, 20, c_bBLUE, c_BLACK); - print_str (" SMOOTH SCROLLING", 20, 190, 30, c_GREEN, c_BLACK); - print_str (" SPRITE ANIMATION", 20, 190, 40, c_CYAN, c_BLACK); - print_str (" PAGE FLIPPING", 20, 190, 50, c_RED, c_BLACK); - print_str (" COLOR CYCLING", 20, 190, 60, c_PURPLE, c_BLACK); - - for (x = 0; x <=60; x++) - { - set_dac_register (50 + x, 3 + x, 0, 60 - x); - set_dac_register (150 + x, 3 + x, 0, 60 - x); - } - - c = 0; - dc = 1; - for (x = 0; x <= (Screen_X / 2); x++) - { - draw_line (Screen_X / 2 - 1, Screen_Y / 4, x, Screen_Y - 1, c + 50); - draw_line (Screen_X / 2, Screen_Y / 4, Screen_X - x - 1, Screen_Y - 1, c + 50); - c+= dc; - if ((c == 0) || (c == 60) ) { dc = -dc;} - } - - tprint_str ("Press <ANY KEY> to Continue", 99, 72, 190, c_bWHITE); - tprint_str ("< > = Faster < > = Slower", 99, 72, 204, c_bGREEN); - tprint_str ("< > = Fewer Shapes < > = More Shapes", 99, 32, 218, c_bCYAN); - - tgprintc (43, 80, 204, c_YELLOW); - tgprintc (45, 200, 204, c_YELLOW); - - tgprintc (25, 40, 218, c_YELLOW); - tgprintc (24, 200, 218, c_YELLOW); - - copy_page (0, 1); - copy_page (0, 2); - - for (x = 0; x < MAX_SPRITES; x++) - { - do { - Obj[x].X_Dir = random_int(7) - 3; - Obj[x].Y_Dir = random_int(7) - 3; - } while ( (Obj[x].X_Dir == 0) && (Obj[x].Y_Dir == 0) ); - - Obj[x].Shape = x % MAX_SHAPES; - - Sprite_X = Img[Obj[x].Shape].X_Width; - Sprite_Y = Img[Obj[x].Shape].Y_Width; - - Obj[x].X_pos = 1 + random_int(Screen_X - Sprite_X - 2); - Obj[x].Y_pos = 1 + random_int(Screen_Y - Sprite_Y - 2); - - Obj[x].Last_X[0] = Obj[x].X_pos; - Obj[x].Last_X[1] = Obj[x].X_pos; - Obj[x].Last_Y[0] = Obj[x].Y_pos; - Obj[x].Last_Y[1] = Obj[x].Y_pos; - - } - - Current_Page = 0; - - View_X = 0; - View_Y = 0; - View_Max = 3; - View_Cnt = 0; - View_XD = 1; - View_YD = 1; - - Set_Color = 3; - S_Dir = 1; - Prev_Color = 0; - P_Dir = 1; - - Visible_Objects = MAX_SPRITES / 2; - Last_Objects[0] = 0; - Last_Objects[1] = 0; - - while (Demo_Running) - { - - set_active_page (Current_Page); - - /* Erase Old Images */ - - for (x = 0; x <= Last_Objects[Current_Page]; x++) - { - z = 2; - y = Obj[x].Shape; - x1 = Obj[x].Last_X[Current_Page]; - y1 = Obj[x].Last_Y[Current_Page]; - x2 = x1 + Img[y].X_Width -1; - y2 = y1 + Img[y].Y_Width -1; - - x1 = x1 & 0xfffc; - x2 = x2 | 0x0003; - - copy_bitmap (z, x1, y1, x2, y2, Current_Page, x1, y1); - } - - /* Draw new images */ - - for (x = 0; x <= Visible_Objects; x++) - { - Sprite_X = Img[Obj[x].Shape].X_Width; - Sprite_Y = Img[Obj[x].Shape].Y_Width; - - /* Move Sprite */ - - do - { - redo = False; - New_X = Obj[x].X_pos + Obj[x].X_Dir; - - if (( New_X < 0 ) || (New_X + Sprite_X > Screen_X) ) - { - Obj[x].X_Dir = -Obj[x].X_Dir; - if (random_int(20) == 1) - { - do - { - Obj[x].X_Dir = random_int(7) - 3; - Obj[x].Y_Dir = random_int(7) - 3; - } while ( (Obj[x].X_Dir == 0) && (Obj[x].Y_Dir == 0) ); - redo = True; - } - } - } while (redo); - Obj[x].X_pos = Obj[x].X_pos + Obj[x].X_Dir; - - - do - { - redo = False; - New_Y = Obj[x].Y_pos + Obj[x].Y_Dir; - - if ( (New_Y < 0) || (New_Y + Sprite_Y > Screen_Y) ) - { - Obj[x].Y_Dir = -Obj[x].Y_Dir; - if (random_int(20) == 1) - { - do - { - Obj[x].X_Dir = random_int(7) - 3; - Obj[x].Y_Dir = random_int(7) - 3; - } while ( (Obj[x].X_Dir == 0) && (Obj[x].Y_Dir == 0) ); - redo = True; - } - } - } while (redo); - - Obj[x].Y_pos = Obj[x].Y_pos + Obj[x].Y_Dir; - - /* Draw Sprite */ - - tdraw_bitmap ((char far*) &Img[Obj[x].Shape], Obj[x].X_pos, Obj[x].Y_pos, Sprite_X, Sprite_Y); - - Obj[x].Last_X[Current_Page] = Obj[x].X_pos; - Obj[x].Last_Y[Current_Page] = Obj[x].Y_pos; - - } - - Last_Objects[Current_Page] = Visible_Objects; - - - /* Pan Screen Back & Forth */ - - View_Cnt++; - if (View_Cnt >= View_Max) - { - View_X+= View_XD; - if ( (View_X == 0) || (View_X == 39) ) {View_XD = -View_XD;} - if (View_XD < 0) - { - View_Y+= View_YD; - if ( (View_Y == 0) || (View_Y == 39) ) {View_YD = -View_YD;} - } - - set_window (Current_Page, View_X, View_Y); - - View_Cnt = 0; - } - else - { - set_display_page (Current_Page); - } - - /* Cycle Colors */ - - set_dac_register (50 + Prev_Color, 3 + Prev_Color, 0, 60 - Prev_Color); - set_dac_register (50 + Set_Color, Set_Color, 10, 63 - Set_Color); - - set_dac_register (150 + Prev_Color, 3 + Prev_Color, 0, 60 - Prev_Color); - set_dac_register (150 + Set_Color, 63, 63, Set_Color); - - Set_Color+= S_Dir; - if ( (Set_Color == 60) || (Set_Color == 0) ) {S_Dir = -S_Dir;} - - Prev_Color+= P_Dir; - if ( (Prev_Color == 60) || (Prev_Color == 0) ) {P_Dir = -P_Dir;} - - /* Check for Keystroke */ - - Current_Page = Current_Page ^ 0x01; - - code = scan_keyboard (); - - if (code == Ky_ESC) {Demo_Running = False;} - - if (code == Ky_Plus) - { - if (View_Max < 12) {View_Max++;} - } - - if (code == Ky_Minus) - { - if (View_Max > 1) {View_Max--;} - if (View_Cnt >= View_Max) {View_Cnt = 0;} - } - - if (code == Ky_Up) - { - if (Visible_Objects < MAX_SPRITES-1) {Visible_Objects++;} - } - - if (code == Ky_Down) - { - if (Visible_Objects > 0) {Visible_Objects--;} - } - - } - -} diff --git a/modex105/DEMOS/C/X-DEMO.EXE b/modex105/DEMOS/C/X-DEMO.EXE deleted file mode 100755 index 7742d145c591d471d2e9b79e0fe99083a3d669f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41090 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 JvY09JKLIz`z5M_H diff --git a/modex105/DEMOS/C/X-DEMO.PRJ b/modex105/DEMOS/C/X-DEMO.PRJ deleted file mode 100755 index 7bc4a069233a535f9a2bbb6b21436c8e018409e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5188 zcmeI0*;89}6vxjm1PDtlt<^%>!cUD#+aW-ZrMO%|5-?6SlVBN3MV5fnLNGwx0b7@j zOQ+RGU)-%bT6KJIdGW=zRL7;I_0fO8U9`2=^SuFVm3SeEWybNB$tUNWdzN3$-GAYc zSZ7o^WFQvZ7U>$6O?}%V(oAC6%GH8@vTYPJeL@BjbdX7ONRtn1oYX8wG`^pQtsiLo zP~%5TL7!`$UugW2nL$UH4RnlYpeg<eI?kkw6Ci!ZI(-lP0Q|@hKSBDLj6~x^zd)G= zeg%F*l$<a!4c}@Rj^?rX7%-*H<2b|<EEdq$Oe38{+}q0;r&u!l4)rvk0wlO14-y#+ zG6I=E7Hrv!A`_!Khaqzrln3Mk%YgG3VmYJ&U<L3LS2H|~lFtCo0?z@@11|tC0{ejp z;7#By-~jLv@G>Lg6-ciFuK}+EZvgKA?*c1P@_b+wLtFq{2z9lH_plI3kwCxA5Z3@} z8DbrzVn#*@R0;KB;1a+BTnb#q!RpxMEN#@%+-hKP3qx!LZUQ=iE}$ET06jo2a0`R_ zfdL>2+ij4BAdNuU0qJ%~cR;!mxC^)&xQ9V|fP0~i0%O29a38P}*u|jxAw2**2=yUg zH`IrLM}WtGy}&-;ao`ESSir~xvVd&B1e6IUcQEx~731WrZ)@}iJ$9ed(dPC!JS|RF z>WLSTq5Lm%@VFZn5uF~_3O+omY($kJlWf(T)5bz&MFmln7)wuy<g;8MifO|?hF9x) z)aZKD>Uz}adTi45sMqzlQrF`uU5~4EJ+9I9P;@;S_`qH2VPE>g(<w}R?$p-QaxYvg z*Hv!fGl{5a>8Ix4v)Jkg1gKfNRj4YT&y>aY+Ee@Xm~-hX6OA?pU4aGc#NJqBZ~<-$ zb}1X!C@o%>x3tn$w_aL&{?KN7Kw1Jpzc&z;76&WdP;)6}XJcXgj%Z)E++gjJ3$Ac( z91p2tG^{<y*@uQA{hiw*u|$Q#_K-Kxwq)$(-d0(Dqg$5yr6t|DlbKJlF^5%(cW~4h z=^W|pP252m?oPJI{BagntIKEip4<EV{8LHEIyu)uewpau_lSfCAq@|*M@q%c4*svS z@Q5mcqmiNLNUSR&9nt>5#9a(J&Tc`fnkC%{Q=L$f@t^Xw(A_^6jSWjrUuUc%*4HtR zAeGx2Nb6&+CEW=V%=_Oqf2QId{r^a*1JyLa@0jty{nQ3DM|(@y?Fm`^jn|Ra?{u}c zooSf~Sj0~*<&X($BQxX7T3UXslA|qN>rcz9|6+bK`LQjVmvDHkg--Iro4ShV<7U>_ z)LQ0rdHq%g@e6Fc)|_QACFXpwRAj`0&bTC3YXR)CM3z{s#GLs|DqED(^;?z6BtB9J zC^03fY*Qjimolu>D^jVUT#?U(%)B!64KH;apeJc3jZhD%s+sNiJg4{ge;cWx=wM-{ z#w?B58ciB=$kXvCKiHP;<qoM+`8ThqyIxiIZ=SjV`(`?@yK1^v#m3nke=Vtqi0>O# zklbpWT?S}t_cggaF6-Yngu+g@e;#|guf^k;&+c?Jh32ty9=;A@1OD9HZmXq>C=YF? X5-O&3w3gOTAr*0V3fVd{aHaSIrzdwi diff --git a/modex105/DEMOS/C/x.exe b/modex105/DEMOS/C/x.exe deleted file mode 100755 index 7742d145c591d471d2e9b79e0fe99083a3d669f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41090 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 JvY09JKLIz`z5M_H diff --git a/modex105/DEMOS/CHARDEMO.EXE b/modex105/DEMOS/CHARDEMO.EXE deleted file mode 100755 index 4015bdf14e1d4067c4c2d9321f00accdf71fe452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13066 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 RBhN(+NB$^IcBSvV{T~&EV%Y!y diff --git a/modex105/DEMOS/PASCAL/TEST5.PAS b/modex105/DEMOS/PASCAL/TEST5.PAS deleted file mode 100755 index 7cc56bbb..00000000 --- a/modex105/DEMOS/PASCAL/TEST5.PAS +++ /dev/null @@ -1,488 +0,0 @@ -{ ModeX Turbo Pascal Demo Program } -{ Converted to Turbo Pascal by Scott Wyatt } -{ Original program written in QuickBasic by Matt Prichard } -{ Released to the Public Domain } -{ } -{ Thanks to Matt Prichard for his *EXCELLENT* ModeX Library } -{ Additional Comments by Matt Pritchard } - -Uses Crt; - -{$L modex2.obj} { This file is the external ModeX Library .OBJ } -{$F+} - - { Mode Setting Routines } - -Function SET_VGA_MODEX (Mode,MaxXpos,MaxYpos,Pages : integer) : integer; external; -Function SET_MODEX (Mode:integer) : Integer; external; - - { Graphics Primitives } - -Procedure CLEAR_VGA_SCREEN (Color:integer); external; -Procedure SET_POINT (Xpos,Ypos,Color : integer); external; -Function READ_POINT (Xpos,Ypos:integer) : integer; external; -Procedure FILL_BLOCK (Xpos1,Ypos1,Xpos2,Ypos2,Color:integer); external; -Procedure DRAW_LINE (Xpos1,Ypos1,Xpos2,Ypos2,Color:integer); external; - - { VGA DAC Routines } - -Procedure SET_DAC_REGISTER (RegNo,Red,Green,Blue:integer); external; -Procedure GET_DAC_REGISTER (RegNo,Red,Green,Blue:integer); external; - - { Page and Window Control Routines } - -Procedure SET_ACTIVE_PAGE (PageNo:integer); external; -Function GET_ACTIVE_PAGE : integer; external; -Procedure SET_DISPLAY_PAGE (PageNo:integer); external; -Function GET_DISPLAY_PAGE : integer; external; -Procedure SET_WINDOW (DisplayPage,XOffset,YOffset : integer); external; -Function GET_X_OFFSET : integer; external; -Function GET_Y_OFFSET : integer; external; -Procedure SYNC_DISPLAY; external; - - { Text Display Routines } - -Procedure GPRINTC (CharNum,Xpos,Ypos,ColorF,ColorB:integer); external; -Procedure TGPRINTC ( CharNum,Xpos,Ypos,ColorF : integer); external; -Procedure PRINT_STR (Var Text;MaxLen,Xpos,Ypos,ColorF,ColorB:integer); external; -Procedure TPRINT_STR (Var Text;MaxLen,Xpos,Ypos,ColorF:integer); external; -Procedure SET_DISPLAY_FONT (Var FontData;FontNumber:integer); external; - - { Sprite and VGA memory -> Vga memory Copy Routines } - -Procedure DRAW_BITMAP (Var Image;Xpos,Ypos,Width,Height:integer); external; -Procedure TDRAW_BITMAP (Var Image;Xpos,Ypos,Width,Height:integer); external; -Procedure COPY_PAGE (SourcePage,DestPage:integer); external; -Procedure COPY_BITMAP (SourcePage,X1,Y1,X2,Y2,DestPage,DestX1,DestY1:integer); external; - -{$F-} - - -TYPE Sprite = Record - Xpos : INTEGER; - Ypos : INTEGER; - XDir : INTEGER; - YDir : INTEGER; - Shape : INTEGER; - LastX : INTEGER; - LastY : INTEGER; - END; - - -CONST MaxShapes = 32; - Circle_16 : Array[1..16,1..16] of byte = - (( 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0), - ( 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0), - ( 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0), - ( 0, 0, 20, 20, 20, 20, 0, 0, 0, 0, 20, 20, 20, 20, 0, 0), - ( 0, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 0), - ( 0, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 0), - ( 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20), - ( 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20), - ( 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20), - ( 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20), - ( 0, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 0), - ( 0, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 0), - ( 0, 0, 20, 20, 20, 20, 0, 0, 0, 0, 20, 20, 20, 20, 0, 0), - ( 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0), - ( 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0), - ( 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0)); - Square_16 : Array[1..16,1..16] of byte = - (( 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21), - ( 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21), - ( 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21), - ( 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21), - ( 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21), - ( 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21), - ( 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21), - ( 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21), - ( 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21), - ( 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21), - ( 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21), - ( 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21), - ( 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21), - ( 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21), - ( 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21), - ( 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21)); - Diamond : Array[1..8,1..8] of byte = - (( 0, 0, 0, 22, 22, 0, 0, 0), - ( 0, 0, 22, 22, 22, 22, 0, 0), - ( 0, 22, 22, 0, 0, 22, 22, 0), - ( 22, 22, 0, 0, 0, 0, 22, 22), - ( 22, 22, 0, 0, 0, 0, 22, 22), - ( 0, 22, 22, 0, 0, 22, 22, 0), - ( 0, 0, 22, 22, 22, 22, 0, 0), - ( 0, 0, 0, 22, 22, 0, 0, 0)); - Rectangle : Array[1..8,1..3] of byte = - (( 23, 23, 23), - ( 23, 23, 23), - ( 23, 23, 23), - ( 23, 23, 23), - ( 23, 23, 23), - ( 23, 23, 23), - ( 23, 23, 23), - ( 23, 23, 23)); - - { Global Variables ? } - -Var - XCenter,X1,Y1,X2,Y2,Z,Colr,XChars,YChars,X,Y,N,Gap : Integer; - s : string; - s1 : Array[1..35] of Char; - ch : Char; - obj : Array[1..64] of Sprite; - ScreenX,ScreenY : Integer; - c, dc, SpriteX, SpriteY, CurrentPage, LastPage : Integer; - SetColor, SDir, PrevColor, PDir : Byte; - XView, YView : Integer; - XView_Change, YView_Change : Integer; - Right : Boolean; - Number_Of_Shapes : Byte; - - - { Error Handler - Returns to Text Mode & Displays Error } - -Procedure ERROR_OUT(s : string); - Begin - asm - mov ah,0 - mov al,3 - int 10h - end; - WriteLn(s); - Halt(0); -END; - - { Routine to Print a PASCAL string using Print_Str } - -Procedure Print_Text(s : string; X,Y,BColor,FColor : integer); -Var - s1 : Array[1..135] of Char; - i : byte; -Begin - For i := 1 to Length(s) DO - s1[i] := s[i]; - Print_Str(s1,Length(s),X,Y,BColor,FColor); -End; - - { Routine to Transparently Print a PASCAL string using TPrint_Str } - -Procedure TPrint_Text(s : string; X,Y,Color : integer); -Var - s1 : Array[1..135] of Char; - i : byte; -Begin - For i := 1 to Length(s) DO - s1[i] := s[i]; - TPrint_Str(s1,Length(s),X,Y,Color); -End; - - { Routines to show test patterns for a given mode } - -Procedure Demo_Res(Mode, Xmax, Ymax : integer); -Begin - - Str(mode,s); - If Set_ModeX(Mode) = 0 Then - Error_Out('Unable to SET_MODEX '+s); - Clear_VGA_Screen(0); - - XCenter := Xmax div 2; - X1 := 10; - Y1 := 10; - X2 := Xmax - 1; - Y2 := Ymax - 1; - - FOR Z := 0 TO 3 DO - Begin - Colr := 31 - Z * 2; - Draw_Line(X1 + Z, Y1 + Z, X2 - Z, Y1 + Z, Colr); - Draw_Line(X1 + Z, Y1 + Z, X1 + Z, Y2 - Z, Colr); - Draw_Line(X1 + Z, Y2 - Z, X2 - Z, Y2 - Z, Colr); - Draw_Line(X2 - Z, Y1 + Z, X2 - Z, Y2 - Z, Colr); - End; - - XChars := Xmax div 10; - YChars := Ymax div 10; - - FOR X := 0 TO XChars - 1 DO - Begin - TGPRINTC(48 + ((X + 1) MOD 10), X * 10 + 1, 1, 9 + ((X div 8) MOD 7)); - DRAW_LINE(X * 10 + 9, 0, X * 10 + 9, 3, 15); - End; - FOR Y := 0 TO YChars - 1 DO - Begin - TGPRINTC(48 + ((Y + 1) MOD 10), 1, Y * 10 + 1, 9 + ((Y div 10) MOD 7)); - DRAW_LINE(0, Y * 10 + 9, 3, Y * 10 + 9, 15); - End; - - { Test Line Drawing } - - FOR X := 0 TO 63 DO - Begin - N := 15 + ((X * 3) div 4); - SET_DAC_REGISTER(64 + X, N, N, N); - SET_DAC_REGISTER(128 + X, 0, N, N); - DRAW_LINE(103 - X, 60, 40 + X, 123, 64 + X); - DRAW_LINE(40, 60 + X, 103, 123 - X, 128 + X); - End; - s := 'Line Test'; - PRINT_Text(s,37,130,1,0); - - { Test Block Fills } - - Y := 60; - Gap := 0; - FOR X := 0 TO 9 DO - Begin - FILL_BLOCK(120, Y, 120 + X, Y + Gap, 64 + X); - FILL_BLOCK(140 - (15 - X), Y, 150 + X, Y + Gap, 230 + X); - FILL_BLOCK(170 - (15 - X), Y, 170, Y + Gap, 128 + X); - Y := Y + Gap + 2; - Gap := Gap + 1; - End; - s := 'Fill Test'; - Print_Text(s,110, 46, 2,0); - - { Test Pixel Write and Read } - - FOR X := 190 TO 250 DO - FOR Y := 60 TO 122 DO - SET_POINT( X, Y, X + Y + X + Y); - - s := 'Pixel Test'; - Print_Text(s,182, 130, 3,0); - - FOR X := 190 TO 250 DO - FOR Y := 60 TO 122 DO - IF READ_POINT(X, Y) <> ((X + Y + X + Y) AND 255) THEN - WriteLn('READ_PIXEL Failure'); - - { Display rest of screen } - - s := ' This is a MODE X demo '; - Print_Text(s,XCenter - (Length(s) * 4), 20, 3, 1); - s := 'Screen Resolution is by '; - X := XCenter - (Length(s) * 4); - Print_Text(s,X,30,4,0); - Str(XMax,s); - Print_Text(s, X + 8 * 21, 30, 8, 0); - Str(YMax,s); - Print_Text(s, X + 8 * 28, 30, 15, 0); - - FOR X := 0 TO 15 DO - Begin - SET_DAC_REGISTER( 230 + X, 63 - X * 4, 0, 15 + X * 3); - DRAW_LINE(30 + X, Ymax - 6 - X, Xmax - 20 - X, Ymax - 6 - X, 230 + X); - End; - s := 'Press <ANY KEY> to Continue'; - For x := 1 to length(s) DO - s1[x] := s[x]; - TPrint_Str(s1, length(s), XCenter - (26 * 4), Ymax - 18, 5); - - Ch := ReadKey; - IF Ch = #27 Then - Error_Out('Abort'); - -End; - - - { Initialize Sprites for Sprite Demo } - -Procedure Init_Sprites; -Var i : byte; -Begin - For i := 1 to 64 DO - Begin - Obj[i].XPos := Random(300)+10; - Obj[i].YPos := Random(200)+20; - Obj[i].XDir := Random(10)-5; - Obj[i].YDir := Random(10)-5; - If (Obj[i].XDir = 0) AND (Obj[i].YDir = 0) Then - Begin - Obj[i].XDir := Random(5) + 1; - Obj[i].YDir := Random(5) + 1; - End; - Obj[i].Shape := Random(4)+1; - Obj[i].LastX := obj[i].XPos; - Obj[i].LastY := obj[i].YPos; - End; -End; - -Procedure Set_Sprites(number : byte); -Var i : Byte; -Begin - For i := 1 to number DO - Begin - obj[i].LastX := obj[i].XPos; - obj[i].LastY := obj[i].YPos; - obj[i].XPos := obj[i].XPos + obj[i].XDir; - obj[i].YPos := obj[i].YPos + obj[i].YDir; - If (obj[i].XPos > 335) OR (obj[i].XPos < 5 ) Then - obj[i].XDir := -(obj[i].XDir); - If (obj[i].YPos > 220) OR (obj[i].YPos < 5) Then - obj[i].YDir := -(obj[i].YDir); - End; - For i := 1 to number DO - Case obj[i].Shape of - 1 : TDraw_Bitmap(Circle_16,obj[i].XPos,obj[i].YPos,16,16); - 2 : TDraw_Bitmap(Square_16,obj[i].XPos,obj[i].YPos,16,16); - 3 : TDraw_Bitmap(Diamond,obj[i].XPos,obj[i].YPos,8,8); - 4 : TDraw_Bitmap(Rectangle,obj[i].XPos,obj[i].YPos,3,8); - End; -End; - -Procedure Remove_Sprites(p,number : byte); -Var i : byte; -Begin - For i := 1 to number DO - Copy_Bitmap(2,obj[i].LastX,obj[i].LastY,obj[i].LastX+16,obj[i].LastY+16,p,Obj[i].LastX,Obj[i].LastY); -End; - -Procedure Page_Demo; -Begin - Number_Of_Shapes := 64; - XView_Change := 1; - YView_Change := 1; - XView := 1; - YView := 1; - Right := TRUE; - ScreenX := 360; - ScreenY := 240; - PrevColor := 0; - SetColor := 3; - SDir := 1; - PDir := 1; - Str(0,s); - - IF SET_VGA_MODEX(0, ScreenX, ScreenY, 3) = 0 THEN - ERROR_OUT('Unable to SET_VGA_MODEX' + S); - - SET_ACTIVE_PAGE(0); - CLEAR_VGA_SCREEN(0); - PRINT_TEXT('This is a Test of the Following Functions:', 10, 9, 15, 0); - DRAW_LINE( 10, 18, 350, 18, 4); - Print_Text('SET_ACTIVE_PAGE', 10, 20, 1, 0); - Print_Text('SET_DISPLAY_PAGE', 10, 30, 3,0); - Print_Text('SET_DAC_REGISTER', 10, 40, 3, 0); - Print_Text('CLEAR_VGA_SCREEN', 10, 50, 13, 0); - Print_Text('TDRAW_BITMAP', 10, 60, 14, 0); - Print_Text('COPY_PAGE', 10, 70, 3, 0); - Print_Text('COPY_BITMAP', 10, 80, 13, 0); - Print_Text('GPRINTC', 10, 90, 1, 0); - Print_Text('TGPRINTC', 10, 100, 3, 0); - Print_Text('SYNC_DISPLAY', 10, 110, 3, 0); - Print_Text('SET_WINDOW', 10, 120, 14, 0); - Print_Text('VIRTUAL SCREEN SIZES', 190, 20, 1, 0); - Print_Text(' SMOOTH SCROLLING', 190, 30, 3, 0); - Print_Text(' SPRITE ANIMATION', 190, 40, 13, 0); - Print_Text(' PAGE FLIPPING', 190, 50, 3, 0); - Print_Text(' COLOR CYCLING', 190, 60, 14, 0); - - FOR X := 0 TO 60 DO - Begin - SET_DAC_REGISTER( 50 + X, 3 + X, 0, 60 - X); - SET_DAC_REGISTER( 150 + X, 3 + X, 0, 60 - X); - End; - - c := 0; - DC := 1; - FOR X := 0 TO ScreenX div 2 DO - Begin - DRAW_LINE( ScreenX div 2 - 1, ScreenY div 4, X, ScreenY - 1, c + 50); - DRAW_LINE( ScreenX div 2, ScreenY div 4, ScreenX - X - 1, ScreenY - 1, c + 50); - c := c + DC; - IF (c = 0) OR (c = 60) THEN DC := -DC; - End; - - TPrint_Text('Press <ESC> to Continue', 82, 190, 15); - TPrint_Text('<+> = Fewer Shapes <-> = More Shapes', 32, 204, 12); - COPY_PAGE( 0, 1); - COPY_PAGE( 0, 2); - - Ch := #0; - CurrentPage := 1; - LastPage := 0; - Set_Sprites(Number_Of_Shapes); - For c := 1 to 4 DO - Set_Dac_Register(19+c,63-(c*10),0,0); - - While Ch <> #27 DO - Begin - Set_Active_Page(currentpage); - Set_Sprites(Number_Of_Shapes); - If Right Then - Begin - XView := XView + XView_Change; - If (XView > 38) OR (XView < 2) Then - Begin - XView_Change := -(XView_Change); - Right := FALSE; - End; - End - Else - Begin - YView := YView + YView_Change; - If (YView > 38) OR (YView < 2) Then - Begin - YView_Change := -(YView_Change); - Right := TRUE; - End; - End; - - Set_Window(currentpage,XView,YView); - Set_Display_Page(currentpage); - Set_Dac_Register(50 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor); - Set_Dac_Register(50 + SetColor, SetColor, 10, 63 - SetColor); - Set_Dac_Register(150 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor); - Set_Dac_Register(150 + SetColor, 63, 63, SetColor); - SetColor := SetColor + SDir; - IF (SetColor = 60) OR (SetColor = 0) THEN SDir := -SDir; - PrevColor := PrevColor + PDir; - IF (PrevColor = 60) OR (PrevColor = 0) THEN PDir := -PDir; - Remove_Sprites(lastpage,Number_Of_Shapes); - - If Keypressed Then - Begin - Ch := ReadKey; - Case Ch of - '-' : If Number_Of_Shapes > 1 Then - Begin - c := Number_Of_Shapes; - Copy_Bitmap(2,obj[c].XPos,obj[c].YPos,obj[c].XPos+16,obj[c].YPos+16, - currentpage,obj[c].XPos,obj[c].YPos); - Dec(Number_Of_Shapes); - End; - '+' : If Number_Of_Shapes < 64 Then Inc(Number_Of_Shapes); - End; - End; - lastpage := (lastpage+1) MOD 2; - currentpage := (currentpage+1) MOD 2; - End; -END; - - { MAIN ROUTINE - Run Through Demos and Exit } - -Begin - - Randomize; - Init_Sprites; - - Demo_Res(0, 320, 200); - Demo_Res(1, 320, 400); - Demo_Res(2, 360, 200); - Demo_Res(3, 360, 400); - Demo_Res(4, 320, 240); - Demo_Res(5, 320, 480); - Demo_Res(6, 360, 240); - Demo_Res(7, 360, 480); - Page_Demo; - - asm - mov ah,0 - mov al,3 - int 10h - end; - WriteLn('THIS MODE X DEMO IS FINISHED'); - -END. \ No newline at end of file diff --git a/modex105/DEMOS/QB45/MAKE-LIB.BAT b/modex105/DEMOS/QB45/MAKE-LIB.BAT deleted file mode 100755 index b04876ad..00000000 --- a/modex105/DEMOS/QB45/MAKE-LIB.BAT +++ /dev/null @@ -1,5 +0,0 @@ -ECHO ... Building MODEX.QLB for QUICKBASIC 4.5 -LIB MODEX -+MODEX,, -LIB MODEX -+UTILS,, -DEL MODEX.BAK -LINK /Q MODEX+UTILS, MODEX.QLB, NUL, C:\QB45\BQLB45.LIB; diff --git a/modex105/DEMOS/QB45/MODEX.BI b/modex105/DEMOS/QB45/MODEX.BI deleted file mode 100755 index 6b1d7afe..00000000 --- a/modex105/DEMOS/QB45/MODEX.BI +++ /dev/null @@ -1,63 +0,0 @@ - - ' ===== SCREEN RESOLUTIONS ===== - -CONST Mode320x200 = 0, Mode320x400 = 1 -CONST Mode360x200 = 2, Mode360x400 = 3 -CONST Mode320x240 = 4, Mode320x480 = 5 -CONST Mode360x240 = 6, Mode360x480 = 7 - - ' ===== MODE X SETUP ROUTINES ===== - -DECLARE FUNCTION SET.VGA.MODEX% ALIAS "SET_VGA_MODEX" (BYVAL ModeType%, BYVAL MaxXpos%, BYVAL MaxYpos%, BYVAL Pages%) -DECLARE FUNCTION SET.MODEX% ALIAS "SET_MODEX" (BYVAL Mode%) - - ' ===== BASIC GRAPHICS PRIMITIVES ===== - -DECLARE SUB CLEAR.VGA.SCREEN ALIAS "CLEAR_VGA_SCREEN" (BYVAL ColorNum%) -DECLARE SUB SET.POINT ALIAS "SET_POINT" (BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorNum%) -DECLARE FUNCTION READ.POINT% ALIAS "READ_POINT" (BYVAL Xpos%, BYVAL Ypos%) -DECLARE SUB FILL.BLOCK ALIAS "FILL_BLOCK" (BYVAL Xpos1%, BYVAL Ypos1%, BYVAL Xpos2%, BYVAL Ypos2%, BYVAL ColorNum%) -DECLARE SUB DRAW.LINE ALIAS "DRAW_LINE" (BYVAL Xpos1%, BYVAL Ypos1%, BYVAL Xpos2%, BYVAL Ypos2%, BYVAL ColorNum%) - - ' ===== DAC COLOR REGISTER ROUTINES ===== - -DECLARE SUB SET.DAC.REGISTER ALIAS "SET_DAC_REGISTER" (BYVAL RegNo%, BYVAL Red%, BYVAL Green%, BYVAL Blue%) -DECLARE SUB GET.DAC.REGISTER ALIAS "GET_DAC_REGISTER" (BYVAL RegNo%, Red%, Green%, Blue%) -DECLARE SUB LOAD.DAC.REGISTERS ALIAS "LOAD_DAC_REGISTERS" (SEG PalData AS ANY, BYVAL StartReg%, BYVAL EndReg%, BYVAL VSync%) -DECLARE SUB READ.DAC.REGISTERS ALIAS "READ_DAC_REGISTERS" (SEG PalData AS ANY, BYVAL StartReg%, BYVAL EndReg%) - - - ' ===== PAGE FLIPPING AND SCROLLING ROUTINES ===== - -DECLARE SUB SET.ACTIVE.PAGE ALIAS "SET_ACTIVE_PAGE" (BYVAL PageNo%) -DECLARE FUNCTION GET.ACTIVE.PAGE% ALIAS "GET_ACTIVE_PAGE" -DECLARE SUB SET.DISPLAY.PAGE ALIAS "SET_DISPLAY_PAGE" (BYVAL PageNo%) -DECLARE FUNCTION GET.DISPLAY.PAGE% ALIAS "GET_DISPLAY_PAGE" -DECLARE SUB SET.WINDOW ALIAS "SET_WINDOW" (BYVAL DisplayPage%, BYVAL XOffset%, BYVAL YOffset%) -DECLARE FUNCTION GET.X.OFFSET% ALIAS "GET_X_OFFSET" () -DECLARE FUNCTION GET.Y.OFFSET% ALIAS "GET_Y_OFFSET" () -DECLARE SUB SYNC.DISPLAY ALIAS "SYNC_DISPLAY" - - ' ===== TEXT DISPLAY ROUTINES ===== - -DECLARE SUB GPRINTC (BYVAL CharacterNum%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%, BYVAL ColorB%) -DECLARE SUB TGPRINTC (BYVAL CharacterNum%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%) -DECLARE SUB PRINT.STR ALIAS "PRINT_STR" (BYVAL StrSeg%, BYVAL StrOfs%, BYVAL MaxLen%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%, BYVAL ColorB%) -DECLARE SUB TPRINT.STR ALIAS "TPRINT_STR" (BYVAL StrSeg%, BYVAL StrOfs%, BYVAL MaxLen%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%) -DECLARE SUB SET.DISPLAY.FONT ALIAS "SET_DISPLAY_FONT" (SEG FontData AS ANY, BYVAL FontNumber%) - - ' ===== BITMAP (SPRITE) DISPLAY ROUTINES ===== - -DECLARE SUB DRAW.BITMAP ALIAS "DRAW_BITMAP" (SEG Image AS ANY, BYVAL Xpos%, BYVAL Ypos%, BYVAL xWidth%, BYVAL Height%) -DECLARE SUB TDRAW.BITMAP ALIAS "TDRAW_BITMAP" (SEG Image AS ANY, BYVAL Xpos%, BYVAL Ypos%, BYVAL xWidth%, BYVAL Height%) - - ' ==== VIDEO MEMORY to VIDEO MEMORY COPY ROUTINES ===== - -DECLARE SUB COPY.PAGE ALIAS "COPY_PAGE" (BYVAL SourcePage%, BYVAL DestPage%) -DECLARE SUB COPY.BITMAP ALIAS "COPY_BITMAP" (BYVAL SourcePage%, BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%, BYVAL DestPage%, BYVAL DestX1%, BYVAL DestY1%) - - - - - - diff --git a/modex105/DEMOS/QB45/MODEX.QLB b/modex105/DEMOS/QB45/MODEX.QLB deleted file mode 100755 index 90122c134b3116f960cfd35a3f2d6144bfa2a819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9739 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 diff --git a/modex105/DEMOS/QB45/TEST6A.BAS b/modex105/DEMOS/QB45/TEST6A.BAS deleted file mode 100755 index b2487d57..00000000 --- a/modex105/DEMOS/QB45/TEST6A.BAS +++ /dev/null @@ -1,561 +0,0 @@ -'File: TEST6A.BAS -'Descp.: A Mode "X" demonstration for Quickbasic 4.5 -'Author: Matt Pritchard -'Date: 14 April, 1993 -' -DECLARE SUB DEMO.RES (Mode%, Xmax%, Ymax%) -DECLARE SUB ERROR.OUT (Message$) -DECLARE FUNCTION GET.KEY% () -DECLARE SUB LOAD.SHAPES () -DECLARE SUB PAGE.DEMO () -DECLARE SUB PRINT.TEXT (Text$, Xpos%, Ypos%, ColorF%, ColorB%) -DECLARE SUB TPRINT.TEXT (Text$, Xpos%, Ypos%, ColorF%) -DEFINT A-Z - - -TYPE ShapeType - ImgData AS STRING * 512 - xWidth AS INTEGER - yWidth AS INTEGER -END TYPE - -TYPE Sprite - Xpos AS INTEGER - Ypos AS INTEGER - XDir AS INTEGER - YDir AS INTEGER - Shape AS INTEGER -END TYPE - - -CONST MaxShapes = 32 - - REM $INCLUDE: 'UTILS.BI' - REM $INCLUDE: 'MODEX.BI' - -DIM SHARED Img(32) AS ShapeType -COMMON SHARED Img() AS ShapeType - - - CALL INIT.RANDOM - - CALL LOAD.SHAPES - - CALL DEMO.RES(Mode320x200, 320, 200) - CALL DEMO.RES(Mode320x400, 320, 400) - - CALL DEMO.RES(Mode360x200, 360, 200) - CALL DEMO.RES(Mode360x400, 360, 400) - - CALL DEMO.RES(Mode320x240, 320, 240) - CALL DEMO.RES(Mode320x480, 320, 480) - - CALL DEMO.RES(Mode360x240, 360, 240) - CALL DEMO.RES(Mode360x480, 360, 480) - - CALL PAGE.DEMO - - SET.VIDEO.MODE 3 - DOS.PRINT "THIS MODE X DEMO IS FINISHED" - END - -SUB DEMO.RES (Mode, Xmax, Ymax) - - IF SET.MODEX%(Mode) = 0 THEN - ERROR.OUT "Unable to SET_MODEX" + STR$(Mode) - END IF - - XCenter = Xmax \ 2 - - X1 = 10 - Y1 = 10 - X2 = Xmax - 1 - Y2 = Ymax - 1 - - FOR Z = 0 TO 3 - Colr = 31 - Z * 2 - DRAW.LINE X1 + Z, Y1 + Z, X2 - Z, Y1 + Z, Colr - DRAW.LINE X1 + Z, Y1 + Z, X1 + Z, Y2 - Z, Colr - DRAW.LINE X1 + Z, Y2 - Z, X2 - Z, Y2 - Z, Colr - DRAW.LINE X2 - Z, Y1 + Z, X2 - Z, Y2 - Z, Colr - NEXT Z - - XChars = Xmax \ 10 - YChars = Ymax \ 10 - - FOR X = 0 TO XChars - 1 - TGPRINTC 48 + ((X + 1) MOD 10), X * 10 + 1, 1, 9 + ((X \ 8) MOD 7) - DRAW.LINE X * 10 + 9, 0, X * 10 + 9, 3, 15 - NEXT X - - FOR Y = 0 TO YChars - 1 - TGPRINTC 48 + ((Y + 1) MOD 10), 1, Y * 10 + 1, 9 + ((Y \ 10) MOD 7) - DRAW.LINE 0, Y * 10 + 9, 3, Y * 10 + 9, 15 - NEXT Y - - ' Draw Lines - - FOR X = 0 TO 63 - N = 15 + X * .75 - SET.DAC.REGISTER 64 + X, N, N, N - SET.DAC.REGISTER 128 + X, 0, N, N - - DRAW.LINE 103 - X, 60, 40 + X, 123, 64 + X - DRAW.LINE 40, 60 + X, 103, 123 - X, 128 + X - - NEXT X - TPRINT.TEXT "LINE TEST", 37, 130, c.BLUE - - Y = 60: Gap = 0 - FOR X = 0 TO 9 - FILL.BLOCK 120, Y, 120 + X, Y + Gap, 64 + X - FILL.BLOCK 140 - (15 - X), Y, 150 + X, Y + Gap, 230 + X - FILL.BLOCK 170 - (15 - X), Y, 170, Y + Gap, 128 + X - Y = Y + Gap + 2 - Gap = Gap + 1 - NEXT X - TPRINT.TEXT "FILL TEST", 110, 46, c.GREEN - - - FOR X = 190 TO 250 STEP 2 - FOR Y = 60 TO 122 STEP 2 - SET.POINT X, Y, X + Y + X + Y - NEXT Y - NEXT X - - TPRINT.TEXT "PIXEL TEST", 182, 130, c.RED - - FOR X = 190 TO 250 STEP 2 - FOR Y = 60 TO 122 STEP 2 - IF READ.POINT(X, Y) <> ((X + Y + X + Y) AND 255) THEN - ERROR.OUT "READ.PIXEL Failure" - END IF - NEXT Y - NEXT X - - - - Msg$ = " This is a MODE X demo " - PRINT.TEXT Msg$, XCenter - (LEN(Msg$) * 4), 20, c.bRED, c.BLUE - Msg$ = "Screen Resolution is by " - Xp = XCenter - (LEN(Msg$) * 4) - PRINT.TEXT Msg$, Xp, 30, c.bGREEN, c.BLACK - - PRINT.TEXT LTRIM$(STR$(Xmax)), Xp + 8 * 21, 30, c.bPURPLE, c.BLACK - PRINT.TEXT LTRIM$(STR$(Ymax)), Xp + 8 * 28, 30, c.bWHITE, c.BLACK - - FOR X = 0 TO 15 - SET.DAC.REGISTER 230 + X, 63 - X * 4, 0, 15 + X * 3 - DRAW.LINE 30 + X, Ymax - 6 - X, Xmax - 20 - X, Ymax - 6 - X, 230 + X - NEXT X - TPRINT.TEXT "Press <ANY KEY> to Continue", XCenter - (26 * 4), Ymax - 18, c.YELLOW - - X = GET.KEY% - IF X = KyESC THEN ERROR.OUT "ABORT" - -END SUB - -SUB ERROR.OUT (Message$) - - SET.VIDEO.MODE 3 - DOS.PRINT Message$ - END - -END SUB - -FUNCTION GET.KEY% - - DO - X = SCAN.KEYBOARD - LOOP UNTIL X - - GET.KEY% = X - -END FUNCTION - -SUB LOAD.SHAPES - -DIM Grid(1 TO 32, 1 TO 32) - - FOR Shape = 0 TO MaxShapes - 1 - - FOR Y = 1 TO 32 - FOR X = 1 TO 32 - Grid(X, Y) = 0 - NEXT X - NEXT Y - - Style = RANDOM.INT(6) - Colour = 1 + RANDOM.INT(15) - - SELECT CASE Style - - CASE 0: ' Solid Box - - DO - xWidth = 3 + RANDOM.INT(30) - yWidth = 3 + RANDOM.INT(30) - LOOP UNTIL ((xWidth * yWidth) <= 512) - - FOR Y = 1 TO yWidth - FOR X = 1 TO xWidth - Grid(X, Y) = Colour - NEXT X - NEXT Y - - CASE 1: ' Hollow Box - - DO - xWidth = 5 + RANDOM.INT(28) - yWidth = 5 + RANDOM.INT(28) - LOOP UNTIL ((xWidth * yWidth) <= 512) - - FOR Y = 1 TO yWidth - FOR X = 1 TO xWidth - Grid(X, Y) = Colour - NEXT X - NEXT Y - - HollowX = 1 + RANDOM.INT(xWidth \ 2 - 1) - HollowY = 1 + RANDOM.INT(yWidth \ 2 - 1) - - FOR Y = HollowY + 1 TO yWidth - HollowY - FOR X = HollowX + 1 TO xWidth - HollowX - Grid(X, Y) = nil - NEXT X - NEXT Y - - CASE 2: ' Solid Diamond - - xWidth = 3 + 2 * RANDOM.INT(10) - yWidth = xWidth - Centre = xWidth \ 2 - - FOR Y = 0 TO Centre - FOR X = 0 TO Y - Grid(Centre - X + 1, Y + 1) = Colour - Grid(Centre + X + 1, Y + 1) = Colour - Grid(Centre - X + 1, yWidth - Y) = Colour - Grid(Centre + X + 1, yWidth - Y) = Colour - NEXT X - NEXT Y - - - CASE 3: ' Hollow Diamond - - - xWidth = 3 + 2 * RANDOM.INT(10) - yWidth = xWidth - Centre = xWidth \ 2 - sWidth = RANDOM.INT(Centre) - - FOR Y = 0 TO Centre - FOR X = 0 TO Y - IF X + (Centre - Y) >= sWidth THEN - Grid(Centre - X + 1, Y + 1) = Colour - Grid(Centre + X + 1, Y + 1) = Colour - Grid(Centre - X + 1, yWidth - Y) = Colour - Grid(Centre + X + 1, yWidth - Y) = Colour - END IF - NEXT X - NEXT Y - - CASE 4: ' Ball - - xWidth = 7 + 2 * RANDOM.INT(8) - yWidth = xWidth - Centre = 1 + xWidth \ 2 - - FOR Y = 1 TO yWidth - FOR X = 1 TO xWidth - D = SQR(((Centre - X) * (Centre - X)) + ((Centre - Y) * (Centre - Y))) - IF D < Centre THEN Grid(X, Y) = 150 + Colour * 2 + D * 3 - NEXT X - NEXT Y - - CASE 5: ' Ball - - - xWidth = 7 + 2 * RANDOM.INT(8) - yWidth = xWidth - Centre = 1 + xWidth \ 2 - sWidth = RANDOM.INT(xWidth) - - FOR Y = 1 TO yWidth - FOR X = 1 TO xWidth - D = SQR(((Centre - X) * (Centre - X)) + ((Centre - Y) * (Centre - Y))) - IF D < Centre AND D >= sWidth THEN Grid(X, Y) = 150 + Colour * 2 + D * 3 - NEXT X - NEXT Y - - END SELECT - - Img(Shape).xWidth = xWidth - Img(Shape).yWidth = yWidth - - A$ = STRING$(xWidth * yWidth, nil) - - c = 1 - FOR Y = 1 TO yWidth - FOR X = 1 TO xWidth - MID$(A$, c, 1) = CHR$(Grid(X, Y)) - c = c + 1 - NEXT X - NEXT Y - - Img(Shape).ImgData = A$ - - - NEXT Shape - -END SUB - -SUB PAGE.DEMO - -CONST MaxSprites = 64 - -DIM Obj(MaxSprites) AS Sprite -DIM LastX(MaxSprites, 1), LastY(MaxSprites, 1) -DIM LastObjects(1) - - ScreenX = 360: ScreenY = 240 - - IF SET.VGA.MODEX%(Mode320x200, ScreenX, ScreenY, 3) = 0 THEN - ERROR.OUT "Unable to SET_VGA_MODEX" + STR$(Mode) - END IF - - SET.ACTIVE.PAGE 0 - - CLEAR.VGA.SCREEN c.BLACK - - PRINT.TEXT "This is a Test of the Following Functions:", 10, 9, c.bWHITE, c.BLACK - - DRAW.LINE 10, 18, 350, 18, c.YELLOW - PRINT.TEXT "SET_ACTIVE_PAGE", 10, 20, c.bBLUE, c.BLACK - PRINT.TEXT "SET_DISPLAY_PAGE", 10, 30, c.GREEN, c.BLACK - PRINT.TEXT "SET_DAC_REGISTER", 10, 40, c.RED, c.BLACK - PRINT.TEXT "CLEAR_VGA_SCREEN", 10, 50, c.CYAN, c.BLACK - - PRINT.TEXT "TDRAW_BITMAP", 10, 60, c.PURPLE, c.BLACK - PRINT.TEXT "COPY_PAGE", 10, 70, c.GREEN, c.BLACK - PRINT.TEXT "COPY_BITMAP", 10, 80, c.CYAN, c.BLACK - - PRINT.TEXT "GPRINTC", 10, 90, c.BLUE, c.BLACK - PRINT.TEXT "TGPRINTC", 10, 100, c.GREEN, c.BLACK - PRINT.TEXT "SET_WINDOW", 10, 110, c.RED, c.BLACK - - PRINT.TEXT "VIRTUAL SCREEN SIZES", 190, 20, c.bBLUE, c.BLACK - PRINT.TEXT " SMOOTH SCROLLING", 190, 30, c.GREEN, c.BLACK - PRINT.TEXT " SPRITE ANIMATION", 190, 40, c.CYAN, c.BLACK - PRINT.TEXT " PAGE FLIPPING", 190, 50, c.RED, c.BLACK - PRINT.TEXT " COLOR CYCLING", 190, 60, c.PURPLE, c.BLACK - - - FOR X = 0 TO 60 - SET.DAC.REGISTER 50 + X, 3 + X, 0, 60 - X - SET.DAC.REGISTER 150 + X, 3 + X, 0, 60 - X - NEXT X - - c = 0: DC = 1 - FOR X = 0 TO ScreenX \ 2 - DRAW.LINE ScreenX \ 2 - 1, ScreenY \ 4, X, ScreenY - 1, c + 50 - DRAW.LINE ScreenX \ 2, ScreenY \ 4, ScreenX - X - 1, ScreenY - 1, c + 50 - c = c + DC - IF c = 0 OR c = 60 THEN DC = -DC - NEXT X - - TPRINT.TEXT "Press <ANY KEY> to Continue", 72, 190, c.bWHITE - TPRINT.TEXT "< > = Faster < > = Slower", 72, 204, c.bGREEN - TPRINT.TEXT "< > = Fewer Shapes < > = More Shapes", 32, 218, c.bCYAN - - TGPRINTC 43, 80, 204, c.YELLOW - TGPRINTC 45, 200, 204, c.YELLOW - - TGPRINTC 25, 40, 218, c.YELLOW - TGPRINTC 24, 200, 218, c.YELLOW - - COPY.PAGE 0, 1 - COPY.PAGE 0, 2 - - FOR X = 1 TO MaxSprites - DO - Obj(X).XDir = RANDOM.INT(7) - 3 - Obj(X).YDir = RANDOM.INT(7) - 3 - LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0) - - Obj(X).Shape = X MOD MaxShapes - - SpriteX = Img(Obj(X).Shape).xWidth - SpriteY = Img(Obj(X).Shape).yWidth - - Obj(X).Xpos = 1 + RANDOM.INT(ScreenX - SpriteX - 2) - Obj(X).Ypos = 1 + RANDOM.INT(ScreenY - SpriteY - 2) - - LastX(X, 0) = Obj(X).Xpos - LastX(X, 1) = Obj(X).Xpos - LastY(X, 0) = Obj(X).Ypos - LastY(X, 1) = Obj(X).Ypos - NEXT X - - CurrentPage = 0 - - 'View Shift... - - ViewX = 0 - ViewY = 0 - ViewMax = 3 - ViewCnt = 0 - ViewXD = 1 - ViewYD = 1 - - SetColor = 3: SDir = 1 - PrevColor = 0: PDir = 1 - - VisObjects = MaxSprites \ 2 - LastObjects(0) = 0 - LastObjects(1) = 0 - -DRAW.LOOP: - - - SET.ACTIVE.PAGE CurrentPage - - ' Erase Old Images - - FOR X = 1 TO LastObjects(CurrentPage) - - X1 = LastX(X, CurrentPage) AND &HFFFC - Y1 = LastY(X, CurrentPage) - X2 = ((LastX(X, CurrentPage) + Img(Obj(X).Shape).xWidth)) OR 3 - Y2 = Y1 + Img(Obj(X).Shape).yWidth - 1 - - COPY.BITMAP 2, X1, Y1, X2, Y2, CurrentPage, X1, Y1 - - NEXT X - - ' Draw new images - - FOR X = 1 TO VisObjects - - SpriteX = Img(Obj(X).Shape).xWidth - SpriteY = Img(Obj(X).Shape).yWidth - - ' Move Sprite - -REDOX: - NewX = Obj(X).Xpos + Obj(X).XDir - IF NewX < 0 OR NewX + SpriteX > ScreenX THEN - Obj(X).XDir = -Obj(X).XDir - IF RANDOM.INT(20) = 1 THEN - DO - Obj(X).XDir = RANDOM.INT(7) - 3 - Obj(X).YDir = RANDOM.INT(7) - 3 - LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0) - GOTO REDOX - END IF - END IF - Obj(X).Xpos = Obj(X).Xpos + Obj(X).XDir - -REDOY: - NewY = Obj(X).Ypos + Obj(X).YDir - IF NewY < 0 OR NewY + SpriteY > ScreenY THEN - Obj(X).YDir = -Obj(X).YDir - IF RANDOM.INT(20) = 1 THEN - DO - Obj(X).XDir = RANDOM.INT(7) - 3 - Obj(X).YDir = RANDOM.INT(7) - 3 - LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0) - GOTO REDOY - END IF - END IF - Obj(X).Ypos = Obj(X).Ypos + Obj(X).YDir - - 'Draw Sprite - - TDRAW.BITMAP Img(Obj(X).Shape), Obj(X).Xpos, Obj(X).Ypos, SpriteX, SpriteY - - LastX(X, CurrentPage) = Obj(X).Xpos - LastY(X, CurrentPage) = Obj(X).Ypos - - NEXT X - - LastObjects(CurrentPage) = VisObjects - - ' Pan Screen Back & Forth - - ViewCnt = ViewCnt + 1 - IF ViewCnt >= ViewMax THEN - ViewX = ViewX + ViewXD - IF ViewX = 0 OR ViewX = 39 THEN ViewXD = -ViewXD - IF ViewXD < 0 THEN - ViewY = ViewY + ViewYD - IF ViewY = 0 OR ViewY = 39 THEN ViewYD = -ViewYD - END IF - - SET.WINDOW CurrentPage, ViewX, ViewY - - ViewCnt = 0 - ELSE - SET.DISPLAY.PAGE CurrentPage - END IF - - ' Cycle Colors - - SET.DAC.REGISTER 50 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor - SET.DAC.REGISTER 50 + SetColor, SetColor, 10, 63 - SetColor - - SET.DAC.REGISTER 150 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor - SET.DAC.REGISTER 150 + SetColor, 63, 63, SetColor - - SetColor = SetColor + SDir - IF SetColor = 60 OR SetColor = 0 THEN SDir = -SDir - - PrevColor = PrevColor + PDir - IF PrevColor = 60 OR PrevColor = 0 THEN PDir = -PDir - - CurrentPage = 1 - CurrentPage - - Code = SCAN.KEYBOARD - - IF Code = False THEN GOTO DRAW.LOOP - - IF Code = KyPlus THEN - IF ViewMax < 12 THEN ViewMax = ViewMax + 1 - GOTO DRAW.LOOP - END IF - - IF Code = KyMinus THEN - IF ViewMax > 1 THEN ViewMax = ViewMax - 1 - IF ViewCnt >= ViewMax THEN ViewCnt = 0 - GOTO DRAW.LOOP - END IF - - IF Code = KyUp THEN - IF VisObjects < MaxSprites THEN VisObjects = VisObjects + 1 - GOTO DRAW.LOOP - END IF - - IF Code = KyDown THEN - IF VisObjects > 1 THEN VisObjects = VisObjects - 1 - GOTO DRAW.LOOP - END IF - - -END SUB - -SUB PRINT.TEXT (Text$, Xpos, Ypos, ColorF, ColorB) - - IF LEN(Text$) = 0 THEN EXIT SUB - PRINT.STR VARSEG(Text$), SADD(Text$), LEN(Text$), Xpos, Ypos, ColorF, ColorB - - -END SUB - -SUB TPRINT.TEXT (Text$, Xpos, Ypos, ColorF) - - IF LEN(Text$) = 0 THEN EXIT SUB - - TPRINT.STR VARSEG(Text$), SADD(Text$), LEN(Text$), Xpos, Ypos, ColorF - -END SUB - diff --git a/modex105/DEMOS/QB45/TEST6A.EXE b/modex105/DEMOS/QB45/TEST6A.EXE deleted file mode 100755 index e61d038796159e3fdb7d12c95525a9dafb87995f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40544 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 LZ=hZHw}1Z|yAW{= diff --git a/modex105/DEMOS/QB45/UASM-QB4.BAT b/modex105/DEMOS/QB45/UASM-QB4.BAT deleted file mode 100755 index e4aa87e0..00000000 --- a/modex105/DEMOS/QB45/UASM-QB4.BAT +++ /dev/null @@ -1 +0,0 @@ -MASM utils, utils, utils, nul; \ No newline at end of file diff --git a/modex105/DEMOS/QB45/UTILS.ASM b/modex105/DEMOS/QB45/UTILS.ASM deleted file mode 100755 index 811b8f8e..00000000 --- a/modex105/DEMOS/QB45/UTILS.ASM +++ /dev/null @@ -1,406 +0,0 @@ -;======================================================= -;=== UTILS.ASM - Asm Utilities for QuickBasic/BC7 === -;======================================================= - - PAGE 255, 132 - - .MODEL Medium - .286 - - ; ==== MACROS ==== - - ; macros to PUSH and POP multiple registers - -PUSHx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - push R1 ; Save R1 - PUSHx R2, R3, R4, R5, R6, R7, R8 - ENDIF -ENDM - -POPx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - pop R1 ; Restore R1 - POPx R2, R3, R4, R5, R6, R7, R8 - ENDIF -ENDM - - ; Macro to Clear a Register to 0 - -CLR MACRO Register - xor Register, Register ; Set Register = 0 -ENDM - - ; Macros to Decrement Counter & Jump on Condition - -LOOPx MACRO Register, Destination - dec Register ; Counter-- - jnz Destination ; Jump if not 0 -ENDM - -LOOPjz MACRO Register, Destination - dec Register ; Counter-- - jz Destination ; Jump if 0 -ENDM - - - ; ==== General Constants ==== - - False EQU 0 - True EQU -1 - nil EQU 0 - - b EQU BYTE PTR - w EQU WORD PTR - d EQU DWORD PTR - o EQU OFFSET - f EQU FAR PTR - s EQU SHORT - ?x4 EQU <?,?,?,?> - ?x3 EQU <?,?,?> - - -IFDEF FARSTRINGS - - EXTRN stringaddress:far - EXTRN stringlength:far - -ENDIF - - - .Data - - EVEN - -RND_Seed DW 7397, 29447, 802 -RND_Mult DW 179, 183, 182 -RND_ModV DW 32771, 32779, 32783 - -CR_LF DB 13, 10 ; the CRLF data - - .Code - -;================= -;DOS_PRINT (Text$) -;================= -; -; Prints Text Directly to DOS console w/ CR/LF -; - - PUBLIC DOS_PRINT - -DP_Stack STRUC - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - DP_Text DW ? ; Address of Text$ Descriptor -DP_Stack ENDS - - -DOS_PRINT PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - mov BP, SP ; Set up Stack Frame - - mov SI, [BP].DP_Text ; Get Addr of Text$ descriptor - -IFDEF FARSTRINGS - push SI ; Push Addr of BC7 Decriptor Ptr - call stringaddress ; Get Address + Len of string!!! - ; DX:AX = Addr CX = Len - mov DS, DX ; DS = DX = Segment of string - mov DX, AX ; DX = AX = Offset of String -ELSE - mov CX, [SI] ; put its length into CX - mov DX, [SI+02] ; now DS:DX points to the String -ENDIF - - jcxz @No_Print ; Don't Print if empty - - mov BX, 1 ; 1= DOS Handle for Display - mov AH, 40h ; Write Text Function - int 21h ; Call DOS to do it - -@No_Print: - mov AX, SEG DGROUP ; Restore DGroup - mov DS, AX - - mov DX, o CR_LF ; Get Addr of CR/LF pair - mov CX, 2 ; 2 Characters to Write - mov BX, 1 ; 1= DOS Handle for Display - - mov AH, 40h ; Write Text Function - int 21h ; Call DOS to do it - - cld ; Reset Direction Flag - POPx DI, SI, DS, BP ; Restore Saved Registers - ret 2 ; Exit & Clean Up Stack - -DOS_PRINT ENDP - - -;================== -;DOS_PRINTS (Text$) -;================== -; -; Print Text$ Directly to DOS console -; without a trailing CR/LF -; - - PUBLIC DOS_PRINTS - -DOS_PRINTS PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - mov BP, SP ; Set up Stack Frame - - mov SI, [BP].DP_Text ; Get Addr of Text$ descriptor - -IFDEF FARSTRINGS - push SI ; Push Addr of BC7 Decriptor Ptr - call stringaddress ; Get Address + Len of string!!! - ; DX:AX = Addr CX = Len - mov DS, DX ; DS = DX = Segment of string - mov DX, AX ; DX = AX = Offset of String -ELSE - mov CX, [SI] ; put its length into CX - mov DX, [SI+02] ; now DS:DX points to the String -ENDIF - - jcxz @DPS_Exit ; Don't Print if empty - - mov BX, 1 ; 1= DOS Handle for Display - mov AH, 40h ; Write Text Function - int 21h ; Call DOS to do it - -@DPS_Exit: - cld ; Reset Direction Flag - POPx DI, SI, DS, BP ; Restore Saved Registers - ret 2 ; Exit & Clean Up Stack - -DOS_PRINTS ENDP - - -;====================== -;SET_VIDEO_MODE (Mode%) -;====================== -; -; Sets the Video Mode through the BIOS -; - - PUBLIC SET_VIDEO_MODE - -SVM_Stack STRUC - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - SVM_Mode DB ?,? ; Desired Video Mode -SVM_Stack ENDS - - -SET_VIDEO_MODE PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - mov BP, SP ; Set up Stack Frame - - CLR AH ; Function 0 - mov AL, [BP].SVM_Mode ; Get Mode # - - int 10H ; Change Video Modes - -@SVM_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - ret 2 ; Exit & Clean Up Stack - -SET_VIDEO_MODE ENDP - - -;============== -;SCAN_KEYBOARD% -;============== -; -; Function to scan keyboard for a pressed key -; - - PUBLIC SCAN_KEYBOARD - -SCAN_KEYBOARD PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - - mov AH, 01H ; Function #1 - int 16H ; Call Keyboard Driver - jz @SK_NO_KEY ; Exit if Zero flag set - - mov AH, 00H ; Remove Key from Buffer - int 16H ; Get Keycode in AX - - or AL, AL ; Low Byte Set (Ascii?) - jz @SK_Exit ; if not, it's a F-Key - - CLR AH ; Clear ScanCode if Ascii - jmp s @SK_Exit ; Return Key in AX - -@SK_NO_KEY: - CLR AX ; Return Nil (no Keypress) - -@SK_Exit: - cld ; Reset Direction Flag - POPx DI, SI, DS, BP ; Restore Saved Registers - ret ; Exit & Clean Up Stack - -SCAN_KEYBOARD ENDP - - -;==================== -;RANDOM_INT (MaxInt%) -;==================== -; -; Returns a pseudo-random number in the range of (0.. MaxInt-1) -; - - - PUBLIC RANDOM_INT - -RI_Stack STRUC - DW ? ; BP - DD ? ; Caller - RI_MaxVal DW ? ; Maximum Value to Return + 1 -RI_Stack ENDS - - -RANDOM_INT PROC FAR - - push BP ; Preserve Important Registers - mov BP, SP ; Set up Stack Frame - - CLR BX ; BX is the data index - CLR CX ; CX is the accumulator - -REPT 3 - mov AX, RND_Seed[BX] ; load the initial seed - mul RND_Mult[BX] ; multiply it - div RND_ModV[BX] ; and obtain the Mod value - mov RND_Seed[BX], DX ; save that for the next time - - add CX, DX ; add it into the accumulator - inc BX - inc BX ; point to the next set of values -ENDM - - mov AX, CX ; AX = Random # - CLR DX ; DX = 0 - div [BP].RI_MaxVal ; DX = DX:AX / MAxVal Remainder - - mov AX, DX - - pop BP ; Restore BP - ret 2 ; back to BASIC with AX holding the result - -RANDOM_INT ENDP - - -;=========== -;INIT_RANDOM -;=========== -; -; Scrambles the psuedo-random number sequence -; (XOR's the seed value with the timer) -; - - PUBLIC INIT_RANDOM - -INIT_RANDOM PROC FAR - - clr AX ; Segment = 0000 - mov ES, AX - mov AX, ES:[046Ch] ; Get Timer Lo Word - - xor RND_Seed, AX ; Scramble 1st Seed - - ret ; Exit & Clean Up Stack - -INIT_RANDOM ENDP - - -;==================== -;INT_SQR (X%, Round%) -;==================== -; -; Returns the Integer Square Root of (X) -; Round allows the return value to be rounded to the -; nearest integer value by passing 0x80. Passing 0 -; return the Integer Portion only. The rounding amound is -; a number from 0 to 1 multiplied by 256, thus -; 0.5 * 0x100 = 0x80! -; - -ISQ_Stack STRUC - DW ?,? ; BP, DI - DD ? ; Caller - ISQ_Round DW ? ; Amount to Round Result * 256 - ISQ_X DW ? ; "X" -ISQ_Stack ENDS - - PUBLIC INT_SQR - -INT_SQR PROC FAR - - PUSHx BP, DI ; Save BP - mov BP, SP ; Set up Stack Frame - - xor AX, AX ; {xor eax,eax} - xor DX, DX ; {xor edx,edx} - mov DI, [BP].ISQ_X ; {mov edi,x} - - mov CX, 16 ; {mov cx, 32} - -@ISQ_L: - - shl DI, 1 ; {shl edi,1} - rcl DX, 1 ; {rcl edx,1} - shl DI, 1 ; {shl edi,1} - rcl DX, 1 ; {rcl edx,1} - shl AX, 1 ; {shl eax,1} - mov BX, AX ; {mov ebx,eax} - shl BX, 1 ; {shl ebx,1} - inc BX ; {inc ebx} - cmp DX, BX ; {cmp edx,ebx} - jl @ISQ_S - - sub DX, BX ; {sub edx,ebx} - inc AX ; {inc eax} - -@ISQ_S: - loop @ISQ_L - - add ax, [BP].ISQ_Round ; {add eax,$00008000} - ; {*round* result in hi word: ie. +0.5} - shr ax, 8 ; {shr eax,16} {to ax (result)} - - POPx DI, BP ; Restore Registers - ret 4 ; Exit - -INT_SQR ENDP - - -;============ -;TIMER_COUNT& -;============ -; -; Returns the current timer value as an integer/long integer -; - - - PUBLIC TIMER_COUNT - -TIMER_COUNT PROC FAR - - clr AX ; Segment = 0000 - mov ES, AX ; use ES to get at data - mov AX, ES:[046Ch] ; Get Timer Lo Word - mov DX, ES:[046Eh] ; Get Timer Hi Word - ret ; Exit & Return value in DX:AX - -TIMER_COUNT ENDP - - - END diff --git a/modex105/DEMOS/QB45/UTILS.BI b/modex105/DEMOS/QB45/UTILS.BI deleted file mode 100755 index aeafeef4..00000000 --- a/modex105/DEMOS/QB45/UTILS.BI +++ /dev/null @@ -1,51 +0,0 @@ - - ' Misc Constants - -CONST True = -1, False = 0, nil = 0 - - ' Keyboard Codes: Extended - -CONST KyF1 = &H3B00, KyF2 = &H3C00, KyF3 = &H3D00, KyF4 = &H3E00, KyF5 = &H3F00 -CONST KyF6 = &H4000, KyF7 = &H4100, KyF8 = &H4200, KyF9 = &H4300, KyF10 = &H4400 - -CONST KyUp = &H4800, KyLeft = &H4B00, KyRight = &H4D00, KyDown = &H5000 -CONST KySLeft = &HCB00, KySRight = &HCD00, KySUp = &HC800, KySDown = &HD000 - -CONST KyHome = &H4700, KyPgUp = &H4900, KyEnd = &H4F00, KyPgDn = &H5100 -CONST KySHome = &HC700, KySPgUp = &HC900, KySEnd = &HCF00, KySPgDn = &HD100 - -CONST KyIns = &H5200, KyDel = &H5300, KyRvsTab = &H8F00 -CONST KySIns = &HC200, KySDel = &HC300 - -CONST KyAltA = &H1E00, KyAltB = &H3000, KyAltC = &H2E00, KyAltD = &H2000 -CONST KyAltE = &H1200, KyAltF = &H2100, KyAltG = &H2200, KyAltH = &H2300 -CONST KyAltI = &H1700, KyAltJ = &H2400, KyAltK = &H2500, KyAltL = &H2600 -CONST KyAltM = &H3200, KyAltN = &H3100, KyAltO = &H1800, KyAltP = &H1900 -CONST KyAltQ = &H1000, KyAltR = &H1300, KyAltS = &H1F00, KyAltT = &H1400 -CONST KyAltU = &H1600, KyAltV = &H2F00, KyAltW = &H1100, KyAltX = &H2D00 -CONST KyAltY = &H1500, KyAltZ = &H2C00 - - ' Keyboard Codes: Ascii - -CONST KyBS = 8, KyTab = 9, KyCR = 13, KyESC = &H1B, KyClr = &H7F -CONST KyPlus = 45, KyMinus = 43 - - ' Color Constants - -CONST c.BLACK = 0, c.BLUE = 1, c.GREEN = 2, c.CYAN = 3 -CONST c.RED = 4, c.PURPLE = 5, c.BROWN = 6, c.WHITE = 7 -CONST c.GREY = 8, c.bBLUE = 9, c.bGREEN = 10, c.bCYAN = 11 -CONST c.bRED = 12, c.bPURPLE = 13, c.YELLOW = 14, c.bWHITE = 15 -CONST c.BRIGHT = 8 - - ' From UTILS.ASM - -DECLARE SUB DOS.PRINT ALIAS "DOS_PRINT" (Text$) -DECLARE SUB DOS.PRINTS ALIAS "DOS_PRINTS" (Text$) -DECLARE SUB SET.VIDEO.MODE ALIAS "SET_VIDEO_MODE" (BYVAL Mode%) -DECLARE FUNCTION SCAN.KEYBOARD% ALIAS "SCAN_KEYBOARD" -DECLARE FUNCTION RANDOM.INT ALIAS "RANDOM_INT" (BYVAL MaxInt%) -DECLARE SUB INIT.RANDOM ALIAS "INIT_RANDOM" -DECLARE FUNCTION TIMER.COUNT& ALIAS "TIMER_COUNT" -DECLARE FUNCTION INT.SQR ALIAS "INT_SQR" (BYVAL X%, BYVAL Round%) - diff --git a/modex105/DEMOS/ROM_8X8.FNT b/modex105/DEMOS/ROM_8X8.FNT deleted file mode 100755 index 708a4f924815cedc3c5e179b42a7cc9d9c492625..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmYLIv1%hR5FJwF8j-jZ*rdt_40l(kSRBY_q!RI=OQFJ*5!~J;?(YN6A8>zgZD7H$ zl}MQ;#%yJGAywF7(cT+v;Ks<K8I9h|ywMVkQmy~2A2;i&8eWF&aj1MssWcOsm@;cq z8gZ19(NPlVqR>RcaNHt(pu$~WyMl)8=J9c}9nL?U|BNw)!Z}yyN?(1sVqU(r_lx_* z;`^cA+!V)SakF`7yVSK0baFON^RpA6R$5nu#x>{2(f!NIkLh$u^M&!=#30pHRh8oq zHspA%Nkd?xER_@#u}zjGx~}U4b?F9o35^S=RtnGI*k$1mn2E`IpKb3GexA6jgX#d( zM9r=t<IQRpS7dFS<1|}qSreAVp2!tL;c&#<18@|U1L{94IipjB==y=m=4t<aD2bO0 z=_y2IY#g;hyR*W_q%NqhJ0-TUbq89hj{pEpfFU;iN~M<>Tkt=Yl`K+UPLB$(m&}q! zOTT5a-|y={41hjH>YXc{>oHF7hIw`#bMPId+q-agn?`Nl^7)gS6K0HSk-#1#(1k*o zsOR8(@a`b&LwagnQ+jS1Y7X!FCurlFrtv1{v%o|8xC^sv%e@fW<xKkgJL2LP(n~(T zGvW4gdIcUpfF*vE5GXaj^k<hSU@X=KlIGRv2?co|I^aDc_`eLCxe-TDCFa^%i~e_F z#~S%(3U2tt?!lAs_D$*~S_$J_YyHZhUZ!R4U(rZFYlVPA_DWquQ3!zUq=SqnJQ3}{ zxBzCn3)m}{@$<u@375=YWqxu^>VQK3c#zL2$y)^hxh42f59a)vzx6a@ZkcEDUF0PO NT(pwbM1+VY(Lc=|finOA diff --git a/modex105/DEMOS/SPACEAGE.FNT b/modex105/DEMOS/SPACEAGE.FNT deleted file mode 100755 index 029bae4effb181a29f61b17c588cd848bc04e82a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmYLHJ!|7Y5S<X%G(lFmg&-;P1Gd~kBw+GG`~%FP>bOEUxqr5pFqLs>t~iV;RY!1j zs1T!jZ)J0X<+nTE^JYaBxj=YYL5MSiNTH5);!SAhnReQ4LLJYv6KTJliL?`M0<-sY zlBTX3z-|rM$^0|Re0Tq_dU}1IKT>}gC!1%R#!H_*=J(g9)x-T=89OV>Qc7Q0<$+~s zT?B^K+E5~)uWJ_Y^?HqizX~+}2c+5i7$wSfTjM6OHRDgBC36-<k5z03mF}$@Plvzo zXKs<W*|cqo$j8U3s-lR-uc$D1zq<}562dby6TU@45LX~ypTzWZI;k!7(SfP6elRiT zUW&p*Rjnurv6O(&0|(mGK@GiX2Nz=YLoL?3eb21Y#tL=egMXY^nei{2*YtcoC&OHC zw%_k%`ux1+Pd)pXREJ@hSa<CETp!pYE`6~N_6G;C5Mqob&Y`a(^@s5f^eG_^<1i)t zmVEHfd6&MIe0n@0j&mST?1*`J&w0WB)gO5Hb?JErajdhATUFi-4Itii?7Pc*=_GOb z!bz9+(@6>M>lO%e$Zv$loio%!zj=P}rObnQjD6ug80Nsfe_-MHKA77r{sZ_H5+LHR z+TvT2QYL`;Fy2UiFu>AN=7IUiA5jg2X2e2eWB~Ob0QN8~c`@PQf5`LWp@9I#X99p= h7cUiYAi$&vVG}~bcO~qr4Z(-d%J<)JrH}|U`3JE0#Z>?R diff --git a/modex105/DEMOS/SYSTEM.FNT b/modex105/DEMOS/SYSTEM.FNT deleted file mode 100755 index 9a1965ebfe5bd67bea71c313ef7ef2f78aa6fbb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmYjPv1%JZ5PcEm5aBRag)K}-6L5KuW{X1(ia+GQkTh4gGKX2#%0V3BF6z_-EK>Os z1ct?etqu`V2p7gEjd3Mh1sBIAZ&oH`(CIO|J8x#*46rf1Kc0>EHS~VdG{j<f{`JeJ zVX<DXAs_1c__#N~>i+(@pq+oD&8?kJE-xo@8yMC!0paxQ=Ty*Nj4yoj$J48Ty*GP# ze)zCDIXF2u_;BZn;pBWWEHGL<hR4+iz3o95Z1<oFtCTHNXlAn+d6HD!ExrY)?^nN` z^|qj1zxzCT`wE#hnbDbG(3*8?9ip$g&?%nhHrPDFRzJ)7{eFhsDpb3GX{J*aYD{x> zCiv7oaxvt1|Gte!6`zNyLS}!M7hMM5s=V~4(3L*AX^)VmD!xk<<5UWMJj#Je2VL=s zU8v0yki6tchyn7)OzbN!-3Z3}rS}F(E1IP*7lD}UBs_21Hjo*ebB}3Tqb9b*;1e;4 zm!F_b61GF`|GrY#q`sJ*6^O$l;b#YmxLn@2TH<~19-a5{qwky}FCAKkz`V|Jo)Mkg zFC_0K%!AFw`d_kGsnfUD57(^+S!f;nI<QX<fA>4wE_}=<@sf-WqJO)v(U&;#n}qip zUL|>GA!5b3(^-Z!`Fy1-@=~W-CK#fy)UOmXaMEzngOR#Y!+ojzzc~PZIJ_s<B-UF< zvC=Q30_La2meNK)ID?`rYZBA1+t#EUhs=XJLosPU%GF3K?OYT9D=DL_`MweXh*43Z zVGFW;;&%>U8jcVcNPyf^0GVeOHxtq!b&Xha#_W6<WYMAkn{(DfK90A;4tFlkcVbae T*P-Iv)gg{<_*6`Upq_sLPqB~A diff --git a/modex105/DEMOS/TEST6.EXE b/modex105/DEMOS/TEST6.EXE deleted file mode 100755 index 5682c475a1464b2101d6c386aaca998633a5bdd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19990 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 Ix?}Ob0HE06asU7T diff --git a/modex105/FONTEDIT/CHARSETS.CS b/modex105/FONTEDIT/CHARSETS.CS deleted file mode 100755 index 97fe608ff81e4b78105a52984687b21a8a166ff7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2144 zcmZuxJ!l+96n;6MS4UXnt-=-}41|Eng%sK1kQZ45l?FE{#|SwoHp$@#voXtha@dX{ zQYfmTCagt@!<7qF0>fazkYW)cg-{{Pq!F&fRpE+dlJCu4ehhhcyPv){@Bht-sFQSU z?`Ur=rF3mP9s`G~&wl*=$?EXx>WcWGqImeQw?g*Kn|B$j<8L9yRdu}o^5y<<<={3R zJ91BVemh_^&-b1i&-V^qIlB4L%_JF3?W2uH8ylZp>f!4Cv;EZ}DLZpBtEjiQ;#L-W z6c4L7u7<H29~~VbP7ubICqFxie|h!$JH0-|AKv;-WrCu#jLI}(bZLsZ)6{t$x2}z$ zPbya>5%mXAG#CsbTFza*OjM2!4p3-Wj(2t#=j~I%LJ8fw*LYP9bC>57Rj1{9ZA7Mt z6KS4Onx_vgng<kyv9}9j_{AaNfhr-&Q<vsALKksoLI^IQao&Mn$b`NUsTGyRoEcM6 zoW_s}oDUo@SPGzTn#LhAwOY@@rl11Y0G$a~*q^_QRS=*Z#Qx7CIU3jJ)1v|=P;q>8 z5ChN7E_A{E#u-DcG5iJBS|ct9q$P*ET4SFcHJ_hw-p<Vsn)UU+k7Bt_)0|Jw8$*Z! zX~|qU^l8Xk{^4Gq7@v>*IT;K*e|=JU&VGnr1~~8H#+(P@Jm%Ot$eFuBJd>w6;$lt( zZ_xR{Vt$gPB+U&6Ju11bu*7}I%|Ck}`V-5W(=w<`MO-ZROI!i+W5yLm>$%e<4W%p) z7`$kjGQ>J~AGk9ZCWI)&)d=%cYd-+8T!t)QpYs5Kexkq<E%5bY-fAMG!3v31*n!V6 z0N!WoZzgevn5)MEJ4WYcjxU-YK&MANh==vIw1hjCBul<1u4@!y@9~HpT)>ot2Z4Fs z`R41b%`e0!UwyeH{!fS&ZY*{lZ@m|a$Iauzf)<MQuti-9>uuYju0V`tBS9351aLIx zKoYE`puPCvqHV#G^>wrnw9VmR)6&9HxV5`0DPT3nNkt;8{TC0{5AmfyPur=6UpQ=s zxYo!wnILk%u4}5ni%GGJ-#Ow4ghL)og!7>;E{stKtVwWvI2Xw*@hE4KQLFRa)0hVH z{}+J}BY08(?-3mP)Jab%MT$7DR|L0b_`tuYN6S;-uczYEpKvZ!rX<m|48{<kQW;QX z8LRqKXEpSF$}H4fe5n~NC|%>1M!Z2JyuC%E7IvA=GDa(`>QD+soN|ACXgvqk-8t6F z`g+b`2YrteKAa~bA0JsVwj+xV5RCQLr_l%|@VE1Ph*N`Wpk_V#vYyv-u06L(E9KAY zn$Pj}eir>RM^&{1s#<$J!mwX3n@lF#&_nC>86X2k^*$bR_5;^75OWrqIpVS%j_3Kj zU$BjM*bnsZ?9kg;v}e&js#Nd~5GEQhM;P#a24hIyzo+2B|8<?FFJ7EN4=>*@NyU3c zKhoDl(t4iF`zI7CEZbYo-&2HyY)=?K#(E3@obyW5K^Oq{Pa2IdqU?;31F1O*Ao42S zpH^MH76I4}Zg!5~0c~&l{;AHgn)NV{g3yP^a9{fpdzW07LSf8BB*6Q(VGO|>EaR=u c@7}+=v9)<$+}Yd`AAF4Uy(KWY!FGSkU-|#d0ssI2 diff --git a/modex105/FONTEDIT/CSEDIT.DOC b/modex105/FONTEDIT/CSEDIT.DOC deleted file mode 100755 index 97ff07e0..00000000 --- a/modex105/FONTEDIT/CSEDIT.DOC +++ /dev/null @@ -1,196 +0,0 @@ - -CSEDIT - A Simple Font Editor by Matt Pritchard - - -CSEDIT is distributed with MODEXnnn.ZIP, the general purpose MODE X -Library for VGA Graphics. - -WHAT YOU NEED TO RUN CSEDIT: - - * A Vga Monitor - * A Microsoft Compatible Mouse - - A Mouse is most definitely required, as the keyboard is used for - nothing except entering file names. - -FILES NEEDED IN THE CURRENT DIRECTORY: - - CSEDIT.EXE - The Font Editor Program - CHARSETS.CS - The Font Editor's Internal Fonts - PALETTE.CS - The Font Editor's Palette - MOUSEIMG.CS - The Font Editor's Mouse Pointer - -SAMPLE FONT FILE THAT SHOULD BE INCLUDED: - - SYSTEM.FNT - The Font used by CSEDIT.EXE - INVERSE.FNT - An Inverted version of SYSTEM.FNT - SPACEAGE.FNT - A Futuristic, Tech style font - ROM_8X8.FNT - The Lower 128 characters from the VGA BIOS Rom - -WHAT IT EDITS: - - 8 by 8 character fonts, 128 characters at a time. 2 fonts at a time. - -HOW IT WORKS/FEATURES: - - CSEDIT allows the user to edit 2 different font groups at a time, - which may be loaded and saved separately. - - A enlarged character grid allows the user to edit individual pixels - on a selected character. - - The Following operations can be performed on a single character or - simultaneously on a selected block of characters. - - * Shift the selected character(s) in any direction - with or without clipping at the edges. - * Vertically Flip the selected character(s) - * Horizontally Flip the selected character(s) - * Rotate the selected character(s) 90 Degrees Clockwise - * Rotate the selected character(s) 90 Degrees Counterclockwise - * Clear the selected character(s) - * Invert the selected character(s) - * XOR the selected character(s) with other character(s) - * AND the selected character(s) with other character(s) - * OR the selected character(s) with other character(s) - * Copy the selected character(s) to another position or font. - - An UNDO feature allows the reversal of the most recent operation. - -DESCRIPTION OF OBJECTS/FEATURES FROM THE TOP DOWN: - - Character Grid: (RED) Box in Upper Left corner of screen. This is - where you edit an individual character. The Left Button sets the - pixel the mouse pointer is on, while the Right Button clears that - pixel. - - Scroll Buttons: The Four Scroll Buttons are labeled with directional - arrows, and arranged in a diamond pattern. Left Clicking on a - directional button will scroll the currently selected character - in that direction, with the pixels on the edge rolling off and - appearing on the other size. Right Clicking will prevent the - pixels from rolling to the other side. - - Vertical Flip Button: - Horizontal Flip Button: Clicking these buttons will flip the pattern - of the currently selected character(s) around the indicated axis. - i.e. the top row will be swapped with the bottom row, etc. or the - left row column will be swapped with right column, etc. - depending upon which button you push. - - Invert Button: Clicking this button causes all pixels in the selected - character(s) to flip flop between on and off. - - Clear Button: Clicking this button erases the selected characters - - Rotate Buttons: Clicking these buttons will rotate the pattern in the - selected character(s) 90 degrees in the indicated direction. - - XOR Button: Clicking this button will let you XOR the currently - selected character(s) with other character(s) in either font. - The Button will turn RED, indicating that it is waiting for - you to click on the desired character (or upper left corner - of the desired block of characters) in either the Red or Green - Character Set Displays. Clicking anywhere else will abort this - process without doing anything. If you click on (any of) the - selected character(s) the operation is aborted. If a block is - selected and the character you click on is in a position where - it can't represent the upper left corner of a block of the same - size, then the operation is not performed. - - AND Button & OR Button: These buttons work just like the XOR Button - except that the Binary operation performed is either an AND or OR - depending upon which button you have selected. - - COPY Button: This button lets you copy a character or selected block - of characters to another area in the current font or the other - font. After clicking, the button turns RED and works much like - the XOR Button. Clicking on a valid position in either font - window will copy the selected character(s) to that location. - - MODE Button: Clicking this button toggles the editor between BLOCK - mode and CHARACTER mode. The current mode is displayed on a plate - at the top of the screen, just to the right of the enlarged - character grid. In character mode the plate will read "CHAR" and - the currently selected character is displayed just to the right - of the plate. In Block mode the plate will read "BLOCK" and the - enlarged character grid is disabled. - - UNDO Button: Clicking this Button will UNDO or reverse the effects of - the most recent operation. - - QUIT Button: Clicking this button will return you to DOS. Any loaded - fonts are not saved, and no confirmation is given. - - - GREEN FONT AREA: This area displays one of the current fonts which - can be edited. The characters are display in order from #0 to #127 - from the upper left, going right, then down. The Font Box is 32 - characters wide and 4 characters Tall. When the editor is in - character mode, just point at and Left Click on the character you - wish to edit and a Cyan box will appear around that character. - - * If you Right Click on a character, the last current character, - which will still appear in the enlarged character grid, will be - copied onto the character you pointed at, replacing it. This is - a shortcut for copying characters: You can hold the right button - down an fill in a large area with a single character pattern. - When the editor is in Block Mode, you select an area by clicking - on any corner of the desired block. Then drag the mouse to the - opposite corner while holding down the left button. A Cyan Box - will stretch to surround the selected block of characters. - - GREEN FONT FILE NAME BOX: This Text Box is used to enter the name - of a font file to load or the name to save the current Green font - as. Just click on the Box, and it will change color and a - flashing cursor will appear. Now you type in a filename or edit - the existing filename. Press <RETURN> or click outside the text - box to end editing. - - GREEN FONT LOAD BUTTON: Clicking this button will load the font file - that is named in the Green File name box. If no name is given or - no such file exists, then nothing will be loaded. - - GREEN FONT SAVE BUTTON: Clicking this button will save the current - font in the Green Font Area under the name given in the File Name - Box. If a Valid name is not provided, nothing will be saved. - - RED FONT AREA: This is just the same as the GREEN FONT AREA; providing - you with the ability to copy and edit between multiple fonts. - - RED FONT FILE NAME BOX: This works just like the GREEN FONT FILE - NAME BOX. - - RED FONT LOAD BUTTON: This works just like the GREEN FONT LOAD BUTTON. - - RED FONT SAVE BUTTON: This works just like the GREEN FONT SAVE BUTTON. - - Message Bar: At the very bottom of the screen, this Bar will display - information and messages for various functions. - - -FONT FILE FORMAT: - - BINARY Image, in order of character. The format is identical to that - used by the VGA ROM. The Files will be exactly 1024 (128 * 8) bytes - long. - - CHARACTER: 8 Bytes - - FONT: Array (0 to 127) of CHARACTER - - -COMMENTS, QUESTIONS, BUG REPORTS, etc: - - Send the to the Author: Matt Pritchard - - Through the 80xxx Fidonet Echo or - - Matt Pritchard - P.O. Box 140264 - Irving, TX 75014 - -CREDITS: - - This Font Editor was written in QuickBASIC 4.5 - diff --git a/modex105/FONTEDIT/CSEDIT.EXE b/modex105/FONTEDIT/CSEDIT.EXE deleted file mode 100755 index 58b073253ada69b3f089a2f3b359049195178db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68368 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 diff --git a/modex105/FONTEDIT/INVERSE.FNT b/modex105/FONTEDIT/INVERSE.FNT deleted file mode 100755 index 5901c517930e7554ab63b7ba590a2500146d6a5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmYjPv1%JZ5Y2LhNo7<SHxb5#Q4xZ;YC&efpigiW6iA~^=^Wy~MP3$jxN>n#42Js< zN5tZaZ30&s(uCk*Np+Ybh{Gr^Z&oH`(CIO|J8x#*46reOGaJutJp4_TWyEUn=H2^` zi>lY_K|bX9`T2T@{?5*CK|A_H8(BM=9vw|bRxvEg6x8X-%ZZ>qo*nDx&nAZox8H8- z`f|H}c71kz{dw0^i|L!`qQbntrMCKWtRI$Y`LIT)YzVdrDjSc-<muY5JAA7UULU^r zvwlSQ{^i5`>kl;EHO@DJ%6r!By^4NFR1$bzTV?A8kE^CxtyT^03RT<zE}KkPsB_uL ziQrTFsKrp@>MD)r;;Kx1FIUr7U<hPu?J@P)tFPcP86A--z^<3bC5JgR}hD_`)6 zU4+dOki6uHiUIP+Ozf*J%^Xhafz}Se2b!fX7mC>3cRWwiRFN5pF<Wh#BPXUrr8_Z+ zm!F{RI<`aZ|GrY#q`sJ*6^O$l;b#YdI2i1kT;jFT8j05Oqi>8MFCAI}#k|IFo)L}Q z4<+v=OoPqF`hT)msZ*y1+XtxzS!fA#Pq9x8z58744Ry>X@sf-WqQ5t^(U&;#yN>r8 z-XM8sDq_L8(;289`E=n6@=~W<Ca9vY)UOnCFw$_hhLgHl$9*aEzc~QUIJ_s<byizQ zvC=Q30_La2meNLF8HcJYa}v|f)6}&bhs=XJLosPU%hhNLZ%h;beJP{N`MwYVh*43Z zV+*o=;wJ`R8jcWHN`Tx`0GVeJHxtq!b&Z&F#_W8cWYMAkn{(DfK8`oRJ$J6I?_*I? T*Ja?`!zC{E`BY4Vpq_sLE%j_+ diff --git a/modex105/FONTEDIT/MOUSEIMG.CS b/modex105/FONTEDIT/MOUSEIMG.CS deleted file mode 100755 index 101e2084b44a2da8647ea004e20ffc599897dc29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmXwwyA6Xt5JVqBG8vc(jsUrhb3`33!65-+x3nvTG6*aUE5LfeXnx8{>eQ%KC5%j> xL+EL<?e+uSeE2f6uwrh-LMI;70g|>0E7_Ch82ppy6n|(>dLPTn2m0He)d4^WFp&TN diff --git a/modex105/FONTEDIT/PALETTE.CS b/modex105/FONTEDIT/PALETTE.CS deleted file mode 100755 index 09c5549e4967dcb520ae894bd5116c0b530b4304..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmZva!HUBm5J2Y=2%RO`noI*WHGwcK1qscTHe1-8|NpDio)pxF%6pnq0K&M13AbBZ z!q&xO7l(w|iNxizg=4r~RaITrh}bmEe!p+qw(tAX=`@bxJkQtb)qB6L>$Yv5`=UV{ z$O7SUU=eTvI(#S%i7f}`<l<y;@^T`Pm$*gTMe>l?a`0a6UY=gwUL^7s{}g|hJS4Up z0C)#%fCpfX3=D>0$9YI>IT*u7!-L_;Fh?df1Dhk~A+hCPEuSq<mS@Wxnb}Tk&zy(E zmIDA)KnSFPD543FprSk^wj2<tLDEPDi6Vwj6E>8G#Fm3nq!k?$b&4p`kvfpll!wHY YgKmDmA2t3h8~nUSZ1J&%-%)-20~L%`_y7O^ diff --git a/modex105/FONTEDIT/ROM_8X8.FNT b/modex105/FONTEDIT/ROM_8X8.FNT deleted file mode 100755 index 708a4f924815cedc3c5e179b42a7cc9d9c492625..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmYLIv1%hR5FJwF8j-jZ*rdt_40l(kSRBY_q!RI=OQFJ*5!~J;?(YN6A8>zgZD7H$ zl}MQ;#%yJGAywF7(cT+v;Ks<K8I9h|ywMVkQmy~2A2;i&8eWF&aj1MssWcOsm@;cq z8gZ19(NPlVqR>RcaNHt(pu$~WyMl)8=J9c}9nL?U|BNw)!Z}yyN?(1sVqU(r_lx_* z;`^cA+!V)SakF`7yVSK0baFON^RpA6R$5nu#x>{2(f!NIkLh$u^M&!=#30pHRh8oq zHspA%Nkd?xER_@#u}zjGx~}U4b?F9o35^S=RtnGI*k$1mn2E`IpKb3GexA6jgX#d( zM9r=t<IQRpS7dFS<1|}qSreAVp2!tL;c&#<18@|U1L{94IipjB==y=m=4t<aD2bO0 z=_y2IY#g;hyR*W_q%NqhJ0-TUbq89hj{pEpfFU;iN~M<>Tkt=Yl`K+UPLB$(m&}q! zOTT5a-|y={41hjH>YXc{>oHF7hIw`#bMPId+q-agn?`Nl^7)gS6K0HSk-#1#(1k*o zsOR8(@a`b&LwagnQ+jS1Y7X!FCurlFrtv1{v%o|8xC^sv%e@fW<xKkgJL2LP(n~(T zGvW4gdIcUpfF*vE5GXaj^k<hSU@X=KlIGRv2?co|I^aDc_`eLCxe-TDCFa^%i~e_F z#~S%(3U2tt?!lAs_D$*~S_$J_YyHZhUZ!R4U(rZFYlVPA_DWquQ3!zUq=SqnJQ3}{ zxBzCn3)m}{@$<u@375=YWqxu^>VQK3c#zL2$y)^hxh42f59a)vzx6a@ZkcEDUF0PO NT(pwbM1+VY(Lc=|finOA diff --git a/modex105/FONTEDIT/SPACEAGE.FNT b/modex105/FONTEDIT/SPACEAGE.FNT deleted file mode 100755 index 029bae4effb181a29f61b17c588cd848bc04e82a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmYLHJ!|7Y5S<X%G(lFmg&-;P1Gd~kBw+GG`~%FP>bOEUxqr5pFqLs>t~iV;RY!1j zs1T!jZ)J0X<+nTE^JYaBxj=YYL5MSiNTH5);!SAhnReQ4LLJYv6KTJliL?`M0<-sY zlBTX3z-|rM$^0|Re0Tq_dU}1IKT>}gC!1%R#!H_*=J(g9)x-T=89OV>Qc7Q0<$+~s zT?B^K+E5~)uWJ_Y^?HqizX~+}2c+5i7$wSfTjM6OHRDgBC36-<k5z03mF}$@Plvzo zXKs<W*|cqo$j8U3s-lR-uc$D1zq<}562dby6TU@45LX~ypTzWZI;k!7(SfP6elRiT zUW&p*Rjnurv6O(&0|(mGK@GiX2Nz=YLoL?3eb21Y#tL=egMXY^nei{2*YtcoC&OHC zw%_k%`ux1+Pd)pXREJ@hSa<CETp!pYE`6~N_6G;C5Mqob&Y`a(^@s5f^eG_^<1i)t zmVEHfd6&MIe0n@0j&mST?1*`J&w0WB)gO5Hb?JErajdhATUFi-4Itii?7Pc*=_GOb z!bz9+(@6>M>lO%e$Zv$loio%!zj=P}rObnQjD6ug80Nsfe_-MHKA77r{sZ_H5+LHR z+TvT2QYL`;Fy2UiFu>AN=7IUiA5jg2X2e2eWB~Ob0QN8~c`@PQf5`LWp@9I#X99p= h7cUiYAi$&vVG}~bcO~qr4Z(-d%J<)JrH}|U`3JE0#Z>?R diff --git a/modex105/FONTEDIT/SYSTEM.FNT b/modex105/FONTEDIT/SYSTEM.FNT deleted file mode 100755 index 9a1965ebfe5bd67bea71c313ef7ef2f78aa6fbb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmYjPv1%JZ5PcEm5aBRag)K}-6L5KuW{X1(ia+GQkTh4gGKX2#%0V3BF6z_-EK>Os z1ct?etqu`V2p7gEjd3Mh1sBIAZ&oH`(CIO|J8x#*46rf1Kc0>EHS~VdG{j<f{`JeJ zVX<DXAs_1c__#N~>i+(@pq+oD&8?kJE-xo@8yMC!0paxQ=Ty*Nj4yoj$J48Ty*GP# ze)zCDIXF2u_;BZn;pBWWEHGL<hR4+iz3o95Z1<oFtCTHNXlAn+d6HD!ExrY)?^nN` z^|qj1zxzCT`wE#hnbDbG(3*8?9ip$g&?%nhHrPDFRzJ)7{eFhsDpb3GX{J*aYD{x> zCiv7oaxvt1|Gte!6`zNyLS}!M7hMM5s=V~4(3L*AX^)VmD!xk<<5UWMJj#Je2VL=s zU8v0yki6tchyn7)OzbN!-3Z3}rS}F(E1IP*7lD}UBs_21Hjo*ebB}3Tqb9b*;1e;4 zm!F_b61GF`|GrY#q`sJ*6^O$l;b#YmxLn@2TH<~19-a5{qwky}FCAKkz`V|Jo)Mkg zFC_0K%!AFw`d_kGsnfUD57(^+S!f;nI<QX<fA>4wE_}=<@sf-WqJO)v(U&;#n}qip zUL|>GA!5b3(^-Z!`Fy1-@=~W-CK#fy)UOmXaMEzngOR#Y!+ojzzc~PZIJ_s<B-UF< zvC=Q30_La2meNK)ID?`rYZBA1+t#EUhs=XJLosPU%GF3K?OYT9D=DL_`MweXh*43Z zVGFW;;&%>U8jcVcNPyf^0GVeOHxtq!b&Xha#_W6<WYMAkn{(DfK90A;4tFlkcVbae T*P-Iv)gg{<_*6`Upq_sLPqB~A diff --git a/modex105/MODE-X.TXT b/modex105/MODE-X.TXT deleted file mode 100755 index 4e18d962..00000000 --- a/modex105/MODE-X.TXT +++ /dev/null @@ -1,44 +0,0 @@ -The following is a FAQ (Frequently Asked Question) summary of -information and assembly routines for Mode "X" Graphics. - -An overview of Mode "X" for the VGA Adaptor: - -1) Mode "X" is a 256 color graphics mode that is available on *ANY* VGA -card with the minimum of 256K video RAM. It is capable of providing -higher resoultions than the only "Official" 256 color mode, mode 13h. -(In quickbasic that is mode 13) - -2) Mode "X" comes in 8 different flavors: 320 or 360 pixels -horizontally, and 200, 240, 400, and 480 pixels vertically. - -3) Since mode X is not supported by the VGA BIOS, there is no built in -support for it. A program must provide its own routines for *ALL* -operations in Mode "X", including setting up the video mode. - -4) Unlike Mode 13h, which has one display page, Mode "X" allows from 1 -to 4 video pages, depending upon the resoultion selected. The reason -that Mode 13h has but one page is that it activates a VGA hardware -feature known as CHAIN4, which prevents access to all but 64K of VGA's -video RAM. CHAIN4 is what provides mode 13h's linear addres space. - -5) Unlike Mode 13h, where each 256 color (1-byte) pixel has a unique -address in the E000: segement, in Mode X there are Four (4) Pixels -at each address in E000: segment. The VGA's control registers allow you -to control which of the 4 pixels is currently available at an address. - -6) It is possible to use the VGA's control registers to operate on 2 or -more of the Pixels at the same address at the same time. The CPU can -write one color value, and set up to 4 pixels with that value at the -same time. - -7) Video RAM that is not being used for the current screen display can -be used to store images and patterns. These images and patterns can be -copied to other parts of the Video RAM 4 bytes (32 bits) at a time, -which is much faster than the 8 bits (1 byte) at time that is possible -over the ISA BUS. (16 Bit BUS operations can produce erroneous results) - -If anything is unclear, inadequate, or you just plain want to know more -or have other specific questions, please send me a message. - - --Matt Pritchard diff --git a/modex105/MODEX.ASM b/modex105/MODEX.ASM deleted file mode 100755 index 2985fd80..00000000 --- a/modex105/MODEX.ASM +++ /dev/null @@ -1,3295 +0,0 @@ -;======================================================== -; MODEX.ASM - A Complete Mode X Library -; -; Version 1.04 Release, 3 May 1993, By Matt Pritchard -; With considerable input from Michael Abrash -; -; The following information is donated to the public domain in -; the hopes that save other programmers much frustration. -; -; If you do use this code in a product, it would be nice if -; you include a line like "Mode X routines by Matt Pritchard" -; in the credits. -; -; ========================================================= -; -; All of this code is designed to be assembled with MASM 5.10a -; but TASM 3.0 could be used as well. -; -; The routines contained are designed for use in a MEDIUM model -; program. All Routines are FAR, and is assumed that a DGROUP -; data segment exists and that DS will point to it on entry. -; -; For all routines, the AX, BX, CX, DX, ES and FLAGS registers -; will not be preserved, while the DS, BP, SI and DI registers -; will be preserved. -; -; Unless specifically noted, All Parameters are assumed to be -; "PASSED BY VALUE". That is, the actual value is placed on -; the stack. When a reference is passed it is assumed to be -; a near pointer to a variable in the DGROUP segment. -; -; Routines that return a single 16-Bit integer value will -; return that value in the AX register. -; -; This code will *NOT* run on an 8086/8088 because 80286+ -; specific instructions are used. If you have an 8088/86 -; and VGA, you can buy an 80386-40 motherboard for about -; $160 and move into the 90's. -; -; This code is reasonably optimized: Most drawing loops have -; been unrolled once and memory references are minimized by -; keeping stuff in registers when possible. -; -; Error Trapping varies by Routine. No Clipping is performed -; so the caller should verify that all coordinates are valid. -; -; Several Macros are used to simplify common 2 or 3 instruction -; sequences. Several Single letter Text Constants also -; simplify common assembler expressions like "WORD PTR". -; -; ------------------ Mode X Variations ------------------ -; -; Mode # Screen Size Max Pages Aspect Ratio (X:Y) -; -; 0 320 x 200 4 Pages 1.2:1 -; 1 320 x 400 2 Pages 2.4:1 -; 2 360 x 200 3 Pages 1.35:1 -; 3 360 x 400 1 Page 2.7:1 -; 4 320 x 240 3 Pages 1:1 -; 5 320 x 480 1 Page 2:1 -; 6 360 x 240 3 Pages 1.125:1 -; 7 360 x 480 1 Page 2.25:1 -; -; -------------------- The Legal Stuff ------------------ -; -; No warranty, either written or implied, is made as to -; the accuracy and usability of this code product. Use -; at your own risk. Batteries not included. Pepperoni -; and extra cheese available for an additional charge. -; -; ----------------------- The Author -------------------- -; -; Matt Pritchard is a paid programmer who'd rather be -; writing games. He can be reached at: P.O. Box 140264, -; Irving, TX 75014 USA. Michael Abrash is a living -; god, who now works for Bill Gates (Microsoft). -; -; -------------------- Revision History ----------------- -; 4-12-93: v1.02 - SET_POINT & READ_POINT now saves DI -; SET_MODEX now saves SI -; 5-3-93: v1.04 - added LOAD_DAC_REGISTERS and -; READ_DAC_REGISTERS. Expanded CLR Macro -; to handle multiple registers -; - - PAGE 255, 132 - - .MODEL Medium - .286 - - ; ===== MACROS ===== - - ; Macro to OUT a 16 bit value to an I/O port - -OUT_16 MACRO Register, Value - IFDIFI <Register>, <DX> ; If DX not setup - MOV DX, Register ; then Select Register - ENDIF - IFDIFI <Value>, <AX> ; If AX not setup - MOV AX, Value ; then Get Data Value - ENDIF - OUT DX, AX ; Set I/O Register(s) -ENDM - - ; Macro to OUT a 8 bit value to an I/O Port - -OUT_8 MACRO Register, Value - IFDIFI <Register>, <DX> ; If DX not setup - MOV DX, Register ; then Select Register - ENDIF - IFDIFI <Value>, <AL> ; If AL not Setup - MOV AL, Value ; then Get Data Value - ENDIF - OUT DX, AL ; Set I/O Register -ENDM - - ; macros to PUSH and POP multiple registers - -PUSHx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - PUSH R1 ; Save R1 - PUSHx R2, R3, R4, R5, R6, R7, R8 - ENDIF -ENDM - -POPx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - POP R1 ; Restore R1 - POPx R2, R3, R4, R5, R6, R7, R8 - ENDIF -ENDM - - ; Macro to Clear Registers to 0 - -CLR MACRO Register, R2, R3, R4, R5, R6 - IFNB <Register> - XOR Register, Register ; Set Register = 0 - CLR R2, R3, R4, R5, R6 - ENDIF -ENDM - - ; Macros to Decrement Counter & Jump on Condition - -LOOPx MACRO Register, Destination - DEC Register ; Counter-- - JNZ Destination ; Jump if not 0 -ENDM - -LOOPjz MACRO Register, Destination - DEC Register ; Counter-- - JZ Destination ; Jump if 0 -ENDM - - - ; ===== General Constants ===== - - False EQU 0 - True EQU -1 - nil EQU 0 - - b EQU BYTE PTR - w EQU WORD PTR - d EQU DWORD PTR - o EQU OFFSET - f EQU FAR PTR - s EQU SHORT - ?x4 EQU <?,?,?,?> - ?x3 EQU <?,?,?> - - ; ===== VGA Register Values ===== - - VGA_Segment EQU 0A000h ; Vga Memory Segment - - ATTRIB_Ctrl EQU 03C0h ; VGA Attribute Controller - GC_Index EQU 03CEh ; VGA Graphics Controller - SC_Index EQU 03C4h ; VGA Sequencer Controller - SC_Data EQU 03C5h ; VGA Sequencer Data Port - CRTC_Index EQU 03D4h ; VGA CRT Controller - CRTC_Data EQU 03D5h ; VGA CRT Controller Data - MISC_OUTPUT EQU 03C2h ; VGA Misc Register - INPUT_1 EQU 03DAh ; Input Status #1 Register - - DAC_WRITE_ADDR EQU 03C8h ; VGA DAC Write Addr Register - DAC_READ_ADDR EQU 03C7h ; VGA DAC Read Addr Register - PEL_DATA_REG EQU 03C9h ; VGA DAC/PEL data Register R/W - - PIXEL_PAN_REG EQU 033h ; Attrib Index: Pixel Pan Reg - MAP_MASK EQU 002h ; Sequ Index: Write Map Mask reg - READ_MAP EQU 004h ; GC Index: Read Map Register - START_DISP_HI EQU 00Ch ; CRTC Index: Display Start Hi - START_DISP_LO EQU 00Dh ; CRTC Index: Display Start Lo - - MAP_MASK_PLANE1 EQU 00102h ; Map Register + Plane 1 - MAP_MASK_PLANE2 EQU 01102h ; Map Register + Plane 1 - ALL_PLANES_ON EQU 00F02h ; Map Register + All Bit Planes - - CHAIN4_OFF EQU 00604h ; Chain 4 mode Off - ASYNC_RESET EQU 00100h ; (A)synchronous Reset - SEQU_RESTART EQU 00300h ; Sequencer Restart - - LATCHES_ON EQU 00008h ; Bit Mask + Data from Latches - LATCHES_OFF EQU 0FF08h ; Bit Mask + Data from CPU - - VERT_RETRACE EQU 08h ; INPUT_1: Vertical Retrace Bit - PLANE_BITS EQU 03h ; Bits 0-1 of Xpos = Plane # - ALL_PLANES EQU 0Fh ; All Bit Planes Selected - CHAR_BITS EQU 0Fh ; Bits 0-3 of Character Data - - GET_CHAR_PTR EQU 01130h ; VGA BIOS Func: Get Char Set - ROM_8x8_Lo EQU 03h ; ROM 8x8 Char Set Lo Pointer - ROM_8x8_Hi EQU 04h ; ROM 8x8 Char Set Hi Pointer - - ; Constants Specific for these routines - - NUM_MODES EQU 8 ; # of Mode X Variations - - ; Specific Mode Data Table format... - -Mode_Data_Table STRUC - M_MiscR DB ? ; Value of MISC_OUTPUT register - M_Pages DB ? ; Maximum Possible # of pages - M_XSize DW ? ; X Size Displayed on screen - M_YSize DW ? ; Y Size Displayed on screen - M_XMax DW ? ; Maximum Possible X Size - M_YMax DW ? ; Maximum Possible Y Size - M_CRTC DW ? ; Table of CRTC register values -Mode_Data_Table ENDS - - ; ===== DGROUP STORAGE NEEDED (42 BYTES) ===== - - .DATA? - -SCREEN_WIDTH DW 0 ; Width of a line in Bytes -SCREEN_HEIGHT DW 0 ; Vertical Height in Pixels - -LAST_PAGE DW 0 ; # of Display Pages -PAGE_ADDR DW 4 DUP (0) ; Offsets to start of each page - -PAGE_SIZE DW 0 ; Size of Page in Addr Bytes - -DISPLAY_PAGE DW 0 ; Page # currently displayed -ACTIVE_PAGE DW 0 ; Page # currently active - -CURRENT_PAGE DW 0 ; Offset of current Page -CURRENT_SEGMENT DW 0 ; Segment of VGA memory - -CURRENT_XOFFSET DW 0 ; Current Display X Offset -CURRENT_YOFFSET DW 0 ; Current Display Y Offset - -CURRENT_MOFFSET DW 0 ; Current Start Offset - -MAX_XOFFSET DW 0 ; Current Display X Offset -MAX_YOFFSET DW 0 ; Current Display Y Offset - -CHARSET_LOW DW 0, 0 ; Far Ptr to Char Set: 0-127 -CHARSET_HI DW 0, 0 ; Far Ptr to Char Set: 128-255 - - .CODE - - ; ===== DATA TABLES ===== - - ; Data Tables, Put in Code Segment for Easy Access - ; (Like when all the other Segment Registers are in - ; use!!) and reduced DGROUP requirements... - - ; Bit Mask Tables for Left/Right/Character Masks - -Left_Clip_Mask DB 0FH, 0EH, 0CH, 08H - -Right_Clip_Mask DB 01H, 03H, 07H, 0FH - - ; Bit Patterns for converting character fonts - -Char_Plane_Data DB 00H,08H,04H,0CH,02H,0AH,06H,0EH - DB 01H,09H,05H,0DH,03H,0BH,07H,0FH - - ; CRTC Register Values for Various Configurations - -MODE_Single_Line: ; CRTC Setup Data for 400/480 Line modes - DW 04009H ; Cell Height (1 Scan Line) - DW 00014H ; Dword Mode off - DW 0E317H ; turn on Byte Mode - DW nil ; End of CRTC Data for 400/480 Line Mode - -MODE_Double_Line: ; CRTC Setup Data for 200/240 Line modes - DW 04109H ; Cell Height (2 Scan Lines) - DW 00014H ; Dword Mode off - DW 0E317H ; turn on Byte Mode - DW nil ; End of CRTC Data for 200/240 Line Mode - -MODE_320_Wide: ; CRTC Setup Data for 320 Horz Pixels - DW 05F00H ; Horz total - DW 04F01H ; Horz Displayed - DW 05002H ; Start Horz Blanking - DW 08203H ; End Horz Blanking - DW 05404H ; Start H Sync - DW 08005H ; End H Sync - DW nil ; End of CRTC Data for 320 Horz pixels - -MODE_360_Wide: ; CRTC Setup Data for 360 Horz Pixels - DW 06B00H ; Horz total - DW 05901H ; Horz Displayed - DW 05A02H ; Start Horz Blanking - DW 08E03H ; End Horz Blanking - DW 05E04H ; Start H Sync - DW 08A05H ; End H Sync - DW nil ; End of CRTC Data for 360 Horz pixels - -MODE_200_Tall: -MODE_400_Tall: ; CRTC Setup Data for 200/400 Line modes - DW 0BF06H ; Vertical Total - DW 01F07H ; Overflow - DW 09C10H ; V Sync Start - DW 08E11H ; V Sync End/Prot Cr0 Cr7 - DW 08F12H ; Vertical Displayed - DW 09615H ; V Blank Start - DW 0B916H ; V Blank End - DW nil ; End of CRTC Data for 200/400 Lines - -MODE_240_Tall: -MODE_480_Tall: ; CRTC Setup Data for 240/480 Line modes - DW 00D06H ; Vertical Total - DW 03E07H ; Overflow - DW 0EA10H ; V Sync Start - DW 08C11H ; V Sync End/Prot Cr0 Cr7 - DW 0DF12H ; Vertical Displayed - DW 0E715H ; V Blank Start - DW 00616H ; V Blank End - DW nil ; End of CRTC Data for 240/480 Lines - - ; Table of Display Mode Tables - -MODE_TABLE: - DW o MODE_320x200, o MODE_320x400 - DW o MODE_360x200, o MODE_360x400 - DW o MODE_320x240, o MODE_320x480 - DW o MODE_360x240, o MODE_360x480 - - ; Table of Display Mode Components - -MODE_320x200: ; Data for 320 by 200 Pixels - - DB 063h ; 400 scan Lines & 25 Mhz Clock - DB 4 ; Maximum of 4 Pages - DW 320, 200 ; Displayed Pixels (X,Y) - DW 1302, 816 ; Max Possible X and Y Sizes - - DW o MODE_320_Wide, o MODE_200_Tall - DW o MODE_Double_Line, nil - -MODE_320x400: ; Data for 320 by 400 Pixels - - DB 063h ; 400 scan Lines & 25 Mhz Clock - DB 2 ; Maximum of 2 Pages - DW 320, 400 ; Displayed Pixels X,Y - DW 648, 816 ; Max Possible X and Y Sizes - - DW o MODE_320_Wide, o MODE_400_Tall - DW o MODE_Single_Line, nil - -MODE_360x240: ; Data for 360 by 240 Pixels - - DB 0E7h ; 480 scan Lines & 28 Mhz Clock - DB 3 ; Maximum of 3 Pages - DW 360, 240 ; Displayed Pixels X,Y - DW 1092, 728 ; Max Possible X and Y Sizes - - DW o MODE_360_Wide, o MODE_240_Tall - DW o MODE_Double_Line , nil - -MODE_360x480: ; Data for 360 by 480 Pixels - - DB 0E7h ; 480 scan Lines & 28 Mhz Clock - DB 1 ; Only 1 Page Possible - DW 360, 480 ; Displayed Pixels X,Y - DW 544, 728 ; Max Possible X and Y Sizes - - DW o MODE_360_Wide, o MODE_480_Tall - DW o MODE_Single_Line , nil - -MODE_320x240: ; Data for 320 by 240 Pixels - - DB 0E3h ; 480 scan Lines & 25 Mhz Clock - DB 3 ; Maximum of 3 Pages - DW 320, 240 ; Displayed Pixels X,Y - DW 1088, 818 ; Max Possible X and Y Sizes - - DW o MODE_320_Wide, o MODE_240_Tall - DW o MODE_Double_Line, nil - -MODE_320x480: ; Data for 320 by 480 Pixels - - DB 0E3h ; 480 scan Lines & 25 Mhz Clock - DB 1 ; Only 1 Page Possible - DW 320, 480 ; Displayed Pixels X,Y - DW 540, 818 ; Max Possible X and Y Sizes - - DW o MODE_320_WIDE, o MODE_480_Tall - DW o MODE_Single_Line, nil - -MODE_360x200: ; Data for 360 by 200 Pixels - - DB 067h ; 400 scan Lines & 28 Mhz Clock - DB 3 ; Maximum of 3 Pages - DW 360, 200 ; Displayed Pixels (X,Y) - DW 1302, 728 ; Max Possible X and Y Sizes - - DW o MODE_360_Wide, MODE_200_Tall - DW o MODE_Double_Line, nil - -MODE_360x400: ; Data for 360 by 400 Pixels - - DB 067h ; 400 scan Lines & 28 Mhz Clock - DB 1 ; Maximum of 1 Pages - DW 360, 400 ; Displayed Pixels X,Y - DW 648, 816 ; Max Possible X and Y Sizes - - DW o MODE_360_Wide, MODE_400_Tall - DW o MODE_Single_Line, nil - - - ; ===== MODE X SETUP ROUTINES ===== - -;====================================================== -;SET_VGA_MODEX% (ModeType%, MaxXPos%, MaxYpos%, Pages%) -;====================================================== -; -; Sets Up the specified version of Mode X. Allows for -; the setup of multiple video pages, and a virtual -; screen which can be larger than the displayed screen -; (which can then be scrolled a pixel at a time) -; -; ENTRY: ModeType = Desired Screen Resolution (0-7) -; -; 0 = 320 x 200, 4 Pages max, 1.2:1 Aspect Ratio -; 1 = 320 x 400, 2 Pages max, 2.4:1 Aspect Ratio -; 2 = 360 x 200, 3 Pages max, 1.35:1 Aspect Ratio -; 3 = 360 x 400, 1 Page max, 2.7:1 Aspect Ratio -; 4 = 320 x 240, 3 Pages max, 1:1 Aspect Ratio -; 5 = 320 x 480, 1 Page max, 2:1 Aspect Ratio -; 6 = 360 x 240, 3 Pages max, 1.125:1 Aspect Ratio -; 7 = 360 x 480, 1 Page max, 2.25:1 Aspect Ratio -; -; MaxXpos = The Desired Virtual Screen Width -; MaxYpos = The Desired Virtual Screen Height -; Pages = The Desired # of Video Pages -; -; EXIT: AX = Success Flag: 0 = Failure / -1= Success -; - -SVM_STACK STRUC - SVM_Table DW ? ; Offset of Mode Info Table - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - SVM_Pages DW ? ; # of Screen Pages desired - SVM_Ysize DW ? ; Vertical Screen Size Desired - SVM_Xsize DW ? ; Horizontal Screen Size Desired - SVM_Mode DW ? ; Display Resolution Desired -SVM_STACK ENDS - - PUBLIC SET_VGA_MODEX - -SET_VGA_MODEX PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - SUB SP, 2 ; Allocate workspace - MOV BP, SP ; Set up Stack Frame - - ; Check Legality of Mode Request.... - - MOV BX, [BP].SVM_Mode ; Get Requested Mode # - CMP BX, NUM_MODES ; Is it 0..7? - JAE @SVM_BadModeSetup ; If Not, Error out - - SHL BX, 1 ; Scale BX - MOV SI, w MODE_TABLE[BX] ; CS:SI -> Mode Info - MOV [BP].SVM_Table, SI ; Save ptr for later use - - ; Check # of Requested Display Pages - - MOV CX, [BP].SVM_Pages ; Get # of Requested Pages - CLR CH ; Set Hi Word = 0! - CMP CL, CS:[SI].M_Pages ; Check # Pages for mode - JA @SVM_BadModeSetup ; Report Error if too Many Pages - JCXZ @SVM_BadModeSetup ; Report Error if 0 Pages - - ; Check Validity of X Size - - AND [BP].SVM_XSize, 0FFF8h ; X size Mod 8 Must = 0 - - MOV AX, [BP].SVM_XSize ; Get Logical Screen Width - CMP AX, CS:[SI].M_XSize ; Check against Displayed X - JB @SVM_BadModeSetup ; Report Error if too small - CMP AX, CS:[SI].M_XMax ; Check against Max X - JA @SVM_BadModeSetup ; Report Error if too big - - ; Check Validity of Y Size - - MOV BX, [BP].SVM_YSize ; Get Logical Screen Height - CMP BX, CS:[SI].M_YSize ; Check against Displayed Y - JB @SVM_BadModeSetup ; Report Error if too small - CMP BX, CS:[SI].M_YMax ; Check against Max Y - JA @SVM_BadModeSetup ; Report Error if too big - - ; Enough memory to Fit it all? - - SHR AX, 2 ; # of Bytes:Line = XSize/4 - MUL CX ; AX = Bytes/Line * Pages - MUL BX ; DX:AX = Total VGA mem needed - JNO @SVM_Continue ; Exit if Total Size > 256K - - DEC DX ; Was it Exactly 256K??? - OR DX, AX ; (DX = 1, AX = 0000) - JZ @SVM_Continue ; if so, it's valid... - -@SVM_BadModeSetup: - - CLR AX ; Return Value = False - JMP @SVM_Exit ; Normal Exit - -@SVM_Continue: - - MOV AX, 13H ; Start with Mode 13H - INT 10H ; Let BIOS Set Mode - - OUT_16 SC_INDEX, CHAIN4_OFF ; Disable Chain 4 Mode - OUT_16 SC_INDEX, ASYNC_RESET ; (A)synchronous Reset - OUT_8 MISC_OUTPUT, CS:[SI].M_MiscR ; Set New Timing/Size - OUT_16 SC_INDEX, SEQU_RESTART ; Restart Sequencer ... - - OUT_8 CRTC_INDEX, 11H ; Select Vert Retrace End Register - INC DX ; Point to Data - IN AL, DX ; Get Value, Bit 7 = Protect - AND AL, 7FH ; Mask out Write Protect - OUT DX, AL ; And send it back - - MOV DX, CRTC_INDEX ; Vga Crtc Registers - ADD SI, M_CRTC ; SI -> CRTC Parameter Data - - ; Load Tables of CRTC Parameters from List of Tables - -@SVM_Setup_Table: - - MOV DI, CS:[SI] ; Get Pointer to CRTC Data Tbl - ADD SI, 2 ; Point to next Ptr Entry - OR DI, DI ; A nil Ptr means that we have - JZ @SVM_Set_Data ; finished CRTC programming - -@SVM_Setup_CRTC: - MOV AX, CS:[DI] ; Get CRTC Data from Table - ADD DI, 2 ; Advance Pointer - OR AX, AX ; At End of Data Table? - JZ @SVM_Setup_Table ; If so, Exit & get next Table - - OUT DX, AX ; Reprogram VGA CRTC reg - JMP s @SVM_Setup_CRTC ; Process Next Table Entry - - ; Initialize Page & Scroll info, DI = 0 - -@SVM_Set_Data: - MOV DISPLAY_PAGE, DI ; Display Page = 0 - MOV ACTIVE_PAGE, DI ; Active Page = 0 - MOV CURRENT_PAGE, DI ; Current Page (Offset) = 0 - MOV CURRENT_XOFFSET, DI ; Horz Scroll Index = 0 - MOV CURRENT_YOFFSET, DI ; Vert Scroll Index = 0 - MOV CURRENT_MOFFSET, DI ; Memory Scroll Index = 0 - - MOV AX, VGA_SEGMENT ; Segment for VGA memory - MOV CURRENT_SEGMENT, AX ; Save for Future LES's - - ; Set Logical Screen Width, X Scroll and Our Data - - MOV SI, [BP].SVM_Table ; Get Saved Ptr to Mode Info - MOV AX, [BP].SVM_Xsize ; Get Display Width - - MOV CX, AX ; CX = Logical Width - SUB CX, CS:[SI].M_XSize ; CX = Max X Scroll Value - MOV MAX_XOFFSET, CX ; Set Maximum X Scroll - - SHR AX, 2 ; Bytes = Pixels / 4 - MOV SCREEN_WIDTH, AX ; Save Width in Pixels - - SHR AX, 1 ; Offset Value = Bytes / 2 - MOV AH, 13h ; CRTC Offset Register Index - XCHG AL, AH ; Switch format for OUT - OUT DX, AX ; Set VGA CRTC Offset Reg - - ; Setup Data table, Y Scroll, Misc for Other Routines - - MOV AX, [BP].SVM_Ysize ; Get Logical Screen Height - - MOV CX, AX ; CX = Logical Height - SUB BX, CS:[SI].M_YSize ; CX = Max Y Scroll Value - MOV MAX_YOFFSET, CX ; Set Maximum Y Scroll - - MOV SCREEN_HEIGHT, AX ; Save Height in Pixels - MUL SCREEN_WIDTH ; AX = Page Size in Bytes, - MOV PAGE_SIZE, AX ; Save Page Size - - MOV CX, [BP].SVM_Pages ; Get # of Pages - MOV LAST_PAGE, CX ; Save # of Pages - - CLR BX ; Page # = 0 - MOV DX, BX ; Page 0 Offset = 0 - -@SVM_Set_Pages: - - MOV PAGE_ADDR[BX], DX ; Set Page #(BX) Offset - ADD BX, 2 ; Page#++ - ADD DX, AX ; Compute Addr of Next Page - LOOPx CX, @SVM_Set_Pages ; Loop until all Pages Set - - ; Clear VGA Memory - - OUT_16 SC_INDEX, ALL_PLANES_ON ; Select All Planes - LES DI, d CURRENT_PAGE ; -> Start of VGA memory - - CLR AX ; AX = 0 - CLD ; Block Xfer Forwards - MOV CX, 8000H ; 32K * 4 * 2 = 256K - REP STOSW ; Clear dat memory! - - ; Setup Font Pointers - - MOV BH, ROM_8x8_Lo ; Ask for 8x8 Font, 0-127 - MOV AX, GET_CHAR_PTR ; Service to Get Pointer - INT 10h ; Call VGA BIOS - - MOV CHARSET_LOW, BP ; Save Char Set Offset - MOV CHARSET_LOW+2, ES ; Save Char Set Segment - - MOV BH, ROM_8x8_Hi ; Ask for 8x8 Font, 128-255 - MOV AX, GET_CHAR_PTR ; Service to Get Pointer - INT 10h ; Call VGA BIOS - - MOV CHARSET_HI, BP ; Save Char Set Offset - MOV CHARSET_HI+2, ES ; Save Char Set Segment - - MOV AX, True ; Return Success Code - -@SVM_EXIT: - ADD SP, 2 ; Deallocate workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 8 ; Exit & Clean Up Stack - -SET_VGA_MODEX ENDP - - -;================== -;SET_MODEX% (Mode%) -;================== -; -; Quickie Mode Set - Sets Up Mode X to Default Configuration -; -; ENTRY: ModeType = Desired Screen Resolution (0-7) -; (See SET_VGA_MODEX for list) -; -; EXIT: AX = Success Flag: 0 = Failure / -1= Success -; - -SM_STACK STRUC - DW ?,? ; BP, SI - DD ? ; Caller - SM_Mode DW ? ; Desired Screen Resolution -SM_STACK ENDS - - PUBLIC SET_MODEX - -SET_MODEX PROC FAR - - PUSHx BP, SI ; Preserve Important registers - MOV BP, SP ; Set up Stack Frame - - CLR AX ; Assume Failure - MOV BX, [BP].SM_Mode ; Get Desired Mode # - CMP BX, NUM_MODES ; Is it a Valid Mode #? - JAE @SMX_Exit ; If Not, don't Bother - - PUSH BX ; Push Mode Parameter - - SHL BX, 1 ; Scale BX to word Index - MOV SI, w MODE_TABLE[BX] ; CS:SI -> Mode Info - - PUSH CS:[SI].M_XSize ; Push Default X Size - PUSH CS:[SI].M_Ysize ; Push Default Y size - MOV AL, CS:[SI].M_Pages ; Get Default # of Pages - CLR AH ; Hi Byte = 0 - PUSH AX ; Push # Pages - - CALL f SET_VGA_MODEX ; Set up Mode X! - -@SMX_Exit: - POPx SI, BP ; Restore Registers - RET 2 ; Exit & Clean Up Stack - -SET_MODEX ENDP - - - ; ===== BASIC GRAPHICS PRIMITIVES ===== - -;============================ -;CLEAR_VGA_SCREEN (ColorNum%) -;============================ -; -; Clears the active display page -; -; ENTRY: ColorNum = Color Value to fill the page with -; -; EXIT: No meaningful values returned -; - -CVS_STACK STRUC - DW ?,? ; DI, BP - DD ? ; Caller - CVS_COLOR DB ?,? ; Color to Set Screen to -CVS_STACK ENDS - - PUBLIC CLEAR_VGA_SCREEN - -CLEAR_VGA_SCREEN PROC FAR - - PUSHx BP, DI ; Preserve Important Registers - MOV BP, SP ; Set up Stack Frame - - OUT_16 SC_INDEX, ALL_PLANES_ON ; Select All Planes - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - MOV AL, [BP].CVS_COLOR ; Get Color - MOV AH, AL ; Copy for Word Write - CLD ; Block fill Forwards - - MOV CX, PAGE_SIZE ; Get Size of Page - SHR CX, 1 ; Divide by 2 for Words - REP STOSW ; Block Fill VGA memory - - POPx DI, BP ; Restore Saved Registers - RET 2 ; Exit & Clean Up Stack - -CLEAR_VGA_SCREEN ENDP - - -;=================================== -;SET_POINT (Xpos%, Ypos%, ColorNum%) -;=================================== -; -; Plots a single Pixel on the active display page -; -; ENTRY: Xpos = X position to plot pixel at -; Ypos = Y position to plot pixel at -; ColorNum = Color to plot pixel with -; -; EXIT: No meaningful values returned -; - -SP_STACK STRUC - DW ?,? ; BP, DI - DD ? ; Caller - SETP_Color DB ?,? ; Color of Point to Plot - SETP_Ypos DW ? ; Y pos of Point to Plot - SETP_Xpos DW ? ; X pos of Point to Plot -SP_STACK ENDS - - PUBLIC SET_POINT - -SET_POINT PROC FAR - - PUSHx BP, DI ; Preserve Registers - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - MOV AX, [BP].SETP_Ypos ; Get Line # of Pixel - MUL SCREEN_WIDTH ; Get Offset to Start of Line - - MOV BX, [BP].SETP_Xpos ; Get Xpos - MOV CX, BX ; Copy to extract Plane # from - SHR BX, 2 ; X offset (Bytes) = Xpos/4 - ADD BX, AX ; Offset = Width*Ypos + Xpos/4 - - MOV AX, MAP_MASK_PLANE1 ; Map Mask & Plane Select Register - AND CL, PLANE_BITS ; Get Plane Bits - SHL AH, CL ; Get Plane Select Value - OUT_16 SC_Index, AX ; Select Plane - - MOV AL,[BP].SETP_Color ; Get Pixel Color - MOV ES:[DI+BX], AL ; Draw Pixel - - POPx DI, BP ; Restore Saved Registers - RET 6 ; Exit and Clean up Stack - -SET_POINT ENDP - - -;========================== -;READ_POINT% (Xpos%, Ypos%) -;========================== -; -; Read the color of a pixel from the Active Display Page -; -; ENTRY: Xpos = X position of pixel to read -; Ypos = Y position of pixel to read -; -; EXIT: AX = Color of Pixel at (Xpos, Ypos) -; - -RP_STACK STRUC - DW ?,? ; BP, DI - DD ? ; Caller - RP_Ypos DW ? ; Y pos of Point to Read - RP_Xpos DW ? ; X pos of Point to Read -RP_STACK ENDS - - PUBLIC READ_POINT - -READ_POINT PROC FAR - - PUSHx BP, DI ; Preserve Registers - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - MOV AX, [BP].RP_Ypos ; Get Line # of Pixel - MUL SCREEN_WIDTH ; Get Offset to Start of Line - - MOV BX, [BP].RP_Xpos ; Get Xpos - MOV CX, BX - SHR BX, 2 ; X offset (Bytes) = Xpos/4 - ADD BX, AX ; Offset = Width*Ypos + Xpos/4 - - MOV AL, READ_MAP ; GC Read Mask Register - MOV AH, CL ; Get Xpos - AND AH, PLANE_BITS ; & mask out Plane # - OUT_16 GC_INDEX, AX ; Select Plane to read in - - CLR AH ; Clear Return Value Hi byte - MOV AL, ES:[DI+BX] ; Get Color of Pixel - - POPx DI, BP ; Restore Saved Registers - RET 4 ; Exit and Clean up Stack - -READ_POINT ENDP - - -;====================================================== -;FILL_BLOCK (Xpos1%, Ypos1%, Xpos2%, Ypos2%, ColorNum%) -;====================================================== -; -; Fills a rectangular block on the active display Page -; -; ENTRY: Xpos1 = Left X position of area to fill -; Ypos1 = Top Y position of area to fill -; Xpos2 = Right X position of area to fill -; Ypos2 = Bottom Y position of area to fill -; ColorNum = Color to fill area with -; -; EXIT: No meaningful values returned -; - -FB_STACK STRUC - DW ?x4 ; DS, DI, SI, BP - DD ? ; Caller - FB_Color DB ?,? ; Fill Color - FB_Ypos2 DW ? ; Y pos of Lower Right Pixel - FB_Xpos2 DW ? ; X pos of Lower Right Pixel - FB_Ypos1 DW ? ; Y pos of Upper Left Pixel - FB_Xpos1 DW ? ; X pos of Upper Left Pixel -FB_STACK ENDS - - PUBLIC FILL_BLOCK - -FILL_BLOCK PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - CLD ; Direction Flag = Forward - - OUT_8 SC_INDEX, MAP_MASK ; Set up for Plane Select - - ; Validate Pixel Coordinates - ; If necessary, Swap so X1 <= X2, Y1 <= Y2 - - MOV AX, [BP].FB_Ypos1 ; AX = Y1 is Y1< Y2? - MOV BX, [BP].FB_Ypos2 ; BX = Y2 - CMP AX, BX - JLE @FB_NOSWAP1 - - MOV [BP].FB_Ypos1, BX ; Swap Y1 and Y2 and save Y1 - XCHG AX, BX ; on stack for future use - -@FB_NOSWAP1: - SUB BX, AX ; Get Y width - INC BX ; Add 1 to avoid 0 value - MOV [BP].FB_Ypos2, BX ; Save in Ypos2 - - MUL SCREEN_WIDTH ; Mul Y1 by Bytes per Line - ADD DI, AX ; DI = Start of Line Y1 - - MOV AX, [BP].FB_Xpos1 ; Check X1 <= X2 - MOV BX, [BP].FB_Xpos2 ; - CMP AX, BX - JLE @FB_NOSWAP2 ; Skip Ahead if Ok - - MOV [BP].FB_Xpos2, AX ; Swap X1 AND X2 and save X2 - XCHG AX, BX ; on stack for future use - - ; All our Input Values are in order, Now determine - ; How many full "bands" 4 pixels wide (aligned) there - ; are, and if there are partial bands (<4 pixels) on - ; the left and right edges. - -@FB_NOSWAP2: - MOV DX, AX ; DX = X1 (Pixel Position) - SHR DX, 2 ; DX/4 = Bytes into Line - ADD DI, DX ; DI = Addr of Upper-Left Corner - - MOV CX, BX ; CX = X2 (Pixel Position) - SHR CX, 2 ; CX/4 = Bytes into Line - - CMP DX, CX ; Start and end in same band? - JNE @FB_NORMAL ; if not, check for l & r edges - JMP @FB_ONE_BAND_ONLY ; if so, then special processing - -@FB_NORMAL: - SUB CX, DX ; CX = # bands -1 - MOV SI, AX ; SI = PLANE#(X1) - AND SI, PLANE_BITS ; if Left edge is aligned then - JZ @FB_L_PLANE_FLUSH ; no special processing.. - - ; Draw "Left Edge" vertical strip of 1-3 pixels... - - OUT_8 SC_Data, Left_Clip_Mask[SI] ; Set Left Edge Plane Mask - - MOV SI, DI ; SI = Copy of Start Addr (UL) - - MOV DX, [BP].FB_Ypos2 ; Get # of Lines to draw - MOV AL, [BP].FB_Color ; Get Fill Color - MOV BX, SCREEN_WIDTH ; Get Vertical increment Value - -@FB_LEFT_LOOP: - MOV ES:[SI], AL ; Fill in Left Edge Pixels - ADD SI, BX ; Point to Next Line (Below) - LOOPjz DX, @FB_LEFT_CONT ; Exit loop if all Lines Drawn - - MOV ES:[SI], AL ; Fill in Left Edge Pixels - ADD SI, BX ; Point to Next Line (Below) - LOOPx DX, @FB_LEFT_LOOP ; loop until left strip is drawn - -@FB_LEFT_CONT: - - INC DI ; Point to Middle (or Right) Block - DEC CX ; Reset CX instead of JMP @FB_RIGHT - -@FB_L_PLANE_FLUSH: - INC CX ; Add in Left band to middle block - - ; DI = Addr of 1st middle Pixel (band) to fill - ; CX = # of Bands to fill -1 - -@FB_RIGHT: - MOV SI, [BP].FB_Xpos2 ; Get Xpos2 - AND SI, PLANE_BITS ; Get Plane values - CMP SI, 0003 ; Plane = 3? - JE @FB_R_EDGE_FLUSH ; Hey, add to middle - - ; Draw "Right Edge" vertical strip of 1-3 pixels... - - OUT_8 SC_Data, Right_Clip_Mask[SI] ; Right Edge Plane Mask - - MOV SI, DI ; Get Addr of Left Edge - ADD SI, CX ; Add Width-1 (Bands) - DEC SI ; To point to top of Right Edge - - MOV DX, [BP].FB_Ypos2 ; Get # of Lines to draw - MOV AL, [BP].FB_Color ; Get Fill Color - MOV BX, SCREEN_WIDTH ; Get Vertical increment Value - -@FB_RIGHT_LOOP: - MOV ES:[SI], AL ; Fill in Right Edge Pixels - ADD SI, BX ; Point to Next Line (Below) - LOOPjz DX, @FB_RIGHT_CONT ; Exit loop if all Lines Drawn - - MOV ES:[SI], AL ; Fill in Right Edge Pixels - ADD SI, BX ; Point to Next Line (Below) - LOOPx DX, @FB_RIGHT_LOOP ; loop until left strip is drawn - -@FB_RIGHT_CONT: - - DEC CX ; Minus 1 for Middle bands - JZ @FB_EXIT ; Uh.. no Middle bands... - -@FB_R_EDGE_FLUSH: - - ; DI = Addr of Upper Left block to fill - ; CX = # of Bands to fill in (width) - - OUT_8 SC_Data, ALL_PLANES ; Write to All Planes - - MOV DX, SCREEN_WIDTH ; DX = DI Increment - SUB DX, CX ; = Screen_Width-# Planes Filled - - MOV BX, CX ; BX = Quick Refill for CX - MOV SI, [BP].FB_Ypos2 ; SI = # of Line to Fill - MOV AL, [BP].FB_Color ; Get Fill Color - -@FB_MIDDLE_LOOP: - REP STOSB ; Fill in entire line - - MOV CX, BX ; Recharge CX (Line Width) - ADD DI, DX ; Point to start of Next Line - LOOPx SI, @FB_MIDDLE_LOOP ; Loop until all lines drawn - - JMP s @FB_EXIT ; Outa here - -@FB_ONE_BAND_ONLY: - MOV SI, AX ; Get Left Clip Mask, Save X1 - AND SI, PLANE_BITS ; Mask out Row # - MOV AL, Left_Clip_Mask[SI] ; Get Left Edge Mask - MOV SI, BX ; Get Right Clip Mask, Save X2 - AND SI, PLANE_BITS ; Mask out Row # - AND AL, Right_Clip_Mask[SI] ; Get Right Edge Mask byte - - OUT_8 SC_Data, AL ; Clip For Left & Right Masks - - MOV CX, [BP].FB_Ypos2 ; Get # of Lines to draw - MOV AL, [BP].FB_Color ; Get Fill Color - MOV BX, SCREEN_WIDTH ; Get Vertical increment Value - -@FB_ONE_LOOP: - MOV ES:[DI], AL ; Fill in Pixels - ADD DI, BX ; Point to Next Line (Below) - LOOPjz CX, @FB_EXIT ; Exit loop if all Lines Drawn - - MOV ES:[DI], AL ; Fill in Pixels - ADD DI, BX ; Point to Next Line (Below) - LOOPx CX, @FB_ONE_LOOP ; loop until left strip is drawn - -@FB_EXIT: - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 10 ; Exit and Clean up Stack - -FILL_BLOCK ENDP - - -;===================================================== -;DRAW_LINE (Xpos1%, Ypos1%, Xpos2%, Ypos2%, ColorNum%) -;===================================================== -; -; Draws a Line on the active display page -; -; ENTRY: Xpos1 = X position of first point on line -; Ypos1 = Y position of first point on line -; Xpos2 = X position of last point on line -; Ypos2 = Y position of last point on line -; ColorNum = Color to draw line with -; -; EXIT: No meaningful values returned -; - -DL_STACK STRUC - DW ?x3 ; DI, SI, BP - DD ? ; Caller - DL_ColorF DB ?,? ; Line Draw Color - DL_Ypos2 DW ? ; Y pos of last point - DL_Xpos2 DW ? ; X pos of last point - DL_Ypos1 DW ? ; Y pos of first point - DL_Xpos1 DW ? ; X pos of first point -DL_STACK ENDS - - PUBLIC DRAW_LINE - -DRAW_LINE PROC FAR - - PUSHx BP, SI, DI ; Preserve Important Registers - MOV BP, SP ; Set up Stack Frame - CLD ; Direction Flag = Forward - - OUT_8 SC_INDEX, MAP_MASK ; Set up for Plane Select - MOV CH, [BP].DL_ColorF ; Save Line Color in CH - - ; Check Line Type - - MOV SI, [BP].DL_Xpos1 ; AX = X1 is X1< X2? - MOV DI, [BP].DL_Xpos2 ; DX = X2 - CMP SI, DI ; Is X1 < X2 - JE @DL_VLINE ; If X1=X2, Draw Vertical Line - JL @DL_NOSWAP1 ; If X1 < X2, don't swap - - XCHG SI, DI ; X2 IS > X1, SO SWAP THEM - -@DL_NOSWAP1: - - ; SI = X1, DI = X2 - - MOV AX, [BP].DL_Ypos1 ; AX = Y1 is Y1 <> Y2? - CMP AX, [BP].DL_Ypos2 ; Y1 = Y2? - JE @DL_HORZ ; If so, Draw a Horizontal Line - - JMP @DL_BREZHAM ; Diagonal line... go do it... - - ; This Code draws a Horizontal Line in Mode X where: - ; SI = X1, DI = X2, and AX = Y1/Y2 - -@DL_HORZ: - - MUL SCREEN_WIDTH ; Offset = Ypos * Screen_Width - MOV DX, AX ; CX = Line offset into Page - - MOV AX, SI ; Get Left edge, Save X1 - AND SI, PLANE_BITS ; Mask out Row # - MOV BL, Left_Clip_Mask[SI] ; Get Left Edge Mask - MOV CX, DI ; Get Right edge, Save X2 - AND DI, PLANE_BITS ; Mask out Row # - MOV BH, Right_Clip_Mask[DI] ; Get Right Edge Mask byte - - SHR AX, 2 ; Get X1 Byte # (=X1/4) - SHR CX, 2 ; Get X2 Byte # (=X2/4) - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - ADD DI, DX ; Point to Start of Line - ADD DI, AX ; Point to Pixel X1 - - SUB CX, AX ; CX = # Of Bands (-1) to set - JNZ @DL_LONGLN ; jump if longer than one segment - - AND BL, BH ; otherwise, merge clip masks - -@DL_LONGLN: - - OUT_8 SC_Data, BL ; Set the Left Clip Mask - - MOV AL, [BP].DL_ColorF ; Get Line Color - MOV BL, AL ; BL = Copy of Line Color - STOSB ; Set Left (1-4) Pixels - - JCXZ @DL_EXIT ; Done if only one Line Segment - - DEC CX ; CX = # of Middle Segments - JZ @DL_XRSEG ; If no middle segments.... - - ; Draw Middle Segments - - OUT_8 DX, ALL_PLANES ; Write to ALL Planes - - MOV AL, BL ; Get Color from BL - REP STOSB ; Draw Middle (4 Pixel) Segments - -@DL_XRSEG: - OUT_8 DX, BH ; Select Planes for Right Clip Mask - MOV AL, BL ; Get Color Value - STOSB ; Draw Right (1-4) Pixels - - JMP s @DL_EXIT ; We Are Done... - - - ; This Code Draws A Vertical Line. On entry: - ; CH = Line Color, SI & DI = X1 - -@DL_VLINE: - - MOV AX, [BP].DL_Ypos1 ; AX = Y1 - MOV SI, [BP].DL_Ypos2 ; SI = Y2 - CMP AX, SI ; Is Y1 < Y2? - JLE @DL_NOSWAP2 ; if so, Don't Swap them - - XCHG AX, SI ; Ok, NOW Y1 < Y2 - -@DL_NOSWAP2: - - SUB SI, AX ; SI = Line Height (Y2-Y1+1) - INC SI - - ; AX = Y1, DI = X1, Get offset into Page into AX - - MUL SCREEN_WIDTH ; Offset = Y1 (AX) * Screen Width - MOV DX, DI ; Copy Xpos into DX - SHR DI, 2 ; DI = Xpos/4 - ADD AX, DI ; DI = Xpos/4 + ScreenWidth * Y1 - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - ADD DI, AX ; Point to Pixel X1, Y1 - - ;Select Plane - - MOV CL, DL ; CL = Save X1 - AND CL, PLANE_BITS ; Get X1 MOD 4 (Plane #) - MOV AX, MAP_MASK_PLANE1 ; Code to set Plane #1 - SHL AH, CL ; Change to Correct Plane # - OUT_16 SC_Index, AX ; Select Plane - - MOV AL, CH ; Get Saved Color - MOV BX, SCREEN_WIDTH ; Get Offset to Advance Line By - -@DL_VLoop: - MOV ES:[DI], AL ; Draw Single Pixel - ADD DI, BX ; Point to Next Line - LOOPjz SI, @DL_EXIT ; Lines--, Exit if done - - MOV ES:[DI], AL ; Draw Single Pixel - ADD DI, BX ; Point to Next Line - LOOPx SI, @DL_VLoop ; Lines--, Loop until Done - -@DL_EXIT: - - JMP @DL_EXIT2 ; Done! - - ; This code Draws a diagonal line in Mode X - -@DL_BREZHAM: - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - MOV AX, [BP].DL_Ypos1 ; get Y1 value - MOV BX, [BP].DL_Ypos2 ; get Y2 value - MOV CX, [BP].DL_Xpos1 ; Get Starting Xpos - - CMP BX, AX ; Y2-Y1 is? - JNC @DL_DeltaYOK ; if Y2>=Y1 then goto... - - XCHG BX, AX ; Swap em... - MOV CX, [BP].DL_Xpos2 ; Get New Starting Xpos - -@DL_DeltaYOK: - MUL SCREEN_WIDTH ; Offset = SCREEN_WIDTH * Y1 - - ADD DI, AX ; DI -> Start of Line Y1 on Page - MOV AX, CX ; AX = Xpos (X1) - SHR AX, 2 ; /4 = Byte Offset into Line - ADD DI, AX ; DI = Starting pos (X1,Y1) - - MOV AL, 11h ; Staring Mask - AND CL, PLANE_BITS ; Get Plane # - SHL AL, CL ; and shift into place - MOV AH, [BP].DL_ColorF ; Color in Hi Bytes - - PUSH AX ; Save Mask,Color... - - MOV AH, AL ; Plane # in AH - MOV AL, MAP_MASK ; Select Plane Register - OUT_16 SC_Index, AX ; Select initial plane - - MOV AX, [BP].DL_Xpos1 ; get X1 value - MOV BX, [BP].DL_Ypos1 ; get Y1 value - MOV CX, [BP].DL_Xpos2 ; get X2 value - MOV DX, [BP].DL_Ypos2 ; get Y2 value - - MOV BP, SCREEN_WIDTH ; Use BP for Line width to - ; to avoid extra memory access - - SUB DX, BX ; figure Delta_Y - JNC @DL_DeltaYOK2 ; jump if Y2 >= Y1 - - ADD BX, DX ; put Y2 into Y1 - NEG DX ; abs(Delta_Y) - XCHG AX, CX ; and exchange X1 and X2 - -@DL_DeltaYOK2: - MOV BX, 08000H ; seed for fraction accumulator - - SUB CX, AX ; figure Delta_X - JC @DL_DrawLeft ; if negative, go left - - JMP @DL_DrawRight ; Draw Line that slopes right - -@DL_DrawLeft: - - NEG CX ; abs(Delta_X) - - CMP CX, DX ; is Delta_X < Delta_Y? - JB @DL_SteepLeft ; yes, so go do steep line - ; (Delta_Y iterations) - - ; Draw a Shallow line to the left in Mode X - -@DL_ShallowLeft: - CLR AX ; zero low word of Delta_Y * 10000h - SUB AX, DX ; DX:AX <- DX * 0FFFFh - SBB DX, 0 ; include carry - DIV CX ; divide by Delta_X - - MOV SI, BX ; SI = Accumulator - MOV BX, AX ; BX = Add fraction - POP AX ; Get Color, Bit mask - MOV DX, SC_Data ; Sequence controller data register - INC CX ; Inc Delta_X so we can unroll loop - - ; Loop (x2) to Draw Pixels, Move Left, and Maybe Down... - -@DL_SLLLoop: - MOV ES:[DI], AH ; set first pixel, plane data set up - LOOPjz CX, @DL_SLLExit ; Delta_X--, Exit if done - - ADD SI, BX ; add numerator to accumulator - JNC @DL_SLLL2nc ; move down on carry - - ADD DI, BP ; Move Down one line... - -@DL_SLLL2nc: - DEC DI ; Left one addr - ROR AL, 1 ; Move Left one plane, back on 0 1 2 - CMP AL, 87h ; wrap?, if AL <88 then Carry set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - - MOV ES:[DI], AH ; set pixel - LOOPjz CX, @DL_SLLExit ; Delta_X--, Exit if done - - ADD SI, BX ; add numerator to accumulator, - JNC @DL_SLLL3nc ; move down on carry - - ADD DI, BP ; Move Down one line... - -@DL_SLLL3nc: ; Now move left a pixel... - DEC DI ; Left one addr - ROR AL, 1 ; Move Left one plane, back on 0 1 2 - CMP AL, 87h ; Wrap?, if AL <88 then Carry set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - JMP s @DL_SLLLoop ; loop until done - -@DL_SLLExit: - JMP @DL_EXIT2 ; and exit - - ; Draw a steep line to the left in Mode X - -@DL_SteepLeft: - CLR AX ; zero low word of Delta_Y * 10000h - XCHG DX, CX ; Delta_Y switched with Delta_X - DIV CX ; divide by Delta_Y - - MOV SI, BX ; SI = Accumulator - MOV BX, AX ; BX = Add Fraction - POP AX ; Get Color, Bit mask - MOV DX, SC_Data ; Sequence controller data register - INC CX ; Inc Delta_Y so we can unroll loop - - ; Loop (x2) to Draw Pixels, Move Down, and Maybe left - -@DL_STLLoop: - - MOV ES:[DI], AH ; set first pixel - LOOPjz CX, @DL_STLExit ; Delta_Y--, Exit if done - - ADD SI, BX ; add numerator to accumulator - JNC @DL_STLnc2 ; No carry, just move down! - - DEC DI ; Move Left one addr - ROR AL, 1 ; Move Left one plane, back on 0 1 2 - CMP AL, 87h ; Wrap?, if AL <88 then Carry set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - -@DL_STLnc2: - ADD DI, BP ; advance to next line. - - MOV ES:[DI], AH ; set pixel - LOOPjz CX, @DL_STLExit ; Delta_Y--, Exit if done - - ADD SI, BX ; add numerator to accumulator - JNC @DL_STLnc3 ; No carry, just move down! - - DEC DI ; Move Left one addr - ROR AL, 1 ; Move Left one plane, back on 0 1 2 - CMP AL, 87h ; Wrap?, if AL <88 then Carry set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - -@DL_STLnc3: - ADD DI, BP ; advance to next line. - JMP s @DL_STLLoop ; Loop until done - -@DL_STLExit: - JMP @DL_EXIT2 ; and exit - - ; Draw a line that goes to the Right... - -@DL_DrawRight: - CMP CX, DX ; is Delta_X < Delta_Y? - JB @DL_SteepRight ; yes, so go do steep line - ; (Delta_Y iterations) - - ; Draw a Shallow line to the Right in Mode X - -@DL_ShallowRight: - CLR AX ; zero low word of Delta_Y * 10000h - SUB AX, DX ; DX:AX <- DX * 0FFFFh - SBB DX, 0 ; include carry - DIV CX ; divide by Delta_X - - MOV SI, BX ; SI = Accumulator - MOV BX, AX ; BX = Add Fraction - POP AX ; Get Color, Bit mask - MOV DX, SC_Data ; Sequence controller data register - INC CX ; Inc Delta_X so we can unroll loop - - ; Loop (x2) to Draw Pixels, Move Right, and Maybe Down... - -@DL_SLRLoop: - MOV ES:[DI], AH ; set first pixel, mask is set up - LOOPjz CX, @DL_SLRExit ; Delta_X--, Exit if done.. - - ADD SI, BX ; add numerator to accumulator - JNC @DL_SLR2nc ; don't move down if carry not set - - ADD DI, BP ; Move Down one line... - -@DL_SLR2nc: ; Now move right a pixel... - ROL AL, 1 ; Move Right one addr if Plane = 0 - CMP AL, 12h ; Wrap? if AL >12 then Carry not set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - - MOV ES:[DI], AH ; set pixel - LOOPjz CX, @DL_SLRExit ; Delta_X--, Exit if done.. - - ADD SI, BX ; add numerator to accumulator - JNC @DL_SLR3nc ; don't move down if carry not set - - ADD DI, BP ; Move Down one line... - -@DL_SLR3nc: - ROL AL, 1 ; Move Right one addr if Plane = 0 - CMP AL, 12h ; Wrap? if AL >12 then Carry not set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - JMP s @DL_SLRLoop ; loop till done - -@DL_SLRExit: - JMP @DL_EXIT2 ; and exit - - ; Draw a Steep line to the Right in Mode X - -@DL_SteepRight: - CLR AX ; zero low word of Delta_Y * 10000h - XCHG DX, CX ; Delta_Y switched with Delta_X - DIV CX ; divide by Delta_Y - - MOV SI, BX ; SI = Accumulator - MOV BX, AX ; BX = Add Fraction - POP AX ; Get Color, Bit mask - MOV DX, SC_Data ; Sequence controller data register - INC CX ; Inc Delta_Y so we can unroll loop - - ; Loop (x2) to Draw Pixels, Move Down, and Maybe Right - -@STRLoop: - MOV ES:[DI], AH ; set first pixel, mask is set up - LOOPjz CX, @DL_EXIT2 ; Delta_Y--, Exit if Done - - ADD SI, BX ; add numerator to accumulator - JNC @STRnc2 ; if no carry then just go down... - - ROL AL, 1 ; Move Right one addr if Plane = 0 - CMP AL, 12h ; Wrap? if AL >12 then Carry not set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - -@STRnc2: - ADD DI, BP ; advance to next line. - - MOV ES:[DI], AH ; set pixel - LOOPjz CX, @DL_EXIT2 ; Delta_Y--, Exit if Done - - ADD SI, BX ; add numerator to accumulator - JNC @STRnc3 ; if no carry then just go down... - - ROL AL, 1 ; Move Right one addr if Plane = 0 - CMP AL, 12h ; Wrap? if AL >12 then Carry not set - ADC DI, 0 ; Adjust Address: DI = DI + Carry - OUT DX, AL ; Set up New Bit Plane mask - -@STRnc3: - ADD DI, BP ; advance to next line. - JMP s @STRLoop ; loop till done - -@DL_EXIT2: - POPx DI, SI, BP ; Restore Saved Registers - RET 10 ; Exit and Clean up Stack - -DRAW_LINE ENDP - - - ; ===== DAC COLOR REGISTER ROUTINES ===== - -;================================================= -;SET_DAC_REGISTER (Register%, Red%, Green%, Blue%) -;================================================= -; -; Sets a single (RGB) Vga Palette Register -; -; ENTRY: Register = The DAC # to modify (0-255) -; Red = The new Red Intensity (0-63) -; Green = The new Green Intensity (0-63) -; Blue = The new Blue Intensity (0-63) -; -; EXIT: No meaningful values returned -; - -SDR_STACK STRUC - DW ? ; BP - DD ? ; Caller - SDR_Blue DB ?,? ; Blue Data Value - SDR_Green DB ?,? ; Green Data Value - SDR_Red DB ?,? ; Red Data Value - SDR_Register DB ?,? ; Palette Register # -SDR_STACK ENDS - - PUBLIC SET_DAC_REGISTER - -SET_DAC_REGISTER PROC FAR - - PUSH BP ; Save BP - MOV BP, SP ; Set up Stack Frame - - ; Select which DAC Register to modify - - OUT_8 DAC_WRITE_ADDR, [BP].SDR_Register - - MOV DX, PEL_DATA_REG ; Dac Data Register - OUT_8 DX, [BP].SDR_Red ; Set Red Intensity - OUT_8 DX, [BP].SDR_Green ; Set Green Intensity - OUT_8 DX, [BP].SDR_Blue ; Set Blue Intensity - - POP BP ; Restore Registers - RET 8 ; Exit & Clean Up Stack - -SET_DAC_REGISTER ENDP - -;==================================================== -;GET_DAC_REGISTER (Register%, &Red%, &Green%, &Blue%) -;==================================================== -; -; Reads the RGB Values of a single Vga Palette Register -; -; ENTRY: Register = The DAC # to read (0-255) -; Red = Offset to Red Variable in DS -; Green = Offset to Green Variable in DS -; Blue = Offset to Blue Variable in DS -; -; EXIT: The values of the integer variables Red, -; Green, and Blue are set to the values -; taken from the specified DAC register. -; - -GDR_STACK STRUC - DW ? ; BP - DD ? ; Caller - GDR_Blue DW ? ; Addr of Blue Data Value in DS - GDR_Green DW ? ; Addr of Green Data Value in DS - GDR_Red DW ? ; Addr of Red Data Value in DS - GDR_Register DB ?,? ; Palette Register # -GDR_STACK ENDS - - PUBLIC GET_DAC_REGISTER - -GET_DAC_REGISTER PROC FAR - - PUSH BP ; Save BP - MOV BP, SP ; Set up Stack Frame - - ; Select which DAC Register to read in - - OUT_8 DAC_READ_ADDR, [BP].GDR_Register - - MOV DX, PEL_DATA_REG ; Dac Data Register - CLR AX ; Clear AX - - IN AL, DX ; Read Red Value - MOV BX, [BP].GDR_Red ; Get Address of Red% - MOV [BX], AX ; *Red% = AX - - IN AL, DX ; Read Green Value - MOV BX, [BP].GDR_Green ; Get Address of Green% - MOV [BX], AX ; *Green% = AX - - IN AL, DX ; Read Blue Value - MOV BX, [BP].GDR_Blue ; Get Address of Blue% - MOV [BX], AX ; *Blue% = AX - - POP BP ; Restore Registers - RET 8 ; Exit & Clean Up Stack - -GET_DAC_REGISTER ENDP - - -;=========================================================== -;LOAD_DAC_REGISTERS (SEG PalData, StartReg%, EndReg%, Sync%) -;=========================================================== -; -; Sets a Block of Vga Palette Registers -; -; ENTRY: PalData = Far Pointer to Block of palette data -; StartReg = First Register # in range to set (0-255) -; EndReg = Last Register # in Range to set (0-255) -; Sync = Wait for Vertical Retrace Flag (Boolean) -; -; EXIT: No meaningful values returned -; -; NOTES: PalData is a linear array of 3 byte Palette values -; in the order: Red (0-63), Green (0-63), Blue (0-63) -; - -LDR_STACK STRUC - DW ?x3 ; BP, DS, SI - DD ? ; Caller - LDR_Sync DW ? ; Vertical Sync Flag - LDR_EndReg DB ?,? ; Last Register # - LDR_StartReg DB ?,? ; First Register # - LDR_PalData DD ? ; Far Ptr to Palette Data -LDR_STACK ENDS - - PUBLIC LOAD_DAC_REGISTERS - -LOAD_DAC_REGISTERS PROC FAR - - PUSHx BP, DS, SI ; Save Registers - mov BP, SP ; Set up Stack Frame - - mov AX, [BP].LDR_Sync ; Get Vertical Sync Flag - or AX, AX ; is Sync Flag = 0? - jz @LDR_Load ; if so, skip call - - call f SYNC_DISPLAY ; wait for vsync - - ; Determine register #'s, size to copy, etc - -@LDR_Load: - - lds SI, [BP].LDR_PalData ; DS:SI -> Palette Data - mov DX, DAC_WRITE_ADDR ; DAC register # selector - - CLR AX, BX ; Clear for byte loads - mov AL, [BP].LDR_StartReg ; Get Start Register - mov BL, [BP].LDR_EndReg ; Get End Register - - sub BX, AX ; BX = # of DAC registers -1 - inc BX ; BX = # of DAC registers - mov CX, BX ; CX = # of DAC registers - add CX, BX ; CX = " " * 2 - add CX, BX ; CX = " " * 3 - cld ; Block OUTs forward - out DX, AL ; set up correct register # - - ; Load a block of DAC Registers - - mov DX, PEL_DATA_REG ; Dac Data Register - - rep outsb ; block set DAC registers - - POPx SI, DS, BP ; Restore Registers - ret 10 ; Exit & Clean Up Stack - -LOAD_DAC_REGISTERS ENDP - - -;==================================================== -;READ_DAC_REGISTERS (SEG PalData, StartReg%, EndReg%) -;==================================================== -; -; Reads a Block of Vga Palette Registers -; -; ENTRY: PalData = Far Pointer to block to store palette data -; StartReg = First Register # in range to read (0-255) -; EndReg = Last Register # in Range to read (0-255) -; -; EXIT: No meaningful values returned -; -; NOTES: PalData is a linear array of 3 byte Palette values -; in the order: Red (0-63), Green (0-63), Blue (0-63) -; - -RDR_STACK STRUC - DW ?x3 ; BP, ES, DI - DD ? ; Caller - RDR_EndReg DB ?,? ; Last Register # - RDR_StartReg DB ?,? ; First Register # - RDR_PalData DD ? ; Far Ptr to Palette Data -RDR_STACK ENDS - - PUBLIC READ_DAC_REGISTERS - -READ_DAC_REGISTERS PROC FAR - - PUSHx BP, ES, DI ; Save Registers - mov BP, SP ; Set up Stack Frame - - ; Determine register #'s, size to copy, etc - - les DI, [BP].RDR_PalData ; ES:DI -> Palette Buffer - mov DX, DAC_READ_ADDR ; DAC register # selector - - CLR AX, BX ; Clear for byte loads - mov AL, [BP].RDR_StartReg ; Get Start Register - mov BL, [BP].RDR_EndReg ; Get End Register - - sub BX, AX ; BX = # of DAC registers -1 - inc BX ; BX = # of DAC registers - mov CX, BX ; CX = # of DAC registers - add CX, BX ; CX = " " * 2 - add CX, BX ; CX = " " * 3 - cld ; Block INs forward - - ; Read a block of DAC Registers - - out DX, AL ; set up correct register # - mov DX, PEL_DATA_REG ; Dac Data Register - - rep insb ; block read DAC registers - - POPx DI, ES, BP ; Restore Registers - ret 8 ; Exit & Clean Up Stack - -READ_DAC_REGISTERS ENDP - - - ; ===== PAGE FLIPPING AND SCROLLING ROUTINES ===== - -;========================= -;SET_ACTIVE_PAGE (PageNo%) -;========================= -; -; Sets the active display Page to be used for future drawing -; -; ENTRY: PageNo = Display Page to make active -; (values: 0 to Number of Pages - 1) -; -; EXIT: No meaningful values returned -; - -SAP_STACK STRUC - DW ? ; BP - DD ? ; Caller - SAP_Page DW ? ; Page # for Drawing -SAP_STACK ENDS - - PUBLIC SET_ACTIVE_PAGE - -SET_ACTIVE_PAGE PROC FAR - - PUSH BP ; Preserve Registers - MOV BP, SP ; Set up Stack Frame - - MOV BX, [BP].SAP_Page ; Get Desired Page # - CMP BX, LAST_PAGE ; Is Page # Valid? - JAE @SAP_Exit ; IF Not, Do Nothing - - MOV ACTIVE_PAGE, BX ; Set Active Page # - - SHL BX, 1 ; Scale Page # to Word - MOV AX, PAGE_ADDR[BX] ; Get offset to Page - - MOV CURRENT_PAGE, AX ; And set for future LES's - -@SAP_Exit: - POP BP ; Restore Registers - RET 2 ; Exit and Clean up Stack - -SET_ACTIVE_PAGE ENDP - - -;================ -;GET_ACTIVE_PAGE% -;================ -; -; Returns the Video Page # currently used for Drawing -; -; ENTRY: No Parameters are passed -; -; EXIT: AX = Current Video Page used for Drawing -; - - PUBLIC GET_ACTIVE_PAGE - -GET_ACTIVE_PAGE PROC FAR - - MOV AX, ACTIVE_PAGE ; Get Active Page # - RET ; Exit and Clean up Stack - -GET_ACTIVE_PAGE ENDP - - -;=============================== -;SET_DISPLAY_PAGE (DisplayPage%) -;=============================== -; -; Sets the currently visible display page. -; When called this routine syncronizes the display -; to the vertical blank. -; -; ENTRY: PageNo = Display Page to show on the screen -; (values: 0 to Number of Pages - 1) -; -; EXIT: No meaningful values returned -; - -SDP_STACK STRUC - DW ? ; BP - DD ? ; Caller - SDP_Page DW ? ; Page # to Display... -SDP_STACK ENDS - - PUBLIC SET_DISPLAY_PAGE - -SET_DISPLAY_PAGE PROC FAR - - PUSH BP ; Preserve Registers - MOV BP, SP ; Set up Stack Frame - - MOV BX, [BP].SDP_Page ; Get Desired Page # - CMP BX, LAST_PAGE ; Is Page # Valid? - JAE @SDP_Exit ; IF Not, Do Nothing - - MOV DISPLAY_PAGE, BX ; Set Display Page # - - SHL BX, 1 ; Scale Page # to Word - MOV CX, PAGE_ADDR[BX] ; Get offset in memory to Page - ADD CX, CURRENT_MOFFSET ; Adjust for any scrolling - - ; Wait if we are currently in a Vertical Retrace - - MOV DX, INPUT_1 ; Input Status #1 Register - -@DP_WAIT0: - IN AL, DX ; Get VGA status - AND AL, VERT_RETRACE ; In Display mode yet? - JNZ @DP_WAIT0 ; If Not, wait for it - - ; Set the Start Display Address to the new page - - MOV DX, CRTC_Index ; We Change the VGA Sequencer - - MOV AL, START_DISP_LO ; Display Start Low Register - MOV AH, CL ; Low 8 Bits of Start Addr - OUT DX, AX ; Set Display Addr Low - - MOV AL, START_DISP_HI ; Display Start High Register - MOV AH, CH ; High 8 Bits of Start Addr - OUT DX, AX ; Set Display Addr High - - ; Wait for a Vertical Retrace to smooth out things - - MOV DX, INPUT_1 ; Input Status #1 Register - -@DP_WAIT1: - IN AL, DX ; Get VGA status - AND AL, VERT_RETRACE ; Vertical Retrace Start? - JZ @DP_WAIT1 ; If Not, wait for it - - ; Now Set Display Starting Address - - -@SDP_Exit: - POP BP ; Restore Registers - RET 2 ; Exit and Clean up Stack - -SET_DISPLAY_PAGE ENDP - - -;================= -;GET_DISPLAY_PAGE% -;================= -; -; Returns the Video Page # currently displayed -; -; ENTRY: No Parameters are passed -; -; EXIT: AX = Current Video Page being displayed -; - - PUBLIC GET_DISPLAY_PAGE - -GET_DISPLAY_PAGE PROC FAR - - MOV AX, DISPLAY_PAGE ; Get Display Page # - RET ; Exit & Clean Up Stack - -GET_DISPLAY_PAGE ENDP - - -;======================================= -;SET_WINDOW (DisplayPage%, Xpos%, Ypos%) -;======================================= -; -; Since a Logical Screen can be larger than the Physical -; Screen, Scrolling is possible. This routine sets the -; Upper Left Corner of the Screen to the specified Pixel. -; Also Sets the Display page to simplify combined page -; flipping and scrolling. When called this routine -; syncronizes the display to the vertical blank. -; -; ENTRY: DisplayPage = Display Page to show on the screen -; Xpos = # of pixels to shift screen right -; Ypos = # of lines to shift screen down -; -; EXIT: No meaningful values returned -; - -SW_STACK STRUC - DW ? ; BP - DD ? ; Caller - SW_Ypos DW ? ; Y pos of UL Screen Corner - SW_Xpos DW ? ; X pos of UL Screen Corner - SW_Page DW ? ; (new) Display Page -SW_STACK ENDS - - PUBLIC SET_WINDOW - -SET_WINDOW PROC FAR - - PUSH BP ; Preserve Registers - MOV BP, SP ; Set up Stack Frame - - ; Check if our Scroll Offsets are Valid - - MOV BX, [BP].SW_Page ; Get Desired Page # - CMP BX, LAST_PAGE ; Is Page # Valid? - JAE @SW_Exit ; IF Not, Do Nothing - - MOV AX, [BP].SW_Ypos ; Get Desired Y Offset - CMP AX, MAX_YOFFSET ; Is it Within Limits? - JA @SW_Exit ; if not, exit - - MOV CX, [BP].SW_Xpos ; Get Desired X Offset - CMP CX, MAX_XOFFSET ; Is it Within Limits? - JA @SW_Exit ; if not, exit - - ; Compute proper Display start address to use - - MUL SCREEN_WIDTH ; AX = YOffset * Line Width - SHR CX, 2 ; CX / 4 = Bytes into Line - ADD AX, CX ; AX = Offset of Upper Left Pixel - - MOV CURRENT_MOFFSET, AX ; Save Offset Info - - MOV DISPLAY_PAGE, BX ; Set Current Page # - SHL BX, 1 ; Scale Page # to Word - ADD AX, PAGE_ADDR[BX] ; Get offset in VGA to Page - MOV BX, AX ; BX = Desired Display Start - - MOV DX, INPUT_1 ; Input Status #1 Register - - ; Wait if we are currently in a Vertical Retrace - -@SW_WAIT0: - IN AL, DX ; Get VGA status - AND AL, VERT_RETRACE ; In Display mode yet? - JNZ @SW_WAIT0 ; If Not, wait for it - - ; Set the Start Display Address to the new window - - MOV DX, CRTC_Index ; We Change the VGA Sequencer - MOV AL, START_DISP_LO ; Display Start Low Register - MOV AH, BL ; Low 8 Bits of Start Addr - OUT DX, AX ; Set Display Addr Low - - MOV AL, START_DISP_HI ; Display Start High Register - MOV AH, BH ; High 8 Bits of Start Addr - OUT DX, AX ; Set Display Addr High - - ; Wait for a Vertical Retrace to smooth out things - - MOV DX, INPUT_1 ; Input Status #1 Register - -@SW_WAIT1: - IN AL, DX ; Get VGA status - AND AL, VERT_RETRACE ; Vertical Retrace Start? - JZ @SW_WAIT1 ; If Not, wait for it - - ; Now Set the Horizontal Pixel Pan values - - OUT_8 ATTRIB_Ctrl, PIXEL_PAN_REG ; Select Pixel Pan Register - - MOV AX, [BP].SW_Xpos ; Get Desired X Offset - AND AL, 03 ; Get # of Pixels to Pan (0-3) - SHL AL, 1 ; Shift for 256 Color Mode - OUT DX, AL ; Fine tune the display! - -@SW_Exit: - POP BP ; Restore Saved Registers - RET 6 ; Exit and Clean up Stack - -SET_WINDOW ENDP - - -;============= -;GET_X_OFFSET% -;============= -; -; Returns the X coordinate of the Pixel currently display -; in the upper left corner of the display -; -; ENTRY: No Parameters are passed -; -; EXIT: AX = Current Horizontal Scroll Offset -; - - PUBLIC GET_X_OFFSET - -GET_X_OFFSET PROC FAR - - MOV AX, CURRENT_XOFFSET ; Get current horz offset - RET ; Exit & Clean Up Stack - -GET_X_OFFSET ENDP - - -;============= -;GET_Y_OFFSET% -;============= -; -; Returns the Y coordinate of the Pixel currently display -; in the upper left corner of the display -; -; ENTRY: No Parameters are passed -; -; EXIT: AX = Current Vertical Scroll Offset -; - - PUBLIC GET_Y_OFFSET - -GET_Y_OFFSET PROC FAR - - MOV AX, CURRENT_YOFFSET ; Get current vertical offset - RET ; Exit & Clean Up Stack - -GET_Y_OFFSET ENDP - - -;============ -;SYNC_DISPLAY -;============ -; -; Pauses the computer until the next Vertical Retrace starts -; -; ENTRY: No Parameters are passed -; -; EXIT: No meaningful values returned -; - - PUBLIC SYNC_DISPLAY - -SYNC_DISPLAY PROC FAR - - MOV DX, INPUT_1 ; Input Status #1 Register - - ; Wait for any current retrace to end - -@SD_WAIT0: - IN AL, DX ; Get VGA status - AND AL, VERT_RETRACE ; In Display mode yet? - JNZ @SD_WAIT0 ; If Not, wait for it - - ; Wait for the start of the next vertical retrace - -@SD_WAIT1: - IN AL, DX ; Get VGA status - AND AL, VERT_RETRACE ; Vertical Retrace Start? - JZ @SD_WAIT1 ; If Not, wait for it - - RET ; Exit & Clean Up Stack - -SYNC_DISPLAY ENDP - - - ; ===== TEXT DISPLAY ROUTINES ===== - -;================================================== -;GPRINTC (CharNum%, Xpos%, Ypos%, ColorF%, ColorB%) -;================================================== -; -; Draws an ASCII Text Character using the currently selected -; 8x8 font on the active display page. It would be a simple -; exercise to make this routine process variable height fonts. -; -; ENTRY: CharNum = ASCII character # to draw -; Xpos = X position to draw Character at -; Ypos = Y position of to draw Character at -; ColorF = Color to draw text character in -; ColorB = Color to set background to -; -; EXIT: No meaningful values returned -; - -GPC_STACK STRUC - GPC_Width DW ? ; Screen Width-1 - GPC_Lines DB ?,? ; Scan lines to Decode - GPC_T_SETS DW ? ; Saved Charset Segment - GPC_T_SETO DW ? ; Saved Charset Offset - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - GPC_ColorB DB ?,? ; Background Color - GPC_ColorF DB ?,? ; Text Color - GPC_Ypos DW ? ; Y Position to Print at - GPC_Xpos DW ? ; X position to Print at - GPC_Char DB ?,? ; Character to Print -GPC_STACK ENDS - - PUBLIC GPRINTC - -GPRINTC PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - SUB SP, 8 ; Allocate WorkSpace on Stack - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - MOV AX, SCREEN_WIDTH ; Get Logical Line Width - MOV BX, AX ; BX = Screen Width - DEC BX ; = Screen Width-1 - MOV [BP].GPC_Width, BX ; Save for later use - - MUL [BP].GPC_Ypos ; Start of Line = Ypos * Width - ADD DI, AX ; DI -> Start of Line Ypos - - MOV AX, [BP].GPC_Xpos ; Get Xpos of Character - MOV CX, AX ; Save Copy of Xpos - SHR AX, 2 ; Bytes into Line = Xpos/4 - ADD DI, AX ; DI -> (Xpos, Ypos) - - ;Get Source ADDR of Character Bit Map & Save - - MOV AL, [BP].GPC_Char ; Get Character # - TEST AL, 080h ; Is Hi Bit Set? - JZ @GPC_LowChar ; Nope, use low char set ptr - - AND AL, 07Fh ; Mask Out Hi Bit - MOV BX, CHARSET_HI ; BX = Char Set Ptr:Offset - MOV DX, CHARSET_HI+2 ; DX = Char Set Ptr:Segment - JMP s @GPC_Set_Char ; Go Setup Character Ptr - -@GPC_LowChar: - - MOV BX, CHARSET_LOW ; BX = Char Set Ptr:Offset - MOV DX, CHARSET_LOW+2 ; DX = Char Set Ptr:Segment - -@GPC_Set_Char: - MOV [BP].GPC_T_SETS, DX ; Save Segment on Stack - - MOV AH, 0 ; Valid #'s are 0..127 - SHL AX, 3 ; * 8 Bytes Per Bitmap - ADD BX, AX ; BX = Offset of Selected char - MOV [BP].GPC_T_SETO, BX ; Save Offset on Stack - - AND CX, PLANE_BITS ; Get Plane # - MOV CH, ALL_PLANES ; Get Initial Plane mask - SHL CH, CL ; And shift into position - AND CH, ALL_PLANES ; And mask to lower nibble - - MOV AL, 04 ; 4-Plane # = # of initial - SUB AL, CL ; shifts to align bit mask - MOV CL, AL ; Shift Count for SHL - - ;Get segment of character map - - OUT_8 SC_Index, MAP_MASK ; Setup Plane selections - INC DX ; DX -> SC_Data - - MOV AL, 08 ; 8 Lines to Process - MOV [BP].GPC_Lines, AL ; Save on Stack - - MOV DS, [BP].GPC_T_SETS ; Point to character set - -@GPC_DECODE_CHAR_BYTE: - - MOV SI, [BP].GPC_T_SETO ; Get DS:SI = String - - MOV BH, [SI] ; Get Bit Map - INC SI ; Point to Next Line - MOV [BP].GPC_T_SETO, SI ; And save new Pointer... - - CLR AX ; Clear AX - - CLR BL ; Clear BL - ROL BX, CL ; BL holds left edge bits - MOV SI, BX ; Use as Table Index - AND SI, CHAR_BITS ; Get Low Bits - MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - JZ @GPC_NO_LEFT1BITS ; Skip if No Pixels to set - - MOV AH, [BP].GPC_ColorF ; Get Foreground Color - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@GPC_NO_LEFT1BITS: - XOR AL, CH ; Invert mask for Background - JZ @GPC_NO_LEFT0BITS ; Hey, no need for this - - MOV AH, [BP].GPC_ColorB ; Get background Color - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - - ;Now Do Middle/Last Band - -@GPC_NO_LEFT0BITS: - INC DI ; Point to next Byte - ROL BX, 4 ; Shift 4 bits - - MOV SI, BX ; Make Lookup Pointer - AND SI, CHAR_BITS ; Get Low Bits - MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - JZ @GPC_NO_MIDDLE1BITS ; Skip if no pixels to set - - MOV AH, [BP].GPC_ColorF ; Get Foreground Color - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@GPC_NO_MIDDLE1BITS: - XOR AL, ALL_PLANES ; Invert mask for Background - JZ @GPC_NO_MIDDLE0BITS ; Hey, no need for this - - MOV AH, [BP].GPC_ColorB ; Get background Color - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@GPC_NO_MIDDLE0BITS: - XOR CH, ALL_PLANES ; Invert Clip Mask - CMP CL, 4 ; Aligned by 4? - JZ @GPC_NEXT_LINE ; If so, Exit now.. - - INC DI ; Point to next Byte - ROL BX, 4 ; Shift 4 bits - - MOV SI, BX ; Make Lookup Pointer - AND SI, CHAR_BITS ; Get Low Bits - MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - JZ @GPC_NO_RIGHT1BITS ; Skip if No Pixels to set - - MOV AH, [BP].GPC_ColorF ; Get Foreground Color - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@GPC_NO_RIGHT1BITS: - - XOR AL, CH ; Invert mask for Background - JZ @GPC_NO_RIGHT0BITS ; Hey, no need for this - - MOV AH, [BP].GPC_ColorB ; Get background Color - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@GPC_NO_RIGHT0BITS: - DEC DI ; Adjust for Next Line Advance - -@GPC_NEXT_LINE: - ADD DI, [BP].GPC_Width ; Point to Next Line - XOR CH, CHAR_BITS ; Flip the Clip mask back - - DEC [BP].GPC_Lines ; Count Down Lines - JZ @GPC_EXIT ; Ok... Done! - - JMP @GPC_DECODE_CHAR_BYTE ; Again! Hey! - -@GPC_EXIT: - ADD SP, 08 ; Deallocate stack workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 10 ; Exit and Clean up Stack - -GPRINTC ENDP - - -;========================================== -;TGPRINTC (CharNum%, Xpos%, Ypos%, ColorF%) -;========================================== -; -; Transparently draws an ASCII Text Character using the -; currently selected 8x8 font on the active display page. -; -; ENTRY: CharNum = ASCII character # to draw -; Xpos = X position to draw Character at -; Ypos = Y position of to draw Character at -; ColorF = Color to draw text character in -; -; EXIT: No meaningful values returned -; - -TGP_STACK STRUC - TGP_Width DW ? ; Screen Width-1 - TGP_Lines DB ?,? ; Scan lines to Decode - TGP_T_SETS DW ? ; Saved Charset Segment - TGP_T_SETO DW ? ; Saved Charset Offset - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - TGP_ColorF DB ?,? ; Text Color - TGP_Ypos DW ? ; Y Position to Print at - TGP_Xpos DW ? ; X position to Print at - TGP_Char DB ?,? ; Character to Print -TGP_STACK ENDS - - PUBLIC TGPRINTC - -TGPRINTC PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - SUB SP, 8 ; Allocate WorkSpace on Stack - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - MOV AX, SCREEN_WIDTH ; Get Logical Line Width - MOV BX, AX ; BX = Screen Width - DEC BX ; = Screen Width-1 - MOV [BP].TGP_Width, BX ; Save for later use - - MUL [BP].TGP_Ypos ; Start of Line = Ypos * Width - ADD DI, AX ; DI -> Start of Line Ypos - - MOV AX, [BP].TGP_Xpos ; Get Xpos of Character - MOV CX, AX ; Save Copy of Xpos - SHR AX, 2 ; Bytes into Line = Xpos/4 - ADD DI, AX ; DI -> (Xpos, Ypos) - - ;Get Source ADDR of Character Bit Map & Save - - MOV AL, [BP].TGP_Char ; Get Character # - TEST AL, 080h ; Is Hi Bit Set? - JZ @TGP_LowChar ; Nope, use low char set ptr - - AND AL, 07Fh ; Mask Out Hi Bit - MOV BX, CHARSET_HI ; BX = Char Set Ptr:Offset - MOV DX, CHARSET_HI+2 ; DX = Char Set Ptr:Segment - JMP s @TGP_Set_Char ; Go Setup Character Ptr - -@TGP_LowChar: - - MOV BX, CHARSET_LOW ; BX = Char Set Ptr:Offset - MOV DX, CHARSET_LOW+2 ; DX = Char Set Ptr:Segment - -@TGP_Set_Char: - MOV [BP].TGP_T_SETS, DX ; Save Segment on Stack - - MOV AH, 0 ; Valid #'s are 0..127 - SHL AX, 3 ; * 8 Bytes Per Bitmap - ADD BX, AX ; BX = Offset of Selected char - MOV [BP].TGP_T_SETO, BX ; Save Offset on Stack - - AND CX, PLANE_BITS ; Get Plane # - MOV CH, ALL_PLANES ; Get Initial Plane mask - SHL CH, CL ; And shift into position - AND CH, ALL_PLANES ; And mask to lower nibble - - MOV AL, 04 ; 4-Plane # = # of initial - SUB AL, CL ; shifts to align bit mask - MOV CL, AL ; Shift Count for SHL - - ;Get segment of character map - - OUT_8 SC_Index, MAP_MASK ; Setup Plane selections - INC DX ; DX -> SC_Data - - MOV AL, 08 ; 8 Lines to Process - MOV [BP].TGP_Lines, AL ; Save on Stack - - MOV DS, [BP].TGP_T_SETS ; Point to character set - -@TGP_DECODE_CHAR_BYTE: - - MOV SI, [BP].TGP_T_SETO ; Get DS:SI = String - - MOV BH, [SI] ; Get Bit Map - INC SI ; Point to Next Line - MOV [BP].TGP_T_SETO, SI ; And save new Pointer... - - MOV AH, [BP].TGP_ColorF ; Get Foreground Color - - CLR BL ; Clear BL - ROL BX, CL ; BL holds left edge bits - MOV SI, BX ; Use as Table Index - AND SI, CHAR_BITS ; Get Low Bits - MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - JZ @TGP_NO_LEFT1BITS ; Skip if No Pixels to set - - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - - ;Now Do Middle/Last Band - -@TGP_NO_LEFT1BITS: - - INC DI ; Point to next Byte - ROL BX, 4 ; Shift 4 bits - - MOV SI, BX ; Make Lookup Pointer - AND SI, CHAR_BITS ; Get Low Bits - MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - JZ @TGP_NO_MIDDLE1BITS ; Skip if no pixels to set - - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@TGP_NO_MIDDLE1BITS: - XOR CH, ALL_PLANES ; Invert Clip Mask - CMP CL, 4 ; Aligned by 4? - JZ @TGP_NEXT_LINE ; If so, Exit now.. - - INC DI ; Point to next Byte - ROL BX, 4 ; Shift 4 bits - - MOV SI, BX ; Make Lookup Pointer - AND SI, CHAR_BITS ; Get Low Bits - MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - JZ @TGP_NO_RIGHT1BITS ; Skip if No Pixels to set - - OUT DX, AL ; Set up Screen Mask - MOV ES:[DI], AH ; Write Foreground color - -@TGP_NO_RIGHT1BITS: - - DEC DI ; Adjust for Next Line Advance - -@TGP_NEXT_LINE: - ADD DI, [BP].TGP_Width ; Point to Next Line - XOR CH, CHAR_BITS ; Flip the Clip mask back - - DEC [BP].TGP_Lines ; Count Down Lines - JZ @TGP_EXIT ; Ok... Done! - - JMP @TGP_DECODE_CHAR_BYTE ; Again! Hey! - -@TGP_EXIT: - ADD SP, 08 ; Deallocate stack workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 8 ; Exit and Clean up Stack - -TGPRINTC ENDP - - -;=============================================================== -;PRINT_STR (SEG String, MaxLen%, Xpos%, Ypos%, ColorF%, ColorB%) -;=============================================================== -; -; Routine to quickly Print a null terminated ASCII string on the -; active display page up to a maximum length. -; -; ENTRY: String = Far Pointer to ASCII string to print -; MaxLen = # of characters to print if no null found -; Xpos = X position to draw Text at -; Ypos = Y position of to draw Text at -; ColorF = Color to draw text in -; ColorB = Color to set background to -; -; EXIT: No meaningful values returned -; - -PS_STACK STRUC - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - PS_ColorB DW ? ; Background Color - PS_ColorF DW ? ; Text Color - PS_Ypos DW ? ; Y Position to Print at - PS_Xpos DW ? ; X position to Print at - PS_Len DW ? ; Maximum Length of string to print - PS_Text DW ?,? ; Far Ptr to Text String -PS_STACK ENDS - - PUBLIC PRINT_STR - -PRINT_STR PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - MOV BP, SP ; Set up Stack Frame - -@PS_Print_It: - - MOV CX, [BP].PS_Len ; Get Remaining text Length - JCXZ @PS_Exit ; Exit when out of text - - LES DI, d [BP].PS_Text ; ES:DI -> Current Char in Text - MOV AL, ES:[DI] ; AL = Text Character - AND AX, 00FFh ; Clear High Word - JZ @PS_Exit ; Exit if null character - - DEC [BP].PS_Len ; Remaining Text length-- - INC [BP].PS_Text ; Point to Next text char - - ; Set up Call to GPRINTC - - PUSH AX ; Set Character Parameter - MOV BX, [BP].PS_Xpos ; Get Xpos - PUSH BX ; Set Xpos Parameter - ADD BX, 8 ; Advance 1 Char to Right - MOV [BP].PS_Xpos, BX ; Save for next time through - - MOV BX, [BP].PS_Ypos ; Get Ypos - PUSH BX ; Set Ypos Parameter - - MOV BX, [BP].PS_ColorF ; Get Text Color - PUSH BX ; Set ColorF Parameter - - MOV BX, [BP].PS_ColorB ; Get Background Color - PUSH BX ; Set ColorB Parameter - - CALL f GPRINTC ; Print Character! - JMP s @PS_Print_It ; Process next character - -@PS_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 14 ; Exit and Clean up Stack - -PRINT_STR ENDP - - -;================================================================ -;TPRINT_STR (SEG String, MaxLen%, Xpos%, Ypos%, ColorF%, ColorB%) -;================================================================ -; -; Routine to quickly transparently Print a null terminated ASCII -; string on the active display page up to a maximum length. -; -; ENTRY: String = Far Pointer to ASCII string to print -; MaxLen = # of characters to print if no null found -; Xpos = X position to draw Text at -; Ypos = Y position of to draw Text at -; ColorF = Color to draw text in -; -; EXIT: No meaningful values returned -; - -TPS_STACK STRUC - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - TPS_ColorF DW ? ; Text Color - TPS_Ypos DW ? ; Y Position to Print at - TPS_Xpos DW ? ; X position to Print at - TPS_Len DW ? ; Maximum Length of string to print - TPS_Text DW ?,? ; Far Ptr to Text String -TPS_STACK ENDS - - PUBLIC TPRINT_STR - -TPRINT_STR PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - MOV BP, SP ; Set up Stack Frame - -@TPS_Print_It: - - MOV CX, [BP].TPS_Len ; Get Remaining text Length - JCXZ @TPS_Exit ; Exit when out of text - - LES DI, d [BP].TPS_Text ; ES:DI -> Current Char in Text - MOV AL, ES:[DI] ; AL = Text Character - AND AX, 00FFh ; Clear High Word - JZ @TPS_Exit ; Exit if null character - - DEC [BP].TPS_Len ; Remaining Text length-- - INC [BP].TPS_Text ; Point to Next text char - - ; Set up Call to TGPRINTC - - PUSH AX ; Set Character Parameter - MOV BX, [BP].TPS_Xpos ; Get Xpos - PUSH BX ; Set Xpos Parameter - ADD BX, 8 ; Advance 1 Char to Right - MOV [BP].TPS_Xpos, BX ; Save for next time through - - MOV BX, [BP].TPS_Ypos ; Get Ypos - PUSH BX ; Set Ypos Parameter - - MOV BX, [BP].TPS_ColorF ; Get Text Color - PUSH BX ; Set ColorF Parameter - - CALL f TGPRINTC ; Print Character! - JMP s @TPS_Print_It ; Process next character - -@TPS_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 12 ; Exit and Clean up Stack - -TPRINT_STR ENDP - - -;=========================================== -;SET_DISPLAY_FONT(SEG FontData, FontNumber%) -;=========================================== -; -; Allows the user to specify their own font data for -; wither the lower or upper 128 characters. -; -; ENTRY: FontData = Far Pointer to Font Bitmaps -; FontNumber = Which half of set this is -; = 0, Lower 128 characters -; = 1, Upper 128 characters -; -; EXIT: No meaningful values returned -; - -SDF_STACK STRUC - DW ? ; BP - DD ? ; Caller - SDF_Which DW ? ; Hi Table/Low Table Flag - SDF_Font DD ? ; Far Ptr to Font Table -SDF_STACK ENDS - - PUBLIC SET_DISPLAY_FONT - -SET_DISPLAY_FONT PROC FAR - - PUSH BP ; Preserve Registers - MOV BP, SP ; Set up Stack Frame - - LES DI, [BP].SDF_Font ; Get Far Ptr to Font - - MOV SI, o CHARSET_LOW ; Assume Lower 128 chars - TEST [BP].SDF_Which, 1 ; Font #1 selected? - JZ @SDF_Set_Font ; If not, skip ahead - - MOV SI, o CHARSET_HI ; Ah, really it's 128-255 - -@SDF_Set_Font: - MOV [SI], DI ; Set Font Pointer Offset - MOV [SI+2], ES ; Set Font Pointer Segment - - POP BP ; Restore Registers - RET 6 ; We are Done.. Outa here - -SET_DISPLAY_FONT ENDP - - - ; ===== BITMAP (SPRITE) DISPLAY ROUTINES ===== - -;====================================================== -;DRAW_BITMAP (SEG Image, Xpos%, Ypos%, Width%, Height%) -;====================================================== -; -; Draws a variable sized Graphics Bitmap such as a -; picture or an Icon on the current Display Page in -; Mode X. The Bitmap is stored in a linear byte array -; corresponding to (0,0) (1,0), (2,0) .. (Width, Height) -; This is the same linear manner as mode 13h graphics. -; -; ENTRY: Image = Far Pointer to Bitmap Data -; Xpos = X position to Place Upper Left pixel at -; Ypos = Y position to Place Upper Left pixel at -; Width = Width of the Bitmap in Pixels -; Height = Height of the Bitmap in Pixels -; -; EXIT: No meaningful values returned -; - -DB_STACK STRUC - DB_LineO DW ? ; Offset to Next Line - DB_PixCount DW ? ; (Minimum) # of Pixels/Line - DB_Start DW ? ; Addr of Upper Left Pixel - DB_PixSkew DW ? ; # of bytes to Adjust EOL - DB_SkewFlag DW ? ; Extra Pix on Plane Flag - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - DB_Height DW ? ; Height of Bitmap in Pixels - DB_Width DW ? ; Width of Bitmap in Pixels - DB_Ypos DW ? ; Y position to Draw Bitmap at - DB_Xpos DW ? ; X position to Draw Bitmap at - DB_Image DD ? ; Far Pointer to Graphics Bitmap -DB_STACK ENDS - - PUBLIC DRAW_BITMAP - -DRAW_BITMAP PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - SUB SP, 10 ; Allocate workspace - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - CLD ; Direction Flag = Forward - - MOV AX, [BP].DB_Ypos ; Get UL Corner Ypos - MUL SCREEN_WIDTH ; AX = Offset to Line Ypos - - MOV BX, [BP].DB_Xpos ; Get UL Corner Xpos - MOV CL, BL ; Save Plane # in CL - SHR BX, 2 ; Xpos/4 = Offset Into Line - - ADD DI, AX ; ES:DI -> Start of Line - ADD DI, BX ; ES:DI -> Upper Left Pixel - MOV [BP].DB_Start, DI ; Save Starting Addr - - ; Compute line to line offset - - MOV BX, [BP].DB_Width ; Get Width of Image - MOV DX, BX ; Save Copy in DX - SHR BX, 2 ; /4 = width in bands - MOV AX, SCREEN_WIDTH ; Get Screen Width - SUB AX, BX ; - (Bitmap Width/4) - - MOV [BP].DB_LineO, AX ; Save Line Width offset - MOV [BP].DB_PixCount, BX ; Minimum # pix to copy - - AND DX, PLANE_BITS ; Get "partial band" size (0-3) - MOV [BP].DB_PixSkew, DX ; Also End of Line Skew - MOV [BP].DB_SkewFlag, DX ; Save as Flag/Count - - AND CX, PLANE_BITS ; CL = Starting Plane # - MOV AX, MAP_MASK_PLANE2 ; Plane Mask & Plane Select - SHL AH, CL ; Select correct Plane - OUT_16 SC_Index, AX ; Select Plane... - MOV BH, AH ; BH = Saved Plane Mask - MOV BL, 4 ; BL = Planes to Copy - -@DB_COPY_PLANE: - - LDS SI, [BP].DB_Image ; DS:SI-> Source Image - MOV DX, [BP].DB_Height ; # of Lines to Copy - MOV DI, [BP].DB_Start ; ES:DI-> Dest pos - -@DB_COPY_LINE: - MOV CX, [BP].DB_PixCount ; Min # to copy - - TEST CL, 0FCh ; 16+PixWide? - JZ @DB_COPY_REMAINDER ; Nope... - - ; Pixel Copy loop has been unrolled to x4 - -@DB_COPY_LOOP: - MOVSB ; Copy Bitmap Pixel - ADD SI, 3 ; Skip to Next Byte in same plane - MOVSB ; Copy Bitmap Pixel - ADD SI, 3 ; Skip to Next Byte in same plane - MOVSB ; Copy Bitmap Pixel - ADD SI, 3 ; Skip to Next Byte in same plane - MOVSB ; Copy Bitmap Pixel - ADD SI, 3 ; Skip to Next Byte in same plane - - SUB CL, 4 ; Pixels to Copy=-4 - TEST CL, 0FCh ; 4+ Pixels Left? - JNZ @DB_COPY_LOOP ; if so, do another block - -@DB_COPY_REMAINDER: - JCXZ @DB_NEXT_LINE ; Any Pixels left on line - -@DB_COPY2: - MOVSB ; Copy Bitmap Pixel - ADD SI,3 ; Skip to Next Byte in same plane - LOOPx CX, @DB_COPY2 ; Pixels to Copy--, Loop until done - -@DB_NEXT_LINE: - - ; any Partial Pixels? (some planes only) - - OR CX, [BP].DB_SkewFlag ; Get Skew Count - JZ @DB_NEXT2 ; if no partial pixels - - MOVSB ; Copy Bitmap Pixel - DEC DI ; Back up to align - DEC SI ; Back up to align - -@DB_NEXT2: - ADD SI, [BP].DB_PixSkew ; Adjust Skew - ADD DI, [BP].DB_LineO ; Set to Next Display Line - LOOPx DX, @DB_COPY_LINE ; Lines to Copy--, Loop if more - - ; Copy Next Plane.... - - DEC BL ; Planes to Go-- - JZ @DB_Exit ; Hey! We are done - - ROL BH, 1 ; Next Plane in line... - OUT_8 SC_Data, BH ; Select Plane - - CMP AL, 12h ; Carry Set if AL=11h - ADC [BP].DB_Start, 0 ; Screen Addr =+Carry - INC w [BP].DB_Image ; Start @ Next Byte - - SUB [BP].DB_SkewFlag, 1 ; Reduce Planes to Skew - ADC [BP].DB_SkewFlag, 0 ; Back to 0 if it was -1 - - JMP s @DB_COPY_PLANE ; Go Copy the Next Plane - -@DB_Exit: - ADD SP, 10 ; Deallocate workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 12 ; Exit and Clean up Stack - -DRAW_BITMAP ENDP - - -;======================================================= -;TDRAW_BITMAP (SEG Image, Xpos%, Ypos%, Width%, Height%) -;======================================================= -; -; Transparently Draws a variable sized Graphics Bitmap -; such as a picture or an Icon on the current Display Page -; in Mode X. Pixels with a value of 0 are not drawn, -; leaving the previous "background" contents intact. -; -; The Bitmap format is the same as for the DRAW_BITMAP function. -; -; ENTRY: Image = Far Pointer to Bitmap Data -; Xpos = X position to Place Upper Left pixel at -; Ypos = Y position to Place Upper Left pixel at -; Width = Width of the Bitmap in Pixels -; Height = Height of the Bitmap in Pixels -; -; EXIT: No meaningful values returned -; - -TB_STACK STRUC - TB_LineO DW ? ; Offset to Next Line - TB_PixCount DW ? ; (Minimum) # of Pixels/Line - TB_Start DW ? ; Addr of Upper Left Pixel - TB_PixSkew DW ? ; # of bytes to Adjust EOL - TB_SkewFlag DW ? ; Extra Pix on Plane Flag - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - TB_Height DW ? ; Height of Bitmap in Pixels - TB_Width DW ? ; Width of Bitmap in Pixels - TB_Ypos DW ? ; Y position to Draw Bitmap at - TB_Xpos DW ? ; X position to Draw Bitmap at - TB_Image DD ? ; Far Pointer to Graphics Bitmap -TB_STACK ENDS - - PUBLIC TDRAW_BITMAP - -TDRAW_BITMAP PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - SUB SP, 10 ; Allocate workspace - MOV BP, SP ; Set up Stack Frame - - LES DI, d CURRENT_PAGE ; Point to Active VGA Page - CLD ; Direction Flag = Forward - - MOV AX, [BP].TB_Ypos ; Get UL Corner Ypos - MUL SCREEN_WIDTH ; AX = Offset to Line Ypos - - MOV BX, [BP].TB_Xpos ; Get UL Corner Xpos - MOV CL, BL ; Save Plane # in CL - SHR BX, 2 ; Xpos/4 = Offset Into Line - - ADD DI, AX ; ES:DI -> Start of Line - ADD DI, BX ; ES:DI -> Upper Left Pixel - MOV [BP].TB_Start, DI ; Save Starting Addr - - ; Compute line to line offset - - MOV BX, [BP].TB_Width ; Get Width of Image - MOV DX, BX ; Save Copy in DX - SHR BX, 2 ; /4 = width in bands - MOV AX, SCREEN_WIDTH ; Get Screen Width - SUB AX, BX ; - (Bitmap Width/4) - - MOV [BP].TB_LineO, AX ; Save Line Width offset - MOV [BP].TB_PixCount, BX ; Minimum # pix to copy - - AND DX, PLANE_BITS ; Get "partial band" size (0-3) - MOV [BP].TB_PixSkew, DX ; Also End of Line Skew - MOV [BP].TB_SkewFlag, DX ; Save as Flag/Count - - AND CX, PLANE_BITS ; CL = Starting Plane # - MOV AX, MAP_MASK_PLANE2 ; Plane Mask & Plane Select - SHL AH, CL ; Select correct Plane - OUT_16 SC_Index, AX ; Select Plane... - MOV BH, AH ; BH = Saved Plane Mask - MOV BL, 4 ; BL = Planes to Copy - -@TB_COPY_PLANE: - - LDS SI, [BP].TB_Image ; DS:SI-> Source Image - MOV DX, [BP].TB_Height ; # of Lines to Copy - MOV DI, [BP].TB_Start ; ES:DI-> Dest pos - - ; Here AH is set with the value to be considered - ; "Transparent". It can be changed! - - MOV AH, 0 ; Value to Detect 0 - -@TB_COPY_LINE: - MOV CX, [BP].TB_PixCount ; Min # to copy - - TEST CL, 0FCh ; 16+PixWide? - JZ @TB_COPY_REMAINDER ; Nope... - - ; Pixel Copy loop has been unrolled to x4 - -@TB_COPY_LOOP: - LODSB ; Get Pixel Value in AL - ADD SI, 3 ; Skip to Next Byte in same plane - CMP AL, AH ; It is "Transparent"? - JE @TB_SKIP_01 ; Skip ahead if so - MOV ES:[DI], AL ; Copy Pixel to VGA screen - -@TB_SKIP_01: - LODSB ; Get Pixel Value in AL - ADD SI, 3 ; Skip to Next Byte in same plane - CMP AL, AH ; It is "Transparent"? - JE @TB_SKIP_02 ; Skip ahead if so - MOV ES:[DI+1], AL ; Copy Pixel to VGA screen - -@TB_SKIP_02: - LODSB ; Get Pixel Value in AL - ADD SI, 3 ; Skip to Next Byte in same plane - CMP AL, AH ; It is "Transparent"? - JE @TB_SKIP_03 ; Skip ahead if so - MOV ES:[DI+2], AL ; Copy Pixel to VGA screen - -@TB_SKIP_03: - LODSB ; Get Pixel Value in AL - ADD SI, 3 ; Skip to Next Byte in same plane - CMP AL, AH ; It is "Transparent"? - JE @TB_SKIP_04 ; Skip ahead if so - MOV ES:[DI+3], AL ; Copy Pixel to VGA screen - -@TB_SKIP_04: - ADD DI, 4 ; Adjust Pixel Write Location - SUB CL, 4 ; Pixels to Copy=-4 - TEST CL, 0FCh ; 4+ Pixels Left? - JNZ @TB_COPY_LOOP ; if so, do another block - -@TB_COPY_REMAINDER: - JCXZ @TB_NEXT_LINE ; Any Pixels left on line - -@TB_COPY2: - LODSB ; Get Pixel Value in AL - ADD SI, 3 ; Skip to Next Byte in same plane - CMP AL, AH ; It is "Transparent"? - JE @TB_SKIP_05 ; Skip ahead if so - MOV ES:[DI], AL ; Copy Pixel to VGA screen - -@TB_SKIP_05: - INC DI ; Advance Dest Addr - LOOPx CX, @TB_COPY2 ; Pixels to Copy--, Loop until done - -@TB_NEXT_LINE: - - ; any Partial Pixels? (some planes only) - - OR CX, [BP].TB_SkewFlag ; Get Skew Count - JZ @TB_NEXT2 ; if no partial pixels - - LODSB ; Get Pixel Value in AL - DEC SI ; Backup to Align - CMP AL, AH ; It is "Transparent"? - JE @TB_NEXT2 ; Skip ahead if so - MOV ES:[DI], AL ; Copy Pixel to VGA screen - -@TB_NEXT2: - ADD SI, [BP].TB_PixSkew ; Adjust Skew - ADD DI, [BP].TB_LineO ; Set to Next Display Line - LOOPx DX, @TB_COPY_LINE ; Lines to Copy--, Loop if More - - ;Copy Next Plane.... - - DEC BL ; Planes to Go-- - JZ @TB_Exit ; Hey! We are done - - ROL BH, 1 ; Next Plane in line... - OUT_8 SC_Data, BH ; Select Plane - - CMP AL, 12h ; Carry Set if AL=11h - ADC [BP].TB_Start, 0 ; Screen Addr =+Carry - INC w [BP].TB_Image ; Start @ Next Byte - - SUB [BP].TB_SkewFlag, 1 ; Reduce Planes to Skew - ADC [BP].TB_SkewFlag, 0 ; Back to 0 if it was -1 - - JMP @TB_COPY_PLANE ; Go Copy the next Plane - -@TB_Exit: - ADD SP, 10 ; Deallocate workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 12 ; Exit and Clean up Stack - -TDRAW_BITMAP ENDP - - - ; ==== VIDEO MEMORY to VIDEO MEMORY COPY ROUTINES ===== - -;================================== -;COPY_PAGE (SourcePage%, DestPage%) -;================================== -; -; Duplicate on display page onto another -; -; ENTRY: SourcePage = Display Page # to Duplicate -; DestPage = Display Page # to hold copy -; -; EXIT: No meaningful values returned -; - -CP_STACK STRUC - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - CP_DestP DW ? ; Page to hold copied image - CP_SourceP DW ? ; Page to Make copy from -CP_STACK ENDS - - PUBLIC COPY_PAGE - -COPY_PAGE PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - MOV BP, SP ; Set up Stack Frame - CLD ; Block Xfer Forwards - - ; Make sure Page #'s are valid - - MOV AX, [BP].CP_SourceP ; Get Source Page # - CMP AX, LAST_PAGE ; is it > Max Page #? - JAE @CP_Exit ; if so, abort - - MOV BX, [BP].CP_DestP ; Get Destination Page # - CMP BX, LAST_PAGE ; is it > Max Page #? - JAE @CP_Exit ; if so, abort - - CMP AX, BX ; Pages #'s the same? - JE @CP_Exit ; if so, abort - - ; Setup DS:SI and ES:DI to Video Pages - - SHL BX, 1 ; Scale index to Word - MOV DI, PAGE_ADDR[BX] ; Offset to Dest Page - - MOV BX, AX ; Index to Source page - SHL BX, 1 ; Scale index to Word - MOV SI, PAGE_ADDR[BX] ; Offset to Source Page - - MOV CX, PAGE_SIZE ; Get size of Page - MOV AX, CURRENT_SEGMENT ; Get Video Mem Segment - MOV ES, AX ; ES:DI -> Dest Page - MOV DS, AX ; DS:SI -> Source Page - - ; Setup VGA registers for Mem to Mem copy - - OUT_16 GC_Index, LATCHES_ON ; Data from Latches = on - OUT_16 SC_Index, ALL_PLANES_ON ; Copy all Planes - - ; Note.. Do *NOT* use MOVSW or MOVSD - they will - ; Screw with the latches which are 8 bits x 4 - - REP MOVSB ; Copy entire Page! - - ; Reset VGA for normal memory access - - OUT_16 GC_Index, LATCHES_OFF ; Data from Latches = off - -@CP_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 4 ; Exit and Clean up Stack - -COPY_PAGE ENDP - - -;========================================================================== -;COPY_BITMAP (SourcePage%, X1%, Y1%, X2%, Y2%, DestPage%, DestX1%, DestY1%) -;========================================================================== -; -; Copies a Bitmap Image from one Display Page to Another -; This Routine is Limited to copying Images with the same -; Plane Alignment. To Work: (X1 MOD 4) must = (DestX1 MOD 4) -; Copying an Image to the Same Page is supported, but results -; may be defined when the when the rectangular areas -; (X1, Y1) - (X2, Y2) and (DestX1, DestY1) - -; (DestX1+(X2-X1), DestY1+(Y2-Y1)) overlap... -; No Paramter checking to done to insure that -; X2 >= X1 and Y2 >= Y1. Be Careful... -; -; ENTRY: SourcePage = Display Page # with Source Image -; X1 = Upper Left Xpos of Source Image -; Y1 = Upper Left Ypos of Source Image -; X2 = Lower Right Xpos of Source Image -; Y2 = Lower Right Ypos of Source Image -; DestPage = Display Page # to copy Image to -; DestX1 = Xpos to Copy UL Corner of Image to -; DestY1 = Ypos to Copy UL Corner of Image to -; -; EXIT: AX = Success Flag: 0 = Failure / -1= Success -; - -CB_STACK STRUC - CB_Height DW ? ; Height of Image in Lines - CB_Width DW ? ; Width of Image in "bands" - DW ?x4 ; DI, SI, DS, BP - DD ? ; Caller - CB_DestY1 DW ? ; Destination Ypos - CB_DestX1 DW ? ; Destination Xpos - CB_DestP DW ? ; Page to Copy Bitmap To - CB_Y2 DW ? ; LR Ypos of Image - CB_X2 DW ? ; LR Xpos of Image - CB_Y1 DW ? ; UL Ypos of Image - CB_X1 DW ? ; UL Xpos of Image - CB_SourceP DW ? ; Page containing Source Bitmap -CB_STACK ENDS - - PUBLIC COPY_BITMAP - -COPY_BITMAP PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - SUB SP, 4 ; Allocate WorkSpace on Stack - MOV BP, SP ; Set up Stack Frame - - ; Prep Registers (and keep jumps short!) - - MOV ES, CURRENT_SEGMENT ; ES -> VGA Ram - CLD ; Block Xfer Forwards - - ; Make sure Parameters are valid - - MOV BX, [BP].CB_SourceP ; Get Source Page # - CMP BX, LAST_PAGE ; is it > Max Page #? - JAE @CB_Abort ; if so, abort - - MOV CX, [BP].CB_DestP ; Get Destination Page # - CMP CX, LAST_PAGE ; is it > Max Page #? - JAE @CB_Abort ; if so, abort - - MOV AX, [BP].CB_X1 ; Get Source X1 - XOR AX, [BP].CB_DestX1 ; Compare Bits 0-1 - AND AX, PLANE_BITS ; Check Plane Bits - JNZ @CB_Abort ; They should cancel out - - ; Setup for Copy processing - - OUT_8 SC_INDEX, MAP_MASK ; Set up for Plane Select - OUT_16 GC_Index, LATCHES_ON ; Data from Latches = on - - ; Compute Info About Images, Setup ES:SI & ES:DI - - MOV AX, [BP].CB_Y2 ; Height of Bitmap in lines - SUB AX, [BP].CB_Y1 ; is Y2 - Y1 + 1 - INC AX ; (add 1 since were not 0 based) - MOV [BP].CB_Height, AX ; Save on Stack for later use - - MOV AX, [BP].CB_X2 ; Get # of "Bands" of 4 Pixels - MOV DX, [BP].CB_X1 ; the Bitmap Occupies as X2-X1 - SHR AX, 2 ; Get X2 Band (X2 / 4) - SHR DX, 2 ; Get X1 Band (X1 / 4) - SUB AX, DX ; AX = # of Bands - 1 - INC AX ; AX = # of Bands - MOV [BP].CB_Width, AX ; Save on Stack for later use - - SHL BX, 1 ; Scale Source Page to Word - MOV SI, PAGE_ADDR[BX] ; SI = Offset of Source Page - MOV AX, [BP].CB_Y1 ; Get Source Y1 Line - MUL SCREEN_WIDTH ; AX = Offset to Line Y1 - ADD SI, AX ; SI = Offset to Line Y1 - MOV AX, [BP].CB_X1 ; Get Source X1 - SHR AX, 2 ; X1 / 4 = Byte offset - ADD SI, AX ; SI = Byte Offset to (X1,Y1) - - MOV BX, CX ; Dest Page Index to BX - SHL BX, 1 ; Scale Source Page to Word - MOV DI, PAGE_ADDR[BX] ; DI = Offset of Dest Page - MOV AX, [BP].CB_DestY1 ; Get Dest Y1 Line - MUL SCREEN_WIDTH ; AX = Offset to Line Y1 - ADD DI, AX ; DI = Offset to Line Y1 - MOV AX, [BP].CB_DestX1 ; Get Dest X1 - SHR AX, 2 ; X1 / 4 = Byte offset - ADD DI, AX ; DI = Byte Offset to (D-X1,D-Y1) - - MOV CX, [BP].CB_Width ; CX = Width of Image (Bands) - DEC CX ; CX = 1? - JE @CB_Only_One_Band ; 0 Means Image Width of 1 Band - - MOV BX, [BP].CB_X1 ; Get Source X1 - AND BX, PLANE_BITS ; Aligned? (bits 0-1 = 00?) - JZ @CB_Check_Right ; if so, check right alignment - JNZ @CB_Left_Band ; not aligned? well.. - -@CB_Abort: - CLR AX ; Return False (Failure) - JMP @CB_Exit ; and Finish Up - - ; Copy when Left & Right Clip Masks overlap... - -@CB_Only_One_Band: - MOV BX, [BP].CB_X1 ; Get Left Clip Mask - AND BX, PLANE_BITS ; Mask out Row # - MOV AL, Left_Clip_Mask[BX] ; Get Left Edge Mask - MOV BX, [BP].CB_X2 ; Get Right Clip Mask - AND BX, PLANE_BITS ; Mask out Row # - AND AL, Right_Clip_Mask[BX] ; Get Right Edge Mask byte - - OUT_8 SC_Data, AL ; Clip For Left & Right Masks - - MOV CX, [BP].CB_Height ; CX = # of Lines to Copy - MOV DX, SCREEN_WIDTH ; DX = Width of Screen - CLR BX ; BX = Offset into Image - -@CB_One_Loop: - MOV AL, ES:[SI+BX] ; Load Latches - MOV ES:[DI+BX], AL ; Unload Latches - ADD BX, DX ; Advance Offset to Next Line - LOOPjz CX, @CB_One_Done ; Exit Loop if Finished - - MOV AL, ES:[SI+BX] ; Load Latches - MOV ES:[DI+BX], AL ; Unload Latches - ADD BX, DX ; Advance Offset to Next Line - LOOPx CX, @CB_One_Loop ; Loop until Finished - -@CB_One_Done: - JMP @CB_Finish ; Outa Here! - - ; Copy Left Edge of Bitmap - -@CB_Left_Band: - - OUT_8 SC_Data, Left_Clip_Mask[BX] ; Set Left Edge Plane Mask - - MOV CX, [BP].CB_Height ; CX = # of Lines to Copy - MOV DX, SCREEN_WIDTH ; DX = Width of Screen - CLR BX ; BX = Offset into Image - -@CB_Left_Loop: - MOV AL, ES:[SI+BX] ; Load Latches - MOV ES:[DI+BX], AL ; Unload Latches - ADD BX, DX ; Advance Offset to Next Line - LOOPjz CX, @CB_Left_Done ; Exit Loop if Finished - - MOV AL, ES:[SI+BX] ; Load Latches - MOV ES:[DI+BX], AL ; Unload Latches - ADD BX, DX ; Advance Offset to Next Line - LOOPx CX, @CB_Left_Loop ; Loop until Finished - -@CB_Left_Done: - INC DI ; Move Dest Over 1 band - INC SI ; Move Source Over 1 band - DEC [BP].CB_Width ; Band Width-- - - ; Determine if Right Edge of Bitmap needs special copy - -@CB_Check_Right: - MOV BX, [BP].CB_X2 ; Get Source X2 - AND BX, PLANE_BITS ; Aligned? (bits 0-1 = 11?) - CMP BL, 03h ; Plane = 3? - JE @CB_Copy_Middle ; Copy the Middle then! - - ; Copy Right Edge of Bitmap - -@CB_Right_Band: - - OUT_8 SC_Data, Right_Clip_Mask[BX] ; Set Right Edge Plane Mask - - DEC [BP].CB_Width ; Band Width-- - MOV CX, [BP].CB_Height ; CX = # of Lines to Copy - MOV DX, SCREEN_WIDTH ; DX = Width of Screen - MOV BX, [BP].CB_Width ; BX = Offset to Right Edge - -@CB_Right_Loop: - MOV AL, ES:[SI+BX] ; Load Latches - MOV ES:[DI+BX], AL ; Unload Latches - ADD BX, DX ; Advance Offset to Next Line - LOOPjz CX, @CB_Right_Done ; Exit Loop if Finished - - MOV AL, ES:[SI+BX] ; Load Latches - MOV ES:[DI+BX], AL ; Unload Latches - ADD BX, DX ; Advance Offset to Next Line - LOOPx CX, @CB_Right_Loop ; Loop until Finished - -@CB_Right_Done: - - ; Copy the Main Block of the Bitmap - -@CB_Copy_Middle: - - MOV CX, [BP].CB_Width ; Get Width Remaining - JCXZ @CB_Finish ; Exit if Done - - OUT_8 SC_Data, ALL_PLANES ; Copy all Planes - - MOV DX, SCREEN_WIDTH ; Get Width of Screen minus - SUB DX, CX ; Image width (for Adjustment) - MOV AX, [BP].CB_Height ; AX = # of Lines to Copy - MOV BX, CX ; BX = Quick REP reload count - MOV CX, ES ; Move VGA Segment - MOV DS, CX ; Into DS - - ; Actual Copy Loop. REP MOVSB does the work - -@CB_Middle_Copy: - MOV CX, BX ; Recharge Rep Count - REP MOVSB ; Move Bands - LOOPjz AX, @CB_Finish ; Exit Loop if Finished - - ADD SI, DX ; Adjust DS:SI to Next Line - ADD DI, DX ; Adjust ES:DI to Next Line - - MOV CX, BX ; Recharge Rep Count - REP MOVSB ; Move Bands - - ADD SI, DX ; Adjust DS:SI to Next Line - ADD DI, DX ; Adjust ES:DI to Next Line - LOOPx AX, @CB_Middle_Copy ; Copy Lines until Done - -@CB_Finish: - OUT_16 GC_Index, LATCHES_OFF ; Data from Latches = on - -@CB_Exit: - ADD SP, 04 ; Deallocate stack workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - RET 16 ; Exit and Clean up Stack - -COPY_BITMAP ENDP - - END ; End of Code Segment diff --git a/modex105/MODEX.BI b/modex105/MODEX.BI deleted file mode 100755 index 6b1d7afe..00000000 --- a/modex105/MODEX.BI +++ /dev/null @@ -1,63 +0,0 @@ - - ' ===== SCREEN RESOLUTIONS ===== - -CONST Mode320x200 = 0, Mode320x400 = 1 -CONST Mode360x200 = 2, Mode360x400 = 3 -CONST Mode320x240 = 4, Mode320x480 = 5 -CONST Mode360x240 = 6, Mode360x480 = 7 - - ' ===== MODE X SETUP ROUTINES ===== - -DECLARE FUNCTION SET.VGA.MODEX% ALIAS "SET_VGA_MODEX" (BYVAL ModeType%, BYVAL MaxXpos%, BYVAL MaxYpos%, BYVAL Pages%) -DECLARE FUNCTION SET.MODEX% ALIAS "SET_MODEX" (BYVAL Mode%) - - ' ===== BASIC GRAPHICS PRIMITIVES ===== - -DECLARE SUB CLEAR.VGA.SCREEN ALIAS "CLEAR_VGA_SCREEN" (BYVAL ColorNum%) -DECLARE SUB SET.POINT ALIAS "SET_POINT" (BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorNum%) -DECLARE FUNCTION READ.POINT% ALIAS "READ_POINT" (BYVAL Xpos%, BYVAL Ypos%) -DECLARE SUB FILL.BLOCK ALIAS "FILL_BLOCK" (BYVAL Xpos1%, BYVAL Ypos1%, BYVAL Xpos2%, BYVAL Ypos2%, BYVAL ColorNum%) -DECLARE SUB DRAW.LINE ALIAS "DRAW_LINE" (BYVAL Xpos1%, BYVAL Ypos1%, BYVAL Xpos2%, BYVAL Ypos2%, BYVAL ColorNum%) - - ' ===== DAC COLOR REGISTER ROUTINES ===== - -DECLARE SUB SET.DAC.REGISTER ALIAS "SET_DAC_REGISTER" (BYVAL RegNo%, BYVAL Red%, BYVAL Green%, BYVAL Blue%) -DECLARE SUB GET.DAC.REGISTER ALIAS "GET_DAC_REGISTER" (BYVAL RegNo%, Red%, Green%, Blue%) -DECLARE SUB LOAD.DAC.REGISTERS ALIAS "LOAD_DAC_REGISTERS" (SEG PalData AS ANY, BYVAL StartReg%, BYVAL EndReg%, BYVAL VSync%) -DECLARE SUB READ.DAC.REGISTERS ALIAS "READ_DAC_REGISTERS" (SEG PalData AS ANY, BYVAL StartReg%, BYVAL EndReg%) - - - ' ===== PAGE FLIPPING AND SCROLLING ROUTINES ===== - -DECLARE SUB SET.ACTIVE.PAGE ALIAS "SET_ACTIVE_PAGE" (BYVAL PageNo%) -DECLARE FUNCTION GET.ACTIVE.PAGE% ALIAS "GET_ACTIVE_PAGE" -DECLARE SUB SET.DISPLAY.PAGE ALIAS "SET_DISPLAY_PAGE" (BYVAL PageNo%) -DECLARE FUNCTION GET.DISPLAY.PAGE% ALIAS "GET_DISPLAY_PAGE" -DECLARE SUB SET.WINDOW ALIAS "SET_WINDOW" (BYVAL DisplayPage%, BYVAL XOffset%, BYVAL YOffset%) -DECLARE FUNCTION GET.X.OFFSET% ALIAS "GET_X_OFFSET" () -DECLARE FUNCTION GET.Y.OFFSET% ALIAS "GET_Y_OFFSET" () -DECLARE SUB SYNC.DISPLAY ALIAS "SYNC_DISPLAY" - - ' ===== TEXT DISPLAY ROUTINES ===== - -DECLARE SUB GPRINTC (BYVAL CharacterNum%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%, BYVAL ColorB%) -DECLARE SUB TGPRINTC (BYVAL CharacterNum%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%) -DECLARE SUB PRINT.STR ALIAS "PRINT_STR" (BYVAL StrSeg%, BYVAL StrOfs%, BYVAL MaxLen%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%, BYVAL ColorB%) -DECLARE SUB TPRINT.STR ALIAS "TPRINT_STR" (BYVAL StrSeg%, BYVAL StrOfs%, BYVAL MaxLen%, BYVAL Xpos%, BYVAL Ypos%, BYVAL ColorF%) -DECLARE SUB SET.DISPLAY.FONT ALIAS "SET_DISPLAY_FONT" (SEG FontData AS ANY, BYVAL FontNumber%) - - ' ===== BITMAP (SPRITE) DISPLAY ROUTINES ===== - -DECLARE SUB DRAW.BITMAP ALIAS "DRAW_BITMAP" (SEG Image AS ANY, BYVAL Xpos%, BYVAL Ypos%, BYVAL xWidth%, BYVAL Height%) -DECLARE SUB TDRAW.BITMAP ALIAS "TDRAW_BITMAP" (SEG Image AS ANY, BYVAL Xpos%, BYVAL Ypos%, BYVAL xWidth%, BYVAL Height%) - - ' ==== VIDEO MEMORY to VIDEO MEMORY COPY ROUTINES ===== - -DECLARE SUB COPY.PAGE ALIAS "COPY_PAGE" (BYVAL SourcePage%, BYVAL DestPage%) -DECLARE SUB COPY.BITMAP ALIAS "COPY_BITMAP" (BYVAL SourcePage%, BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%, BYVAL DestPage%, BYVAL DestX1%, BYVAL DestY1%) - - - - - - diff --git a/modex105/MODEX.H b/modex105/MODEX.H deleted file mode 100755 index 7de25a63..00000000 --- a/modex105/MODEX.H +++ /dev/null @@ -1,76 +0,0 @@ - -#ifndef __MODEX_H -#define __MODEX_H - - /* ===== SCREEN RESOLUTIONS ===== */ - -#define Mode_320x200 0 -#define Mode_320x400 1 -#define Mode_360x200 2 -#define Mode_360x400 3 -#define Mode_320x240 4 -#define Mode_320x480 5 -#define Mode_360x240 6 -#define Mode_360x480 7 - - /* ===== MODE X SETUP ROUTINES ===== */ - -int far pascal set_vga_modex (int Mode, int MaxXpos, int MaxYpos, int Pages); -int far pascal set_modex (int Mode); - - /* ===== BASIC GRAPHICS PRIMITIVES ===== */ - -void far pascal clear_vga_screen (int Color); -void far pascal set_point (int Xpos, int Ypos, int Color); -int far pascal read_point (int Xpos, int Ypos); -void far pascal fill_block (int Xpos1, int Ypos1, int Xpos2, int Ypos2, - int Color); -void far pascal draw_line (int Xpos1, int Ypos1, int Xpos2, int Ypos2, - int Color); - - /* ===== DAC COLOR REGISTER ROUTINES ===== */ - -void far pascal set_dac_register (int RegNo, int Red, int Green, int Blue); -void far pascal get_dac_register (int RegNo, int* Red, int* Green, int* Blue); -void far pascal load_dac_registers (char far *PalData, int StartReg, - int EndReg, int VSync); -void far pascal readd_dac_registers (char far *PalData, int StartReg, - int EndReg); - - /* ===== PAGE FLIPPING AND SCROLLING ROUTINES ===== */ - -void far pascal set_active_page (int PageNo); -int far pascal get_active_page (void); -void far pascal set_display_page (int PageNo); -int far pascal get_display_page (void); -void far pascal set_window (int DisplayPage, int XOffset, int YOffset); -int far pascal get_x_offset (void); -int far pascal get_y_offset (void); -void far pascal sync_display (void); - - /* ===== TEXT DISPLAY ROUTINES ===== */ - -void far pascal gprintc (int CharNum, int Xpos, int Ypos, int ColorF, - int ColorB); -void far pascal tgprintc (int CharNum, int Xpos, int Ypos, int ColorF); -void far pascal print_str (char far *Text, int MaxLen, int Xpos, int Ypos, - int ColorF, int ColorB); -void far pascal tprint_str (char far *Text, int MaxLen, int Xpos, int Ypos, - int ColorF); -void far pascal set_display_font (char far *FontData, int FontNumber); - - /* ===== BITMAP (SPRITE) DISPLAY ROUTINES ===== */ - -void far pascal draw_bitmap (char far *Image, int Xpos, int Ypos, - int Width, int Height); -void far pascal tdraw_bitmap (char far *Image, int Xpos, int Ypos, - int Width, int Height); - - /* ==== VIDEO MEMORY to VIDEO MEMORY COPY ROUTINES ===== */ - -void far pascal copy_page (int SourcePage, int DestPage); -void far pascal copy_bitmap (int SourcePage, int X1, int Y1, int X2, int Y2, - int DestPage, int DestX1, int DestY1); - - -#endif diff --git a/modex105/MODEX.LST b/modex105/MODEX.LST deleted file mode 100755 index ce6d955c..00000000 --- a/modex105/MODEX.LST +++ /dev/null @@ -1,4122 +0,0 @@ -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 1 - 1 - - - ;======================================================== - ; MODEX.ASM - A Complete Mode X Library - ; - ; Version 1.04 Release, 3 May 1993, By Matt Pritchard - ; With considerable input from Michael Abrash - ; - ; The following information is donated to the public domain in - ; the hopes that save other programmers much frustration. - ; - ; If you do use this code in a product, it would be nice if - ; you include a line like "Mode X routines by Matt Pritchard" - ; in the credits. - ; - ; ========================================================= - ; - ; All of this code is designed to be assembled with MASM 5.10a - ; but TASM 3.0 could be used as well. - ; - ; The routines contained are designed for use in a MEDIUM model - ; program. All Routines are FAR, and is assumed that a DGROUP - ; data segment exists and that DS will point to it on entry. - ; - ; For all routines, the AX, BX, CX, DX, ES and FLAGS registers - ; will not be preserved, while the DS, BP, SI and DI registers - ; will be preserved. - ; - ; Unless specifically noted, All Parameters are assumed to be - ; "PASSED BY VALUE". That is, the actual value is placed on - ; the stack. When a reference is passed it is assumed to be - ; a near pointer to a variable in the DGROUP segment. - ; - ; Routines that return a single 16-Bit integer value will - ; return that value in the AX register. - ; - ; This code will *NOT* run on an 8086/8088 because 80286+ - ; specific instructions are used. If you have an 8088/86 - ; and VGA, you can buy an 80386-40 motherboard for about - ; $160 and move into the 90's. - ; - ; This code is reasonably optimized: Most drawing loops have - ; been unrolled once and memory references are minimized by - ; keeping stuff in registers when possible. - ; - ; Error Trapping varies by Routine. No Clipping is performed - ; so the caller should verify that all coordinates are valid. - ; - ; Several Macros are used to simplify common 2 or 3 instruction - ; sequences. Several Single letter Text Constants also - ; simplify common assembler expressions like "WORD PTR". - ; - ; ------------------ Mode X Variations ------------------ - ; - ; Mode # Screen Size Max Pages Aspect Ratio (X:Y) - ; - ; 0 320 x 200 4 Pages 1.2:1 - ; 1 320 x 400 2 Pages 2.4:1 - ; 2 360 x 200 3 Pages 1.35:1 - ; 3 360 x 400 1 Page 2.7:1 - ; 4 320 x 240 3 Pages 1:1 - ; 5 320 x 480 1 Page 2:1 - ; 6 360 x 240 3 Pages 1.125:1 - ; 7 360 x 480 1 Page 2.25:1 - ; - ; -------------------- The Legal Stuff ------------------ - ; - ; No warranty, either written or implied, is made as to - ; the accuracy and usability of this code product. Use - ; at your own risk. Batteries not included. Pepperoni - ; and extra cheese available for an additional charge. - ; - ; ----------------------- The Author -------------------- - ; - ; Matt Pritchard is a paid programmer who'd rather be - ; writing games. He can be reached at: P.O. Box 140264, - ; Irving, TX 75014 USA. Michael Abrash is a living - ; god, who now works for Bill Gates (Microsoft). - ; - ; -------------------- Revision History ----------------- - ; 4-12-93: v1.02 - SET_POINT & READ_POINT now saves DI - ; SET_MODEX now saves SI - ; 5-3-93: v1.04 - added LOAD_DAC_REGISTERS and - ; READ_DAC_REGISTERS. Expanded CLR Macro - ; to handle multiple registers - ; - - PAGE 255, 132 - - .MODEL Medium - .286 - - ; ===== MACROS ===== - - ; Macro to OUT a 16 bit value to an I/O port - - OUT_16 MACRO Register, Value - IFDIFI <Register>, <DX> ; If DX not setup - MOV DX, Register ; then Select Register - ENDIF - IFDIFI <Value>, <AX> ; If AX not setup - MOV AX, Value ; then Get Data Value - ENDIF - OUT DX, AX ; Set I/O Register(s) - ENDM - - ; Macro to OUT a 8 bit value to an I/O Port - - OUT_8 MACRO Register, Value - IFDIFI <Register>, <DX> ; If DX not setup - MOV DX, Register ; then Select Register - ENDIF - IFDIFI <Value>, <AL> ; If AL not Setup - MOV AL, Value ; then Get Data Value - ENDIF - OUT DX, AL ; Set I/O Register - ENDM - - ; macros to PUSH and POP multiple registers - - PUSHx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - PUSH R1 ; Save R1 - PUSHx R2, R3, R4, R5, R6, R7, R8 - ENDIF - ENDM - - POPx MACRO R1, R2, R3, R4, R5, R6, R7, R8 - IFNB <R1> - POP R1 ; Restore R1 - POPx R2, R3, R4, R5, R6, R7, R8 - ENDIF - ENDM - - ; Macro to Clear Registers to 0 - - CLR MACRO Register, R2, R3, R4, R5, R6 - IFNB <Register> - XOR Register, Register ; Set Register = 0 - CLR R2, R3, R4, R5, R6 - ENDIF - ENDM - - ; Macros to Decrement Counter & Jump on Condition - - LOOPx MACRO Register, Destination - DEC Register ; Counter-- - JNZ Destination ; Jump if not 0 - ENDM - - LOOPjz MACRO Register, Destination - DEC Register ; Counter-- - JZ Destination ; Jump if 0 - ENDM - - - ; ===== General Constants ===== - - = 0000 False EQU 0 - =-0001 True EQU -1 - = 0000 nil EQU 0 - - = BYTE PTR b EQU BYTE PTR - = WORD PTR w EQU WORD PTR - = DWORD PTR d EQU DWORD PTR - = OFFSET o EQU OFFSET - = FAR PTR f EQU FAR PTR - = SHORT s EQU SHORT - = ?,?,?,? ?x4 EQU <?,?,?,?> - = ?,?,? ?x3 EQU <?,?,?> - - ; ===== VGA Register Values ===== - - = A000 VGA_Segment EQU 0A000h ; Vga Memory Segment - - = 03C0 ATTRIB_Ctrl EQU 03C0h ; VGA Attribute Controller - = 03CE GC_Index EQU 03CEh ; VGA Graphics Controller - = 03C4 SC_Index EQU 03C4h ; VGA Sequencer Controller - = 03C5 SC_Data EQU 03C5h ; VGA Sequencer Data Port - = 03D4 CRTC_Index EQU 03D4h ; VGA CRT Controller - = 03D5 CRTC_Data EQU 03D5h ; VGA CRT Controller Data - = 03C2 MISC_OUTPUT EQU 03C2h ; VGA Misc Register - = 03DA INPUT_1 EQU 03DAh ; Input Status #1 Register - - = 03C8 DAC_WRITE_ADDR EQU 03C8h ; VGA DAC Write Addr Register - = 03C7 DAC_READ_ADDR EQU 03C7h ; VGA DAC Read Addr Register - = 03C9 PEL_DATA_REG EQU 03C9h ; VGA DAC/PEL data Register R/W - - = 0033 PIXEL_PAN_REG EQU 033h ; Attrib Index: Pixel Pan Reg - = 0002 MAP_MASK EQU 002h ; Sequ Index: Write Map Mask reg - = 0004 READ_MAP EQU 004h ; GC Index: Read Map Register - = 000C START_DISP_HI EQU 00Ch ; CRTC Index: Display Start Hi - = 000D START_DISP_LO EQU 00Dh ; CRTC Index: Display Start Lo - - = 0102 MAP_MASK_PLANE1 EQU 00102h ; Map Register + Plane 1 - = 1102 MAP_MASK_PLANE2 EQU 01102h ; Map Register + Plane 1 - = 0F02 ALL_PLANES_ON EQU 00F02h ; Map Register + All Bit Planes - - = 0604 CHAIN4_OFF EQU 00604h ; Chain 4 mode Off - = 0100 ASYNC_RESET EQU 00100h ; (A)synchronous Reset - = 0300 SEQU_RESTART EQU 00300h ; Sequencer Restart - - = 0008 LATCHES_ON EQU 00008h ; Bit Mask + Data from Latches - = FF08 LATCHES_OFF EQU 0FF08h ; Bit Mask + Data from CPU - - = 0008 VERT_RETRACE EQU 08h ; INPUT_1: Vertical Retrace Bit - = 0003 PLANE_BITS EQU 03h ; Bits 0-1 of Xpos = Plane # - = 000F ALL_PLANES EQU 0Fh ; All Bit Planes Selected - = 000F CHAR_BITS EQU 0Fh ; Bits 0-3 of Character Data - - = 1130 GET_CHAR_PTR EQU 01130h ; VGA BIOS Func: Get Char Set - = 0003 ROM_8x8_Lo EQU 03h ; ROM 8x8 Char Set Lo Pointer - = 0004 ROM_8x8_Hi EQU 04h ; ROM 8x8 Char Set Hi Pointer - - ; Constants Specific for these routines - - = 0008 NUM_MODES EQU 8 ; # of Mode X Variations - - ; Specific Mode Data Table format... - - 000C Mode_Data_Table STRUC - 0000 00 M_MiscR DB ? ; Value of MISC_OUTPUT register - 0001 00 M_Pages DB ? ; Maximum Possible # of pages - 0002 0000 M_XSize DW ? ; X Size Displayed on screen - 0004 0000 M_YSize DW ? ; Y Size Displayed on screen - 0006 0000 M_XMax DW ? ; Maximum Possible X Size - 0008 0000 M_YMax DW ? ; Maximum Possible Y Size - 000A 0000 M_CRTC DW ? ; Table of CRTC register values - Mode_Data_Table ENDS - - ; ===== DGROUP STORAGE NEEDED (42 BYTES) ===== - - 0000 .DATA? - - 0000 0000 SCREEN_WIDTH DW 0 ; Width of a line in Bytes - 0002 0000 SCREEN_HEIGHT DW 0 ; Vertical Height in Pixels - - 0004 0000 LAST_PAGE DW 0 ; # of Display Pages - 0006 0004 [ PAGE_ADDR DW 4 DUP (0) ; Offsets to start of each page - 0000 - ] - - 000E 0000 PAGE_SIZE DW 0 ; Size of Page in Addr Bytes - - 0010 0000 DISPLAY_PAGE DW 0 ; Page # currently displayed - 0012 0000 ACTIVE_PAGE DW 0 ; Page # currently active - - 0014 0000 CURRENT_PAGE DW 0 ; Offset of current Page - 0016 0000 CURRENT_SEGMENT DW 0 ; Segment of VGA memory - - 0018 0000 CURRENT_XOFFSET DW 0 ; Current Display X Offset - 001A 0000 CURRENT_YOFFSET DW 0 ; Current Display Y Offset - - 001C 0000 CURRENT_MOFFSET DW 0 ; Current Start Offset - - 001E 0000 MAX_XOFFSET DW 0 ; Current Display X Offset - 0020 0000 MAX_YOFFSET DW 0 ; Current Display Y Offset - - 0022 0000 0000 CHARSET_LOW DW 0, 0 ; Far Ptr to Char Set: 0-127 - 0026 0000 0000 CHARSET_HI DW 0, 0 ; Far Ptr to Char Set: 128-255 - - 0000 .CODE - - ; ===== DATA TABLES ===== - - ; Data Tables, Put in Code Segment for Easy Access - ; (Like when all the other Segment Registers are in - ; use!!) and reduced DGROUP requirements... - - ; Bit Mask Tables for Left/Right/Character Masks - - 0000 0F 0E 0C 08 Left_Clip_Mask DB 0FH, 0EH, 0CH, 08H - - 0004 01 03 07 0F Right_Clip_Mask DB 01H, 03H, 07H, 0FH - - ; Bit Patterns for converting character fonts - - 0008 00 08 04 0C 02 0A Char_Plane_Data DB 00H,08H,04H,0CH,02H,0AH,06H,0EH - 06 0E - 0010 01 09 05 0D 03 0B DB 01H,09H,05H,0DH,03H,0BH,07H,0FH - 07 0F - - ; CRTC Register Values for Various Configurations - - 0018 MODE_Single_Line: ; CRTC Setup Data for 400/480 Line modes - 0018 4009 DW 04009H ; Cell Height (1 Scan Line) - 001A 0014 DW 00014H ; Dword Mode off - 001C E317 DW 0E317H ; turn on Byte Mode - 001E 0000 DW nil ; End of CRTC Data for 400/480 Line Mode - - 0020 MODE_Double_Line: ; CRTC Setup Data for 200/240 Line modes - 0020 4109 DW 04109H ; Cell Height (2 Scan Lines) - 0022 0014 DW 00014H ; Dword Mode off - 0024 E317 DW 0E317H ; turn on Byte Mode - 0026 0000 DW nil ; End of CRTC Data for 200/240 Line Mode - - 0028 MODE_320_Wide: ; CRTC Setup Data for 320 Horz Pixels - 0028 5F00 DW 05F00H ; Horz total - 002A 4F01 DW 04F01H ; Horz Displayed - 002C 5002 DW 05002H ; Start Horz Blanking - 002E 8203 DW 08203H ; End Horz Blanking - 0030 5404 DW 05404H ; Start H Sync - 0032 8005 DW 08005H ; End H Sync - 0034 0000 DW nil ; End of CRTC Data for 320 Horz pixels - - 0036 MODE_360_Wide: ; CRTC Setup Data for 360 Horz Pixels - 0036 6B00 DW 06B00H ; Horz total - 0038 5901 DW 05901H ; Horz Displayed - 003A 5A02 DW 05A02H ; Start Horz Blanking - 003C 8E03 DW 08E03H ; End Horz Blanking - 003E 5E04 DW 05E04H ; Start H Sync - 0040 8A05 DW 08A05H ; End H Sync - 0042 0000 DW nil ; End of CRTC Data for 360 Horz pixels - - 0044 MODE_200_Tall: - 0044 MODE_400_Tall: ; CRTC Setup Data for 200/400 Line modes - 0044 BF06 DW 0BF06H ; Vertical Total - 0046 1F07 DW 01F07H ; Overflow - 0048 9C10 DW 09C10H ; V Sync Start - 004A 8E11 DW 08E11H ; V Sync End/Prot Cr0 Cr7 - 004C 8F12 DW 08F12H ; Vertical Displayed - 004E 9615 DW 09615H ; V Blank Start - 0050 B916 DW 0B916H ; V Blank End - 0052 0000 DW nil ; End of CRTC Data for 200/400 Lines - - 0054 MODE_240_Tall: - 0054 MODE_480_Tall: ; CRTC Setup Data for 240/480 Line modes - 0054 0D06 DW 00D06H ; Vertical Total - 0056 3E07 DW 03E07H ; Overflow - 0058 EA10 DW 0EA10H ; V Sync Start - 005A 8C11 DW 08C11H ; V Sync End/Prot Cr0 Cr7 - 005C DF12 DW 0DF12H ; Vertical Displayed - 005E E715 DW 0E715H ; V Blank Start - 0060 0616 DW 00616H ; V Blank End - 0062 0000 DW nil ; End of CRTC Data for 240/480 Lines - - ; Table of Display Mode Tables - - 0064 MODE_TABLE: - 0064 0074 R 0086 R DW o MODE_320x200, o MODE_320x400 - 0068 00E0 R 00F2 R DW o MODE_360x200, o MODE_360x400 - 006C 00BC R 00CE R DW o MODE_320x240, o MODE_320x480 -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 2 - 1 - - - 0070 0098 R 00AA R DW o MODE_360x240, o MODE_360x480 - - ; Table of Display Mode Components - - 0074 MODE_320x200: ; Data for 320 by 200 Pixels - - 0074 63 DB 063h ; 400 scan Lines & 25 Mhz Clock - 0075 04 DB 4 ; Maximum of 4 Pages - 0076 0140 00C8 DW 320, 200 ; Displayed Pixels (X,Y) - 007A 0516 0330 DW 1302, 816 ; Max Possible X and Y Sizes - - 007E 0028 R 0044 R DW o MODE_320_Wide, o MODE_200_Tall - 0082 0020 R 0000 DW o MODE_Double_Line, nil - - 0086 MODE_320x400: ; Data for 320 by 400 Pixels - - 0086 63 DB 063h ; 400 scan Lines & 25 Mhz Clock - 0087 02 DB 2 ; Maximum of 2 Pages - 0088 0140 0190 DW 320, 400 ; Displayed Pixels X,Y - 008C 0288 0330 DW 648, 816 ; Max Possible X and Y Sizes - - 0090 0028 R 0044 R DW o MODE_320_Wide, o MODE_400_Tall - 0094 0018 R 0000 DW o MODE_Single_Line, nil - - 0098 MODE_360x240: ; Data for 360 by 240 Pixels - - 0098 E7 DB 0E7h ; 480 scan Lines & 28 Mhz Clock - 0099 03 DB 3 ; Maximum of 3 Pages - 009A 0168 00F0 DW 360, 240 ; Displayed Pixels X,Y - 009E 0444 02D8 DW 1092, 728 ; Max Possible X and Y Sizes - - 00A2 0036 R 0054 R DW o MODE_360_Wide, o MODE_240_Tall - 00A6 0020 R 0000 DW o MODE_Double_Line , nil - - 00AA MODE_360x480: ; Data for 360 by 480 Pixels - - 00AA E7 DB 0E7h ; 480 scan Lines & 28 Mhz Clock - 00AB 01 DB 1 ; Only 1 Page Possible - 00AC 0168 01E0 DW 360, 480 ; Displayed Pixels X,Y - 00B0 0220 02D8 DW 544, 728 ; Max Possible X and Y Sizes - - 00B4 0036 R 0054 R DW o MODE_360_Wide, o MODE_480_Tall - 00B8 0018 R 0000 DW o MODE_Single_Line , nil - - 00BC MODE_320x240: ; Data for 320 by 240 Pixels - - 00BC E3 DB 0E3h ; 480 scan Lines & 25 Mhz Clock - 00BD 03 DB 3 ; Maximum of 3 Pages - 00BE 0140 00F0 DW 320, 240 ; Displayed Pixels X,Y - 00C2 0440 0332 DW 1088, 818 ; Max Possible X and Y Sizes - - 00C6 0028 R 0054 R DW o MODE_320_Wide, o MODE_240_Tall - 00CA 0020 R 0000 DW o MODE_Double_Line, nil - - 00CE MODE_320x480: ; Data for 320 by 480 Pixels - - 00CE E3 DB 0E3h ; 480 scan Lines & 25 Mhz Clock - 00CF 01 DB 1 ; Only 1 Page Possible - 00D0 0140 01E0 DW 320, 480 ; Displayed Pixels X,Y - 00D4 021C 0332 DW 540, 818 ; Max Possible X and Y Sizes - - 00D8 0028 R 0054 R DW o MODE_320_WIDE, o MODE_480_Tall - 00DC 0018 R 0000 DW o MODE_Single_Line, nil - - 00E0 MODE_360x200: ; Data for 360 by 200 Pixels - - 00E0 67 DB 067h ; 400 scan Lines & 28 Mhz Clock - 00E1 03 DB 3 ; Maximum of 3 Pages - 00E2 0168 00C8 DW 360, 200 ; Displayed Pixels (X,Y) - 00E6 0516 02D8 DW 1302, 728 ; Max Possible X and Y Sizes - - 00EA 0036 R 0044 R DW o MODE_360_Wide, MODE_200_Tall - 00EE 0020 R 0000 DW o MODE_Double_Line, nil - - 00F2 MODE_360x400: ; Data for 360 by 400 Pixels - - 00F2 67 DB 067h ; 400 scan Lines & 28 Mhz Clock - 00F3 01 DB 1 ; Maximum of 1 Pages - 00F4 0168 0190 DW 360, 400 ; Displayed Pixels X,Y - 00F8 0288 0330 DW 648, 816 ; Max Possible X and Y Sizes - - 00FC 0036 R 0044 R DW o MODE_360_Wide, MODE_400_Tall - 0100 0018 R 0000 DW o MODE_Single_Line, nil - - - ; ===== MODE X SETUP ROUTINES ===== - - ;====================================================== - ;SET_VGA_MODEX% (ModeType%, MaxXPos%, MaxYpos%, Pages%) - ;====================================================== - ; - ; Sets Up the specified version of Mode X. Allows for - ; the setup of multiple video pages, and a virtual - ; screen which can be larger than the displayed screen - ; (which can then be scrolled a pixel at a time) - ; - ; ENTRY: ModeType = Desired Screen Resolution (0-7) - ; - ; 0 = 320 x 200, 4 Pages max, 1.2:1 Aspect Ratio - ; 1 = 320 x 400, 2 Pages max, 2.4:1 Aspect Ratio - ; 2 = 360 x 200, 3 Pages max, 1.35:1 Aspect Ratio - ; 3 = 360 x 400, 1 Page max, 2.7:1 Aspect Ratio - ; 4 = 320 x 240, 3 Pages max, 1:1 Aspect Ratio - ; 5 = 320 x 480, 1 Page max, 2:1 Aspect Ratio - ; 6 = 360 x 240, 3 Pages max, 1.125:1 Aspect Ratio - ; 7 = 360 x 480, 1 Page max, 2.25:1 Aspect Ratio - ; - ; MaxXpos = The Desired Virtual Screen Width - ; MaxYpos = The Desired Virtual Screen Height - ; Pages = The Desired # of Video Pages - ; - ; EXIT: AX = Success Flag: 0 = Failure / -1= Success - ; - - 0016 SVM_STACK STRUC - 0000 0000 SVM_Table DW ? ; Offset of Mode Info Table - 0002 0000 0000 0000 DW ?x4 ; DI, SI, DS, BP - 0000 - 000A 00000000 DD ? ; Caller - 000E 0000 SVM_Pages DW ? ; # of Screen Pages desired - 0010 0000 SVM_Ysize DW ? ; Vertical Screen Size Desired - 0012 0000 SVM_Xsize DW ? ; Horizontal Screen Size Desired - 0014 0000 SVM_Mode DW ? ; Display Resolution Desired - SVM_STACK ENDS - - PUBLIC SET_VGA_MODEX - - 0104 SET_VGA_MODEX PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 0104 55 1 PUSH BP ; Save R1 - 0105 1E 2 PUSH DS ; Save R1 - 0106 56 3 PUSH SI ; Save R1 - 0107 57 4 PUSH DI ; Save R1 - 0108 83 EC 02 SUB SP, 2 ; Allocate workspace - 010B 8B EC MOV BP, SP ; Set up Stack Frame - - ; Check Legality of Mode Request.... - - 010D 8B 5E 14 MOV BX, [BP].SVM_Mode ; Get Requested Mode # - 0110 83 FB 08 CMP BX, NUM_MODES ; Is it 0..7? - 0113 73 47 JAE @SVM_BadModeSetup ; If Not, Error out - - 0115 D1 E3 SHL BX, 1 ; Scale BX - 0117 2E: 8B B7 0064 R MOV SI, w MODE_TABLE[BX] ; CS:SI -> Mode Info - 011C 89 76 00 MOV [BP].SVM_Table, SI ; Save ptr for later use - - ; Check # of Requested Display Pages - - 011F 8B 4E 0E MOV CX, [BP].SVM_Pages ; Get # of Requested Pages - CLR CH ; Set Hi Word = 0! - 0122 32 ED 1 XOR CH, CH ; Set Register = 0 - 0124 2E: 3A 4C 01 CMP CL, CS:[SI].M_Pages ; Check # Pages for mode - 0128 77 32 JA @SVM_BadModeSetup ; Report Error if too Many Pages - 012A E3 30 JCXZ @SVM_BadModeSetup ; Report Error if 0 Pages - - ; Check Validity of X Size - - 012C 83 66 12 F8 AND [BP].SVM_XSize, 0FFF8h ; X size Mod 8 Must = 0 - - 0130 8B 46 12 MOV AX, [BP].SVM_XSize ; Get Logical Screen Width - 0133 2E: 3B 44 02 CMP AX, CS:[SI].M_XSize ; Check against Displayed X - 0137 72 23 JB @SVM_BadModeSetup ; Report Error if too small - 0139 2E: 3B 44 06 CMP AX, CS:[SI].M_XMax ; Check against Max X - 013D 77 1D JA @SVM_BadModeSetup ; Report Error if too big - - ; Check Validity of Y Size - - 013F 8B 5E 10 MOV BX, [BP].SVM_YSize ; Get Logical Screen Height - 0142 2E: 3B 5C 04 CMP BX, CS:[SI].M_YSize ; Check against Displayed Y - 0146 72 14 JB @SVM_BadModeSetup ; Report Error if too small - 0148 2E: 3B 5C 08 CMP BX, CS:[SI].M_YMax ; Check against Max Y - 014C 77 0E JA @SVM_BadModeSetup ; Report Error if too big - - ; Enough memory to Fit it all? - - 014E C1 E8 02 SHR AX, 2 ; # of Bytes:Line = XSize/4 - 0151 F7 E1 MUL CX ; AX = Bytes/Line * Pages - 0153 F7 E3 MUL BX ; DX:AX = Total VGA mem needed - 0155 71 0A JNO @SVM_Continue ; Exit if Total Size > 256K - - 0157 4A DEC DX ; Was it Exactly 256K??? - 0158 0B D0 OR DX, AX ; (DX = 1, AX = 0000) - 015A 74 05 JZ @SVM_Continue ; if so, it's valid... - - 015C @SVM_BadModeSetup: - - CLR AX ; Return Value = False - 015C 33 C0 1 XOR AX, AX ; Set Register = 0 - 015E E9 00E6 JMP @SVM_Exit ; Normal Exit - - 0161 @SVM_Continue: - - 0161 B8 0013 MOV AX, 13H ; Start with Mode 13H - 0164 CD 10 INT 10H ; Let BIOS Set Mode - - OUT_16 SC_INDEX, CHAIN4_OFF ; Disable Chain 4 Mode - 0166 BA 03C4 1 MOV DX, SC_INDEX ; then Select Register - 0169 B8 0604 1 MOV AX, CHAIN4_OFF ; then Get Data Value - 016C EF 1 OUT DX, AX ; Set I/O Register(s) - OUT_16 SC_INDEX, ASYNC_RESET ; (A)synchronous Reset - 016D BA 03C4 1 MOV DX, SC_INDEX ; then Select Register - 0170 B8 0100 1 MOV AX, ASYNC_RESET ; then Get Data Value - 0173 EF 1 OUT DX, AX ; Set I/O Register(s) - OUT_8 MISC_OUTPUT, CS:[SI].M_MiscR ; Set New Timing/Size - 0174 BA 03C2 1 MOV DX, MISC_OUTPUT ; then Select Register - 0177 2E: 8A 04 1 MOV AL, CS:[SI].M_MiscR ; then Get Data Value - 017A EE 1 OUT DX, AL ; Set I/O Register - OUT_16 SC_INDEX, SEQU_RESTART ; Restart Sequencer ... - 017B BA 03C4 1 MOV DX, SC_INDEX ; then Select Register - 017E B8 0300 1 MOV AX, SEQU_RESTART ; then Get Data Value - 0181 EF 1 OUT DX, AX ; Set I/O Register(s) - - OUT_8 CRTC_INDEX, 11H ; Select Vert Retrace End Register - 0182 BA 03D4 1 MOV DX, CRTC_INDEX ; then Select Register - 0185 B0 11 1 MOV AL, 11H ; then Get Data Value - 0187 EE 1 OUT DX, AL ; Set I/O Register - 0188 42 INC DX ; Point to Data - 0189 EC IN AL, DX ; Get Value, Bit 7 = Protect - 018A 24 7F AND AL, 7FH ; Mask out Write Protect - 018C EE OUT DX, AL ; And send it back - - 018D BA 03D4 MOV DX, CRTC_INDEX ; Vga Crtc Registers - 0190 83 C6 0A ADD SI, M_CRTC ; SI -> CRTC Parameter Data - - ; Load Tables of CRTC Parameters from List of Tables - - 0193 @SVM_Setup_Table: - - 0193 2E: 8B 3C MOV DI, CS:[SI] ; Get Pointer to CRTC Data Tbl - 0196 83 C6 02 ADD SI, 2 ; Point to next Ptr Entry - 0199 0B FF OR DI, DI ; A nil Ptr means that we have - 019B 74 0D JZ @SVM_Set_Data ; finished CRTC programming - - 019D @SVM_Setup_CRTC: - 019D 2E: 8B 05 MOV AX, CS:[DI] ; Get CRTC Data from Table - 01A0 83 C7 02 ADD DI, 2 ; Advance Pointer - 01A3 0B C0 OR AX, AX ; At End of Data Table? - 01A5 74 EC JZ @SVM_Setup_Table ; If so, Exit & get next Table - - 01A7 EF OUT DX, AX ; Reprogram VGA CRTC reg - 01A8 EB F3 JMP s @SVM_Setup_CRTC ; Process Next Table Entry - - ; Initialize Page & Scroll info, DI = 0 - - 01AA @SVM_Set_Data: - 01AA 89 3E 0010 R MOV DISPLAY_PAGE, DI ; Display Page = 0 - 01AE 89 3E 0012 R MOV ACTIVE_PAGE, DI ; Active Page = 0 - 01B2 89 3E 0014 R MOV CURRENT_PAGE, DI ; Current Page (Offset) = 0 - 01B6 89 3E 0018 R MOV CURRENT_XOFFSET, DI ; Horz Scroll Index = 0 - 01BA 89 3E 001A R MOV CURRENT_YOFFSET, DI ; Vert Scroll Index = 0 -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 3 - 1 - - - 01BE 89 3E 001C R MOV CURRENT_MOFFSET, DI ; Memory Scroll Index = 0 - - 01C2 B8 A000 MOV AX, VGA_SEGMENT ; Segment for VGA memory - 01C5 A3 0016 R MOV CURRENT_SEGMENT, AX ; Save for Future LES's - - ; Set Logical Screen Width, X Scroll and Our Data - - 01C8 8B 76 00 MOV SI, [BP].SVM_Table ; Get Saved Ptr to Mode Info - 01CB 8B 46 12 MOV AX, [BP].SVM_Xsize ; Get Display Width - - 01CE 8B C8 MOV CX, AX ; CX = Logical Width - 01D0 2E: 2B 4C 02 SUB CX, CS:[SI].M_XSize ; CX = Max X Scroll Value - 01D4 89 0E 001E R MOV MAX_XOFFSET, CX ; Set Maximum X Scroll - - 01D8 C1 E8 02 SHR AX, 2 ; Bytes = Pixels / 4 - 01DB A3 0000 R MOV SCREEN_WIDTH, AX ; Save Width in Pixels - - 01DE D1 E8 SHR AX, 1 ; Offset Value = Bytes / 2 - 01E0 B4 13 MOV AH, 13h ; CRTC Offset Register Index - 01E2 86 C4 XCHG AL, AH ; Switch format for OUT - 01E4 EF OUT DX, AX ; Set VGA CRTC Offset Reg - - ; Setup Data table, Y Scroll, Misc for Other Routines - - 01E5 8B 46 10 MOV AX, [BP].SVM_Ysize ; Get Logical Screen Height - - 01E8 8B C8 MOV CX, AX ; CX = Logical Height - 01EA 2E: 2B 5C 04 SUB BX, CS:[SI].M_YSize ; CX = Max Y Scroll Value - 01EE 89 0E 0020 R MOV MAX_YOFFSET, CX ; Set Maximum Y Scroll - - 01F2 A3 0002 R MOV SCREEN_HEIGHT, AX ; Save Height in Pixels - 01F5 F7 26 0000 R MUL SCREEN_WIDTH ; AX = Page Size in Bytes, - 01F9 A3 000E R MOV PAGE_SIZE, AX ; Save Page Size - - 01FC 8B 4E 0E MOV CX, [BP].SVM_Pages ; Get # of Pages - 01FF 89 0E 0004 R MOV LAST_PAGE, CX ; Save # of Pages - - CLR BX ; Page # = 0 - 0203 33 DB 1 XOR BX, BX ; Set Register = 0 - 0205 8B D3 MOV DX, BX ; Page 0 Offset = 0 - - 0207 @SVM_Set_Pages: - - 0207 89 97 0006 R MOV PAGE_ADDR[BX], DX ; Set Page #(BX) Offset - 020B 83 C3 02 ADD BX, 2 ; Page#++ - 020E 03 D0 ADD DX, AX ; Compute Addr of Next Page - LOOPx CX, @SVM_Set_Pages ; Loop until all Pages Set - 0210 49 1 DEC CX ; Counter-- - 0211 75 F4 1 JNZ @SVM_Set_Pages ; Jump if not 0 - - ; Clear VGA Memory - - OUT_16 SC_INDEX, ALL_PLANES_ON ; Select All Planes - 0213 BA 03C4 1 MOV DX, SC_INDEX ; then Select Register - 0216 B8 0F02 1 MOV AX, ALL_PLANES_ON ; then Get Data Value - 0219 EF 1 OUT DX, AX ; Set I/O Register(s) - 021A C4 3E 0014 R LES DI, d CURRENT_PAGE ; -> Start of VGA memory - - CLR AX ; AX = 0 - 021E 33 C0 1 XOR AX, AX ; Set Register = 0 - 0220 FC CLD ; Block Xfer Forwards - 0221 B9 8000 MOV CX, 8000H ; 32K * 4 * 2 = 256K - 0224 F3/ AB REP STOSW ; Clear dat memory! - - ; Setup Font Pointers - - 0226 B7 03 MOV BH, ROM_8x8_Lo ; Ask for 8x8 Font, 0-127 - 0228 B8 1130 MOV AX, GET_CHAR_PTR ; Service to Get Pointer - 022B CD 10 INT 10h ; Call VGA BIOS - - 022D 89 2E 0022 R MOV CHARSET_LOW, BP ; Save Char Set Offset - 0231 8C 06 0024 R MOV CHARSET_LOW+2, ES ; Save Char Set Segment - - 0235 B7 04 MOV BH, ROM_8x8_Hi ; Ask for 8x8 Font, 128-255 - 0237 B8 1130 MOV AX, GET_CHAR_PTR ; Service to Get Pointer - 023A CD 10 INT 10h ; Call VGA BIOS - - 023C 89 2E 0026 R MOV CHARSET_HI, BP ; Save Char Set Offset - 0240 8C 06 0028 R MOV CHARSET_HI+2, ES ; Save Char Set Segment - - 0244 B8 FFFF MOV AX, True ; Return Success Code - - 0247 @SVM_EXIT: - 0247 83 C4 02 ADD SP, 2 ; Deallocate workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - 024A 5F 1 POP DI ; Restore R1 - 024B 5E 2 POP SI ; Restore R1 - 024C 1F 3 POP DS ; Restore R1 - 024D 5D 4 POP BP ; Restore R1 - 024E CA 0008 RET 8 ; Exit & Clean Up Stack - - 0251 SET_VGA_MODEX ENDP - - - ;================== - ;SET_MODEX% (Mode%) - ;================== - ; - ; Quickie Mode Set - Sets Up Mode X to Default Configuration - ; - ; ENTRY: ModeType = Desired Screen Resolution (0-7) - ; (See SET_VGA_MODEX for list) - ; - ; EXIT: AX = Success Flag: 0 = Failure / -1= Success - ; - - 000A SM_STACK STRUC - 0000 0000 0000 DW ?,? ; BP, SI - 0004 00000000 DD ? ; Caller - 0008 0000 SM_Mode DW ? ; Desired Screen Resolution - SM_STACK ENDS - - PUBLIC SET_MODEX - - 0251 SET_MODEX PROC FAR - - PUSHx BP, SI ; Preserve Important registers - 0251 55 1 PUSH BP ; Save R1 - 0252 56 2 PUSH SI ; Save R1 - 0253 8B EC MOV BP, SP ; Set up Stack Frame - - CLR AX ; Assume Failure - 0255 33 C0 1 XOR AX, AX ; Set Register = 0 - 0257 8B 5E 08 MOV BX, [BP].SM_Mode ; Get Desired Mode # - 025A 83 FB 08 CMP BX, NUM_MODES ; Is it a Valid Mode #? - 025D 73 1C JAE @SMX_Exit ; If Not, don't Bother - - 025F 53 PUSH BX ; Push Mode Parameter - - 0260 D1 E3 SHL BX, 1 ; Scale BX to word Index - 0262 2E: 8B B7 0064 R MOV SI, w MODE_TABLE[BX] ; CS:SI -> Mode Info - - 0267 2E: FF 74 02 PUSH CS:[SI].M_XSize ; Push Default X Size - 026B 2E: FF 74 04 PUSH CS:[SI].M_Ysize ; Push Default Y size - 026F 2E: 8A 44 01 MOV AL, CS:[SI].M_Pages ; Get Default # of Pages - CLR AH ; Hi Byte = 0 - 0273 32 E4 1 XOR AH, AH ; Set Register = 0 - 0275 50 PUSH AX ; Push # Pages - - 0276 9A ---- 0104 R CALL f SET_VGA_MODEX ; Set up Mode X! - - 027B @SMX_Exit: - POPx SI, BP ; Restore Registers - 027B 5E 1 POP SI ; Restore R1 - 027C 5D 2 POP BP ; Restore R1 - 027D CA 0002 RET 2 ; Exit & Clean Up Stack - - 0280 SET_MODEX ENDP - - - ; ===== BASIC GRAPHICS PRIMITIVES ===== - - ;============================ - ;CLEAR_VGA_SCREEN (ColorNum%) - ;============================ - ; - ; Clears the active display page - ; - ; ENTRY: ColorNum = Color Value to fill the page with - ; - ; EXIT: No meaningful values returned - ; - - 000A CVS_STACK STRUC - 0000 0000 0000 DW ?,? ; DI, BP - 0004 00000000 DD ? ; Caller - 0008 00 00 CVS_COLOR DB ?,? ; Color to Set Screen to - CVS_STACK ENDS - - PUBLIC CLEAR_VGA_SCREEN - - 0280 CLEAR_VGA_SCREEN PROC FAR - - PUSHx BP, DI ; Preserve Important Registers - 0280 55 1 PUSH BP ; Save R1 - 0281 57 2 PUSH DI ; Save R1 - 0282 8B EC MOV BP, SP ; Set up Stack Frame - - OUT_16 SC_INDEX, ALL_PLANES_ON ; Select All Planes - 0284 BA 03C4 1 MOV DX, SC_INDEX ; then Select Register - 0287 B8 0F02 1 MOV AX, ALL_PLANES_ON ; then Get Data Value - 028A EF 1 OUT DX, AX ; Set I/O Register(s) - 028B C4 3E 0014 R LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - 028F 8A 46 08 MOV AL, [BP].CVS_COLOR ; Get Color - 0292 8A E0 MOV AH, AL ; Copy for Word Write - 0294 FC CLD ; Block fill Forwards - - 0295 8B 0E 000E R MOV CX, PAGE_SIZE ; Get Size of Page - 0299 D1 E9 SHR CX, 1 ; Divide by 2 for Words - 029B F3/ AB REP STOSW ; Block Fill VGA memory - - POPx DI, BP ; Restore Saved Registers - 029D 5F 1 POP DI ; Restore R1 - 029E 5D 2 POP BP ; Restore R1 - 029F CA 0002 RET 2 ; Exit & Clean Up Stack - - 02A2 CLEAR_VGA_SCREEN ENDP - - - ;=================================== - ;SET_POINT (Xpos%, Ypos%, ColorNum%) - ;=================================== - ; - ; Plots a single Pixel on the active display page - ; - ; ENTRY: Xpos = X position to plot pixel at - ; Ypos = Y position to plot pixel at - ; ColorNum = Color to plot pixel with - ; - ; EXIT: No meaningful values returned - ; - - 000E SP_STACK STRUC - 0000 0000 0000 DW ?,? ; BP, DI - 0004 00000000 DD ? ; Caller - 0008 00 00 SETP_Color DB ?,? ; Color of Point to Plot - 000A 0000 SETP_Ypos DW ? ; Y pos of Point to Plot - 000C 0000 SETP_Xpos DW ? ; X pos of Point to Plot - SP_STACK ENDS - - PUBLIC SET_POINT - - 02A2 SET_POINT PROC FAR - - PUSHx BP, DI ; Preserve Registers - 02A2 55 1 PUSH BP ; Save R1 - 02A3 57 2 PUSH DI ; Save R1 - 02A4 8B EC MOV BP, SP ; Set up Stack Frame - - 02A6 C4 3E 0014 R LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - 02AA 8B 46 0A MOV AX, [BP].SETP_Ypos ; Get Line # of Pixel - 02AD F7 26 0000 R MUL SCREEN_WIDTH ; Get Offset to Start of Line - - 02B1 8B 5E 0C MOV BX, [BP].SETP_Xpos ; Get Xpos - 02B4 8B CB MOV CX, BX ; Copy to extract Plane # from - 02B6 C1 EB 02 SHR BX, 2 ; X offset (Bytes) = Xpos/4 - 02B9 03 D8 ADD BX, AX ; Offset = Width*Ypos + Xpos/4 - - 02BB B8 0102 MOV AX, MAP_MASK_PLANE1 ; Map Mask & Plane Select Register - 02BE 80 E1 03 AND CL, PLANE_BITS ; Get Plane Bits - 02C1 D2 E4 SHL AH, CL ; Get Plane Select Value - OUT_16 SC_Index, AX ; Select Plane - 02C3 BA 03C4 1 MOV DX, SC_Index ; then Select Register - 02C6 EF 1 OUT DX, AX ; Set I/O Register(s) - - 02C7 8A 46 08 MOV AL,[BP].SETP_Color ; Get Pixel Color - 02CA 26: 88 01 MOV ES:[DI+BX], AL ; Draw Pixel - - POPx DI, BP ; Restore Saved Registers -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 4 - 1 - - - 02CD 5F 1 POP DI ; Restore R1 - 02CE 5D 2 POP BP ; Restore R1 - 02CF CA 0006 RET 6 ; Exit and Clean up Stack - - 02D2 SET_POINT ENDP - - - ;========================== - ;READ_POINT% (Xpos%, Ypos%) - ;========================== - ; - ; Read the color of a pixel from the Active Display Page - ; - ; ENTRY: Xpos = X position of pixel to read - ; Ypos = Y position of pixel to read - ; - ; EXIT: AX = Color of Pixel at (Xpos, Ypos) - ; - - 000C RP_STACK STRUC - 0000 0000 0000 DW ?,? ; BP, DI - 0004 00000000 DD ? ; Caller - 0008 0000 RP_Ypos DW ? ; Y pos of Point to Read - 000A 0000 RP_Xpos DW ? ; X pos of Point to Read - RP_STACK ENDS - - PUBLIC READ_POINT - - 02D2 READ_POINT PROC FAR - - PUSHx BP, DI ; Preserve Registers - 02D2 55 1 PUSH BP ; Save R1 - 02D3 57 2 PUSH DI ; Save R1 - 02D4 8B EC MOV BP, SP ; Set up Stack Frame - - 02D6 C4 3E 0014 R LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - 02DA 8B 46 08 MOV AX, [BP].RP_Ypos ; Get Line # of Pixel - 02DD F7 26 0000 R MUL SCREEN_WIDTH ; Get Offset to Start of Line - - 02E1 8B 5E 0A MOV BX, [BP].RP_Xpos ; Get Xpos - 02E4 8B CB MOV CX, BX - 02E6 C1 EB 02 SHR BX, 2 ; X offset (Bytes) = Xpos/4 - 02E9 03 D8 ADD BX, AX ; Offset = Width*Ypos + Xpos/4 - - 02EB B0 04 MOV AL, READ_MAP ; GC Read Mask Register - 02ED 8A E1 MOV AH, CL ; Get Xpos - 02EF 80 E4 03 AND AH, PLANE_BITS ; & mask out Plane # - OUT_16 GC_INDEX, AX ; Select Plane to read in - 02F2 BA 03CE 1 MOV DX, GC_INDEX ; then Select Register - 02F5 EF 1 OUT DX, AX ; Set I/O Register(s) - - CLR AH ; Clear Return Value Hi byte - 02F6 32 E4 1 XOR AH, AH ; Set Register = 0 - 02F8 26: 8A 01 MOV AL, ES:[DI+BX] ; Get Color of Pixel - - POPx DI, BP ; Restore Saved Registers - 02FB 5F 1 POP DI ; Restore R1 - 02FC 5D 2 POP BP ; Restore R1 - 02FD CA 0004 RET 4 ; Exit and Clean up Stack - - 0300 READ_POINT ENDP - - - ;====================================================== - ;FILL_BLOCK (Xpos1%, Ypos1%, Xpos2%, Ypos2%, ColorNum%) - ;====================================================== - ; - ; Fills a rectangular block on the active display Page - ; - ; ENTRY: Xpos1 = Left X position of area to fill - ; Ypos1 = Top Y position of area to fill - ; Xpos2 = Right X position of area to fill - ; Ypos2 = Bottom Y position of area to fill - ; ColorNum = Color to fill area with - ; - ; EXIT: No meaningful values returned - ; - - 0016 FB_STACK STRUC - 0000 0000 0000 0000 DW ?x4 ; DS, DI, SI, BP - 0000 - 0008 00000000 DD ? ; Caller - 000C 00 00 FB_Color DB ?,? ; Fill Color - 000E 0000 FB_Ypos2 DW ? ; Y pos of Lower Right Pixel - 0010 0000 FB_Xpos2 DW ? ; X pos of Lower Right Pixel - 0012 0000 FB_Ypos1 DW ? ; Y pos of Upper Left Pixel - 0014 0000 FB_Xpos1 DW ? ; X pos of Upper Left Pixel - FB_STACK ENDS - - PUBLIC FILL_BLOCK - - 0300 FILL_BLOCK PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 0300 55 1 PUSH BP ; Save R1 - 0301 1E 2 PUSH DS ; Save R1 - 0302 56 3 PUSH SI ; Save R1 - 0303 57 4 PUSH DI ; Save R1 - 0304 8B EC MOV BP, SP ; Set up Stack Frame - - 0306 C4 3E 0014 R LES DI, d CURRENT_PAGE ; Point to Active VGA Page - 030A FC CLD ; Direction Flag = Forward - - OUT_8 SC_INDEX, MAP_MASK ; Set up for Plane Select - 030B BA 03C4 1 MOV DX, SC_INDEX ; then Select Register - 030E B0 02 1 MOV AL, MAP_MASK ; then Get Data Value - 0310 EE 1 OUT DX, AL ; Set I/O Register - - ; Validate Pixel Coordinates - ; If necessary, Swap so X1 <= X2, Y1 <= Y2 - - 0311 8B 46 12 MOV AX, [BP].FB_Ypos1 ; AX = Y1 is Y1< Y2? - 0314 8B 5E 0E MOV BX, [BP].FB_Ypos2 ; BX = Y2 - 0317 3B C3 CMP AX, BX - 0319 7E 04 JLE @FB_NOSWAP1 - - 031B 89 5E 12 MOV [BP].FB_Ypos1, BX ; Swap Y1 and Y2 and save Y1 - 031E 93 XCHG AX, BX ; on stack for future use - - 031F @FB_NOSWAP1: - 031F 2B D8 SUB BX, AX ; Get Y width - 0321 43 INC BX ; Add 1 to avoid 0 value - 0322 89 5E 0E MOV [BP].FB_Ypos2, BX ; Save in Ypos2 - - 0325 F7 26 0000 R MUL SCREEN_WIDTH ; Mul Y1 by Bytes per Line - 0329 03 F8 ADD DI, AX ; DI = Start of Line Y1 - - 032B 8B 46 14 MOV AX, [BP].FB_Xpos1 ; Check X1 <= X2 - 032E 8B 5E 10 MOV BX, [BP].FB_Xpos2 ; - 0331 3B C3 CMP AX, BX - 0333 7E 04 JLE @FB_NOSWAP2 ; Skip Ahead if Ok - - 0335 89 46 10 MOV [BP].FB_Xpos2, AX ; Swap X1 AND X2 and save X2 - 0338 93 XCHG AX, BX ; on stack for future use - - ; All our Input Values are in order, Now determine - ; How many full "bands" 4 pixels wide (aligned) there - ; are, and if there are partial bands (<4 pixels) on - ; the left and right edges. - - 0339 @FB_NOSWAP2: - 0339 8B D0 MOV DX, AX ; DX = X1 (Pixel Position) - 033B C1 EA 02 SHR DX, 2 ; DX/4 = Bytes into Line - 033E 03 FA ADD DI, DX ; DI = Addr of Upper-Left Corner - - 0340 8B CB MOV CX, BX ; CX = X2 (Pixel Position) - 0342 C1 E9 02 SHR CX, 2 ; CX/4 = Bytes into Line - - 0345 3B D1 CMP DX, CX ; Start and end in same band? - 0347 75 03 JNE @FB_NORMAL ; if not, check for l & r edges - 0349 E9 0086 JMP @FB_ONE_BAND_ONLY ; if so, then special processing - - 034C @FB_NORMAL: - 034C 2B CA SUB CX, DX ; CX = # bands -1 - 034E 8B F0 MOV SI, AX ; SI = PLANE#(X1) - 0350 83 E6 03 AND SI, PLANE_BITS ; if Left edge is aligned then - 0353 74 27 JZ @FB_L_PLANE_FLUSH ; no special processing.. - - ; Draw "Left Edge" vertical strip of 1-3 pixels... - - OUT_8 SC_Data, Left_Clip_Mask[SI] ; Set Left Edge Plane Mask - 0355 BA 03C5 1 MOV DX, SC_Data ; then Select Register - 0358 2E: 8A 84 0000 R 1 MOV AL, Left_Clip_Mask[SI] ; then Get Data Value - 035D EE 1 OUT DX, AL ; Set I/O Register - - 035E 8B F7 MOV SI, DI ; SI = Copy of Start Addr (UL) - - 0360 8B 56 0E MOV DX, [BP].FB_Ypos2 ; Get # of Lines to draw - 0363 8A 46 0C MOV AL, [BP].FB_Color ; Get Fill Color - 0366 8B 1E 0000 R MOV BX, SCREEN_WIDTH ; Get Vertical increment Value - - 036A @FB_LEFT_LOOP: - 036A 26: 88 04 MOV ES:[SI], AL ; Fill in Left Edge Pixels - 036D 03 F3 ADD SI, BX ; Point to Next Line (Below) - LOOPjz DX, @FB_LEFT_CONT ; Exit loop if all Lines Drawn - 036F 4A 1 DEC DX ; Counter-- - 0370 74 08 1 JZ @FB_LEFT_CONT ; Jump if 0 - - 0372 26: 88 04 MOV ES:[SI], AL ; Fill in Left Edge Pixels - 0375 03 F3 ADD SI, BX ; Point to Next Line (Below) - LOOPx DX, @FB_LEFT_LOOP ; loop until left strip is drawn - 0377 4A 1 DEC DX ; Counter-- - 0378 75 F0 1 JNZ @FB_LEFT_LOOP ; Jump if not 0 - - 037A @FB_LEFT_CONT: - - 037A 47 INC DI ; Point to Middle (or Right) Block - 037B 49 DEC CX ; Reset CX instead of JMP @FB_RIGHT - - 037C @FB_L_PLANE_FLUSH: - 037C 41 INC CX ; Add in Left band to middle block - - ; DI = Addr of 1st middle Pixel (band) to fill - ; CX = # of Bands to fill -1 - - 037D @FB_RIGHT: - 037D 8B 76 10 MOV SI, [BP].FB_Xpos2 ; Get Xpos2 - 0380 83 E6 03 AND SI, PLANE_BITS ; Get Plane values - 0383 83 FE 03 CMP SI, 0003 ; Plane = 3? - 0386 74 2B JE @FB_R_EDGE_FLUSH ; Hey, add to middle - - ; Draw "Right Edge" vertical strip of 1-3 pixels... - - OUT_8 SC_Data, Right_Clip_Mask[SI] ; Right Edge Plane Mask - 0388 BA 03C5 1 MOV DX, SC_Data ; then Select Register - 038B 2E: 8A 84 0004 R 1 MOV AL, Right_Clip_Mask[SI] ; then Get Data Value - 0390 EE 1 OUT DX, AL ; Set I/O Register - - 0391 8B F7 MOV SI, DI ; Get Addr of Left Edge - 0393 03 F1 ADD SI, CX ; Add Width-1 (Bands) - 0395 4E DEC SI ; To point to top of Right Edge - - 0396 8B 56 0E MOV DX, [BP].FB_Ypos2 ; Get # of Lines to draw - 0399 8A 46 0C MOV AL, [BP].FB_Color ; Get Fill Color - 039C 8B 1E 0000 R MOV BX, SCREEN_WIDTH ; Get Vertical increment Value - - 03A0 @FB_RIGHT_LOOP: - 03A0 26: 88 04 MOV ES:[SI], AL ; Fill in Right Edge Pixels - 03A3 03 F3 ADD SI, BX ; Point to Next Line (Below) - LOOPjz DX, @FB_RIGHT_CONT ; Exit loop if all Lines Drawn - 03A5 4A 1 DEC DX ; Counter-- - 03A6 74 08 1 JZ @FB_RIGHT_CONT ; Jump if 0 - - 03A8 26: 88 04 MOV ES:[SI], AL ; Fill in Right Edge Pixels - 03AB 03 F3 ADD SI, BX ; Point to Next Line (Below) - LOOPx DX, @FB_RIGHT_LOOP ; loop until left strip is drawn - 03AD 4A 1 DEC DX ; Counter-- - 03AE 75 F0 1 JNZ @FB_RIGHT_LOOP ; Jump if not 0 - - 03B0 @FB_RIGHT_CONT: - - 03B0 49 DEC CX ; Minus 1 for Middle bands - 03B1 74 51 JZ @FB_EXIT ; Uh.. no Middle bands... - - 03B3 @FB_R_EDGE_FLUSH: - - ; DI = Addr of Upper Left block to fill - ; CX = # of Bands to fill in (width) - - OUT_8 SC_Data, ALL_PLANES ; Write to All Planes - 03B3 BA 03C5 1 MOV DX, SC_Data ; then Select Register - 03B6 B0 0F 1 MOV AL, ALL_PLANES ; then Get Data Value - 03B8 EE 1 OUT DX, AL ; Set I/O Register - - 03B9 8B 16 0000 R MOV DX, SCREEN_WIDTH ; DX = DI Increment - 03BD 2B D1 SUB DX, CX ; = Screen_Width-# Planes Filled - - 03BF 8B D9 MOV BX, CX ; BX = Quick Refill for CX - 03C1 8B 76 0E MOV SI, [BP].FB_Ypos2 ; SI = # of Line to Fill - 03C4 8A 46 0C MOV AL, [BP].FB_Color ; Get Fill Color -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 5 - 1 - - - - 03C7 @FB_MIDDLE_LOOP: - 03C7 F3/ AA REP STOSB ; Fill in entire line - - 03C9 8B CB MOV CX, BX ; Recharge CX (Line Width) - 03CB 03 FA ADD DI, DX ; Point to start of Next Line - LOOPx SI, @FB_MIDDLE_LOOP ; Loop until all lines drawn - 03CD 4E 1 DEC SI ; Counter-- - 03CE 75 F7 1 JNZ @FB_MIDDLE_LOOP ; Jump if not 0 - - 03D0 EB 32 JMP s @FB_EXIT ; Outa here - - 03D2 @FB_ONE_BAND_ONLY: - 03D2 8B F0 MOV SI, AX ; Get Left Clip Mask, Save X1 - 03D4 83 E6 03 AND SI, PLANE_BITS ; Mask out Row # - 03D7 2E: 8A 84 0000 R MOV AL, Left_Clip_Mask[SI] ; Get Left Edge Mask - 03DC 8B F3 MOV SI, BX ; Get Right Clip Mask, Save X2 - 03DE 83 E6 03 AND SI, PLANE_BITS ; Mask out Row # - 03E1 2E: 22 84 0004 R AND AL, Right_Clip_Mask[SI] ; Get Right Edge Mask byte - - OUT_8 SC_Data, AL ; Clip For Left & Right Masks - 03E6 BA 03C5 1 MOV DX, SC_Data ; then Select Register - 03E9 EE 1 OUT DX, AL ; Set I/O Register - - 03EA 8B 4E 0E MOV CX, [BP].FB_Ypos2 ; Get # of Lines to draw - 03ED 8A 46 0C MOV AL, [BP].FB_Color ; Get Fill Color - 03F0 8B 1E 0000 R MOV BX, SCREEN_WIDTH ; Get Vertical increment Value - - 03F4 @FB_ONE_LOOP: - 03F4 26: 88 05 MOV ES:[DI], AL ; Fill in Pixels - 03F7 03 FB ADD DI, BX ; Point to Next Line (Below) - LOOPjz CX, @FB_EXIT ; Exit loop if all Lines Drawn - 03F9 49 1 DEC CX ; Counter-- - 03FA 74 08 1 JZ @FB_EXIT ; Jump if 0 - - 03FC 26: 88 05 MOV ES:[DI], AL ; Fill in Pixels - 03FF 03 FB ADD DI, BX ; Point to Next Line (Below) - LOOPx CX, @FB_ONE_LOOP ; loop until left strip is drawn - 0401 49 1 DEC CX ; Counter-- - 0402 75 F0 1 JNZ @FB_ONE_LOOP ; Jump if not 0 - - 0404 @FB_EXIT: - POPx DI, SI, DS, BP ; Restore Saved Registers - 0404 5F 1 POP DI ; Restore R1 - 0405 5E 2 POP SI ; Restore R1 - 0406 1F 3 POP DS ; Restore R1 - 0407 5D 4 POP BP ; Restore R1 - 0408 CA 000A RET 10 ; Exit and Clean up Stack - - 040B FILL_BLOCK ENDP - - - ;===================================================== - ;DRAW_LINE (Xpos1%, Ypos1%, Xpos2%, Ypos2%, ColorNum%) - ;===================================================== - ; - ; Draws a Line on the active display page - ; - ; ENTRY: Xpos1 = X position of first point on line - ; Ypos1 = Y position of first point on line - ; Xpos2 = X position of last point on line - ; Ypos2 = Y position of last point on line - ; ColorNum = Color to draw line with - ; - ; EXIT: No meaningful values returned - ; - - 0014 DL_STACK STRUC - 0000 0000 0000 0000 DW ?x3 ; DI, SI, BP - 0006 00000000 DD ? ; Caller - 000A 00 00 DL_ColorF DB ?,? ; Line Draw Color - 000C 0000 DL_Ypos2 DW ? ; Y pos of last point - 000E 0000 DL_Xpos2 DW ? ; X pos of last point - 0010 0000 DL_Ypos1 DW ? ; Y pos of first point - 0012 0000 DL_Xpos1 DW ? ; X pos of first point - DL_STACK ENDS - - PUBLIC DRAW_LINE - - 040B DRAW_LINE PROC FAR - - PUSHx BP, SI, DI ; Preserve Important Registers - 040B 55 1 PUSH BP ; Save R1 - 040C 56 2 PUSH SI ; Save R1 - 040D 57 3 PUSH DI ; Save R1 - 040E 8B EC MOV BP, SP ; Set up Stack Frame - 0410 FC CLD ; Direction Flag = Forward - - OUT_8 SC_INDEX, MAP_MASK ; Set up for Plane Select - 0411 BA 03C4 1 MOV DX, SC_INDEX ; then Select Register - 0414 B0 02 1 MOV AL, MAP_MASK ; then Get Data Value - 0416 EE 1 OUT DX, AL ; Set I/O Register - 0417 8A 6E 0A MOV CH, [BP].DL_ColorF ; Save Line Color in CH - - ; Check Line Type - - 041A 8B 76 12 MOV SI, [BP].DL_Xpos1 ; AX = X1 is X1< X2? - 041D 8B 7E 0E MOV DI, [BP].DL_Xpos2 ; DX = X2 - 0420 3B F7 CMP SI, DI ; Is X1 < X2 - 0422 74 5D JE @DL_VLINE ; If X1=X2, Draw Vertical Line - 0424 7C 02 JL @DL_NOSWAP1 ; If X1 < X2, don't swap - - 0426 87 F7 XCHG SI, DI ; X2 IS > X1, SO SWAP THEM - - 0428 @DL_NOSWAP1: - - ; SI = X1, DI = X2 - - 0428 8B 46 10 MOV AX, [BP].DL_Ypos1 ; AX = Y1 is Y1 <> Y2? - 042B 3B 46 0C CMP AX, [BP].DL_Ypos2 ; Y1 = Y2? - 042E 74 03 JE @DL_HORZ ; If so, Draw a Horizontal Line - - 0430 E9 0094 JMP @DL_BREZHAM ; Diagonal line... go do it... - - ; This Code draws a Horizontal Line in Mode X where: - ; SI = X1, DI = X2, and AX = Y1/Y2 - - 0433 @DL_HORZ: - - 0433 F7 26 0000 R MUL SCREEN_WIDTH ; Offset = Ypos * Screen_Width - 0437 8B D0 MOV DX, AX ; CX = Line offset into Page - - 0439 8B C6 MOV AX, SI ; Get Left edge, Save X1 - 043B 83 E6 03 AND SI, PLANE_BITS ; Mask out Row # - 043E 2E: 8A 9C 0000 R MOV BL, Left_Clip_Mask[SI] ; Get Left Edge Mask - 0443 8B CF MOV CX, DI ; Get Right edge, Save X2 - 0445 83 E7 03 AND DI, PLANE_BITS ; Mask out Row # - 0448 2E: 8A BD 0004 R MOV BH, Right_Clip_Mask[DI] ; Get Right Edge Mask byte - - 044D C1 E8 02 SHR AX, 2 ; Get X1 Byte # (=X1/4) - 0450 C1 E9 02 SHR CX, 2 ; Get X2 Byte # (=X2/4) - - 0453 C4 3E 0014 R LES DI, d CURRENT_PAGE ; Point to Active VGA Page - 0457 03 FA ADD DI, DX ; Point to Start of Line - 0459 03 F8 ADD DI, AX ; Point to Pixel X1 - - 045B 2B C8 SUB CX, AX ; CX = # Of Bands (-1) to set - 045D 75 02 JNZ @DL_LONGLN ; jump if longer than one segment - - 045F 22 DF AND BL, BH ; otherwise, merge clip masks - - 0461 @DL_LONGLN: - - OUT_8 SC_Data, BL ; Set the Left Clip Mask - 0461 BA 03C5 1 MOV DX, SC_Data ; then Select Register - 0464 8A C3 1 MOV AL, BL ; then Get Data Value - 0466 EE 1 OUT DX, AL ; Set I/O Register - - 0467 8A 46 0A MOV AL, [BP].DL_ColorF ; Get Line Color - 046A 8A D8 MOV BL, AL ; BL = Copy of Line Color - 046C AA STOSB ; Set Left (1-4) Pixels - - 046D E3 55 JCXZ @DL_EXIT ; Done if only one Line Segment - - 046F 49 DEC CX ; CX = # of Middle Segments - 0470 74 07 JZ @DL_XRSEG ; If no middle segments.... - - ; Draw Middle Segments - - OUT_8 DX, ALL_PLANES ; Write to ALL Planes - 0472 B0 0F 1 MOV AL, ALL_PLANES ; then Get Data Value - 0474 EE 1 OUT DX, AL ; Set I/O Register - - 0475 8A C3 MOV AL, BL ; Get Color from BL - 0477 F3/ AA REP STOSB ; Draw Middle (4 Pixel) Segments - - 0479 @DL_XRSEG: - OUT_8 DX, BH ; Select Planes for Right Clip Mask - 0479 8A C7 1 MOV AL, BH ; then Get Data Value - 047B EE 1 OUT DX, AL ; Set I/O Register - 047C 8A C3 MOV AL, BL ; Get Color Value - 047E AA STOSB ; Draw Right (1-4) Pixels - - 047F EB 43 JMP s @DL_EXIT ; We Are Done... - - - ; This Code Draws A Vertical Line. On entry: - ; CH = Line Color, SI & DI = X1 - - 0481 @DL_VLINE: - - 0481 8B 46 10 MOV AX, [BP].DL_Ypos1 ; AX = Y1 - 0484 8B 76 0C MOV SI, [BP].DL_Ypos2 ; SI = Y2 - 0487 3B C6 CMP AX, SI ; Is Y1 < Y2? - 0489 7E 01 JLE @DL_NOSWAP2 ; if so, Don't Swap them - - 048B 96 XCHG AX, SI ; Ok, NOW Y1 < Y2 - - 048C @DL_NOSWAP2: - - 048C 2B F0 SUB SI, AX ; SI = Line Height (Y2-Y1+1) - 048E 46 INC SI - - ; AX = Y1, DI = X1, Get offset into Page into AX - - 048F F7 26 0000 R MUL SCREEN_WIDTH ; Offset = Y1 (AX) * Screen Width - 0493 8B D7 MOV DX, DI ; Copy Xpos into DX - 0495 C1 EF 02 SHR DI, 2 ; DI = Xpos/4 - 0498 03 C7 ADD AX, DI ; DI = Xpos/4 + ScreenWidth * Y1 - - 049A C4 3E 0014 R LES DI, d CURRENT_PAGE ; Point to Active VGA Page - 049E 03 F8 ADD DI, AX ; Point to Pixel X1, Y1 - - ;Select Plane - - 04A0 8A CA MOV CL, DL ; CL = Save X1 - 04A2 80 E1 03 AND CL, PLANE_BITS ; Get X1 MOD 4 (Plane #) - 04A5 B8 0102 MOV AX, MAP_MASK_PLANE1 ; Code to set Plane #1 - 04A8 D2 E4 SHL AH, CL ; Change to Correct Plane # - OUT_16 SC_Index, AX ; Select Plane - 04AA BA 03C4 1 MOV DX, SC_Index ; then Select Register - 04AD EF 1 OUT DX, AX ; Set I/O Register(s) - - 04AE 8A C5 MOV AL, CH ; Get Saved Color - 04B0 8B 1E 0000 R MOV BX, SCREEN_WIDTH ; Get Offset to Advance Line By - - 04B4 @DL_VLoop: - 04B4 26: 88 05 MOV ES:[DI], AL ; Draw Single Pixel - 04B7 03 FB ADD DI, BX ; Point to Next Line - LOOPjz SI, @DL_EXIT ; Lines--, Exit if done - 04B9 4E 1 DEC SI ; Counter-- - 04BA 74 08 1 JZ @DL_EXIT ; Jump if 0 - - 04BC 26: 88 05 MOV ES:[DI], AL ; Draw Single Pixel - 04BF 03 FB ADD DI, BX ; Point to Next Line - LOOPx SI, @DL_VLoop ; Lines--, Loop until Done - 04C1 4E 1 DEC SI ; Counter-- - 04C2 75 F0 1 JNZ @DL_VLoop ; Jump if not 0 - - 04C4 @DL_EXIT: - - 04C4 E9 0157 JMP @DL_EXIT2 ; Done! - - ; This code Draws a diagonal line in Mode X - - 04C7 @DL_BREZHAM: - 04C7 C4 3E 0014 R LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - 04CB 8B 46 10 MOV AX, [BP].DL_Ypos1 ; get Y1 value - 04CE 8B 5E 0C MOV BX, [BP].DL_Ypos2 ; get Y2 value - 04D1 8B 4E 12 MOV CX, [BP].DL_Xpos1 ; Get Starting Xpos - - 04D4 3B D8 CMP BX, AX ; Y2-Y1 is? - 04D6 73 04 JNC @DL_DeltaYOK ; if Y2>=Y1 then goto... - - 04D8 93 XCHG BX, AX ; Swap em... - 04D9 8B 4E 0E MOV CX, [BP].DL_Xpos2 ; Get New Starting Xpos - - 04DC @DL_DeltaYOK: - 04DC F7 26 0000 R MUL SCREEN_WIDTH ; Offset = SCREEN_WIDTH * Y1 - -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 6 - 1 - - - 04E0 03 F8 ADD DI, AX ; DI -> Start of Line Y1 on Page - 04E2 8B C1 MOV AX, CX ; AX = Xpos (X1) - 04E4 C1 E8 02 SHR AX, 2 ; /4 = Byte Offset into Line - 04E7 03 F8 ADD DI, AX ; DI = Starting pos (X1,Y1) - - 04E9 B0 11 MOV AL, 11h ; Staring Mask - 04EB 80 E1 03 AND CL, PLANE_BITS ; Get Plane # - 04EE D2 E0 SHL AL, CL ; and shift into place - 04F0 8A 66 0A MOV AH, [BP].DL_ColorF ; Color in Hi Bytes - - 04F3 50 PUSH AX ; Save Mask,Color... - - 04F4 8A E0 MOV AH, AL ; Plane # in AH - 04F6 B0 02 MOV AL, MAP_MASK ; Select Plane Register - OUT_16 SC_Index, AX ; Select initial plane - 04F8 BA 03C4 1 MOV DX, SC_Index ; then Select Register - 04FB EF 1 OUT DX, AX ; Set I/O Register(s) - - 04FC 8B 46 12 MOV AX, [BP].DL_Xpos1 ; get X1 value - 04FF 8B 5E 10 MOV BX, [BP].DL_Ypos1 ; get Y1 value - 0502 8B 4E 0E MOV CX, [BP].DL_Xpos2 ; get X2 value - 0505 8B 56 0C MOV DX, [BP].DL_Ypos2 ; get Y2 value - - 0508 8B 2E 0000 R MOV BP, SCREEN_WIDTH ; Use BP for Line width to - ; to avoid extra memory access - - 050C 2B D3 SUB DX, BX ; figure Delta_Y - 050E 73 05 JNC @DL_DeltaYOK2 ; jump if Y2 >= Y1 - - 0510 03 DA ADD BX, DX ; put Y2 into Y1 - 0512 F7 DA NEG DX ; abs(Delta_Y) - 0514 91 XCHG AX, CX ; and exchange X1 and X2 - - 0515 @DL_DeltaYOK2: - 0515 BB 8000 MOV BX, 08000H ; seed for fraction accumulator - - 0518 2B C8 SUB CX, AX ; figure Delta_X - 051A 72 03 JC @DL_DrawLeft ; if negative, go left - - 051C E9 0084 JMP @DL_DrawRight ; Draw Line that slopes right - - 051F @DL_DrawLeft: - - 051F F7 D9 NEG CX ; abs(Delta_X) - - 0521 3B CA CMP CX, DX ; is Delta_X < Delta_Y? - 0523 72 41 JB @DL_SteepLeft ; yes, so go do steep line - ; (Delta_Y iterations) - - ; Draw a Shallow line to the left in Mode X - - 0525 @DL_ShallowLeft: - CLR AX ; zero low word of Delta_Y * 10000h - 0525 33 C0 1 XOR AX, AX ; Set Register = 0 - 0527 2B C2 SUB AX, DX ; DX:AX <- DX * 0FFFFh - 0529 83 DA 00 SBB DX, 0 ; include carry - 052C F7 F1 DIV CX ; divide by Delta_X - - 052E 8B F3 MOV SI, BX ; SI = Accumulator - 0530 8B D8 MOV BX, AX ; BX = Add fraction - 0532 58 POP AX ; Get Color, Bit mask - 0533 BA 03C5 MOV DX, SC_Data ; Sequence controller data register - 0536 41 INC CX ; Inc Delta_X so we can unroll loop - - ; Loop (x2) to Draw Pixels, Move Left, and Maybe Down... - - 0537 @DL_SLLLoop: - 0537 26: 88 25 MOV ES:[DI], AH ; set first pixel, plane data set up - LOOPjz CX, @DL_SLLExit ; Delta_X--, Exit if done - 053A 49 1 DEC CX ; Counter-- - 053B 74 26 1 JZ @DL_SLLExit ; Jump if 0 - - 053D 03 F3 ADD SI, BX ; add numerator to accumulator - 053F 73 02 JNC @DL_SLLL2nc ; move down on carry - - 0541 03 FD ADD DI, BP ; Move Down one line... - - 0543 @DL_SLLL2nc: - 0543 4F DEC DI ; Left one addr - 0544 D0 C8 ROR AL, 1 ; Move Left one plane, back on 0 1 2 - 0546 3C 87 CMP AL, 87h ; wrap?, if AL <88 then Carry set - 0548 83 D7 00 ADC DI, 0 ; Adjust Address: DI = DI + Carry - 054B EE OUT DX, AL ; Set up New Bit Plane mask - - 054C 26: 88 25 MOV ES:[DI], AH ; set pixel - LOOPjz CX, @DL_SLLExit ; Delta_X--, Exit if done - 054F 49 1 DEC CX ; Counter-- - 0550 74 11 1 JZ @DL_SLLExit ; Jump if 0 - - 0552 03 F3 ADD SI, BX ; add numerator to accumulator, - 0554 73 02 JNC @DL_SLLL3nc ; move down on carry - - 0556 03 FD ADD DI, BP ; Move Down one line... - - 0558 @DL_SLLL3nc: ; Now move left a pixel... - 0558 4F DEC DI ; Left one addr - 0559 D0 C8 ROR AL, 1 ; Move Left one plane, back on 0 1 2 - 055B 3C 87 CMP AL, 87h ; Wrap?, if AL <88 then Carry set - 055D 83 D7 00 ADC DI, 0 ; Adjust Address: DI = DI + Carry - 0560 EE OUT DX, AL ; Set up New Bit Plane mask - 0561 EB D4 JMP s @DL_SLLLoop ; loop until done - - 0563 @DL_SLLExit: - 0563 E9 00B8 JMP @DL_EXIT2 ; and exit - - ; Draw a steep line to the left in Mode X - - 0566 @DL_SteepLeft: - CLR AX ; zero low word of Delta_Y * 10000h - 0566 33 C0 1 XOR AX, AX ; Set Register = 0 - 0568 87 D1 XCHG DX, CX ; Delta_Y switched with Delta_X - 056A F7 F1 DIV CX ; divide by Delta_Y - - 056C 8B F3 MOV SI, BX ; SI = Accumulator - 056E 8B D8 MOV BX, AX ; BX = Add Fraction - 0570 58 POP AX ; Get Color, Bit mask - 0571 BA 03C5 MOV DX, SC_Data ; Sequence controller data register - 0574 41 INC CX ; Inc Delta_Y so we can unroll loop - - ; Loop (x2) to Draw Pixels, Move Down, and Maybe left - - 0575 @DL_STLLoop: - - 0575 26: 88 25 MOV ES:[DI], AH ; set first pixel - LOOPjz CX, @DL_STLExit ; Delta_Y--, Exit if done - 0578 49 1 DEC CX ; Counter-- - 0579 74 26 1 JZ @DL_STLExit ; Jump if 0 - - 057B 03 F3 ADD SI, BX ; add numerator to accumulator - 057D 73 09 JNC @DL_STLnc2 ; No carry, just move down! - - 057F 4F DEC DI ; Move Left one addr - 0580 D0 C8 ROR AL, 1 ; Move Left one plane, back on 0 1 2 - 0582 3C 87 CMP AL, 87h ; Wrap?, if AL <88 then Carry set - 0584 83 D7 00 ADC DI, 0 ; Adjust Address: DI = DI + Carry - 0587 EE OUT DX, AL ; Set up New Bit Plane mask - - 0588 @DL_STLnc2: - 0588 03 FD ADD DI, BP ; advance to next line. - - 058A 26: 88 25 MOV ES:[DI], AH ; set pixel - LOOPjz CX, @DL_STLExit ; Delta_Y--, Exit if done - 058D 49 1 DEC CX ; Counter-- - 058E 74 11 1 JZ @DL_STLExit ; Jump if 0 - - 0590 03 F3 ADD SI, BX ; add numerator to accumulator - 0592 73 09 JNC @DL_STLnc3 ; No carry, just move down! - - 0594 4F DEC DI ; Move Left one addr - 0595 D0 C8 ROR AL, 1 ; Move Left one plane, back on 0 1 2 - 0597 3C 87 CMP AL, 87h ; Wrap?, if AL <88 then Carry set - 0599 83 D7 00 ADC DI, 0 ; Adjust Address: DI = DI + Carry - 059C EE OUT DX, AL ; Set up New Bit Plane mask - - 059D @DL_STLnc3: - 059D 03 FD ADD DI, BP ; advance to next line. - 059F EB D4 JMP s @DL_STLLoop ; Loop until done - - 05A1 @DL_STLExit: - 05A1 EB 7B JMP @DL_EXIT2 ; and exit - - ; Draw a line that goes to the Right... - - 05A3 @DL_DrawRight: - 05A3 3B CA CMP CX, DX ; is Delta_X < Delta_Y? - 05A5 72 3E JB @DL_SteepRight ; yes, so go do steep line - ; (Delta_Y iterations) - - ; Draw a Shallow line to the Right in Mode X - - 05A7 @DL_ShallowRight: - CLR AX ; zero low word of Delta_Y * 10000h - 05A7 33 C0 1 XOR AX, AX ; Set Register = 0 - 05A9 2B C2 SUB AX, DX ; DX:AX <- DX * 0FFFFh - 05AB 83 DA 00 SBB DX, 0 ; include carry - 05AE F7 F1 DIV CX ; divide by Delta_X - - 05B0 8B F3 MOV SI, BX ; SI = Accumulator - 05B2 8B D8 MOV BX, AX ; BX = Add Fraction - 05B4 58 POP AX ; Get Color, Bit mask - 05B5 BA 03C5 MOV DX, SC_Data ; Sequence controller data register - 05B8 41 INC CX ; Inc Delta_X so we can unroll loop - - ; Loop (x2) to Draw Pixels, Move Right, and Maybe Down... - - 05B9 @DL_SLRLoop: - 05B9 26: 88 25 MOV ES:[DI], AH ; set first pixel, mask is set up - LOOPjz CX, @DL_SLRExit ; Delta_X--, Exit if done.. - 05BC 49 1 DEC CX ; Counter-- - 05BD 74 24 1 JZ @DL_SLRExit ; Jump if 0 - - 05BF 03 F3 ADD SI, BX ; add numerator to accumulator - 05C1 73 02 JNC @DL_SLR2nc ; don't move down if carry not set - - 05C3 03 FD ADD DI, BP ; Move Down one line... - - 05C5 @DL_SLR2nc: ; Now move right a pixel... - 05C5 D0 C0 ROL AL, 1 ; Move Right one addr if Plane = 0 - 05C7 3C 12 CMP AL, 12h ; Wrap? if AL >12 then Carry not set - 05C9 83 D7 00 ADC DI, 0 ; Adjust Address: DI = DI + Carry - 05CC EE OUT DX, AL ; Set up New Bit Plane mask - - 05CD 26: 88 25 MOV ES:[DI], AH ; set pixel - LOOPjz CX, @DL_SLRExit ; Delta_X--, Exit if done.. - 05D0 49 1 DEC CX ; Counter-- - 05D1 74 10 1 JZ @DL_SLRExit ; Jump if 0 - - 05D3 03 F3 ADD SI, BX ; add numerator to accumulator - 05D5 73 02 JNC @DL_SLR3nc ; don't move down if carry not set - - 05D7 03 FD ADD DI, BP ; Move Down one line... - - 05D9 @DL_SLR3nc: - 05D9 D0 C0 ROL AL, 1 ; Move Right one addr if Plane = 0 - 05DB 3C 12 CMP AL, 12h ; Wrap? if AL >12 then Carry not set - 05DD 83 D7 00 ADC DI, 0 ; Adjust Address: DI = DI + Carry - 05E0 EE OUT DX, AL ; Set up New Bit Plane mask - 05E1 EB D6 JMP s @DL_SLRLoop ; loop till done - - 05E3 @DL_SLRExit: - 05E3 EB 39 JMP @DL_EXIT2 ; and exit - - ; Draw a Steep line to the Right in Mode X - - 05E5 @DL_SteepRight: - CLR AX ; zero low word of Delta_Y * 10000h - 05E5 33 C0 1 XOR AX, AX ; Set Register = 0 - 05E7 87 D1 XCHG DX, CX ; Delta_Y switched with Delta_X - 05E9 F7 F1 DIV CX ; divide by Delta_Y - - 05EB 8B F3 MOV SI, BX ; SI = Accumulator - 05ED 8B D8 MOV BX, AX ; BX = Add Fraction - 05EF 58 POP AX ; Get Color, Bit mask - 05F0 BA 03C5 MOV DX, SC_Data ; Sequence controller data register - 05F3 41 INC CX ; Inc Delta_Y so we can unroll loop - - ; Loop (x2) to Draw Pixels, Move Down, and Maybe Right - - 05F4 @STRLoop: - 05F4 26: 88 25 MOV ES:[DI], AH ; set first pixel, mask is set up - LOOPjz CX, @DL_EXIT2 ; Delta_Y--, Exit if Done - 05F7 49 1 DEC CX ; Counter-- - 05F8 74 24 1 JZ @DL_EXIT2 ; Jump if 0 - - 05FA 03 F3 ADD SI, BX ; add numerator to accumulator - 05FC 73 08 JNC @STRnc2 ; if no carry then just go down... - - 05FE D0 C0 ROL AL, 1 ; Move Right one addr if Plane = 0 - 0600 3C 12 CMP AL, 12h ; Wrap? if AL >12 then Carry not set - 0602 83 D7 00 ADC DI, 0 ; Adjust Address: DI = DI + Carry - 0605 EE OUT DX, AL ; Set up New Bit Plane mask -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 7 - 1 - - - - 0606 @STRnc2: - 0606 03 FD ADD DI, BP ; advance to next line. - - 0608 26: 88 25 MOV ES:[DI], AH ; set pixel - LOOPjz CX, @DL_EXIT2 ; Delta_Y--, Exit if Done - 060B 49 1 DEC CX ; Counter-- - 060C 74 10 1 JZ @DL_EXIT2 ; Jump if 0 - - 060E 03 F3 ADD SI, BX ; add numerator to accumulator - 0610 73 08 JNC @STRnc3 ; if no carry then just go down... - - 0612 D0 C0 ROL AL, 1 ; Move Right one addr if Plane = 0 - 0614 3C 12 CMP AL, 12h ; Wrap? if AL >12 then Carry not set - 0616 83 D7 00 ADC DI, 0 ; Adjust Address: DI = DI + Carry - 0619 EE OUT DX, AL ; Set up New Bit Plane mask - - 061A @STRnc3: - 061A 03 FD ADD DI, BP ; advance to next line. - 061C EB D6 JMP s @STRLoop ; loop till done - - 061E @DL_EXIT2: - POPx DI, SI, BP ; Restore Saved Registers - 061E 5F 1 POP DI ; Restore R1 - 061F 5E 2 POP SI ; Restore R1 - 0620 5D 3 POP BP ; Restore R1 - 0621 CA 000A RET 10 ; Exit and Clean up Stack - - 0624 DRAW_LINE ENDP - - - ; ===== DAC COLOR REGISTER ROUTINES ===== - - ;================================================= - ;SET_DAC_REGISTER (Register%, Red%, Green%, Blue%) - ;================================================= - ; - ; Sets a single (RGB) Vga Palette Register - ; - ; ENTRY: Register = The DAC # to modify (0-255) - ; Red = The new Red Intensity (0-63) - ; Green = The new Green Intensity (0-63) - ; Blue = The new Blue Intensity (0-63) - ; - ; EXIT: No meaningful values returned - ; - - 000E SDR_STACK STRUC - 0000 0000 DW ? ; BP - 0002 00000000 DD ? ; Caller - 0006 00 00 SDR_Blue DB ?,? ; Blue Data Value - 0008 00 00 SDR_Green DB ?,? ; Green Data Value - 000A 00 00 SDR_Red DB ?,? ; Red Data Value - 000C 00 00 SDR_Register DB ?,? ; Palette Register # - SDR_STACK ENDS - - PUBLIC SET_DAC_REGISTER - - 0624 SET_DAC_REGISTER PROC FAR - - 0624 55 PUSH BP ; Save BP - 0625 8B EC MOV BP, SP ; Set up Stack Frame - - ; Select which DAC Register to modify - - OUT_8 DAC_WRITE_ADDR, [BP].SDR_Register - 0627 BA 03C8 1 MOV DX, DAC_WRITE_ADDR ; then Select Register - 062A 8A 46 0C 1 MOV AL, [BP].SDR_Register ; then Get Data Value - 062D EE 1 OUT DX, AL ; Set I/O Register - - 062E BA 03C9 MOV DX, PEL_DATA_REG ; Dac Data Register - OUT_8 DX, [BP].SDR_Red ; Set Red Intensity - 0631 8A 46 0A 1 MOV AL, [BP].SDR_Red ; then Get Data Value - 0634 EE 1 OUT DX, AL ; Set I/O Register - OUT_8 DX, [BP].SDR_Green ; Set Green Intensity - 0635 8A 46 08 1 MOV AL, [BP].SDR_Green ; then Get Data Value - 0638 EE 1 OUT DX, AL ; Set I/O Register - OUT_8 DX, [BP].SDR_Blue ; Set Blue Intensity - 0639 8A 46 06 1 MOV AL, [BP].SDR_Blue ; then Get Data Value - 063C EE 1 OUT DX, AL ; Set I/O Register - - 063D 5D POP BP ; Restore Registers - 063E CA 0008 RET 8 ; Exit & Clean Up Stack - - 0641 SET_DAC_REGISTER ENDP - - ;==================================================== - ;GET_DAC_REGISTER (Register%, &Red%, &Green%, &Blue%) - ;==================================================== - ; - ; Reads the RGB Values of a single Vga Palette Register - ; - ; ENTRY: Register = The DAC # to read (0-255) - ; Red = Offset to Red Variable in DS - ; Green = Offset to Green Variable in DS - ; Blue = Offset to Blue Variable in DS - ; - ; EXIT: The values of the integer variables Red, - ; Green, and Blue are set to the values - ; taken from the specified DAC register. - ; - - 000E GDR_STACK STRUC - 0000 0000 DW ? ; BP - 0002 00000000 DD ? ; Caller - 0006 0000 GDR_Blue DW ? ; Addr of Blue Data Value in DS - 0008 0000 GDR_Green DW ? ; Addr of Green Data Value in DS - 000A 0000 GDR_Red DW ? ; Addr of Red Data Value in DS - 000C 00 00 GDR_Register DB ?,? ; Palette Register # - GDR_STACK ENDS - - PUBLIC GET_DAC_REGISTER - - 0641 GET_DAC_REGISTER PROC FAR - - 0641 55 PUSH BP ; Save BP - 0642 8B EC MOV BP, SP ; Set up Stack Frame - - ; Select which DAC Register to read in - - OUT_8 DAC_READ_ADDR, [BP].GDR_Register - 0644 BA 03C7 1 MOV DX, DAC_READ_ADDR ; then Select Register - 0647 8A 46 0C 1 MOV AL, [BP].GDR_Register ; then Get Data Value - 064A EE 1 OUT DX, AL ; Set I/O Register - - 064B BA 03C9 MOV DX, PEL_DATA_REG ; Dac Data Register - CLR AX ; Clear AX - 064E 33 C0 1 XOR AX, AX ; Set Register = 0 - - 0650 EC IN AL, DX ; Read Red Value - 0651 8B 5E 0A MOV BX, [BP].GDR_Red ; Get Address of Red% - 0654 89 07 MOV [BX], AX ; *Red% = AX - - 0656 EC IN AL, DX ; Read Green Value - 0657 8B 5E 08 MOV BX, [BP].GDR_Green ; Get Address of Green% - 065A 89 07 MOV [BX], AX ; *Green% = AX - - 065C EC IN AL, DX ; Read Blue Value - 065D 8B 5E 06 MOV BX, [BP].GDR_Blue ; Get Address of Blue% - 0660 89 07 MOV [BX], AX ; *Blue% = AX - - 0662 5D POP BP ; Restore Registers - 0663 CA 0008 RET 8 ; Exit & Clean Up Stack - - 0666 GET_DAC_REGISTER ENDP - - - ;=========================================================== - ;LOAD_DAC_REGISTERS (SEG PalData, StartReg%, EndReg%, Sync%) - ;=========================================================== - ; - ; Sets a Block of Vga Palette Registers - ; - ; ENTRY: PalData = Far Pointer to Block of palette data - ; StartReg = First Register # in range to set (0-255) - ; EndReg = Last Register # in Range to set (0-255) - ; Sync = Wait for Vertical Retrace Flag (Boolean) - ; - ; EXIT: No meaningful values returned - ; - ; NOTES: PalData is a linear array of 3 byte Palette values - ; in the order: Red (0-63), Green (0-63), Blue (0-63) - ; - - 0014 LDR_STACK STRUC - 0000 0000 0000 0000 DW ?x3 ; BP, DS, SI - 0006 00000000 DD ? ; Caller - 000A 0000 LDR_Sync DW ? ; Vertical Sync Flag - 000C 00 00 LDR_EndReg DB ?,? ; Last Register # - 000E 00 00 LDR_StartReg DB ?,? ; First Register # - 0010 00000000 LDR_PalData DD ? ; Far Ptr to Palette Data - LDR_STACK ENDS - - PUBLIC LOAD_DAC_REGISTERS - - 0666 LOAD_DAC_REGISTERS PROC FAR - - PUSHx BP, DS, SI ; Save Registers - 0666 55 1 PUSH BP ; Save R1 - 0667 1E 2 PUSH DS ; Save R1 - 0668 56 3 PUSH SI ; Save R1 - 0669 8B EC mov BP, SP ; Set up Stack Frame - - 066B 8B 46 0A mov AX, [BP].LDR_Sync ; Get Vertical Sync Flag - 066E 0B C0 or AX, AX ; is Sync Flag = 0? - 0670 74 05 jz @LDR_Load ; if so, skip call - - 0672 9A ---- 0795 R call f SYNC_DISPLAY ; wait for vsync - - ; Determine register #'s, size to copy, etc - - 0677 @LDR_Load: - - 0677 C5 76 10 lds SI, [BP].LDR_PalData ; DS:SI -> Palette Data - 067A BA 03C8 mov DX, DAC_WRITE_ADDR ; DAC register # selector - - CLR AX, BX ; Clear for byte loads - 067D 33 C0 1 XOR AX, AX ; Set Register = 0 - 067F 33 DB 2 XOR BX, BX ; Set Register = 0 - 0681 8A 46 0E mov AL, [BP].LDR_StartReg ; Get Start Register - 0684 8A 5E 0C mov BL, [BP].LDR_EndReg ; Get End Register - - 0687 2B D8 sub BX, AX ; BX = # of DAC registers -1 - 0689 43 inc BX ; BX = # of DAC registers - 068A 8B CB mov CX, BX ; CX = # of DAC registers - 068C 03 CB add CX, BX ; CX = " " * 2 - 068E 03 CB add CX, BX ; CX = " " * 3 - 0690 FC cld ; Block OUTs forward - 0691 EE out DX, AL ; set up correct register # - - ; Load a block of DAC Registers - - 0692 BA 03C9 mov DX, PEL_DATA_REG ; Dac Data Register - - 0695 F3/ 6E rep outsb ; block set DAC registers - - POPx SI, DS, BP ; Restore Registers - 0697 5E 1 POP SI ; Restore R1 - 0698 1F 2 POP DS ; Restore R1 - 0699 5D 3 POP BP ; Restore R1 - 069A CA 000A ret 10 ; Exit & Clean Up Stack - - 069D LOAD_DAC_REGISTERS ENDP - - - ;==================================================== - ;READ_DAC_REGISTERS (SEG PalData, StartReg%, EndReg%) - ;==================================================== - ; - ; Reads a Block of Vga Palette Registers - ; - ; ENTRY: PalData = Far Pointer to block to store palette data - ; StartReg = First Register # in range to read (0-255) - ; EndReg = Last Register # in Range to read (0-255) - ; - ; EXIT: No meaningful values returned - ; - ; NOTES: PalData is a linear array of 3 byte Palette values - ; in the order: Red (0-63), Green (0-63), Blue (0-63) - ; - - 0012 RDR_STACK STRUC - 0000 0000 0000 0000 DW ?x3 ; BP, ES, DI - 0006 00000000 DD ? ; Caller - 000A 00 00 RDR_EndReg DB ?,? ; Last Register # - 000C 00 00 RDR_StartReg DB ?,? ; First Register # - 000E 00000000 RDR_PalData DD ? ; Far Ptr to Palette Data - RDR_STACK ENDS - - PUBLIC READ_DAC_REGISTERS - -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 8 - 1 - - - 069D READ_DAC_REGISTERS PROC FAR - - PUSHx BP, ES, DI ; Save Registers - 069D 55 1 PUSH BP ; Save R1 - 069E 06 2 PUSH ES ; Save R1 - 069F 57 3 PUSH DI ; Save R1 - 06A0 8B EC mov BP, SP ; Set up Stack Frame - - ; Determine register #'s, size to copy, etc - - 06A2 C4 7E 0E les DI, [BP].RDR_PalData ; ES:DI -> Palette Buffer - 06A5 BA 03C7 mov DX, DAC_READ_ADDR ; DAC register # selector - - CLR AX, BX ; Clear for byte loads - 06A8 33 C0 1 XOR AX, AX ; Set Register = 0 - 06AA 33 DB 2 XOR BX, BX ; Set Register = 0 - 06AC 8A 46 0C mov AL, [BP].RDR_StartReg ; Get Start Register - 06AF 8A 5E 0A mov BL, [BP].RDR_EndReg ; Get End Register - - 06B2 2B D8 sub BX, AX ; BX = # of DAC registers -1 - 06B4 43 inc BX ; BX = # of DAC registers - 06B5 8B CB mov CX, BX ; CX = # of DAC registers - 06B7 03 CB add CX, BX ; CX = " " * 2 - 06B9 03 CB add CX, BX ; CX = " " * 3 - 06BB FC cld ; Block INs forward - - ; Read a block of DAC Registers - - 06BC EE out DX, AL ; set up correct register # - 06BD BA 03C9 mov DX, PEL_DATA_REG ; Dac Data Register - - 06C0 F3/ 6C rep insb ; block read DAC registers - - POPx DI, ES, BP ; Restore Registers - - 06C2 5F 1 POP DI ; Restore R1 - 06C3 07 2 POP ES ; Restore R1 - 06C4 5D 3 POP BP ; Restore R1 - 06C5 CA 0008 ret 8 ; Exit & Clean Up Stack - - 06C8 READ_DAC_REGISTERS ENDP - - - ; ===== PAGE FLIPPING AND SCROLLING ROUTINES ===== - - ;========================= - ;SET_ACTIVE_PAGE (PageNo%) - ;========================= - ; - ; Sets the active display Page to be used for future drawing - ; - ; ENTRY: PageNo = Display Page to make active - ; (values: 0 to Number of Pages - 1) - ; - ; EXIT: No meaningful values returned - ; - - 0008 SAP_STACK STRUC - 0000 0000 DW ? ; BP - 0002 00000000 DD ? ; Caller - 0006 0000 SAP_Page DW ? ; Page # for Drawing - SAP_STACK ENDS - - PUBLIC SET_ACTIVE_PAGE - - 06C8 SET_ACTIVE_PAGE PROC FAR - - 06C8 55 PUSH BP ; Preserve Registers - 06C9 8B EC MOV BP, SP ; Set up Stack Frame - - 06CB 8B 5E 06 MOV BX, [BP].SAP_Page ; Get Desired Page # - 06CE 3B 1E 0004 R CMP BX, LAST_PAGE ; Is Page # Valid? - 06D2 73 0D JAE @SAP_Exit ; IF Not, Do Nothing - - 06D4 89 1E 0012 R MOV ACTIVE_PAGE, BX ; Set Active Page # - - 06D8 D1 E3 SHL BX, 1 ; Scale Page # to Word - 06DA 8B 87 0006 R MOV AX, PAGE_ADDR[BX] ; Get offset to Page - - 06DE A3 0014 R MOV CURRENT_PAGE, AX ; And set for future LES's - - 06E1 @SAP_Exit: - 06E1 5D POP BP ; Restore Registers - 06E2 CA 0002 RET 2 ; Exit and Clean up Stack - - 06E5 SET_ACTIVE_PAGE ENDP - - - ;================ - ;GET_ACTIVE_PAGE% - ;================ - ; - ; Returns the Video Page # currently used for Drawing - ; - ; ENTRY: No Parameters are passed - ; - ; EXIT: AX = Current Video Page used for Drawing - ; - - PUBLIC GET_ACTIVE_PAGE - - 06E5 GET_ACTIVE_PAGE PROC FAR - - 06E5 A1 0012 R MOV AX, ACTIVE_PAGE ; Get Active Page # - 06E8 CB RET ; Exit and Clean up Stack - - 06E9 GET_ACTIVE_PAGE ENDP - - - ;=============================== - ;SET_DISPLAY_PAGE (DisplayPage%) - ;=============================== - ; - ; Sets the currently visible display page. - ; When called this routine syncronizes the display - ; to the vertical blank. - ; - ; ENTRY: PageNo = Display Page to show on the screen - ; (values: 0 to Number of Pages - 1) - ; - ; EXIT: No meaningful values returned - ; - - 0008 SDP_STACK STRUC - 0000 0000 DW ? ; BP - 0002 00000000 DD ? ; Caller - 0006 0000 SDP_Page DW ? ; Page # to Display... - SDP_STACK ENDS - - PUBLIC SET_DISPLAY_PAGE - - 06E9 SET_DISPLAY_PAGE PROC FAR - - 06E9 55 PUSH BP ; Preserve Registers - 06EA 8B EC MOV BP, SP ; Set up Stack Frame - - 06EC 8B 5E 06 MOV BX, [BP].SDP_Page ; Get Desired Page # - 06EF 3B 1E 0004 R CMP BX, LAST_PAGE ; Is Page # Valid? - 06F3 73 2B JAE @SDP_Exit ; IF Not, Do Nothing - - 06F5 89 1E 0010 R MOV DISPLAY_PAGE, BX ; Set Display Page # - - 06F9 D1 E3 SHL BX, 1 ; Scale Page # to Word - 06FB 8B 8F 0006 R MOV CX, PAGE_ADDR[BX] ; Get offset in memory to Page - 06FF 03 0E 001C R ADD CX, CURRENT_MOFFSET ; Adjust for any scrolling - - ; Wait if we are currently in a Vertical Retrace - - 0703 BA 03DA MOV DX, INPUT_1 ; Input Status #1 Register - - 0706 @DP_WAIT0: - 0706 EC IN AL, DX ; Get VGA status - 0707 24 08 AND AL, VERT_RETRACE ; In Display mode yet? - 0709 75 FB JNZ @DP_WAIT0 ; If Not, wait for it - - ; Set the Start Display Address to the new page - - 070B BA 03D4 MOV DX, CRTC_Index ; We Change the VGA Sequencer - - 070E B0 0D MOV AL, START_DISP_LO ; Display Start Low Register - 0710 8A E1 MOV AH, CL ; Low 8 Bits of Start Addr - 0712 EF OUT DX, AX ; Set Display Addr Low - - 0713 B0 0C MOV AL, START_DISP_HI ; Display Start High Register - 0715 8A E5 MOV AH, CH ; High 8 Bits of Start Addr - 0717 EF OUT DX, AX ; Set Display Addr High - - ; Wait for a Vertical Retrace to smooth out things - - 0718 BA 03DA MOV DX, INPUT_1 ; Input Status #1 Register - - 071B @DP_WAIT1: - 071B EC IN AL, DX ; Get VGA status - 071C 24 08 AND AL, VERT_RETRACE ; Vertical Retrace Start? - 071E 74 FB JZ @DP_WAIT1 ; If Not, wait for it - - ; Now Set Display Starting Address - - - 0720 @SDP_Exit: - 0720 5D POP BP ; Restore Registers - 0721 CA 0002 RET 2 ; Exit and Clean up Stack - - 0724 SET_DISPLAY_PAGE ENDP - - - ;================= - ;GET_DISPLAY_PAGE% - ;================= - ; - ; Returns the Video Page # currently displayed - ; - ; ENTRY: No Parameters are passed - ; - ; EXIT: AX = Current Video Page being displayed - ; - - PUBLIC GET_DISPLAY_PAGE - - 0724 GET_DISPLAY_PAGE PROC FAR - - 0724 A1 0010 R MOV AX, DISPLAY_PAGE ; Get Display Page # - 0727 CB RET ; Exit & Clean Up Stack - - 0728 GET_DISPLAY_PAGE ENDP - - - ;======================================= - ;SET_WINDOW (DisplayPage%, Xpos%, Ypos%) - ;======================================= - ; - ; Since a Logical Screen can be larger than the Physical - ; Screen, Scrolling is possible. This routine sets the - ; Upper Left Corner of the Screen to the specified Pixel. - ; Also Sets the Display page to simplify combined page - ; flipping and scrolling. When called this routine - ; syncronizes the display to the vertical blank. - ; - ; ENTRY: DisplayPage = Display Page to show on the screen - ; Xpos = # of pixels to shift screen right - ; Ypos = # of lines to shift screen down - ; - ; EXIT: No meaningful values returned - ; - - 000C SW_STACK STRUC - 0000 0000 DW ? ; BP - 0002 00000000 DD ? ; Caller - 0006 0000 SW_Ypos DW ? ; Y pos of UL Screen Corner - 0008 0000 SW_Xpos DW ? ; X pos of UL Screen Corner - 000A 0000 SW_Page DW ? ; (new) Display Page - SW_STACK ENDS - - PUBLIC SET_WINDOW - - 0728 SET_WINDOW PROC FAR - - 0728 55 PUSH BP ; Preserve Registers - 0729 8B EC MOV BP, SP ; Set up Stack Frame - - ; Check if our Scroll Offsets are Valid - - 072B 8B 5E 0A MOV BX, [BP].SW_Page ; Get Desired Page # - 072E 3B 1E 0004 R CMP BX, LAST_PAGE ; Is Page # Valid? - 0732 73 55 JAE @SW_Exit ; IF Not, Do Nothing - - 0734 8B 46 06 MOV AX, [BP].SW_Ypos ; Get Desired Y Offset - 0737 3B 06 0020 R CMP AX, MAX_YOFFSET ; Is it Within Limits? - 073B 77 4C JA @SW_Exit ; if not, exit - - 073D 8B 4E 08 MOV CX, [BP].SW_Xpos ; Get Desired X Offset - 0740 3B 0E 001E R CMP CX, MAX_XOFFSET ; Is it Within Limits? -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 9 - 1 - - - 0744 77 43 JA @SW_Exit ; if not, exit - - ; Compute proper Display start address to use - - 0746 F7 26 0000 R MUL SCREEN_WIDTH ; AX = YOffset * Line Width - 074A C1 E9 02 SHR CX, 2 ; CX / 4 = Bytes into Line - 074D 03 C1 ADD AX, CX ; AX = Offset of Upper Left Pixel - - 074F A3 001C R MOV CURRENT_MOFFSET, AX ; Save Offset Info - - 0752 89 1E 0010 R MOV DISPLAY_PAGE, BX ; Set Current Page # - 0756 D1 E3 SHL BX, 1 ; Scale Page # to Word - 0758 03 87 0006 R ADD AX, PAGE_ADDR[BX] ; Get offset in VGA to Page - 075C 8B D8 MOV BX, AX ; BX = Desired Display Start - - 075E BA 03DA MOV DX, INPUT_1 ; Input Status #1 Register - - ; Wait if we are currently in a Vertical Retrace - - 0761 @SW_WAIT0: - 0761 EC IN AL, DX ; Get VGA status - 0762 24 08 AND AL, VERT_RETRACE ; In Display mode yet? - 0764 75 FB JNZ @SW_WAIT0 ; If Not, wait for it - - ; Set the Start Display Address to the new window - - 0766 BA 03D4 MOV DX, CRTC_Index ; We Change the VGA Sequencer - 0769 B0 0D MOV AL, START_DISP_LO ; Display Start Low Register - 076B 8A E3 MOV AH, BL ; Low 8 Bits of Start Addr - 076D EF OUT DX, AX ; Set Display Addr Low - - 076E B0 0C MOV AL, START_DISP_HI ; Display Start High Register - 0770 8A E7 MOV AH, BH ; High 8 Bits of Start Addr - 0772 EF OUT DX, AX ; Set Display Addr High - - ; Wait for a Vertical Retrace to smooth out things - - 0773 BA 03DA MOV DX, INPUT_1 ; Input Status #1 Register - - 0776 @SW_WAIT1: - 0776 EC IN AL, DX ; Get VGA status - 0777 24 08 AND AL, VERT_RETRACE ; Vertical Retrace Start? - 0779 74 FB JZ @SW_WAIT1 ; If Not, wait for it - - ; Now Set the Horizontal Pixel Pan values - - OUT_8 ATTRIB_Ctrl, PIXEL_PAN_REG ; Select Pixel Pan Register - 077B BA 03C0 1 MOV DX, ATTRIB_Ctrl ; then Select Register - 077E B0 33 1 MOV AL, PIXEL_PAN_REG ; then Get Data Value - 0780 EE 1 OUT DX, AL ; Set I/O Register - - 0781 8B 46 08 MOV AX, [BP].SW_Xpos ; Get Desired X Offset - 0784 24 03 AND AL, 03 ; Get # of Pixels to Pan (0-3) - 0786 D0 E0 SHL AL, 1 ; Shift for 256 Color Mode - 0788 EE OUT DX, AL ; Fine tune the display! - - 0789 @SW_Exit: - 0789 5D POP BP ; Restore Saved Registers - 078A CA 0006 RET 6 ; Exit and Clean up Stack - - 078D SET_WINDOW ENDP - - - ;============= - ;GET_X_OFFSET% - ;============= - ; - ; Returns the X coordinate of the Pixel currently display - ; in the upper left corner of the display - ; - ; ENTRY: No Parameters are passed - ; - ; EXIT: AX = Current Horizontal Scroll Offset - ; - - PUBLIC GET_X_OFFSET - - 078D GET_X_OFFSET PROC FAR - - 078D A1 0018 R MOV AX, CURRENT_XOFFSET ; Get current horz offset - 0790 CB RET ; Exit & Clean Up Stack - - 0791 GET_X_OFFSET ENDP - - - ;============= - ;GET_Y_OFFSET% - ;============= - ; - ; Returns the Y coordinate of the Pixel currently display - ; in the upper left corner of the display - ; - ; ENTRY: No Parameters are passed - ; - ; EXIT: AX = Current Vertical Scroll Offset - ; - - PUBLIC GET_Y_OFFSET - - 0791 GET_Y_OFFSET PROC FAR - - 0791 A1 001A R MOV AX, CURRENT_YOFFSET ; Get current vertical offset - 0794 CB RET ; Exit & Clean Up Stack - - 0795 GET_Y_OFFSET ENDP - - - ;============ - ;SYNC_DISPLAY - ;============ - ; - ; Pauses the computer until the next Vertical Retrace starts - ; - ; ENTRY: No Parameters are passed - ; - ; EXIT: No meaningful values returned - ; - - PUBLIC SYNC_DISPLAY - - 0795 SYNC_DISPLAY PROC FAR - - 0795 BA 03DA MOV DX, INPUT_1 ; Input Status #1 Register - - ; Wait for any current retrace to end - - 0798 @SD_WAIT0: - 0798 EC IN AL, DX ; Get VGA status - 0799 24 08 AND AL, VERT_RETRACE ; In Display mode yet? - 079B 75 FB JNZ @SD_WAIT0 ; If Not, wait for it - - ; Wait for the start of the next vertical retrace - - 079D @SD_WAIT1: - 079D EC IN AL, DX ; Get VGA status - 079E 24 08 AND AL, VERT_RETRACE ; Vertical Retrace Start? - 07A0 74 FB JZ @SD_WAIT1 ; If Not, wait for it - - 07A2 CB RET ; Exit & Clean Up Stack - - 07A3 SYNC_DISPLAY ENDP - - - ; ===== TEXT DISPLAY ROUTINES ===== - - ;================================================== - ;GPRINTC (CharNum%, Xpos%, Ypos%, ColorF%, ColorB%) - ;================================================== - ; - ; Draws an ASCII Text Character using the currently selected - ; 8x8 font on the active display page. It would be a simple - ; exercise to make this routine process variable height fonts. - ; - ; ENTRY: CharNum = ASCII character # to draw - ; Xpos = X position to draw Character at - ; Ypos = Y position of to draw Character at - ; ColorF = Color to draw text character in - ; ColorB = Color to set background to - ; - ; EXIT: No meaningful values returned - ; - - 001E GPC_STACK STRUC - 0000 0000 GPC_Width DW ? ; Screen Width-1 - 0002 00 00 GPC_Lines DB ?,? ; Scan lines to Decode - 0004 0000 GPC_T_SETS DW ? ; Saved Charset Segment - 0006 0000 GPC_T_SETO DW ? ; Saved Charset Offset - 0008 0000 0000 0000 DW ?x4 ; DI, SI, DS, BP - 0000 - 0010 00000000 DD ? ; Caller - 0014 00 00 GPC_ColorB DB ?,? ; Background Color - 0016 00 00 GPC_ColorF DB ?,? ; Text Color - 0018 0000 GPC_Ypos DW ? ; Y Position to Print at - 001A 0000 GPC_Xpos DW ? ; X position to Print at - 001C 00 00 GPC_Char DB ?,? ; Character to Print - GPC_STACK ENDS - - PUBLIC GPRINTC - - 07A3 GPRINTC PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 07A3 55 1 PUSH BP ; Save R1 - 07A4 1E 2 PUSH DS ; Save R1 - 07A5 56 3 PUSH SI ; Save R1 - 07A6 57 4 PUSH DI ; Save R1 - 07A7 83 EC 08 SUB SP, 8 ; Allocate WorkSpace on Stack - 07AA 8B EC MOV BP, SP ; Set up Stack Frame - - 07AC C4 3E 0014 R LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - 07B0 A1 0000 R MOV AX, SCREEN_WIDTH ; Get Logical Line Width - 07B3 8B D8 MOV BX, AX ; BX = Screen Width - 07B5 4B DEC BX ; = Screen Width-1 - 07B6 89 5E 00 MOV [BP].GPC_Width, BX ; Save for later use - - 07B9 F7 66 18 MUL [BP].GPC_Ypos ; Start of Line = Ypos * Width - 07BC 03 F8 ADD DI, AX ; DI -> Start of Line Ypos - - 07BE 8B 46 1A MOV AX, [BP].GPC_Xpos ; Get Xpos of Character - 07C1 8B C8 MOV CX, AX ; Save Copy of Xpos - 07C3 C1 E8 02 SHR AX, 2 ; Bytes into Line = Xpos/4 - 07C6 03 F8 ADD DI, AX ; DI -> (Xpos, Ypos) - - ;Get Source ADDR of Character Bit Map & Save - - 07C8 8A 46 1C MOV AL, [BP].GPC_Char ; Get Character # - 07CB A8 80 TEST AL, 080h ; Is Hi Bit Set? - 07CD 74 0C JZ @GPC_LowChar ; Nope, use low char set ptr - - 07CF 24 7F AND AL, 07Fh ; Mask Out Hi Bit - 07D1 8B 1E 0026 R MOV BX, CHARSET_HI ; BX = Char Set Ptr:Offset - 07D5 8B 16 0028 R MOV DX, CHARSET_HI+2 ; DX = Char Set Ptr:Segment - 07D9 EB 08 JMP s @GPC_Set_Char ; Go Setup Character Ptr - - 07DB @GPC_LowChar: - - 07DB 8B 1E 0022 R MOV BX, CHARSET_LOW ; BX = Char Set Ptr:Offset - 07DF 8B 16 0024 R MOV DX, CHARSET_LOW+2 ; DX = Char Set Ptr:Segment - - 07E3 @GPC_Set_Char: - 07E3 89 56 04 MOV [BP].GPC_T_SETS, DX ; Save Segment on Stack - - 07E6 B4 00 MOV AH, 0 ; Valid #'s are 0..127 - 07E8 C1 E0 03 SHL AX, 3 ; * 8 Bytes Per Bitmap - 07EB 03 D8 ADD BX, AX ; BX = Offset of Selected char - 07ED 89 5E 06 MOV [BP].GPC_T_SETO, BX ; Save Offset on Stack - - 07F0 83 E1 03 AND CX, PLANE_BITS ; Get Plane # - 07F3 B5 0F MOV CH, ALL_PLANES ; Get Initial Plane mask - 07F5 D2 E5 SHL CH, CL ; And shift into position - 07F7 80 E5 0F AND CH, ALL_PLANES ; And mask to lower nibble - - 07FA B0 04 MOV AL, 04 ; 4-Plane # = # of initial - 07FC 2A C1 SUB AL, CL ; shifts to align bit mask - 07FE 8A C8 MOV CL, AL ; Shift Count for SHL - - ;Get segment of character map - - OUT_8 SC_Index, MAP_MASK ; Setup Plane selections - 0800 BA 03C4 1 MOV DX, SC_Index ; then Select Register - 0803 B0 02 1 MOV AL, MAP_MASK ; then Get Data Value - 0805 EE 1 OUT DX, AL ; Set I/O Register - 0806 42 INC DX ; DX -> SC_Data - - 0807 B0 08 MOV AL, 08 ; 8 Lines to Process - 0809 88 46 02 MOV [BP].GPC_Lines, AL ; Save on Stack - - 080C 8E 5E 04 MOV DS, [BP].GPC_T_SETS ; Point to character set - - 080F @GPC_DECODE_CHAR_BYTE: -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 10 - 1 - - - - 080F 8B 76 06 MOV SI, [BP].GPC_T_SETO ; Get DS:SI = String - - 0812 8A 3C MOV BH, [SI] ; Get Bit Map - 0814 46 INC SI ; Point to Next Line - 0815 89 76 06 MOV [BP].GPC_T_SETO, SI ; And save new Pointer... - - CLR AX ; Clear AX - 0818 33 C0 1 XOR AX, AX ; Set Register = 0 - - CLR BL ; Clear BL - 081A 32 DB 1 XOR BL, BL ; Set Register = 0 - 081C D3 C3 ROL BX, CL ; BL holds left edge bits - 081E 8B F3 MOV SI, BX ; Use as Table Index - 0820 83 E6 0F AND SI, CHAR_BITS ; Get Low Bits - 0823 2E: 8A 84 0008 R MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - 0828 74 07 JZ @GPC_NO_LEFT1BITS ; Skip if No Pixels to set - - 082A 8A 66 16 MOV AH, [BP].GPC_ColorF ; Get Foreground Color - 082D EE OUT DX, AL ; Set up Screen Mask - 082E 26: 88 25 MOV ES:[DI], AH ; Write Foreground color - - 0831 @GPC_NO_LEFT1BITS: - 0831 32 C5 XOR AL, CH ; Invert mask for Background - 0833 74 07 JZ @GPC_NO_LEFT0BITS ; Hey, no need for this - - 0835 8A 66 14 MOV AH, [BP].GPC_ColorB ; Get background Color - 0838 EE OUT DX, AL ; Set up Screen Mask - 0839 26: 88 25 MOV ES:[DI], AH ; Write Foreground color - - ;Now Do Middle/Last Band - - 083C @GPC_NO_LEFT0BITS: - 083C 47 INC DI ; Point to next Byte - 083D C1 C3 04 ROL BX, 4 ; Shift 4 bits - - 0840 8B F3 MOV SI, BX ; Make Lookup Pointer - 0842 83 E6 0F AND SI, CHAR_BITS ; Get Low Bits - 0845 2E: 8A 84 0008 R MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - 084A 74 07 JZ @GPC_NO_MIDDLE1BITS ; Skip if no pixels to set - - 084C 8A 66 16 MOV AH, [BP].GPC_ColorF ; Get Foreground Color - 084F EE OUT DX, AL ; Set up Screen Mask - 0850 26: 88 25 MOV ES:[DI], AH ; Write Foreground color - - 0853 @GPC_NO_MIDDLE1BITS: - 0853 34 0F XOR AL, ALL_PLANES ; Invert mask for Background - 0855 74 07 JZ @GPC_NO_MIDDLE0BITS ; Hey, no need for this - - 0857 8A 66 14 MOV AH, [BP].GPC_ColorB ; Get background Color - 085A EE OUT DX, AL ; Set up Screen Mask - 085B 26: 88 25 MOV ES:[DI], AH ; Write Foreground color - - 085E @GPC_NO_MIDDLE0BITS: - 085E 80 F5 0F XOR CH, ALL_PLANES ; Invert Clip Mask - 0861 80 F9 04 CMP CL, 4 ; Aligned by 4? - 0864 74 23 JZ @GPC_NEXT_LINE ; If so, Exit now.. - - 0866 47 INC DI ; Point to next Byte - 0867 C1 C3 04 ROL BX, 4 ; Shift 4 bits - - 086A 8B F3 MOV SI, BX ; Make Lookup Pointer - 086C 83 E6 0F AND SI, CHAR_BITS ; Get Low Bits - 086F 2E: 8A 84 0008 R MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - 0874 74 07 JZ @GPC_NO_RIGHT1BITS ; Skip if No Pixels to set - - 0876 8A 66 16 MOV AH, [BP].GPC_ColorF ; Get Foreground Color - 0879 EE OUT DX, AL ; Set up Screen Mask - 087A 26: 88 25 MOV ES:[DI], AH ; Write Foreground color - - 087D @GPC_NO_RIGHT1BITS: - - 087D 32 C5 XOR AL, CH ; Invert mask for Background - 087F 74 07 JZ @GPC_NO_RIGHT0BITS ; Hey, no need for this - - 0881 8A 66 14 MOV AH, [BP].GPC_ColorB ; Get background Color - 0884 EE OUT DX, AL ; Set up Screen Mask - 0885 26: 88 25 MOV ES:[DI], AH ; Write Foreground color - - 0888 @GPC_NO_RIGHT0BITS: - 0888 4F DEC DI ; Adjust for Next Line Advance - - 0889 @GPC_NEXT_LINE: - 0889 03 7E 00 ADD DI, [BP].GPC_Width ; Point to Next Line - 088C 80 F5 0F XOR CH, CHAR_BITS ; Flip the Clip mask back - - 088F FE 4E 02 DEC [BP].GPC_Lines ; Count Down Lines - 0892 74 03 JZ @GPC_EXIT ; Ok... Done! - - 0894 E9 FF78 JMP @GPC_DECODE_CHAR_BYTE ; Again! Hey! - - 0897 @GPC_EXIT: - 0897 83 C4 08 ADD SP, 08 ; Deallocate stack workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - 089A 5F 1 POP DI ; Restore R1 - 089B 5E 2 POP SI ; Restore R1 - 089C 1F 3 POP DS ; Restore R1 - 089D 5D 4 POP BP ; Restore R1 - 089E CA 000A RET 10 ; Exit and Clean up Stack - - 08A1 GPRINTC ENDP - - - ;========================================== - ;TGPRINTC (CharNum%, Xpos%, Ypos%, ColorF%) - ;========================================== - ; - ; Transparently draws an ASCII Text Character using the - ; currently selected 8x8 font on the active display page. - ; - ; ENTRY: CharNum = ASCII character # to draw - ; Xpos = X position to draw Character at - ; Ypos = Y position of to draw Character at - ; ColorF = Color to draw text character in - ; - ; EXIT: No meaningful values returned - ; - - 001C TGP_STACK STRUC - 0000 0000 TGP_Width DW ? ; Screen Width-1 - 0002 00 00 TGP_Lines DB ?,? ; Scan lines to Decode - 0004 0000 TGP_T_SETS DW ? ; Saved Charset Segment - 0006 0000 TGP_T_SETO DW ? ; Saved Charset Offset - 0008 0000 0000 0000 DW ?x4 ; DI, SI, DS, BP - 0000 - 0010 00000000 DD ? ; Caller - 0014 00 00 TGP_ColorF DB ?,? ; Text Color - 0016 0000 TGP_Ypos DW ? ; Y Position to Print at - 0018 0000 TGP_Xpos DW ? ; X position to Print at - 001A 00 00 TGP_Char DB ?,? ; Character to Print - TGP_STACK ENDS - - PUBLIC TGPRINTC - - 08A1 TGPRINTC PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 08A1 55 1 PUSH BP ; Save R1 - 08A2 1E 2 PUSH DS ; Save R1 - 08A3 56 3 PUSH SI ; Save R1 - 08A4 57 4 PUSH DI ; Save R1 - 08A5 83 EC 08 SUB SP, 8 ; Allocate WorkSpace on Stack - 08A8 8B EC MOV BP, SP ; Set up Stack Frame - - 08AA C4 3E 0014 R LES DI, d CURRENT_PAGE ; Point to Active VGA Page - - 08AE A1 0000 R MOV AX, SCREEN_WIDTH ; Get Logical Line Width - 08B1 8B D8 MOV BX, AX ; BX = Screen Width - 08B3 4B DEC BX ; = Screen Width-1 - 08B4 89 5E 00 MOV [BP].TGP_Width, BX ; Save for later use - - 08B7 F7 66 16 MUL [BP].TGP_Ypos ; Start of Line = Ypos * Width - 08BA 03 F8 ADD DI, AX ; DI -> Start of Line Ypos - - 08BC 8B 46 18 MOV AX, [BP].TGP_Xpos ; Get Xpos of Character - 08BF 8B C8 MOV CX, AX ; Save Copy of Xpos - 08C1 C1 E8 02 SHR AX, 2 ; Bytes into Line = Xpos/4 - 08C4 03 F8 ADD DI, AX ; DI -> (Xpos, Ypos) - - ;Get Source ADDR of Character Bit Map & Save - - 08C6 8A 46 1A MOV AL, [BP].TGP_Char ; Get Character # - 08C9 A8 80 TEST AL, 080h ; Is Hi Bit Set? - 08CB 74 0C JZ @TGP_LowChar ; Nope, use low char set ptr - - 08CD 24 7F AND AL, 07Fh ; Mask Out Hi Bit - 08CF 8B 1E 0026 R MOV BX, CHARSET_HI ; BX = Char Set Ptr:Offset - 08D3 8B 16 0028 R MOV DX, CHARSET_HI+2 ; DX = Char Set Ptr:Segment - 08D7 EB 08 JMP s @TGP_Set_Char ; Go Setup Character Ptr - - 08D9 @TGP_LowChar: - - 08D9 8B 1E 0022 R MOV BX, CHARSET_LOW ; BX = Char Set Ptr:Offset - 08DD 8B 16 0024 R MOV DX, CHARSET_LOW+2 ; DX = Char Set Ptr:Segment - - 08E1 @TGP_Set_Char: - 08E1 89 56 04 MOV [BP].TGP_T_SETS, DX ; Save Segment on Stack - - 08E4 B4 00 MOV AH, 0 ; Valid #'s are 0..127 - 08E6 C1 E0 03 SHL AX, 3 ; * 8 Bytes Per Bitmap - 08E9 03 D8 ADD BX, AX ; BX = Offset of Selected char - 08EB 89 5E 06 MOV [BP].TGP_T_SETO, BX ; Save Offset on Stack - - 08EE 83 E1 03 AND CX, PLANE_BITS ; Get Plane # - 08F1 B5 0F MOV CH, ALL_PLANES ; Get Initial Plane mask - 08F3 D2 E5 SHL CH, CL ; And shift into position - 08F5 80 E5 0F AND CH, ALL_PLANES ; And mask to lower nibble - - 08F8 B0 04 MOV AL, 04 ; 4-Plane # = # of initial - 08FA 2A C1 SUB AL, CL ; shifts to align bit mask - 08FC 8A C8 MOV CL, AL ; Shift Count for SHL - - ;Get segment of character map - - OUT_8 SC_Index, MAP_MASK ; Setup Plane selections - 08FE BA 03C4 1 MOV DX, SC_Index ; then Select Register - 0901 B0 02 1 MOV AL, MAP_MASK ; then Get Data Value - 0903 EE 1 OUT DX, AL ; Set I/O Register - 0904 42 INC DX ; DX -> SC_Data - - 0905 B0 08 MOV AL, 08 ; 8 Lines to Process - 0907 88 46 02 MOV [BP].TGP_Lines, AL ; Save on Stack - - 090A 8E 5E 04 MOV DS, [BP].TGP_T_SETS ; Point to character set - - 090D @TGP_DECODE_CHAR_BYTE: - - 090D 8B 76 06 MOV SI, [BP].TGP_T_SETO ; Get DS:SI = String - - 0910 8A 3C MOV BH, [SI] ; Get Bit Map - 0912 46 INC SI ; Point to Next Line - 0913 89 76 06 MOV [BP].TGP_T_SETO, SI ; And save new Pointer... - - 0916 8A 66 14 MOV AH, [BP].TGP_ColorF ; Get Foreground Color - - CLR BL ; Clear BL - 0919 32 DB 1 XOR BL, BL ; Set Register = 0 - 091B D3 C3 ROL BX, CL ; BL holds left edge bits - 091D 8B F3 MOV SI, BX ; Use as Table Index - 091F 83 E6 0F AND SI, CHAR_BITS ; Get Low Bits - 0922 2E: 8A 84 0008 R MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - 0927 74 04 JZ @TGP_NO_LEFT1BITS ; Skip if No Pixels to set - - 0929 EE OUT DX, AL ; Set up Screen Mask - 092A 26: 88 25 MOV ES:[DI], AH ; Write Foreground color - - ;Now Do Middle/Last Band - - 092D @TGP_NO_LEFT1BITS: - - 092D 47 INC DI ; Point to next Byte - 092E C1 C3 04 ROL BX, 4 ; Shift 4 bits - - 0931 8B F3 MOV SI, BX ; Make Lookup Pointer - 0933 83 E6 0F AND SI, CHAR_BITS ; Get Low Bits - 0936 2E: 8A 84 0008 R MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - 093B 74 04 JZ @TGP_NO_MIDDLE1BITS ; Skip if no pixels to set - - 093D EE OUT DX, AL ; Set up Screen Mask - 093E 26: 88 25 MOV ES:[DI], AH ; Write Foreground color - - 0941 @TGP_NO_MIDDLE1BITS: - 0941 80 F5 0F XOR CH, ALL_PLANES ; Invert Clip Mask - 0944 80 F9 04 CMP CL, 4 ; Aligned by 4? - 0947 74 15 JZ @TGP_NEXT_LINE ; If so, Exit now.. - - 0949 47 INC DI ; Point to next Byte - 094A C1 C3 04 ROL BX, 4 ; Shift 4 bits - - 094D 8B F3 MOV SI, BX ; Make Lookup Pointer - 094F 83 E6 0F AND SI, CHAR_BITS ; Get Low Bits -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 11 - 1 - - - 0952 2E: 8A 84 0008 R MOV AL, Char_Plane_Data[SI] ; Get Mask in AL - 0957 74 04 JZ @TGP_NO_RIGHT1BITS ; Skip if No Pixels to set - - 0959 EE OUT DX, AL ; Set up Screen Mask - 095A 26: 88 25 MOV ES:[DI], AH ; Write Foreground color - - 095D @TGP_NO_RIGHT1BITS: - - 095D 4F DEC DI ; Adjust for Next Line Advance - - 095E @TGP_NEXT_LINE: - 095E 03 7E 00 ADD DI, [BP].TGP_Width ; Point to Next Line - 0961 80 F5 0F XOR CH, CHAR_BITS ; Flip the Clip mask back - - 0964 FE 4E 02 DEC [BP].TGP_Lines ; Count Down Lines - 0967 74 02 JZ @TGP_EXIT ; Ok... Done! - - 0969 EB A2 JMP @TGP_DECODE_CHAR_BYTE ; Again! Hey! - - 096B @TGP_EXIT: - 096B 83 C4 08 ADD SP, 08 ; Deallocate stack workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - 096E 5F 1 POP DI ; Restore R1 - 096F 5E 2 POP SI ; Restore R1 - 0970 1F 3 POP DS ; Restore R1 - 0971 5D 4 POP BP ; Restore R1 - 0972 CA 0008 RET 8 ; Exit and Clean up Stack - - 0975 TGPRINTC ENDP - - - ;=============================================================== - ;PRINT_STR (SEG String, MaxLen%, Xpos%, Ypos%, ColorF%, ColorB%) - ;=============================================================== - ; - ; Routine to quickly Print a null terminated ASCII string on the - ; active display page up to a maximum length. - ; - ; ENTRY: String = Far Pointer to ASCII string to print - ; MaxLen = # of characters to print if no null found - ; Xpos = X position to draw Text at - ; Ypos = Y position of to draw Text at - ; ColorF = Color to draw text in - ; ColorB = Color to set background to - ; - ; EXIT: No meaningful values returned - ; - - 001A PS_STACK STRUC - 0000 0000 0000 0000 DW ?x4 ; DI, SI, DS, BP - 0000 - 0008 00000000 DD ? ; Caller - 000C 0000 PS_ColorB DW ? ; Background Color - 000E 0000 PS_ColorF DW ? ; Text Color - 0010 0000 PS_Ypos DW ? ; Y Position to Print at - 0012 0000 PS_Xpos DW ? ; X position to Print at - 0014 0000 PS_Len DW ? ; Maximum Length of string to print - 0016 0000 0000 PS_Text DW ?,? ; Far Ptr to Text String - PS_STACK ENDS - - PUBLIC PRINT_STR - - 0975 PRINT_STR PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 0975 55 1 PUSH BP ; Save R1 - 0976 1E 2 PUSH DS ; Save R1 - 0977 56 3 PUSH SI ; Save R1 - 0978 57 4 PUSH DI ; Save R1 - 0979 8B EC MOV BP, SP ; Set up Stack Frame - - 097B @PS_Print_It: - - 097B 8B 4E 14 MOV CX, [BP].PS_Len ; Get Remaining text Length - 097E E3 2F JCXZ @PS_Exit ; Exit when out of text - - 0980 C4 7E 16 LES DI, d [BP].PS_Text ; ES:DI -> Current Char in Text - 0983 26: 8A 05 MOV AL, ES:[DI] ; AL = Text Character - 0986 25 00FF AND AX, 00FFh ; Clear High Word - 0989 74 24 JZ @PS_Exit ; Exit if null character - - 098B FF 4E 14 DEC [BP].PS_Len ; Remaining Text length-- - 098E FF 46 16 INC [BP].PS_Text ; Point to Next text char - - ; Set up Call to GPRINTC - - 0991 50 PUSH AX ; Set Character Parameter - 0992 8B 5E 12 MOV BX, [BP].PS_Xpos ; Get Xpos - 0995 53 PUSH BX ; Set Xpos Parameter - 0996 83 C3 08 ADD BX, 8 ; Advance 1 Char to Right - 0999 89 5E 12 MOV [BP].PS_Xpos, BX ; Save for next time through - - 099C 8B 5E 10 MOV BX, [BP].PS_Ypos ; Get Ypos - 099F 53 PUSH BX ; Set Ypos Parameter - - 09A0 8B 5E 0E MOV BX, [BP].PS_ColorF ; Get Text Color - 09A3 53 PUSH BX ; Set ColorF Parameter - - 09A4 8B 5E 0C MOV BX, [BP].PS_ColorB ; Get Background Color - 09A7 53 PUSH BX ; Set ColorB Parameter - - 09A8 9A ---- 07A3 R CALL f GPRINTC ; Print Character! - 09AD EB CC JMP s @PS_Print_It ; Process next character - - 09AF @PS_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - 09AF 5F 1 POP DI ; Restore R1 - 09B0 5E 2 POP SI ; Restore R1 - 09B1 1F 3 POP DS ; Restore R1 - 09B2 5D 4 POP BP ; Restore R1 - 09B3 CA 000E RET 14 ; Exit and Clean up Stack - - 09B6 PRINT_STR ENDP - - - ;================================================================ - ;TPRINT_STR (SEG String, MaxLen%, Xpos%, Ypos%, ColorF%, ColorB%) - ;================================================================ - ; - ; Routine to quickly transparently Print a null terminated ASCII - ; string on the active display page up to a maximum length. - ; - ; ENTRY: String = Far Pointer to ASCII string to print - ; MaxLen = # of characters to print if no null found - ; Xpos = X position to draw Text at - ; Ypos = Y position of to draw Text at - ; ColorF = Color to draw text in - ; - ; EXIT: No meaningful values returned - ; - - 0018 TPS_STACK STRUC - 0000 0000 0000 0000 DW ?x4 ; DI, SI, DS, BP - 0000 - 0008 00000000 DD ? ; Caller - 000C 0000 TPS_ColorF DW ? ; Text Color - 000E 0000 TPS_Ypos DW ? ; Y Position to Print at - 0010 0000 TPS_Xpos DW ? ; X position to Print at - 0012 0000 TPS_Len DW ? ; Maximum Length of string to print - 0014 0000 0000 TPS_Text DW ?,? ; Far Ptr to Text String - TPS_STACK ENDS - - PUBLIC TPRINT_STR - - 09B6 TPRINT_STR PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 09B6 55 1 PUSH BP ; Save R1 - 09B7 1E 2 PUSH DS ; Save R1 - 09B8 56 3 PUSH SI ; Save R1 - 09B9 57 4 PUSH DI ; Save R1 - 09BA 8B EC MOV BP, SP ; Set up Stack Frame - - 09BC @TPS_Print_It: - - 09BC 8B 4E 12 MOV CX, [BP].TPS_Len ; Get Remaining text Length - 09BF E3 2B JCXZ @TPS_Exit ; Exit when out of text - - 09C1 C4 7E 14 LES DI, d [BP].TPS_Text ; ES:DI -> Current Char in Text - 09C4 26: 8A 05 MOV AL, ES:[DI] ; AL = Text Character - 09C7 25 00FF AND AX, 00FFh ; Clear High Word - 09CA 74 20 JZ @TPS_Exit ; Exit if null character - - 09CC FF 4E 12 DEC [BP].TPS_Len ; Remaining Text length-- - 09CF FF 46 14 INC [BP].TPS_Text ; Point to Next text char - - ; Set up Call to TGPRINTC - - 09D2 50 PUSH AX ; Set Character Parameter - 09D3 8B 5E 10 MOV BX, [BP].TPS_Xpos ; Get Xpos - 09D6 53 PUSH BX ; Set Xpos Parameter - 09D7 83 C3 08 ADD BX, 8 ; Advance 1 Char to Right - 09DA 89 5E 10 MOV [BP].TPS_Xpos, BX ; Save for next time through - - 09DD 8B 5E 0E MOV BX, [BP].TPS_Ypos ; Get Ypos - 09E0 53 PUSH BX ; Set Ypos Parameter - - 09E1 8B 5E 0C MOV BX, [BP].TPS_ColorF ; Get Text Color - 09E4 53 PUSH BX ; Set ColorF Parameter - - 09E5 9A ---- 08A1 R CALL f TGPRINTC ; Print Character! - 09EA EB D0 JMP s @TPS_Print_It ; Process next character - - 09EC @TPS_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - 09EC 5F 1 POP DI ; Restore R1 - 09ED 5E 2 POP SI ; Restore R1 - 09EE 1F 3 POP DS ; Restore R1 - 09EF 5D 4 POP BP ; Restore R1 - 09F0 CA 000C RET 12 ; Exit and Clean up Stack - - 09F3 TPRINT_STR ENDP - - - ;=========================================== - ;SET_DISPLAY_FONT(SEG FontData, FontNumber%) - ;=========================================== - ; - ; Allows the user to specify their own font data for - ; wither the lower or upper 128 characters. - ; - ; ENTRY: FontData = Far Pointer to Font Bitmaps - ; FontNumber = Which half of set this is - ; = 0, Lower 128 characters - ; = 1, Upper 128 characters - ; - ; EXIT: No meaningful values returned - ; - - 000C SDF_STACK STRUC - 0000 0000 DW ? ; BP - 0002 00000000 DD ? ; Caller - 0006 0000 SDF_Which DW ? ; Hi Table/Low Table Flag - 0008 00000000 SDF_Font DD ? ; Far Ptr to Font Table - SDF_STACK ENDS - - PUBLIC SET_DISPLAY_FONT - - 09F3 SET_DISPLAY_FONT PROC FAR - - 09F3 55 PUSH BP ; Preserve Registers - 09F4 8B EC MOV BP, SP ; Set up Stack Frame - - 09F6 C4 7E 08 LES DI, [BP].SDF_Font ; Get Far Ptr to Font - - 09F9 BE 0022 R MOV SI, o CHARSET_LOW ; Assume Lower 128 chars - 09FC F7 46 06 0001 TEST [BP].SDF_Which, 1 ; Font #1 selected? - 0A01 74 03 JZ @SDF_Set_Font ; If not, skip ahead - - 0A03 BE 0026 R MOV SI, o CHARSET_HI ; Ah, really it's 128-255 - - 0A06 @SDF_Set_Font: - 0A06 89 3C MOV [SI], DI ; Set Font Pointer Offset - 0A08 8C 44 02 MOV [SI+2], ES ; Set Font Pointer Segment - - 0A0B 5D POP BP ; Restore Registers - 0A0C CA 0006 RET 6 ; We are Done.. Outa here - - 0A0F SET_DISPLAY_FONT ENDP - - - ; ===== BITMAP (SPRITE) DISPLAY ROUTINES ===== - - ;====================================================== - ;DRAW_BITMAP (SEG Image, Xpos%, Ypos%, Width%, Height%) - ;====================================================== - ; - ; Draws a variable sized Graphics Bitmap such as a - ; picture or an Icon on the current Display Page in - ; Mode X. The Bitmap is stored in a linear byte array - ; corresponding to (0,0) (1,0), (2,0) .. (Width, Height) -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 12 - 1 - - - ; This is the same linear manner as mode 13h graphics. - ; - ; ENTRY: Image = Far Pointer to Bitmap Data - ; Xpos = X position to Place Upper Left pixel at - ; Ypos = Y position to Place Upper Left pixel at - ; Width = Width of the Bitmap in Pixels - ; Height = Height of the Bitmap in Pixels - ; - ; EXIT: No meaningful values returned - ; - - 0022 DB_STACK STRUC - 0000 0000 DB_LineO DW ? ; Offset to Next Line - 0002 0000 DB_PixCount DW ? ; (Minimum) # of Pixels/Line - 0004 0000 DB_Start DW ? ; Addr of Upper Left Pixel - 0006 0000 DB_PixSkew DW ? ; # of bytes to Adjust EOL - 0008 0000 DB_SkewFlag DW ? ; Extra Pix on Plane Flag - 000A 0000 0000 0000 DW ?x4 ; DI, SI, DS, BP - 0000 - 0012 00000000 DD ? ; Caller - 0016 0000 DB_Height DW ? ; Height of Bitmap in Pixels - 0018 0000 DB_Width DW ? ; Width of Bitmap in Pixels - 001A 0000 DB_Ypos DW ? ; Y position to Draw Bitmap at - 001C 0000 DB_Xpos DW ? ; X position to Draw Bitmap at - 001E 00000000 DB_Image DD ? ; Far Pointer to Graphics Bitmap - DB_STACK ENDS - - PUBLIC DRAW_BITMAP - - 0A0F DRAW_BITMAP PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 0A0F 55 1 PUSH BP ; Save R1 - 0A10 1E 2 PUSH DS ; Save R1 - 0A11 56 3 PUSH SI ; Save R1 - 0A12 57 4 PUSH DI ; Save R1 - 0A13 83 EC 0A SUB SP, 10 ; Allocate workspace - 0A16 8B EC MOV BP, SP ; Set up Stack Frame - - 0A18 C4 3E 0014 R LES DI, d CURRENT_PAGE ; Point to Active VGA Page - 0A1C FC CLD ; Direction Flag = Forward - - 0A1D 8B 46 1A MOV AX, [BP].DB_Ypos ; Get UL Corner Ypos - 0A20 F7 26 0000 R MUL SCREEN_WIDTH ; AX = Offset to Line Ypos - - 0A24 8B 5E 1C MOV BX, [BP].DB_Xpos ; Get UL Corner Xpos - 0A27 8A CB MOV CL, BL ; Save Plane # in CL - 0A29 C1 EB 02 SHR BX, 2 ; Xpos/4 = Offset Into Line - - 0A2C 03 F8 ADD DI, AX ; ES:DI -> Start of Line - 0A2E 03 FB ADD DI, BX ; ES:DI -> Upper Left Pixel - 0A30 89 7E 04 MOV [BP].DB_Start, DI ; Save Starting Addr - - ; Compute line to line offset - - 0A33 8B 5E 18 MOV BX, [BP].DB_Width ; Get Width of Image - 0A36 8B D3 MOV DX, BX ; Save Copy in DX - 0A38 C1 EB 02 SHR BX, 2 ; /4 = width in bands - 0A3B A1 0000 R MOV AX, SCREEN_WIDTH ; Get Screen Width - 0A3E 2B C3 SUB AX, BX ; - (Bitmap Width/4) - - 0A40 89 46 00 MOV [BP].DB_LineO, AX ; Save Line Width offset - 0A43 89 5E 02 MOV [BP].DB_PixCount, BX ; Minimum # pix to copy - - 0A46 83 E2 03 AND DX, PLANE_BITS ; Get "partial band" size (0-3) - 0A49 89 56 06 MOV [BP].DB_PixSkew, DX ; Also End of Line Skew - 0A4C 89 56 08 MOV [BP].DB_SkewFlag, DX ; Save as Flag/Count - - 0A4F 83 E1 03 AND CX, PLANE_BITS ; CL = Starting Plane # - 0A52 B8 1102 MOV AX, MAP_MASK_PLANE2 ; Plane Mask & Plane Select - 0A55 D2 E4 SHL AH, CL ; Select correct Plane - OUT_16 SC_Index, AX ; Select Plane... - 0A57 BA 03C4 1 MOV DX, SC_Index ; then Select Register - 0A5A EF 1 OUT DX, AX ; Set I/O Register(s) - 0A5B 8A FC MOV BH, AH ; BH = Saved Plane Mask - 0A5D B3 04 MOV BL, 4 ; BL = Planes to Copy - - 0A5F @DB_COPY_PLANE: - - 0A5F C5 76 1E LDS SI, [BP].DB_Image ; DS:SI-> Source Image - 0A62 8B 56 16 MOV DX, [BP].DB_Height ; # of Lines to Copy - 0A65 8B 7E 04 MOV DI, [BP].DB_Start ; ES:DI-> Dest pos - - 0A68 @DB_COPY_LINE: - 0A68 8B 4E 02 MOV CX, [BP].DB_PixCount ; Min # to copy - - 0A6B F6 C1 FC TEST CL, 0FCh ; 16+PixWide? - 0A6E 74 18 JZ @DB_COPY_REMAINDER ; Nope... - - ; Pixel Copy loop has been unrolled to x4 - - 0A70 @DB_COPY_LOOP: - 0A70 A4 MOVSB ; Copy Bitmap Pixel - 0A71 83 C6 03 ADD SI, 3 ; Skip to Next Byte in same plane - 0A74 A4 MOVSB ; Copy Bitmap Pixel - 0A75 83 C6 03 ADD SI, 3 ; Skip to Next Byte in same plane - 0A78 A4 MOVSB ; Copy Bitmap Pixel - 0A79 83 C6 03 ADD SI, 3 ; Skip to Next Byte in same plane - 0A7C A4 MOVSB ; Copy Bitmap Pixel - 0A7D 83 C6 03 ADD SI, 3 ; Skip to Next Byte in same plane - - 0A80 80 E9 04 SUB CL, 4 ; Pixels to Copy=-4 - 0A83 F6 C1 FC TEST CL, 0FCh ; 4+ Pixels Left? - 0A86 75 E8 JNZ @DB_COPY_LOOP ; if so, do another block - - 0A88 @DB_COPY_REMAINDER: - 0A88 E3 07 JCXZ @DB_NEXT_LINE ; Any Pixels left on line - - 0A8A @DB_COPY2: - 0A8A A4 MOVSB ; Copy Bitmap Pixel - 0A8B 83 C6 03 ADD SI,3 ; Skip to Next Byte in same plane - LOOPx CX, @DB_COPY2 ; Pixels to Copy--, Loop until done - 0A8E 49 1 DEC CX ; Counter-- - 0A8F 75 F9 1 JNZ @DB_COPY2 ; Jump if not 0 - - 0A91 @DB_NEXT_LINE: - - ; any Partial Pixels? (some planes only) - - 0A91 0B 4E 08 OR CX, [BP].DB_SkewFlag ; Get Skew Count - 0A94 74 03 JZ @DB_NEXT2 ; if no partial pixels - - 0A96 A4 MOVSB ; Copy Bitmap Pixel - 0A97 4F DEC DI ; Back up to align - 0A98 4E DEC SI ; Back up to align - - 0A99 @DB_NEXT2: - 0A99 03 76 06 ADD SI, [BP].DB_PixSkew ; Adjust Skew - 0A9C 03 7E 00 ADD DI, [BP].DB_LineO ; Set to Next Display Line - LOOPx DX, @DB_COPY_LINE ; Lines to Copy--, Loop if more - 0A9F 4A 1 DEC DX ; Counter-- - 0AA0 75 C6 1 JNZ @DB_COPY_LINE ; Jump if not 0 - - ; Copy Next Plane.... - - 0AA2 FE CB DEC BL ; Planes to Go-- - 0AA4 74 1B JZ @DB_Exit ; Hey! We are done - - 0AA6 D0 C7 ROL BH, 1 ; Next Plane in line... - OUT_8 SC_Data, BH ; Select Plane - 0AA8 BA 03C5 1 MOV DX, SC_Data ; then Select Register - 0AAB 8A C7 1 MOV AL, BH ; then Get Data Value - 0AAD EE 1 OUT DX, AL ; Set I/O Register - - 0AAE 3C 12 CMP AL, 12h ; Carry Set if AL=11h - 0AB0 83 56 04 00 ADC [BP].DB_Start, 0 ; Screen Addr =+Carry - 0AB4 FF 46 1E INC w [BP].DB_Image ; Start @ Next Byte - - 0AB7 83 6E 08 01 SUB [BP].DB_SkewFlag, 1 ; Reduce Planes to Skew - 0ABB 83 56 08 00 ADC [BP].DB_SkewFlag, 0 ; Back to 0 if it was -1 - - 0ABF EB 9E JMP s @DB_COPY_PLANE ; Go Copy the Next Plane - - 0AC1 @DB_Exit: - 0AC1 83 C4 0A ADD SP, 10 ; Deallocate workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - 0AC4 5F 1 POP DI ; Restore R1 - 0AC5 5E 2 POP SI ; Restore R1 - 0AC6 1F 3 POP DS ; Restore R1 - 0AC7 5D 4 POP BP ; Restore R1 - 0AC8 CA 000C RET 12 ; Exit and Clean up Stack - - 0ACB DRAW_BITMAP ENDP - - - ;======================================================= - ;TDRAW_BITMAP (SEG Image, Xpos%, Ypos%, Width%, Height%) - ;======================================================= - ; - ; Transparently Draws a variable sized Graphics Bitmap - ; such as a picture or an Icon on the current Display Page - ; in Mode X. Pixels with a value of 0 are not drawn, - ; leaving the previous "background" contents intact. - ; - ; The Bitmap format is the same as for the DRAW_BITMAP function. - ; - ; ENTRY: Image = Far Pointer to Bitmap Data - ; Xpos = X position to Place Upper Left pixel at - ; Ypos = Y position to Place Upper Left pixel at - ; Width = Width of the Bitmap in Pixels - ; Height = Height of the Bitmap in Pixels - ; - ; EXIT: No meaningful values returned - ; - - 0022 TB_STACK STRUC - 0000 0000 TB_LineO DW ? ; Offset to Next Line - 0002 0000 TB_PixCount DW ? ; (Minimum) # of Pixels/Line - 0004 0000 TB_Start DW ? ; Addr of Upper Left Pixel - 0006 0000 TB_PixSkew DW ? ; # of bytes to Adjust EOL - 0008 0000 TB_SkewFlag DW ? ; Extra Pix on Plane Flag - 000A 0000 0000 0000 DW ?x4 ; DI, SI, DS, BP - 0000 - 0012 00000000 DD ? ; Caller - 0016 0000 TB_Height DW ? ; Height of Bitmap in Pixels - 0018 0000 TB_Width DW ? ; Width of Bitmap in Pixels - 001A 0000 TB_Ypos DW ? ; Y position to Draw Bitmap at - 001C 0000 TB_Xpos DW ? ; X position to Draw Bitmap at - 001E 00000000 TB_Image DD ? ; Far Pointer to Graphics Bitmap - TB_STACK ENDS - - PUBLIC TDRAW_BITMAP - - 0ACB TDRAW_BITMAP PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 0ACB 55 1 PUSH BP ; Save R1 - 0ACC 1E 2 PUSH DS ; Save R1 - 0ACD 56 3 PUSH SI ; Save R1 - 0ACE 57 4 PUSH DI ; Save R1 - 0ACF 83 EC 0A SUB SP, 10 ; Allocate workspace - 0AD2 8B EC MOV BP, SP ; Set up Stack Frame - - 0AD4 C4 3E 0014 R LES DI, d CURRENT_PAGE ; Point to Active VGA Page - 0AD8 FC CLD ; Direction Flag = Forward - - 0AD9 8B 46 1A MOV AX, [BP].TB_Ypos ; Get UL Corner Ypos - 0ADC F7 26 0000 R MUL SCREEN_WIDTH ; AX = Offset to Line Ypos - - 0AE0 8B 5E 1C MOV BX, [BP].TB_Xpos ; Get UL Corner Xpos - 0AE3 8A CB MOV CL, BL ; Save Plane # in CL - 0AE5 C1 EB 02 SHR BX, 2 ; Xpos/4 = Offset Into Line - - 0AE8 03 F8 ADD DI, AX ; ES:DI -> Start of Line - 0AEA 03 FB ADD DI, BX ; ES:DI -> Upper Left Pixel - 0AEC 89 7E 04 MOV [BP].TB_Start, DI ; Save Starting Addr - - ; Compute line to line offset - - 0AEF 8B 5E 18 MOV BX, [BP].TB_Width ; Get Width of Image - 0AF2 8B D3 MOV DX, BX ; Save Copy in DX - 0AF4 C1 EB 02 SHR BX, 2 ; /4 = width in bands - 0AF7 A1 0000 R MOV AX, SCREEN_WIDTH ; Get Screen Width - 0AFA 2B C3 SUB AX, BX ; - (Bitmap Width/4) - - 0AFC 89 46 00 MOV [BP].TB_LineO, AX ; Save Line Width offset - 0AFF 89 5E 02 MOV [BP].TB_PixCount, BX ; Minimum # pix to copy - - 0B02 83 E2 03 AND DX, PLANE_BITS ; Get "partial band" size (0-3) - 0B05 89 56 06 MOV [BP].TB_PixSkew, DX ; Also End of Line Skew - 0B08 89 56 08 MOV [BP].TB_SkewFlag, DX ; Save as Flag/Count - - 0B0B 83 E1 03 AND CX, PLANE_BITS ; CL = Starting Plane # - 0B0E B8 1102 MOV AX, MAP_MASK_PLANE2 ; Plane Mask & Plane Select - 0B11 D2 E4 SHL AH, CL ; Select correct Plane - OUT_16 SC_Index, AX ; Select Plane... - 0B13 BA 03C4 1 MOV DX, SC_Index ; then Select Register - 0B16 EF 1 OUT DX, AX ; Set I/O Register(s) - 0B17 8A FC MOV BH, AH ; BH = Saved Plane Mask - 0B19 B3 04 MOV BL, 4 ; BL = Planes to Copy - -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 13 - 1 - - - 0B1B @TB_COPY_PLANE: - - 0B1B C5 76 1E LDS SI, [BP].TB_Image ; DS:SI-> Source Image - 0B1E 8B 56 16 MOV DX, [BP].TB_Height ; # of Lines to Copy - 0B21 8B 7E 04 MOV DI, [BP].TB_Start ; ES:DI-> Dest pos - - ; Here AH is set with the value to be considered - ; "Transparent". It can be changed! - - 0B24 B4 00 MOV AH, 0 ; Value to Detect 0 - - 0B26 @TB_COPY_LINE: - 0B26 8B 4E 02 MOV CX, [BP].TB_PixCount ; Min # to copy - - 0B29 F6 C1 FC TEST CL, 0FCh ; 16+PixWide? - 0B2C 74 3A JZ @TB_COPY_REMAINDER ; Nope... - - ; Pixel Copy loop has been unrolled to x4 - - 0B2E @TB_COPY_LOOP: - 0B2E AC LODSB ; Get Pixel Value in AL - 0B2F 83 C6 03 ADD SI, 3 ; Skip to Next Byte in same plane - 0B32 38 E0 CMP AL, AH ; It is "Transparent"? - 0B34 74 03 JE @TB_SKIP_01 ; Skip ahead if so - 0B36 26: 88 05 MOV ES:[DI], AL ; Copy Pixel to VGA screen - - 0B39 @TB_SKIP_01: - 0B39 AC LODSB ; Get Pixel Value in AL - 0B3A 83 C6 03 ADD SI, 3 ; Skip to Next Byte in same plane - 0B3D 38 E0 CMP AL, AH ; It is "Transparent"? - 0B3F 74 04 JE @TB_SKIP_02 ; Skip ahead if so - 0B41 26: 88 45 01 MOV ES:[DI+1], AL ; Copy Pixel to VGA screen - - 0B45 @TB_SKIP_02: - 0B45 AC LODSB ; Get Pixel Value in AL - 0B46 83 C6 03 ADD SI, 3 ; Skip to Next Byte in same plane - 0B49 38 E0 CMP AL, AH ; It is "Transparent"? - 0B4B 74 04 JE @TB_SKIP_03 ; Skip ahead if so - 0B4D 26: 88 45 02 MOV ES:[DI+2], AL ; Copy Pixel to VGA screen - - 0B51 @TB_SKIP_03: - 0B51 AC LODSB ; Get Pixel Value in AL - 0B52 83 C6 03 ADD SI, 3 ; Skip to Next Byte in same plane - 0B55 38 E0 CMP AL, AH ; It is "Transparent"? - 0B57 74 04 JE @TB_SKIP_04 ; Skip ahead if so - 0B59 26: 88 45 03 MOV ES:[DI+3], AL ; Copy Pixel to VGA screen - - 0B5D @TB_SKIP_04: - 0B5D 83 C7 04 ADD DI, 4 ; Adjust Pixel Write Location - 0B60 80 E9 04 SUB CL, 4 ; Pixels to Copy=-4 - 0B63 F6 C1 FC TEST CL, 0FCh ; 4+ Pixels Left? - 0B66 75 C6 JNZ @TB_COPY_LOOP ; if so, do another block - - 0B68 @TB_COPY_REMAINDER: - 0B68 E3 0F JCXZ @TB_NEXT_LINE ; Any Pixels left on line - - 0B6A @TB_COPY2: - 0B6A AC LODSB ; Get Pixel Value in AL - 0B6B 83 C6 03 ADD SI, 3 ; Skip to Next Byte in same plane - 0B6E 38 E0 CMP AL, AH ; It is "Transparent"? - 0B70 74 03 JE @TB_SKIP_05 ; Skip ahead if so - 0B72 26: 88 05 MOV ES:[DI], AL ; Copy Pixel to VGA screen - - 0B75 @TB_SKIP_05: - 0B75 47 INC DI ; Advance Dest Addr - LOOPx CX, @TB_COPY2 ; Pixels to Copy--, Loop until done - 0B76 49 1 DEC CX ; Counter-- - 0B77 75 F1 1 JNZ @TB_COPY2 ; Jump if not 0 - - 0B79 @TB_NEXT_LINE: - - ; any Partial Pixels? (some planes only) - - 0B79 0B 4E 08 OR CX, [BP].TB_SkewFlag ; Get Skew Count - 0B7C 74 09 JZ @TB_NEXT2 ; if no partial pixels - - 0B7E AC LODSB ; Get Pixel Value in AL - 0B7F 4E DEC SI ; Backup to Align - 0B80 38 E0 CMP AL, AH ; It is "Transparent"? - 0B82 74 03 JE @TB_NEXT2 ; Skip ahead if so - 0B84 26: 88 05 MOV ES:[DI], AL ; Copy Pixel to VGA screen - - 0B87 @TB_NEXT2: - 0B87 03 76 06 ADD SI, [BP].TB_PixSkew ; Adjust Skew - 0B8A 03 7E 00 ADD DI, [BP].TB_LineO ; Set to Next Display Line - LOOPx DX, @TB_COPY_LINE ; Lines to Copy--, Loop if More - 0B8D 4A 1 DEC DX ; Counter-- - 0B8E 75 96 1 JNZ @TB_COPY_LINE ; Jump if not 0 - - ;Copy Next Plane.... - - 0B90 FE CB DEC BL ; Planes to Go-- - 0B92 74 1C JZ @TB_Exit ; Hey! We are done - - 0B94 D0 C7 ROL BH, 1 ; Next Plane in line... - OUT_8 SC_Data, BH ; Select Plane - 0B96 BA 03C5 1 MOV DX, SC_Data ; then Select Register - 0B99 8A C7 1 MOV AL, BH ; then Get Data Value - 0B9B EE 1 OUT DX, AL ; Set I/O Register - - 0B9C 3C 12 CMP AL, 12h ; Carry Set if AL=11h - 0B9E 83 56 04 00 ADC [BP].TB_Start, 0 ; Screen Addr =+Carry - 0BA2 FF 46 1E INC w [BP].TB_Image ; Start @ Next Byte - - 0BA5 83 6E 08 01 SUB [BP].TB_SkewFlag, 1 ; Reduce Planes to Skew - 0BA9 83 56 08 00 ADC [BP].TB_SkewFlag, 0 ; Back to 0 if it was -1 - - 0BAD E9 FF6B JMP @TB_COPY_PLANE ; Go Copy the next Plane - - 0BB0 @TB_Exit: - 0BB0 83 C4 0A ADD SP, 10 ; Deallocate workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - 0BB3 5F 1 POP DI ; Restore R1 - 0BB4 5E 2 POP SI ; Restore R1 - 0BB5 1F 3 POP DS ; Restore R1 - 0BB6 5D 4 POP BP ; Restore R1 - 0BB7 CA 000C RET 12 ; Exit and Clean up Stack - - 0BBA TDRAW_BITMAP ENDP - - - ; ==== VIDEO MEMORY to VIDEO MEMORY COPY ROUTINES ===== - - ;================================== - ;COPY_PAGE (SourcePage%, DestPage%) - ;================================== - ; - ; Duplicate on display page onto another - ; - ; ENTRY: SourcePage = Display Page # to Duplicate - ; DestPage = Display Page # to hold copy - ; - ; EXIT: No meaningful values returned - ; - - 0010 CP_STACK STRUC - 0000 0000 0000 0000 DW ?x4 ; DI, SI, DS, BP - 0000 - 0008 00000000 DD ? ; Caller - 000C 0000 CP_DestP DW ? ; Page to hold copied image - 000E 0000 CP_SourceP DW ? ; Page to Make copy from - CP_STACK ENDS - - PUBLIC COPY_PAGE - - 0BBA COPY_PAGE PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 0BBA 55 1 PUSH BP ; Save R1 - 0BBB 1E 2 PUSH DS ; Save R1 - 0BBC 56 3 PUSH SI ; Save R1 - 0BBD 57 4 PUSH DI ; Save R1 - 0BBE 8B EC MOV BP, SP ; Set up Stack Frame - 0BC0 FC CLD ; Block Xfer Forwards - - ; Make sure Page #'s are valid - - 0BC1 8B 46 0E MOV AX, [BP].CP_SourceP ; Get Source Page # - 0BC4 3B 06 0004 R CMP AX, LAST_PAGE ; is it > Max Page #? - 0BC8 73 3D JAE @CP_Exit ; if so, abort - - 0BCA 8B 5E 0C MOV BX, [BP].CP_DestP ; Get Destination Page # - 0BCD 3B 1E 0004 R CMP BX, LAST_PAGE ; is it > Max Page #? - 0BD1 73 34 JAE @CP_Exit ; if so, abort - - 0BD3 3B C3 CMP AX, BX ; Pages #'s the same? - 0BD5 74 30 JE @CP_Exit ; if so, abort - - ; Setup DS:SI and ES:DI to Video Pages - - 0BD7 D1 E3 SHL BX, 1 ; Scale index to Word - 0BD9 8B BF 0006 R MOV DI, PAGE_ADDR[BX] ; Offset to Dest Page - - 0BDD 8B D8 MOV BX, AX ; Index to Source page - 0BDF D1 E3 SHL BX, 1 ; Scale index to Word - 0BE1 8B B7 0006 R MOV SI, PAGE_ADDR[BX] ; Offset to Source Page - - 0BE5 8B 0E 000E R MOV CX, PAGE_SIZE ; Get size of Page - 0BE9 A1 0016 R MOV AX, CURRENT_SEGMENT ; Get Video Mem Segment - 0BEC 8E C0 MOV ES, AX ; ES:DI -> Dest Page - 0BEE 8E D8 MOV DS, AX ; DS:SI -> Source Page - - ; Setup VGA registers for Mem to Mem copy - - OUT_16 GC_Index, LATCHES_ON ; Data from Latches = on - 0BF0 BA 03CE 1 MOV DX, GC_Index ; then Select Register - 0BF3 B8 0008 1 MOV AX, LATCHES_ON ; then Get Data Value - 0BF6 EF 1 OUT DX, AX ; Set I/O Register(s) - OUT_16 SC_Index, ALL_PLANES_ON ; Copy all Planes - 0BF7 BA 03C4 1 MOV DX, SC_Index ; then Select Register - 0BFA B8 0F02 1 MOV AX, ALL_PLANES_ON ; then Get Data Value - 0BFD EF 1 OUT DX, AX ; Set I/O Register(s) - - ; Note.. Do *NOT* use MOVSW or MOVSD - they will - ; Screw with the latches which are 8 bits x 4 - - 0BFE F3/ A4 REP MOVSB ; Copy entire Page! - - ; Reset VGA for normal memory access - - OUT_16 GC_Index, LATCHES_OFF ; Data from Latches = off - 0C00 BA 03CE 1 MOV DX, GC_Index ; then Select Register - 0C03 B8 FF08 1 MOV AX, LATCHES_OFF ; then Get Data Value - 0C06 EF 1 OUT DX, AX ; Set I/O Register(s) - - 0C07 @CP_Exit: - POPx DI, SI, DS, BP ; Restore Saved Registers - 0C07 5F 1 POP DI ; Restore R1 - 0C08 5E 2 POP SI ; Restore R1 - 0C09 1F 3 POP DS ; Restore R1 - 0C0A 5D 4 POP BP ; Restore R1 - 0C0B CA 0004 RET 4 ; Exit and Clean up Stack - - 0C0E COPY_PAGE ENDP - - - ;========================================================================== - ;COPY_BITMAP (SourcePage%, X1%, Y1%, X2%, Y2%, DestPage%, DestX1%, DestY1%) - ;========================================================================== - ; - ; Copies a Bitmap Image from one Display Page to Another - ; This Routine is Limited to copying Images with the same - ; Plane Alignment. To Work: (X1 MOD 4) must = (DestX1 MOD 4) - ; Copying an Image to the Same Page is supported, but results - ; may be defined when the when the rectangular areas - ; (X1, Y1) - (X2, Y2) and (DestX1, DestY1) - - ; (DestX1+(X2-X1), DestY1+(Y2-Y1)) overlap... - ; No Paramter checking to done to insure that - ; X2 >= X1 and Y2 >= Y1. Be Careful... - ; - ; ENTRY: SourcePage = Display Page # with Source Image - ; X1 = Upper Left Xpos of Source Image - ; Y1 = Upper Left Ypos of Source Image - ; X2 = Lower Right Xpos of Source Image - ; Y2 = Lower Right Ypos of Source Image - ; DestPage = Display Page # to copy Image to - ; DestX1 = Xpos to Copy UL Corner of Image to - ; DestY1 = Ypos to Copy UL Corner of Image to - ; - ; EXIT: AX = Success Flag: 0 = Failure / -1= Success - ; - - 0020 CB_STACK STRUC - 0000 0000 CB_Height DW ? ; Height of Image in Lines - 0002 0000 CB_Width DW ? ; Width of Image in "bands" - 0004 0000 0000 0000 DW ?x4 ; DI, SI, DS, BP - 0000 - 000C 00000000 DD ? ; Caller - 0010 0000 CB_DestY1 DW ? ; Destination Ypos - 0012 0000 CB_DestX1 DW ? ; Destination Xpos - 0014 0000 CB_DestP DW ? ; Page to Copy Bitmap To -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 14 - 1 - - - 0016 0000 CB_Y2 DW ? ; LR Ypos of Image - 0018 0000 CB_X2 DW ? ; LR Xpos of Image - 001A 0000 CB_Y1 DW ? ; UL Ypos of Image - 001C 0000 CB_X1 DW ? ; UL Xpos of Image - 001E 0000 CB_SourceP DW ? ; Page containing Source Bitmap - CB_STACK ENDS - - PUBLIC COPY_BITMAP - - 0C0E COPY_BITMAP PROC FAR - - PUSHx BP, DS, SI, DI ; Preserve Important Registers - 0C0E 55 1 PUSH BP ; Save R1 - 0C0F 1E 2 PUSH DS ; Save R1 - 0C10 56 3 PUSH SI ; Save R1 - 0C11 57 4 PUSH DI ; Save R1 - 0C12 83 EC 04 SUB SP, 4 ; Allocate WorkSpace on Stack - 0C15 8B EC MOV BP, SP ; Set up Stack Frame - - ; Prep Registers (and keep jumps short!) - - 0C17 8E 06 0016 R MOV ES, CURRENT_SEGMENT ; ES -> VGA Ram - 0C1B FC CLD ; Block Xfer Forwards - - ; Make sure Parameters are valid - - 0C1C 8B 5E 1E MOV BX, [BP].CB_SourceP ; Get Source Page # - 0C1F 3B 1E 0004 R CMP BX, LAST_PAGE ; is it > Max Page #? - 0C23 73 7D JAE @CB_Abort ; if so, abort - - 0C25 8B 4E 14 MOV CX, [BP].CB_DestP ; Get Destination Page # - 0C28 3B 0E 0004 R CMP CX, LAST_PAGE ; is it > Max Page #? - 0C2C 73 74 JAE @CB_Abort ; if so, abort - - 0C2E 8B 46 1C MOV AX, [BP].CB_X1 ; Get Source X1 - 0C31 33 46 12 XOR AX, [BP].CB_DestX1 ; Compare Bits 0-1 - 0C34 83 E0 03 AND AX, PLANE_BITS ; Check Plane Bits - 0C37 75 69 JNZ @CB_Abort ; They should cancel out - - ; Setup for Copy processing - - OUT_8 SC_INDEX, MAP_MASK ; Set up for Plane Select - 0C39 BA 03C4 1 MOV DX, SC_INDEX ; then Select Register - 0C3C B0 02 1 MOV AL, MAP_MASK ; then Get Data Value - 0C3E EE 1 OUT DX, AL ; Set I/O Register - OUT_16 GC_Index, LATCHES_ON ; Data from Latches = on - 0C3F BA 03CE 1 MOV DX, GC_Index ; then Select Register - 0C42 B8 0008 1 MOV AX, LATCHES_ON ; then Get Data Value - 0C45 EF 1 OUT DX, AX ; Set I/O Register(s) - - ; Compute Info About Images, Setup ES:SI & ES:DI - - 0C46 8B 46 16 MOV AX, [BP].CB_Y2 ; Height of Bitmap in lines - 0C49 2B 46 1A SUB AX, [BP].CB_Y1 ; is Y2 - Y1 + 1 - 0C4C 40 INC AX ; (add 1 since were not 0 based) - 0C4D 89 46 00 MOV [BP].CB_Height, AX ; Save on Stack for later use - - 0C50 8B 46 18 MOV AX, [BP].CB_X2 ; Get # of "Bands" of 4 Pixels - 0C53 8B 56 1C MOV DX, [BP].CB_X1 ; the Bitmap Occupies as X2-X1 - 0C56 C1 E8 02 SHR AX, 2 ; Get X2 Band (X2 / 4) - 0C59 C1 EA 02 SHR DX, 2 ; Get X1 Band (X1 / 4) - 0C5C 2B C2 SUB AX, DX ; AX = # of Bands - 1 - 0C5E 40 INC AX ; AX = # of Bands - 0C5F 89 46 02 MOV [BP].CB_Width, AX ; Save on Stack for later use - - 0C62 D1 E3 SHL BX, 1 ; Scale Source Page to Word - 0C64 8B B7 0006 R MOV SI, PAGE_ADDR[BX] ; SI = Offset of Source Page - 0C68 8B 46 1A MOV AX, [BP].CB_Y1 ; Get Source Y1 Line - 0C6B F7 26 0000 R MUL SCREEN_WIDTH ; AX = Offset to Line Y1 - 0C6F 03 F0 ADD SI, AX ; SI = Offset to Line Y1 - 0C71 8B 46 1C MOV AX, [BP].CB_X1 ; Get Source X1 - 0C74 C1 E8 02 SHR AX, 2 ; X1 / 4 = Byte offset - 0C77 03 F0 ADD SI, AX ; SI = Byte Offset to (X1,Y1) - - 0C79 8B D9 MOV BX, CX ; Dest Page Index to BX - 0C7B D1 E3 SHL BX, 1 ; Scale Source Page to Word - 0C7D 8B BF 0006 R MOV DI, PAGE_ADDR[BX] ; DI = Offset of Dest Page - 0C81 8B 46 10 MOV AX, [BP].CB_DestY1 ; Get Dest Y1 Line - 0C84 F7 26 0000 R MUL SCREEN_WIDTH ; AX = Offset to Line Y1 - 0C88 03 F8 ADD DI, AX ; DI = Offset to Line Y1 - 0C8A 8B 46 12 MOV AX, [BP].CB_DestX1 ; Get Dest X1 - 0C8D C1 E8 02 SHR AX, 2 ; X1 / 4 = Byte offset - 0C90 03 F8 ADD DI, AX ; DI = Byte Offset to (D-X1,D-Y1) - - 0C92 8B 4E 02 MOV CX, [BP].CB_Width ; CX = Width of Image (Bands) - 0C95 49 DEC CX ; CX = 1? - 0C96 74 0F JE @CB_Only_One_Band ; 0 Means Image Width of 1 Band - - 0C98 8B 5E 1C MOV BX, [BP].CB_X1 ; Get Source X1 - 0C9B 83 E3 03 AND BX, PLANE_BITS ; Aligned? (bits 0-1 = 00?) - 0C9E 74 70 JZ @CB_Check_Right ; if so, check right alignment - 0CA0 75 41 JNZ @CB_Left_Band ; not aligned? well.. - - 0CA2 @CB_Abort: - CLR AX ; Return False (Failure) - 0CA2 33 C0 1 XOR AX, AX ; Set Register = 0 - 0CA4 E9 00D7 JMP @CB_Exit ; and Finish Up - - ; Copy when Left & Right Clip Masks overlap... - - 0CA7 @CB_Only_One_Band: - 0CA7 8B 5E 1C MOV BX, [BP].CB_X1 ; Get Left Clip Mask - 0CAA 83 E3 03 AND BX, PLANE_BITS ; Mask out Row # - 0CAD 2E: 8A 87 0000 R MOV AL, Left_Clip_Mask[BX] ; Get Left Edge Mask - 0CB2 8B 5E 18 MOV BX, [BP].CB_X2 ; Get Right Clip Mask - 0CB5 83 E3 03 AND BX, PLANE_BITS ; Mask out Row # - 0CB8 2E: 22 87 0004 R AND AL, Right_Clip_Mask[BX] ; Get Right Edge Mask byte - - OUT_8 SC_Data, AL ; Clip For Left & Right Masks - 0CBD BA 03C5 1 MOV DX, SC_Data ; then Select Register - 0CC0 EE 1 OUT DX, AL ; Set I/O Register - - 0CC1 8B 4E 00 MOV CX, [BP].CB_Height ; CX = # of Lines to Copy - 0CC4 8B 16 0000 R MOV DX, SCREEN_WIDTH ; DX = Width of Screen - CLR BX ; BX = Offset into Image - 0CC8 33 DB 1 XOR BX, BX ; Set Register = 0 - - 0CCA @CB_One_Loop: - 0CCA 26: 8A 00 MOV AL, ES:[SI+BX] ; Load Latches - 0CCD 26: 88 01 MOV ES:[DI+BX], AL ; Unload Latches - 0CD0 03 DA ADD BX, DX ; Advance Offset to Next Line - LOOPjz CX, @CB_One_Done ; Exit Loop if Finished - 0CD2 49 1 DEC CX ; Counter-- - 0CD3 74 0B 1 JZ @CB_One_Done ; Jump if 0 - - 0CD5 26: 8A 00 MOV AL, ES:[SI+BX] ; Load Latches - 0CD8 26: 88 01 MOV ES:[DI+BX], AL ; Unload Latches - 0CDB 03 DA ADD BX, DX ; Advance Offset to Next Line - LOOPx CX, @CB_One_Loop ; Loop until Finished - 0CDD 49 1 DEC CX ; Counter-- - 0CDE 75 EA 1 JNZ @CB_One_Loop ; Jump if not 0 - - 0CE0 @CB_One_Done: - 0CE0 E9 0094 JMP @CB_Finish ; Outa Here! - - ; Copy Left Edge of Bitmap - - 0CE3 @CB_Left_Band: - - OUT_8 SC_Data, Left_Clip_Mask[BX] ; Set Left Edge Plane Mask - 0CE3 BA 03C5 1 MOV DX, SC_Data ; then Select Register - 0CE6 2E: 8A 87 0000 R 1 MOV AL, Left_Clip_Mask[BX] ; then Get Data Value - 0CEB EE 1 OUT DX, AL ; Set I/O Register - - 0CEC 8B 4E 00 MOV CX, [BP].CB_Height ; CX = # of Lines to Copy - 0CEF 8B 16 0000 R MOV DX, SCREEN_WIDTH ; DX = Width of Screen - CLR BX ; BX = Offset into Image - 0CF3 33 DB 1 XOR BX, BX ; Set Register = 0 - - 0CF5 @CB_Left_Loop: - 0CF5 26: 8A 00 MOV AL, ES:[SI+BX] ; Load Latches - 0CF8 26: 88 01 MOV ES:[DI+BX], AL ; Unload Latches - 0CFB 03 DA ADD BX, DX ; Advance Offset to Next Line - LOOPjz CX, @CB_Left_Done ; Exit Loop if Finished - 0CFD 49 1 DEC CX ; Counter-- - 0CFE 74 0B 1 JZ @CB_Left_Done ; Jump if 0 - - 0D00 26: 8A 00 MOV AL, ES:[SI+BX] ; Load Latches - 0D03 26: 88 01 MOV ES:[DI+BX], AL ; Unload Latches - 0D06 03 DA ADD BX, DX ; Advance Offset to Next Line - LOOPx CX, @CB_Left_Loop ; Loop until Finished - 0D08 49 1 DEC CX ; Counter-- - 0D09 75 EA 1 JNZ @CB_Left_Loop ; Jump if not 0 - - 0D0B @CB_Left_Done: - 0D0B 47 INC DI ; Move Dest Over 1 band - 0D0C 46 INC SI ; Move Source Over 1 band - 0D0D FF 4E 02 DEC [BP].CB_Width ; Band Width-- - - ; Determine if Right Edge of Bitmap needs special copy - - 0D10 @CB_Check_Right: - 0D10 8B 5E 18 MOV BX, [BP].CB_X2 ; Get Source X2 - 0D13 83 E3 03 AND BX, PLANE_BITS ; Aligned? (bits 0-1 = 11?) - 0D16 80 FB 03 CMP BL, 03h ; Plane = 3? - 0D19 74 2C JE @CB_Copy_Middle ; Copy the Middle then! - - ; Copy Right Edge of Bitmap - - 0D1B @CB_Right_Band: - - OUT_8 SC_Data, Right_Clip_Mask[BX] ; Set Right Edge Plane Mask - 0D1B BA 03C5 1 MOV DX, SC_Data ; then Select Register - 0D1E 2E: 8A 87 0004 R 1 MOV AL, Right_Clip_Mask[BX] ; then Get Data Value - 0D23 EE 1 OUT DX, AL ; Set I/O Register - - 0D24 FF 4E 02 DEC [BP].CB_Width ; Band Width-- - 0D27 8B 4E 00 MOV CX, [BP].CB_Height ; CX = # of Lines to Copy - 0D2A 8B 16 0000 R MOV DX, SCREEN_WIDTH ; DX = Width of Screen - 0D2E 8B 5E 02 MOV BX, [BP].CB_Width ; BX = Offset to Right Edge - - 0D31 @CB_Right_Loop: - 0D31 26: 8A 00 MOV AL, ES:[SI+BX] ; Load Latches - 0D34 26: 88 01 MOV ES:[DI+BX], AL ; Unload Latches - 0D37 03 DA ADD BX, DX ; Advance Offset to Next Line - LOOPjz CX, @CB_Right_Done ; Exit Loop if Finished - 0D39 49 1 DEC CX ; Counter-- - 0D3A 74 0B 1 JZ @CB_Right_Done ; Jump if 0 - - 0D3C 26: 8A 00 MOV AL, ES:[SI+BX] ; Load Latches - 0D3F 26: 88 01 MOV ES:[DI+BX], AL ; Unload Latches - 0D42 03 DA ADD BX, DX ; Advance Offset to Next Line - LOOPx CX, @CB_Right_Loop ; Loop until Finished - 0D44 49 1 DEC CX ; Counter-- - 0D45 75 EA 1 JNZ @CB_Right_Loop ; Jump if not 0 - - 0D47 @CB_Right_Done: - - ; Copy the Main Block of the Bitmap - - 0D47 @CB_Copy_Middle: - - 0D47 8B 4E 02 MOV CX, [BP].CB_Width ; Get Width Remaining - 0D4A E3 2B JCXZ @CB_Finish ; Exit if Done - - OUT_8 SC_Data, ALL_PLANES ; Copy all Planes - 0D4C BA 03C5 1 MOV DX, SC_Data ; then Select Register - 0D4F B0 0F 1 MOV AL, ALL_PLANES ; then Get Data Value - 0D51 EE 1 OUT DX, AL ; Set I/O Register - - 0D52 8B 16 0000 R MOV DX, SCREEN_WIDTH ; Get Width of Screen minus - 0D56 2B D1 SUB DX, CX ; Image width (for Adjustment) - 0D58 8B 46 00 MOV AX, [BP].CB_Height ; AX = # of Lines to Copy - 0D5B 8B D9 MOV BX, CX ; BX = Quick REP reload count - 0D5D 8C C1 MOV CX, ES ; Move VGA Segment - 0D5F 8E D9 MOV DS, CX ; Into DS - - ; Actual Copy Loop. REP MOVSB does the work - - 0D61 @CB_Middle_Copy: - 0D61 8B CB MOV CX, BX ; Recharge Rep Count - 0D63 F3/ A4 REP MOVSB ; Move Bands - LOOPjz AX, @CB_Finish ; Exit Loop if Finished - 0D65 48 1 DEC AX ; Counter-- - 0D66 74 0F 1 JZ @CB_Finish ; Jump if 0 - - 0D68 03 F2 ADD SI, DX ; Adjust DS:SI to Next Line - 0D6A 03 FA ADD DI, DX ; Adjust ES:DI to Next Line - - 0D6C 8B CB MOV CX, BX ; Recharge Rep Count - 0D6E F3/ A4 REP MOVSB ; Move Bands - - 0D70 03 F2 ADD SI, DX ; Adjust DS:SI to Next Line - 0D72 03 FA ADD DI, DX ; Adjust ES:DI to Next Line - LOOPx AX, @CB_Middle_Copy ; Copy Lines until Done - 0D74 48 1 DEC AX ; Counter-- - 0D75 75 EA 1 JNZ @CB_Middle_Copy ; Jump if not 0 - - 0D77 @CB_Finish: - OUT_16 GC_Index, LATCHES_OFF ; Data from Latches = on - 0D77 BA 03CE 1 MOV DX, GC_Index ; then Select Register -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Page 15 - 1 - - - 0D7A B8 FF08 1 MOV AX, LATCHES_OFF ; then Get Data Value - 0D7D EF 1 OUT DX, AX ; Set I/O Register(s) - - 0D7E @CB_Exit: - 0D7E 83 C4 04 ADD SP, 04 ; Deallocate stack workspace - POPx DI, SI, DS, BP ; Restore Saved Registers - 0D81 5F 1 POP DI ; Restore R1 - 0D82 5E 2 POP SI ; Restore R1 - 0D83 1F 3 POP DS ; Restore R1 - 0D84 5D 4 POP BP ; Restore R1 - 0D85 CA 0010 RET 16 ; Exit and Clean up Stack - - 0D88 COPY_BITMAP ENDP - - END ; End of Code Segment -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Symbols 16 - 1 - - - - -Macros: - - N a m e Type - -CLR . . . . . . . . . . . . . . Proc -LOOPjz . . . . . . . . . . . . . Proc -LOOPx . . . . . . . . . . . . . Proc -OUT_16 . . . . . . . . . . . . . Proc -OUT_8 . . . . . . . . . . . . . Proc -POPx . . . . . . . . . . . . . . Proc -PUSHx . . . . . . . . . . . . . Proc -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Symbols 17 - 1 - - - - -Structures and Unions: - - N a m e Size - Offset Type - -CB_STACK . . . . . . . . . . . . 0020 - CB_Height . . . . . . . . . . 0000 Word - CB_Width . . . . . . . . . . . 0002 Word - CB_DestY1 . . . . . . . . . . 0010 Word - CB_DestX1 . . . . . . . . . . 0012 Word - CB_DestP . . . . . . . . . . . 0014 Word - CB_Y2 . . . . . . . . . . . . 0016 Word - CB_X2 . . . . . . . . . . . . 0018 Word - CB_Y1 . . . . . . . . . . . . 001A Word - CB_X1 . . . . . . . . . . . . 001C Word - CB_SourceP . . . . . . . . . . 001E Word -CP_STACK . . . . . . . . . . . . 0010 - CP_DestP . . . . . . . . . . . 000C Word - CP_SourceP . . . . . . . . . . 000E Word -CVS_STACK . . . . . . . . . . . 000A - CVS_COLOR . . . . . . . . . . 0008 Byte -DB_STACK . . . . . . . . . . . . 0022 - DB_LineO . . . . . . . . . . . 0000 Word - DB_PixCount . . . . . . . . . 0002 Word - DB_Start . . . . . . . . . . . 0004 Word - DB_PixSkew . . . . . . . . . . 0006 Word - DB_SkewFlag . . . . . . . . . 0008 Word - DB_Height . . . . . . . . . . 0016 Word - DB_Width . . . . . . . . . . . 0018 Word - DB_Ypos . . . . . . . . . . . 001A Word - DB_Xpos . . . . . . . . . . . 001C Word - DB_Image . . . . . . . . . . . 001E DWord -DL_STACK . . . . . . . . . . . . 0014 - DL_ColorF . . . . . . . . . . 000A Byte - DL_Ypos2 . . . . . . . . . . . 000C Word - DL_Xpos2 . . . . . . . . . . . 000E Word - DL_Ypos1 . . . . . . . . . . . 0010 Word - DL_Xpos1 . . . . . . . . . . . 0012 Word -FB_STACK . . . . . . . . . . . . 0016 - FB_Color . . . . . . . . . . . 000C Byte - FB_Ypos2 . . . . . . . . . . . 000E Word - FB_Xpos2 . . . . . . . . . . . 0010 Word - FB_Ypos1 . . . . . . . . . . . 0012 Word - FB_Xpos1 . . . . . . . . . . . 0014 Word -GDR_STACK . . . . . . . . . . . 000E - GDR_Blue . . . . . . . . . . . 0006 Word - GDR_Green . . . . . . . . . . 0008 Word - GDR_Red . . . . . . . . . . . 000A Word - GDR_Register . . . . . . . . . 000C Byte -GPC_STACK . . . . . . . . . . . 001E - GPC_Width . . . . . . . . . . 0000 Word - GPC_Lines . . . . . . . . . . 0002 Byte - GPC_T_SETS . . . . . . . . . . 0004 Word - GPC_T_SETO . . . . . . . . . . 0006 Word - GPC_ColorB . . . . . . . . . . 0014 Byte - GPC_ColorF . . . . . . . . . . 0016 Byte - GPC_Ypos . . . . . . . . . . . 0018 Word - GPC_Xpos . . . . . . . . . . . 001A Word - GPC_Char . . . . . . . . . . . 001C Byte -LDR_STACK . . . . . . . . . . . 0014 - LDR_Sync . . . . . . . . . . . 000A Word - LDR_EndReg . . . . . . . . . . 000C Byte - LDR_StartReg . . . . . . . . . 000E Byte - LDR_PalData . . . . . . . . . 0010 DWord -Mode_Data_Table . . . . . . . . 000C - M_MiscR . . . . . . . . . . . 0000 Byte - M_Pages . . . . . . . . . . . 0001 Byte - M_XSize . . . . . . . . . . . 0002 Word - M_YSize . . . . . . . . . . . 0004 Word - M_XMax . . . . . . . . . . . . 0006 Word - M_YMax . . . . . . . . . . . . 0008 Word - M_CRTC . . . . . . . . . . . . 000A Word -PS_STACK . . . . . . . . . . . . 001A - PS_ColorB . . . . . . . . . . 000C Word - PS_ColorF . . . . . . . . . . 000E Word - PS_Ypos . . . . . . . . . . . 0010 Word - PS_Xpos . . . . . . . . . . . 0012 Word - PS_Len . . . . . . . . . . . . 0014 Word - PS_Text . . . . . . . . . . . 0016 Word -RDR_STACK . . . . . . . . . . . 0012 - RDR_EndReg . . . . . . . . . . 000A Byte - RDR_StartReg . . . . . . . . . 000C Byte - RDR_PalData . . . . . . . . . 000E DWord -RP_STACK . . . . . . . . . . . . 000C - RP_Ypos . . . . . . . . . . . 0008 Word - RP_Xpos . . . . . . . . . . . 000A Word -SAP_STACK . . . . . . . . . . . 0008 - SAP_Page . . . . . . . . . . . 0006 Word -SDF_STACK . . . . . . . . . . . 000C - SDF_Which . . . . . . . . . . 0006 Word - SDF_Font . . . . . . . . . . . 0008 DWord -SDP_STACK . . . . . . . . . . . 0008 - SDP_Page . . . . . . . . . . . 0006 Word -SDR_STACK . . . . . . . . . . . 000E - SDR_Blue . . . . . . . . . . . 0006 Byte - SDR_Green . . . . . . . . . . 0008 Byte - SDR_Red . . . . . . . . . . . 000A Byte - SDR_Register . . . . . . . . . 000C Byte -SM_STACK . . . . . . . . . . . . 000A - SM_Mode . . . . . . . . . . . 0008 Word -SP_STACK . . . . . . . . . . . . 000E - SETP_Color . . . . . . . . . . 0008 Byte - SETP_Ypos . . . . . . . . . . 000A Word - SETP_Xpos . . . . . . . . . . 000C Word -SVM_STACK . . . . . . . . . . . 0016 - SVM_Table . . . . . . . . . . 0000 Word - SVM_Pages . . . . . . . . . . 000E Word - SVM_Ysize . . . . . . . . . . 0010 Word - SVM_Xsize . . . . . . . . . . 0012 Word - SVM_Mode . . . . . . . . . . . 0014 Word -SW_STACK . . . . . . . . . . . . 000C - SW_Ypos . . . . . . . . . . . 0006 Word - SW_Xpos . . . . . . . . . . . 0008 Word - SW_Page . . . . . . . . . . . 000A Word -TB_STACK . . . . . . . . . . . . 0022 - TB_LineO . . . . . . . . . . . 0000 Word - TB_PixCount . . . . . . . . . 0002 Word - TB_Start . . . . . . . . . . . 0004 Word - TB_PixSkew . . . . . . . . . . 0006 Word - TB_SkewFlag . . . . . . . . . 0008 Word - TB_Height . . . . . . . . . . 0016 Word - TB_Width . . . . . . . . . . . 0018 Word - TB_Ypos . . . . . . . . . . . 001A Word - TB_Xpos . . . . . . . . . . . 001C Word - TB_Image . . . . . . . . . . . 001E DWord -TGP_STACK . . . . . . . . . . . 001C - TGP_Width . . . . . . . . . . 0000 Word - TGP_Lines . . . . . . . . . . 0002 Byte - TGP_T_SETS . . . . . . . . . . 0004 Word - TGP_T_SETO . . . . . . . . . . 0006 Word - TGP_ColorF . . . . . . . . . . 0014 Byte - TGP_Ypos . . . . . . . . . . . 0016 Word - TGP_Xpos . . . . . . . . . . . 0018 Word - TGP_Char . . . . . . . . . . . 001A Byte -TPS_STACK . . . . . . . . . . . 0018 - TPS_ColorF . . . . . . . . . . 000C Word - TPS_Ypos . . . . . . . . . . . 000E Word - TPS_Xpos . . . . . . . . . . . 0010 Word - TPS_Len . . . . . . . . . . . 0012 Word - TPS_Text . . . . . . . . . . . 0014 Word -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Symbols 18 - 1 - - - - -Segments and Groups: - - N a m e Size Length Align Combine Class - -DGROUP . . . . . . . . . . . . . GROUP -_DATA . . . . . . . . . . . . . 16 Bit 0000 Word Public 'DATA' -_BSS . . . . . . . . . . . . . . 16 Bit 002A Word Public 'BSS' -MODEX_TEXT . . . . . . . . . . . 16 Bit 0D88 Word Public 'CODE' -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Symbols 19 - 1 - - - - -Procedures, parameters and locals: - - N a m e Type Value Attr - -CLEAR_VGA_SCREEN . . . . . . . . P Far 0280 MODEX_TEXT Length= 0022 Public -COPY_BITMAP . . . . . . . . . . P Far 0C0E MODEX_TEXT Length= 017E Public -COPY_PAGE . . . . . . . . . . . P Far 0BBA MODEX_TEXT Length= 0054 Public -DRAW_BITMAP . . . . . . . . . . P Far 0A0F MODEX_TEXT Length= 00BC Public -DRAW_LINE . . . . . . . . . . . P Far 040B MODEX_TEXT Length= 02A7 Public -FILL_BLOCK . . . . . . . . . . . P Far 0300 MODEX_TEXT Length= 010B Public -GET_ACTIVE_PAGE . . . . . . . . P Far 06E5 MODEX_TEXT Length= 0004 Public -GET_DAC_REGISTER . . . . . . . . P Far 0641 MODEX_TEXT Length= 0025 Public -GET_DISPLAY_PAGE . . . . . . . . P Far 0724 MODEX_TEXT Length= 0004 Public -GET_X_OFFSET . . . . . . . . . . P Far 078D MODEX_TEXT Length= 0004 Public -GET_Y_OFFSET . . . . . . . . . . P Far 0791 MODEX_TEXT Length= 0004 Public -GPRINTC . . . . . . . . . . . . P Far 07A3 MODEX_TEXT Length= 00FE Public -LOAD_DAC_REGISTERS . . . . . . . P Far 0666 MODEX_TEXT Length= 0037 Public -PRINT_STR . . . . . . . . . . . P Far 0975 MODEX_TEXT Length= 0041 Public -READ_DAC_REGISTERS . . . . . . . P Far 069D MODEX_TEXT Length= 002B Public -READ_POINT . . . . . . . . . . . P Far 02D2 MODEX_TEXT Length= 002E Public -SET_ACTIVE_PAGE . . . . . . . . P Far 06C8 MODEX_TEXT Length= 001D Public -SET_DAC_REGISTER . . . . . . . . P Far 0624 MODEX_TEXT Length= 001D Public -SET_DISPLAY_FONT . . . . . . . . P Far 09F3 MODEX_TEXT Length= 001C Public -SET_DISPLAY_PAGE . . . . . . . . P Far 06E9 MODEX_TEXT Length= 003B Public -SET_MODEX . . . . . . . . . . . P Far 0251 MODEX_TEXT Length= 002F Public -SET_POINT . . . . . . . . . . . P Far 02A2 MODEX_TEXT Length= 0030 Public -SET_VGA_MODEX . . . . . . . . . P Far 0104 MODEX_TEXT Length= 014D Public -SET_WINDOW . . . . . . . . . . . P Far 0728 MODEX_TEXT Length= 0065 Public -SYNC_DISPLAY . . . . . . . . . . P Far 0795 MODEX_TEXT Length= 000E Public -TDRAW_BITMAP . . . . . . . . . . P Far 0ACB MODEX_TEXT Length= 00EF Public -TGPRINTC . . . . . . . . . . . . P Far 08A1 MODEX_TEXT Length= 00D4 Public -TPRINT_STR . . . . . . . . . . . P Far 09B6 MODEX_TEXT Length= 003D Public -Microsoft (R) Macro Assembler Version 6.11 07/02/14 15:18:33 -modex.asm Symbols 20 - 1 - - - - -Symbols: - - N a m e Type Value Attr - -?x3 . . . . . . . . . . . . . . Text ?,?,? -?x4 . . . . . . . . . . . . . . Text ?,?,?,? -@CB_Abort . . . . . . . . . . . L Near 0CA2 MODEX_TEXT -@CB_Check_Right . . . . . . . . L Near 0D10 MODEX_TEXT -@CB_Copy_Middle . . . . . . . . L Near 0D47 MODEX_TEXT -@CB_Exit . . . . . . . . . . . . L Near 0D7E MODEX_TEXT -@CB_Finish . . . . . . . . . . . L Near 0D77 MODEX_TEXT -@CB_Left_Band . . . . . . . . . L Near 0CE3 MODEX_TEXT -@CB_Left_Done . . . . . . . . . L Near 0D0B MODEX_TEXT -@CB_Left_Loop . . . . . . . . . L Near 0CF5 MODEX_TEXT -@CB_Middle_Copy . . . . . . . . L Near 0D61 MODEX_TEXT -@CB_One_Done . . . . . . . . . . L Near 0CE0 MODEX_TEXT -@CB_One_Loop . . . . . . . . . . L Near 0CCA MODEX_TEXT -@CB_Only_One_Band . . . . . . . L Near 0CA7 MODEX_TEXT -@CB_Right_Band . . . . . . . . . L Near 0D1B MODEX_TEXT -@CB_Right_Done . . . . . . . . . L Near 0D47 MODEX_TEXT -@CB_Right_Loop . . . . . . . . . L Near 0D31 MODEX_TEXT -@CP_Exit . . . . . . . . . . . . L Near 0C07 MODEX_TEXT -@CodeSize . . . . . . . . . . . Number 0001h -@DB_COPY2 . . . . . . . . . . . L Near 0A8A MODEX_TEXT -@DB_COPY_LINE . . . . . . . . . L Near 0A68 MODEX_TEXT -@DB_COPY_LOOP . . . . . . . . . L Near 0A70 MODEX_TEXT -@DB_COPY_PLANE . . . . . . . . . L Near 0A5F MODEX_TEXT -@DB_COPY_REMAINDER . . . . . . . L Near 0A88 MODEX_TEXT -@DB_Exit . . . . . . . . . . . . L Near 0AC1 MODEX_TEXT -@DB_NEXT2 . . . . . . . . . . . L Near 0A99 MODEX_TEXT -@DB_NEXT_LINE . . . . . . . . . L Near 0A91 MODEX_TEXT -@DL_BREZHAM . . . . . . . . . . L Near 04C7 MODEX_TEXT -@DL_DeltaYOK2 . . . . . . . . . L Near 0515 MODEX_TEXT -@DL_DeltaYOK . . . . . . . . . . L Near 04DC MODEX_TEXT -@DL_DrawLeft . . . . . . . . . . L Near 051F MODEX_TEXT -@DL_DrawRight . . . . . . . . . L Near 05A3 MODEX_TEXT -@DL_EXIT2 . . . . . . . . . . . L Near 061E MODEX_TEXT -@DL_EXIT . . . . . . . . . . . . L Near 04C4 MODEX_TEXT -@DL_HORZ . . . . . . . . . . . . L Near 0433 MODEX_TEXT -@DL_LONGLN . . . . . . . . . . . L Near 0461 MODEX_TEXT -@DL_NOSWAP1 . . . . . . . . . . L Near 0428 MODEX_TEXT -@DL_NOSWAP2 . . . . . . . . . . L Near 048C MODEX_TEXT -@DL_SLLExit . . . . . . . . . . L Near 0563 MODEX_TEXT -@DL_SLLL2nc . . . . . . . . . . L Near 0543 MODEX_TEXT -@DL_SLLL3nc . . . . . . . . . . L Near 0558 MODEX_TEXT -@DL_SLLLoop . . . . . . . . . . L Near 0537 MODEX_TEXT -@DL_SLR2nc . . . . . . . . . . . L Near 05C5 MODEX_TEXT -@DL_SLR3nc . . . . . . . . . . . L Near 05D9 MODEX_TEXT -@DL_SLRExit . . . . . . . . . . L Near 05E3 MODEX_TEXT -@DL_SLRLoop . . . . . . . . . . L Near 05B9 MODEX_TEXT -@DL_STLExit . . . . . . . . . . L Near 05A1 MODEX_TEXT -@DL_STLLoop . . . . . . . . . . L Near 0575 MODEX_TEXT -@DL_STLnc2 . . . . . . . . . . . L Near 0588 MODEX_TEXT -@DL_STLnc3 . . . . . . . . . . . L Near 059D MODEX_TEXT -@DL_ShallowLeft . . . . . . . . L Near 0525 MODEX_TEXT -@DL_ShallowRight . . . . . . . . L Near 05A7 MODEX_TEXT -@DL_SteepLeft . . . . . . . . . L Near 0566 MODEX_TEXT -@DL_SteepRight . . . . . . . . . L Near 05E5 MODEX_TEXT -@DL_VLINE . . . . . . . . . . . L Near 0481 MODEX_TEXT -@DL_VLoop . . . . . . . . . . . L Near 04B4 MODEX_TEXT -@DL_XRSEG . . . . . . . . . . . L Near 0479 MODEX_TEXT -@DP_WAIT0 . . . . . . . . . . . L Near 0706 MODEX_TEXT -@DP_WAIT1 . . . . . . . . . . . L Near 071B MODEX_TEXT -@DataSize . . . . . . . . . . . Number 0000h -@FB_EXIT . . . . . . . . . . . . L Near 0404 MODEX_TEXT -@FB_LEFT_CONT . . . . . . . . . L Near 037A MODEX_TEXT -@FB_LEFT_LOOP . . . . . . . . . L Near 036A MODEX_TEXT -@FB_L_PLANE_FLUSH . . . . . . . L Near 037C MODEX_TEXT -@FB_MIDDLE_LOOP . . . . . . . . L Near 03C7 MODEX_TEXT -@FB_NORMAL . . . . . . . . . . . L Near 034C MODEX_TEXT -@FB_NOSWAP1 . . . . . . . . . . L Near 031F MODEX_TEXT -@FB_NOSWAP2 . . . . . . . . . . L Near 0339 MODEX_TEXT -@FB_ONE_BAND_ONLY . . . . . . . L Near 03D2 MODEX_TEXT -@FB_ONE_LOOP . . . . . . . . . . L Near 03F4 MODEX_TEXT -@FB_RIGHT_CONT . . . . . . . . . L Near 03B0 MODEX_TEXT -@FB_RIGHT_LOOP . . . . . . . . . L Near 03A0 MODEX_TEXT -@FB_RIGHT . . . . . . . . . . . L Near 037D MODEX_TEXT -@FB_R_EDGE_FLUSH . . . . . . . . L Near 03B3 MODEX_TEXT -@GPC_DECODE_CHAR_BYTE . . . . . L Near 080F MODEX_TEXT -@GPC_EXIT . . . . . . . . . . . L Near 0897 MODEX_TEXT -@GPC_LowChar . . . . . . . . . . L Near 07DB MODEX_TEXT -@GPC_NEXT_LINE . . . . . . . . . L Near 0889 MODEX_TEXT -@GPC_NO_LEFT0BITS . . . . . . . L Near 083C MODEX_TEXT -@GPC_NO_LEFT1BITS . . . . . . . L Near 0831 MODEX_TEXT -@GPC_NO_MIDDLE0BITS . . . . . . L Near 085E MODEX_TEXT -@GPC_NO_MIDDLE1BITS . . . . . . L Near 0853 MODEX_TEXT -@GPC_NO_RIGHT0BITS . . . . . . . L Near 0888 MODEX_TEXT -@GPC_NO_RIGHT1BITS . . . . . . . L Near 087D MODEX_TEXT -@GPC_Set_Char . . . . . . . . . L Near 07E3 MODEX_TEXT -@Interface . . . . . . . . . . . Number 0000h -@LDR_Load . . . . . . . . . . . L Near 0677 MODEX_TEXT -@Model . . . . . . . . . . . . . Number 0004h -@PS_Exit . . . . . . . . . . . . L Near 09AF MODEX_TEXT -@PS_Print_It . . . . . . . . . . L Near 097B MODEX_TEXT -@SAP_Exit . . . . . . . . . . . L Near 06E1 MODEX_TEXT -@SDF_Set_Font . . . . . . . . . L Near 0A06 MODEX_TEXT -@SDP_Exit . . . . . . . . . . . L Near 0720 MODEX_TEXT -@SD_WAIT0 . . . . . . . . . . . L Near 0798 MODEX_TEXT -@SD_WAIT1 . . . . . . . . . . . L Near 079D MODEX_TEXT -@SMX_Exit . . . . . . . . . . . L Near 027B MODEX_TEXT -@STRLoop . . . . . . . . . . . . L Near 05F4 MODEX_TEXT -@STRnc2 . . . . . . . . . . . . L Near 0606 MODEX_TEXT -@STRnc3 . . . . . . . . . . . . L Near 061A MODEX_TEXT -@SVM_BadModeSetup . . . . . . . L Near 015C MODEX_TEXT -@SVM_Continue . . . . . . . . . L Near 0161 MODEX_TEXT -@SVM_EXIT . . . . . . . . . . . L Near 0247 MODEX_TEXT -@SVM_Set_Data . . . . . . . . . L Near 01AA MODEX_TEXT -@SVM_Set_Pages . . . . . . . . . L Near 0207 MODEX_TEXT -@SVM_Setup_CRTC . . . . . . . . L Near 019D MODEX_TEXT -@SVM_Setup_Table . . . . . . . . L Near 0193 MODEX_TEXT -@SW_Exit . . . . . . . . . . . . L Near 0789 MODEX_TEXT -@SW_WAIT0 . . . . . . . . . . . L Near 0761 MODEX_TEXT -@SW_WAIT1 . . . . . . . . . . . L Near 0776 MODEX_TEXT -@TB_COPY2 . . . . . . . . . . . L Near 0B6A MODEX_TEXT -@TB_COPY_LINE . . . . . . . . . L Near 0B26 MODEX_TEXT -@TB_COPY_LOOP . . . . . . . . . L Near 0B2E MODEX_TEXT -@TB_COPY_PLANE . . . . . . . . . L Near 0B1B MODEX_TEXT -@TB_COPY_REMAINDER . . . . . . . L Near 0B68 MODEX_TEXT -@TB_Exit . . . . . . . . . . . . L Near 0BB0 MODEX_TEXT -@TB_NEXT2 . . . . . . . . . . . L Near 0B87 MODEX_TEXT -@TB_NEXT_LINE . . . . . . . . . L Near 0B79 MODEX_TEXT -@TB_SKIP_01 . . . . . . . . . . L Near 0B39 MODEX_TEXT -@TB_SKIP_02 . . . . . . . . . . L Near 0B45 MODEX_TEXT -@TB_SKIP_03 . . . . . . . . . . L Near 0B51 MODEX_TEXT -@TB_SKIP_04 . . . . . . . . . . L Near 0B5D MODEX_TEXT -@TB_SKIP_05 . . . . . . . . . . L Near 0B75 MODEX_TEXT -@TGP_DECODE_CHAR_BYTE . . . . . L Near 090D MODEX_TEXT -@TGP_EXIT . . . . . . . . . . . L Near 096B MODEX_TEXT -@TGP_LowChar . . . . . . . . . . L Near 08D9 MODEX_TEXT -@TGP_NEXT_LINE . . . . . . . . . L Near 095E MODEX_TEXT -@TGP_NO_LEFT1BITS . . . . . . . L Near 092D MODEX_TEXT -@TGP_NO_MIDDLE1BITS . . . . . . L Near 0941 MODEX_TEXT -@TGP_NO_RIGHT1BITS . . . . . . . L Near 095D MODEX_TEXT -@TGP_Set_Char . . . . . . . . . L Near 08E1 MODEX_TEXT -@TPS_Exit . . . . . . . . . . . L Near 09EC MODEX_TEXT -@TPS_Print_It . . . . . . . . . L Near 09BC MODEX_TEXT -@code . . . . . . . . . . . . . Text MODEX_TEXT -@data . . . . . . . . . . . . . Text DGROUP -@fardata? . . . . . . . . . . . Text FAR_BSS -@fardata . . . . . . . . . . . . Text FAR_DATA -@stack . . . . . . . . . . . . . Text DGROUP -ACTIVE_PAGE . . . . . . . . . . Word 0012 _BSS -ALL_PLANES_ON . . . . . . . . . Number 0F02h -ALL_PLANES . . . . . . . . . . . Number 000Fh -ASYNC_RESET . . . . . . . . . . Number 0100h -ATTRIB_Ctrl . . . . . . . . . . Number 03C0h -CHAIN4_OFF . . . . . . . . . . . Number 0604h -CHARSET_HI . . . . . . . . . . . Word 0026 _BSS -CHARSET_LOW . . . . . . . . . . Word 0022 _BSS -CHAR_BITS . . . . . . . . . . . Number 000Fh -CRTC_Data . . . . . . . . . . . Number 03D5h -CRTC_Index . . . . . . . . . . . Number 03D4h -CURRENT_MOFFSET . . . . . . . . Word 001C _BSS -CURRENT_PAGE . . . . . . . . . . Word 0014 _BSS -CURRENT_SEGMENT . . . . . . . . Word 0016 _BSS -CURRENT_XOFFSET . . . . . . . . Word 0018 _BSS -CURRENT_YOFFSET . . . . . . . . Word 001A _BSS -Char_Plane_Data . . . . . . . . Byte 0008 MODEX_TEXT -DAC_READ_ADDR . . . . . . . . . Number 03C7h -DAC_WRITE_ADDR . . . . . . . . . Number 03C8h -DISPLAY_PAGE . . . . . . . . . . Word 0010 _BSS -False . . . . . . . . . . . . . Number 0000h -GC_Index . . . . . . . . . . . . Number 03CEh -GET_CHAR_PTR . . . . . . . . . . Number 1130h -INPUT_1 . . . . . . . . . . . . Number 03DAh -LAST_PAGE . . . . . . . . . . . Word 0004 _BSS -LATCHES_OFF . . . . . . . . . . Number FF08h -LATCHES_ON . . . . . . . . . . . Number 0008h -Left_Clip_Mask . . . . . . . . . Byte 0000 MODEX_TEXT -MAP_MASK_PLANE1 . . . . . . . . Number 0102h -MAP_MASK_PLANE2 . . . . . . . . Number 1102h -MAP_MASK . . . . . . . . . . . . Number 0002h -MAX_XOFFSET . . . . . . . . . . Word 001E _BSS -MAX_YOFFSET . . . . . . . . . . Word 0020 _BSS -MISC_OUTPUT . . . . . . . . . . Number 03C2h -MODE_200_Tall . . . . . . . . . L Near 0044 MODEX_TEXT -MODE_240_Tall . . . . . . . . . L Near 0054 MODEX_TEXT -MODE_320_Wide . . . . . . . . . L Near 0028 MODEX_TEXT -MODE_320x200 . . . . . . . . . . L Near 0074 MODEX_TEXT -MODE_320x240 . . . . . . . . . . L Near 00BC MODEX_TEXT -MODE_320x400 . . . . . . . . . . L Near 0086 MODEX_TEXT -MODE_320x480 . . . . . . . . . . L Near 00CE MODEX_TEXT -MODE_360_Wide . . . . . . . . . L Near 0036 MODEX_TEXT -MODE_360x200 . . . . . . . . . . L Near 00E0 MODEX_TEXT -MODE_360x240 . . . . . . . . . . L Near 0098 MODEX_TEXT -MODE_360x400 . . . . . . . . . . L Near 00F2 MODEX_TEXT -MODE_360x480 . . . . . . . . . . L Near 00AA MODEX_TEXT -MODE_400_Tall . . . . . . . . . L Near 0044 MODEX_TEXT -MODE_480_Tall . . . . . . . . . L Near 0054 MODEX_TEXT -MODE_Double_Line . . . . . . . . L Near 0020 MODEX_TEXT -MODE_Single_Line . . . . . . . . L Near 0018 MODEX_TEXT -MODE_TABLE . . . . . . . . . . . L Near 0064 MODEX_TEXT -NUM_MODES . . . . . . . . . . . Number 0008h -PAGE_ADDR . . . . . . . . . . . Word 0006 _BSS -PAGE_SIZE . . . . . . . . . . . Word 000E _BSS -PEL_DATA_REG . . . . . . . . . . Number 03C9h -PIXEL_PAN_REG . . . . . . . . . Number 0033h -PLANE_BITS . . . . . . . . . . . Number 0003h -READ_MAP . . . . . . . . . . . . Number 0004h -ROM_8x8_Hi . . . . . . . . . . . Number 0004h -ROM_8x8_Lo . . . . . . . . . . . Number 0003h -Right_Clip_Mask . . . . . . . . Byte 0004 MODEX_TEXT -SCREEN_HEIGHT . . . . . . . . . Word 0002 _BSS -SCREEN_WIDTH . . . . . . . . . . Word 0000 _BSS -SC_Data . . . . . . . . . . . . Number 03C5h -SC_Index . . . . . . . . . . . . Number 03C4h -SEQU_RESTART . . . . . . . . . . Number 0300h -START_DISP_HI . . . . . . . . . Number 000Ch -START_DISP_LO . . . . . . . . . Number 000Dh -True . . . . . . . . . . . . . . Number -0001h -VERT_RETRACE . . . . . . . . . . Number 0008h -VGA_Segment . . . . . . . . . . Number A000h -b . . . . . . . . . . . . . . . Text BYTE PTR -d . . . . . . . . . . . . . . . Text DWORD PTR -f . . . . . . . . . . . . . . . Text FAR PTR -nil . . . . . . . . . . . . . . Number 0000h -o . . . . . . . . . . . . . . . Text OFFSET -s . . . . . . . . . . . . . . . Text SHORT -w . . . . . . . . . . . . . . . Text WORD PTR - - 0 Warnings - 0 Errors diff --git a/modex105/MODEX.SBR b/modex105/MODEX.SBR deleted file mode 100755 index 4da653b0d38749807dfb8156d36fc9787e1da174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12235 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 diff --git a/modex105/PACKING.LST b/modex105/PACKING.LST deleted file mode 100755 index 88f817ca..00000000 --- a/modex105/PACKING.LST +++ /dev/null @@ -1,87 +0,0 @@ - -PACKING LIST FOR MODEX104 - -DIRECTORY: \ - The Mode X Library versoon 1.04 - -ASM BAT 26 05-14-93 6:00p - Batch File to Assemble MODEX.ASM -MODE-X TXT 2135 05-14-93 6:00p - File Describing MODE X Routines -MODEX ASM 117039 05-14-93 6:00p - Assembly source to Mode X Library -MODEX BI 3238 05-14-93 6:00p - Include File for BASIC/PDS -MODEX H 2943 05-14-93 6:00p - Include File for C/C++ -MODEX OBJ 5208 05-14-93 6:00p - The Mode X Library -README DOC 3259 05-14-93 6:00p - Information on this Product -PACKING LST 4767 05-14-93 6:00p - This File - -DIRECTORY: \DEMOS - Mode X Demos - -CHARDEMO EXE 13066 05-14-93 6:00p - Demo of Multiple Fonts & Color Cycling -TEST6 EXE 19990 05-14-93 6:00p - Main Mode X Demo -ROM_8X8 FNT 1024 05-14-93 6:00p - Font for CHARDEMO.EXE -SPACEAGE FNT 1024 05-14-93 6:00p - Font for CHARDEMO.EXE -SYSTEM FNT 1024 05-14-93 6:00p - Font for CHARDEMO.EXE - -DIRECTORY: \DEMOS\BASIC7 - Demo Sources for Microsoft BASIC 7.1 (PDS) - -MAKE-LIB BAT 166 05-14-93 6:00p - Batch File to make MODEX.LIB/.QLB -MODEX BI 3238 05-14-93 6:00p - Include File for MODE X Library -MODEX LIB 7189 05-14-93 6:00p - Mode X & Utility Libraries for QBX -MODEX OBJ 5208 05-14-93 6:00p - Mode X Library - Object File -MODEX QLB 11141 05-14-93 6:00p - Mode X & Utility Quick Library -TEST6 BAS 12733 05-14-93 6:00p - Main Demo Source Code (TEST6.EXE) -UASM-BC7 BAT 43 05-14-93 6:00p - Batch file to Make UTILS.OBJ for QBX -UTILS ASM 8506 05-14-93 6:00p - Basic Utilities - Assembler source -UTILS BI 2028 05-14-93 6:00p - Basic Utilities - Basic Includes -UTILS OBJ 681 05-14-93 6:00p - Basic Utilities - Object File -CHARDEMO BAS 3431 05-14-93 6:00p - Source to CHARDEMO.EXE - -DIRECTORY: \DEMOS\C - Demo Sources for Borland C/C++ - -C_UTILS ASM 8782 05-14-93 6:00p - C Utilities - Assembler source -C_UTILS H 2623 05-14-93 6:00p - C Utilities - C Includes -C_UTILS OBJ 648 05-14-93 6:00p - C Utilities - Object File -MODEX H 2943 05-14-93 6:00p - Mode X Library C Incldues -MODEX OBJ 5208 05-14-93 6:00p - Mode X Library -UTLS-ASM BAT 36 05-14-93 6:00p - Batch File to Make C_UTILS.OBJ -X-DEMO C 15085 05-14-93 6:00p - Source to Main Demo (TEST6) in C -X-DEMO EXE 41090 05-14-93 6:00p - C Version of Main Demo -X-DEMO PRJ 5188 05-14-93 6:00p - Borland C Project file - -DIRECTORY: \DEMOS\PASCAL - Demo Sources for Turbo Pascal - -TEST5 PAS 15873 05-14-93 6:00p - Source for a TP Version of TEST6.EXE - -DIRECTORY: \DEMOS\QB45 - Demo Sources for Microsoft QuickBASIC 4.5 - -MAKE-LIB BAT 164 05-14-93 6:00p - Batch File to make MODEX.LIB/.QLB -MODEX BI 3238 05-14-93 6:00p - Include File for MODE X Library -MODEX LIB 7189 05-14-93 6:00p - Mode X & Utility Libraries for QB45 -MODEX OBJ 5208 05-14-93 6:00p - Mode X Library - Object File -MODEX QLB 9739 05-14-93 6:00p - Mode X & Utility Quick Library/QB45 -TEST6A BAS 12743 05-14-93 6:00p - Main Demo Source Code (TEST6.EXE) -TEST6A EXE 40544 05-14-93 6:00p - QB45 Version of Main Demo -UASM-QB4 BAT 30 05-14-93 6:00p - Batch file to Make UTILS.OBJ for QB45 -UTILS ASM 8506 05-14-93 6:00p - Basic Utilities - Assembler source -UTILS BI 2028 05-14-93 6:00p - Basic Utilities - Basic Includes -UTILS OBJ 628 05-14-93 6:00p - Basic Utilities - Object File - -DIRECTORY: \FONTEDIT - Font Editor - -CSEDIT EXE 39242 05-14-93 6:00p - Font Editor Program -CSEDIT DOC 8629 05-14-93 6:00p - Font Editor Documentation -CHARSETS CS 2144 05-14-93 6:00p - Internal Fonts for Editor -MOUSEIMG CS 128 05-14-93 6:00p - Mouse Pointers for Editor -PALETTE CS 768 05-14-93 6:00p - Palette for Editor -INVERSE FNT 1024 05-14-93 6:00p - Sample Font -ROM_8X8 FNT 1024 05-14-93 6:00p - Sample Font -SPACEAGE FNT 1024 05-14-93 6:00p - Sample Font -SYSTEM FNT 1024 05-14-93 6:00p - Sample Font - -DIRECTORY: \PALEDIT - Palette Editor - -PALEDIT EXE 31954 05-14-93 6:00p - Palette Editor Program -PALEDIT DOC 6688 05-14-93 6:00p - Palette Editor Documentation -CHARSETS CS 2144 05-14-93 6:00p - Internal Fonts for Editor -MOUSEIMG CS 128 05-14-93 6:00p - Mouse Pointers for Editor -GAMECOLR PAL 768 05-14-93 6:00p - Sample Palette -PRIME PAL 768 05-14-93 6:00p - Sample Palette -RGB PAL 768 05-14-93 6:00p - Sample Palette diff --git a/modex105/PALEDIT/BAKAPI.PAL b/modex105/PALEDIT/BAKAPI.PAL deleted file mode 100755 index d4d4a6a097bb4a8dd05fbaf5509f700be81b1b52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmZvaK??#Q5Jta4k>xhchKAID9Tti}mO5<FW&Z!aN;@g250&@aJqhIT$P<r8S@Pz~ z(U+lldeyT0w|vaE*Xy-0##&26<2X9!LI@&qy<Vqjy5H|9rPu5A`F#HOm7x(jBY&Kk z6;Z+YM|G%dKg6iFsB_eJR4u$U&KhsphRXIsO8QK?B>g7U!dKIx>8Wj~Y(D_9fe^$) zq~HZ4*hm{H+YdxCl6aCpB84F2g+^&ZW&6Q7IXMYV&Q7Fo78k^wqz#qr2Y^>#10KL! z7#N1J;x<&aAB^Fh;lVH&<^r)9*zC9smF)*>d9b{<e6Y-g1KT~@f!k2oekf0GS&$N@ O36~3wM{KwGG5-LNPfSGs diff --git a/modex105/PALEDIT/CHARSETS.CS b/modex105/PALEDIT/CHARSETS.CS deleted file mode 100755 index 97fe608ff81e4b78105a52984687b21a8a166ff7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2144 zcmZuxJ!l+96n;6MS4UXnt-=-}41|Eng%sK1kQZ45l?FE{#|SwoHp$@#voXtha@dX{ zQYfmTCagt@!<7qF0>fazkYW)cg-{{Pq!F&fRpE+dlJCu4ehhhcyPv){@Bht-sFQSU z?`Ur=rF3mP9s`G~&wl*=$?EXx>WcWGqImeQw?g*Kn|B$j<8L9yRdu}o^5y<<<={3R zJ91BVemh_^&-b1i&-V^qIlB4L%_JF3?W2uH8ylZp>f!4Cv;EZ}DLZpBtEjiQ;#L-W z6c4L7u7<H29~~VbP7ubICqFxie|h!$JH0-|AKv;-WrCu#jLI}(bZLsZ)6{t$x2}z$ zPbya>5%mXAG#CsbTFza*OjM2!4p3-Wj(2t#=j~I%LJ8fw*LYP9bC>57Rj1{9ZA7Mt z6KS4Onx_vgng<kyv9}9j_{AaNfhr-&Q<vsALKksoLI^IQao&Mn$b`NUsTGyRoEcM6 zoW_s}oDUo@SPGzTn#LhAwOY@@rl11Y0G$a~*q^_QRS=*Z#Qx7CIU3jJ)1v|=P;q>8 z5ChN7E_A{E#u-DcG5iJBS|ct9q$P*ET4SFcHJ_hw-p<Vsn)UU+k7Bt_)0|Jw8$*Z! zX~|qU^l8Xk{^4Gq7@v>*IT;K*e|=JU&VGnr1~~8H#+(P@Jm%Ot$eFuBJd>w6;$lt( zZ_xR{Vt$gPB+U&6Ju11bu*7}I%|Ck}`V-5W(=w<`MO-ZROI!i+W5yLm>$%e<4W%p) z7`$kjGQ>J~AGk9ZCWI)&)d=%cYd-+8T!t)QpYs5Kexkq<E%5bY-fAMG!3v31*n!V6 z0N!WoZzgevn5)MEJ4WYcjxU-YK&MANh==vIw1hjCBul<1u4@!y@9~HpT)>ot2Z4Fs z`R41b%`e0!UwyeH{!fS&ZY*{lZ@m|a$Iauzf)<MQuti-9>uuYju0V`tBS9351aLIx zKoYE`puPCvqHV#G^>wrnw9VmR)6&9HxV5`0DPT3nNkt;8{TC0{5AmfyPur=6UpQ=s zxYo!wnILk%u4}5ni%GGJ-#Ow4ghL)og!7>;E{stKtVwWvI2Xw*@hE4KQLFRa)0hVH z{}+J}BY08(?-3mP)Jab%MT$7DR|L0b_`tuYN6S;-uczYEpKvZ!rX<m|48{<kQW;QX z8LRqKXEpSF$}H4fe5n~NC|%>1M!Z2JyuC%E7IvA=GDa(`>QD+soN|ACXgvqk-8t6F z`g+b`2YrteKAa~bA0JsVwj+xV5RCQLr_l%|@VE1Ph*N`Wpk_V#vYyv-u06L(E9KAY zn$Pj}eir>RM^&{1s#<$J!mwX3n@lF#&_nC>86X2k^*$bR_5;^75OWrqIpVS%j_3Kj zU$BjM*bnsZ?9kg;v}e&js#Nd~5GEQhM;P#a24hIyzo+2B|8<?FFJ7EN4=>*@NyU3c zKhoDl(t4iF`zI7CEZbYo-&2HyY)=?K#(E3@obyW5K^Oq{Pa2IdqU?;31F1O*Ao42S zpH^MH76I4}Zg!5~0c~&l{;AHgn)NV{g3yP^a9{fpdzW07LSf8BB*6Q(VGO|>EaR=u c@7}+=v9)<$+}Yd`AAF4Uy(KWY!FGSkU-|#d0ssI2 diff --git a/modex105/PALEDIT/DIAGONAL.PAL b/modex105/PALEDIT/DIAGONAL.PAL deleted file mode 100755 index 5dee1969fc3e9dfe5bee855460c512ba3a850e69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmWO4fugA}007W2rBcR}O4&6{OBqvI%Gm$^)qCd~4gg>dt%dE`E^_?PL#dC+Ix03v zg)<S7c29?d=>s=;JrU8Lq&#;GQ)M~QO6RqSZwB9WAV;TF@YMk&t+()|8fhN>SZXNw zlH!w9V<LvA?eWkd{q)VlorK*tP+md9L3x3+uyg9he?C5<Aj3`?!8id?X6=Z#r3kSw z;OVL+t|*qWvN{1(I~xa}_1u_+nQYxVqx4kccja2rjmU8whaB%&kWlA9V4eYzSf|K4 zW5iHc`f25o+AeOex&t9W+rr^xYvr1^KTW9DSpK5MB;_}wACiwW9vJR<(ACaUz=s5) zvl``HN5pk_F==54)y3af9hJzsHkCsxbX1!ipSG+=R0gD3Wu=?YWt3Yuh6vC60JzTF zh6@O6U^&3^AoA^S?WP-_U{r*-+D9Tu+Cw(vL=$RGY&!Fv)v^>#CCj>_H<jPVSZdsw z;AI@8;d=y=vUKPDBr+oW*6D|nkre~2dLp{4eI~;r(gK?XO;^9?uDsYy0ZR(#AIOg| z&TO2zLF_vbf;$Yhk%ba3$k2*}E=`w=SiFFBH4_5JcHRvOrR~u;dh$%~8@blaW-PIy zVVCb^oCtiVgPc2r!4m~%VzJCC6I4ZEjnf+<cfXKs)!O0(TLp$U&=WM;o_=m`eECJq z2bW{?KVsfzaYyiz1`p;44x1WWg~g?J=}@6UI;MY`98Hm#D%Bz$+ei(&PH&|_VhZYh R#ih%dB`qyNVV2L5_#e4jUwr@o diff --git a/modex105/PALEDIT/GAMECOLR.PAL b/modex105/PALEDIT/GAMECOLR.PAL deleted file mode 100755 index 621b1e5e0e8a6bdd054160a76df79c41ed16cb60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmbV};i}>=5QV=V{ZZuhLc}5w0$MS6i*`%&nsp;R@Bdai@dcK<Nl5~8W_rFEur=Cd z9P43MU!Q$lvfWGdcwhE3^=h^H{QO+6*QW5^hY${j!|8N7pU;=eWuE8z{ho6!rI_9l zN<(f*9h1X~N6!!l13uD^xQQ;&W|{)R!3MUlg8+LtLafHP!VEWfz!P3oUcW+<X%pRq z8|fo{AOr?aG!)0wky>(N!vFYzrI<7GXD-dFIX2(s-WZI;c#O)}jL<l1dwxb>4N_^8 zTcu8u)7UF|4Pgnx;^Wefi<_1%Ep1+!vLNT!Y}jtu?JDGc&+$l%HZrbP=9$}#$AjmS z*Na+Q6g63GQa8zs>ZAOi5HxtjUZd00DYeRtim4rL!)D8N$Ihm-XMf}viC>HtuD_TQ zw{IT5c@|#g$5NW2HtQqFP3lMas4(adbn^P@b#;~O(dtj5s{bLtd&Hga3vnS?g@jJX YqmSBdQG+6i^ro%x_>On~3fi#v3oGhTWdHyG diff --git a/modex105/PALEDIT/MOUSEIMG.CS b/modex105/PALEDIT/MOUSEIMG.CS deleted file mode 100755 index 101e2084b44a2da8647ea004e20ffc599897dc29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmXwwyA6Xt5JVqBG8vc(jsUrhb3`33!65-+x3nvTG6*aUE5LfeXnx8{>eQ%KC5%j> xL+EL<?e+uSeE2f6uwrh-LMI;70g|>0E7_Ch82ppy6n|(>dLPTn2m0He)d4^WFp&TN diff --git a/modex105/PALEDIT/PALEDIT.DOC b/modex105/PALEDIT/PALEDIT.DOC deleted file mode 100755 index 61d0b2ee..00000000 --- a/modex105/PALEDIT/PALEDIT.DOC +++ /dev/null @@ -1,166 +0,0 @@ - -PALEDIT - A Simple VGA 256 Color Palette Editor - - -PALEDIT is distributed with MODEXnnn.ZIP, the general purpose MODE X -Library for VGA Graphics. - -WHAT YOU NEED TO RUN PALEDIT: - - * A Vga Monitor - * A Microsoft Compatible Mouse - - A Mouse is most definitely required, as the keyboard is used for - nothing except entering file names. - -FILES NEEDED IN THE CURRENT DIRECTORY: - - PALEDIT.EXE - The Palette Editor Program - CHARSETS.CS - The Palette Editor's Internal Fonts - MOUSEIMG.CS - The Palette Editor's Mouse Pointer - -SAMPLE PALETTE FILE THAT SHOULD BE INCLUDED: - - RGB.PAL - A Simple Palette with Reds, Greens, and Blues - PRIME.PAL - A Simple Palette - GAMECOLR.PAL - A Bright Palette from a Game of mine. - -WHAT IT EDITS: - - The VGA DAC Registers, all 256 of them. - -HOW IT WORKS/FEATURES: - - PALEDIT allows the user to see the entire VGA Palette of 256 colors - and select and modify the RED, GREEN, and BLUE values of any individual - color (DAC) register. The entire group of 256 colors can be saved to - a disk file for later retrieval. - - Individual "SLIDERS" show the current RED, GREEN, and BLUE color - components of the current color and allow them to be changed. - - The Following operations can be performed. - - * Raise, Lower, and set the RED, GREEN, or BLUE components. - * Copy the current RGB values to another Color (DAC) Register - * Brighten the selected color - * Darken and selected color - * Reset the selected color to its original state - * Blend an entire range of colors, creating a smooth - Transition from one color to another - * Optionally Lock out the first 16 colors to prevent - Accidental Modification - -DESCRIPTION OF OBJECTS/FEATURES FROM THE TOP DOWN: - - COLOR SLIDERS: In the upper left of the screen there are - Three Rectangular Boxes: One for each primary color: - RED, GREEN, and BLUE. Each Box has an arrow at each - end, and a scale bar in the middle, connecting the two - arrows. The scale bar is much like a thermometer, - indicating how much of that color is in the selected - color. To the right of each Box, the name of the color - is indicated, along with the content color in the form - of a number from 0 to 63; where 0 means none of that - color goes into making the selected color, and 63 means - that the selected color is saturated with that color. - - Clicking the mouse on the slider's left arrow box will - decrease the amount of that primary color in the selected - color. Holding the mouse button down will reduce the - color value all the way to 0. - - Clicking the mouse on the slider's right arrow box will - increase the amount of that primary color in the selected - color. Holding the mouse button down will increase the - color value all the way to 63. - - Clicking the mouse on the scale bar will set the amount - of that primary color to the value the represents that - position on the slider. - - LOCK Button: Clicking the button toggles the lockout of the - first 16 colors. When they are locked out, they can not - be modified, and when selected the word "LOCKED" will - appear below the color # on the Color Information Display. - - LOAD Button: Clicking this button will load the Palette file - that is named in the Palette File name box. If no name is - given or no such file exists, then nothing will be loaded. - - SAVE Button: Clicking this button will save the current Palette - in a file using the name given in the Palette File Name Box. - If a Valid name is not provided, nothing will be saved. - - QUIT Button: Clicking this button will return you to DOS. - Nothing is saved, and no confirmation is given. - - - Color Information Display: This Box is on the left side of the - Screen, below the Color Sliders. It shows the number of the - currently selected color (from 0 to 255) and indicates if - that color is locked. To the right of this box is a big - square showing the current color. - - LIGHTER Button: Clicking this button will make the selected - color brighter. - - DARKER Button: Clicking this button will make the selected - color darker. - - RESET Button: Clicking this button will restore the selected - color to the value it had when it was first selected. - - BLEND Button: Clicking this button will let you Blend a range - of colors together. One end of the range of colors is the - currently selected color. After Clicking the BLEND button. - You must click on the color at the other end of the range - in the Palette Display Box. All of the colors in between - those two colors will be changed to represent a gradual - transition from the color at one end to the color at the - other end. - - PALETTE FILE NAME BOX: This Text Box is used to enter the name - of a Palette file to load or the name to save the current - Palette as. Just click on the Box, and it will change color - and a flashing cursor will appear. Now you type in a filename - or edit the existing filename. Press <RETURN> or click - outside the text box to end editing. - - PALETTE DISPLAY BOX: This Box shows all 256 colors in an array - of 32 by 8 color blocks. The Currently Selected Color will - have a Box around it. Clicking on a color with the Left - Mouse button will make that color the new currently selected - color. Clicking on a color with the Right Mouse Button will - copy the color value from the old selected color to it, before - it is made the new selected color. - - Message Bar: At the very bottom of the screen, this Bar will display - information and messages for various functions. - -PALETTE FILE FORMAT: - - BINARY image, in order of VGA DAC (Color) Number. 3 Bytes Per - Color, 256 Colors. 768 Bytes total. The Files will be exactly - 768 bytes in size. - - COLOR: - RED: 1 BYTE - GREEN: 1 BYTE - BLUE: 1 BYTE - - PALETTE: Array (0 to 255) of COLOR - -COMMENTS, QUESTIONS, BUG REPORTS, etc: - - Send the to the Author: Matt Pritchard - - Through the 80xxx Fidonet Echo or - - Matt Pritchard - P.O. Box 140264 - Irving, TX 75014 - -CREDITS: - - This Palette Editor was written in QuickBASIC 4.5 diff --git a/modex105/PALEDIT/PALEDIT.EXE b/modex105/PALEDIT/PALEDIT.EXE deleted file mode 100755 index f69e172d05b32a8aa903c3857db0b199c84a91de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70230 zcmeFadw5huwl`eed-v`p-RX27go`nW2oVT36AX|$kP9N0Ccz{S2#(`8j>GXdNq2A@ zgkT(!&PG)5I8Kh^Aw)eML?`29oJQtoNMpjqO9CDzTn;h>o!vAl0_Fx}f4^0`yOSU| z-#pLz$NPNGN2uMkt5&UAwQAL>RjaDH7q2W}HH@)Xrqija8eW08jaAyB@u@@j|Ns4e zn*;Z+wa;CYoptx}SjO_qj|t6^*4`Oxfk3e~|2t3BSJ)Dp>~15oyJv`Yw@znwM+x@Y zuR<1!l&(X1CIY1|^ryE<%TcuUM?h0M&&F6~`c=K^5WLZ>RoW~F%)J?aV`nkERturb zUG0B$w@G$)4PIUdTP*U(M*!lH_eLxhy<>HIL{@uS=weYWA6}Wt+>AY;TTq!AyN9t2 zy1UH>Za?T0yarag5Fl!~1yHgmceI~wKfS4`TyJ-kT;{0d@(@aQhp_HPF3UZx-%ZiU z<tEv(sTGmGR<`P0q4EYv4wa8rHjDB_7ZBNGi+r@wBgvOsVRE@uwp2EoC<nEu<soXh zsnC^kv9>RTF^-(7Y(H)2QR_>PV3Ngwg!>rE)H-d8{b}{3fUv1EfmNMZSHcYas=e+$ zw!mIj$^@x|(Tf4xuU#3s(^|h(s7&7~Ffh~K%-V+|7K?|h%zHNj7yQf#A#^5sNb1bW z7CmA)l0jth1uZ7=n1=CLq3&6sew$FYP0(;j%$q6%aJ5R$3r6(Q3qly4FA5@_wStAY zpBL=z7Z6@Vs705lY3Qj7=)afz{nsk(5Oj=Q-8+zU(SUr)qn@n&0;;Bdr%<<3sDDLB zk;V$^1@E2AonW-PUkjGsh1%%Vy(>_j@_6|k>rSipNBX)xef@4BUV26NZDMnLbDEBA z5WFT<%d^MmTcx)+@eQ2#w?R&;)F=#N?ze!n0pV?gM&Kmk>vn^XSA>m%*UV%@s-)dS zoSL*-aO(jlB1nLBgzdD}>4jPwJ8u5yuIP7!kJ9R-;Oo2eDh6NQ!>gL~$`4{_9*Uu5 zD27Ay`U=_zYCaY|x=RB1%(!>_H6-_fgf@U61CTT0-V^FR9-Q~7mItIW<KDe4uLF6t zSExC!2n*^@3gAGd_jv|XXw*yzXtm}c0qvM60oPs8)FLFHoiimMxGS1k94NBV2#mi0 zV`|6aQGbf)<wdW{I87NG#dR5Hz;6drlTP9DG?-mT)HzsYy@RDlC#iGpQ(Gly6BW(O zwAVg6d@*!ViP2vB2~>vNeHLX%d9+Fj2_IhF3X-_+Q65(#lbE{{f_5$l`!xv~Ufo{@ zU@4DaTcrzJf-VXw>b(r@*eZ45>AnEyiwKtyx&TZPqzxa&yiX4riZ*$JMK-uZc|(Y7 zz)(c2+zQ==5qz7b8ssIm%6+2zE#*kiOY|zyt2Ye*fYkwZDxwx-ZZHXk1%peFCfgtd z618$eRD*?i*9PgSjers%wcQMrodK2IiceB5mvuX>TRQ5WgmN;~J_zMh{}hjso~qxB z9zjmhQvfz0pfJ}gyySlyc3NxWfL3e1$h@b91++)4a~jz4)*Zw)J532xeXG=`Hz8rH zU}HqeK483_6t^CUG_`~yJdH3NwC)Wk!5%2Vp214cZ3RdTLIS|v!zVQ<(zMg+4#SI# za3?a}$0x|=8Hr8aV$|+k$e!IZjCFerHU?GgmRR?+a%R}V>hEK+wS>)GmT4!QjAEpQ z4frT$nl7iOAUXWJ^9yNO4BPN~fMnK}vos^y@Vh;+3`**^-Mw=2pn8y`>5rL7HGv`X z(M;=BBL>wrqc(UjPb5M66BU*FhAlHlpdPK^)Psdw6PL3QVB}R2NFDP!bk9=z)TDCe z{x41`T7}m>LF2_3!d8wpQ6mh*8Ddjr2-x)EO|!tGmEe({p$+v9vpu6(yw$;$2@)D< zUj{_+(!(4XuZNI<6^7puzK59*tS$gm*C!A&d94ASg|Q9);TAyfRSaqOFitrlqqQbb zoB7n&k6!N|((76o1IY^7MvW2?{f!p21j;e7GM$NorcA0!0M{^i1?qbJy1MizqaR$R z67V6FX!K~X0*xSU^a*vMm{~81X##_0da~dB0@R8m22@apI10UE5oyk}ikLHz<qkox zAXowR%X#QHf+tnuei?;r!NL)|aHL3+?`ScEQI<ObArfJ9pfJJn!mp$7*kIvkUN{!T zTBUI!COl-hqY+{e#svx!JTKgU!sCO5CyG%hHkp$>1@%*wdm_SQgeif-1RpFsEm$~# z7oN$<PNKrdawj0nL`Vu0Cir0C*}=l8yl^@vJCh0{%bkjlj*uBBOz^z$J0N>ruyBsJ z9b_*MN!KhCq5P5M&Oum!un=G;iQ5Fv3%8;0qF`Y=FP6uj%SAJzEVmsY4`F$rFu_yd zR_T65tbKr`;`uOJh38uKI0o$f2oEDXfUuSYHEZ4dWY0Z}hirX-1|T2Fe6UasmB9lA zNZ5nPb!#!i0tJGD<^d!Q6bK}{zeIZqg6&x;+CbAPu>{W&Fr!tvkN61y_ez9S2qg&j zp}<pFU<;M>w~Y7u1H8<Gh`TQU@k2qxYsE+)dqfPy^HCDZ`+?>Gga;7-=3a~N2*RT% z@-9?9FRP(06%8om;Hb+HcV7kS$AYNWi?PVwz)@F-5+-S&aUhf<0L;A}VFN-%05z4> zP(KOyR_Q5@dNY+Zne6WBAnGlg>a8N#u+LJXo&=hw5H=$K%)JF+E5fq@)KpeOy^YKA z^BnaH#KZ`oeldvpB~JCr9Q6)r)Ha}b9^nN9fVp2nco|_w05z4>Q129J9(;wPehqPV zEKt85M7>)ahwQg_hcpn?JAvjEgx3%N=H89)7D7V+HI>y+zs-?0^5;8vx+ep*JBa!( z9QAvgYfYft{Wj1vBD{kDF!x^&-a}{#pr*1K>Sj?7vi5V-Er`2k0`-9)>JK^Uk9pJD z2z4{i>_=!p0GRtjgpU#00;s91hWdyo0QILF^=F8?(}B7pi25W)eTwUc)6}RVK=UcW zX9xgupF}u?a5{jR$`We#0w6jQMD!)6P7%XV+d1k}WVydYP!P@mjB93s*XTMAp>+4_ z?e6nPx-XGomian}>>?Mg%N$u37nUAUxd3oqM7WI5h0ueLhvEIj9MVvIyp31I*AVX) zH{!_*596sfpy&onO??2riqMb140gBPV6VL&Yp7O9#4Oh;Nd~lEM23Wb0=0jI=ce9d zs7yB*2G4aX(eMzI)vRJGCSQ7WTam=AV#?DRX#;k*4X^)}MAg`ts&c!IH<dtw_U!~~ z(7+>u4l}?0hn7fItPln*k%rUjz!E7EukHolXfXop2KTSH&7$WfsT&52`yqrG2>*%@ zuvMu}zxDq(n93an6bY=Wr^d4G4p?-p(s08=ct*h9X_X?ekah#i4a3Sk9Bha{h(wb~ z3D%9p0<ceynS3F94q)48WN2)QGFVVL+E9vTENA~X!UO<!6hbsYEW$WHCSH;_=FP=I z8JNZgF-_!{CUZ<vfTLBKMwkHLo`^6RVG6>u046HQdCx6ujoVm!YU`etO@Va}Odxyh zyl`3q%?Q>t(?AZFBu?*aw4buvGZB&yW&?~%Il)s6Y7+Y72k<5b@uqXUnVkB0gcn)v zbc9TVc>%lxui?e&_y_Q21@SK6co!OIYF$Klk>y^1un=KU058E4UKnWH?23kUgWenk z3r;V<=K@R69fLsjAFXN#E(7j`Xr|@+fyqqda5RHza8Nktd_TVFz$XUq%>r!5AUHoh zo=^Ay%<&Q206u9jzFgpw0{E5!4tB1;UMWBy&nJ8U=J*IMfKOXv(Q=(+Uro|ui7X<3 zyL^>wg7oUiZ{yJ2T^E8EQNaA`&@D8#*IDo?`SZ+&xR;FPOIk<QrkROH3jun$GJO%# z!Gm@PT4WIu5z~Rqi<lk@(AB!S1ZKFP2G%XFn1(F%ml$O0OtxvCLzVXhK(L${><zFR z1}~hJ80zy3G~Q6l<0@Ym{vTZ{sY!W^FMI0p4E23_;Ql|o2;&`6m(C{WS(=_!*iJBB z(;;B|M%}{O+iyRD*2OaJWVvClX?@`Rb6;ipOcvqyXCj&hbbgN}c%RIBK|svjKcJ<O zG(VU7btstS!9i4n;ZCpaA|!DQPkCI0w9J8T!rEWAgw?M!z*h!*v*DZ7hS4;pTJ_|X zfwrD0eQ1Jbhx9hjhEvT#ZlSh7s@HL)GJU0iDAF*{fB*&vU;x9X0a!l%p73Mn2&8%w zI0lle$&8j%5H3ZfRTX)9^aA)coYfDw*@zZzKiIU=VD{Il4OgODq*^hL`01t@r7|7a zL+GYd?_W5E&>)5Y-2)gn-2n_4L+Iuh9_JV=H>O+k(>-){^XBj}BmK2%YJupMh;B@W ze!6L5tV~Dt5V|SVD{>5@f*1mH4`ASQ2QUn!n`3D1CEi8em~P2W_kbUhm)Y9u{T$u2 zgpmj8ZC%|WR=>(X;!|R9pM=!i7nHgO$Qr?``+<PeQ65QMtMs73Z#+GSB+YnwC|Gc< zfv+bFWQje>XOvPtUpX*Ox&h{1i|`1-qX?x44iqI5%DoCNC3snim-=#Ota1bGG2976 zk8z}rbENB0J607mosa?d7)m{kupVIpO8+qisE|>+m^_KKcK!_GUPVgfb_JEAsn&$~ z_4X!6<`iCJAaQ}cHk!}9k3**iOc9P%Gao7f9H>Bz8V8<4Ov~KNiLK_u)^HANAsY|? z?#&3*2sH>>5CZ0-J8Bq~D?tp~i1~PRZ$lCv@{~u+_r~^Vqusp{DdKE!>UnVLc>_Z$ zG?}8FPl0|}X`rzf2VT8E=w1Lk*@3lZVeP{4PqyKU{xq+ti{MEp2)>r!YXk60XAt~L z1piV1zT-QBHv#@<WM$n2U)xwA%|;3ctc*otUIwVfj-8~x@ao=)B;FXx<Bgew^#EXB z3BtZ^!0H39?$-mbl*eIz^4)-<^lvQe3YL3|>cFe}tw1@-qjK8L!MPryR|0uIXLTk4 zY6uf*y(nNFt(SyB&VO#%4jt^*8M^KgP}~r#xsl`$ukOY`&6LL}zKt{0fJ*apeqBqt zIIZ^QaHXS@5=jFiVW#zwVSeR|gi^!@z)JmUmQuO;4j`i8JOmLE{D>$kfG7wy1d$(t zv_EOtp@@*+M?_fxL_x42i2M-L2<bY<Kc6@V*Yz1(GZVGfXGns(9K3xe$lG^G=J4u% zH^5uU<GlR<rp-!&2;Qa>Z#fsM2l0rer2#IkyMD4lCQ)GJMf}|0MJUeMI;4mnf?A^$ z@wb~7q4@WU_#tl0nY0YDOUYn^B}-C3n6GDt2=6EiNk1TB1V~h04=4dp3<4s?+*`oM zzXbW%L^6t3cT<3ml*jq_#3kaR5q!iJ!|i&Q6YqaVnu_O=y5^DKI`J{GiUM1bvbeyG z{SW$(b3!lz<qNW9?lOwgb|jC}o+UTh_$Dgtgz^#;87Nb^Pd}&>f1_<qUQVkTJD7)q zRkupb5DdSW3k`^&v<a+iHmE9@y()|@CpMAE%muZu;cnNqkqfv@a#MqM|35Z(TZS0C z`wjI647?W)@Tx&dplT3^s$sWN)nKl`yi3%&1BM_Y9}KpJ?*eIdbYOQGJ3s>o_p!P> zR)5IQDt&0MYWqv|9~;ziD_`>7$Ls~}j}3OUTyh^m4}XXri;4wz_$G1)^FCvQEyjDS zRcZs<cy;wh4A_TC5g}U!CX4))??qWt46yr1Fx$|ix+DJfF5p|*!?9z2ta4wUys!RK zgAiTHX!qPx{~2)EX!qT4O|9=RRC+>?c-&Bz$?8vn>P&bYp7nQD4!YxVt8@x<sO1rS zX&;~?mQv8?+O&Hb&EV56A_Pfse7esD(lL9x75_^BRsDHX_w^v$^%tm_vX~;BH^2fD z*#dynUBDvcJT+5bc;);MP|Ob`!RGzi;8W_f6h8V?D^k8zehu^&4cPwCFd%Cz5nXrQ zkjb~UwB>s3uW5trqM_~-n1|`C{<5L=4u*~XE<;_HVS>oaO%MoT@ns@436SRv@u*Yl za-47wL~O?K^8-V6{naF3`bfaGoVLKzB)@~zeG1wWNS?61sQZk+V7c-HUnh3pb*4Yh ze5md?e+}gF#mq2J(gSnG`!Qq#rz;2-nnuZehI^QIy1<hKsT5{>0t4T)ti{Y5A?z_x zA(;B{B3b%Z4Pcv2x(bWrDjcVbt=BD}9<ZcXuNqM61}vf4>aK!_^9KL;IFuq?psaz_ zl|<d*P42HuCvg$He?kn7e#C~cx_PX=&*1%ceO(r-?=hs^LKeqJM&?sMOj>~(YOL=X zb`%Y?F0e4=uuyl>P@l=Xzl2@XV=w{NGdhZq1s{uD<snkW<uWKt-Uf~-7OkP9DJb-~ z#%em8g5r@NugCBst+9dZjX|YjV3lC+X$Why9ebl{Qjekb9!Ln67<=tGm?(aE0<LM` zCWa+qfg=xz*GTM1()o6HpphyX=^X{aFq8m2fkh*Swq5~AyQ~88?XH~59KW1%nK-Ik z^$&&%WRe6bIC8Zz9SlRt7)GV325sj(Fb2KL_|Qx`Z@6x70u-djQ&qL`+*<Ar3{R9D zAlgmILvgwXk85hnJs{%(7a6X)K@pe?)$Kn46rgte)d6OWBC>*pdXU<+SOA~rrmQwP zFBkx$kr#wn;2*c&EBz0e^bZ<hMMIv%@~Y2}2YzCWq{Ck7DMS4!gZJk=c`1@1#1{<I zA4NPVmnZp!Hk&8i16dlx1&nI{1ZKnv69r>9)M5=v?(lO&6Uy5U^G;qsBg{YGG@k{^ z5}!M<?Cdk--=r+}BmFz$r9oFDu_>?;3NlY)FiFfmV6gf_A`|SCAu{vB4E9dw^ZsWa zXwpU~$==t7dc6c4J}{T@S6Pgg^isVj5peMEgTLHn?bHIDfPlIZBpiZ(^9@*r)A_0) zinn&FNWL`esz4<s!QUti(b5}i>Rp58Z(tC}7&2hd2Nh1H5BVXvTgju%$TsG^Q-`kd z&&bu-PlM-QO2n=)PFhuy)0eSrs1iBga13+rfGKB^{L>*t_z60S@a0YQbi!bfMliPp zY5p^KjJBb+aO7Lr2Z&p#3hUr1a8i$vw>kjzD;%z}5tMBx)C|nu+APjp_6cxc&O}H; zn2nH(kcyCwK&J-hA!H%sAS^&wh_DD@2^P}NSol$u+9ZBvWVnP?=5Wxg?M^IUuv6yq zoZv=9&|G@fuxAFV{WlzpYt6Y##)HH~z}y5){xbvYVp__Soaf6G@^qCbJjzqg4n$86 zL{APxJ8+`QkI;VxtmFdE{nX^$E<TIAkM7F(l%L_aex47&w{du!{J1LzQN9|$5L>5P z0Mh<~Wl2t(j9LQerMd-X5BED*15P+1*qbQ=yorMk07DZXb^rH}Al>Xi&Vifee0bBG zw(sSDB;fi~OCQ>V+naek9p5Vxpy1?9b57ql=LSvBCdb)X4(@L{q`#85qfp|f{zP>5 zP?m)XWcgyo^UqD^huLc_m|nsCGTj2?;ZP`YT_qp;0WJ;zl!JpgAK!o&x87fGi6$^T z*U@!rU^$-y*$Q+juz}FCoLF-I4eoGo>h>FT_)@Bfgfs`@7+6CNZQvAup!qW&JdK4P z7wtnNYdNP80wRUADlc>ube6P0kj%t57NWfYumu6dZd}75wB~wrcMt**2zb@k*TaVu z3G6de^ix#B#~6=k95YeTL1Lr{F)f#ejsz}3yaz^7jl6w)6mwkK7_|(>1*zx;BxQqU zoM5C)3-YHR1BcqQp~}<!;}!d8{%tf{h$b3<9Im0@#qTPCaCvv$s4R(<wgngYLuDT% z(t|wt72!UOa8s_WAo!>NbN&5#lg^n+*oecx#$y9C<Mjeh3Km^{#T^?03r-sl+~yf@ zadMdmQ0eD&4mvTwy>UbpbwCa}AdrY@B<C^?qT!fF&Sh1FC8?=oJ@eXv)0lf=2=-l} z$oYzmBL70`ozYTd`e=z}F}V3=`$04_aBKjWB78oh2+e1NhX$-$Rj~sL{&yLXNC`Uj z+dO-%QP5uBixLt~2&+Q2X6dDTI>ui67}Ik0+HbvKy1h1S7#(oOG`@F+*zJ=$fJ1|n z+qN{}prm}<|LUQmlKj-_lc3;J?F1a1SfvAi%`mfTyXlA>Ci&X2*lP>UQu~98diNr< zH#*Qtig1>U153sYW(nnJEEyjFrU+*VML0_U^p9AAW=&<!5|kY6VC|g)fA1~yHxg{Z z{LI-DIHrfg)gMwBjWxk$Sc7N9xr2RTfHI2EZaiPW-s#_~T7`yA@k6vqGbGsXcy-S} z68H5|9``gg=-q_i%tW}X6TpWANrg5q_M;gG(zIm}0ck7=rupADU=V6KGXbMHmuE|G z{NmL;8%exE%HtJg@Cw~Dbc25W0M##p>f|7jbV7nxcX|K`<#8l^I!-n3y-ZM@$$Rf7 zeyTqPn(L{&IsF|$`sW3!&LJZRukM^c)s)Ap-l%gkf!2(*hlg%OpoV`W50qa!5+kC1 zf#ix@D5*&l7D&KIqiE^K#k3c^nYsVD7AV0MEDE;3PRzrr+a72E<xvZ`>zzLagsfG{ z!yOWL9ze+K^VTviELTvw_i+|&l=7*$fsw3<<(3ZY@1Qkg#S=H&s-_)ke~XQCw`l%n zdLYsqkf7y3`imquNAc<|3eZn^oPO>@1Cg78<C@M=^8?f?v0RY&q9Xz`2U+@><7$;3 zFF*L5BCVt?2Ma;Czn6m*#jTVR4=8)>i`2({@eY8Zj5a871p6)WW%5-6AC&j`>v2=$ zhJ*3}KSZna5DiMax*tLkA0w2<Wz4SU2>76U7~=i#O$H^^@{b1P+F*r`l1Sjy{b-;< z%HtJ&uA>TXJ}66rNXiKbUftyZB$UUI)N&-6N_`AeKPJ&W;UBPH32?~L_a+Z*C_Ij# zu%6G2nq;X->oF)Eziv=G%-rK{AXGQ!z`&r`5G4LdA|9{qCj-P&9v3RQ$)asa9fgPN zMg#mt5?|X!(tfk{q0xgU$3bIhyMI>HT71Lda`TpD28YX2!Io9iaKWp)I?yu8qn6Rh zhk)Z5gXYQLput!ebhV4*c)jM>L8mRp3iL%r9>rR|&U^_^8aq(~Ggx~k<}mqaaBhA% zI8kHP-i4Aiv}&yZNjUs%uMNfWIcTIb1c{*KE(^nQSF&Mygy;{fwd<<c1Qm`q3}@&> zJH=#iLJX^~2JWo{zI8BoWje0H`TZx<un}m_z#c<5S7z=|2%#QIYd@`6r93ReITJ>p z#Uts8MDTtDKh(mV1YFs`uHxQWKF~=QlFia8J&Pj*?q|VgTHeFHtBr*;)GmfoJlN6& zgKp9dW_K*e8@NeFjNS$X?6u;49Gdw)F3f#{t(vE%=<1)B<Wrkka9{3YzC~02f+V-| zYb@9xcu|rMRW?iVMZ{})x=H>P@s}|Ap2y)_zr*SUiTFL>wlgzV!DUy;MSgv+ZUL)* zS;B#CCTKh+R|>zy=YAdxet|j=O_VbsM8P9WenxlH)k-PSBEpVM74zY`m+-oT!NbLm zLj@h#yltWI0L}&(d#J6NIPv|I@7G1Q`|4hn>KCxOZGKgY9&iMOhDhGwC;59c(fz^{ z>!JV=ZJeP*m7hrMR2Ff3CviML)t~7ddn-G5wL1qid{nU7K@NVuy^Zq2gA;)NR*!AK zv1QXHrOn_gobBy@qrb|1J=mzB%ZiqvNpufpGt+<ofy;{gLdsRd?`L#12HQ9fF#lae zxg)dwL2UHsv8VG8tHX^M<UY(J{c8PM9x<`{M|flytA7-{$Gsp7B<v?@ha0tfMrsn> zIVwRw{kUH_lS@9i*M{7XETLod+V#lb(4b;Sqoek?KnY@(!C!~7VEkCU|4JpH9a4}o zwNv|adjCO$he_%%Q4i!i>d$#}NDiI&UyDGWj||Cq$e%->Lvys-0a`tj6WH|(+#Aqp zemh80ptP1k)UEZ`G>|eFW)M>cE@t5#m_8^JICU<OJMT5<=T_-;$;A9(Vi^z<?UE`k zf6->__rwI^JXmu6Zx9o77w%e0+zWeiF#!N+&>M;g@@_6B{>-6bLS6q_0AoNFsDB?B zoDoQ%t|KveJy1gHOEpQ8kwF=RibN5DtMxG@P|;ul6&V6S34<VRC<G?vb?Ns=flYbK zpqVyyK=otZDb{mOH8j555!Cs+B>6M0^IJ&gAAm;REy??|%ZoXe@%k3*+>pvtvae$K zx^k1JT%YgW1!cV(;VsGTD$s68d;2h@U=x|Ny4*p!mJ1+<ca>ZikirW=Wo6wZ4VF0Q zD(mhcDgQUfU|<jS2ZeCJ*?$8m)G}`-h6B0R%b}(;G|?U^h=X&6O5)(0p`tiA=Q_dC zblo6H)5Ld(EM6zRH<LwQ&@0p`HE@OWHdjcE|Aa#7_0L;_6cQ!fL>T&iVBT^?^Eqq5 zO=m3Q4Q4D-G*|eIeZy51GtGm1Zo5WN3{~n5KLjaligGB@4*u-G)!Ly`9@k|Jnl1}m zD?@3zD@L40PC$uiS|FeekfF_3lyDzHp!0$mgC`%-UT+6V1Tq3563igU2uzDacw?Xh z^)e+8z@Utq_4a*1ljR2{n*ckoBR2S83vG}MI_H8{&LQxSi~`NBg>rj!kU+h|1<K6@ z>fIj}C~cdLA6tPK$;akGN?-us3m?dm!DNdsf*2+@!*J2gtB?u6ze2)*6C3w)KmmXc zFd-5K5`YB&lOZH>Lue2~zHj7cZ1=b49j(VX_Du9OzZXcXMTXX|fsqy9eK3RY1bT@+ zgBgK=9q1*02I`;<OxPY=Nbq!Pb!ZtIOzK^fMbhTa7#QaPp?Y^v2@UkRoIx!gutd;L zi?0_2>ww0$1~mR4QLqrH0eUsvG|=xMtTqXYn|tN+je5C6QfBB@AJQ{=6@A~}LoPAN z1yV?tGc@FgV_2g}2?GF}B+XgKOlYDa)<BU49WT<LmzS8#2Ok@Og7Pu*aYu+;5~3(< z^&y-sJ3-|d1m8*e5akj}K_U5f_HQsLEzG#4Wc48v)!tz6b<&3<FR=pE0l5H@1yt|L zCANVQ&ub+tyoAwr6eS80n-aS+6*0{*O!=3LWRLT*@0*g<hmiwP%_khjMy4!czOXJy zZ__z4-BQ*^x4qci=5KTXnyX}Fz@{FV1^9b5UC}d~!u+54!imJD-%b<$tm>wz|0(F- z^yzkkRPf=e`2~tK!_loI8B08%%v;6qEKvH=iyddW#PL8?&t4au!@I;-%<Q#ry*<5t zguF`f-EThOEI_I=%f2jcubx><uj`zX@(b<qRpn1=(VAkRL%~*VAz$&Y=o}*-Q&!#O z3U#g4yEgXwLh^-MmFcWlsZm$1D6-h%<Xhw9C-l)qv~eV16_jx1O26N{MS8&87^3_} z0&_hntE6?tt}GnO5k21A`QDWI^rc0!b$98!ljnO!&u1(3>-A;A4E=u!5r!j%Df&MO z4~lOHzZb4#?Gpb}R2SJi`OETLN%xuMRXX6QaGJZs5Qn7X3yN8%JTBm_teLTuD~i1= z89C0ea1a4bbl8X&A$Db+uBcQ*`!YRV_dI1HE1R&#$P!PqA8+qyKXIm~B30)cfhL%6 zF1qpv^BK*@%^gl%riY48fb%8s2(NaUQpdVPokNPxvQ!>tLY58Cy}umo{nb1<%OWqg z5|qRAoSY>oU+JFf@sMbsM<E?Y6gzX8l{ZzbipMh1kzC@DAEL};&dI!n@zgLud0bD` z7+SL|jLAzRxxmz*S6<aAV_3x^gNUM#Y2!S_oaQi8tQVNadvb1KlP?S|2_N~t(oo?+ zxjnz?5E#}t@1xsF+lxIM|E(JSv3ljNYMx#BNL^8!XP1vEO={6fpG|A2INl-2StfaT zh^KnF=&5;NID$xBPzW5NV{Sz%9$cPmDXT2bu?_u@EGgQkyrwgj&cyD)Ev_s};tAI( zTTSK&HOq!lJDj6Z$2x~A3H=oh7_Kyo?e!UzI98K6yk`x%&13Fzn2ElZl$WI6flafr zA;EXe_0FB^4WBEoLN$`ZFdqm#bs;uamd*QRX39QC42tL-Mmyp~j^VsK35ik!9If8J zWqOFvag^>5Q^z{)%-1lL8kZ?!bSn~1RCDTl#(d@9)#}XQ#i^lAsU>ST`ad=HyNcz* znWr%`tuZ4%T6O5Q9+!_6gOU1_eKExz`?5lzC$XvBd+Cib-L5q&iahzxDVDpRE1g~J zd0p=qV?OfOG^f6Ea-~-XIe`>8#<&()T+6NUA}%HvDJDBfNvm4anuYIM@_1)wE-S2R zM@JC7&g|E1PJ>;U)L&%ZkKqL6v9dIW2D3qzW$_K`YBo7TDzhxQ%H>w}n1_U-t6Ara zk`Kop=)8qktQ4!h;jil)O}bU4%H<)<_h<RAa;SgJ3Xk`>estyQI{7e!L;kB%Xv|1! z%#4;|KDsT2`XcclD9Cgef#rS0z^WG6I!D^`^PXM~{h@2j1P_eLrv8=1MHtKd_QrH1 zbQO76Ap~IVnb18ItV=4lz|*#e=_v;Nvq#64<=fwHw<LB^$^>YMmvxCJD$<=6onur* zdO1F9^XXOZFwv{tp_?yXQ6A8hhSRIbSyZX&ocT(&&i5$3xxo>}%Q($xIM-(PcBXry zGH{>E8Tl@%IM|p9iWY5GM(gCymD_Y>`G9gxCG5<3JJmnlVK%Fd(emf__-cK3X%&Q2 zs(Pnkua5buycO4g%<;NL$Z+p}rxSwnO8vZ2Ls}kle(l|!UbJ#W)zQ3Vf;BJnZM9KV z`q&EBA_+r6=#`OH@Ls#+(kms!u2nkfng-SgeP7f3dWB>1_)1fjp+Q%9DE1wmTDq2# z<P2}k!cLJ!jG+Zo>UWe|szojgCWw>>M4723XR<Qps(irQ?3l92Tfrb)Wn$t%XczU$ zbDHd5)s$hWsdAr=blDfm*(=X+88fc&D2wj$Hl?|uOUz1EKfY%GTGIojg+x0n@)6n7 zm<HAf+Y_5S1&LisQj#Nvw2Sk*r&o;-R!LQ-3U|NdG=?-ed%VuHHC3m4CrcnL%btoW zw>WO=6e{<HRvp8U;k>s^%I>6<RmW<qXo96WOMn`I+@+_{e3&EEoUG`)P;oY_I?idS zM$I9e4uj&%EFGS37P=6#IHp}?2PSS<9m!OtMMB@TNDd3b%q@p?{wZHxqpyjn==>ZC ztK!Ptj$1M-t}JzoY!EB1<T<Pjriv?bA-`AVIpv1fVx@NmM@w2%xtpVHlnM&%HCaMe z$BS6YroU&MmSVt!`(A2p?)GW&oT|^a*FR`3vTr{9VxgS=pjqgdCL55lrbvy%lV)7I z&r`6o+_FrGX3DQ;IUiUt*I~HZd~ic(qeVH5<5b^;Ggjj94o}6jTy+$pA8iET^ObEQ z99DUqe%Ym0szX=IbDZ);DtBU-I^*U!L*9!EQ!+**H2H=lG%a+Dg7q^(Nt@w<JXIZ~ zY1GS7y(3e--=@&4Quy=+6J~}^n|!Mx&cc*2S<THobI~WjmXbeTQzGZ+<pNQLkEv6m zCeMDjKu-ED+}!01*US)u^5XmwkMj3fK0~8TIp1GWDwxlD%x8N&0YI_DJA5{29UQ<< zX&kN`=ttZANRan%a$|(=+@OS?CpSj=jtxq9Ah~g@@4%ph{N%<c-=FRI1ufD;W}Sx0 zv9v2osBlC#get#QA#nYUa6GSWl<@4^XlMvg9#MTWpv#?OyQI@$qJs>X_*J$_pS~d$ zR)Af-$Jc|x3siv4SA7P=Q&p;fl|W0$VPJS?q@M_fmDgY@*{zIL&-8gpyuY7cP?6po z&YV$@`FV+u#m}$#F28pw9AnSM)!;YEN7qU`dS=z<7swbpFrmycCK}9I(a?!@`2=af zqQtH$Em2T@d8anGN{T%RO=%4(?=cLVQ7{H-)|f(0I1I@pCg%on^*?37m*bU4l^daS z1n>Dd7yz!NCS0Cy<ysQHdb-?_pLpcWc=54inXX)G_nB>Px^ivtZCI$B@fL6E{;9>4 z8={QNDNS(YO07o5x^jo<of9kjbfwa|Xq=xLiv*o>j(qrS{dQ$!qI_&iq24u1w=Tpt z(Yt<*`G_Oho(C&)UiUhSYm}}q#C&9Bkt0MfLU#bkx)aKycYvaVuQZpl<g&I~)|7ZR zven-7IcOHF$b!PeF1a7Vn7q{F^yc4N`GKj@WA%;5&ZgB=Yxf;;kK7_(?7l;|Am_07 zT>W}ait&l}g`UdK*qP(2ivjXeiy!8v7U6=BG2&Y}R}VWPzQ+2o<>;3}%ho3Ob7+pt z_S5xLJ#5d_&qzlt&q)7c5#rh{>a?R4@9$?P9!!%z1WmL8C^02A&B@g}l*xsrb)8+u z+t0M05su5bwoXyVwJsnlns*8~FE7=1=7UR_&hd#|u60t?Iz8ShFi>aNm0M=4=uA>} zPxsxa)ZL+!O!Q4sUeAIfErWv$Z}+x)^D)nSHibH*M?O$Ix80lAv^7_M=?z*|=vjgM zznE!bQldW%cXr9gV3(~CUwk2Y>xnmGN<7lm<~Z3pjv3|s@%u`rO$}kClTxI2!%J^} zMp|orMta1Y*aR}wq))>O3YXdA|K^(ZX}BtV7OqZPYet55)@(eLIdk?(&w6*x-jseJ zoIPJQ!)>Zi)Y%vfo7Cqz$GJl)ly7H4At+0k)8uB)E1k1_mObtqlyeWOQ2uAO+gzc1 zGCQ$JS*E^+d(kEa@^;54;d9P(xh)k+<7}uB#l#wtm3~C^H7&~DX4f=(PtGogwxgC? z)U798NIW4QUGXM5Eiz?aSy+mv)V%#or<l@Q?%U>5-t>JDV?MDB+C!3){t~`_rYq@D ztPx7h%0sNe`boIWSaSH>3)zdsbI;&WAk|fdZ$6zCqA&eMj{ZwHgrUCFEYG4sc5_RS zBLd9c+7u^eO&cb)h0C)5;QLY;HAnez5+wee+UC0#i>1HE(nz*+8sA)|Myxo~dss2E zinve0eYN)s$IYHXX@B&i<~Vud=s0<)HU5)mBfcjhj4|rHOK-T+$AxW){vcdQz*>*2 zco;WwjtRn&;wc-eMsBreZ}Nv~<g@;`8oAA4B)Njhk2WSYbxCNKGa^ur74_JR@t=^* z`2N}OJ)_vAUGmA=a4dsKxmWr`Io%!ZuIPUwGc)B%Y42gGpRXWur1}rSNt8%pE7C8A zGl$_^B>04{y2CW%8-`>piaw$}#kKn5<`(I4xcc7L*4m$17mJ<(E*USDnUycq_u90? zlEZFh`RF!xXhr>naHTEDw~z4CQnYMR*@UX&Xsn`6!e<!RTXozO=E~J~4%_a^?XNnn zyg7+l3Sl0lygkWx1O<7k$>oEu;fxY)eKbzFG_k5LUkPRMMbK5mSJ}8icIwUN-h2T} zc(qLTinnBv_nVoC1H~~I!R3v5Icz(Wc1l<|Vku3RUUN!FNeSEjk{Q?Ym5GzKE8{2q z&X19Z&XHicg`9Q%!LB?pvFi9U#%%$9(fAJQG^^|MJ`-=Aq|Q?QKCx(E^(9qiFozA* z$upIYC%%wymJeHR;Y_VjupP`NHeA5h_`zZD<~Dhz9NL+^@Rw4`v5o0ITKwK4T!}xl zT|O3nV8hhi(Z<e+7vFM@Usg~kAG-9~nvxaH^YO=snI`2I6N#lipSX<^E@A!Y`x144 z@_agBf~nvY9D(s`Ca{+KKzyN`YI29jVeyBQ3>YwQ0PIQR$*`6r^TG8OVA?FKYG1E7 z4KPT2qh(|KzKte@O>`%P`9e~fpU}%~O31|Rv~DyXS-;R}RL<UkJWt9fG;5Uk;1l}9 zgNpZ#?Ih}N#}b($>d`X^Kv)-#T0crYT+>{0Mv1v&ZdG5qH`;jV4Y_Z-(c_)L2`P|# zqc}mFnditpD^h1|S2o<Sl3M;})!(YU0#i=LfgL$gH4P|Nt`0qgqZB`S+$Xr_t^^Lq z5%t+9%uF#LYWW?sibd!2Z;v+aPWF^a$*t@3Gh=t1xmdiNGg8kQb!m-y6s2*e_4g#m zP(y6jek|25z2%6UyHx&be4)N;zaBGN@6v0R-n#10&8<45bj1OOUlbbjPov!<c)NkD zA%b3s4I<llGF&;CvVEJfK8~|Ull2lQUkQs_kuUc}e^73M-oNx}j3(xiHn&Lo%dJ~H z@)8UDOlYyWsdJJeGJao~0lk*k1RZ<nmFF5_FYSu)-I`yptadNmVK3z8-h7r99GC4< zVL@&7Qm!9XAL8yNs+f=!NFQJ$c!@<m9)HX^qH{@HjbXF6E9XqNe3%gWGCRjs9qP1I z9V+`mKGc0;{{|~4^c~Ya^Q6K&UfIguB%X*a$d~MSwWm=xYNIoEFd+}c#c<Z*X4U&~ zq=QHr(I-mF1jrC~Ti`ukIX$76Ob&k%N$_r*6QKjD+<g=rWa!c*(%tLR(c|W(^|L?* zOneMwgFF%gDCJPuc%e7`Q1`Kv1EsV{RT83&e02MzSCr%lep<ZyXRwqwOpdX92F&R? ztXeS>F6nw~WaWPSGg3JwOov&W=HN5qt#^WMuRMd&D34&Dez0#%$urWY;j0OX&$*w{ zocjr%a}NeUZ!+h~S0P{8{9vT=%E!q{b5yC}Ts8X0d&dm(Nc!7_zpD{iJil=7k%;$) zv;4woYWSMsrAwXPtts}jNT<T}Ez;k@`&y(k;dW2Lk?P1@=0=_O?Ta;$AA~hZ%70zt zD?ofzmnQ;N=fb&D=1$JrGIGnv5A*2n;#hX>aZF<8-lE5H@i;XY*KI8+IVNW~EXR}_ z=|3j0x$R2Z*^tvOqZ_z)(+|<Rept^&=vji|S-%?n>F9H#`$mr+bLW`%M;;vQ9P_6! zd1H&mP8@S3>q?frP-zfbvaM=MHa4EKhcmXO$Wzm4U#9$4tbAfP*{lyuuQt5*nMHY+ zDRcD%CV$>9tv4%kGg|Ngz3d2AeyQ)@@5n-!UvXZqIK&mS)D@j@8Axy$q$M6Ks=3!% zb233~j8S%f+bLi<O-pB&b9ieu{3Bi2Q98Z`j`euMr+Xu&w`Pk|bV{ABRB+u3^7MM; zm%7rJJqBpiX~|VTi*%UhpXu^`Ic>?(?8W)jtM$rCUD<_}Y@Jd07hP#+WuKw+Ol6;G z-TzkKt4lmm`Gok$I@7$0Cv*mfZk{q-S316?t>WCB6)=GJww-Z?D^YMo)SOmE>e8m& z<$S%r8GgsIy6Ss{#HJQd=E^p;W``(3YqmuZT-lMX?6Jx@R%USadYc)FonmSEdCpN4 zi=*^tNUYNUXvUOQR@&j6KP}C^6g7Ot%7k}qcew7A0A}*NpO&BHG$~EYb+5(uc3Rea zy!;U_Cf}=R`SYC?<u$y705sP3eA>J`<o+8HB7Ie9^Oie@Db;ux>;0vgmb1u72s3@p zrQJQx8KLB})FsXuP+@aEg>;+uF*PlJuG6L@v()(j{Yg~6?{D6R)U<57vj+g8w@?MN z$vIZeHl<`+)(LX9Wsj=9i-SdHXtcT(OP<}Sv5qUL!yMhIQyihGKPuIWr?J=(mxMI+ zda!y?PN}7LEKxet@5*AQ%t#%!Zq$qIXG(|5Fv?3U2qxiZsVKCS{jWD^YOyE!0~ls< z?vxnVlC$M|BcUfk-(~tVRdrw*LmTC0pgcOSbG&PDgq%GV79URd>A`a(|7BjM(Y1KA z$9r*#oE@QjHqU$aR6E5!oF`|GR$As2ksmbH8J2iL8OPugPG|G)kv$&xLOXQmsRfz% zl#ds!#H{ys_(1?H!n2K)pi@%bW2GS;xW&Gy$ujluNUx_l%LF;KdA!z4<pshZ(I;Oz z>gLJKzEGutQZHoSQ{I<&#G~9#xv|a=IGr7ahOx?rtY*S8%yeI6tWfe*KEjkaw|kfA z$oX2RB<iZ~wXX3<uj`$neAG9rQ}F&JKIM36uY7oa^!;Y|4n`HqS4iuxkq;FrW7(Rx zYUBJf-}$UE<~J5sW5l?ef2Mnzks4!j3<L4h2H$k$OOnl}(_d1)V84UqFngNsJVtvn zQy1IT6v15^$_X|0l0VU>>+#qjbVVdO4vFWC$g5c{);Po9^RIS>t@J>6Hr7l~exHu7 zr0#D?jV+B-d}{K=Qfoz@>KKMqc{C#sPyffM!<-{HqPB)u<*3@#Vs!R24D-MNJ4*SB zn$U$jcp$N~_`TW?3Ms7cq=vw4ksVdxc$rY}vd??q50m>pF01Nq@m1QDVXUa;Ct=)I z4O{>HWD5jHsBFE}Be&w>eY@g;BDz8<=6(C{iYtb4JvIP3)!XdwhQeC29<aEqkC{8o zD2UyfHR(#rHQ9OyiH}oap`}r$EKFDaaE+Fqa4Q6g`HLvI*RTv+nk)yvl_W|?Pxgbe zd$WJ&@17O&vef+fc}x1|FI|#<ZT`~5cV5LK;mRWW@;m$RNa)2QvB!S5J-eIb=M|8t z1FI;k@af-eVs~!{tyr&1b{gNjTlrOjPn?V0F|1)K%u_Ryw{;q8MCCMdL@Ih+Lenyg z-HUH6t$0FR<q#TH?OLJyH|u<4x002xE9J_%ajDas5fyz;m5r(Bd$Me5SBu^mR`Idk zcboDb%(()B<eTkVnmXAbree3M;$vM!Uu9VaK%M%8BlD;T%8BI>R4%llZ&+za!?exW z>Mq~jr3=seJMzoLTx9}#ZkPPYn)pv@T8t$ti#^`ClOQU+h0ESwHGGemU3|;&)rvK~ zTA+4{OPBg$K#p^4<u~He8Uyw}96c#$SLq>oGc#vT?z>N7!)b%rle)^GPo3^5d|h(d z?iPCIZtC5{*46Lc1x0jeji+%8HrxzzlReAO<^s99F_%1@CGbifoCsT80xv5w45jfE z>&0Z}g!gT?SdDQNY0NRU0KZ?bTZy~#Er&tqE%BW@bFl=*R!EaipU?!mWQE5V$|jD< z)E!`KM_5=a?l`hArkB<(7Mo(O#!QcmTU)Sp!`k|_U&e;%#EGmzXJYtz^8aCpx<`t4 z7Qa=zr?|QJqvFqszbsB#b^oegtZMrCuUECM`gYaW)tRfEtIZ{4CEt}K-+$qL6TUBd zOod*nCKF$d9H{2Z_p7l7s`)v4Q2*Hft7@L~R}&J(t0~d39fBznw@h)CQ$I6iv3S&9 z&EnW+W2rR;ojzF2UbaRzxSCI5$F3UMno+CMS3io@P&I$N?LWrdsG8ybd^HoUt0rRg zmfO2;AE;&+zKaq}qt=9FR8VWsH<9R@<3GT(>sxd4z6mgGP&Gn^pJ~Ihz_fvC-sMaS z`$4Atqt+1pqetVYF+Lf6;&5wP#@<6wK4I^jw{}VUEs>6&_#!A0;aIiz!RX5L4=kDM zguNd{cS#<L#j#+|Pnojzp1Kb#T}iU7|G>_zwjK|G4|7c2`{Jzua22=+d<=o75qP^o z1*YgC7!~p9dOZ#5rYjT2IHon2HeIogabPfbDy~d)>i=k`9DBSYf`5*2SQ?BR(geS@ zSe^bPYTU8Wc5gvpBm2k(4_O70;+<h{$GdM2PdI^eo~pcjj~v+?)*?M>Q<a4aJoRNZ zd(D0-W#IWmFLuXmu?bR@t=?hvz%+oTsm*bRGK-attLdrnh$eeN6M@?_@a==&dOVzm zqfN|YGJ&C^@kow#+14e7TnxGFoSH1v*w)=qaYbJ$RCx4-?{A1rINNrbZvw38@hJQ5 zDGdo^_IP?dOt6I6^OGf)tz6jQvh6(_JMFJKe_`#x9HE5YU6cN-ttR?EZH}nffGAD0 zFT<$|s~YJ+>MyL%NRL`q6xH-7$^r-cyeD4#ts40sw&GGtHHuZESWhRIo%im?LWA+^ zc@4X|TXf8+Z#(dHT#aSi;e^A^J3>^)ZP?ASEzuIY+CvUHhc9(r@V}4yB;gY%=YuPM z2+8e)Am=&+{`Ua{l5$^K+XrRBlE<W!q%GDm!F!ZBhb2$LE|1_nz~ug#|NU=OO*s39 z0F?**WY_EixrV1ca2OK~)*SQxj-{k;u{y<?xEkwIA2=hP`od`g-pfm~+YV}=zEe~I zgz9XKZvY$56Jg`Uq}P0&pcZ61CM?c-_Y(mSt(+@VdL?T5lWw2_<zkvEz0_Jg?NMu? ze61pVofXbA<=u3jq`a1<yxL!~Cgh-FSi)Cb|8q^LPra&aPE&5b+vt%LN2+{$pzgsf z5fjd)ByHslkkJ6gXfz<=9!GfFM`hpU_?sa9slta1W8|6=kI2Up4*GtTmw3dL^q94v zdfMYwWnLOJA@M6YeXBLTzssX@OhzBXE&fvlwJ1A?29uYt)cMUoeJd4Xnkz|b(3(O_ zWCM*VNJFFAQ<afgqojndt}1OQN@MCu#lApB)jJ-y8a)l-*YgsZ+CNDeE>)V_Tfbho z+k?in{XMBVz0!=WD_Ddl)S8~7O_g7n%0uI-C*;=r9h;xu<of<T?hAT_|Lsh!$DU^= zo?M6Q-Tgv?{_A;3JAP$N8Yewz9v}8~QX4*tlGMmAY%7aActaL{v>^Rn>N$sj!}v+a ztND@;V>y$%vSxe^YI`X6=mA_62RYM~D)k-J9t0`PU0DQgMX7qUY4honkIGD1fmtX3 z@O59>$6X9y%grrP7OI|Bso1tKrd3*PTZ-ozTQQzLvem>KHse<-qAT>LF;nQ&Oy~#t zRjtn^EEeyWbkC$;O?qR}SCfWMPMCc1XFB|9Qeb)o%#e9+$B*Cmam$bY`eWtC=YQPs z;M|{9{#5rs(gUj=c<+Iql$d@p=O+h$Vi_K+CQMbS8caw-tBFQ6zn%nR;ilF6;|VEr zM9?NtwbuBnnZsLCkJj9-Rb$d+;`hY(FNl#%l05mpf;LJ1<f6$xn*1-5sWp#HesS`i z$)8T{oNS0sjb9XR`iV3C5AjT=7es?(Gz|+eTSBd2Sf}IPWc;zolj(tvkrW+C|1$75 zG9!Z?`~y)y8w>_$VYAt6wOYf&!y_UhMvopH6%`d58#{jd_=yuIPMtb6At7P*?AaVX z!^SdVSjKdQ!uUTugT-Vp8xRf77?gVBjF^~=J7O}X$7IZk$;hDpvod0)XT;o*F*IXP z>Wwp|PR+P;YDUu3jO3{q8T3CnV`@^y)H^eVW(-QbaRy^iMiymdQ6pJY6#X9=#jH`x z7&SCwQ0k2{tk$S-Yt%?<)M#r|6#X9^WgQu14UZa{F(~!M84(dtkr7d&BcjGeL`Bj6 zu~8ADqaq@shGq;(y>SM9qfTTt6SG;E%|`z%HfFLh{L;aYj6tb4&M=v5Atsx}WV4!V zHu`V1nJhL_h;3-bpwt^@n9Vke*%oTHg_&(O`X6R9huX{*+t7?bsW;Bxa(;uy-e<>? zIc0NXcS(&n#gdL6oUqz)UE@J(0}cf|WW{bx_}*?mP%Ht7nwj<4+#b)~k_lRABW0MJ zf7i?`d$c1GCRM7#1{2EWH@w6jFsD*sPNfbprv_}P{&cdX>NLAaDa|DF#9<=iWnE}Z z54Sqf{Z@x$HSS?L-*kLdr2omn9OD{nd-3}}M-mSXSXS?TFrh&|@VW>2C*J*RLc{QZ zG-J>{yG4zxvz3ml>EC=|^ZCt(8n_v#S!i&lT+yu?({-YvGt6hGxDvK5w7a=UbsGPx zsmZA)Gpn*!ggfnL^W=TxH^OG_(LYE>&j`)+rB;}UR@Fl`7dekgtu@9NPxOvoSSenO zIHEG5@QZll==Ik2)-o}!`ax#y`lTdX%0BarM@ZUW%@)p``QrL~qi_kyUk3rsdgP>v zAOd7v_Qb{C79St~Z$F<ApKz8gMog2d4o$BA!sd}bqRruU@7}tf%YW@Yo^oiNaOo9K z{GqBtmtLtlq#pHsn<PhnVUs@#0B*YSZ$Ec@wi~AkMys81u?AmgoXOxbb+zsCiE%Rw zxo6ILl;TXa6I+)sX{b?$FYUtiWL>E>@yMP`UH7-z59bLUaOSk!R=3#-_H3~Vk=0gL z<W{REPb*myS#GUK`h^wehE9;B<ghJ;)s)-}`>ZA8z<i%CmrN!&z>N9Jl;?0l(70wL z_Dk=Tk5jz^rFkJ|_&tu0+!WX`<=-r&Jz(EdSNdaC!T@`g($|G)*oSfKxjx@gKk6i) zUP*vtoUBGeTBRS`KAYGo{ls<!&!5^NCLI>=UFu`n^s98NL8rzt6J}g(+`TvD(3GQ7 zPW~+Lhk1ErU|xQeJ+1q8ip_bebEY%Lx!QU2dHG+R+Pq8)p4eVT+}?>(XwkEP4_p>Y z1NXHxG;m+rh-FY)Q(IH4wAIE}KiaB?uV&ybnw;_v)+jhEcn*h6DJTH}Za<^NNSK8- zd0)Fie?prp5-zj98UIvq<SQ~<!Iym7GgA&n4$(L{Qy0Stp#8%yg5L0-h%bb|`uACU z1%VE}39K8zy?3WC7B5cipSo;DfOpcg!B!2~0kPBmS?*=_I->SIIF+~;l16Gz<6Z;j zUc<&7oP(j2qEp|0pvTjY36^!w@hIP>I3ge=$4afUvFIu_)pRtPl~Z$iJov$<+nW>H z+7I9_$S>~>eYBfh-P*AUR}hyjau#h$&trENIPHxWwszEAgR@(8WTmlwM~0g<5fpaJ zcR8nQO2_wC&2^05ly0L^<Lbt-w1QkmL|S&Pb0p4cbktRg6Lzq)9n2v$Wb|{_PK;;E z;kc^k&0_xEnNtyYO3cSMu7x#JIQ0EZf811)US^xyI7~^L6ZZ^$!v>GdBD(2b+ecIJ zJ9c5Sr?pDIvhAF9nCZlTCFT}jAEC$a%U|!H2h1}PXDpi$x3+i&d51>bDd=HWHsL42 z@ZIjz16yWTg7Vul<7RecKz{Z3sWHtvgpTIb_&YkrUybI38fw0hcc^*BKhx1H1z&8N zL4zgQaSP2=k&cL({i3*6nTC$HE4GxP`i(Z<m|l1l2&P+uxv+QXbP|kjlLrX~EboV` z4H*yy&6N-m5Re9_d%yFbi_#{N&@=@G+P+y8=^Jc1r&aS&7!yxGVs_6OG^+)@0rtFn z<$Ox<%A(S!kQ2_)iYZl_$E-Cy4Z4B($>SfI7<vN(lV%tUOaGt@3`wEwZ+~j?56XXB z>PAD^9`qCZL0@zF$k~wnfq>}?4ujLP?aIm7+m(*lPQ!K_Xt>qR+vzkXo~Vg_%8a%) zB^Cc!H|}%9-bpGBQJs@8V|ID)P2ClT;W2p1tntNK;~5|J;%{p{Cw~IY_nDRIq!#HJ z8{-azR%xm2FVkD4Wwz7P4>M)^n8c>~&F1K>9Xo7dOtSQ6i$mJ^XN%G}rgN#XWVRf= z5tysZHPIVvuISgSa%7p!VQG;zn{`;9Vqb5&GHJGB7*FWxX!~o$-*w99*$!jBRAt^) zb5XI(c1RSjxq!V3nQfng^3Je1(rZ@7zgDDI!HcU;JYvryBSm>6X=PE3b(5`T+LJcr z&$CKbR~^gGtBKxZQzL(4Te%`Ra;t4!T5=Mev+{NT%nGny+)|Og*~}cH;8;qQs?83o z@*vLW{MM$-g~jnZ8%}NhyG_}9m-5A3J-*Po*Q`p(tg2&#u-9|$cQ{9b3*c{u-F_E- zgv|ElU0bEM!uP6b<3i;gvFtQHvc%G3b!%;ze-Mu<nOlwt2VB<Y&0F>fhh5e!IG$Di ztQp@TVBTh~f6-k3g4yWF=O=#L=Mt1e!C34mz+Hs6ly%lp2~S&TXk7fd(L6r3RF_%e zdCnc4sDua*!jx}I4JnuKm2%i;G2=^QorZIN0&zH6PWuy*au<$nI48bWV^*?R**MuD zZtCA=c3#BYfwBl3@7Sx4Z|?3;n0^~Jw#xL0<ejGD-1ur}9OVm6KK@C_qg=yR39T39 z<$8IsURW&A_IrFAHsFW5a6T|sa%~h{t3>&@a*M8~h>nF+o;Q)7`~a>nq~uEFp~|Za zg>kAPrLEL}0>1UnB_7Ftx}-;0qRN+wvG+1f&XwpS2*8#ppRyIj${HqT0l8kz5?#5X zYbml%DXSUINsGR;c)af2W>yx%m4w?9#W+TWZ*%fZ$X|x@M?$V7uhz$V<fHNJ*xW2C zAyZ=^+IvAKpPH0Q*G%LuR(tHY7Q<wq&JtU5;fgOQ@_=D;R*Bf{4=~K9^LTF$r|p|U z37N!!RiH>h>yP6!X*_cwr3K(~R_WK>!kK)ka=pZyVU_Dec)a8bu!m>|$os#xg6Ndv zWrk})htRf%*|g&e@%xY_#vhAs-+E$eGj{4k;h4~_-Gfc+B6#`RCGB6z{VB(t2G`8o z+`BKmir#+zD$WCL>8RLmOOc*8uhVH8Oz-xq@sVq7kiB!tJt{VdQ<|~q+N=WzOuPev zb*-)LVVkmkm<us&V`^E~{tM30C~;awTKs`h3m{SslpB<SVPz)7vDdhW!$0>25kEJ1 zw4>r|4CH!W{qyD(kX|`@i@EzK4)Eb39X7ln!kPf0>ksxT%bD!Z0~<~lf&1H3`4n|Y zsgx24qD2``Nb+&Vn7S?Ic#m?bUv9?7C$uV1RV4?%@Z=Xuh`8KFME=2Y^qdD`5sxN$ z3VdP#`lRqT{@!wgsegqeeM@pOuD{r);G|rE&w#VMTg_;O9%rnvb=MC!*m{wim^e6h zDW$LM8(o%Ow@CE;9pDgMoV~#TDcs30DN#&`QhlM_9T*ec$8k7KxlL87`;{<$&PQp# ziepCtMyzKU7)2wV7$ZlbF>P{lfLw5iv;;9KKKiY2p#xeXnw1&xF^ZMi1f<EHcxj8- z1&Cq~AI2ZuRwkvHpz3-(_>wV<ZBjhmf5)y)!F)$-#bKRtJ1dKZOyZtU*$73|<0KM} z>-~{|QE;`M3Wdx;n&qUI%(94k9g}E3e0)mBx>&~uSJeD?Pt_^ml1p?UA6Fnfz2Oo7 zPw}W$DDq{qatkXPEhp8Qt0G@AW1y6oQxI7vy727vaJ1tx9aH6gp=W^{+O<#T7&g~2 zPS_{(`YyOcoP3PJ;;UQk5$>vN5h}mzPq|orNdBzXLwTh}s@nStRsM`5mkuf!sVX@N z-c4r&hVWE9OKEZD3bVArzAxnd`Hnc@k_K@(2r&WMwR%QcBCK+sK&PsFC*!*v!V=eA zuJo78kRLwyria=K>T1m?7aWl|Mk=eyhdN~>^V#BC77!b1&B{7eaqD`(wESg6%?t4@ z%1K>HN9jDR#!wy9N`RR2oUtFrTWihj-pa3W+)U`XcInltItfjPe#tC!xbT#%FPq~J z-|Y%Bu7PG%B2}eOr&Q}yv>Z2Oo&n1}Slh%`rtiRX6km|9+}1BA?J&y`uE-tcXGGV! zeiu|t<Y(co<=D%YPnCGyof)<l=kUBb%cd)Dhm|eabR{|LI}fN`R)~$-1}0y*_?En{ zyKTXm74S+US;i^;i^_{?q1-2b#?PFAADDFZCWp<*71s-j4R=^2LRR_>NPJx_>r>`H z)qAR>9cGuYHCI&CBEn>+BZ}Y39{CWI`~nrH`Gj?PTnO7Pw+GM`@hb71T#A76n;tqR zdFQeMY?a2PfWM`;<Kt!Xx-q(}e(0}}a@gF8gSx6k{V9hXCMm|d)vVOg4r`t~3dbAf z;mY7boRwRn7ml|WS@FsNQ8s5fY(h(l^s?Dul7W!~37Wi6(TgeRubCa=TW}5tk(BgT z%%zCEVy^tg*ov>OSN5u|bo5C7QdjC48XVL`G2~4*R9?ZC&*5a{J)V3ys_Ir(6m)zQ z?l6M=tMn<+pnh0N^vmWl0eymrWk|}#{$h^{bhLt1_2~W{61(_r$X_c?UNg2Q0*4F2 zT<B!j3GU1=F!PP=Z@jS`KZ<as%h;OThf6hyIGr3F8<x`H5bsg&{W&ujU<=~-h&asU z&taVJm@HiKU4%rAPC2$NA}%HRHFH_095Wx<z!lXy;*#&PpnQH<;$axRikp><R9?P{ zURK^@Wg%+h+hI7Ph--<QVQ=);fgLT59GSCgr`ZuIJfW*d(>V=7_BEdc3aE6l++W#h z6ndz2)Jm=~T8u3s2F+{c76T45U2|pWh|Qd*NjuGSjV_rVSBZCA^L;C4U6cFcdn(dI zM@SI&SFWsU@fT1~xBx{lkur_(Ph69`efwNVuaJ7dlkQm>Q5+CbuSe+cjdhHU_oPXz z^iuq#7Ew2VL%77pEb6&Jl;kEh$%ml|-oU`Cj&QBI7JmtMtAtAxI00g)UZnbPUhGQz zC1@6p@-s%#O)5zC)4mMX&4T2A4V;c^)TBF<DxQ2nZiQ;dVe+DD?cOCg9s26koZKKI ze4kP_%-f-yfez9}M}d-}!w4}l&|iYI{AEN`>eH))_*K`?r{9G;4RJbL2&!D)%^c(8 zRlT}g8ZRcmD|yVfSYFiK?k$jKVa}S5b2=ryl!{cnbCSI33ZRBT54y6h02b8Ar{ZzH zN~rXj$giY4a#g!?u<DA=NJRu)ZV1#8nqCNYb;t**7Ijyx>YeLa+TZS#Gh7B&wjLA0 znafaK+WD2jZQEf-UBay>M;2yST!dfL-T4iG*Y|>l7k_Vbp3&Xg53@72a&5OBhorlg zE=9(rS26r>RW2k^ty<sPnvI`$_FF`?M#(1t0+)<T5cZvB()C{p#O>i=i^ISL2oIzi zJ&9dVDqrh`nM>@2exaI^4GE!hJ2+$r9kS3UqxVV3%;<&eYbg@+!Pua5TjW+DTlX8} zJ9NJxInkyb`P&>9>L$74GA-hy{OjhKDV1Ntli3(XJAfruv2ir!sy3G}<-=<jq@^$n zZ-L}Um7Zaho&6Pk_!$9kSjoCp7Df~ErK@G48u_{zZ8g&7?x<en`D@C(S3CusW9P#5 z%Sy5CG?$0T-zuq0{#d@CtnPimH!TG-NV%jud`*eJg0#DPUnsqW039Q7-Dm`>`WXJc zkd$u$g5Om6xaaN?kDa)uOuLGcGQL~omUwBWnTAN1HbAIle4r_#t`UceJj)96WDH$u zZVD0{BLoM@wezAJxznsza6D!wt}E>{uf*j~^bO>H{k7bbi;n4lQ=aOlk@4-*i*)f2 zu-5o}O4>C{3l^GpyE~R(L{hbe?hfBaOXWlHpU4+oi+Ivvozat*PbzJv856;4=5k9- z1cX*?r#}9w1RB0j$?T^bScm<kqaC3%kb=X=uW-ywYq+Ibs9c6nbYng`g~P_9Dx3An zie9--*ocFD{Z*$FXK$rZFR#ZfbiHeJKZG^DSChE{W$(3`RVwa!{6DO{3tSUd-akCK zFbPRW!o_$8M2u~<EDbHSfJhb4dPS%RQn9;_+r2#9ZZ{-icU6X_i)6-9tJ|)tZP!b? zwO+bds7<9sBwV}{1+<EI2h@q9h@xBslmGWjK-um-&-?!0&r3*V=G^AYncunn&hPs@ z$OsWMgV-ocdBx+EwwqpQgRqJB0ThA%`2%tMjy8G<UFmPpiB0t!j3<35<F+szT571c zVNMRvD%bz*{seUN8CjXjmO6<@sKt6biGPxU_5Uk<47NiIW@jn^B(ym-vZm<Rv1V;_ z>{4ki07(2DQgZ>Bd!?JR^uC+n-fJWhoI5-kc*B6`*d%GLX8wFmVVBn`&{xfg?Obu; z!|X|kz4pXztAe=M6MLP+3b!xu*Dt2v_sti{`S&lzCC*AD*Mpy5i|((#_`!=7@odoD zW8AOv7#;W?(3vU<=v`_|*@vZ?8u`^U-yE^TaxX^#!DFjTZ9UHIyVNjF-mRwMJk|-O zHeuZM-4L%*k1&Qc?p8w^(E^?zK~SZb+6aO$)XK;CSuUr3B_UTJ!sM4q3JrVIWFp^1 z?@>#wlMrWqT*!(U<Wgb@0Gvv)LdIjTn?1>0!-q;Th=<(jho#{({^t_@8!AgUHr3Aq zlZ7^q;X9phjp>)%=chj{3?uhYT06Wq_7$D)K5aS3^usJv_`9hsF3$>+e`Ih^+_;=5 z?+quXOjg9vEA;qPSX7hgIOVDlaq7IFw1u*YjgEJxr}ThV;lt_t4-?QLy3C&WZ+tpq z-;AR(KA!Ox{5H;Lo*~TeOAJXQlf@M7RGFLtl$k)FGcY7yDUI_hR#~o#vV>vZSk5_B z1uaAmpM?!_;(X0YOBl*0aK#8WU9NM2GO&k#QH4!Og$wxU;h$4scB|N0u9GXndlI%I zh%FwlQ41XtU9HQJ$3&mjIqgIza^15+>OSt8F(D<YajR4hF!1mf4Cq$;caE_7Fh`{V zF#=WW)I$YyRI*cU83FeoF)gbKf$8vZaUf=3jzX1?0@O7rP{(9Uh?{a0C_NN4284Xs zQ^!Ct@bf1<2AQ5U)adq0oQzvydEh?o2&G*AeA4mV43V$drE`<_>po6wHgC9Vocv*5 z>nYdi30;O<jmId{<Gn_ER`|M)W7uhyA{qB_Yabj(Qs#Rsp2_==E+)QO=drY~cvj~W zL#@tyCI)vkH}qPL_sn*R=hdS7!CuREJ=393l<K9dv0O(CN1QtM4^GyI0%DDb@7hgm zm^IZ+<#r|D{f~&DPwOCSthP$WzdAXCT$*KDPwTcLD47k4xEk97kCkQ(RXS4_fVSV0 z@gmIzpVpZ?(5ZbHgEK1~18<9FVai4zMTSo{Z_3CdU=WH%15xBOZq-uTi!s|Rs$k-a z)%`2bw-l@0R$t@R59Q(d?fcZmZF=x)sd*z>0)?|g>L`&pO5~0bA4du8C{Z{{d>th! zM~T`|;^!#QI!g48l0ZjEkfUUTqhzF`WVEB?2}g;^Q4-}SdDc<#oTDV#QS!W_WQwEY z1xHDYqa@Z*GSyKM?<kq(C`oXX%y5(>I!clpCCQGGnU0cKj*^!gC9@qRa~vge9VH$| z2?$))3(w%-vtD=#2gQ0}JaPPsFoqm93Bz!ZY!b9M$TkTI9ORn>>Kh7pSLxcb!VK3- z1jy=|>RC$4QTV%f01yPiFNYnHtjvcJg7>Kf)jm2FI7N$epHIe;k6~K<l%mL4bk5{q z&vM$oXj-M7E13P%#cBbGRFF4vK>*K6>wRFoh||3^yP?BBt$c(|1h3Tq^Gk`Ky(}jF zj{hbLI^lItKLQ8GmrQb|IXs*B04f9X*<w#hN=jL?I?WTU^*@%5#zzWZ^V&%mN6`+C zo?ktQ>j*At-V>s#zz`sc67Hh2O@&?Z6BJC1$5WyPvKJ(>l{z#?DfPVf!%L`)aGiYp z#Gr(Usa$<2T{mutvrL7RP}uZzcQTccxWPTH($kQElU^suP`>9Fh3UsWse=OazpIk5 z_;gjuta7DRs^2G>W8tB@aAHlQG^%b~p<%Pe)L1Mb=S~(E1E<(9hd}){&zd<;?nNm3 zky?;|hE_eEf5(S!^oZ3$W*x&n?{O#?UhVnzFgE#-&9Xjh>2WB4?&E_!$DAJlY(zhB zP|wwk!z@;_j{ZdBkc$^vaj{+F2p2Ct#l=4~igkyJnhrE4Ij9MB;|^R*a>&WCXqF=! z$B>WFgjDQUtJ$$jvty4Yfv=os?aOd_3~gxfuj!Olv>L{1x^CBw+EiQoS`B3#wr!UN zU5-}W#(y}`qCh;mVUK1BR6`!C7UVwN{2`BUm#>HN#v5TaB5(*IDA0fY*TfuurXPGS zun?BVO*X4>ale+{1zHqmddlR`a*86hd9cpw0GHibSbS$#CO|=DkG5+B3DiV(4GVj% zIJZ@Cz)g`mduY4Hqg|`X7D_$FHV{eJ{AJF*;55EKUIa#pe`1~6C#oVV<ivwC?mV|( zL>46XBzL86A$MZ?ml~#xv1o#eE_5ZznGn%H?a+>$nw@x*8v36aNvU7mIC28Af?{B& z{y<sfZk&}y){Wb?Q&V<W*Hy(>18Wsh3iIGv#fvd)#FrZCXF?E?wAH8pyfxY}8p)IP zcYYeObVt6%V`xDZk(PBy9A!zzNNp})7D;g`OFT(R6(_YMqHBv0<T!i6b+yl{staDk zPw<$5aVX8K8#gr+7@eu(sGg++)J0Unu8;Z#{(tCm{n+Qi?+<;Dkzhqp(?<`C)rOBW z;@ijBR!9ooJI+3ZnBeT=5Mn)vKPKLZvXZ$LNf@J4e~^wkN7_WaoV~nbzh=%r`&g+_ z92iGE0BW^T({Gi9_qF$JKcsm;J8p{-=YYf=&^S88i|=qzu2IkqUtF%MP;e))AmO-8 zq>gqdhq`qTw_vhzM?1!daRYqTVZV4qNU4tBI+i`dc5lC@V}FQCu*!?&f**Ui?9G5P zOq(Q5vH}B(l+=a%S*kcP>Ri;310yK9)Sv(Fv5M)L?2RQEfHnOwBolqc8ogB$gM|q6 z0$7Rw&5pKLC)v72&l(y1j=Q>TIr<&<b=&gwJGymD|46HziO<t3tiBG7W=Fej`%N7` zXRKY@fm(rRz*fA8ty&LABr%4!k>YFytpFqT?YpFXL^|SRW<OI~-BUm)fc&FEBk4Kj zt?FJiFbSU^CWW;PRzlV`kO8u+K|(QT5YmImN{2WU!C-}63?`uMPE9Rc4cnUSRhmNM z*I=L^3@qnLNAs)4#ErI^YOsDcf(@4XRZTU5-r_5bkxi0rFGb7h)aWscc!}U$QpuIF zhW=V35vG*r!2yu~g<iikX6rYa36WG>Bw7E7xo&-mgp-Tmm@7KQ1=Ihp<reAJlER28 zjoWGRz$Bs79$c*vh9hQpBqD0vT6k%_xs+36-AZf0N|eXI>n#3CToQxi&|Iv};6Oot zTzZ?Y98It!u$*y%GbWJS6pQq*a;DIUs~RGzH3tsLiY4vK6l97EkR?#!SltB>)S9|e zX_Y=JHL^y%ywLa!s&XXLA8COT#z^7h)Gy!omB!;H<)RnH*T4pcA}*AKxF`kxs0x%0 z%Bfh2qD7(hDxA)?aVQw-+PDXzI93}1d>muE5=$ifkrexi5?gI>XuJX)Ty6Lca!*{_ z#)Z2{3VqIqb-@)cIU_joi+UV&4uj1DKWIv))r})F;;lbuNackOIu>|s|3Q-@e{shT z8WIL$QsT*JZTgou!=LrDon)Dma&B9%k2+Uy-nq~`lGU0arSI#hT)IGeLnp`!w1Tb> zj+y9m!~x%a$Y&K9U|~E)#$Ld}Ir$b35mYiP^ca2szjg#^d$)_DsX~mfYUmoBWTE>= zp|)0+=>+zRj{9S-H2jitZFBdPl+=ygSC*J%vdRr$2tq%4ECs!-l*+(bIbld~m3DeN z>6FcFKFw;pY2sQ`xshN)1vURcC*Vsn(0$y8<&Lg(n%5r+NFw$|>yulZx=piWhmb~a zK?i^EUheRP>3cBW(6;nuXNtYKBE)szUUudles(9wK2rEK9*m&FWzd$WBasG}MU*%| zb*T6o6Mx=c3XK*HLDmFrG2lTP_JxkGSgqXmba!*0v%4vMVYxzEI41pD6-9dfJ6RjM z?`)7q&MyRKpt{*AWK62boL{KnE@EBJW5i}#WU{?U){B*_aqmw$B&(m)Qyf{~6Zf1s zpj86^i@PE&#!OFdx%Xo6GrJbBSBfJEGWo@)u1HTYr>TQi{S;)JMb`eFq*6ABR8yG% z#6Ecg?f3wulXz;V_W>j({%yO2E8u8N-^)EqP{ITo4veiIFt(Ep=g4J;qK-7U4upng z;avp4W+lu#E?cn_Tt*F7WLLlslZCs{>4*kXl*{j~pk*DNR@Z|2;0(aZomIBAQkTM~ zlM^RS=207<H`<8B$oDt!*T<PpXD(57SwhgI|G-wp(6zc1elWL2&-Hx_4Warb27+SV z=dQCVTX)B3PwR3&<45<gcleYMB7Qb?zl3ikEB(jWYfHStbb5w$xI;?w&pxy~<B&+0 z_(-HS(LpJMusOCqY3>ZxS*nPWn1f2?xq4pv&=OHP5J+08;6EH=4if?3DIP<kE`wmd zW&FDFT~%@{^7%dFn}!qEvg^%zL{7+L3lr0a{TntBxHBG*%o<imizS-|z|9Uyf`V!F zY4OMEPz;@`*`BMhDEZj&&?9-V^685YLN~0TOpRUiJ~if5FTLchEKcSFq4}Wzb5lQD z2<m`9&MMu5@uwPCH_TW0`~58)s1xn|nYLPa%W*7Nv6ZJ(evzbcvdRlC7l#7)z@O;P za2@L>L*;Z8K-8*h)^W3Eku2tnBvm#iaC!pU!9N+g(Y6K)l@bx?@A{yVC_&i;AaCLF zz`aFyR<wgWD_XOkti$X}G>F%^TJAK_ggITm=yYx9^vWD$7fejxuIs|^ei+k-0UE!h z-ExUb)bCJ%S5IY4vlBX@BP)-9BT#X@H98HNEb!NbT0-mwFaQQGS950_ausaI_Gf0r z9<~hI02RwS*9AZB0iW}YWw<$DS4&scMsKASMH<8g5uL6n-!s}Cy=3#s957c<&nA)2 zlDLJb&nC^n_t~UZ-&l~Eno6#pO)8as<#GM->rzm)d7M<*!jw{){eaT*zxq0zAd+9E zEWvTpt?~SHD()rg^L#8pzee&?DeI(cz&1k#pKO2|FJ+{7nV@?3W(n^rCA~1e-z5<K zt_&1QHvfgowdF1ohoW`v5q!OHR}2(+ZJ(-QKtIF0+@0E&n2v8>;;b~EmsKy{5YG#d zowx^9d7+`jU*ywUlr$zOEQ#rt0XFgMUAAh|tcJ@Q%ijsez$sxh#ZWf>C|Oka3~E;T zunwFVYyT2}!60-MeW@uRv6Jw%60~{Wp^Hn+cVG0k0<hBxt`S2@nyHO{iTG``2Ve4M zv~bPJNK4_*Q0(~(wl#|zM#5YC*_R2kSSSSeOAnt-L55!hgj0fH`9cavOVnJjGg;}b zBw7LseAdJKl6FI2$1w9~iI@V>v;i%=O6~#w9wtw}B07Xa1njBDP+dbhX}J3#`3xr< zWKa|!zHC25Fq<Iugc;RwC;OR1FTyp6V1ogvPnH`1VUx^hXl2*>=}m13Vim3H5Cxym zfp(&Kxm{?`=t*f3Ptr0LTqc&6J{mm-O9iYOfx79ShM>+B@Z!(AGx#PqS;_!UkIi|n zK|nd+9Hsa-DocDA8Gq!uGo8_1)+vcFUi2?758%}y*~e1TnSN<*3c-vvv~rzH)iZ_0 z(fR`;K$J+B(w@iObA!{ni4I93b2QY{g*n$3oo48H$h@zHv5pAFwoFA$-HA$%C&a2E zOi`sEzXN`-EqjSm)GG}rm6n(>RS~46k|mi=kyj6WCLl~6b~te85SC7={8=b@%7gWV zL8dP5LBn;v)w|j7S&Cb1;1-PHr%BiaV`>s5R868(8ah{6ljtvpOXysGZb6WJZU81U z_PIe(M_yO}gCTAKZJ(<k7n*?!5Kh88ttQbIUlqP;d^HrCD`6K)2@xyfR$6_b4_wH& z<(6)y-KWr^W$!`-YS!$RxR1JP@HuMjDYW>pGiC0>D?wVPm2(RS{It~5I+`C(L^Ft6 zpu~N-1seNYA8vulK367;BpS9T3?jf9FiJ*-u}nYa3;bty&>#j!H5N6m{eY5(*grT- zXd`5$Zf9D0xg)bosl}>4UH*AynM(Vu=63$~hc!Ji5Du!lAJ{787zhfK?S^btJB(~Q z*+Zpdt}td@BKS(RA*C36(IM>BwsB!qWc(FX(FeA!^t6<+C$y;P&}Kwyqbgvg!ao5^ z6)B8W$}|HWqXs;5a$+m9n9j(`cBZA4VG*Zc#*7F~H)BStJhs8wiBsTP=Rjlh1~pv% zA#DF9OBhLpw1O&@ze*_;3Dm2;kyJ&%2#T42QPmvmB7r{+4+%QrVy4}8L&{bQRQqi9 z5PsR${r1Tkud<0+RW<zKf=7!wB2YJ5`fQaxI8MhG|AmQ~*|XV1jBGW&-cZGA9EmR$ za@lKSJsitE$D%w;Jm?v$EBW{iK&=ur;GBew3-}d%_se2e$#Q=0uG$HxyloX|7Jc{2 zV^{g)yaFeNI4OvePwXm1&P(np)U_A6UQA#{tp$;{+6lUz6I`?K$)uB`dvg@|mBp0p z%m}sTAaHu?9M2QtfIo9RLjEJQfrZ)MKh@Ml7S+?!Am2z&23hByp_qPj`9licmIoUO z6|)M9IQrsIf|4#u4B-DMRj5&MOci(!%qr+$N3)5lQi7NtQz``uuAx+c!N0!Lg9lV$ zjIhcVb{M9%K{<CWPETD(Zi_dMJJYx`-aQ&kcLodnGi8lHP2oq~jzy($Jpj;}vIe4# zd7>Jz;DK65URb-Bl^|XtRrF<LF3Da70Y$dUy(yNB(w0YSxy4FuE<I_k5;dPZ=)%;W z-jh6?#gET+qp1TS93Hh3OXn@_OjsA7Qe-<954~qG)hbDVn77x?gk>*;LBKvO`u5q3 zTV|1#Dj&RKJcJ=i+c=dd-`=_+Lq#dph#`vA!PUb_E$9n@oGY-<7<F##$A>jyb+dnr z>bA@oyf`(Y2=funa8z^fS-qfp>~L6fFjx;Fzv)D-pn%qz+PIF?2+v<SG9N4vgzT&X zp&0c*?lP7v3puf2$*-0?$n44NbDG*j;k_9ij8VmEqVHx_`%zXoR&IO>lT@XQ?S>C| z;Q(LDP;OkVGB%gC7@5^N%8KM}_A#sVltl%40vc2!9wA6oMHeLn@Eb5LR1*K1Bwq<v zThDupr*sGm0T1RnNu?H3jMj>Uj2ePiLA-@hv^zlyLOD@~<cMCFq_M4raLacxpcz{Y z$(Qd8wWw^XQ7x2^A9>*-wUeZ3>8(jpQ?n5zJk-)lN`C{4RtRaI_&NwL4i<iLHO4}D za%?VEXE_+!Kt(=NNjMa9RYrEGyUMcw?kTD1FxO)mp?DQ7_F5jGwbNkLa2%|QVBJE@ z`rgkbx=FgIqVy%GJQbL_)FgNev-RA?(pmr6$SC^8pk1q=8a(sbx55DZe>6I;2dDxo zq8_bTOArRJ^xN7T7%y$xrGJt(18E_;y`wdI-6W#hW9wD|#>fEMTNSX1WikmMeGVUr zKcpjwK^8K=YTwiX6*@W0)peo%)Kj%NchOaUp(AY8-Z)aJaMXLsUHnGMv`VCxgl}mA z4fJW>x<Nm^y;wQBecPMb>Frg)fOZs2EcUb)`^+YO;qX;Bfun?Xy9oR!nCL8`E!v;N zCP9D&k*aEe1Q{iZUZt%+VV1Yt6vnr+RmOs3%2bima#0vY&>@dp>Q4klFxr;dc4NV7 z;7%1&P_(oC#)35jP@*Qu$ViCmB50)kuo%3VghXCM><H~mT_&{Lb#|RH7EGAw1V)M) zQS!solEkScg@wU?(v~TgLZgS;y3`JgNSSVF#2NN7$-j(WrFGU{C#Ujuwsv|uFpqnF ziq~xCr)dS(BfO?bI|O){%3dUqmF*j+x6ejlnkvW<X;n>c_u@ARd^21(y?p?G$@_^o zl|c~Z^PZDKFqrKHhz1m<)N}G=1%a+iF1YMPU$%n=GPcgF#A3FL|ITmzV=$%|XLg3? zq?2FgC!AP3^sUZD#-<aP2?qgD9a$M<YExaAV|lXvNKQ9f)y`HM3w&lS#JlF4thQKx zlDGK0&sKHr${ZiOPj77$P_}q8PxIM+USQ0(DNxgQ-)Xok`~m{|?Gxe^zX(+9<Z{rH zPox&3<55rtWt7QN|8AnT{>*|d`U}0(;=90mDFh8T|I4B9yIESqng7<2EHwGvJqfsa zaTH(4)ytr08H&G2S<Kd=mF!{Sk#er0;rfEYj}x`xPa(kI%P^cL^@RoIgS;Xi$T)d7 z()O(@Am=8)b-XZc*0=$h90FyQF>QK;BQJrJ9P7jpXq!Qt^KU?9O<?B6!m(J@^5G9r z!Z;EPVuN5<R3K^iu66SX)LOS7GZv2FKcUpOED<wRw=B{H3)qKT9Scno2{r;2GNef4 zP}`HV(xssAenu)tJ9q8F#340p0Q_651j$=F`*|YnI>E?Jm{ZT^bdZNAs49j~!7N}P zmBj~N{T=wPXYx+ZG9Z_~_aNiQoG6dZhO6Ww`;lw*0@qOne?S>5aXOS9@8dezhwt#% zAK>9T{Z`F%0=}-V?y3*#aZYyvb}gGJ3`2l^s{w)3gMq3MsBR#T=?F?7%xQ93M`H}> zmyD~fdZ?QG7FavUMOdw=)*@vOJ5v{V@KOkBKg}MW0>gUD-hFtb#2SOG5>PPXVQk{X zpfORmJceq0Ou;Ozb!<{SUSrN}k2XbXy#Pb~G>ek0P3E^_=&{e^K9ohE|L>vIT)M>h zI4dDoMjK1A14g&U*&!GIDLbr_WJt`;9LgH&%})6I!R$!BS5S}hGq2wGC_m>1^D`fB z{@?TSHS@ias;{0`e>kU?0FY8hiX^2ec(M$uAMv2Y<gP~Da(*p|y4C$-eO*$0MNTgX zDMlF*9PSElX}A!){MFxyczsPWc`Re0&w`g)RiwblX^Zgh{xcu@&xAkCpX~=-fYR13 z!6N)NYJiJi(_=1zcL^6k-S@EKXf(A!s2~n<An<b^vjTv2KnK*m+DkitAVTXS#sL?y z!hiR0fMOtU-q#ZNKaR?8d-xv+1%Bg(1TT8XKl?9)0;&D|{BsZaMkOH>7~hYCe?lD) zh)n2aTQo#^NfCfG;1bDgRHN_*Xc!;!1q6us8Oj$B3Mm-_zJMeW4`K_NfP0T=0{AQa zgKy#|ECG=Zk<;D%yr*BJJ`h;~cJ=W^{Y&_#V0}5j5<o#AGOEJciPKx()RI1y)$Y_A z*@<D7Px3kaCoi*A3TH5Br3uQ?^s_Km<j+E&e|}Rd_PE5s82K}?+jWj#K4SS(%O@}Y z+48rSuU@`(xqW%j@<(9FTmJ>HBtVnh|Fz?HT4&d3)wQnE#!&Q$Vb_dG9MD6WCg400 z=l{8{OH&N#>yi~D6uO*e6oWlhqR2k5--B-KcUoaM!B$QXbVyuKA@RZqX!wx0xBChm z?7q$p?Y<t;^TY0nsW|zwv~bRgqvQ<eq8e9@BBPm|dR5CDi?Q)2x~UqY$tSFeAU20~ zQZ=2sNFQZU2`7xE=fdt8BcDSTMcRF*2&+Ur8-!MROL{CUmM~PR466obm(x@eR;}(x zauO)WBK`*t*DgXgGaIYTzSzsb@>FBBaNl-YVxDMZ$BJGPNMuOU*v9G{P@<S>)E%;j zFZDumV_i;!AZH`?=w}KO$i3Kzy?TD5$8rsc1rS1y-1EY1oMY(=<Q`WW>$nS0%cuwC zp7*%HX?z@rO(-x3F7yWIw!JsAj+tjMApQF@#aw_T<9bX4r_H$%b<6cV4AFjz#^H4l z97-CAMNzl9su`?a5BFGpMWCWsazkiKR<1nimaquvT%F0p??f*=8p*vtFs9G5&aQe> zrS%8XMRg}$(M;iL>7qf;QC?5Br~Y<We^`(8b8jH|OyL5G5D(f|JyRG<9vsXcmY~Ku z3~R|<?~uEirGl%mdZGBJGJXsmF>~;NmvG0yrgnk*kv%r(#6|yByY+PuwW@C949m4E zfqi&Q>*PB;g!g`@UL06fV?;QCj0kZnpE*`Rh-ZH=n&wkshmDc*F}x%Jljc}Y3Pv)< z{CB^`I@^!bq#ID(NBmkl$GY2SdW{OZY>dRn6I2+FZlqyv8clCdVZ1T&4KfJTlUqKH zc0nA8HXi<$v<^G@Bo7z;YXWB0VEAfULxuGiBiE4INoDOVyc4i>tA4Kj7#6dSYp|4f z0w8`)tMT8a@(*{%9x^NK+TZGTysmeaNjKf-0h(dkX@7o2gA>3B0zBb!PNRK3c7d$I z?SRiK4Z#YJ;SD|3GzLh1oY7k?dO;q&HAkNs4UC0;a8hDw3r^{7DQey^U!Jl37xIuL zu-qev%TgI%>6u<|cY2I#g`Cs2d-;K&1x?xZrXH3*GM=L{gsEh`ii!UtW{Km(MKJ5A zZS6W?#I~C{Ay9O;^7-*^>J<~A&2=ayLTQ}JuW#`N{d#u6-Pz<`DWy_=ktf6J8W{^B zB1_o&pn!YP(^Va69ZnV?vAqmoFB)m_J#b3)K9ry>(j^%?-qb^jfi*6nbE;yZB^O3T zd3vTV(DFvqk)lIPUjkV55SO;l9>bsXLb?%~6jS(FLm6x7Rn+DH<GSEA6v3K)M3$75 zAfU&=&n%J%F~^wV^B-IM+=m6<j|Z@*YX`BYpSuA=MKbRp8JK3KptSztj;biA*(W=B z`D6?1{Odi2Z}eL~*Rz*Ndk$-ZC9#H^uybl~<vS^#g_v|2pHaXDxi>T4IYrXazJxIK z6TKW8QKNI$5%VZEzE(HKeS&|<&7EZ9-_u7`#I#!^38ggugqx3W6U`m4`Xm+?Y}HRu znAL2(sY})@YxXRLUK75hl85Re7X99r)D@)?i*heCg4j8st>4-2YHQ}JJUMEZu1Zap zO%<RGUVAo`;PeKOersE?G7sz@9b+uggTD`J#ar|kPhyGMI)W_rZr!gj#?X4Xal2j~ ztgy)WJC}R6-PLj0Zk>6gxTqfxg9Uuj&X9$8vcPYV^nS$8!<~lSD7f|G91S1ZBBBWU zTA&}7w2}pOaZT~)!)^DmAPP+3uO3DnDbVI>T49nTgD_yl6+^>a=wi2Z==jeb68$X= zvkF`9lUBcl2fxvS_1kg&H=VmP53bQ`L%2@ZdC(zS*JEkbsjs2eYbj!);ap4xoN2JK zM9<6hq;d^WN64E)8>N+Lcj@igx3x<iJK44GXfwFOQH_IP?Aii!)^BPH@tXxT-w+St zL_9bxSG(Oi{#*vwL<t`3YrQjNT~o9S^}MJFRcc*@_q>9fH$_hxa32_ar=$)J_jT=L zt|B3<LgHLSJOaKw;DG5IW^1!W`YIicKJC-RDLN*NFeDiukkR`G1O^Q=4EJ6KDW<#- z6B{=*ewr7r`^47uT5mZX+@M`t9lcQxnu*R&cP$ASN<Bde&Ko`i&?u1)Y`Dlbp)cqu zrXIt6373S(_SGY@ecct=zF?rj>UB^KD#I>=Gq;LZ!!GXUdReVq|03GDWaHky**tQq ze1mcC24Xr$=*Co0=N6JXWSS?oToOZaXXnp<IA<WN3}Mp{;O}S<%swqV;Z5sb=7g#- zg&%h@g{S*6V9zrmcLeN0QdvX3-hGsfep~N8?miB!?r>oe>YcVmxA3I`7i&Pxi>}qp z#_A|49n8jP-tl0`epn_Df;9g=zT^Qcl$XRwa|w8w>czT3dJ1<B3k%R3X29qNI^T4D z_XUj22E<gs%lZf}8ENkp!|-_-X;;Y_V6?Z%dydAWm~D+Fl}l<FmwKRC*0=t_P3Tbr zq3pZ2XCriemcEU<TU>oh6wbaSdv>?<W0AfWx7<_eTc@91Dy`FFDg`7=Q3YH3SExxV zrH736Kc}F<&)0XgNh_ICRKw+H*`L4E{x!M?RBqA+uZ8w+9}ooaQ^(zhOt(nm#s<G9 zW*WuM2Cvr_hXQzipjWJl)4Z14DXCv691?m8{i)XS0G1FCS+qdt5op$Hu16Z4L21*v zM~%)ijMn>)7&#z+Yn67ETlX#qj0WUz#K=*jKl=ESzpt0PZIl1GU~Qr3Uj+XRfq(hH zFdY6L5dYBFadBZ&$H#|Hn~-39apLqRW;~hr)So96OkVqRVTAo>Y$W&0x)+0|N6v^y z3{4719yc>=*7%o(&kmn6VXkqWY5p?{Mx=~fs80<{3wb$cks<wOi~Td6&K$O6GV@Rh z@?a2G&(!2<7wFvqsiRhmnKyP$@T`!Oyflx;EpzMKFS!@G&F+=%x7>ep|H-||z1qFT zo#$rU`R=#fHupOeRkkYtC5<%$e*5kKr+Ii>NN!-9-wHZzj9E2VyJ=$t`*+J58+)Ls z{)ki$iORT7U1xx4fmQLb<tCP*en*_CN6zInZ}elPp+bv2(NE^-73PWy-4<osWlK<8 zhecmX#XYn<pBog%SR;!8H-f==Rou%k+%ucUY>e3Z=L*Z`F|F3FQYPOW_ItCo)RXT{ z_`R9l2-Ca`pJYKN4!d)I)`<SHUv8E&{fhge+5|sj+c)COrtmys`{&H@BNpFEoLkhr zf-<eF;0-7dvYa_Sq}Jp5A8(-F$a3PYZfhXiEZV6IWAUA;_Y}J==rXXy4eEkf73c1; z#@AooAiO{VX-FUi0$J%|Hx?7Zzm1^qyyP}M`}F0Zzu(v&u{XwPp<A%+7tu1A+CG7e z39+PD)J!Tbsk(N<PAwbHKw!N<`GTf`-k4^qJjQKVmPWdlOmi}Xassg-Bb|{2D*-W8 z#DWU6{^m(*&&FUlVf`@%aChqoe)~Dn`wVt{>(28z=e-?XkKoT~cWMccT}cfB*%yMz zM@wo7YcT6Q(d+g6TRrd5AQ8l6A)G<&qeVya5$S0@&UB{ppTHLPO+Ejxi&Qc4qLm_5 zB3>}e5@0jb`o37hE_a!3y^mdjevkg~Gd-cug~>(kGu!{DhpHl+=?lr7P#An$2Yr!_ z=?%#pQK-EMqauvAu(cD;g4^NcCGerVMm|o$jnA(=wGEq2WS!#PkPmE4A>$La@Nb@S z#e7V5u`@cP5@DPJTHrB`AW9hS2$Bc^jv%Svhpt6XI%E>;7a${~|LHr<`-7=JPG*$? z`v+TLsdY}A%rcLkbe`)J_Y1QAOxBc8qX^}zvC)E|OP__`4t<u#@S$ew1^-R6@}`Ty zEQ!UFJ%)C@u#}k=YLzC>0;9HY%46826`D9uGLfB!4i<+YayyCKflm8FO>vkQ<r|OT zCX9)oUQ4jT5|7st0okYRy7SZz?{7-+(LxW?g|{!`tElXynM<;^p7-A=vnsN7DlO8i ztki|aHh2s-Aod`0WUB=E23V_;RIm)Be5%SUkEzV@Mag57aTA;cWo{joYjUN7TQOM- zUK0v&En9_keTIa52;0ERIzQ2R8f#i#2EZO)L_^bCd-SS`mEqR0K*+`K(JolP-6O`Q zGU_3LcJ*_&ZPn6c+29qxuxE=$0bKntf}cIe>oH^m_G_6F8(j@sXdw24i-8q&gobwR z&d&50?&+PtkM!uVw{D+)N3TA^n=fL`Ll)QN{JK+1kL{Nbt9vp=7aM6Ty93wZi3ZN0 z&9gO^*a`>m-MvfrDfft7X}1^C&ZpnwU!zipm7W3%1xXZs5~%dO8~1+5YFBEopOTFK z0(R<ogcnP(N3^XO4NUeN_Ytd08oUw<+`JtVE`X`CGx)_6%#gkkwxpzar5zRz(&D&< zys?h-6KQ<)0}e90QnL`|#q3P!rW9CcG{7z+12A!t1-ToZ{6sJsI2YnItGe#^L`D`| z&UD&p<gn>_VU1sLq`Qjge+K5i2$}DWq*kbrR%vAMGj4jN1`poDFK^n&|GJ6vOJt>G z=xU2d=!E4KrtMX$dg#)NSvv{DIypWvFsJl@_sSdaogo1S)?-M(*M1U^y~$jC6-a-m z!=rcUyN$c_s;e6YDWbL&5~?UrM3D*wQw)9%#eaF!GJ{z7cnyBATbj5p%3y$}DE{4} zfHR8LKm<Y-M8cBSEFsnt*f2}9-I#sC_2LOA4|<_9zK<^W5gU$fnv|gw3apY5u4H-c zrd*$ugIvkatpttoAfJtHnw*lz1_KuTG@t?j>j}eeu}+GBNRp!duwtHk<D-DXR_=Hm zDS~B?{DDDN{41Naq8OFBN+Yp`GV!qQw2Ta+@9AJn?Qg0m>#{PvPgs1)LRJ(@rB&a; z$b^6P9^tkj!=dq3V=1DN380^sGnXcY#q~D}F)JZSN{JCK#*;`4lf5d<7z->LH|h<q zqXFJ-*4NTEbZ;tpocmHt6)|TmzaZ^>uQiMDjI=CtA0`QFdM)T%kx;KSk?~9-TsxTJ z^je;0Jf>djGvBHtOy3h0{kL*pf4;qrE%2VOD8DVoXs}2x^X5oiA5nyf!aB73pxpgC zwh}q`B{XyE2&X}7R0Y}MNwHhzZ0TF3$oRy$?+I6q$5i36c*u=LSYUP+;3ejjIV1rk zk?0=8&f(vgdtn%j8<?yCj({Qby$*#!(BNkZou{|Tyf)EZvuM(%cn7VP4#L?pl+@Qd zEFU2b%h5lAgjWOWKDrofWbp_xZ08K%(nUYkDi!3tu6HQ@t2-7N!-LL(O8#?ls>|gI zYWR=tSX2md0hebBYQ2Wpf!_C}VQZk|uMAhfcE5|O+_7F?aF@BJt8Zai^eR}0EB477 z+e9SQ4~*&>i#Lj%(`Xjo>KJPP=|tIPlZSMdYOzFmh)n;7zrUfLqyaN_zV3O2txBFn z8c{geZc6K7v)y%5Gafm}>z>c<hr^Pey4cpZvCduhd~!dckPz79WFSmk%-OmZ;=^@y zQ(5B#-6sRC>5I#NG^aG1!>I+>B<){a<^SqRGV)wo-3x1w7xp#JCl+<x3r%&;@wu|P z=Pr|&13TE*)~G1!l!JPI5NL48^en4_&!o%~h520ctNybr{;}PFb%N6+S(}aqIXfpB zO<=zJRsS40R;~fM@%&8~kKMJMx`uO5LkMJv+U$y@`}|kj+W?w|mx0uH6^7NAypfw? z+hwl%g}G9TW*`~s-Ckib*DM=jHgYG64#jp`l`jNW_~!%)1~JVBfqY75BUPUbYvo*n z6OC-$xE(hC0kq5S{nycd@YjX_&v4+BPu(~}2&YXBXpJbM^Zfx`olI5JvjWyNN1coI z1SbaM_!vT5?@6Mo>A7&kI+o~az_6l1C$rG7%-2!Jyiv82sn+PCLs1@)CVn#PKFfdM z-}w)V`dd$4R0Xzx8Yx^wry0U^A7uUaY<ho>yTT%wwX3Du5CRw>^EvB(P_!L0t3+@R z^B(J;Fz2o7<;?*Hn_<yHmAm~9#s^@-g=6HdQdfj0eK9%1_B@cIfnbHyz)2pJAAdaH z^l2+P{!;<oAn^eQrw8!A91QXbwfQM*7XwRjwP+;jQ=3eCsLdy_R~UIbxdm4Kc)VrV z$MBv@=hlrA3rc}4qDjfXVEy+fQ(~~r#D4{=4Zq;6CH~chQh#DW5^^lIJ4XwSe$Gdo zB(>c2j1}7dwPI}iX0svW#_Z&Ip!7LLWiH{)Piiu&V}mJwvk%vb0nj$7e}War8`mjM z>OxP1)E`fY7|Wqo#CXtE?h&)&57T#&9TcI%6iCiUt%5}?HU?EUVdEg+#FOdnRtOXJ zyutA>xqM9{6OXO32CoO=V7)iWBko7EI-vUuHdN|v>TVuOQFd%fg{`)d0VVQ!s2+J} z?CB~1ybRoYVuMSTl>xFx@^?Ub7{4Cpa2IO{Wb!N_Tmo+H9(+3h6vLiK8qW&VX0mNh zY`QX6VOC=MofQDbWBVDd28%h0?q;ykG*ehe_GXgQz_i8xkD1iNB>1OU95p11Vg|8e z3M`Um3UmMGZ2regs!1m4Ny)0w>6%H&^k}f?fRl3|r^`sIhGM3D)HDqqUwkL$m-Wjr zSu=##s<4yqpZz7+SoVB=o^*i*So$ig72Mn?>WW3si!?`C7kV&M&qYhAN!|HwN^h2x zQ~C!*XY#AchxO$ETp3+UYyD41h1Iq;ceLH8@#ks?3(u_R9V&lWw;d7JIVWB0K1Z5> z=yk#Q{@W%~(L0L$asH)0BJc6frwodI)TwVPhD|zwz5R9>z&xk*e_gt*+<%AOe{+xD zJo#o;(yTUw7!*;rHjkv@G~O-rFw+ok|GM->C|=t@ix}+Kt}AMSb#yvi9zgAlt+eP9 zKD225icXd6tO3Fc;lsb7mPyw&6J;JLA`ns4(v{k=TJVQxH@s9!U)1K{+^x;m9xJc# z?#5T%<UNw@5jjH3wON6Tc?n1C5sm(2^BcKOB$aYZ+$Rw%gW79Bwe)wo%$I9vhfXuB zmOh{xj^A?allXn0<3`oe{kqCg$8hf&?YpL0x<`A?bPQZ&8s8`!HfZk05Wn@BZ3(sX z8+vO3xjL+EORl9)X~SpM(wDV9_*Lp?{08Yp&LsX_+ILmhYf${9b-#m;K}ViwlrA{6 zmVT(;;!{hv=)O^ruvOYUzpAC1wde5rKr7&PjP4YEH)&E{sHH#D{0hJObxYz%Sef3( za%@OHIxj70-jwHkRKI#HHzFcp=HeKtg=(Z^l2tw*_<ZBj@AEgGJ5)n!@VCDDqO%d6 zzv`)wWAhhGd48&&Di}s6%Zh5WAyJ-wv29MprcmWk)Ii&8LfdS)E=)x;jXiU|1oP=I zShh|eZ!eF#gq=~q(r|(f;ZCBZA*dQ{$bl);x7cG2=OHyT;J?C{^&xfs;nI43I~wwM zxL8!Ya(s@D!|myHVvkKANzpj*-=L}6K~X!T)K)pQ$;q!72<&sN6~UpaBr&DuTDNJb z9iYvvh(Y2O*_LxHJ2cb|CFMk1y8$Rs?1|!d_PK+>RNc4)``C5h@BmPt^FWBY{F3Tm zCGaXF9p3||>GE~-!Efncbau~9zyJ@yTl%=uIB;i>cW*iqkWO&*FkB~)WbQc`?Qlx! zO+&`~AQi9W&Xh&An`5|}XID_jPhVQF1LfQlRlz0$EZ$Ws0j?Z7>oF%J7=!^mC3CqY zUA1zn2B<M5a{^j-sc^Qd7F(2Kev4pA*HI}OOjFFU3Z}Kc>tvV{(L=BunGz$esSkjU z%g``bVM|s{m?E1>NiqP`lHkT$&b~qU(n=~M%T_gJ=@*`ZRw>c!ap$8!@fK~LNoSEU zk*i5cY$+FW*>Y~awEHAm$6T3G@2Yp5Jl0iPVM#@soPYPSq^q*R8roeMDzPSXRqCxu zvW2=qcy>MWAOL#;KM1n;3KQ3NSAtqHl({~Qi`K)kAOK(&7?9g)G<IBXIoq}6T%5~C z(&dDWu`ql6<CHDFVoaIv+<HuQXug6HCaw3Tp+y?5ay+|i%h~QN=O#aP<u|x(?PAJZ zPK`B%>$F|#fbfpmaxQ*0MaDJ!TPXeroVPZ#BEInSU|h?1=9q>gC#Hye4SFEEQwI}$ zoI9&peD0Ctxn)A~diE$VdIzdfPPV*thur$6twm8!7Kl!sJW5c?;eu{`!?A{ANWR+% zyT?u^^Mkx5S&9;PO=Nn>cKym7?&ehzLcx*ky7`dNDk<qg07mk!Op)1om6#ayLcPUY ziL~`bT3;sbVeG$_Y5~|jhLkFzF3i6|$@33^ZDc-njHH0w$h2LV!XPmvgT%s_JIeec zhiKyaJ|#Tky_qDxmy%#|pGWcGsF}<U38LH_+0xXo<?N9y7n-(Qh&NDMRJ4K041egF z{&35=H33_=`J=iIdGajdx{^mSR>PJ{Zv=?$wl$+DizeR{pCFl!*YHLFwl}xW53tV< zvd=fz=Z~<@A0_ZaZYNYon0u0`6%>ddU{me7(ce{-U|oRQ2QN-vn1(zM@XT4}s)DI& zVp=Ph&I(x1<7tk_t5>KBT<g+<-d$s`uL-D0Hf*uaA6}C@@|Y((AS*L_S;*rYJA>0o zH~^NcQ%YFim#oi}6z*iKlS=Fa&lp~k4@G=%i46wMBTC+ZVm_ec&oEHcloY^dn=V<q zGr>xU^>!OYsc9)V=QfgI-A173NsECAUJwOR!|g#-L=BDog9W)Kn4&^5PVAtm330Fu zC!v%(M&YeTjG}g^04Agfv6a|PslB<}YM{cWsZm8IctS{<HG$H2<ArWH8?U0aa9S0` zT<ugJ8cb%(*?uI4w203_c&V-y8qu}#p9Wz^XBEZ&YDgka{!fXV3l?*wqPC3!Xn)MV zrxqNzl&j=Uf^=d?%^2S|P~FIlkO2eb3$aydHB?sv8-eDju9CSrO;ty(hEoubOO~_m zyZ-3z+mf;<IGwwREi_p<qp6rb-@ZcWr3UD#4<Dg1!m@3P9ZbQXM0&1o%ZU_kb19Z8 zMjQon5XP)x$s#3(>6O96#B`pNgC_gsjMysc6I_C1LSN+6vyoN>n;?zrFdK-A$3692 z3)ngmBvUV4w#aJa>$9>$mS&vzoBHSKKdCRM|Em5k^=cg7Q)jAkaC~3ASp5ea)6~CF z+i+Z{{*^i(N4t8F`u8|4Q2$b$hvPr|-t&tc8$Fiw`?KGNet-A-Oq1vLPtCXZZNT@O z=Bj3?pVjX*zdM>2{F3|@`rQkBIO5c>StI@#lr~a1ym&;@m<^-z{JtJ}Wz2>#{21LR zQ}D>(;NYO(@xf07KOLOsXA9dMc4XZBae02;Pfzf|@!HTlzrT*UJ%+fvI(FCCkH!{{ z{buZ1@%Ryb$!7;XAB`=CFLB>7HeGwf?}A?)KHlRwzjJ;wwC8X|uA{XDx;7kp{Mzuj z;3tKT*S`nn#NEf=>)+}3(C?IACw#sBgW=_L!gPtu2WlhlpQM72WDoo$5V~gZuYyWo zq>o6p$<7rNljrf|<$1k3a8CYi4_u3`gXu8jirx3yu6x@f?QRc6eUkRe%IRlHE)e(e zlehf$q4!k<WIK>|mS60R>Xd&?+z0*`lE`zFzaF=}S$Bk-yV=oob5?FXMb5wL82-wW zvAY~3?BBXi^u4n=bTdhR&s!%Nx`&(hku+u0sXr}giht!d@A*&+_58dulY8n<od(>5 zI(dHhYwcwR-VT8KvG+5wxdQq=ngqnSS`aFc`n>g#FMR&%wG)MJe)Yl;?2S!*_#nB~ zt@)-c@Fy|klqpMj;>f2d|9FTy9&b4M<D8ux^%(Y2f45I+*_k@~BOjdqa(c?56Rz9q zX`HX0vp4+O)ft}>cNwL(O-WZR_(caP?CYh$zgxdBrJeZ1hW{=rbbZR6pT>|<n@0HD z>!&SuNhsysD?u+$-EtGVD^UMjw!=BQspBDe4k`8f+&@j>^q)7YaJ7{G)0VgQ$+ltx zQ)-RP_j*vz)87zAbr~hk{aa<r;y-L5CHK*SXS$xte*Ypyb`(43#vgATIr$aYZtKVs zzGHvZR>h(@L%L-v-i*(Z?kOTA`s(edFX}_&ACXWWmf2pvd~aC=DYt=IPLo<r*UIe` zsI@25YJ*y@9;NO}q0v!bDHwVf%!&Fzhf-U;CTQkNZl0SvTkouQ+Avvl0`Yf7Rg|n1 zRO`U5AjsF9EOM?(mI|Sd;u{cqT~krTqZE(;<9fEfy1tsdU~3I&Xhj-f3N(ft!Yr`D zb;wpwMMy!()qva@uB^|dnZo4%<iq*QoGAow&*4`KKHPK?kL%znWgYf4L1M>(!9PWX z*5C4e$o;g0G*pQJxmn@bL#6TOsVtH^(g=fg@V3St{}&3|3#<u>syK)t<)xz99R`ZM zP%n5t0|_XQz}pJpb$%9Qj<ZMqh3Yyaw}AK&CnC{xr?l%3Y{C%g7vLBr12r<p;%D3+ zXx{~s=p{_zBk$YL%wr|Vn*;VorezF!xBi;+w5e;-gV=a2)srW=@5FYAOEHoZfjisK zEuceF(&!fIStGiIA1ax)X{su6HJtjwb16iDap(!x&wIGDwpJSDyFoE{wpqb<!m8>~ zmWuBUWXU-gV*8`8yA<7r0M?bcO8s5`?T>RMDC+OXq}_*PwADYqSDtTC)FKzak%;}n ze{TboTXKN2`w#{CZT!j+_oUu+KtFK)H=XNU9Vtu{BXaeX;_-Rqkn=|GeaE;)`7?Lq zVjh5Jq+BoicO9Y$`H5?`KPj~Y=K+clf)6m1FfyvK>?x%%EUIyBciC*Epusf`J~*h9 zY?7KVu&5H%fUnA$OjecYWfeD1$t6M%CUV{EX@E)#7pa^iQMn-Hy1nmYYPnfyg7!5J zyq1_Mc)iQlD1{qhz;ae8hU4(sBR+flffS)kox~Z+N6lyA-+*Hmtwz~Yn@+DhBoshq zFTtd#^K;M=cL*HUDXg7zXq9qpcfnoRVQ5U6rp}<&{A^JwXH|YLp-iXWl6GIfe$?}% z+)_EWnpWRhDRaFfx80D~&Qi8>l<gAbDwHisU1&P}5y$W4>i2So_i{~pqq^3%W7Php z&8=NE3byky+ffO3gKOZ9ahNgL+V#0tEotT_ZP*bx>I2wnW0oahtJszg*wgGCwvH9p zOW3gv%Z0XfWv;*F3D~_iHZ(MxY^YDRb_yfc9`CLO@2bpJ7mCdx&NW<YXl}UBau581 zAmZ(=_DmyQl8-Z1hRK2g=Sl-#kq54#bMy_D5cVtyn?w8)xDMB9*`%P+bETtSk&i}* zQBhspXSz>zH*`04U$`H5I`DYl#XvWLeTqt+!Q5j~T$`nfShwkJs_algO4tJ+1_eBm z9I6csHw-k%baxBKb4M46PI_*U6mGuVEwaOb&9F3tQWzn1V#vp?8R|nRp!Xw*AO>{A zVvMH18@7gl7()^obS9x6C**a_0M#RMM7&hpzocb+;8EMj$4LyPJm@@d!@(>LI@6D` zH{kMP{#DPk40Ux%)U8zS6Nsq~KGIL}J?KpT^x*;81I77Z-Ugoo!3Oj7$cf~=I<O&g zDd>DfkpYF2_(ro`KbQ25K4iMP2o}G#8roJ%Lzo|Seh$t`QT{~XgA{InhWSH^)Pg9_ z$7Z!i^iE#=rKCmn_)!!;n_3L@3|bNB=NE&Saxp)J`d-3-j~pV_&}a@T|B#A(nYL<T z6R{n4>?=~MG**+NQCF$~<Rq3*c*$onvzBGM;v^tRrlLHtr*nP*?Y=y=BlpGbuGF-@ z!Y=*(whsvuS>An}yPL9Y6FH~5ugf|DZ*1F4E|j?7!MVMGGmN6LfD1jIHTuHR(fkJ+ z-rtxLxIm`;kO~amL<Q2DsX)U=RL(8uf=O^24Y$#7lWE}>48Kaw@F8_yI8qF{Z)*r@ zm-{fpv5z~8+3Sxm8g`*kAx%TZQrD5b?pn%Y9gTYRSN1Yn%l5GsSQmSoz5CY>*i$SF z3_m~s#`@a)M^)|&aj@JL($qhykE&2NVX2r%TA|Q--aHy#9j2R1?pX6gC_yY?LQqCZ zeVcidpn;e7Tq<aoT8Zrpl_Nh$G07;IAGxF0^l&!?N@#>y3N+024^&mEN<d576wI}r z571^@{?~gv#E@jHd2&~c(lT-29wFjAMvC{7f{NxAQ=<&53%n5caPUT^Mqy?>kHlX5 zX<{V9le;P<|8rutO3Bc~w*7_rt9_V#9+)=e_9Sc)&$Kaxzf?g%o3MIBzFShUMrj9s zE#Qw%6gU6s19*zfw^DpaGBq-5@eM<3&QBM8aitRTMQE$|@(-2#Q;%YW!p(9@xMAGO z^%(cE^$iu_lKR61Ro;G7)WKxj8qgLnM;TKWY-q*-p&eDYTs1jwlRZ&cXi*owtgx>_ z=T(TU1+X3^cf!*_CG3|n4;brt2ul;TD;7?|l{jeNpmazoh}%JuFDVjAnALE-zERcq zR=2Pl0}Lw&$haogCX7BL)&TAmA2w0JE>|^NF7-4tx$-HTyZ%ABiYQkT1~=jWBT>c9 zRbvCrL+o4?y1%ImwffT3e9xK-@;r7q3>VN(UTJ9Jg48cdRTzOFP4&w%%kyHvuv!QR zv{v;l^JIKY`41?@JSNwN&{+>->upZSFp!<qzvT;jSqtO#SPUC?bI#pPgzZwbt-K&~ z;P<BRBT4LuA&HGZfM+7O;7_4!V^sYS+qNr7JfQ~eKICn*!gHtSd7X9cj@b4O<!<2% z@=A^hS4m=#-Az7kd!~+{RzLr~n02;NRl|Y6{1sa4&W=i;t7^_6<dZG;3$CJAa3it0 zU1aZ?8eJ1SVmYRGyoEHNRVxq%-soC4-aC(PJ-&yHd)K<Li`8Hs_>&{-p9^16fHuJX zvdsRvL|vyo%HCtHF@+YDsjKi=rY+CAg;E1Q)uXWJrb2-+_GypID<Mv=IP@{r+n~h} z$g97`;7W}vSPxe0mk6gtQ9ulCGT9blE_p^s#Xv69=ichHPbO=YbFnuDZR!&KLBzy2 zs$w_(Tq7k!P^NM(OSo5LT%r#<S5fc6c2DOTntyuSK;8gXxtm?3Vy-iejy%<M)uG)k zuynklVp<v3Ey{I*a;YT3-@Rq#m8v^Ls$N&-qj^|;DgU9Qf6aLoD+SnuMP&Z$s#I7~ zMNxWO3u934BD*T(mKVAz)s|-;WsJF!XRB1A$AnBV4b)pkI3$sTSB(+U>aXOS7NFoT z%j>V0e;69)r_V8XJ@`CawU0;UML{-PR*_o3TwzpKb~|miX|G(0&o@LmgCK=t%XcXU z#&>&Ft-FN=xXH0&4`2S3Qn&`&o=ZTs5JAkZ_Q)_stFs-Fvmk1^#;`9dP=~nJQQVUH z8z|`u4NWawySeIt@)Zh5n}Wr)XV4H|;7&Sp1NtDbQNgC7UKOP2Na0*HcY?XfU<`Pv z@O70dQ#z#aImZu#1593QTu2i`*Cr|@6=+UMC56keaRmwAl?cw;DfpFuGGMOK)~m~V zihEtot)e+FBTM<Gq*xIgfeNB(drRKk44hZxO5bIW11A7q-cd0ba^D)L5IyQ@%Tx?< zPC7z{W_#{nc7|kIW9#<V?t5(2r0c;0;E`$9UnH(69`0e(t*7;rYpo<5)`H|_q|tbk z+ZV;$n#A0O<V6k5?J9}-mUWyrw;Efg$9C6)egZNR<y=W4$AD(4n=M`B%}B~9CaTdn zP>Gu!=O6naRAM)-X+!hB?)twMy9_E_G22!hZmLFyego`$jZcGm_BiD-yUDgLf8DT5 ze64u7D6vORut0o*=fo$NmiOY&CpbXbXq2@KT%S?3D@PB^6GvYkoRme8EqH<J5w5Bq zs{7OrtWx2e_&n&lg*J?jf5Zs6`97W*BU+TKcvtV8R)-F~6M)1O>RNTR_`C`{FE#>k ziV`wJV!)>&5nSNlYQfO!$A&XzP_bj2eu1<QvO{R3>|nN++FzI3SD}0>Y_4hDXJ1<N zbL=P4o3J_yiu5&s>XYgpEmDnyJA-xM+u*ZtMK;{_rjR48uWz|KcvXK2gDxX^7I5XM zF;#q$9F*2)RF$xBze$!>NvGcw$Opn;Tw-eTrpKKTYP|t(bS0`7>sg^iJf0U${7dV7 z`0At9dtJr4=Az1?CNcsYJU8yO-Nr;~ux&=WZ0ec{eY@BqPk7ohZD@;}kG*vm>n#+g z`gN&#vbB}8%on-WY4xDXK<j)|Yy_fip$&drET-3K;VM~;3L*D)c=A-&c6+O>s1A7c z>Z8|88fXW_?Ebef`bS~9YNgf^Z%aNjk=vM-iOUqu!7g6u<C*4dePAH8N)5ZVDsubX z7-kO0SJ~q@XcU;`sytC{7&KX^B2c75!A^APoO`zub9!<h*%lQf`*duQGF<o6VJ?Y2 z$+PoRsv~HVnq-N}H?>nS{8CTF=u3y<bH3$^{tO}|6Yik%5@m}&01Y(u(&`rVG8QS` z07fLg1Wti{MP1)o->O=Q15^Vo3e)A4$*PLC<d_YE(MuVdq+B&BF9b6T?^J`#Gt9oZ zU^Vrl5`+YDkO(i310{es(vNykm_+16Z@C-Jth|iZAYNQW&%g4lQ187uW4erMOPO#U z^Sq!TZ)S7rqe3Omov13P!kAA{_FE-(PWSWHGUPm*A&nohE-JC4$}+95Fs5vjuQ0sK z=qm)2nS2GmvUp!XS$04v$jWK}UwyP_H?eg<K)Fs1+x|UPA4GhHT?cRF$d|aT+=3>e zMiYxjc}jl&ZCkBIxGn0az?%q_${5RNqPyaqV(5}v-{OtQxv{(LW0I3wpflPnx^KBP z<gWW#2JT8CuI=W3ej5o@NGy7OjTrciTcob=vu~qv4lNLS%V2>lBDp1+uBcnJ^j6H; zkjHinm!zDOsNC@h^+-RFM6afyxDckVk4>b_6LJG$Uy+-GbJekPrRL$e^4K7=KVL@K z;y=L<Xf(f;vNj2z1SeO10Lk%NDL#j?f)|FvmMg1Om>;EZ)wZks>WHlrYxJX-wmvK_ z`7mt{1+pp(CLLeQEXFZy2g!8;mYm3SDANYk0O&Ic5d{d(-`w5mhxK3*&l`?h!m5V^ zJC9((88Y4kttZKc57y0u+fFowqO!xI{e)_`3c?Zc*q~#1q^n4zlf>%5Po|vp=W{~q z>&*ce;9#X|wBSot#ctG}H|se!^hNw>ywZHMdHIl`MAa9J%z82X;B2Zk2?}6H`78|Q z$e`|JDb}AA38I-!b3>0kNonhIo3YE$3#krkad+$YO^anWa%A6oJlx5sithU|z5#;= zY{PTEH}KIZv?Sg4(Rm!U9g+lIB-$4HQrZrajU;030lhTWy^Op_{>aVp*%W{BrUxpq zZs+2Ih5sUr<%QHTXUr`jech3wvz$0!GIEPlObZj!U`?Xa7o!1C2Gb#mwcTrvGFK(c zHA&2U>l3P5xku3v<sb4)LvUq&rDs~~QLFzz?fu-U_}nW0+$tg30>!#RMQ5D{S5bT; zv3ffACdrbRvnOt5N9=un8UJ_ja$$Noyn=3KLx$7&bPpeTGdr`zg<XoUk<mkeI3sk{ zVy=&W<E9u`Oyq%(ow<-iA+b*j+3Eaf4}TSoh}sQs8LAfyvBmMxz|bGvmUrAmWIdaY zyXh>O?aMFqK&OY+pc`)vwQykRZb+-K{L)}05$|gjimCEOC12ytiG~UUMcgT*mtR!! zAGt;UIYN1jl7G+5PZhGUMHumU+v_t+$cAIFB!%lP`_h+h^SXu!85l_WmfukFOWb_8 z;LSNCu`F1{SGX6i?G}^0ePi&w-nrpPB5(A6&-IrV2Xmc{TxL-GJb`m(FFv@O;%5ll zQe|xt77oh0l)U?4t{fsVBaLLc2_yp$owsqbtYvA~(k2Vzi*uG2xcax`UoqY10Dya` zp*5#(al<*Jgx-zJCk~N;5pGewTx>!3mmXy`9XqW3uVt%zl*`4WB)_<kUM}_JQ@yzu zaU+}e^FD0ZZ&iG$*Yz%Wy<#q}xSVLH2LFitiBu$I{%ZU>x^(=3fN+NtHiC}vqT_xz zI>sM(Fy1kq7!EpvQ&Qm_QEm8YJOOTnfCDL*cX{Bje;~+`j0jJ}{_*Q0F2om)UkI22 z_^=|n=;HB!Iq-`voPh6F<FO24t7@rDexRfT^`i?FWna-|U(>QKyZ@v2lHJ@2<-2RH zaq}Pa8vt}z#H~<qV+e1(YadLgC%}}s&uG;;u;Z{pdNjpht4bjp<SCA$bPC&AT$iGC z?4(i*Tov|tf(^jE2|wy^xW;Ak-259{`b};{2e;;~ZOsFvB`AMQ7eGa_qU^5xH9g{4 zau4@L`^TcS;u}(A=ALJT`(u0ZHG4L1pMS%S=*buD$?f(PSY5fhF1u@8a!*lq|GO)$ z!P0CEP4e9N8MmU1Thl@;%Fq?9P>~&+yiN$|b;U3gjK_>|xct3i;_24ma`y5Bt)!kO zsywgTw%6q(AEH0b+4;2l$Vq;DvXbm>01q}@TN+(AE)6!7b_HxIGsv&ft^+Q>4$@Q= zS=w6s5qI-lgJW3fsJe0eq_=z5Fl88Ym@BlL2K?)tpBDOozjz{5Iv=LFk~y67<7HU? zf+gJl>$rMvTrEj>AfcT9kPx>bz(H-r5>v94?I8PJORr℞6Tu?4W+slD)hB_fLLp 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 HlfVA~ev6NV diff --git a/modex105/PALEDIT/PALVIEW.EXE b/modex105/PALEDIT/PALVIEW.EXE deleted file mode 100755 index 4c721d3b87833381ed95237540c2246e8f6eade8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10358 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 diff --git a/modex105/PALEDIT/PRIME.PAL b/modex105/PALEDIT/PRIME.PAL deleted file mode 100755 index 310ca6e7cd409d48ee8e5c35df97d27dfa0984cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmdUt-Kv8y41hnR6Y0b`ks=~8>7)}W;zT-;viE<hQ$5dcE=~eTE)w$hL6ApK9*@JE zE`+z+4ZcD7eh+iHGvso)BuR3;Ub8H_-|uBvR#nwBO{jW4pRd=;TKj&#KcCNUegpzy zNI*gg8RSqv2?{Exp@9}U(9nZ{0Y<Pe!3+zm;9!Ft{4v!j|GYsIAp~(uk{~5%N|ur5 z6a{68QdAXnP1De}bRAmL_ZY)4FpgNuG%?RC3+sw=Y#aNI_u*&9eIg=(h=~&tiA+f| zvYfo2C@B@HqN=GInwGYs)99YwU<QVf(PAg2nR#JZSsiX;+u1$-<Rdir+XbR15<<jr z9H^60rfC|$%k#V_iol*yD&SYwbs(^9+pg=h)_va_V}@ZE$1%`2P18Kj%d)KN>YUrQ LZQpnAec<y4J_$J` diff --git a/modex105/PALEDIT/RGB.PAL b/modex105/PALEDIT/RGB.PAL deleted file mode 100755 index bc03425d8cb27f1e43abab72bd1a89bdb4091ebd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmeH_(N=X}5Qd**OGumWOOhSJmV{qO+V_7~ed;1Q>3!FlnS+^wcg+JrM`4b~t%&As zqr2%O?4C|r`EFtq+q>OPRaITrP1Ce2%W)jv_roxZ<2X&zqA2RR?z(Q8rl0*Ykl-9- zaSIAufC`tOfer>-feF{J2McVt0S8?0;2-#K3jy3g2=@@d1H^EEM@S%r44xo|0?I88 z6+A-?FVMg%w9r8h|6zbP7-51L-eG|cSm6`4v_gLYe)R*AB+0U@D2kv?(=@{{1bF-X z-nMPQp67W2zaR(%fl(A44u>R3vMkH<ye!MAssxQq)3j~d_x&&o<2cUqye!MQu7b}m D=O!+P diff --git a/modex105/PALEDIT/SCROLL.PAL b/modex105/PALEDIT/SCROLL.PAL deleted file mode 100755 index 5dee1969fc3e9dfe5bee855460c512ba3a850e69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmWO4fugA}007W2rBcR}O4&6{OBqvI%Gm$^)qCd~4gg>dt%dE`E^_?PL#dC+Ix03v zg)<S7c29?d=>s=;JrU8Lq&#;GQ)M~QO6RqSZwB9WAV;TF@YMk&t+()|8fhN>SZXNw zlH!w9V<LvA?eWkd{q)VlorK*tP+md9L3x3+uyg9he?C5<Aj3`?!8id?X6=Z#r3kSw z;OVL+t|*qWvN{1(I~xa}_1u_+nQYxVqx4kccja2rjmU8whaB%&kWlA9V4eYzSf|K4 zW5iHc`f25o+AeOex&t9W+rr^xYvr1^KTW9DSpK5MB;_}wACiwW9vJR<(ACaUz=s5) zvl``HN5pk_F==54)y3af9hJzsHkCsxbX1!ipSG+=R0gD3Wu=?YWt3Yuh6vC60JzTF zh6@O6U^&3^AoA^S?WP-_U{r*-+D9Tu+Cw(vL=$RGY&!Fv)v^>#CCj>_H<jPVSZdsw z;AI@8;d=y=vUKPDBr+oW*6D|nkre~2dLp{4eI~;r(gK?XO;^9?uDsYy0ZR(#AIOg| z&TO2zLF_vbf;$Yhk%ba3$k2*}E=`w=SiFFBH4_5JcHRvOrR~u;dh$%~8@blaW-PIy zVVCb^oCtiVgPc2r!4m~%VzJCC6I4ZEjnf+<cfXKs)!O0(TLp$U&=WM;o_=m`eECJq z2bW{?KVsfzaYyiz1`p;44x1WWg~g?J=}@6UI;MY`98Hm#D%Bz$+ei(&PH&|_VhZYh R#ih%dB`qyNVV2L5_#e4jUwr@o diff --git a/modex105/README.DOC b/modex105/README.DOC deleted file mode 100755 index 63a9053f..00000000 --- a/modex105/README.DOC +++ /dev/null @@ -1,76 +0,0 @@ - -========================================================================= - þ þ þþþþþ þþþþ þþþþþ þ þ þ þþþþþ þ þ - þþ þþ þ þ þ þ þ þ þ þþ þ þ þ þ - þ þ þ þ þ þ þ þþþþ þ þ þ þ þ þþþþþ - þ þ þ þ þ þ þ þ þ þ þ þ þ - þ þ þþþþþ þþþþ þþþþþ þ þ þþþþþ þþ þþþþþ þ -========================================================================= - MODE X 1.04 -========================================================================= - Library & Editors by Matt Pritchard: Release 1.04 on 14 Mar 93 -========================================================================= - -MODEX104 is a library of high performance assembler routines for setting, -accessing, and manipulating the Undocumented 256 Color Modes available in -all VGA adaptors. - -MODEX104 includes the following elements: - - MODE X Library - A library of MODE X routines written in assembly. - - FONT EDITOR - An editor for creating and modifying fonts for use by - The MODE X Library. - - PALETTE EDITOR - An editor for creating and modifying palettes for - use in VGA 256 Color modes. - - MODE X Demos - Programs that show off the various features of the - MODE X Library - - MODE X Demo Source - The Full source code for the MODE X Demos for - the following Languages: Microsoft QuickBASIC 4.5, - Microsoft BASIC 7.1 PDS, Borland C/C++ 3.1, - and Borland Turbo Pascal. - -THE LEGAL STUFF: - - The Mode X Library has been placed into the Public Domain by the - Author (Matt Pritchard). The Font Editor and Palette Editor are also - placed into the Public Domain by the Author (Matt Pritchard). The - Source Code to the above editors is not in the Public Domain. - - The Mode X Demos and the Mode X Demo Sources have been placed into the - Public domain by the Author (Matt Pritchard). - - The Mode X Library may be used freely in any non commerical product. - It would be nice if the author was credited for the contribution, - but it is not necessary. No $$$ involved. - - The Mode X Library may be used freely in a commercial product, *IF* - the author (Matt Pritchard) is credited for the contribution. That's - it. No $$$ involved. - - The Mode X Library should not be re-sold or modified and re-sold. - No fee in excess of $5 should be charged for duplication of this - Library. - -CONTRIBUTORS: The following people have contributed to this effort. - - Michael Abrash - He told us all how to do it in the first place. - Scott Wyatt - He ported the Main Demo code to Turbo Pascal. - -THE AUTHOR: - - The author of MODEX104 is Matt Pritchard. - All Questions and correspondance can be directed to: - - "Matt Pritchard" on Fido Net ECHO Conference: 80xxx - - or mailed to: Matt Pritchard - P.O. Box 140264 - Irving, TX 75014-0264 - - Questions, Inquiries, Comments, Donations, etc are quite welcome. - - diff --git a/modex105/modex105.zip b/modex105/modex105.zip deleted file mode 100755 index 9457bd98ecabf87d3e5eb233b115e1edc76cfca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264999 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 F{{R{PXgUA@ -- 2.39.5