VSEG SEGMENT 'CODESG' ASSUME CS:VSEG,DS:VSEG,SS:VSEG ORG 100H ENTRY: ; JUMP TABLE FOR DIFFERENT PROCEDURES JMP COLORMASK ; 0 JMP CURSOR ; 4 JMP GALLOC ; 8 JMP GBOX ; 12 JMP GCLS ; 16 JMP GCROSS ; 20 JMP GETPOINT ; 24 JMP GGET ; 28 JMP GGETL ; 32 JMP GPAGE ; 36 JMP GPAINT ; 40 JMP GPOINT ; 44 JMP GPUT ; 48 JMP GPUTL ; 52 JMP GRANGE ; 56 JMP GSCREEN ; 60 JMP GTEXT ; 64 JMP GVECT ; 68 JMP OUTCHAR ; 72 JMP SHADELINE ; 76 JMP VIDEMS ; 80 JMP CLEARBOX ; 84 JMP SCRANGE ; 88 JMP GGETB ; 92 JMP GPUTB ; 96 JMP VIDXOR ; 100 JMP RUBARC ; 104 JMP GREV ; 108 JMP BAKCOLOR ; 112 JMP EVGA16 ; 116 JMP SHADEINIT ; 120 JMP SHADES ; 124 JMP PALETTES ; 128 JMP GTXTLOC ; 132 JMP GTCOLOR ; 136 ERRCODE DW 0 ; ERROR CODE FOR DISK READ, WRITE FILESIZE DW 0 ; NUMBER OF BYTES TO READ BUFFADD DW 0 ; BUFFER ADDRESS FOR FILE XFER DW 0 IGLOBAL DB 0 WVIDSIZ DW 0 ; BUFFER SIZE RETSEG DW 0 ; SEGMENT FOR RETURN CODE NBITS DB 0 WBIT DB 0 IYINC DW 0 IX1TMP DW 0 IX2TMP DW 0 DITMP DW 0 SITMP DW 0 ITYPE1 DB 0 ITYPE2 DB 0 BYTE1 DB 0 BYTE2 DB 0 NDOT DB 0 DXTMP DW 0 BASEPTR DW 0 IXMIN DW 0 ; MINIMUM AND MAXIMUM X,Y VALUES FOR THE DRAWING AREA. IXMAX DW 0 ; THESE ARE NOT NECESSARILY THE SCREEN LIMITS. IYMIN DW 0 IYMAX DW 0 IXMAXA DW 0 ; THESE ARE THE SCREEN LIMITS IYMAXA DW 0 XRETC DW 0 I1 DB 0 EGASEG DB 0 ; 0 - 7 FOR SEGMENT NUMBER OF VGA, EGA COMPATIBLES ICHRW DB 0 ICHRH DB 0 BIOSTXT DB 0 BITPIX DB 0 ; NBITS PER PIXEL BW DB 0 ; = 1 IF 1 BIT PER PIXEL MAJ DW 0 ; TEMPORARY MAXPAINT DW 0 ; MAX PAINT BUFFER SIZE HEAD DW 0 ; POINTERS TO PAINT QUEUE TAIL DW 0 PSEG DW 0 DSEG DW 0 ; ORIGINAL DS ESEG DW 0 ; ORIGINAL ES VGSEGSUB DW OFFSET DUMMYSEG IRETC DW 0 ; RETURN CODE ADDRESS HANDLE DW 0 ; FILE HANDLE ICOUNT DB 0 ; LENGTH OF RECORD IBYTE DB 0 ; PC PAINTBRUSH FILE HEADER - 128 BYTES PCXHEAD DB 10,5,1 ; PC PAINTBRUSH, NO PALETTE, ENCODE = 1 PCXBPX DB 0 ; BITS PER PIXEL PCXX1 DW 0 ; PICTURE DIMENSIONS PCXY1 DW 0 PCXX2 DW 0 PCXY2 DW 0 PCXHRES DW 0 ; CARD RESOLUTION PCXVRES DW 0 ; PCXPAL DB 0,0,0, 0,0,0AAH, 0,0AAH,0, 0,0AAH,0AAH, 0AAH,0,0 DB 0AAH,0,0AAH, 0AAH,0AAH,0, 0AAH,0AAH,0AAH DB 55H,55H,55H, 55H,55H,0FFH, 55H,0FFH,55H, 55H,0FFH,0FFH DB 0FFH,55H,55H, 0FFH,55H,0FFH, 0FFH,0FFH,55H, 0FFH,0FFH,0FFH DB 0 ; NOT USED PCXNPL DB 0 ; NPLANES PCXRWL DW 0 ; IROWLEN PCXGRAY DW 1 ; COLOR OR GRAYSCALE? - COLOR. PCXTRA DB 58 DUP(0) ; EXTRA VIDMEM DW 0 ; SEGMENT ADDRESS OF CURRENT VIDEO PAGE VIDEO2 DW 0 ; VIDEO PAGE 1 VIDEO2B DW 0 ; VIDEO PAGE 2 VIDEO2C DW 0 ; VIDEO PAGE 3 VIDEO2D DW 0 ; VIDEO PAGE 4 BUFF DW 0 IBUFTOP DW 0 GETNPL DB 0 NREAD DW 0 VHANDLE DW 0 EMSEG DW 0 EMFULL DW 0 EMPART DW 0 EMPAGE DW 0 GLOOKSUB DW 0 MAJINC DW 0 ; ADDRESS OF MAJOR INCREMENT SUB, LINE DRAWING ROUTINE MININC DW 0 ; ADDRESS OF MINOR INCREMENT SUB, LINE DRAWING ROUTINE YINCSUB DW 0 ; ADDRESS OF Y INCREMENT PROCEDURE ADDRESS YDECSUB DW 0 ; ADDRESS OF Y DECREMENT PROCEDURE ADDRESS XINCSUB DW 0 ; ADDRESS OF X INCREMENT PROCEDURE ADDRESS XDECSUB DW 0 ; ADDRESS OF X DECREMENT PROCEDURE ADDRESS SETSUB DW 0 ; SET POINT PROCEDURE ADDRESS SETREP DW 0 ; SET POINT REPLACE PROCEDURE ADDRESS SETXOR DW 0 ; SET POINT XOR PROCEDURE ADDRESS CHARSUB DW OFFSET CHAR3 ; OUTPUT CHARACTER PROCEDURE ADDRESS VIDSUB DW 0 ; ADDRESS OF PROCEDURE TO GET VIDEO ADDRESS, OFFSET TX1 DW 0 ; TEXT POSITION TY1 DW 0 NPLANES DB 1 ; NUMBER OF PLANES IN GRAPHICS CARD ICLIP DB 0 ; CLIP TOGGLE TMP DW 0 TMP1 DW 0 ; TEMPORARY VARIABLE TMP2 DW 0 TMP3 DW 0 ; TEMPORARY VARIABLE PX1 DW 0 PX2 DW 0 PY1 DW 0 PY2 DW 0 IX DW 0 IY DW 0 SCRMODE DB 0 ; SCREEN MODE ROWLEN DW 0 ; HOW MAY BYTES PER ROW DXMAJ DW 0 ; DX MAJOR DXMIN DW 0 ; DX MINOR DOT DB 0 IX1 DW 0 ; X AND Y VALUES FOR PARAMETERS. IY1 DW 0 IX2 DW 0 IY2 DW 0 STRLEN DW 0 ; STRING LENGTH VALUE VIDLEN DW 0 ; LENGTH OF VIDEO MEMORY (SINGLE PLANE) EGA16 DB 0 COLOR DB 0 ; ACTUAL COLOR VALUE. TCOLOR DB 0 BCOLOR DB 0 ; BACKGROUND COLOR BIOSPAGE DB 0 ; NORMALLY 0, FOR BIOS TEXT ON FIRST PAGE PL1 DB 0 PL2 DB 0 PL3 DB 0 MODE DB 0 ; LINE MODE - ; MODE: 0 = REPLACE, RANGE CHECK. ; MODE: 2 = REPLACE, RANGE CHECK. ; MODE: 8 = REPLACE, NO RANGE CHECK. ; MODE: 10 = REPLACE, NO RANGE CHECK. ; RANGE CHECK (CLIPPING) SHOULD BE DONE ON MODE 0 AND 2, ; AGAINST IXMIN, IXMAX, IYMIN, AND IYMAX. ; (IF THIS IS A PROBLEM, IT'S NOT ABSOLUTELY NECESSARY.) ; IT MUST NOT BE DONE (EXCEPT AT SCREEN LIMITS) ON MODES ; 8 AND 10. THERE ARE TWO SETS OF LIMITS - THE ABSOLUTE ; SCREEN LIMITS (HARDWARE), AND THE VALUES IXMIN, IXMAX, ; IYMIN, IYMAX. THESE VALUES ARE WITHIN THE SCREEN LIMITS ; BY SOME VARIABLE AMOUNT. DITHER DB 0 NCOLOR DW 0 ICOLOR DB 0 ICOLOR1 DB 0 ICOLOR2 DB 0 ICOLOR3 DB 0 ICOLOR4 DB 0 ICOLOR5 DB 0 ICOLOR6 DB 0 ICOLOR7 DB 0 ICOLOR8 DB 0 SHADEPTR DW 0 ORGPALS DB 0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,0 LASTPAL DW 0 SHADES1 DB 1, 1, 1, 1, 1, 1, 9, 9, 0, 0, 8, 8, 0, 8, 0, 0 DB 1, 1, 9, 9, 10, 10, 8, 8, 2, 2, 0, 0, 2, 8, 0, 0 DB 1, 1, 11, 11, 9, 9, 3, 3, 8, 8, 3, 3, 0, 8, 0, 0 DB 1, 1, 9, 9, 12, 12, 8, 8, 4, 4, 0, 0, 4, 8, 0, 0 DB 1, 1, 13, 13, 9, 9, 8, 8, 5, 5, 0, 0, 5, 5, 5, 5 DB 1, 1, 14, 14, 9, 9, 8, 8, 6, 6, 0, 0, 6, 8, 0, 0 DB 1, 1, 15, 15, 9, 9, 7, 7, 8, 8, 7, 7, 0, 8, 0, 0 DB 1, 1, 1, 1, 1, 1, 9, 9, 0, 0, 8, 8, 0, 8, 0, 0 DB 1, 1, 1, 1, 1, 1, 9, 9, 0, 0, 8, 8, 0, 8, 0, 0 DB 1, 1, 9, 9, 10, 10, 8, 8, 2, 2, 0, 0, 2, 8, 0, 0 DB 1, 1, 11, 11, 9, 9, 3, 3, 8, 8, 3, 3, 0, 8, 0, 0 DB 1, 1, 9, 9, 12, 12, 8, 8, 4, 4, 0, 0, 4, 8, 0, 0 DB 1, 1, 13, 13, 9, 9, 8, 8, 5, 5, 0, 0, 5, 5, 5, 5 DB 1, 1, 14, 14, 9, 9, 8, 8, 6, 6, 0, 0, 6, 8, 0, 0 DB 1, 1, 15, 15, 9, 9, 7, 7, 8, 8, 7, 7, 0, 8, 0, 0 DB 1, 1, 1, 1, 1, 1, 9, 9, 0, 0, 8, 8, 0, 8, 0, 0 SHADES2 DB 1, 1, 9, 9, 8, 8, 9, 9, 1, 1, 9, 9, 9, 8, 8, 8 DB 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 2, 2, 2 DB 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 11, 3, 3, 3 DB 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 4, 4, 4 DB 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 8, 5, 0, 0 DB 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 6, 6, 6, 6 DB 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 7, 15, 7, 7, 7 DB 1, 1, 9, 9, 8, 8, 9, 9, 1, 1, 9, 9, 9, 8, 8, 8 DB 1, 1, 9, 9, 8, 8, 9, 9, 1, 1, 9, 9, 9, 8, 8, 8 DB 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 2, 2, 2 DB 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 11, 3, 3, 3 DB 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 4, 4, 4 DB 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 8, 5, 0, 0 DB 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 6, 6, 6, 6 DB 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 7, 15, 7, 7, 7 DB 1, 1, 9, 9, 8, 8, 9, 9, 1, 1, 9, 9, 9, 8, 8, 8 JBAKCOLOR DB 0 CURBUFF DB 00H, 00H ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DB 7FH,0FCH ; 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 DB 40H, 04H ; 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 DB 5FH,0F4H ; 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 DB 50H, 14H ; 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 DB 50H, 14H ; 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 DB 50H, 14H ; 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 DB 50H, 14H ; 0 1 0 1 0 0 0 X 0 0 0 1 0 1 0 0 DB 50H, 14H ; 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 DB 50H, 14H ; 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 DB 50H, 14H ; 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 DB 5FH,0F4H ; 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 DB 40H, 04H ; 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 DB 7FH,0FCH ; 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 DB 00H, 00H ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DB 00H, 00H ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ARWBUFF DB 00H, 00H ; X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DB 40H, 00H ; 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DB 60H, 00H ; 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 DB 70H, 00H ; 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 DB 78H, 00H ; 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 DB 7CH, 00H ; 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 DB 7EH, 00H ; 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 DB 7FH, 00H ; 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 DB 7FH, 80H ; 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 DB 7FH,0C0H ; 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 DB 7CH, 00H ; 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 DB 46H, 00H ; 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 DB 06H, 00H ; 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 DB 03H, 00H ; 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 DB 03H, 00H ; 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 DB 01H, 80H ; 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 COLORS DB 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 DB 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43 DB 44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 DB 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83 DB 84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103 DB 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119 DB 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135 DB 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151 DB 152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167 DB 168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183 DB 184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 DB 200,201,202,203,204,205,206,207,208,209 DB 210,211,212,213,214,215,216,217,218,219 DB 220,221,222,223,224,225,226,227,228,229 DB 230,231,232,233,234,235,236,237,238,239 DB 240,241,242,243,244,245,246,247,248,249 DB 250,251,252,253,254,255 LETTERS DW OFFSET HERCLETT HERCLETT DB 000H,000H,000H,000H,000H,000H,000H,000H ; 0 DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,07EH,081H,0A5H,081H,081H,0BDH ; 1 DB 099H,081H,081H,07EH,000H,000H,000H,000H DB 000H,000H,07CH,0FEH,0FEH,0D6H,0FEH,0FEH ; 2 DB 0BAH,0C6H,0FEH,07CH,000H,000H,000H,000H DB 000H,000H,000H,06CH,0EEH,0FEH,0FEH,0FEH ; 3 DB 0FEH,07CH,038H,010H,000H,000H,000H,000H DB 000H,000H,000H,010H,038H,07CH,0FEH,07CH ; 4 DB 038H,010H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,010H,038H,038H,010H,06CH ; 5 DB 0EEH,06CH,010H,038H,000H,000H,000H,000H DB 000H,000H,010H,038H,07CH,07CH,0FEH,0FEH ; 6 DB 0FEH,06CH,010H,038H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,018H,03CH,03CH ; 7 DB 03CH,018H,000H,000H,000H,000H,000H,000H DB 0FFH,0FFH,0FFH,0FFH,0FFH,0E7H,0C3H,0C3H ; 8 DB 0C3H,0E7H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 000H,000H,000H,000H,018H,03CH,066H,066H ; 9 DB 066H,03CH,018H,000H,000H,000H,000H,000H DB 0FFH,0FFH,0FFH,0FFH,0E7H,0C3H,099H,099H ; 10 DB 099H,0C3H,0E7H,0FFH,0FFH,0FFH,0FFH,0FFH DB 000H,000H,01EH,00EH,01EH,036H,078H,0CCH ; 11 DB 0CCH,0CCH,0CCH,078H,000H,000H,000H,000H DB 000H,000H,03CH,066H,066H,066H,03CH,018H ; 12 DB 07EH,018H,018H,018H,000H,000H,000H,000H DB 000H,000H,01EH,01AH,01EH,018H,018H,018H ; 13 DB 018H,078H,0F8H,070H,000H,000H,000H,000H DB 000H,000H,03EH,036H,03EH,036H,036H,076H ; 14 DB 0F6H,066H,00EH,01EH,00CH,000H,000H,000H DB 000H,000H,018H,0DBH,07EH,03CH,066H,066H ; 15 DB 03CH,07EH,0DBH,018H,000H,000H,000H,000H DB 000H,000H,000H,080H,0E0H,0F0H,0FCH,0FEH ; 16 DB 0FCH,0F0H,0E0H,080H,000H,000H,000H,000H DB 000H,000H,000H,002H,00EH,03EH,07EH,0FEH ; 17 DB 07EH,03EH,00EH,002H,000H,000H,000H,000H DB 000H,000H,018H,03CH,07EH,018H,018H,018H ; 18 DB 018H,07EH,03CH,018H,000H,000H,000H,000H DB 000H,000H,066H,066H,066H,066H,066H,066H ; 19 DB 066H,000H,066H,066H,000H,000H,000H,000H DB 000H,000H,07FH,0DBH,0DBH,0DBH,0DBH,07BH ; 20 DB 01BH,01BH,01BH,01BH,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C6H,060H,07CH,0F6H ; 21 DB 0DEH,07CH,00CH,0C6H,0C6H,07CH,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H ; 22 DB 0FEH,0FEH,0FEH,0FEH,000H,000H,000H,000H DB 000H,000H,018H,03CH,07EH,018H,018H,018H ; 23 DB 07EH,03CH,018H,07EH,000H,000H,000H,000H DB 000H,000H,018H,03CH,07EH,018H,018H,018H ; 24 DB 018H,018H,018H,018H,000H,000H,000H,000H DB 000H,000H,018H,018H,018H,018H,018H,018H ; 25 DB 018H,07EH,03CH,018H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,00CH,00EH,0FFH ; 26 DB 00EH,00CH,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,030H,070H,0FEH ; 27 DB 070H,030H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,0C0H,0C0H ; 28 DB 0C0H,0FEH,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,024H,066H,0FFH ; 29 DB 066H,024H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,010H,038H,038H,038H,07CH ; 30 DB 07CH,0FEH,0FEH,000H,000H,000H,000H,000H DB 000H,000H,000H,0FEH,0FEH,07CH,07CH,07CH ; 31 DB 038H,038H,010H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H ; 32 DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,018H,03CH,03CH,03CH,03CH,018H ; ! DB 018H,000H,018H,018H,000H,000H,000H,000H DB 000H,036H,036H,036H,036H,014H,000H,000H ; " DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,06CH,06CH,06CH,0FEH,06CH,06CH ; # DB 0FEH,06CH,06CH,06CH,000H,000H,000H,000H DB 000H,000H,018H,018H,07CH,0C6H,0C0H,078H ; $ DB 03CH,006H,0C6H,07CH,018H,018H,000H,000H DB 000H,000H,000H,000H,000H,062H,066H,00CH ; % DB 018H,030H,066H,0C6H,000H,000H,000H,000H DB 000H,000H,038H,06CH,038H,030H,076H,07EH ; & DB 0CCH,0CCH,0CCH,076H,000H,000H,000H,000H DB 000H,00CH,00CH,00CH,018H,000H,000H,000H ; ' DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,00CH,018H,030H,030H,030H,030H ; ( DB 030H,030H,018H,00CH,000H,000H,000H,000H DB 000H,000H,030H,018H,00CH,00CH,00CH,00CH ; ) DB 00CH,00CH,018H,030H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,06CH,038H,0FEH ; * DB 038H,06CH,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,018H,018H,07EH ; + DB 018H,018H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H ; , DB 000H,00CH,00CH,00CH,018H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,0FEH ; - DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H ; . DB 000H,000H,018H,018H,000H,000H,000H,000H DB 000H,000H,000H,000H,002H,006H,00CH,018H ; / DB 030H,060H,0C0H,080H,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C6H,0C6H,0D6H,0D6H ; 0 DB 0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,018H,078H,018H,018H,018H,018H ; 1 DB 018H,018H,018H,07EH,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C6H,006H,00CH,018H ; 2 DB 030H,060H,0C6H,0FEH,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,006H,006H,03CH,006H ; 3 DB 006H,006H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,00CH,01CH,03CH,06CH,0CCH,0CCH ; 4 DB 0FEH,00CH,00CH,01EH,000H,000H,000H,000H DB 000H,000H,0FEH,0C0H,0C0H,0C0H,0FCH,006H ; 5 DB 006H,006H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C0H,0C0H,0FCH,0C6H ; 6 DB 0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,0FEH,0C6H,006H,00CH,018H,030H ; 7 DB 030H,030H,030H,030H,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C6H,0C6H,07CH,0C6H ; 8 DB 0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,07EH ; 9 DB 006H,006H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,00CH,00CH,000H ; : DB 000H,00CH,00CH,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,00CH,00CH,000H ; ; DB 000H,00CH,00CH,00CH,018H,000H,000H,000H DB 000H,000H,000H,00CH,018H,030H,060H,0C0H ; < DB 060H,030H,018H,00CH,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,0FEH,000H ; = DB 0FEH,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,060H,030H,018H,00CH,006H ; > DB 00CH,018H,030H,060H,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C6H,00CH,018H,018H ; ? DB 018H,000H,018H,018H,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C6H,0C6H,0DEH,0DEH ; @ DB 0DEH,0DCH,0C0H,07EH,000H,000H,000H,000H DB 000H,000H,038H,06CH,0C6H,0C6H,0C6H,0FEH ; A DB 0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H DB 000H,000H,0FCH,066H,066H,066H,07CH,066H ; B DB 066H,066H,066H,0FCH,000H,000H,000H,000H DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0C0H ; C DB 0C0H,0C2H,066H,03CH,000H,000H,000H,000H DB 000H,000H,0F8H,06CH,066H,066H,066H,066H ; D DB 066H,066H,06CH,0F8H,000H,000H,000H,000H DB 000H,000H,0FEH,066H,060H,060H,07CH,060H ; E DB 060H,060H,066H,0FEH,000H,000H,000H,000H DB 000H,000H,0FEH,066H,060H,060H,07CH,060H ; F DB 060H,060H,060H,0F0H,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C6H,0C0H,0C0H,0C0H ; G DB 0CEH,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0FEH,0C6H ; H DB 0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H DB 000H,000H,03CH,018H,018H,018H,018H,018H ; I DB 018H,018H,018H,03CH,000H,000H,000H,000H DB 000H,000H,03CH,018H,018H,018H,018H,018H ; J DB 018H,0D8H,0D8H,070H,000H,000H,000H,000H DB 000H,000H,0C6H,0C6H,0CCH,0D8H,0F0H,0F0H ; K DB 0D8H,0CCH,0C6H,0C6H,000H,000H,000H,000H DB 000H,000H,0F0H,060H,060H,060H,060H,060H ; L DB 060H,062H,066H,0FEH,000H,000H,000H,000H DB 000H,000H,0C6H,0C6H,0EEH,0EEH,0FEH,0D6H ; M DB 0D6H,0D6H,0C6H,0C6H,000H,000H,000H,000H DB 000H,000H,0C6H,0C6H,0E6H,0E6H,0F6H,0DEH ; N DB 0CEH,0CEH,0C6H,0C6H,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H ; O DB 0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,0FCH,066H,066H,066H,066H,07CH ; P DB 060H,060H,060H,0F0H,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H ; Q DB 0C6H,0D6H,0D6H,07CH,006H,000H,000H,000H DB 000H,000H,0FCH,066H,066H,066H,07CH,078H ; R DB 06CH,066H,066H,0E6H,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C0H,0C0H,070H,01CH ; S DB 006H,006H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,07EH,05AH,018H,018H,018H,018H ; T DB 018H,018H,018H,03CH,000H,000H,000H,000H DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H ; U DB 0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H ; V DB 0C6H,06CH,038H,010H,000H,000H,000H,000H DB 000H,000H,0C6H,0C6H,0C6H,0D6H,0D6H,0D6H ; W DB 0FEH,0EEH,0C6H,0C6H,000H,000H,000H,000H DB 000H,000H,0C6H,0C6H,0C6H,06CH,038H,038H ; X DB 06CH,0C6H,0C6H,0C6H,000H,000H,000H,000H DB 000H,000H,066H,066H,066H,066H,066H,03CH ; Y DB 018H,018H,018H,03CH,000H,000H,000H,000H DB 000H,000H,0FEH,0C6H,086H,00CH,018H,030H ; Z DB 060H,0C2H,0C6H,0FEH,000H,000H,000H,000H DB 000H,000H,07CH,060H,060H,060H,060H,060H ; [ DB 060H,060H,060H,07CH,000H,000H,000H,000H DB 000H,000H,000H,000H,080H,0C0H,060H,030H ; \ DB 018H,00CH,006H,002H,000H,000H,000H,000H DB 000H,000H,07CH,00CH,00CH,00CH,00CH,00CH ; ] DB 00CH,00CH,00CH,07CH,000H,000H,000H,000H DB 000H,010H,038H,06CH,0C6H,000H,000H,000H ; ^ DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H ; _ DB 000H,000H,000H,000H,000H,000H,0FFH,0FFH DB 000H,018H,018H,018H,00CH,000H,000H,000H ; ` DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,078H,00CH,07CH ; a DB 0CCH,0CCH,0DCH,076H,000H,000H,000H,000H DB 000H,000H,0E0H,060H,060H,07CH,066H,066H ; b DB 066H,066H,066H,0FCH,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,07CH,0C6H,0C0H ; c DB 0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,01CH,00CH,00CH,07CH,0CCH,0CCH ; d DB 0CCH,0CCH,0CCH,07EH,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,07CH,0C6H,0C6H ; e DB 0FEH,0C0H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,01CH,036H,030H,030H,0FCH,030H ; f DB 030H,030H,030H,078H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,076H,0CEH,0C6H ; g DB 0C6H,0CEH,076H,006H,0C6H,07CH,000H,000H DB 000H,000H,0E0H,060H,060H,07CH,066H,066H ; h DB 066H,066H,066H,0E6H,000H,000H,000H,000H DB 000H,000H,018H,018H,000H,038H,018H,018H ; i DB 018H,018H,018H,03CH,000H,000H,000H,000H DB 000H,000H,00CH,00CH,000H,01CH,00CH,00CH ; j DB 00CH,00CH,00CH,0CCH,0CCH,078H,000H,000H DB 000H,000H,0E0H,060H,060H,066H,066H,06CH ; k DB 078H,06CH,066H,0E6H,000H,000H,000H,000H DB 000H,000H,038H,018H,018H,018H,018H,018H ; l DB 018H,018H,018H,03CH,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,06CH,0FEH,0D6H ; m DB 0D6H,0C6H,0C6H,0C6H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,0DCH,066H,066H ; n DB 066H,066H,066H,066H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,07CH,0C6H,0C6H ; o DB 0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,0DCH,066H,066H ; p DB 066H,066H,07CH,060H,060H,0F0H,000H,000H DB 000H,000H,000H,000H,000H,076H,0CCH,0CCH ; q DB 0CCH,0CCH,07CH,00CH,00CH,01EH,000H,000H DB 000H,000H,000H,000H,000H,0DCH,066H,060H ; r DB 060H,060H,060H,0F0H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,07CH,0C6H,0C0H ; s DB 07CH,006H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,030H,030H,030H,0FCH,030H,030H ; t DB 030H,030H,036H,01CH,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,0CCH,0CCH,0CCH ; u DB 0CCH,0CCH,0CCH,076H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,0C6H,0C6H,0C6H ; v DB 0C6H,06CH,038H,010H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,0C6H,0C6H,0D6H ; w DB 0D6H,0D6H,0FEH,06CH,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,0C6H,0C6H,06CH ; x DB 038H,06CH,0C6H,0C6H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,0C6H,0C6H,0C6H ; y DB 0C6H,0CEH,076H,006H,0C6H,07CH,000H,000H DB 000H,000H,000H,000H,000H,0FEH,086H,00CH ; z DB 018H,030H,062H,0FEH,000H,000H,000H,000H DB 000H,000H,00EH,018H,018H,018H,070H,018H ; { DB 018H,018H,018H,00EH,000H,000H,000H,000H DB 000H,000H,018H,018H,018H,018H,000H,018H ; | DB 018H,018H,018H,018H,000H,000H,000H,000H DB 000H,000H,070H,018H,018H,018H,00EH,018H ; } DB 018H,018H,018H,070H,000H,000H,000H,000H DB 000H,000H,076H,0DCH,000H,000H,000H,000H ; ~ DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,010H,038H,038H ;  DB 06CH,06CH,0FEH,000H,000H,000H,000H,000H DB 000H,000H,03CH,066H,0C0H,0C0H,0C0H,0C6H ; DB 066H,03CH,018H,00CH,0CCH,038H,000H,000H DB 000H,000H,0C6H,0C6H,000H,0C6H,0C6H,0C6H ; DB 0C6H,0C6H,0CEH,076H,000H,000H,000H,000H DB 000H,00CH,018H,030H,000H,07CH,0C6H,0C6H ; DB 0FEH,0C0H,0C6H,07CH,000H,000H,000H,000H DB 000H,030H,078H,0CCH,000H,078H,00CH,07CH ; DB 0CCH,0CCH,0DCH,076H,000H,000H,000H,000H DB 000H,000H,0CCH,0CCH,000H,078H,00CH,07CH ; DB 0CCH,0CCH,0DCH,076H,000H,000H,000H,000H DB 000H,060H,030H,018H,000H,078H,00CH,07CH ; DB 0CCH,0CCH,0DCH,076H,000H,000H,000H,000H DB 000H,038H,06CH,038H,000H,078H,00CH,07CH ; DB 0CCH,0CCH,0DCH,076H,000H,000H,000H,000H DB 000H,000H,000H,000H,07CH,0C6H,0C0H,0C0H ; DB 0C6H,07CH,018H,00CH,06CH,038H,000H,000H DB 000H,030H,078H,0CCH,000H,07CH,0C6H,0C6H ; DB 0FEH,0C0H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,0CCH,0CCH,000H,07CH,0C6H,0C6H ; DB 0FEH,0C0H,0C6H,07CH,000H,000H,000H,000H DB 000H,030H,018H,00CH,000H,07CH,0C6H,0C6H ; DB 0FEH,0C0H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,066H,066H,000H,038H,018H,018H ; DB 018H,018H,018H,03CH,000H,000H,000H,000H DB 000H,018H,03CH,066H,000H,038H,018H,018H ; DB 018H,018H,018H,03CH,000H,000H,000H,000H DB 000H,060H,030H,018H,000H,038H,018H,018H ; DB 018H,018H,018H,03CH,000H,000H,000H,000H DB 000H,0C6H,0C6H,000H,038H,06CH,0C6H,0C6H ; DB 0FEH,0C6H,0C6H,0C6H,000H,000H,000H,000H DB 038H,06CH,038H,000H,038H,06CH,0C6H,0C6H ; DB 0FEH,0C6H,0C6H,0C6H,000H,000H,000H,000H DB 00CH,018H,030H,000H,0FEH,060H,060H,07CH ; DB 060H,060H,060H,0FEH,000H,000H,000H,000H DB 000H,000H,000H,000H,066H,0DBH,01BH,07FH ; DB 0D8H,0D8H,0DFH,076H,000H,000H,000H,000H DB 000H,000H,07EH,0D8H,0D8H,0D8H,0D8H,0FEH ; DB 0D8H,0D8H,0D8H,0DEH,000H,000H,000H,000H DB 000H,030H,078H,0CCH,000H,07CH,0C6H,0C6H ; DB 0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,0C6H,0C6H,000H,07CH,0C6H,0C6H ; DB 0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,030H,018H,00CH,000H,07CH,0C6H,0C6H ; DB 0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,030H,078H,0CCH,000H,0C6H,0C6H,0C6H ; DB 0C6H,0C6H,0CEH,076H,000H,000H,000H,000H DB 000H,060H,030H,018H,000H,0C6H,0C6H,0C6H ; DB 0C6H,0C6H,0CEH,076H,000H,000H,000H,000H DB 000H,0C6H,0C6H,000H,0C6H,0C6H,0C6H,0C6H ; DB 0CEH,076H,006H,006H,0C6H,07CH,000H,000H DB 000H,0C6H,0C6H,000H,07CH,0C6H,0C6H,0C6H ; DB 0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,0C6H,0C6H,000H,0C6H,0C6H,0C6H,0C6H ; DB 0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,018H,018H,07CH,0C6H,0C0H,0C0H ; DB 0C6H,07CH,018H,018H,000H,000H,000H,000H DB 000H,038H,06CH,060H,060H,0F0H,060H,060H ; DB 060H,066H,0F6H,06CH,000H,000H,000H,000H DB 000H,066H,066H,066H,066H,03CH,018H,07EH ; DB 018H,03CH,018H,018H,000H,000H,000H,000H DB 000H,0FCH,0C6H,0C6H,0FCH,0C0H,0CCH,0DEH ; DB 0CCH,0CCH,0CCH,0C6H,000H,000H,000H,000H DB 000H,00EH,01BH,018H,018H,018H,07EH,018H ; DB 018H,018H,018H,018H,0D8H,070H,000H,000H DB 000H,00CH,018H,030H,000H,078H,00CH,07CH ; DB 0CCH,0CCH,0DCH,076H,000H,000H,000H,000H DB 000H,00CH,018H,030H,000H,038H,018H,018H ; DB 018H,018H,018H,03CH,000H,000H,000H,000H DB 000H,00CH,018H,030H,000H,07CH,0C6H,0C6H ; DB 0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,018H,030H,060H,000H,0CCH,0CCH,0CCH ; DB 0CCH,0CCH,0DCH,076H,000H,000H,000H,000H DB 000H,000H,076H,0DCH,000H,0BCH,066H,066H ; DB 066H,066H,066H,0E6H,000H,000H,000H,000H DB 000H,076H,0DCH,000H,0C6H,0C6H,0E6H,0F6H ; DB 0DEH,0CEH,0C6H,0C6H,000H,000H,000H,000H DB 000H,03CH,06CH,06CH,03EH,000H,07EH,000H ; DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,038H,06CH,06CH,038H,000H,07CH,000H ; DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,030H,030H,000H,030H,030H,030H ; DB 060H,0C6H,0C6H,07CH,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,07EH ; DB 060H,060H,060H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,07EH ; DB 006H,006H,006H,000H,000H,000H,000H,000H DB 000H,060H,060H,062H,066H,06CH,018H,030H ; DB 060H,0DCH,036H,00CH,018H,03EH,000H,000H DB 000H,060H,060H,062H,066H,06CH,018H,036H ; DB 06EH,0DEH,036H,07EH,006H,006H,000H,000H DB 000H,000H,018H,018H,000H,018H,018H,03CH ; DB 03CH,03CH,03CH,018H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H ; 174 DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H ; 175 DB 000H,000H,000H,000H,000H,000H,000H,000H DB 011H,044H,011H,044H,011H,044H,011H,044H ; DB 011H,044H,011H,044H,011H,044H,011H,044H DB 0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H ; DB 0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H DB 0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H ; DB 0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H DB 018H,018H,018H,018H,018H,018H,018H,018H ; DB 018H,018H,018H,018H,018H,018H,018H,018H DB 018H,018H,018H,018H,018H,018H,018H,018H ; DB 0F8H,018H,018H,018H,018H,018H,018H,018H DB 018H,018H,018H,018H,018H,018H,0F8H,018H ; DB 0F8H,018H,018H,018H,018H,018H,018H,018H DB 036H,036H,036H,036H,036H,036H,036H,036H ; DB 0F6H,036H,036H,036H,036H,036H,036H,036H DB 000H,000H,000H,000H,000H,000H,000H,000H ; DB 0FEH,036H,036H,036H,036H,036H,036H,036H DB 000H,000H,000H,000H,000H,000H,0F8H,018H ; DB 0F8H,018H,018H,018H,018H,018H,018H,018H DB 036H,036H,036H,036H,036H,036H,0F6H,006H ; DB 0F6H,036H,036H,036H,036H,036H,036H,036H DB 036H,036H,036H,036H,036H,036H,036H,036H ; DB 036H,036H,036H,036H,036H,036H,036H,036H DB 000H,000H,000H,000H,000H,000H,0FEH,006H ; DB 0F6H,036H,036H,036H,036H,036H,036H,036H DB 036H,036H,036H,036H,036H,036H,0F6H,006H ; DB 0FEH,000H,000H,000H,000H,000H,000H,000H DB 036H,036H,036H,036H,036H,036H,036H,036H ; DB 0FEH,000H,000H,000H,000H,000H,000H,000H DB 018H,018H,018H,018H,018H,018H,0F8H,018H ; DB 0F8H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H ; DB 0F8H,018H,018H,018H,018H,018H,018H,018H DB 018H,018H,018H,018H,018H,018H,018H,018H ; DB 01FH,000H,000H,000H,000H,000H,000H,000H DB 018H,018H,018H,018H,018H,018H,018H,018H ; DB 0FFH,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H ; DB 0FFH,018H,018H,018H,018H,018H,018H,018H DB 018H,018H,018H,018H,018H,018H,018H,018H ; DB 01FH,018H,018H,018H,018H,018H,018H,018H DB 000H,000H,000H,000H,000H,000H,000H,000H ; DB 0FFH,000H,000H,000H,000H,000H,000H,000H DB 018H,018H,018H,018H,018H,018H,018H,018H ; DB 0FFH,018H,018H,018H,018H,018H,018H,018H DB 018H,018H,018H,018H,018H,018H,01FH,018H ; DB 01FH,018H,018H,018H,018H,018H,018H,018H DB 036H,036H,036H,036H,036H,036H,036H,036H ; DB 037H,036H,036H,036H,036H,036H,036H,036H DB 036H,036H,036H,036H,036H,036H,037H,030H ; DB 03FH,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,03FH,030H ; DB 037H,036H,036H,036H,036H,036H,036H,036H DB 036H,036H,036H,036H,036H,036H,0F7H,000H ; DB 0FFH,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,0FFH,000H ; DB 0F7H,036H,036H,036H,036H,036H,036H,036H DB 036H,036H,036H,036H,036H,036H,037H,030H ; DB 037H,036H,036H,036H,036H,036H,036H,036H DB 000H,000H,000H,000H,000H,000H,0FFH,000H ; DB 0FFH,000H,000H,000H,000H,000H,000H,000H DB 036H,036H,036H,036H,036H,036H,0F7H,000H ; DB 0F7H,036H,036H,036H,036H,036H,036H,036H DB 018H,018H,018H,018H,018H,018H,0FFH,000H ; DB 0FFH,000H,000H,000H,000H,000H,000H,000H DB 036H,036H,036H,036H,036H,036H,036H,036H ; DB 0FFH,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,0FFH,000H ; DB 0FFH,018H,018H,018H,018H,018H,018H,018H DB 000H,000H,000H,000H,000H,000H,000H,000H ; DB 0FFH,036H,036H,036H,036H,036H,036H,036H DB 036H,036H,036H,036H,036H,036H,036H,036H ; DB 03FH,000H,000H,000H,000H,000H,000H,000H DB 018H,018H,018H,018H,018H,018H,01FH,018H ; DB 01FH,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,01FH,018H ; DB 01FH,018H,018H,018H,018H,018H,018H,018H DB 000H,000H,000H,000H,000H,000H,000H,000H ; DB 03FH,036H,036H,036H,036H,036H,036H,036H DB 036H,036H,036H,036H,036H,036H,036H,036H ; DB 0FFH,036H,036H,036H,036H,036H,036H,036H DB 018H,018H,018H,018H,018H,018H,0FFH,018H ; DB 0FFH,018H,018H,018H,018H,018H,018H,018H DB 018H,018H,018H,018H,018H,018H,018H,018H ; DB 0F8H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H ; DB 01FH,018H,018H,018H,018H,018H,018H,018H DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ; DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 000H,000H,000H,000H,000H,000H,000H,000H ; DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H ; DB 0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H DB 00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH ; DB 00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ; DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,076H,0DCH,0D8H,0D8H ; DB 0D8H,0D8H,0DCH,076H,000H,000H,000H,000H DB 000H,000H,000H,000H,078H,0CCH,0D8H,0FCH ; DB 0C6H,0C6H,0E6H,0DCH,0C0H,0C0H,000H,000H DB 000H,000H,0FEH,066H,062H,060H,060H,060H ; DB 060H,060H,060H,060H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,0FEH,06CH,06CH ; DB 06CH,06CH,06CH,06CH,000H,000H,000H,000H DB 000H,000H,0FEH,0C6H,062H,030H,018H,018H ; DB 030H,062H,0C6H,0FEH,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,07EH,0D8H,0CCH ; DB 0CCH,0CCH,0D8H,070H,000H,000H,000H,000H DB 000H,000H,000H,000H,066H,066H,066H,066H ; DB 066H,07CH,060H,0C0H,080H,000H,000H,000H DB 000H,000H,000H,000H,000H,076H,0DCH,018H ; DB 018H,018H,018H,018H,000H,000H,000H,000H DB 000H,000H,0FEH,038H,038H,06CH,0C6H,0C6H ; DB 06CH,038H,038H,0FEH,000H,000H,000H,000H DB 000H,000H,000H,038H,06CH,0C6H,0C6H,0FEH ; DB 0C6H,0C6H,06CH,038H,000H,000H,000H,000H DB 000H,000H,038H,06CH,0C6H,0C6H,0C6H,0C6H ; DB 06CH,06CH,06CH,0EEH,000H,000H,000H,000H DB 000H,000H,03EH,060H,060H,03CH,066H,0C6H ; DB 0C6H,0C6H,0CCH,078H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,07EH,0DBH,0DBH ; DB 0DBH,07EH,000H,000H,000H,000H,000H,000H DB 000H,000H,002H,006H,07CH,0CEH,0DEH,0F6H ; DB 0F6H,07CH,060H,0C0H,000H,000H,000H,000H DB 000H,000H,000H,01CH,030H,060H,060H,07CH ; DB 060H,060H,030H,01CH,000H,000H,000H,000H DB 000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H ; DB 0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H DB 000H,000H,000H,000H,0FEH,000H,000H,0FEH ; DB 000H,000H,0FEH,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,018H,018H,07EH,018H ; DB 018H,000H,000H,07EH,000H,000H,000H,000H DB 000H,000H,030H,018H,00CH,006H,00CH,018H ; DB 030H,000H,000H,07EH,000H,000H,000H,000H DB 000H,000H,00CH,018H,030H,060H,030H,018H ; DB 00CH,000H,000H,07EH,000H,000H,000H,000H DB 000H,000H,000H,000H,00CH,01EH,01AH,018H ; DB 018H,018H,018H,018H,018H,018H,018H,018H DB 018H,018H,018H,018H,018H,018H,018H,018H ; DB 018H,018H,058H,078H,030H,000H,000H,000H DB 000H,000H,000H,000H,018H,018H,000H,07EH ; DB 000H,018H,018H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,076H,0DCH ; DB 000H,076H,0DCH,000H,000H,000H,000H,000H DB 000H,000H,078H,0CCH,0CCH,078H,000H,000H ; DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,018H ; DB 018H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H ; DB 018H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,01FH,018H,018H,018H,018H,018H ; DB 0D8H,0D8H,078H,038H,018H,000H,000H,000H DB 000H,000H,0D8H,06CH,06CH,06CH,06CH,06CH ; DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,070H,0D8H,018H,030H,060H,0F8H ; FD DB 000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,07EH,07EH,07EH ; DB 07EH,07EH,07EH,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H ; 255 DB 000H,000H,000H,000H,000H,000H,000H,000H ;===================================================== COLORMASK: PUSH DS PUSH ES PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV DI,[BP]+10 ; INPUT STRING MOV CL,ES:[DI] CMP CL,16 JL NULMASK MOV CH,0 INC DI MOV BX,OFFSET COLORS MASK2: MOV AL,ES:[DI]; MOV [BX],AL INC DI INC BX LOOP MASK2 NULMASK: POP BP POP ES POP DS RETF 4 ;COLORMASK ENDP ;============================================ ; CALL GREV (IX1, IY1, IX2, IY2, ICOLOR) GREV: PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+18 ; IX1 MOV AX,ES:[BX] MOV [PX1],AX MOV BX,[BP]+16 ; IY1 MOV AX,ES:[BX] MOV [PY1],AX MOV BX,[BP]+14 ; IX2 MOV AX,ES:[BX] MOV [PX2],AX MOV BX,[BP]+12 ; IY2 MOV AX,ES:[BX] MOV [PY2],AX MOV BX,[BP]+10 ; COLOR MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [COLOR],AL ; SORT POINTS MOV AX,[PY1] MOV BX,[PY2] CMP BX,AX JGE GREV2 MOV [PY1],BX ; SWAP Y1, Y2 MOV [PY2],AX GREV2: ; SORT POINTS MOV AX,[PX1] MOV BX,[PX2] CMP BX,AX JGE GREV3 MOV [PX1],BX ; SWAP X1, X2 MOV [PX2],AX GREV3: MOV AX,[PX1] ; DRAW HORIZONTAL LINE MOV [IX1],AX MOV AX,[PY1] MOV [IY1],AX CALL EGARST ; RESET EGA REGISTERS MOV ES,[VIDMEM] CALL VIDXY MOV CX,[PX2] SUB CX,[PX1] INC CX MOV [TMP1],CX GREV4: MOV CX,[TMP1] GREV5: CALL SETXOR ;DRAW HORIZONTAL LINE CALL XINCSUB LOOP GREV5 CALL XDECSUB MOV DX,[IY] CMP DX,[PY2] JGE GREV7 CALL YINCSUB MOV CX,[TMP1] GREV6: CALL SETXOR ; DRAW HORIZONTAL LINE CALL XDECSUB LOOP GREV6 CALL XINCSUB CALL YINCSUB MOV DX,[IY] CMP DX,[PY2] JLE GREV4 GREV7: CALL EGARST ; RESET EGA REGISTERS POP BP POP DS POP ES RETF 10 ; GREV ENDP ;==================================================== ; DRAW THE CURSOR ; ; CALL CURSOR (IX1, IY1, ICURSE, ICOLOR) ; CURSOR: PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+16 ; IX1 MOV AX,ES:[BX] MOV [IX1],AX MOV [IX2],AX MOV BX,[BP]+14 ; IY1 MOV AX,ES:[BX] MOV [IY1],AX ; FIRST USE IXMIN, IY1 MOV [IY2],AX MOV BX,[BP]+12 ; CURSOR TYPE MOV AX,ES:[BX] MOV [TMP3],AX MOV BX,[BP]+10 ; CURSOR COLOR MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [COLOR],AL CALL EGARST ; RESET EGA REGISTERS ;----------------------------------------------------------------------- ; DRAW A CURSOR AT IX1, IY1. TMP3 CAN BE 1 OR 2 TO MAKE 2 DIFFERENT ; CURSOR SHAPES. CURSOR SHOULD BE DRAWN IN XOR MODE. MOV AX,[SETXOR] MOV [SETSUB],AX MOV AX,[VIDMEM] ; SET ES TO VIDEO MEMORY FOR SETPOINT MOV ES,AX MOV [TMP1],3 ; SIZE OF 4 MOV [TMP2],2 CMP [IGLOBAL],2 JL CURS1 MOV [TMP1],4 ; TMP1 & 2 ARE SIZE - MORE FOR HI RES MOV [TMP2],2 ; FOR IGLOBAL > 2 AND NOT 22 CMP [IGLOBAL],22 JNZ CURS1 MOV [TMP1],8 ; TMP1 & 2 ARE SIZE - MORE FOR HI RES MOV [TMP2],3 CURS1: CMP [TMP3],1 ; CURSOR SHAPE JZ CURS1A JMP CURS6 ; ALTERNATE SHAPE CURS1A: ; X CURSOR MOV AX,[IX2] ; UPPER LEFT CORNER SUB AX,[TMP2] MOV [IX1],AX MOV AX,[IY2] ; SUBTRACT 2 FROM X AND Y SUB AX,[TMP2] MOV [IY1],AX CALL VIDXY MOV DX,[TMP1] CURS2: CALL CLIP CMP [ICLIP],0 JNZ CURS2A CALL SETSUB CURS2A: CALL XDECSUB CALL YDECSUB DEC DX JNZ CURS2 MOV AX,[IX2] ; UPPER RIGHT CORNER ADD AX,[TMP2] MOV [IX1],AX MOV AX,[IY2] ; SUBTRACT 2 FROM X AND Y SUB AX,[TMP2] MOV [IY1],AX CALL VIDXY MOV DX,[TMP1] CURS3: CALL CLIP CMP [ICLIP],0 JNZ CURS3A CALL SETSUB CURS3A: CALL XINCSUB CALL YDECSUB DEC DX JNZ CURS3 MOV AX,[IX2] ; LOWER RIGHT CORNER ADD AX,[TMP2] MOV [IX1],AX MOV AX,[IY2] ; SUBTRACT 2 FROM X AND Y ADD AX,[TMP2] MOV [IY1],AX CALL VIDXY MOV DX,[TMP1] CURS4: CALL CLIP CMP [ICLIP],0 JNZ CURS4A CALL SETSUB CURS4A: CALL XINCSUB CALL YINCSUB DEC DX JNZ CURS4 MOV AX,[IX2] ; LOWER LEFT CORNER SUB AX,[TMP2] MOV [IX1],AX MOV AX,[IY2] ; SUBTRACT 2 FROM X AND Y ADD AX,[TMP2] MOV [IY1],AX CALL VIDXY MOV DX,[TMP1] CURS5: CALL CLIP CMP [ICLIP],0 JNZ CURS5A CALL SETSUB CURS5A: CALL XDECSUB CALL YINCSUB DEC DX JNZ CURS5 JMP CURDONE CURS6: ; CROSS CURSOR CMP [TMP3],2 ; CURSOR SHAPE JZ CURS6A JMP CURS11 ; ALTERNATE SHAPE CURS6A: MOV AX,[IX2] ; LEFT SUB AX,[TMP2] MOV [IX1],AX MOV AX,[IY2] ; SUBTRACT 2 FROM X MOV [IY1],AX CALL VIDXY MOV DX,[TMP1] CURS7: CALL CLIP CMP [ICLIP],0 JNZ CURS7A CALL SETSUB CURS7A: CALL XDECSUB DEC DX JNZ CURS7 MOV AX,[IX2] ; RIGHT ADD AX,[TMP2] MOV [IX1],AX MOV AX,[IY2] ; ADD 2 TO X MOV [IY1],AX CALL VIDXY MOV DX,[TMP1] CURS8: CALL CLIP CMP [ICLIP],0 JNZ CURS8A CALL SETSUB CURS8A: CALL XINCSUB DEC DX JNZ CURS8 MOV AX,[IX2] ; BOTTOM MOV [IX1],AX MOV AX,[IY2] ; ADD 2 TO Y ADD AX,[TMP2] MOV [IY1],AX CALL VIDXY MOV DX,[TMP1] CURS9: CALL CLIP CMP [ICLIP],0 JNZ CURS9A CALL SETSUB CURS9A: CALL YINCSUB DEC DX JNZ CURS9 MOV AX,[IX2] ; LOWER MOV [IX1],AX MOV AX,[IY2] ; SUBTRACT 2 FROM Y SUB AX,[TMP2] MOV [IY1],AX CALL VIDXY MOV DX,[TMP1] CURS10: CALL CLIP CMP [ICLIP],0 JNZ CURS10A CALL SETSUB CURS10A: CALL YDECSUB DEC DX JNZ CURS10 JMP CURDONE CURS11: ; CURSOR BASED ON 32 BYTE MASK CMP [TMP3],3 JZ CURSBOX MOV AX,[IX2] ; UPPER LEFT CORNER MOV [IX1],AX MOV AX,[IY2] MOV [IY1],AX CALL VIDXY MOV DI,OFFSET ARWBUFF JMP SHORT CURS11A1 CURSBOX: MOV AX,[IX2] ; UPPER LEFT CORNER SUB AX,7 MOV [IX1],AX MOV AX,[IY2] ; SUBTRACT 8 FROM X AND Y SUB AX,7 MOV [IY1],AX CALL VIDXY MOV DI,OFFSET CURBUFF CURS11A1: MOV CX,8 CURS11A: PUSH CX MOV CX,8 MOV DL,[DI] CURS12: RCL DL,1 JNC CURS13 CALL CLIP CMP [ICLIP],0 JNZ CURS13 CALL SETSUB CURS13: CALL XINCSUB LOOP CURS12 INC DI MOV CX,8 MOV DL,[DI] CURS14: RCL DL,1 JNC CURS15 CALL CLIP CMP [ICLIP],0 JNZ CURS15 CALL SETSUB CURS15: CALL XINCSUB LOOP CURS14 INC DI CALL XDECSUB CALL YINCSUB MOV CX,8 MOV DL,[DI+1] CURS16: RCR DL,1 JNC CURS17 CALL CLIP CMP [ICLIP],0 JNZ CURS17 CALL SETSUB CURS17: CALL XDECSUB LOOP CURS16 INC DI MOV CX,8 MOV DL,[DI-1] CURS18: RCR DL,1 JNC CURS19 CALL CLIP CMP [ICLIP],0 JNZ CURS19 CALL SETSUB CURS19: CALL XDECSUB LOOP CURS18 INC DI CALL XINCSUB CALL YINCSUB POP CX DEC CX JZ CURDONE JMP CURS11A CURDONE: ;CMP [SETREP],OFFSET SETPNT4 ;JNZ CURDON1 ; SET THE COLOR TO WHITE FOR EGA'S ;MOV DX,3C4H ;MOV AL,2 ; PLANE MAP MASK ;OUT DX,AL ;INC DX ;MOV AL,0FH ; ALL PLANES ;OUT DX,AL ; COLOR CURDON1: CALL EGARST POP BP POP DS POP ES RETF 8 ;CURSOR ENDP ;============================================ GALLOC: PUSH DS PUSH ES PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+20 MOV AX,ES:[BX] ; 60K SEGMENT OF VIDEO BUFFER MOV [VIDEO2],AX MOV BX,[BP]+18 MOV AX,ES:[BX] ; 32K SEGMENT OF VIDEO BUFFER MOV [VIDEO2B],AX MOV BX,[BP]+16 MOV AX,ES:[BX] ; 32K SEGMENT OF VIDEO BUFFER MOV [VIDEO2C],AX MOV BX,[BP]+14 MOV AX,ES:[BX] ; 32K SEGMENT OF VIDEO BUFFER MOV [VIDEO2D],AX MOV BX,[BP]+12 MOV AX,ES:[BX] ; VIDEO BUFFER LENGTH MOV [VIDLEN],AX MOV BX,[BP]+10 MOV AX,ES:[BX] ; DISPLAY ROW LENGHT (BYTES) MOV [ROWLEN],AX POP BP POP ES POP DS RETF 12 ;GALLOC ENDP ;======================================= ; DRAW A BOX ; ; CALL GBOX(IX1, IY1, IX2, IY2, COLOR, MODE) ; ; IX1, IY1 IS LOWER LEFT, IX2 IY2 IS UPPER RIGHT GBOX: PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+20 ; IX1 MOV AX,ES:[BX] MOV [IX1],AX MOV [PX1],AX MOV BX,[BP]+18 ; IY1 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+16 ; IX2 MOV AX,ES:[BX] MOV [IX2],AX MOV [PX2],AX MOV BX,[BP]+14 ; IY2 MOV AX,ES:[BX] MOV [IY2],AX MOV [PY2],AX MOV BX,[BP]+12 ; COLOR MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [COLOR],AL MOV BX,[BP]+10 ; MODE MOV AX,ES:[BX] MOV [MODE],AL CALL EGARST ; RESET EGA REGISTERS ;----------------------------------------------------------------------- ; DRAW A BOX USING OPPOSITE CORNERS IX1, IY1 TO IX2, IY2 (ANY ORDER). ; USE COLOR [COLOR], MODE [MODE]. ; MODE: 0 = REPLACE, RANGE CHECK. ; MODE: 2 = REPLACE, RANGE CHECK. ; MODE: 8 = REPLACE, NO RANGE CHECK. ; MODE: 10 = REPLACE, NO RANGE CHECK. MOV BX,[SETREP] ; SET MODE SUBROUTINE TEST AL,7 JZ GV2 MOV BX,[SETXOR] GV2: MOV [SETSUB],BX MOV DX,[VIDMEM] MOV ES,DX CALL VIDXY ; GET VIDEO ADDRESS INTO BX CALL HLINE ; IX1, IY1 TO PX2, IY1 CALL VIDXY CALL VLINE ; IX1, IY1 TO IX1, PY2 MOV AX,[IY1] ; DRAW ONLY 1 TIME IF IY1=IY2 OR IX1=IX2 CMP AX,[IY2] JZ BXSKIP5 MOV AX,[IX2] CMP AX,[IX1] JZ BXSKIP5 MOV [IX1],AX CALL VIDXY CALL VLINE MOV AX,[PX1] MOV [IX1],AX MOV AX,[IY2] MOV [IY1],AX CALL VIDXY CALL HLINE BXSKIP5: ;----------------------------------------------------------------------- CALL EGARST ; RESET EGA REGISTERS POP BP POP DS POP ES RETF 12 ;GBOX ENDP ;========================================================= GCLS: PUSH BP PUSH DS PUSH ES MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP ;----------------------------------------------------------------------- ; CLEAR THE GRAPHICS SCREEN MOV [MODE],0 ; WRITE TO BOARD MOV CL,0 MOV CH,3 GCLS2C: ; CH IS TEST, CL IS COUNTER PUSH CX CALL VIDPAGE MOV ES,CX MOV DI,0 MOV CX,[VIDLEN] SHR CX,1 ; WORD MOVE GCLS2E: MOV AX,0 CLD REP STOSW ; SAVE AX AT ES:[DI] CX TIMES POP CX INC CL CMP CL,CH JLE GCLS2C ; LOOP FOR NEXT PAGE ;----------------------------------------------------------------------- POP ES POP DS POP BP RETF ;GCLS ENDP ;================================================== ; DRAW THE CROSSHAIRS ; ; CALL GCROSS (IX1, IY1, ICOLOR) ; GCROSS: PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+14 ; IX1 MOV AX,ES:[BX] MOV [IX2],AX MOV BX,[BP]+12 ; IY1 MOV AX,ES:[BX] MOV [IY2],AX ; FIRST USE IXMIN, IY1 MOV [IY1],AX ; FIRST USE IXMIN, IY1 MOV BX,[BP]+10 ; COLOR MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [COLOR],AL ;----------------------------------------------------------------------- ; DRAW A SET OF CROSSHAIRS CROSSING AT IX2,IY2. THEY SHOULD GO FROM ; IXMIN TO IXMAX, AND FROM IYMIN TO IYMAX, CROSSING AT IX2, IY2. ; IT MUST BE DRAWN IN XOR MODE. MOV AX,[IXMIN] MOV [IX1],AX MOV AX,[IXMAX] MOV [PX2],AX MOV [MODE],9 ; NO BOUNDRY CHECK, XOR MOV AX,[SETXOR] MOV [SETSUB],AX CALL EGARST ; RESET EGA REGISTERS MOV DX,[VIDMEM] MOV ES,DX CALL VIDXY ; GET VIDEO ADDRESS INTO BX CALL HLINE ; DRAW HORIZONTAL LINE MOV AX,[IYMIN] MOV [IY1],AX MOV AX,[IX2] MOV [IX1],AX CALL VIDXY ; GET VIDEO ADDRESS INTO BX MOV DX,[IYMAX] MOV [PY2],DX CALL VLINE ; DRAW VERTICAL LINE CALL EGARST ; RESET EGA REGISTERS POP BP POP DS POP ES RETF 6 ;GCROSS ENDP ;================================================= GETPOINT: PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+14 ; IX1 MOV AX,ES:[BX] MOV [IX1],AX MOV BX,[BP]+12 ; IY1 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+10 ; IY1 MOV [TMP3],BX PUSH ES MOV ES,[VIDMEM] CALL EGARST ; RESET EGA REGS. CALL VIDXY CALL RPOINT POP ES MOV BX,[TMP3] MOV CH,0 MOV ES:[BX],CX POP BP POP DS POP ES RETF 6 ;GETPOINT ENDP ;=================================================== GGET: ; GET A SECTION OF THE SCREEN INTO A RAM BUFFER. ; CALL GGET (IX1, IY1, IX2, IY2, BUFFER, IMODE) ; BUFFER BYTES: 0-1 = TOTAL BUFFER LENGTH ; BUFFER BYTES: 2-3 = X LENGTH, IN BYTES ; BUFFER BYTES: 4-5 = Y LENGTH, IN LINES PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+24 MOV AX,ES:[BX] MOV [IX1],AX MOV BX,[BP]+22 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+20 MOV AX,ES:[BX] MOV [IX2],AX MOV BX,[BP]+18 MOV AX,ES:[BX] MOV [IY2],AX MOV DX,[BP]+16 ; BUFFER SEGMENT MOV [ESEG],DX MOV DI,[BP]+14 ; BUFFER OFFSET MOV [BUFF],DI MOV BX,[BP]+12 MOV AX,ES:[BX] MOV [HANDLE],AX ; FILE HANDLE MOV BX,[BP]+10 MOV [XRETC],BX ; THIS IS ALSO THE RETURN CODE MOV AX,ES:[BX] MOV [TMP3],AX ; TMP3 IS 1 FOR OUTPUT TO FILE, 0 TO RAM MOV WORD PTR ES:[BX],0 ; SAVE 0 RETURN CODE AS DEFAULT MOV [PSEG],ES CALL EGARST MOV ES,DX MOV [MODE],1 MOV [DSEG],DS ; SAVE THE DATA SEGMENT MOV [ICOUNT],0 ; PREPARE RUNCODE SUBRROUTINE ; SORT POINTS MOV AX,[IX1] MOV BX,[IX2] CMP BX,AX JGE SORTQ1 MOV [IX1],BX ; SWAP X1, X2 MOV [IX2],AX SORTQ1: MOV AX,[IY1] MOV BX,[IY2] CMP BX,AX JGE SORTQ2 MOV [IY1],BX ; SWAP Y1, Y2 MOV [IY2],AX SORTQ2: ; ADJUST THE X'S TO INCLUDE THE COMPLETE BYTES MOV CL,[BITPIX] MOV AX,1 ; SET AX TO FFFF, FFFE, FFFC, OR FFF8, SHL AX,CL ; FOR 1, 2, 4, OR 8 PIXELS PER BYTE DEC AX MOV CX,AX ; CX IS PIXELS PER BYTE - 1 NOT AX ; AX CAN NOW BE ANDED WITH THE X'S AND [IX1],AX ; ROUND IX1 DOWN TO THE NEXT BYTE AND [IX2],AX ; ROUND IX2 UP TO THE NEXT BYTE ADD [IX2],CX MOV AX,[IX2] ; AX IS THE BYTE RANGE SUB AX,[IX1] INC AX MOV CL,[BITPIX] ; GET X LENGTH IN BYTES SHR AX,CL ; AX IS THE X COUNT MOV [TMP1],AX ; TMP1 IS THE X COUNTER MOV ES,[VIDMEM] PUSH AX CALL VIDXY ; GET THE VIDEO ADDRESS POP AX PUSH ES POP DS ; DS HAS THE VIDEO SEGMENT MOV ES,CS:[ESEG] ; REPLACE ES MOV CS:[I1],0 ; I1 TELLS WHETHER EGINCSUB WAS CALLED CMP CS:[TMP3],0 JZ GGET1A CALL PCXHEADOUT JMP GGET1B GGET1A: MOV AX,CS:[TMP1] ; TMP1 IS THE X COUNTER MOV ES:[DI],AX ; SAVE X LENGTH AT BEGINNING OF THE ARRAY MOV AX,CS:[IY2] SUB AX,CS:[IY1] INC AX MOV ES:[DI+2],AX ; SAVE Y LENGTH NEXT IN THE ARRAY ADD DI,4 GGET1B: ; ES AND DI ARE ALREADY SET GGET2: MOV CH,CS:[NPLANES] DEC CH ; COUNT 0 TO N-1 MOV CL,0 GGET4: PUSH CX PUSH ES MOV AX,DS ; SET ES TO VIDEO SEGMENT MOV ES,AX CALL VIDPLANE ; GET ON CORRECT COLOR PLANE - CL TELLS WHICH. MOV DS,CX ; VIDPAGE GETS THIS POP ES MOV SI,BX MOV CX,CS:[TMP1] GGET6A: ; CHECK FOR NEW SEGMENT ACROSS X PUSH CX MOV CL,DS:[SI] CALL RUNCODE ; STORE CL AT ES:[DI], COMPRESSED ADD SI,1 JNC GGET6B INC CS:[EGASEG] AND CS:[EGASEG],7 CALL CS:VGSEGSUB MOV CS:[I1],1 GGET6B: POP CX LOOP GGET6A CALL RUNFLUSH ; GET RID OF LAST RUNCODE STUFF CMP CS:[I1],1 ; IF EGINCSUB WAS CALLED BEFORE, CALL VGSEGSUB JNZ GGET6C DEC CS:[EGASEG] AND CS:[EGASEG],7 CALL CS:VGSEGSUB MOV CS:[I1],0 GGET6C: POP CX INC CL CMP CL,CH JLE GGET4 CMP CS:[TMP3],0 ; TMP3=0 IF OUTPUT TO RAM, 1 IF OUTPUT TO DISK JZ GGET7 CALL PUTREC ; OUTPUT TO DISK FILE CMP CS:[IRETC],0 JZ GGET7 ; NO ERROR MOV DS,CS:[DSEG] ; GET THE NORMAL DATA SEGMENT BACK MOV AX,[IRETC] ; SAVE THE RETURN CODE AND EXIT MOV ES,[PSEG] MOV BX,[XRETC] MOV WORD PTR ES:[BX],AX JMP GGET10 GGET7: ; NORMALLY IN THIS LOOP, DS = VIDEO BOARD SEGMENT, ES = BUFFER SEGMENT PUSH ES MOV AX,DS ; SET ES = VIDEO BOARD SEGMENT MOV ES,AX MOV DS,CS:[DSEG] ; GET THE NORMAL DATA SEGMENT BACK CALL YINCSUB ; YINCSUB CAN CHANGE ES MOV AX,ES ; SET DS = VIDEO BOARD SEGMENT MOV DS,AX POP ES MOV AX,CS:[IY] CMP AX,CS:[IY2] JG GGET8 JMP GGET2 GGET8: CMP CS:[PCXBPX],8 ; 256 COLOR? JZ GGET9 CMP CS:[PCXNPL],8 JNZ GGET10 GGET9: ; CALL PCXTAILOUT GGET10: ; DONE CALL EGARST ; RESET EGA COLORS - IF EGA POP BP POP DS POP ES RETF 16 ;GGET ENDP ;======================================= GGETL: ; GET A LINE FROM THE SCREEN ; CALL GGETL (IX, IY, IX1, BUFFER); PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+18 MOV AX,ES:[BX] MOV [IX1],AX MOV BX,[BP]+16 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+14 MOV AX,ES:[BX] MOV [IX2],AX MOV DX,[BP]+12 ; BUFFER SEGMENT MOV DI,[BP]+10 ; BUFFER OFFSET MOV [ESEG],DX ; SORT POINTS MOV AX,[IX1] MOV BX,[IX2] CMP BX,AX JGE GGETL1 MOV [IX1],BX ; SWAP X1, X2 MOV [IX2],AX GGETL1: MOV CX,[IX2] SUB CX,[IX1] INC CX MOV ES,[ESEG] ; SAVE THE STRING LENGTH AT THE BEGINNING MOV ES:[DI],CX ADD DI,2 MOV ES,[VIDMEM] CALL VIDXY ; GET THE VIDEO ADDRESS GGETL2: PUSH CX CALL RPOINT PUSH ES ; CHANGE ES FROM VIDEO TO DATA BUFFER SEGMENT MOV ES,[ESEG] MOV ES:[DI],CL ; CL WAS READ BY RPOINT - PIXEL COLOR. POP ES INC DI CALL XINCSUB POP CX LOOP GGETL2 ; DONE POP BP POP DS POP ES RETF 10 ;GGETL ENDP ;======================================= ISCRX DW 0 ISCRY DW 0 IBUFF DW 0 XL3 DW 117 XL DW 39 BLKLENX DW 14508 GPAGE: PUSH DS PUSH ES PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+10 ; SCNMODE - READ OR WRITE MOV AX,ES:[BX] MOV [MODE],AL CALL EGARST ; RESET EGA REGISTERS MOV AX,[VIDEO2] CMP [MODE],0 ; READ ONTO SCREEN? JZ MODE0E JMP MODE1E MODE0E: MOV CS:[EMPAGE],0 MOV CL,0 MOV CH,3 ; HOW MANY PAGES EGAP1: PUSH CX CALL VIDPAGE ; ENABLE THE EGA PAGE MOV DS,AX ; VIDEO2, 2B, 2C, OR 2D CMP CS:[VHANDLE],0 ; GET EMS PAGE, IF NECESSARY JZ NOEM1 MOV BX,CS:[EMPAGE] CALL GETEMS ADD CS:[EMPAGE],4 NOEM1: MOV ES,CS:[VIDMEM] ; GET VIDEO SEG MOV DI,0 ; START OUT AT 0 MOV SI,0 MOV CX,CS:[VIDLEN] CLD REP MOVSB ; DS:SI TO ES:DI POP CX INC CL CMP CL,CH JLE EGAP1 MOV AL,0FH OUT DX,AL JMP ONEDONE ; DONE WITH EGA READ MODE1E: ; WRITE INTO MEMORY MOV CS:[EMPAGE],0 MOV CL,0 MOV CH,3 ; HOW MANY PAGES EGAP2: PUSH CX CALL VIDPAGE ; ENABLE THE EGA PAGE MOV ES,AX ; VIDEO 2, 2B, 2C, OR 2D MOV DI,0 ; START OUT AT 0 MOV SI,0 MOV CX,CS:[VIDLEN] MOV DS,CS:[VIDMEM] ; VIDEO BUFFER CLD REP MOVSB ; DS:SI TO ES:DI CMP CS:[VHANDLE],0 ; GET EMS PAGE, IF NECESSARY JZ NOEM5 MOV BX,CS:[EMPAGE] CALL PUTEMS ADD CS:[EMPAGE],4 NOEM5: POP CX INC CL CMP CL,CH JLE EGAP2 MOV AL,0 ; RESET READ MAP MASK OUT DX,AL ONEDONE: POP BP POP ES POP DS RETF 2 ;GPAGE ENDP ;==================================================== ; PAINT ROUTINE: CALL GPAINT (IX1, IY1, COLOR, MAXPAINT, ISCR(0)) ; ; COLOR - COLOR TO PAINT WITH ; GPAINT: PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BP,SP MOV BX,[BP]+22 ; IX1 MOV AX,ES:[BX] MOV [IX1],AX MOV [IX2],AX MOV BX,[BP]+20 ; IY1 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+18 ; COLOR MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [COLOR],AL MOV BX,[BP]+16 ; MODE MOV AX,ES:[BX] MOV [MODE],AL MOV BX,OFFSET GLOOK ; SET GLOOKSUB TO GLOOK (AL=0) OR GLOOK1 (AL=1) CMP AL,0 ; GLOOK PAINTS BLACK, GLOOK1 PAINTS TO [COLOR] JZ GPAINT1 MOV BX,OFFSET GLOOK1 GPAINT1: MOV [GLOOKSUB],BX MOV BX,[BP]+14 MOV AX,ES:[BX] SHR AX,1 ; MAXPAINT := MAXPAINT / 2 - 4 SUB AX,4 MOV [MAXPAINT],AX MOV BX,[BP]+12 ; BUFFER SEGMENT MOV ES,BX MOV BX,[BP]+10 ; BUFFER MEMORY MOV [BUFF],BX MOV SI,BX ; SI IS THE BASE MOV AX,0 MOV ES:[BX],AX ; ZERO POINT PAIR COUNTER MOV AX,2 ; THE FIRST 2 BYTES ARE THE COUNTER MOV [HEAD],AX ; QUEUE HEAD MOV [TAIL],AX ; QUEUE TAIL MOV AL,0 MOV [MODE],AL ; REPLACE MODE FOR HLINE MOV AX,[SETREP] MOV [SETSUB],AX CALL PCHECK ; GET NEXT X,Y TO PAINT PLOOP: MOV BX,[TAIL] CMP BX,[MAXPAINT] ; WRAP BX AROUND JG PDONE ; AT END OF BUFFER ; JL SKIPP1 ; MOV BX,0 SKIPP1: CMP BX,[HEAD] ; ARE WE AT TAIL? JZ PDONE ; GET IX1, IY1, IX2 FROM QUEUE MOV AX,ES:[BX+SI] ; IX1 MOV [IX1],AX ADD BX,2 MOV AX,ES:[BX+SI] ; IY1 MOV [IY1],AX ADD BX,2 MOV AX,ES:[BX+SI] ; IX2 MOV [IX2],AX ADD BX,2 MOV [TAIL],BX INC [IY1] CALL PCHECK ; CHECK LINE BELOW DEC [IY1] DEC [IY1] CALL PCHECK ; CHECK LINE ABOVE MOV DL,0FFH ; CHECK FOR ESCAPE MOV AH,6 INT 21H JZ PLOOP ; NO CHARACTER CMP AL,27 JNZ PLOOP ; NOT ESC PDONE: POP BP POP DS POP ES RETF 14 ;GPAINT ENDP ;==================================================== GPOINT: ; DRAWS A LINE ; ; CALL GVECT (IX1, IY1, IX2, IY2, ICOLOR, IMODE) ; ICOLOR - WHAT COLOR TO USE - A BYTE MASK. ; IMODE - REPLACE = 0, COMPLEMENT = 2 WITH RANGE CHECK ; REPLACE = 8, COMPLEMENT = 10 WITHOUT RANGE CHECK PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+16 MOV AX,ES:[BX] MOV [IX1],AX MOV BX,[BP]+14 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+12 MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [COLOR],AL ; MOVE COLOR INTO MASK MOV BX,[BP]+10 ; REPLACE = 0, COMPLEMENT = 1 MOV AX,ES:[BX] MOV [MODE],AL CALL EGARST ; RESET EGA REGISTERS ;----------------------------------------------------------------------- ; SET A POINT AT IX1, IY1. SAME OTHER PARAMETERS AS GVECT. MOV BX,[SETREP] ; SETUP SUBROUTINE ADDRESS TEST AL,7 JZ GP1 MOV BX,[SETXOR] GP1: MOV AX,[VIDMEM] MOV ES,AX MOV [SETSUB],BX CALL VIDXY ; GET VIDEO ADDRESS INTO BX-AL MOV [ICLIP],0 ; ASSUME IN BOUNDS TEST [MODE],8 ; SKIP RANGE TEST IF BIT IS ON JNZ PTSKIP1 CALL CLIP CMP [ICLIP],0 JNZ PTSKIP5 ; SKIP IF OUT OF RANGE PTSKIP1: CALL SETSUB PTSKIP5: POINTDONE: ;----------------------------------------------------------------------- CALL EGARST ; RESET EGA REGISTERS POP BP POP DS POP ES RETF 8 ;GPOINT ENDP ;======================================= GPUT: ; PUT A SECTION OF THE SCREEN FROM RAM BUFFER BACK ONTO THE SCREEN ; CALL GPUT (IX1, IY1, IMODE, BUFFER) PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+20 MOV AX,ES:[BX] MOV [IX1],AX MOV BX,[BP]+18 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+16 ; TMP3 - 0 = REPLACE + 256 IF FROM FILE MOV AX,ES:[BX] ; 1 = XOR + 256 IF FROM FILE MOV [TMP3],AX ; SAVE 0 OR 1 MOV BX,[BP]+14 ; FILE HANDLE MOV AX,ES:[BX] MOV [HANDLE],AX MOV AX,[BP]+12 ; BUFFER SEGMENT MOV [ESEG],AX ; SAVE SEGMENT MOV SI,[BP]+10 ; BUFFER OFFSET MOV [BUFF],SI CALL EGARST MOV [MODE],0 MOV [DSEG],DS ; SAVE DATA SEGMENT MOV [IBUFTOP],SI ADD [IBUFTOP],512 ; 512 BYTE BUFFER, IF READ FROM FILE TEST [TMP3],256 ; SAVE 256 BYTE HEADER FOR FILE OUTPUT JZ GPUT1A CALL PCXHEADIN CMP [IRETC],0 JZ GPUT1C JMP GPUTDONE GPUT1C: CMP [IX1],-1 JNZ GPUT1D ; -1 FOR X MEANS GO TO THE ORIGINAL LOCATION MOV AX,[PCXX1] MOV [IX1],AX MOV AX,[PCXY1] MOV [IY1],AX GPUT1D: CALL GETREC ; READ THE FIRST RECORD INTO BUFF JMP GPUT1B GPUT1A: MOV ES,[ESEG] ; GET X,Y DIMENSIONS FOR RAM OUTPUT MOV AX,ES:[SI] MOV [TMP1],AX ; X COUNT MOV AX,ES:[SI]+2 MOV [TMP2],AX ; Y COUNT ADD SI,4 MOV AL,[NPLANES] ; NPLANES FOR NOW (PCX FILES MAY BE DIFFERENT) MOV [GETNPL],AL GPUT1B: MOV ES,[VIDMEM] PUSH AX CALL VIDXY ; GET THE VIDEO ADDRESS POP AX MOV DX,0 ; DH IS ICOUNT, DL IS IBYTE MOV DS,[ESEG] ; SI IS ALREADY SET GPUT2: ; SCAN LINE LOOP MOV CH,CS:[GETNPL] DEC CH ; COUNT 0 TO N-1 MOV CL,0 GPUT4: ; PLANE LOOP PUSH CX CMP CS:[GETNPL],1 ; DON'T DO VIDPAGE IF ONE COLOR PLANE JLE GPUT4A CALL VIDPAGE ; GET ON CORRECT COLOR PLANE - CL TELLS WHICH. MOV ES,CX ; VIDPAGE GETS THIS GPUT4A: MOV DI,BX MOV CX,CS:[TMP1] MOV AX,CS:[TMP3] ; XOR? MOV AH,AL ; AH=1 FOR XOR, 0 FOR REPLACE GPUT6A: ; BYTE LOOP ; ====== BEGINNING OF UNCODE OR DH,DH ; IS DH 0? FIRST TIME? JNZ UNC2 ; GET ICOUNT, IBYTE FROM FILE INC DH ; SET COUNT TO 1 MOV DL,[SI] ; CHECK NEXT BYTE, DON'T INC SI THOUGH AND DL,0C0H CMP DL,0C0H ; IF AL = C0 THEN IT'S A COUNT FIELD JNZ UNC1 MOV DH,[SI] AND DH,3FH ; GET RID OF THE C0 COUNT FLAG. INC SI CMP SI,CS:[IBUFTOP] ; NEED ANOTHER RECORD? JL UNC1 TEST CS:[TMP3],256 JZ UNC1 ; SKIP - READING FROM MEMORY CALL GETREC ; GET THE NEXT 512 BYTES FROM DISK UNC1: MOV DL,[SI] INC SI CMP SI,CS:[IBUFTOP] ; NEED ANOTHER RECORD? JL UNC2 TEST CS:[TMP3],256 JZ UNC2 ; SKIP - READING FROM MEMORY CALL GETREC ; GET THE NEXT 512 BYTES FROM DISK UNC2: DEC DH ; ====== END OF UNCODE OR AH,AH JNZ GPUTXOR ; XOR OR REPLACE? MOV ES:[DI],DL JMP SHORT GPUT7 GPUTXOR: XOR ES:[DI],DL GPUT7: ADD DI,1 LOOP GPUT6A POP CX INC CL CMP CL,CH JG GPUT6D JMP GPUT4 ; LOOP FOR NEXT PLANE GPUT6D: PUSH DS PUSH DX MOV DS,CS:[DSEG] CALL CS:YINCSUB POP DX POP DS DEC CS:[TMP2] JZ GPUTDONE JMP GPUT2 GPUTDONE: ; DONE POP BP POP DS POP ES RETF 12 ;GPUT ENDP ;======================================= GPUTL: ; PUT A LINE ONTO THE SCREEN ; CALL GPUTL (IX, IY, IMODE, BUFFER); PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+18 MOV AX,ES:[BX] MOV [IX1],AX MOV BX,[BP]+16 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+14 MOV AX,ES:[BX] MOV [MODE],AL MOV DX,[BP]+12 ; BUFFER SEGMENT MOV DI,[BP]+10 ; BUFFER OFFSET MOV [ESEG],DX ; SAVE THE BUFER SEGMENT MOV AX,[SETREP] ; MODE IS 0 FOR REPLACE, 1 FOR XOR CMP [MODE],0 JZ GPUTL1 MOV AX,[SETXOR] GPUTL1: MOV [SETSUB],AX MOV ES,[ESEG] ; GET THE STRING LENGTH MOV CX,ES:[DI] ADD DI,2 MOV ES,[VIDMEM] CALL VIDXY ; PUT THE VIDEO ADDRESS GPUTL2: PUSH CX PUSH ES ; CHANGE ES FROM VIDEO TO PASCAL DATA SEGMENT MOV ES,[ESEG] MOV CL,ES:[DI] ; SAVE THE BYTE RETURNED FROM RPOINT INC DI POP ES CMP [MODE],1 JNZ GPUTL3 CMP CL,0 JZ GPUTL4 GPUTL3: MOV [COLOR],CL CALL SETSUB GPUTL4: CALL XINCSUB POP CX LOOP GPUTL2 ; DONE POP BP POP DS POP ES RETF 10 ;GPUTL ENDP ;======================================= GRANGE: ; INITIALIZES IXMIN, IXMAX, IYMIN, IYMAX, IGLOBAL - SAVES THE PARAMETERS ONLY ; IGLOBAL IS THE TYPE OF DISPLAY. THESE ARE READ FROM THE FILE DCAD1.SYS IN ; THE MAIN PROGRAM. ; CALL GRANGE(IXMIN, IXMAX, IYMIN, IYMAX, IGLOBAL) PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+28 MOV AX,ES:[BX] MOV [IXMIN],AX MOV BX,[BP]+26 MOV AX,ES:[BX] MOV [IXMAX],AX MOV BX,[BP]+24 MOV AX,ES:[BX] MOV [IYMIN],AX MOV BX,[BP]+22 MOV AX,ES:[BX] MOV [IYMAX],AX MOV BX,[BP]+20 ; 0 = IBM SCREEN, 1 = VIRTUAL, 2 = TECMAR MOV AX,ES:[BX] MOV [IGLOBAL],AL MOV BX,[BP]+18 ; SCREEN SIZE - HORIZONTAL DOTS MOV AX,ES:[BX] MOV [IXMAXA],AX MOV BX,[BP]+16 ; SCREEN SIZE - VERTICAL DOTS MOV AX,ES:[BX] MOV [IYMAXA],AX MOV BX,[BP]+14 ; SCREEN SIZE - VERTICAL DOTS MOV AX,ES:[BX] MOV [ICHRW],AL MOV BX,[BP]+12 ; SCREEN SIZE - VERTICAL DOTS MOV AX,ES:[BX] MOV [ICHRH],AL MOV BX,[BP]+10 ; SCREEN SIZE - VERTICAL DOTS MOV AX,ES:[BX] MOV [BIOSTXT],AL MOV [EGA16],1 MOV [NPLANES],4 ;COLOR PLANES MOV [BITPIX],3 ; LOG2(PIXELS PER BYTE) MOV [BW],1 ; BACK & WHITE (NOT REALLY) MOV [VIDMEM],0A000H MOV [YINCSUB],OFFSET YINC1 ; INCREMENT SUBROUTINES MOV [YDECSUB],OFFSET YDEC1 MOV [XINCSUB],OFFSET XINC2 MOV [XDECSUB],OFFSET XDEC2 MOV [SETREP],OFFSET SETPNT4 ; SET POINT SUBROUTINES MOV [SETXOR],OFFSET SETPNT5 MOV [CHARSUB],OFFSET CHAR3 ; CHARACTER SUBROUTINE MOV [VIDSUB],OFFSET VID6 POP BP POP DS POP ES RETF 20 ;GRANGE ENDP ;=========================================== ; INITIALIZE VIDEO MODE, CLEAR SCREEN IF SAME MODE ; CALL GSCREEN (MODE) GSCREEN: PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP ;----------------------------------------------------------------------- ; INITIALIZE THE SCREEN BASED ON THE GRAPHICS MODE. ; 2 MODES CAN BE USED - GRAPH, OR TEXT. THESE VALUES ARE FOUND IN THE ; FILE DCAD1.SYS. FOR EXAMPLE, ON AN EGA, THE TEXT MODE IS 3 AND GRAPHICS ; MODE IS 16, CORRESPONDING TO THE BIOS PARAMETERS. THE MODES CAN BE ; ANYTHING YOU WANT HERE, THOUGH. MOV BX,[BP]+10 ; SCREEN MODE MOV AX,ES:[BX] ; AX = MODE MOV [SCRMODE],AL GSCR1: ; STANDARD IBM BIOS CALLS MOV AL,[SCRMODE] ; AL = MODE MOV BL,0 MOV AH,0 INT 10H CMP [SCRMODE],3 JG GSCR1A MOV DX,0 ; HOME CURSOR FOR TEXT MOV AH,2 MOV BH,0 INT 10H GSCR1A: ; GRAPHICS MODE ;----------------------------------------------------------------------- POP BP POP DS POP ES RETF 2 ;GSCREEN ENDP ;================================================= GTEXT: PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+16 ; COLOR1 MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [COLOR],AL MOV BX,[BP]+14 ; COLOR2 MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [BCOLOR],AL MOV BX,[BP]+20 ; X POSITION MOV AX,ES:[BX] CMP AX,0 ; IF -1, USE LAST POSITION JL TEXT4 MOV [TX1],AX ; TX1 IS CURSOR POSITION MOV [IX1],AX MOV [PX1],AX JMP TEXT5 TEXT4: MOV AX,[TX1] ; USE LAST POSITION MOV [IX1],AX TEXT5: MOV BX,[BP]+18 ; Y POSITION MOV AX,ES:[BX] ; IF -1 THEN USE LAST POSITION CMP AX,0 JL TEXT6 TEXT5A: MOV [TY1],AX ; TY1 IS CURSOR POSITION MOV [IY1],AX JMP TEXT7 TEXT6: MOV AX,[TY1] ; USE LAST POSITION MOV [IY1],AX TEXT7: MOV BX,[BP]+10 MOV AL,ES:[BX] ; LENGTH INC BX ; BX IS ADDRESS OF ACTUAL STRING MOV AH,0 CMP AX,0 JZ NULLSTR MOV [TMP1],AX ; STRING LENGTH MOV [TMP2],BX ; STRING ADDRESS (IN ES:) CALL EGARST CMP [BIOSTXT],0 JZ TEXT7C CALL BIOSTEXT ; USE BIOS TO DISPLAY TEXT JMP NULLSTR TEXT7C: MOV BP,ES MOV ES,[VIDMEM] CALL VIDXY ; GET SCREEN ADDRESS IN BX MOV DX,ES ; VIDXY MAY CHANGE ES MOV ES,BP MOV CX,[TMP1] MOV SI,[TMP2] TEXT1: MOV AL,ES:[SI] ; GET CHARACTER MOV AH,0 SHL AX,1 ; (ASCII * 16) SHL AX,1 SHL AX,1 SHL AX,1 TEXT8: MOV DI,[LETTERS] ADD DI,AX ; DI IS THE ADDRESS OF THE LETTER CALL CHARSUB ; INPUTS DI, BX, INCS BX INC SI LOOP TEXT1 NULLSTR: CALL EGARST POP BP POP DS POP ES RETF 12 ;GTEXT ENDP ;=========================================== BIOSTEXT PROC NEAR ; POSITION CURSOR MOV AX,[TX1] ; X DOT POSITION MOV CL,[ICHRW] DIV CL MOV DL,AL ; COLUMN (X) MOV AX,[TY1] ; Y DOT POSITION MOV CL,[ICHRH] DIV CL MOV DH,AL ; ROW (Y) MOV BH,[BIOSPAGE] ; PAGE MOV BL,[COLOR] ; FOREGROUND COLOR AND BL,7FH ; DO NOT XOR CHARACTER MOV SI,[TMP1] ; STRING LENGTH CMP SI,0 JZ BTEXT2 MOV DI,[TMP2] ; STRING POSITION MOV CX,1 BTEXT1: CMP [PX1],-2 ; SKIP THE POSITIONING IF IX = -2 JZ BTEXT3 MOV AH,2 INT 10H ; SET CURSOR POSITION BTEXT3: MOV AL,ES:[DI] ; OUTPUT CHARACTER MOV AH,09H INT 10H INC DL ; DL IS COLUMN, DH IS ROW INC DI SUB SI,1 JNZ BTEXT1 ; LOOP MOV AX,[TMP1] ; ADD STRING LENGTH * (CHAR WIDE) TO TX1 MOV CL,[ICHRW] MUL CL ADD [TX1],AX BTEXT2: RET BIOSTEXT ENDP ;=========================================== ; LOCATE THE CURSOR AT TX1, TY1 ; INPUT AL, TX1, TY1 ;OUTCHAR PROC FAR OUTCHAR: PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+10 MOV AX,ES:[BX] MOV [TMP1],AX MOV AX,[TX1] MOV [IX1],AX MOV AX,[TY1] MOV [IY1],AX CMP [BIOSTXT],0 JZ OUTCH1A CALL OUTBCHAR ; OUTPUT THE CHARACTER USING BIOS TEXT JMP OUTCH3 OUTCH1A: CALL EGARST MOV AX,[VIDMEM] MOV ES,AX CALL VIDXY ; GET SCREEN ADDRESS IN BX MOV DX,ES MOV AX,[TMP1] MOV AH,0 CMP AX,32 ; IN RANGE? (32 <= AL <= 127) JL OUTCH1 JMP OUTCH2 OUTCH1: CMP AL,8 ; BACKSPACE JNZ OUTCH2 CMP [TX1],8 ; TOO FAR TO THE LEFT? JL OUTCH2 DEC BX ; BX - 1 FOR BLACK & WHITE, ELSE BX - 2 CMP [BW],1 JZ OUTCH6 DEC BX ; BACK UP OUTCH6: SUB [TX1],8 OUTCH4: OUTCH4B: MOV AL,' ' ; SPACE FOR BACKSPACE OUTCH2: MOV AH,0 SHL AX,1 ; (ASCII CODE - 32) * 16 SHL AX,1 SHL AX,1 SHL AX,1 MOV DI,[LETTERS] ADD DI,AX ; DI IS THE ADDRESS OF THE LETTER CALL CHARSUB ; INPUTS DI, BX, INCS BX CMP [TMP1],8 ; BACKSPACE? JNZ OUTCH3 CMP [TX1],8 JL OUTCH3 ; ALREADY AT LEFT SUB [TX1],8 ; MOVE BACK A SPACE OUTCH3: CALL EGARST POP BP POP DS POP ES RETF 2 ;OUTCHAR ENDP ;======================================================= OUTBCHAR PROC NEAR ; OUTPUT THE CHARACTER TO THE SCREEN - USE BIOS CALLS MOV AX,[TX1] MOV [IX1],AX MOV AX,[TY1] MOV [IY1],AX MOV AX,[TMP1] MOV CL,[ICHRW] MOV CH,0 CMP AL,8 ; BACKSPACE JNZ OUTBCH2 CMP [TX1],CX ; TOO FAR TO THE LEFT? JL OUTBCH3 SUB [TX1],CX OUTBCH2: ; POSITION CURSOR MOV AX,[TX1] ; X DOT POSITION DIV CL MOV DL,AL ; COLUMN (X) MOV AX,[TY1] ; Y DOT POSITION MOV CL,[ICHRH] DIV CL MOV DH,AL ; ROW (Y) MOV BH,[BIOSPAGE] MOV AH,2 INT 10H ; SET CURSOR POSITION MOV AX,[TMP1] ; OUTPUT CHARACTER CMP AL,8 JNZ OUTBCH2A ; BLANK IF BACKSPACE MOV AL,' ' OUTBCH2A: MOV BH,[BIOSPAGE] ; PAGE MOV BL,[COLOR] ; FOREGROUND COLOR AND BL,7FH ; DO NOT XOR CHARACTER MOV CX,1 MOV AH,09H INT 10H ; DISPLAY CHARACTER CMP [TMP1],8 ; BACKSPACE? JZ OUTBCH3 MOV CL,[ICHRW] MOV CH,0 ADD [TX1],CX OUTBCH3: RET OUTBCHAR ENDP ;================================================= ;GVECT PROC FAR ; DRAWS A LINE ; ; CALL GVECT (IX1, IY1, IX2, IY2, ICOLOR, IMODE) ; ICOLOR - WHAT COLOR TO USE - A BYTE MASK. ; IMODE - REPLACE = 0, COMPLEMENT = 2 WITH RANGE CHECK ; REPLACE = 8, COMPLEMENT = 10 WITHOUT RANGE CHECK GVECT: PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+20 MOV AX,ES:[BX] MOV [IX1],AX MOV BX,[BP]+18 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+16 MOV AX,ES:[BX] MOV [IX2],AX MOV BX,[BP]+14 MOV AX,ES:[BX] MOV [IY2],AX MOV BX,[BP]+12 MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [COLOR],AL ; MOVE COLOR INTO MASK MOV BX,[BP]+10 ; REPLACE = 0, COMPLEMENT = 1 MOV AX,ES:[BX] MOV [MODE],AL CALL EGARST ; RESET EGA COLORS - IF EGA MOV BX,[SETREP] ; SETUP SUBROUTINE ADDRESS TEST AL,7 JZ GV1 MOV BX,[SETXOR] GV1: MOV [SETSUB],BX ; SORT POINTS MOV AX,[IY1] MOV BX,[IY2] CMP BX,AX JGE SORTED MOV [IY1],BX ; SWAP Y1, Y2 MOV [IY2],AX MOV AX,[IX1] ; SWAP X1, X2 XCHG AX,[IX2] MOV [IX1],AX SORTED: ; NOW GET THE SLOPE, ETC. MOV AX,[IY2] SUB AX,[IY1] MOV [DXMIN],AX ; ASSUME DY < DX MOV CX,[XINCSUB] ; ASSUME X1 < X2 MOV AX,[IX2] SUB AX,[IX1] JGE SKIP2 ; EXCHANGE, USE XDEC INSTEAD MOV AX,[IX1] SUB AX,[IX2] MOV CX,[XDECSUB] SKIP2: MOV [DXMAJ],AX MOV DX,[YINCSUB] ; ADDRESS OF YINC SUBROUTINE CMP AX,[DXMIN] JL YMAJOR XMAJOR: MOV MAJINC,CX MOV MININC,DX JMP SKIP3 YMAJOR: MOV MAJINC,DX MOV MININC,CX MOV AX,[DXMIN] ; SWAP DXMAJ AND DXMIN XCHG AX,[DXMAJ] MOV [DXMIN],AX SKIP3: MOV AX,[VIDMEM] MOV ES,AX CALL VIDXY ; GET VIDEO ADDRESS INTO BX MOV [DOT],AL ; DOT HAS "OR" BYTE MOV DX,[DXMAJ] ; MINOR COUNTER MOV AX,[DXMAJ] MOV [MAJ],AX SHR AX,1 ; DIVIDE BY 2 JNC SKIP6 INC AX ; ROUND UP SKIP6: ADD [MAJ],AX ; MAJOR COUNTER MOV AL,[DOT] ; 8 BIT DOT BYTE MOV CX,[DXMAJ] INC CX TEST [MODE],8 JNZ LOOP1A ; SKIP TO NO-RANGE LOOP MOV [ICLIP],0 ; ASSUME IN BOUNDS LOOP1: PUSH CX ; LOOP FOR RANGE CHECK DRAW CALL CLIP CMP [ICLIP],0 JNZ SKIP5 ; SKIP IF OUT OF RANGE CALL SETSUB SKIP5: CALL MAJINC ADD DX,[DXMIN] ; INCREMENT BY MINOR COUNTER CMP DX,[MAJ] JC NEXT CALL MININC SUB DX,[DXMAJ] ; DECREMENT BY MAJOR COUNTER NEXT: POP CX DEC CX JNZ LOOP1 JMP VECTDONE LOOP1A: PUSH CX ; LOOP FOR ABSOLUTE DRAW CALL SETSUB CALL MAJINC ADD DX,[DXMIN] ; INCREMENT BY MINOR COUNTER CMP DX,[MAJ] JC NEXTA CALL MININC SUB DX,[DXMAJ] ; DECREMENT BY MAJOR COUNTER NEXTA: POP CX DEC CX JNZ LOOP1A VECTDONE: CALL EGARST POP BP POP DS POP ES RETF 12 ;GVECT ENDP ;=========================================== SHADELINE: ; SHADELINE (IX1, IY1, IX2, ICOLOR1, ICOLOR2, ICOLOR 3, ICOLOR 4); PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP CALL EGARST ; RESET EGA COLORS - IF EGA MOV BX,[BP]+26 ; IX1 MOV AX,ES:[BX] MOV [IX1],AX MOV BX,[BP]+24 ; IY1 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+22 ; IX2 MOV AX,ES:[BX] MOV [IX2],AX MOV BX,[BP]+10 ; NCOLOR MOV AX,ES:[BX] MOV [NCOLOR],AX MOV BX,[BP]+20 ; ICOLOR1 MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [ICOLOR1],AL MOV [ICOLOR5],AL MOV BX,[BP]+18 ; ICOLOR2 MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [ICOLOR2],AL MOV [ICOLOR6],AL MOV BX,[BP]+16 ; ICOLOR3 MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [ICOLOR3],AL MOV [ICOLOR7],AL MOV BX,[BP]+14 ; ICOLOR4 MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [ICOLOR4],AL MOV [ICOLOR8],AL MOV BX,[BP]+12 ; ICOLOR5 MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [ICOLOR],AL MOV [COLOR],AL SHADE3B: MOV [SHADEPTR],OFFSET ICOLOR1 ; MAIN OFFSET IS 0-3 MOV DX,3 AND DX,[IY1] ADD [SHADEPTR],DX MOV ES,[VIDMEM] CALL VIDXY SHLOOP1: MOV DX,[IX] ; FINISHED YET? CMP DX,[IX2] JG SHADE1 MOV DX,3 AND DX,[IX] MOV DI,[SHADEPTR] ; GET MAIN (Y) OFFSET ADD DI,DX ; ADD X OFFSET (0-3) FOR DITHERING MOV DL,[DI] MOV [COLOR],DL CALL SETREP CALL XINCSUB JMP SHLOOP1 SHADE1: CALL EGARST ; RESET EGA COLORS - IF EGA POP BP POP DS POP ES RETF 18 ;SHADELINE ENDP ;============================================ ;----------------------------------------------------------------------- ;==THE FOLLOWING ROUTINES DON'T NEED TO BE WRITTEN, BUT THEY NEED TO BE HERE== ;----------------------------------------------------------------------- VIDEMS: PUSH DS PUSH ES PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+16 ; EMS SEGMENT MOV AX,ES:[BX] MOV [EMSEG],AX MOV BX,[BP]+14 ; HOW MANY 16K PAGES MOV AX,ES:[BX] MOV [EMFULL],AX MOV BX,[BP]+12 ; HOW MUCH EXTRA AFTER THAT MOV AX,ES:[BX] MOV [EMPART],AX MOV BX,[BP]+10 ; HANDLE NAME MOV AX,ES:[BX] MOV [VHANDLE],AX ; IF VHANDLE IS NON-ZERO, THEN USE EMS. POP BP POP ES POP DS RETF 8 ;VIDEMS ENDP ;=================================================== ; MODE = 0 FOR REPLACE, 1 FOR XOR ; DRAW A HORIZONTAL LINE AT BX-AL (IX) TO PX2 CLEARBOX: PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+16 MOV AX,ES:[BX] MOV [PX1],AX MOV BX,[BP]+14 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+12 MOV AX,ES:[BX] MOV [IX2],AX MOV BX,[BP]+10 MOV AX,ES:[BX] MOV [IY2],AX MOV [COLOR],0 MOV [DSEG],DS MOV ES,[VIDMEM] MOV CX,[IY2] SUB CX,[IY1] INC CX LOOPCL1: PUSH CX MOV AX,[PX1] ; [IX1] CHANGES BELOW MOV [IX1],AX CALL VIDXY MOV CX,[IX2] SUB CX,[IX1] INC CX LOOPCL2: CMP [BITPIX],3 JNZ CL3 ; NOT BLACK AND WHITE TEST [IX],7 JNZ CL3 ; NOT ON BYTE BOUNDRY MOV DX,[IX2] SUB DX,[IX] CMP DX,8 JL CL3 ; CLOSE TO LINE END PUSH CX MOV AL,255 ; DO 8 BITS AT A TIME CALL SETREP MOV DX,[IX] ADD DX,8 MOV [IX1],DX CALL VIDXY POP CX SUB CX,7 ; SEVEN EXTRA BITS JMP CL4 CL3: CALL SETREP CALL XINCSUB CL4: LOOP LOOPCL2 INC [IY1] POP CX LOOP LOOPCL1 POP BP POP DS POP ES RETF 8 ;CLEARBOX ENDP ;========================================= SCRANGE: ; PROCEDURE SCRANGE (CONST IX1, IX2, IY1, IY2: INTEGER); PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+16 MOV AX,ES:[BX] ; IX1 MOV [IXMIN],AX MOV BX,[BP]+14 MOV AX,ES:[BX] ; IX2 MOV [IXMAX],AX MOV BX,[BP]+12 MOV AX,ES:[BX] ; IY1 MOV [IYMIN],AX MOV BX,[BP]+10 MOV AX,ES:[BX] ; IY2 MOV [IYMAX],AX POP BP POP DS POP ES RETF 8 ;SCRANGE ENDP ;============================================ SAVBYTE PROC NEAR MOV ES,[ESEG] MOV ES:[DI],CL INC DI MOV [NBITS],0 RET SAVBYTE ENDP ;======================================= GGETB: ; GET A BLOCK FROM THE SCREEN ; CALL GGETB (WVIDSIZE, IRETC, IYINC, IX, IY, IX1, IY1, IMODE, BUFFER); PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV AX,ES MOV [RETSEG],AX MOV BX,[BP]+28 MOV AX,ES:[BX] MOV [WVIDSIZ],AX MOV BX,[BP]+26 MOV [IRETC],BX MOV SI,ES:[BX] MOV BX,[BP]+24 MOV AX,ES:[BX] MOV [IYINC],AX MOV BX,[BP]+22 MOV AX,ES:[BX] MOV [IX1],AX MOV BX,[BP]+20 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+18 MOV AX,ES:[BX] MOV [IX2],AX MOV BX,[BP]+16 MOV AX,ES:[BX] MOV [IY2],AX MOV BX,[BP]+14 MOV AX,ES:[BX] MOV [MODE],AL MOV DX,[BP]+12 ; BUFFER SEGMENT MOV DI,[BP]+10 ; BUFFER OFFSET MOV BX,DI MOV CL,4 SHR BX,CL ADD DX,BX AND DI,000FH MOV [BASEPTR],DI ADD [WVIDSIZ],DI ADD DI,SI MOV [ESEG],DX ; SORT POINTS MOV AX,[IX1] MOV BX,[IX2] CMP BX,AX JGE GGETB1 MOV [IX1],BX ; SWAP X1, X2 MOV [IX2],AX GGETB0: MOV AX,[IY1] MOV BX,[IY2] CMP BX,AX JGE GGETB1 MOV [IY1],BX ; SWAP Y1, Y2 MOV [IY2],AX GGETB1: MOV CX,[IY2] SUB CX,[IY1] MOV ES,[ESEG] ; SAVE NO. OF LINES AT THE BEGINNING MOV ES:[DI],CX ADD DI,2 MOV CX,[IX2] SUB CX,[IX1] INC CX MOV [IX2],CX MOV AX,[IYINC] ; SAVE Y INC MOV ES:[DI],AL INC DI MOV ES,[VIDMEM] CALL EGARST NXTGETB: MOV [WBIT],2 MOV [NBITS],0 MOV [DITMP],0 MOV ES,[VIDMEM] CALL VIDXY ; GET THE VIDEO ADDRESS MOV CX,[IX2] MOV [IX2TMP],CX GGETB2: MOV ES,[VIDMEM] CALL RPOINT CMP CL,0 JZ GBLACK CMP [WBIT],1 JZ GETBIT MOV [DITMP],0 MOV [WBIT],1 CMP [NBITS],0 JZ GETBIT CMP [WVIDSIZ],DI JA GWHITE1 JMP GERROR GWHITE1: MOV CL,[NBITS] OR CL,128 CALL SAVBYTE GETBIT: INC [NBITS] CMP [NBITS],127 JB GNXTBIT CMP [WVIDSIZ],DI JA GETBIT1 JMP GERROR GETBIT1: MOV CL,[NBITS] CMP [WBIT],0 JNZ GETWHITE OR CL,128 GETWHITE: CALL SAVBYTE JMP GNXTBIT GBLACK: CMP [WBIT],0 JZ GETBIT MOV [DITMP],DI MOV [WBIT],0 CMP [NBITS],0 JZ GETBIT INC [DITMP] CMP [WVIDSIZ],DI JA GBLACK1 JMP GERROR GBLACK1: MOV CL,[NBITS] CALL SAVBYTE JMP GETBIT GNXTBIT: CALL XINCSUB DEC [IX2TMP] CMP [IX2TMP],0 JZ GNXTLINE JMP GGETB2 GNXTLINE: CMP [DITMP],0 JZ GWLAST MOV DI,[DITMP] GLAST0: MOV [NBITS],0 GWLAST: CMP [WVIDSIZ],DI JA GETREST JMP GERROR GETREST: MOV CL,[NBITS] CALL SAVBYTE CMP CL,0 JNZ GLAST0 GNXTLINE1: MOV CX,[IYINC] ADD [IY1],CX MOV CX,[IY1] CMP [IY2],CX JL GGETBFINI JMP NXTGETB GGETBFINI: ; DONE MOV ES,[VIDMEM] CALL EGARST SUB DI,[BASEPTR] GGETBDONE: MOV ES,[RETSEG] MOV BX,[IRETC] MOV ES:[BX],DI POP BP POP DS POP ES RETF 20 GERROR: MOV DI,0 JMP GGETBDONE ;GGETB ENDP ;======================================= GPUTB: ; PUT A LINE ONTO THE SCREEN ; CALL GPUTB (I2ND, IX, IY, IMODE, BUFFER); PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+20 MOV AX,ES:[BX] CMP AX,[IXMAX] JLE GPUTBX JMP GPUTBQUIT GPUTBX: MOV [IX1],AX MOV BX,[BP]+18 MOV AX,ES:[BX] CMP AX,[IYMAX] JLE GPUTBY JMP GPUTBQUIT GPUTBY: MOV [IY1],AX MOV BX,[BP]+16 MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [COLOR],AL ; MOVE COLOR INTO MASK MOV BX,[BP]+14 MOV AX,ES:[BX] MOV [MODE],AL MOV DX,[BP]+12 ; BUFFER SEGMENT MOV DI,[BP]+10 ; BUFFER OFFSET MOV BX,DI MOV CL,4 SHR BX,CL ADD DX,BX AND DI,000FH MOV [ESEG],DX ; SAVE THE BUFER SEGMENT MOV AX,[SETREP] ; MODE IS 0 FOR REPLACE, 1 FOR XOR CMP [MODE],0 JZ GPUTB1 MOV AX,[SETXOR] GPUTB1: MOV [SETSUB],AX MOV ES,[ESEG] ; GET THE NUMBER OF LINES MOV CX,ES:[DI] MOV AX,[IY1] ADD AX,CX INC AX CMP AX,[IYMIN] JGE GPUTBY2 JMP GPUTBQUIT GPUTBY2: DEC AX MOV [IY2],AX ADD DI,2 MOV CL,ES:[DI] ; GET THE Y INC XOR CH,CH MOV [IYINC],CX INC DI MOV CX,[IX1] MOV [IX1TMP],CX CALL EGARST ; RESET EGA COLORS - IF EGA NXTPUTB: MOV CX,[IX1TMP] MOV [IX1],CX GPUTB2: MOV ES,[ESEG] MOV CL,ES:[DI] INC DI CMP CL,0 JZ GETNXTLINE TEST CL,10000000B JZ GPUTDOT AND CX,007FH ADD [IX1],CX JMP GPUTB2 GPUTDOT: XOR CH,CH MOV ES,[VIDMEM] CALL VIDXY GPUTDOT0: PUSH CX MOV CX,[IX1] CMP CX,[IXMIN] JL GPUTSKIP1 CMP CX,[IXMAX] JG GPUTSKIP MOV CX,[IY1] CMP CX,[IYMIN] JL GPUTSKIP CMP CX,[IYMAX] JG GPUTSKIP CALL SETSUB CALL XINCSUB GPUTSKIP: INC [IX1] GPUTSKIP0: POP CX LOOP GPUTDOT0 JMP GPUTB2 GPUTSKIP1: INC [IX1] MOV CX,[IX1] CMP CX,[IXMIN] JL GPUTSKIP0 CALL VIDXY JMP GPUTSKIP0 GETNXTLINE: MOV CX,[IYINC] ADD [IY1],CX MOV CX,[IY1] CMP [IY2],CX JL GPUTBDONE JMP NXTPUTB GPUTBDONE: ; DONE MOV ES,[VIDMEM] CALL EGARST GPUTBQUIT: POP BP POP DS POP ES RETF 12 ;GPUTB ENDP ;======================================= VIDXOR: ; PROCEDURE VIDXOR (CONST WSIZE: WORD; VAR L: WORD; CONST I1, IX, IY, IX1, IY1: ; INTEGER; VARS BUFFER: BYTE); ; MERGE THE MEMORY AND THE SCREEN BUFFERS IN XOR MODE PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+26 MOV AX,ES:[BX] MOV [WVIDSIZ],AX MOV AX,ES MOV [RETSEG],AX MOV BX,[BP]+24 MOV [IRETC],BX MOV BX,[BP]+22 MOV SI,ES:[BX] MOV BX,[BP]+20 MOV AX,ES:[BX] MOV [IX1],AX MOV BX,[BP]+18 MOV AX,ES:[BX] MOV [IY1],AX MOV BX,[BP]+16 MOV AX,ES:[BX] MOV [IX2],AX MOV BX,[BP]+14 MOV AX,ES:[BX] MOV [IY2],AX MOV DX,[BP]+12 MOV DI,[BP]+10 MOV BX,DI MOV CL,4 SHR BX,CL ADD DX,BX AND DI,000FH MOV [BASEPTR],DI ADD [WVIDSIZ],DI ADD SI,DI MOV [ESEG],DX MOV AX,[IX1] MOV BX,[IX2] CMP BX,AX JGE VXSORT1 MOV [IX1],BX MOV [IX2],AX VXSORT1: MOV AX,[IY1] MOV BX,[IY2] CMP BX,AX JGE VXSORTED MOV [IY1],BX MOV [IY2],AX VXSORTED: MOV ES,[ESEG] MOV CX,ES:[SI] MOV ES:[DI],CX ADD SI,2 ADD DI,2 MOV CL,ES:[SI] MOV ES:[DI],CL INC SI INC DI XOR CH,CH MOV [IYINC],CX MOV CX,[IX2] SUB CX,[IX1] INC CX MOV [IX2],CX MOV ES,[VIDMEM] CALL EGARST VXGET: MOV [BYTE1],0 MOV [BYTE2],0 MOV [NDOT],0 MOV [DITMP],0 MOV [WBIT],2 MOV [NBITS],0 MOV CX,[IX2] MOV [IX2TMP],CX MOV ES,[VIDMEM] CALL VIDXY VXGET1: CALL ENCODE CMP CL,0 JNZ VXGET3 CMP [DITMP],0 JZ VXGET1A MOV DI,[DITMP] JMP VXGET2 VXGET1A: CMP [NDOT],0 JZ VXGET2 CMP [WVIDSIZ],DI JA VXGET1B JMP VXERROR VXGET1B: MOV DL,[NDOT] MOV ES,[ESEG] MOV ES:[DI],DL INC DI VXGET2: CMP [WVIDSIZ],DI JA VXGET2A JMP VXERROR VXGET2A: MOV ES,[ESEG] MOV ES:[DI],CL INC DI JMP NEWLINE VXGET3: CMP [NDOT],0 JNZ VXGET4 MOV [NDOT],CL TEST CL,10000000B JZ VXGET3A MOV [DITMP],DI VXGET3A: JMP VXGET1 VXGET4: MOV DL,[NDOT] XOR DL,CL TEST DL,10000000B JZ VXGET5 CMP [WVIDSIZ],DI JA VXGET4A JMP VXERROR VXGET4A: MOV DL,[NDOT] ; CHANGE COLOR MOV ES,[ESEG] MOV ES:[DI],DL INC DI MOV [NDOT],CL MOV [DITMP],0 TEST CL,10000000B JZ VXGET4B MOV [DITMP],DI VXGET4B: JMP VXGET1 VXGET5: MOV DL,[NDOT] ; SAME COLOR AND DL,7FH AND CL,7FH ADD DL,CL CMP DL,127 JB VXGET8 SUB DL,127 MOV CL,127 TEST [NDOT],10000000B JZ VXGET6 OR DL,128 ; BLACK OR CL,128 VXGET6: CMP [WVIDSIZ],DI JA VXGET6A JMP VXERROR VXGET6A: MOV ES,[ESEG] MOV ES:[DI],CL ; SAVE 1 BYTE INC DI TEST DL,01111111B JNZ VXGET7 XOR DL,DL VXGET7: MOV [NDOT],DL JMP VXGET1 VXGET8: TEST [NDOT],10000000B JZ VXGET9 OR DL,128 VXGET9: MOV [NDOT],DL JMP VXGET1 NEWLINE: MOV CX,[IYINC] ADD [IY1],CX MOV CX,[IY1] CMP [IY2],CX JL VXDONE JMP VXGET VXDONE: SUB DI,[BASEPTR] VXDONE1: MOV ES,[RETSEG] MOV BX,[IRETC] MOV ES:[BX],DI MOV ES,[VIDMEM] CALL EGARST POP BP POP DS POP ES RETF 18 VXERROR: MOV DI,0 JMP VXDONE1 ;VIDXOR ENDP ;=============================================== ENCODE PROC NEAR ; XOR THE MEMORY AND THE SCREEN BUFFERS ; PACK UP TO 127 SAME COLOR DOTS INTO ONE BYTE AND RETURN IN CL MOV CL,[BYTE1] TEST CL,01111111B JNZ EN1 MOV ES,[ESEG] MOV CL,ES:[SI] INC SI MOV [BYTE1],CL CMP CL,0 ; RETURN 0 ON THE END OF A LINE. JZ ENDONE EN1: MOV DL,1 TEST CL,10000000B JZ EN2 SHL DL,1 EN2: MOV [ITYPE1],DL ; 1 FOR WHITE, 2 FOR BLACK. EN3: MOV CL,[BYTE2] TEST CL,01111111B JNZ EN4 CALL SCREAD ; GET ONE BYTE FROM SCREEN. MOV [BYTE2],CL CMP CL,0 ; RETURN 0 IF REACH THE END OF ONE LINE. JZ ENDONE EN4: MOV DL,4 TEST CL,10000000B JZ EN5 SHL DL,1 EN5: MOV [ITYPE2],DL ; 4 FOR WHITE, 8 FOR BLACK. JMP ENCASE ENZZ: MOV CL,0 ENDONE: RET ENWW: MOV CL,[BYTE1] CMP CL,[BYTE2] JA ENWW1 SUB [BYTE2],CL OR CL,128 ENCLR1: MOV [BYTE1],0 RET ENWW1: MOV CL,[BYTE2] SUB [BYTE1],CL OR CL,128 ENCLR2: MOV [BYTE2],0 RET ENCASE: MOV DL,[ITYPE1] OR DL,[ITYPE2] CMP DL,00000101B ; BYTE1 (W), BYTE2 (W) JZ ENWW CMP DL,00000110B ; BYTE1 (B), BYTE2 (W) JZ ENBW CMP DL,00001001B ; BYTE1 (W), BYTE2 (B) JZ ENWB CMP DL,00001010B ; BYTE1 (B), BYTE2 (B) JZ ENBB JMP ENZZ ENBW: MOV CL,[BYTE1] AND CL,127 CMP CL,[BYTE2] JA ENBW1 SUB [BYTE2],CL JMP ENCLR1 ENBW1: MOV CL,[BYTE2] SUB [BYTE1],CL JMP ENCLR2 ENWB: MOV CL,[BYTE2] AND CL,127 CMP CL,[BYTE1] JBE ENWB2 MOV CL,[BYTE1] SUB [BYTE2],CL JMP ENCLR1 ENWB2: SUB [BYTE1],CL JMP ENCLR2 ENBB: MOV CL,[BYTE1] CMP CL,[BYTE2] JAE ENBB2 SUB [BYTE2],CL OR [BYTE2],128 JMP ENCLR1 ENBB2: MOV CL,[BYTE2] SUB [BYTE1],CL OR [BYTE1],128 JMP ENCLR2 ENCODE ENDP ;======================================= SCREAD PROC NEAR ; PACK UP TO 127 SAME COLOR DOTS ON THE SCREEN INTO ONE BYTE IN CL CMP [IX2TMP],0 JNZ SCR1 MOV CL,[NBITS] MOV [NBITS],0 CMP CL,0 JZ SCR0 CMP [WBIT],0 JNZ SCR0 OR CL,128 SCR0: RET SCR1: MOV ES,[VIDMEM] SCR2: CALL RPOINT CMP CL,0 JZ SCRBLACK CMP [WBIT],1 ; IS THE PREVIOUS DOT WHITE? JZ SCRGET ; YES, PACK IT INTO ONE BYTE. MOV [WBIT],1 ; START A NEW BYTE FOR WHITE. CMP [NBITS],0 ; ANY BLACK DOTS FOR RETURN? JZ SCRGET MOV CL,[NBITS] ; YES, RETURN A BYTE FOR BLACK DOTS. OR CL,128 MOV [NBITS],1 CALL XINCSUB DEC [IX2TMP] RET SCRGET: INC [NBITS] ; GET ONE MORE DOT. CALL XINCSUB ; PREPARE TO GET THE NEXT DOT. DEC [IX2TMP] CMP [NBITS],127 ; ARE THERE 127 DOTS ALREADY? JAE SCR4 ; YES, RETURN IT. CMP [IX2TMP],0 ; COMPLETE ONE LINE? JNZ SCR2 ; NO, GET NEXT DOT. SCR4: MOV CL,[NBITS] ; RETURN ONE BYTE. MOV [NBITS],0 CMP [WBIT],0 JNZ SCR5 OR CL,128 SCR5: RET SCRBLACK: CMP [WBIT],0 ; IS PREVIOUS DOT BLACK? JZ SCRGET ; YES, PACK THIS DOT TO NBITS. MOV [WBIT],0 CMP [NBITS],0 ; ANY WHITE DOT LEFT? JZ SCRGET ; NO, START NEW BYTE FOR BLACK. MOV CL,[NBITS] ; YES, RETURN ONE BYTE FOR WHITE DOTS. MOV [NBITS],1 CALL XINCSUB DEC [IX2TMP] RET SCREAD ENDP ;======================================= RX DW 0 LX DW 0 UY DW 0 LY DW 0 IRA DW 0 IRB DW 0 SQRA DW 2 DUP(0) SQRB DW 2 DUP(0) TWOSQRA DW 2 DUP(0) TWOSQRB DW 2 DUP(0) VARDX DW 2 DUP(0) VARDY DW 2 DUP(0) VARD DW 2 DUP(0) I1XL1 DW 0 I1XR1 DW 0 I2XL1 DW 0 I2XR1 DW 0 I3XL1 DW 0 I3XR1 DW 0 I4XL1 DW 0 I4XR1 DW 0 I1XL2 DW 0 I1XR2 DW 0 I2XL2 DW 0 I2XR2 DW 0 I3XL2 DW 0 I3XR2 DW 0 I4XL2 DW 0 I4XR2 DW 0 RUBARC: ; PROCEDURE RUBARC (VAR IXL: INTEGER; ; IXC, IYC, IRA, IRB, ICOLOR, IMODE: INTEGER); ; This procedure uses incremental algorithm which iteratively determines each ; pixel in the first quadrant and obtains the pixel coordinates in the other ; three quadrants by symmetry. This procedure starts at point (0, b) on the ; y-axis and proceed clockwise around the ellipse until it reach (a, 0). PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP]+22 MOV AX,ES:[BX] MOV [I1XL1],AX ADD BX,2 MOV AX,ES:[BX] MOV [I1XR1],AX ADD BX,2 MOV AX,ES:[BX] MOV [I2XL1],AX ADD BX,2 MOV AX,ES:[BX] MOV [I2XR1],AX ADD BX,2 MOV AX,ES:[BX] MOV [I3XL1],AX ADD BX,2 MOV AX,ES:[BX] MOV [I3XR1],AX ADD BX,2 MOV AX,ES:[BX] MOV [I4XL1],AX ADD BX,2 MOV AX,ES:[BX] MOV [I4XR1],AX ADD BX,2 MOV AX,ES:[BX] MOV [I1XL2],AX ADD BX,2 MOV AX,ES:[BX] MOV [I1XR2],AX ADD BX,2 MOV AX,ES:[BX] MOV [I2XL2],AX ADD BX,2 MOV AX,ES:[BX] MOV [I2XR2],AX ADD BX,2 MOV AX,ES:[BX] MOV [I3XL2],AX ADD BX,2 MOV AX,ES:[BX] MOV [I3XR2],AX ADD BX,2 MOV AX,ES:[BX] MOV [I4XL2],AX ADD BX,2 MOV AX,ES:[BX] MOV [I4XR2],AX MOV BX,[BP]+10 ; REPLACE = 0, COMPLEMENT = 1 MOV AX,ES:[BX] MOV [MODE],AL CALL EGARST ; RESET EGA COLORS - IF EGA MOV BX,[SETREP] ; SETUP SUBROUTINE ADDRESS TEST AL,7 JZ CIRC01 MOV BX,[SETXOR] CIRC01: MOV [SETSUB],BX MOV BX,[BP]+12 MOV BX,ES:[BX] MOV AL,[BX]+COLORS MOV [COLOR],AL ; MOVE COLOR INTO MASK MOV BX,[BP]+20 MOV AX,ES:[BX] MOV [IX2],AX MOV BX,[BP]+18 MOV AX,ES:[BX] MOV [IY2],AX MOV BX,[BP]+16 MOV AX,ES:[BX] MOV [IRA],AX MUL AX MOV [SQRA],AX MOV [SQRA+2],DX SHL AX,1 RCL DX,1 MOV [TWOSQRA],AX MOV [TWOSQRA+2],DX MOV BX,[BP]+14 MOV AX,ES:[BX] MOV [IRB],AX MUL AX MOV [SQRB],AX MOV [SQRB+2],DX SHL AX,1 RCL DX,1 MOV [TWOSQRB],AX MOV [TWOSQRB+2],DX ; (LX, LY) = (0, B), (RX, UY) = (0, -B) MOV AX,[IX2] MOV [RX],AX MOV AX,[IX2] MOV [LX],AX MOV AX,[IY2] SUB AX,[IRB] MOV [UY],AX MOV AX,[IY2] ADD AX,[IRB] MOV [LY],AX XOR AX,AX ; dx = 0 (Top point) MOV [VARDX],AX MOV [VARDX+2],AX MOV AX,[TWOSQRA] MOV DX,[TWOSQRA+2] MOV CX,[IRB] CALL LMUL MOV [VARDY],AX MOV [VARDY+2],DX MOV AX,[SQRA] MOV DX,[SQRA+2] SAR DX,1 RCR AX,1 SAR DX,1 RCR AX,1 ADD AX,[SQRB] ADC DX,[SQRB+2] MOV [VARD],AX MOV [VARD+2],DX MOV AX,[SQRA] MOV DX,[SQRA+2] MOV CX,[IRB] CALL LMUL SUB [VARD],AX SBB [VARD+2],DX MOV BX,[IRB] ; Start at (0, b), loop until dy/dx >= -1 XOR CX,CX CIRC10: MOV AX,[VARDX] MOV DX,[VARDX+2] SUB AX,[VARDY] SBB DX,[VARDY+2] JNS CIRC20 ; Break if dy/dx >= -1 CALL SETDOTS MOV CX,1 CMP [VARD+2],0 JS CIRC11 MOV CH,1 DEC BX MOV AX,[VARDY] MOV DX,[VARDY+2] SUB AX,[TWOSQRA] SBB DX,[TWOSQRA+2] MOV [VARDY],AX MOV [VARDY+2],DX SUB [VARD],AX SBB [VARD+2],DX CIRC11: MOV AX,[VARDX] MOV DX,[VARDX+2] ADD AX,[TWOSQRB] ADC DX,[TWOSQRB+2] MOV [VARDX],AX MOV [VARDX+2],DX ADD AX,[SQRB] ADC DX,[SQRB+2] ADD [VARD],AX ADC [VARD+2],DX JMP CIRC10 CIRC20: PUSH BX ; preserve current y-coordinate PUSH CX ; preserve x- and y-increments MOV AX,[SQRA] MOV DX,[SQRA+2] SUB AX,[SQRB] SBB DX,[SQRB+2] MOV BX,AX MOV CX,DX SAR DX,1 RCR AX,1 ADD AX,BX ADC DX,CX SUB AX,[VARDX] SBB DX,[VARDX+2] SUB AX,[VARDY] SBB DX,[VARDY+2] SAR DX,1 RCR AX,1 ADD [VARD],AX ADC [VARD+2],DX POP CX ; restore x- and y-increment POP BX ; restore y-coordinate CIRC21: ; start at current (x, y), until y < 0 CALL SETDOTS MOV CX,100H CMP [VARD+2],0 JNS CIRC22 ; break if d >= 0 MOV CL,1 ; increment in x direction MOV AX,[VARDX] MOV DX,[VARDX+2] ADD AX,[TWOSQRB] ADC DX,[TWOSQRB+2] MOV [VARDX],AX MOV [VARDX+2],DX ADD [VARD],AX ADC [VARD+2],DX CIRC22: MOV AX,[VARDY] MOV DX,[VARDY+2] SUB AX,[TWOSQRA] SBB DX,[TWOSQRA+2] MOV [VARDY],AX MOV [VARDY+2],DX SUB AX,[SQRA] SBB DX,[SQRA+2] SUB [VARD],AX SBB [VARD+2],DX DEC BX JNS CIRC21 ; loop if y >= 0 CALL EGARST ; RESET EGA COLORS - IF EGA POP BP POP DS POP ES RETF 14 ;RUBARC ENDP ;======================================= SETDOTS PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH ES MOV ES,[VIDMEM] TEST CH,CH JZ CIRC30 DEC [LY] INC [UY] CIRC30: TEST CL,CL JZ CIRC40 DEC [LX] INC [RX] CIRC40: MOV BX,[LY] CMP BX,[IYMIN] JGE CIRC41 JMP CIRC80 CIRC41: CMP BX,[IYMAX] JG CIRC50 MOV [IY1],BX MOV BX,[LX] CMP BX,[IXMIN] JL CIRC60 CMP BX,[IXMAX] JLE CIRC42 JMP CIRC80 CIRC42: CMP BX,[I3XL1] JL CIRC43 CMP BX,[I3XR1] JLE CIRC44 CIRC43: CMP BX,[I3XL2] JL CIRC50 CMP BX,[I3XR2] JG CIRC50 CIRC44: MOV [IX1],BX CALL VIDXY CALL SETSUB CIRC50: MOV BX,[UY] CMP BX,[IYMIN] JL CIRC60 CMP BX,[IYMAX] JLE CIRC51 JMP CIRC80 CIRC51: MOV [IY1],BX MOV BX,[LX] CMP BX,[I2XL1] JL CIRC52 CMP BX,[I2XR1] JLE CIRC53 CIRC52: CMP BX,[I2XL2] JL CIRC60 CMP BX,[I2XR2] JG CIRC60 CIRC53: MOV [IX1],BX CALL VIDXY CALL SETSUB CIRC60: MOV BX,[LY] CMP BX,[IYMIN] JL CIRC80 CMP BX,[IYMAX] JG CIRC70 MOV [IY1],BX MOV BX,[RX] CMP BX,[IXMIN] JL CIRC80 CMP BX,[IXMAX] JG CIRC80 CMP BX,[I4XL1] JL CIRC61 CMP BX,[I4XR1] JLE CIRC62 CIRC61: CMP BX,[I4XL2] JL CIRC70 CMP BX,[I4XR2] JG CIRC70 CIRC62: MOV [IX1],BX CALL VIDXY CALL SETSUB CIRC70: MOV BX,[UY] CMP BX,[IYMIN] JL CIRC80 CMP BX,[IYMAX] JG CIRC80 MOV [IY1],BX MOV BX,[RX] CMP BX,[I1XL1] JL CIRC81 CMP BX,[I1XR1] JLE CIRC82 CIRC81: CMP BX,[I1XL2] JL CIRC80 CMP BX,[I1XR2] JG CIRC80 CIRC82: MOV [IX1],BX CALL VIDXY CALL SETSUB CIRC80: POP ES POP DX POP CX POP BX POP AX RET SETDOTS ENDP ;=============================================== LMUL PROC NEAR PUSH AX MOV AX,DX MUL CX XCHG AX,CX POP DX MUL DX ADD DX,CX RET LMUL ENDP ;=============================================== BAKCOLOR: ; BAKCOLOR PROC FAR ; PROCEDURE BAKCOLOR (VAR ICOLOR: INTEGER); ; CHANGE BACKGROUND COLOR, ONLY FOR 16 COLOR MODE PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP CMP [EGA16],0 ; ONLY FOR EGA/VGA 16 COLOR JZ BAKDONE MOV BX,[LASTPAL] ; RESET THE PALETTE WHICH HAS BEEN CHANGED MOV BH,[ORGPALS+BX] ; TO THE ORIGINAL VALUE MOV AX,1000H INT 10H MOV AX,1001H ; RESET THE OVERSCAN PALETTE REGISTER INT 10H MOV BX,[BP+10] MOV SI,ES:[BX] MOV BL,[COLORS+SI] ; SET BACKGROUND COLOR MOV BH,0 MOV [LASTPAL],BX ; SAVE THE REGISTER NUMBER FOR RESET MOV BH,[ORGPALS+BX] MOV AX,1000H MOV BL,0 INT 10H ; SET PALETTE BL TO COLOR BH MOV AX,1001H INT 10H ; SET OVERSCAN COLOR TO BACKGROUND COLOR MOV BX,[LASTPAL] ; SET THAT COLOR TO BLACK MOV AX,1000H INT 10H ; SET PALETTE BL TO COLOR BH BAKDONE: POP BP POP DS POP ES RETF 2 ; BAKCOLOR ENDP ;=============================================== EVGA16: ; EVGA16 PROC FAR ; FUNCTION EVGA16: BOOLEAN; MOV AX,0 CMP CS:[EGA16],0 JZ NOTEVGA16 MOV AX,1 NOTEVGA16: RETF ; EVGA16 ENDP ;=============================================== SHADEINIT: ; SHADEINIT PROC FAR ; PROCEDURE SHADEINIT (CONST IBAKCOLOR: INTEGER); PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP CMP [EGA16],0 JZ SHINITDONE MOV BX,[BP+10] MOV DX,ES:[BX] CMP [JBAKCOLOR],DL JZ SHINITDONE MOV AL,[JBAKCOLOR] MOV [JBAKCOLOR],DL MOV DI,OFFSET SHADES1 MOV CX,512 SHRESET: CMP AL,[DI] JNZ SHRE1 MOV [DI],DL JMP SHORT SHRE4 SHRE1: CMP BYTE PTR [DI],0 JNZ SHRE2 MOV [DI],AL SHRE2: CMP [DI],DL JNZ SHRE3 MOV BYTE PTR [DI],0 JMP SHORT SHRE4 SHRE3: CMP BYTE PTR [DI],0 JNZ SHRE4 MOV [DI],DL SHRE4: INC DI LOOP SHRESET SHINITDONE: POP BP POP DS POP ES RETF 2 ; SHADEINIT ENDP ;=============================================== SHADES: ; SHADES PROC FAR ; PROCEDURE SHADES (CONST I, J: INTEGER; VAR ICOLOR1, ICOLOR2: INTEGER); PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP+16] MOV SI,ES:[BX] DEC SI MOV CL,4 SHL SI,CL MOV BX,[BP+14] MOV DX,ES:[BX] ADD SI,DX MOV BX,OFFSET SHADES1 MOV AL,[SI+BX] MOV AH,0 MOV BX,[BP+12] MOV ES:[BX],AX MOV BX,OFFSET SHADES2 MOV AL,[SI+BX] MOV BX,[BP+10] MOV ES:[BX],AX POP BP POP DS POP ES RETF 8 ; SHADES ENDP ;=============================================== PALETTES: ; PALETTES PROC FAR ; SAVE THE ORIGINAL VALUES OF THE PALETTE REGISTERS FOR 16 COLOR MODE PUSH ES CMP CS:[EGA16],0 JZ PALFINI PUSH CS POP ES MOV DX,OFFSET ORGPALS MOV AX,1009H INT 10H PALFINI: POP ES RETF ; PALETTES ENDP ;=============================================== GTXTLOC: ;GTXTLOC PROC FAR ; PROCEDURE GTXTLOC (VAR TCOLOR, BCOLOR, TX1, TY1: INTEGER); PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV AL,[TCOLOR] MOV AH,0 MOV BX,[BP+16] MOV ES:[BX],AX MOV AL,[BCOLOR] MOV BX,[BP+14] MOV ES:[BX],AX MOV AX,[TX1] MOV BX,[BP+12] MOV ES:[BX],AX MOV AX,[TY1] MOV BX,[BP+10] MOV ES:[BX],AX POP BP POP DS POP ES RETF 8 ;GTXTLOC ENDP ;=============================================== GTCOLOR: ;GTCOLOR PROC FAR PUSH ES PUSH DS PUSH BP MOV AX,DS MOV ES,AX PUSH CS POP DS MOV BP,SP MOV BX,[BP+10] MOV AX,ES:[BX] MOV [COLOR],AL POP BP POP DS POP ES RETF 2 ;GTCOLOR ENDP ;=============================================== GETREC PROC NEAR PUSH DS PUSH ES PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI PUSH CS POP DS MOV AX,[ESEG] ; BUFFER SEGMENT MOV [BUFFADD+2],AX MOV AX,[BUFF] ; BUFFER OFFSET MOV [BUFFADD],AX MOV [FILESIZE],512 ; BUFFER SIZE CALL FREAD ; READ THE FILE POP SI MOV SI,CS:[BUFF] ; RESET BUFFER POINTER POP DI POP DX POP CX POP BX POP AX POP ES POP DS RET GETREC ENDP ;======================================= PUTREC PROC NEAR PUSH DS PUSH ES PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH CS POP DS MOV AX,[ESEG] ; BUFFER SEGMENT MOV [BUFFADD+2],AX MOV AX,[BUFF] ; BUFFER OFFSET MOV [BUFFADD],AX SUB DI,AX ; BUFFER LENGTH MOV [FILESIZE],DI CALL FWRITE ; WRITE THE FILE POP DI MOV DI,CS:[BUFF] ; RESET BUFFER POINTER POP SI POP DX POP CX POP BX POP AX POP ES POP DS RET PUTREC ENDP ;======================================= PCXHEADOUT PROC NEAR PUSH DS PUSH ES PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH CS POP DS MOV AL,8 MOV CL,[BITPIX] ; GET X LENGTH IN BYTES SHR AL,CL ; AX IS THE X COUNT MOV [PCXBPX],AL ; PIXELS PER BYTE MOV AX,[IX1] ; PICTURE DIMENSIONS MOV [PCXX1],AX MOV AX,[IY1] MOV [PCXY1],AX MOV AX,[IX2] MOV [PCXX2],AX MOV AX,[IY2] MOV [PCXY2],AX MOV AX,[IXMAXA] MOV [PCXHRES],AX ; CARD HORIZONTAL RESOLUTION MOV AX,[IYMAXA] MOV [PCXVRES],AX ; CARD VERTICAL RESOLUTION MOV AL,[NPLANES] MOV [PCXNPL],AL ; HOW MANY COLOR PLANES MOV AX,[IX2] ; AX IS THE BYTE RANGE SUB AX,[IX1] INC AX MOV CL,[BITPIX] ; GET X LENGTH IN BYTES SHR AX,CL ; AX IS THE X COUNT MOV [PCXRWL],AX ; HOW MANY BYTES LONG IS EACH ROW? PCXHEAD1: PUSH DS ; BUFFER SEGMENT POP AX MOV [BUFFADD+2],AX MOV AX,OFFSET PCXHEAD MOV [BUFFADD],AX MOV [FILESIZE],128 CALL FWRITE ; WRITE THE FILE POP DI POP SI POP DX POP CX POP BX POP AX POP ES POP DS RET PCXHEADOUT ENDP ;======================================= PCXHEADIN PROC NEAR PUSH DS PUSH ES PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI PUSH CS POP DS PUSH DS ; BUFFER SEGMENT POP AX MOV [BUFFADD+2],AX MOV AX,OFFSET PCXHEAD MOV [BUFFADD],AX MOV [FILESIZE],128 ; BUFFER SIZE CALL FREAD ; READ THE FILE CMP [IRETC],0 JZ PCXIN1A JMP PCXIN1 PCXIN1A: ; ALL OK ; ADJUST THE X'S TO INCLUDE THE COMPLETE BYTES MOV CL,[BITPIX] MOV AX,1 ; SET AX TO FFFF, FFFE, FFFC, OR FFF8, SHL AX,CL ; FOR 1, 2, 4, OR 8 PIXELS PER BYTE DEC AX MOV CX,AX ; CX IS PIXELS PER BYTE - 1 NOT AX ; AX CAN NOW BE ANDED WITH THE X'S AND [PCXX1],AX ; ROUND PCXX1 DOWN TO THE NEXT BYTE AND [PCXX2],AX ; ROUND PCXX2 UP TO THE NEXT BYTE ADD [PCXX2],CX MOV AX,[PCXX2] ; AX IS THE BYTE RANGE SUB AX,[PCXX1] INC AX MOV CL,[BITPIX] ; GET X LENGTH IN BYTES SHR AX,CL ; AX IS THE X COUNT MOV [TMP1],AX ; TMP1 IS THE X COUNTER MOV AX,[PCXY2] ; SAVE THE Y LENGTH OF THE FILE SUB AX,[PCXY1] INC AX MOV [TMP2],AX ; CHECK TO SEE IF IT'S COMPATIBLE WITH THE CURRENT GRAPHICS MODE MOV AL,8 ; BITS PER PIXEL MUST BE THE SAME MOV CL,[BITPIX] ; GET X LENGTH IN BYTES SHR AL,CL ; AX IS THE X COUNT CMP AL,[PCXBPX] JNZ NOTCOMPAT MOV AL,[NPLANES] ; NOW SAVE THE LESSER OF NPLANES AND PCXNPL CMP AL,[PCXNPL] ; IN GETNPL FOR THE READ ROUTINE JNZ NOTCOMPAT MOV [GETNPL],AL PCXIN4: JMP SHORT PCXIN1 NOTCOMPAT: MOV [IRETC],27 ; INCOMPATIBLE - ABORT PCXIN1: POP SI MOV SI,CS:[BUFF] ; RESET BUFFER POINTER POP DI POP DX POP CX POP BX POP AX POP ES POP DS RET PCXHEADIN ENDP ;======================================================= CHAR3 PROC NEAR ; EGA/VGA COLOR ; CHAR4 WORKS FOR EGA/VGA COLOR, BUT THIS IS FASTER ; DX:BX IS SCREEN LOCATION, DI IS MATRIX ADDRESS PUSH ES PUSH DX PUSH CX PUSH BX MOV ES,DX MOV CH,AL ; FIRST BLANK OUT THE SPACE MOV DX,3C4H ; MAP MASK PORT MOV AH,15 ; ENABLE ALL PLANES MOV AL,2 OUT DX,AX MOV AL,CH MOV CX,16 CHAR3C: ; TOP TO BOTTOM MOV BYTE PTR ES:[BX],0 ; SET CHARACTER SPACE TO BLACK CALL YINCSUB LOOP CHAR3C MOV CX,16 CHAR3F: CALL YDECSUB ; REPLACE CURSOR, IN CASE THE SEGMENT CHANGED. LOOP CHAR3F PUSH DI MOV CH,AL MOV AL,[COLOR] MOV AH,[BCOLOR] MOV [PL1],AL ; PL1 IS BOTH FOREGROUND & BACKGROUND PLANES MOV [PL2],AL ; PL2 IS FOREGROUND PLANES ONLY MOV [PL3],AH ; PL3 IS BACKGROUND PLANES ONLY AND [PL1],AH MOV AL,[PL1] XOR [PL2],AL XOR [PL3],AL CMP [PL1],0 JZ FORE3A MOV AH,[PL1] MOV AL,2 OUT DX,AX MOV AL,CH MOV CX,16 COMM3A: ; TOP TO BOTTOM MOV AL,255 ; FOREGROUND AND BACKGROUND PLANES MOV ES:[BX],AL CALL YINCSUB LOOP COMM3A MOV CX,16 CHAR3D: CALL YDECSUB ; REPLACE CURSOR, IN CASE THE SEGMENT CHANGED. LOOP CHAR3D FORE3A: POP DI PUSH DI CMP [PL2],0 JZ BACK3A MOV AH,[PL2] ; FOREGROUND ONLY PLANES MOV AL,2 OUT DX,AX MOV AL,CH MOV CX,16 CHAR3A: ; TOP TO BOTTOM MOV AL,[DI] MOV ES:[BX],AL INC DI CALL YINCSUB LOOP CHAR3A MOV CX,16 CHAR3E: CALL YDECSUB ; REPLACE CURSOR, IN CASE THE SEGMENT CHANGED. LOOP CHAR3E BACK3A: POP DI CMP [PL3],0 JZ CHAR3DONE MOV CH,AL MOV AH,[PL3] ; BACKGROUND ONLY PLANES MOV AL,2 OUT DX,AX MOV AL,CH MOV CX,16 CHAR3B: ; TOP TO BOTTOM MOV AL,[DI] NOT AL MOV ES:[BX],AL ; OR ES:[BX],AL INC DI CALL YINCSUB LOOP CHAR3B MOV CX,16 CHAR3G: CALL YDECSUB ; REPLACE CURSOR, IN CASE THE SEGMENT CHANGED. LOOP CHAR3G CHAR3DONE: POP BX POP CX POP DX POP ES INC BX ADD [TX1],8 RET CHAR3 ENDP ;======================================= ; ;CHAR3 PROC NEAR ; ; EGA COLOR ; ; DX:BX IS SCREEN LOCATION, DI IS MATRIX ADDRESS ; ; PUSH ES ; PUSH BX ; PUSH CX ; PUSH DX ; MOV ES,DX ; ; MOV CH,AL ; MOV DX,3C4H ; MAP MASK PORT ; MOV AH,[COLORS+1] ; WHITE ; MOV AL,2 ; OUT DX,AX ; MOV AL,CH ; ; MOV CX,8 ;CHARX6: ; TOP TO BOTTOM ; MOV AL,[DI] ; MOV ES:[BX],AL ; INC DI ; CALL YINCSUB ; LOOP CHARX6 ; ; POP DX ; POP CX ; POP BX ; POP ES ; INC BX ; ADD [TX1],8 ; RET ; ;CHAR3 ENDP ; ;======================================================= VIDXY PROC NEAR ; GET THE ADDRESS LOCATION INTO BX-AL ; MODIFIES AX, BX, SOMETIMES ES ; ALSO ASSIGNS IX, IY = IX1, IY1 PUSH CX PUSH DX MOV AX,[IX1] MOV [IX],AX MOV AX,[IY1] MOV [IY],AX MOV BX,0 MOV AX,[IY1] ; AX HAS Y VALUE OR Y/2 IF NOT GLOBAL MOV CX,[ROWLEN] ; CX IS ROW MULTIPLIER CALL VIDSUB POP DX POP CX RET VIDXY ENDP ;========================================== VID6 PROC NEAR ; 6-10, 12, 16, 21, 23, 24, 25, 26, 31 - EGA ; EGA/VGA MUL CX ; GET THE Y PART FOR 3270 MONO ADD BX,AX MOV AX,[IX1] SAR AX,1 ; ADD IX1/8 SAR AX,1 SAR AX,1 ADD BX,AX ; GOT ALL OF IT MOV AX,[IX1] ; NOW GET THE "OR" BYTE MOV CL,7 AND CL,AL ; CL HAS LOW 3 BITS MOV AL,080H ; DOT SHR AL,CL RET VID6 ENDP ;======================================= VIDPLANE PROC NEAR ; THIS PROCEDURE MOVES THE VIDEO DISPLAY POINTERS TO A CERTAIN COLOR PLANE ; CL HAS THE PLANE NUMBER 0-N ; [MODE] TELLS WHETHER IT'S A READ OR A WRITE OPERATION ; 0 = WRITE TO BOARD, 1 = WRITE TO MEMORY. ; CX HAS THE VIDEO SEGMENT ON RETURN, IF IT'S DIFFERENT FROM VIDMEM ; AX HAS THE VIDEO BUFFER SEGMENT - VIDEO2, 2B, 2C, & 2D DEPENDING ON THE PAGE CMP CS:[NPLANES],1 ; EXIT IF TOO FEW PLANES JG PLANESOK MOV CX,ES ; KEEP SAME VIDEO SEGMENT RET PLANESOK: PUSH SI PUSH DI PUSH DX PUSH BX PUSH DS PUSH CS ; USE REGULAR DATA SEGMENT POP DS MOV DI,ES ; DI = VIDEO MEMORY SEG ADDRESS MOV CH,0 ; CX IS NOW THE PAGE NUMBER, NOT JUST CL MOV BX,OFFSET VIDEO2 ; SI = RAM VIDEO BUFFER SEG ADDRESS MOV AX,CX SHL AX,1 ADD BX,AX MOV SI,[BX] ; 16 COLOR EGA - SET PAGE, MODE. EGAPLANE: ;CMP [MODE],0 ; REMOVED ON 9-14 FOR XOR GPUT ;JNZ VV5 MOV DX,3C4H ; MODE 0 - WRITE TO BOARD MOV AL,2 MOV AH,1 ; EGA PAGE NUMBER SHL AH,CL OUT DX,AX ;JMP VV6 ; REMOVED 9-14-88 ;VV5: MOV DX,3CEH ; MODE 1 - WRITE TO RAM (FROM EGA) MOV AL,4 MOV AH,CL ; EGA PAGE NUMBER OUT DX,AX ;VV6: JMP VPLDONE VPLDONE: MOV CX,DI ; CX HAS VIDEO BOARD SEGMENT MOV AX,SI ; AX HAS VIDEO BUFFER SEGMENT POP DS POP BX POP DX POP DI POP SI RET VIDPLANE ENDP ;========================================== VIDPAGE PROC NEAR ; THIS PROCEDURE MOVE THE VIDEO DISPLAY POINTERS TO A CERTAIN PAGE ; CL HAS THE PAGE NUMBER 0-N ; [MODE] TELLS WHETHER IT'S A READ OR A WRITE OPERATION ; 0 = WRITE TO BOARD, 1 = WRITE TO MEMORY. ; CX HAS THE VIDEO SEGMENT ON RETURN, IF IT'S DIFFERENT FROM VIDMEM ; AX HAS THE VIDEO BUFFER SEGMENT - VIDEO2, 2B, 2C, & 2D DEPENDING ON THE PAGE PUSH SI PUSH DI PUSH DX PUSH BX PUSH DS PUSH CS ; USE REGULAR DATA SEGMENT POP DS MOV DI,[VIDMEM] ; DI = VIDEO MEMORY SEG ADDRESS MOV CH,0 ; CX IS NOW THE PAGE NUMBER, NOT JUST CL MOV BX,OFFSET VIDEO2 ; SI = RAM VIDEO BUFFER SEG ADDRESS MOV AX,CX SHL AX,1 ADD BX,AX MOV SI,[BX] ; 16 COLOR EGA - SET PAGE, MODE. EGAPAGEQ: ;CMP [MODE],0 ; REMOVED ON 9-14 FOR XOR GPUT ;JNZ VV5 MOV DX,3C4H ; MODE 0 - WRITE TO BOARD MOV AL,2 MOV AH,1 ; EGA PAGE NUMBER SHL AH,CL OUT DX,AX ;JMP VV6 ; REMOVED 9-14-88 VV5: MOV DX,3CEH ; MODE 1 - WRITE TO RAM (FROM EGA) MOV AL,4 MOV AH,CL ; EGA PAGE NUMBER OUT DX,AX VV6: MOV CX,DI ; CX HAS VIDEO BOARD SEGMENT MOV AX,SI ; AX HAS VIDEO BUFFER SEGMENT POP DS POP BX POP DX POP DI POP SI RET VIDPAGE ENDP ;======================================= SETPNT4 PROC NEAR ; IBM EGA REPLACE VERSION, COLOR ; SET POINT ES:BX-AL. ; MODIFIES AH PUSH DX PUSH CX MOV CH,AL ; SAVE AL IN AH - USE AL FOR OUT INSTR MOV DX,3CEH MOV AL,8 ; BIT MASK - SELECT REG MOV AH,CH OUT DX,AX ; MASK VALUE IS AH MOV AX,205H ; WRITE MODE 2, READ MODE 0 OUT DX,AX MOV AX,0003H OUT DX,AX MOV AL,ES:[BX] ; READ MODIFY WRITE MOV AL,[COLOR] MOV ES:[BX],AL MOV AL,CH ; RESTORE AL POP CX POP DX ; AND CX, DX RET SETPNT4 ENDP ;========================================== SETPNT5 PROC NEAR ; IBM EGA REPLACE VERSION, COLOR ; SET POINT ES:BX-AL. ; MODIFIES AH PUSH DX PUSH CX MOV CH,AL ; SAVE AL IN AH - USE AL FOR OUT INSTR MOV DX,3CEH MOV AL,8 ; BIT MASK - SELECT REG MOV AH,CH OUT DX,AX ; MASK VALUE IS AH MOV AX,205H ; WRITE MODE 2, READ MODE 0 OUT DX,AX MOV AX,1803H OUT DX,AX MOV AL,ES:[BX] ; READ MODIFY WRITE MOV AL,[COLOR] MOV ES:[BX],AL MOV AL,CH ; RESTORE AL POP CX POP DX ; AND CX, DX RET SETPNT5 ENDP ;========================================== ; INCREMENT THE CURSOR POINTER - BX ; PRODESIGN BUFFER YINC1 PROC NEAR INC [IY] ADD BX,[ROWLEN] RET YINC1 ENDP ;======================================== ; PRODESIGN BUFFER ; DECREMENT THE CURSOR POINTER - BX YDEC1 PROC NEAR DEC [IY] SUB BX,[ROWLEN] RET YDEC1 ENDP ;======================================= ; HERCULES CARD ; INCREMENT THE CURSOR POINTER: BX + AL MASK XINC2 PROC NEAR INC [IX] SHR AL,1 ; NO NEW WORD JNZ XDONE2 INC BX ; NEW WORD MOV AL,080H XDONE2: RET XINC2 ENDP ;=========================================== ; HERCULES CARD ; DECREMENT THE CURSOR POINTER: BX + AL MASK XDEC2 PROC NEAR DEC [IX] SHL AL,1 ; NO NEW WORD JNZ XDONE3 DEC BX ; NEW WORD MOV AL,01H XDONE3: RET XDEC2 ENDP ;=========================================== DUMMYSEG PROC NEAR ; SELECT THE 64K BANK [EGASEG] RET DUMMYSEG ENDP ;========================================== RPOINT PROC NEAR ; ADDRESS IS ES:BX:AL - RETURN THE COLOR IN CL PUSH AX PUSH BX PUSH DX PUSH SI RPOINT2: ; 16 COLOR EGA, VGA, ETC. MOV SI,BX ; SI NOW HAS THE ADDRESS MOV CH,AL ; CH IS THE BIT ADDRESS (MASK) MOV BL,0 ; BL WILL HAVE THE ANSWER MOV DX,3CEH MOV AX,304H ; 3 FOR PLANE, 4 FOR INDEX RPOINT1: OUT DX,AX ; OUTPUT AL AT DX, AH AT DX + 1 MOV BH,ES:[SI] AND BH,CH ; MASK ONE BIT FROM THE BYTE NEG BH ; BIT 7 IS 1 IF MASKED BIT WAS 1, ELSE IT'S 0. ROL BX,1 ; SAVE RESULT IN BL DEC AH JGE RPOINT1 MOV CL,BL ; RETURN CL POP SI POP DX POP BX POP AX RET RPOINT ENDP ;============================================ CLIP PROC NEAR PUSH CX MOV CX,[IX] CMP CX,[IXMIN] JL OUTSIDE CMP CX,[IXMAX] JG OUTSIDE MOV CX,[IY] CMP CX,[IYMIN] JL OUTSIDE CMP CX,[IYMAX] JG OUTSIDE ; IX, IY ARE IN RANGE MOV [ICLIP],0 POP CX RET OUTSIDE: MOV [ICLIP],1 POP CX RET CLIP ENDP ;========================================== ; MODE = 0 FOR REPLACE, 1 FOR XOR ; DRAW A HORIZONTAL LINE AT BX-AL (IX) TO PX2 HLINE PROC NEAR MOV CX,[PX2] MOV DX,[IX] SUB CX,DX INC CX LOOPH1: TEST [MODE],8 JNZ SKIPHL PUSH CX CALL CLIP POP CX CMP [ICLIP],0 JNZ SKIPHL1 SKIPHL: CALL SETSUB SKIPHL1: CALL XINCSUB LOOP LOOPH1 RET HLINE ENDP ;========================================= ; MODE = 0 FOR REPLACE, 1 FOR XOR ; DRAW A HORIZONTAL LINE AT BX-AL (IY) TO PY2 VLINE PROC NEAR MOV CX,[PY2] MOV DX,[IY] SUB CX,DX INC CX LOOPV1: TEST [MODE],8 JNZ SKIPVL PUSH CX CALL CLIP POP CX CMP [ICLIP],0 JNZ SKIPVL1 SKIPVL: CALL SETSUB SKIPVL1: CALL YINCSUB LOOP LOOPV1 RET VLINE ENDP ;==================================================== ; IS THIS PIXEL BLACK? SET 0 IF IT'S BLACK GLOOK PROC NEAR ; BX, AL PUSH CX CALL RPOINT MOV AH,CL POP CX CMP AH,0 ; ZERO FLAG NOT SET RET GLOOK ENDP ;======================================================== ; IS THIS PIXEL THE SAME COLOR AS GLOOK1 PROC NEAR ; BX, AL PUSH CX CALL RPOINT MOV AH,CL POP CX CMP AH,[COLOR] ; COMPARE TO CURRENT COLOR JNZ GLOOK1A OR AH,-1 ; SET Z IF NOT EQUAL, NOT Z IF EQUAL RET GLOOK1A: AND AH,0 RET GLOOK1 ENDP ;============================================ ; CHECK TO THE LEFT AND RIGHT FOR THE PAINT COMMAND PCHECK PROC NEAR MOV BP,ES ; ES = VIDEO, BP = NORM ES, DI = VIDEO MOV ES,[VIDMEM] CALL VIDXY ; SET BX TO IX1,IY1 ADDRESS CALL CLIP ; CHECK RANGE CMP [ICLIP],0 JZ LOOPC1 MOV ES,BP ; RESTORE ES RET LOOPC1: CALL GLOOKSUB ; GET FIRST ON ON LEFT JNZ SKIPC1 MOV DX,[IX] ; IXMIN IS ALSO A LIMIT CMP DX,[IXMIN] JL SKIPC1 CALL XDECSUB JMP LOOPC1 SKIPC1: CALL XINCSUB LOOPC2: MOV DX,[IX] CMP DX,[IXMAX] ; DONE IF PAST IXMAX JL SKIPC2X JMP CDONE ; TOO FAR FOR CONDITIONAL JUMP SKIPC2X: CMP DX,[IX2] ; DONE IF PAST IX2 JLE SKIPC2Y JMP CDONE SKIPC2Y: CALL GLOOKSUB ; GET FIRST OFF ON RIGHT JZ SKIPC2 MOV DX,[IX] CMP DX,[IXMAX] ; LIMIT BY IXMAX JGE SKIPC2 CALL XINCSUB JMP LOOPC2 SKIPC2: MOV DX,[IX] MOV [PX1],DX CALL XINCSUB LOOPC3: CALL GLOOKSUB ; GET NEXT ON ON RIGHT JNZ SKIPC3 MOV DX,[IX] ; LIMIT BY IXMAX CMP DX,[IXMAX] JG SKIPC3 CALL XINCSUB JMP LOOPC3 SKIPC3: CALL XDECSUB ; SAVE THE COORDINATES IN THE QUEUE PUSH AX PUSH BX PUSH ES MOV AX,[IX] ; SAVE CURRENT POSITION MOV [TMP1],AX MOV ES,BP ; SET ES TO NORMAL MOV BX,[HEAD] CMP BX,7996 ; WRAP BX AROUND JG ABORT ; TOO MANY VECTORS ; JL SKIPC4 ; MOV BX,0 SKIPC4: ; PUT IX1, IY1, IX2 INTO QUEUE INC WORD PTR ES:[SI] ; COUNTER OF HOW MANY POINT PAIRS MOV AX,[PX1] MOV ES:[BX+SI],AX ; IX1 ADD BX,2 MOV CX,[IY1] MOV ES:[BX+SI],CX ; IY1 ADD BX,2 MOV DX,[IX] MOV ES:[BX+SI],DX ; IX2 MOV [PX2],DX ADD BX,2 MOV [HEAD],BX MOV DI,[IX1] ; CALL VIDXY USING PX1 (SAVE IX1 ON STACK) MOV DX,[PX1] MOV [IX1],DX POP ES CALL VIDXY MOV [IX1],DI CALL HLINE ; HLINE & VIDXY MODIFY IX MOV AX,[TMP1] ; RESTORE CURRENT POSITION MOV [IX],AX POP BX POP AX CALL XINCSUB JMP LOOPC2 CDONE: MOV ES,BP ; NORMAL ES RET ABORT: ; QUIT! FILLED UP BUFFER POP ES POP BX POP AX MOV AX,[HEAD] MOV [TAIL],AX MOV ES,BP RET PCHECK ENDP ;======================================================== GETEMS PROC NEAR ; BX IS THE LOGICAL PAGE NUMBER ; VIDEO2 IS THE MAIN MEMORY BUFFER OFFSET PUSH DS PUSH ES PUSH SI PUSH DI PUSH DX PUSH CX PUSH AX ; DS IS NO GOOD AFTER HERE! MOV ES,CS:[VIDEO2] MOV DS,CS:[EMSEG] MOV DI,0 ; THIS IS THE SAME AS VIDEO2B, C, AND D MOV CX,CS:[EMFULL] CMP CX,0 JZ EMGPART EMGLOOP: PUSH CX ; BX - LOGICAL PAGE NUMBER MOV AH,44H ; FUNCTION MOV AL,0 ; PHYSICAL PAGE NUMBER MOV DX,CS:[VHANDLE] ; HANDLE INT 67H ; GET PAGE INC BX ; NEXT LOGICAL PAGE, NEXT TIME MOV SI,0 MOV CX,16384 CLD REP MOVSB ; DS:SI TO ES:DI POP CX LOOP EMGLOOP EMGPART: ; GET THE LEFTOVER PART OF THE MEMORY MOV AH,44H ; FUNCTION MOV AL,0 ; PHYSICAL PAGE NUMBER MOV DX,CS:[VHANDLE] ; HANDLE INT 67H ; GET PAGE MOV SI,0 MOV CX,CS:[EMPART] CMP CX,0 JZ NONELEFT CLD REP MOVSB ; DS:SI TO ES:DI NONELEFT: POP AX POP CX POP DX POP DI POP SI POP ES POP DS RET GETEMS ENDP ;==================================================== RUNCODE PROC NEAR ; STORE CL INTO ES:[DI] IN COMPRESSED FORMAT ; USE COUNT IF COUNT > 1 OR BYTE >= C0. ; PC PAINTBRUSH ENCODING SCHEME PUSH DS PUSH AX PUSH CS POP DS CMP [ICOUNT],0 ; FIRST TIME? JZ RUNC4 CMP [IBYTE],CL JNZ RUNC1 CMP [ICOUNT],63 JGE RUNC1 INC [ICOUNT] ; IF IBYTE = CL AND COUNT < 63 THEN INC COUNT JMP RUNDONE RUNC1: CMP [ICOUNT],1 JG RUNC2 CMP [IBYTE],0C0H JB RUNC3 RUNC2: MOV AL,[ICOUNT] OR AL,0C0H MOV ES:[DI],AL INC DI RUNC3: MOV AL,[IBYTE] ; PUTCHAR IBYTE IF ICOUNT <= 1 AND IBYTE < 192 MOV ES:[DI],AL INC DI RUNC4: MOV [IBYTE],CL MOV [ICOUNT],1 RUNDONE: POP AX POP DS RET RUNCODE ENDP ;======================================= RUNFLUSH PROC NEAR PUSH DS PUSH AX PUSH CS POP DS CMP [ICOUNT],1 JG RUNF2 TEST [IBYTE],0C0H JZ RUNF3 RUNF2: MOV AL,[ICOUNT] OR AL,0C0H MOV ES:[DI],AL INC DI RUNF3: MOV AL,[IBYTE] MOV ES:[DI],AL INC DI MOV [ICOUNT],0 POP AX POP DS RET RUNFLUSH ENDP ;======================================= PUTEMS PROC NEAR ; BX IS THE LOGICAL PAGE NUMBER ; VIDEO2 IS THE MAIN MEMORY BUFFER OFFSET PUSH DS PUSH ES PUSH SI PUSH DI PUSH DX PUSH CX PUSH AX MOV DS,CS:[VIDEO2] MOV ES,CS:[EMSEG] MOV SI,0 MOV CX,CS:[EMFULL] CMP CX,0 JZ EMPPART EMPLOOP: PUSH CX ; BX - LOGICAL PAGE NUMBER MOV AH,44H ; FUNCTION MOV AL,0 ; PHYSICAL PAGE NUMBER MOV DX,CS:[VHANDLE] ; HANDLE INT 67H ; GET PAGE INC BX ; NEXT LOGICAL PAGE, NEXT TIME MOV DI,0 MOV CX,16384 CLD REP MOVSB ; DS:SI TO ES:DI POP CX LOOP EMPLOOP EMPPART: ; GET THE LEFTOVER PART OF THE MEMORY MOV AH,44H ; FUNCTION MOV AL,0 ; PHYSICAL PAGE NUMBER MOV DX,CS:[VHANDLE] ; HANDLE INT 67H ; GET PAGE MOV DI,0 MOV CX,CS:[EMPART] CLD REP MOVSB ; DS:SI TO ES:DI POP AX POP CX POP DX POP DI POP SI POP ES POP DS RET PUTEMS ENDP ;==================================================== FREAD PROC NEAR ; Read IFILESIZE bytes from file F_S into BUFF. ; INFILE (SEG BUFF, NBYTES, NREAD, HANDLE, IRETC) PUSH DS PUSH ES PUSH BP PUSH CS POP DS MOV [IRETC],0 MOV BX,[HANDLE] ;BX = file handle MOV CX,[FILESIZE] ;CX = # bytes to read PUSH DS ;save DS MOV DX,[BUFFADD] MOV AX,[BUFFADD+2] MOV DS,AX ;DS:DX points to the memory buffer MOV AH,3FH ;read file onto the memory buffer INT 21H POP DS ;restore DS JNC FREAD2 ;carry flag = 0 if no error MOV [IRETC],AX ;put error code in ERRCODE on error FREAD2: POP BP POP ES POP DS RET FREAD ENDP ;============================================================================ FWRITE PROC NEAR ; Read IFILESIZE bytes from file F_S into BUFF. ; INFILE (SEG BUFF, NBYTES, IHANDLE, IRETC) PUSH DS PUSH ES PUSH BP PUSH CS POP DS MOV [IRETC],0 MOV BX,[HANDLE] ;BX = file handle CMP BX,0 JNZ FWRITE1 MOV [IRETC],-1 JMP FWRITE2 FWRITE1: MOV CX,[FILESIZE] ;CX = # bytes to write PUSH DS ;save DS MOV DX,[BUFFADD] MOV AX,[BUFFADD+2] MOV DS,AX ;DS:DX points to the memory buffer MOV AH,40H ;write file from the memory buffer INT 21H POP DS ;restore DS JNC FWRITE2 ;carry flag = 0 if no error MOV [IRETC],AX ;put error code in ERRCODE on error JMP FWRITE3 FWRITE2: CMP AX,CX JZ FWRITE3 MOV [IRETC],CX FWRITE3: POP BP POP ES POP DS RET FWRITE ENDP ;============================================================================ EGARST PROC NEAR ; RESET MOST OF THE EGA REGISTERS TO DEFAULT VALUES PUSH AX PUSH DX MOV DX,3C4H MOV AX,0F02H ; PLANE MAP MASK - ALL PLANES ENABLED OUT DX,AX MOV DX,3CEH ; RESTORE BIT MASK TO FF MOV AX,0FF08H ; BIT MASK - SELECT REG OUT DX,AX ; ALL BITS ENABLED MOV DX,3CEH ; MODE REGISTER MOV AX,0005H OUT DX,AX MOV DX,3CEH ; FUNCTION SELECT MOV AX,0003H OUT DX,AX POP DX POP AX RET EGARST ENDP ;======================================= VSEG ENDS END ENTRY