{ > Attention: All those who are familiar with graphics ports > (ie. Sean Palmer, Jan Doggen, and others I don't yet know). Don't consider myself that familiar with 'em, but here are some snippets and remarks. BTW I consider phasing out all BGI stuff in my code in the first half of '93 or so, which will be a major effort. After that, I'll rank myself among the register-twiddlers. Maybe we should team up on this project if you plan on going in that direction too. > Would you mind explaining the EGA map mask (?) and > sequencer (?) register ports (I don't know what they are > *really* called, but they are the ones that control which > bitplane gets written to in EGA mode > 640x350x16, 4 bitplanes) to me (please)? There are several write modes and read modes for EGA/VGA, and the exact workings of the registers depend on the mode. What you are talking about (I assume) is read/write mode 0 which you would use to pump bytes directly into a bit plane. I use the following procedure for this: (*************************** EGA/VGA bit planes ****************************) } CONST GDCIndexReg = $3CE; { Index register of EGA/VGA Graphics Device Controller } GDCDataReg = $3CF; { Data register of EGA/VGA Graphics Device Controller } SeqIndexReg = $3C4; { Index register of EGA/VGA Sequencer } SeqDataReg = $3C5; { Data register of EGA/VGA Sequencer } PROCEDURE PrepareBitPlaneRead(Plane: Byte); BEGIN Port[GDCIndexReg] := 5; { Number of Mode register } Port[GDCDataReg ] := 0; { Value of register: 0: read mode 0 } Port[GDCIndexReg] := 4; { Number of Read Map Select register } Port[GDCDataReg ] := Plane; { Value of register: bit for plane to read } END; { PrepareBitPlaneRead } PROCEDURE ConcludeBitPlaneRead(Plane: Byte); BEGIN Port[GDCIndexReg] := 5; { Number of Mode register } Port[GDCDataReg ] := $10; { Value of register: 10: default for modes 10h and 12h } Port[GDCIndexReg] := 4; { Number of Read Map Select register } Port[GDCDataReg ] := 0; { Value of register: plane to read } END; { ConcludeBitPlaneRead } PROCEDURE PrepareBitPlaneWrite(Plane,PutMode: Byte); BEGIN Port[GDCIndexReg] := 5; { Number of Mode register } Port[GDCDataReg ] := 0; { Value of register: 0: write mode 0 } Port[GDCIndexReg] := 1; { Number of Enable Set/Reset register } Port[GDCDataReg ] := 0; { Value of register: 0 } Port[GDCIndexReg] := 3; { Number of Data Rotate/Function Select register } (* Bits 3 and 4 from the Rotate/Function Select register mean: * Bit 4 Bit 3 Replacement function: * 0 0 Replace * 0 1 AND * 1 0 OR * 1 1 XOR *) CASE PutMode OF AndPut : Port[GDCDataReg] := 8; { No rotation; AND with buffer } OrPut : Port[GDCDataReg] := 16; { No rotation; OR with buffer } XORPut : Port[GDCDataReg] := 24 { No rotation; XOR with buffer } ELSE Port[GDCDataReg] := 0; { No rotation; replace; use this as default } END; { CASE } Port[GDCIndexReg] := 8; { Number of BitMask register } Port[GDCDataReg ] := $FF; { Value of register: $FF: use all bits } Port[SeqIndexReg] := 2; { Number of Map Mask register } Port[SeqDataReg ] := 1 SHL Plane; { Value of register: plane number } END; { PrepareBitPlaneWrite } PROCEDURE ConcludeBitPlaneWrite(Plane: Byte); BEGIN Port[GDCIndexReg] := 1; { Number of Enable Set/Reset register } Port[GDCDataReg ] := 0; { Value of register: 0 } Port[SeqIndexReg] := 2; { Number of Map Mask register } Port[SeqDataReg ] := $0F; { Value of register: Enable all planes } Port[GDCIndexReg] := 3; { Number of Data Rotate/Function Select register } Port[GDCDataReg ] := 0; { Value of register: No rotation; replace } END; { ConcludeBitPlaneWrite } { A good explanation can be found in: Wilton,R - Programmers' guide to PC and PS/2 video systems Microsoft Press You should invest in some books on EGA/VGA programming if you have more of these questions, otherwise you're being 'penny wise, pound foolish'. The book by Wilton is considered more or less a 'must have' together with Ferraro, R.F. - Programmer's guide to the EGA and VGA cards Addison-Wesley Ferraro gives you detailed register info. It also deals with Super VGAs. Because I'll have to expand a program to use VESA super VGA modes, I bought this together with: Rimmer, S - Super VGA graphics programming secrets WindCrest/McGraw Hill }