1 ; THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
2 ; SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
3 ; END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
4 ; ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
5 ; IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
6 ; SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
7 ; FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
8 ; CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
9 ; AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
10 ; COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
14 _DATA SEGMENT BYTE PUBLIC USE32 'DATA'
22 extd _modex_line_vertincr
23 extd _modex_line_incr1
24 extd _modex_line_incr2
25 _modex_line_routine dd ?
30 extb _modex_line_Color
47 MaskTable1 db ALL_MASK AND RIGHT_MASK1,
48 ALL_MASK AND RIGHT_MASK2,
49 ALL_MASK AND RIGHT_MASK3,
51 LEFT_MASK3 AND RIGHT_MASK1,
52 LEFT_MASK3 AND RIGHT_MASK2,
53 LEFT_MASK3 AND RIGHT_MASK3,
55 LEFT_MASK2 AND RIGHT_MASK1,
56 LEFT_MASK2 AND RIGHT_MASK2,
57 LEFT_MASK2 AND RIGHT_MASK3,
59 LEFT_MASK1 AND RIGHT_MASK1,
60 LEFT_MASK1 AND RIGHT_MASK2,
61 LEFT_MASK1 AND RIGHT_MASK3,
64 MaskTable2 db ALL_MASK,RIGHT_MASK1,
68 LEFT_MASK3,RIGHT_MASK1,
69 LEFT_MASK3,RIGHT_MASK2,
70 LEFT_MASK3,RIGHT_MASK3,
72 LEFT_MASK2,RIGHT_MASK1,
73 LEFT_MASK2,RIGHT_MASK2,
74 LEFT_MASK2,RIGHT_MASK3,
76 LEFT_MASK1,RIGHT_MASK1,
77 LEFT_MASK1,RIGHT_MASK2,
78 LEFT_MASK1,RIGHT_MASK3,
103 _TEXT SEGMENT BYTE PUBLIC USE32 'CODE'
108 PUBLIC gr_sync_display_
117 jnz VS2A ; Loop until not in vertical retrace
120 jz VS2B ; Loop until in vertical retrace
127 PUBLIC gr_modex_uscanline_
132 ; EAX = X1 (X1 and X2 don't need to be sorted)
139 ;mov ebx, _RowOffset[ebx*4]
140 mov edi, _gr_var_bwidth
152 ; BX = LeftRight switch command. (4bit)
156 ; EDI = Offset into video memory
159 ; ECX = X2/4 - X1/4 - 1
162 ;======================= ONE GROUP OF 4 OR LESS TO DRAW ====================
168 mov al, MaskTable1[ebx]
171 mov [edi], al ; Write the one pixel
179 ;===================== TWO GROUPS OF 4 OR LESS TO DRAW ====================
181 mov cx, WORD PTR MaskTable2[ebx*2]
189 mov [edi], bl ; Write the left pixel
192 mov [edi+1], bl ; Write the right pixel
196 ;========================= MANY GROUPS OF 4 TO DRAW ======================
205 ; AL,AH = color of pixel
206 jmp NEAR32 PTR DrawTable[ebx*4]
209 DrawM: ;AH=COLOR, EDI=DEST, CX=X2/4-X1/4-1, BX=Table Index
216 rep stosw ; Write the middle pixels
218 stosb ; Write the middle odd pixel
223 ;AH=COLOR, EDI=DEST, CX=X2/4-X1/4-1, BX=Table Index
224 mov al, BYTE PTR MaskTable2[ebx*2]
226 mov [edi], ah ; Write leftmost pixels
234 rep stosw ; Write the middle pixels
236 stosb ; Write the middle odd pixel
241 DrawLMR: ;AH=COLOR, EDI=DEST, CX=X2/4-X1/4-1, BX=Table Index
242 mov bx, WORD PTR MaskTable2[ebx*2]
245 mov [edi], ah ; Write leftmost pixels
252 rep stosw ; Write the middle pixels
254 stosb ; Write the middle odd pixel
257 mov [edi], ah ; Write the rightmost pixels
261 DrawMR: ;AH=COLOR, EDI=DEST, CX=X2/4-X1/4-1, BX=Table Index
262 mov bx, WORD PTR MaskTable2[ebx*2]
269 rep stosw ; Write the middle pixels
271 stosb ; Write the middle odd pixel
274 mov [edi], ah ; Write the rightmost pixels
279 PUBLIC gr_modex_setmode_
297 ;call turn_screen_off
299 push ecx ; some bios's dont preserve cx
302 ;mov bl, 31h ; disable palette loading at mode switch
304 mov ax,13h ; let the BIOS set standard 256-color
305 int 10h ; mode (320x200 linear)
307 ;mov bl, 31h ; enable palette loading at mode switch
314 out dx,ax ; disable chain4 mode
318 out dx,ax ; synchronous reset while setting Misc
319 ; Output for safety, even though clock
322 mov esi, dword ptr ModeTable[ecx*4]
329 out dx,al ; select the dot clock and Horiz
343 out dx,ax ; undo reset (restart sequencer)
345 mov dx,CRTC_INDEX ; reprogram the CRT Controller
346 mov al,11h ; VSync End reg contains register write
347 out dx,al ; protect bit
348 inc dx ; CRT Controller Data register
349 in al,dx ; get current VSync End register setting
350 and al,07fh ; remove write protect on various
351 out dx,al ; CRTC registers
352 dec dx ; CRT Controller Index
359 lodsw ; get the next CRT Index/Data pair
360 out dx,ax ; set the next CRT Index/Data pair
365 out dx,ax ; enable writes to all four planes
366 mov edi, 0A0000h ; point ES:DI to display memory
367 xor ax,ax ; clear to zero-value pixels
368 mov ecx,8000h ; # of words in display memory
369 rep stosw ; clear all of display memory
371 ; Set pysical screen dimensions
374 lodsw ; Load scrn pixel width
399 lodsw ; Load Screen Phys. Height
411 PUBLIC gr_modex_setplane_
421 and cl,011b ;CL = plane
422 mov ax,0100h + MAP_MASK ;AL = index in SC of Map Mask reg
423 shl ah,cl ;set only the bit for the required
425 mov dx,SC_INDEX ;set the Map Mask to enable only the
426 out dx,ax ; pixel's plane
429 mov ah,cl ;AH = plane
430 mov al,READ_MAP ;AL = index in GC of the Read Map reg
431 mov dx,GC_INDEX ;set the Read Map to read the pixel's
439 PUBLIC gr_modex_setstart_
445 ; EBX = Wait for retrace
451 mov ecx, _gr_var_bwidth
471 out dx, ax ; Start address low
473 out dx, ax ; Start address high
482 jz WaitVS ; Loop until in vertical retrace
494 ; given: ebx=x, eax=y, return cl=plane mask, ebx=address, trash eax
498 imul eax, _gr_var_bwidth
504 ;-----------------------------------------------------------------------
506 ; Line drawing function for all MODE X 256 Color resolutions
507 ; Based on code from "PC and PS/2 Video Systems" by Richard Wilton.
509 PUBLIC gr_modex_line_
514 mov dx,SC_INDEX ; setup for plane mask access
516 ; check for vertical line
518 mov esi,_gr_var_bwidth
519 mov ecx,_modex_line_x2
520 sub ecx,_modex_line_x1
529 mov ebx,_modex_line_x2
530 xchg ebx,_modex_line_x1
531 mov _modex_line_x2,ebx
533 mov ebx,_modex_line_y2
534 xchg ebx,_modex_line_y1
535 mov _modex_line_y2,ebx
537 ; calc dy = abs(y2 - y1)
540 mov ebx,_modex_line_y2
541 sub ebx,_modex_line_y1
549 ; select appropriate routine for slope of line
552 mov _modex_line_vertincr,esi
553 mov _modex_line_routine,offset LoSlopeLine
556 mov _modex_line_routine,offset HiSlopeLine
559 ; calc initial decision variable and increments
563 mov _modex_line_incr1,ebx
567 mov _modex_line_incr2,ebx
569 ; calc first pixel address
572 mov eax,_modex_line_y1
573 mov ebx,_modex_line_x1
578 mov ah,al ; duplicate nybble
584 jmp [_modex_line_routine]
586 ; routine for verticle lines
589 mov eax,_modex_line_y1
590 mov ebx,_modex_line_y2
599 mov ebx,_modex_line_x1
608 mov ax, word ptr _modex_line_Color
618 ; routine for horizontal line
622 mov eax,_modex_line_y1
623 mov ebx,_modex_line_x1
626 mov edi,ebx ; set dl = first byte mask
630 mov ecx,_modex_line_x2 ; set dh = last byte mask
636 ; determine byte offset of first and last pixel in line
638 mov eax,_modex_line_x2
639 mov ebx,_modex_line_x1
641 shr eax,2 ; set ax = last byte column
642 shr ebx,2 ; set bx = first byte column
643 mov ecx,eax ; cx = ax - bx
646 mov eax,edx ; mov end byte masks to ax
647 mov dx,SC_INDEX ; setup dx for VGA outs
648 mov bl,_modex_line_Color
650 ; set pixels in leftmost byte of line
652 or ecx,ecx ; is start and end pt in same byte
654 and ah,al ; combine start and end masks
665 ; draw remainder of the line
675 ; set pixels in rightmost byte of line
680 mov byte ptr [edi],bl
684 ; routine for dy >= dx (slope <= 1)
688 mov bh,byte ptr _modex_line_Color
697 ; bit mask not shifted out
701 add esi,_modex_line_incr1
709 add esi,_modex_line_incr2
712 add edi,_modex_line_vertincr
716 ; bit mask shifted out
723 add esi,_modex_line_incr1
728 add esi,_modex_line_incr2
729 add edi,_modex_line_vertincr
733 ; routine for dy > dx (slope > 1)
736 mov ebx,_modex_line_vertincr
740 mov al,_modex_line_Color
749 add esi,_modex_line_incr1
754 add esi,_modex_line_incr2