kreek@rocky2.UUCP (Biochemical Endocrinology) (07/10/86)
=============================================== Recently, I asked for help on writing directly to the EGA screen memory. I got excellent help from Peter Wu in Wisconsin. I just thought I would post my sample program that I was able to write as a result of Peter's help. It is a demonstration of how to address bytes in the EGA's memory. If you want to address pixels, you have to mask the bits in these bytes. This program draws an abstract pattern on the screen that is somewhat reminiscent of bathroom tiles. It does so in the fastest screen access method possible. I wrote this program in order to demonstrate how clumsy it is to access the screen memory. Ideally, the memory should be accessed so that one address location corresponds to one pixel containing four bits (for 16 colors). Unfortunately, I found this is not the case with the EGA, as is shown in the program. Writing a pixel with a given color involves programming several ports and masking of bits within the individual address of the screen memory, so you end up with five to ten instructions instead of just one or two. Interestingly, IBM uses about 30 instructions to write a pixel for their service 12 (dec) of interrupt 10 (hex). Does anyone know of a graphics board that is organized truly sequentially, as described in my ideal? Henrik Albeck -- UUCP: seismo| philabs| phri| -> cmcl2!rna!rocky2!kreek harvard| ihnp4| ARPANET: kreek@rockefeller.arpa BITNET: KREEK@ROCKVAX #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # pat8.asm # pat8.uu # This archive created: Wed Jul 9 18:39:39 1986 export PATH; PATH=/bin:$PATH if test -f 'pat8.asm' then echo shar: will not over-write existing file "'pat8.asm'" else cat << \SHAR_EOF > 'pat8.asm' TITLE PATTERN #8 7-5-86 [7-5-86] ; Henrik Albeck ; Rockefeller University ; New York City ; (212) 570-8248 ; UUCP: ; seismo| ; philabs| ; phri| -> cmcl2!rna!rocky2!kreek ; harvard| ; ihnp4| ; ; ARPANET: kreek@rockefeller.arpa ; BITNET: KREEK@ROCKVAX PROGNAM SEGMENT ASSUME CS:PROGNAM MAIN PROC FAR START: loop_num equ 28000 reg_adres_port equ 3c4h mask_port equ 3c5h mask_reg_num equ 2 video_seg equ 0a000h ;SET UP STACK FOR RETURN PUSH DS ;SAVE OLD DATA SEGMENT SUB AX,AX ;PUT ZERO IN AX PUSH AX ;SAVE IT ON STACK ;SET DS REGISTER TO CURRENT DATA SEGMENT MOV AX,video_seg ;SET VIDEO SEGMENT, STARTS MOV DS,AX ;AT A000 ;------------------ SET VIDEO MODE ----------------------; MOV AH,0H ;SERVICE 0 OF INT10 MOV AL,10H ;MODE 10H = 640 x 350 PIXEL, 16 COLORS INT 10H ;DO THE VIDEO INTERRUPT ;------------------ END SET VIDEO MODE ------------------; MOV AL,mask_reg_num ;SELECT REGISTER 2 OF PORT 3C5 MOV DX,reg_adres_port ;BY PUTTING 2 IN PORT 3C4 OUT DX,AL ;REG. 2 OF PORT 3C5 IS MASKING REGISTER MOV CX,loop_num ;NUMBER OF LOOPS MOV DX,mask_port ;SELECTING THE MASKING PORT FILL_SCREEN: ;START FILL SCREEN LOOP MOV BX,CX ;PUT LOOP COUNTER IN BX FOR ADDRESSING MOV AL,CH ;USE CH AS COLOR MASKER MUL CL ;MULTIPLY TO MAKE EXCITING PATTERN AND AL,CL ;AND AND IT TOO, FOR MORE EXCITEMENT OUT DX,AL ;OUT RESULT FOR MASKING AT PORT 3C5 PUSH DX ;SAVE MASKING PORT ADDRESS MOV DX,0FFFFH ;MOVE PIXELS INTO DX MOV [BX],DX ;OUTPUT TO SCREEN POP DX ;GET PORT ADDRESS BACK IN DX LOOP FILL_SCREEN ;END OF SCREEN FILLING LOOP RET ;RETURN TO OPERATING SYSTEM ( DOS ) MAIN ENDP PROGNAM ENDS END START SHAR_EOF if test 2516 -ne "`wc -c < 'pat8.asm'`" then echo shar: error transmitting "'pat8.asm'" '(should have been 2516 characters)' fi fi # end of overwriting check if test -f 'pat8.uu' then echo shar: will not over-write existing file "'pat8.uu'" else cat << \SHAR_EOF > 'pat8.uu' begin 644 pat8.exe M35HN ( @ __\ XVX '@ $ M M M M M M M M M M M >*\!0N "@CMBT + 0S1"P KK$ ^ZY8&VZQ0.+ 2V8K%]N$BP>Y2NO__B1=:XN[+ end SHAR_EOF if test 795 -ne "`wc -c < 'pat8.uu'`" then echo shar: error transmitting "'pat8.uu'" '(should have been 795 characters)' fi fi # end of overwriting check # End of shell archive exit 0