josh%ILJCT.BITNET@wiscvm.wisc.EDU (Joshua D. Males) (09/15/87)
I pulled this out of an Info-IBMPC digest a few months ago. Some guy from some Scandinavian country sent it in. Here it goes: Since this information was recently asked and I've not seen the answer, I looked it up. It comes from the manual for a board that claims to be "100% Hercules compatible", and seems to be just that. I take no responsibility of its accuracy. The card has a text mode and a graphics mode. In the text mode, it is just like IBM monochrome adapter. In graphics mode it has two graphic pages ( 0 and 1 ), resolution 720 x 348. It also has a printer port, which I will not discuss further. The board uses the ( Motorola ) 6845 display adapter. ( Look the data sheet for more information about that. ) The graphics are in memory, page 0 in B0000 - B7FFF and page 1 in B8000 - BFFFF ( hex ). The I/O ports are: 03B4: 6845 index register 03B5: 6845 data register 03B8: display mode control port 03B9: set light pen flip flop 03BA: display status port 03BB: reset light pen flip flop 03B.C.: printer data port 03BD: printer status port 03BE: printer control port 03BF: configuration switch The display mode control port sets the mode of operation for the card. bit 0: not used bit 1: 0 = text mode 1 = graphics mode ( note: you must reprogram the 6845 if you change this bit! ( otherwise you may blow your monitor)) bit 2: not used bit 3: 0 = blank the screen 1 = screen active bit 4: not used bit 5: 0 = text blinker off 1 = text blinker on ( every character whose attribute bits indicate blinking, will blink ) bit 6: not used bit 7: 0 = page 0 1 = page 1 The display status port: bit 0: 0 = normal character bit 3: 0 = dots off 1 = dots on ( I don't know the meaning of this ... ) bit 7: 0 = vertical retrace 1 = active display ,all other bits unused. The configuration switch: bit 0: 0 = prevents the setting of graphics mode 1 = allows it bit 1: 0 = masks page 1 out of memory map 1 = brings it to the memory In graphics mode the offset (zinto the pagez) of the byte containing the dot (x,y) is 2000H*(y mod 4) + 90*integer(y/4) + integer (x/8), where [ 0 <= x <= 719 and 0 <= y <= 347 ] The following are example procedures in Turbo Pascal: const indexreg = $03b4; datareg = $03b5; control = $03b8; config_switch = $03bf; var graphic_paramtrs : array [ 0..11] of byte; text_paramtrs : array [ 0..11] of byte; hgccntrlport_value : byte; procedure init_graphics; begin graphic_paramtrs [0] := $35; graphic_paramtrs [1] := $2d; graphic_paramtrs [2] := $2e; graphic_paramtrs [3] := 7; graphic_paramtrs [4] := $5B; graphic_paramtrs [5] := 2; graphic_paramtrs [6] := $57; graphic_paramtrs [7] := $57; graphic_paramtrs [8] := 2; graphic_paramtrs [9] := 3; graphic_paramtrs [10] := 0; graphic_paramtrs [11] := 0; text_paramtrs [0] := $61; text_paramtrs [1] := $50; text_paramtrs [2] := $52; text_paramtrs [3] := $0F; text_paramtrs [4] := $19; text_paramtrs [5] := 6; text_paramtrs [6] := $19; text_paramtrs [7] := $19; text_paramtrs [8] := 2; text_paramtrs [9] := $0d; text_paramtrs [10] := $0b; text_paramtrs [11] := $0c; hgccntrlport_value:= $20; port[config_switch]:=3; end; procedure screen_on; begin hgccntrlport_value := hgccntrlport_value or $08; port[control] := hgccntrlport_value; end; procedure screen_off; begin hgccntrlport_value := hgccntrlport_value and $f7; port[control] := hgccntrlport_value; end; procedure textmode; var i: integer; begin screen_off; hgccntrlport_value:= (hgccntrlport_value and $fd) or $20; port[control] := hgccntrlport_value; for i:= 0 to 11 do begin port[indexreg]:= i; port[datareg]:=text_paramtrs [i]; end; clrscr; screen_on; end; procedure graphicsmode; var i: integer; begin init_graphics; screen_off; hgccntrlport_value := ( hgccntrlport_value or $02 ) and $df; port[control] := hgccntrlport_value; for i:= 0 to 11 do begin port[indexreg]:= i; port[datareg]:=graphic_paramtrs [i]; end; screen_on; end;