home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fractal Creations (Second Edition)
/
FRACTALS_2E.iso
/
frasrc.exe
/
HGCFRA.ASM
< prev
next >
Wrap
Assembly Source File
|
1991-09-13
|
7KB
|
269 lines
TITLE Hercules Graphics Routines for FRACTINT
; required for compatibility if Turbo ASM
IFDEF ??version
MASM51
QUIRKS
ENDIF
.MODEL medium,c
.8086
.data
HGCBase equ 0B000h ;segment for HGC regen buffer page 0
herc_index equ 03B4h
herc_cntrl equ 03B8h
herc_status equ 03BAh
herc_config equ 03BFh
; Hercules control/configuration register settings
scrn_on equ 08h
grph equ 02h
text equ 20h
enable equ 03h
.code
;
;
; inithgc - Initialize the HGC in graphics mode.
; Code mostly from the Hercules Graphics Card Owner's Manual.
;
inithgc PROC USES DI SI
mov al,enable ; enable mode changes
mov dx,herc_config ; same as HGC FULL command
out dx,al
mov al,grph ; set graphic mode
lea si,gtable ; address of graphic parameters
mov bx,0
mov cx,4000h
call setmd ; call set mode common processing
ret
inithgc ENDP
;
; termhgc - Restore the Hercules Graphics Card to text mode.
; Code mostly from the Hercules Graphics Card Owner's Manual.
;
termhgc PROC USES DI SI
mov al,text ; set text mode
lea si,ttable ; get address of text parameters
mov bx,720h
mov cx,2000
call setmd
ret
termhgc ENDP
;
; setmd - sets mode to graphic or text depending on al
; si = address of parameter table
; cx = number of words to be cleared
; bx = blank value
;
; from Hercules Graphics Card Owner's Manual
;
setmd PROC NEAR
;
push bp
mov bp,sp
push ax
push bx
push cx
; change mode, but without screen on
mov dx,herc_cntrl ; get address of control register
out dx,al ; al has the mode byte
; initialize the 6845
mov ax,ds
mov es,ax ; also point es:si to parameter table
mov dx,herc_index ; get index register address
mov cx,12 ; 12 parameters to be output
xor ah,ah ; starting from register 0
parms: mov al,ah ; first output register number
out dx,al
inc dx ; get data register address
lodsb ; get next byte from param. table
out dx,al ; output parameter data
inc ah ; increment register number
dec dx ; restore index register address
loop parms ; go do another one
; now go clear the buffer
pop cx ; get number of words to clear
mov ax,HGCBase ; get address off video buffer
cld ; set auto increment
mov es,ax ; set segment for string move
xor di,di ; start at offset 0
pop ax ; get blank value
rep stosw ; repeat store string
; turn screen on with page 0 active
mov dx,herc_cntrl ; get control register address
pop ax ; get the mode byte
add al,scrn_on ; set the screen-on bit
out dx,al
mov sp,bp
pop bp
ret
setmd ENDP
;
; writehgc (x, y, c) - write a dot at x, y in color color
; x = x coordinate
; y = y coordinate
; color = color
;
writehgc PROC USES DI SI, x, y, color
cmp y,348 ; Clip for hardware boundaries
jge WtDot030
cmp x,720
jge WtDot030
lea bx,HGCRegen ;set up offset of regen scan line table
mov ax,HGCBase ;segment for regen buffer
mov es,ax
; calculate byte address of dot in regen buffer
mov si,y ;get y coordinate
shl si,1 ;mult by 2 to get offset in Scan Line Table
mov si,[bx][si] ;get address of start of scan line from table
mov ax,x ;get x coordinate
mov cl,3
shr ax,cl ;divide by 8 to get byte offset
add si,ax ;es:si has address of byte with the bit
; build the bit mask for the specific dot in the byte
mov cx,x ;get x coordinate
and cx,0007h ;get bit number within the byte
mov al,80h ;prepare bit mask
shr al,cl ;al has bit mask
; either turn on the bit or turn it off, depending on the color
cmp word ptr color,0 ;turn off bit?
je WtDot020 ;yes -- branch
; turn on the bit
or byte ptr es:[si],al
jmp short WtDot030
WtDot020:
; turn off the bit
xor al,0FFh
and byte ptr es:[si],al
WtDot030:
ret
writehgc ENDP
;
; readhgc (x,y) - read a dot at x,y
; x = x coordinate
; y = y coordinate
;
; dot value is to be returned in AX
;
readhgc PROC USES DI SI, x,y
lea bx,HGCRegen ;set up offset of regen scan line table
mov ax,HGCBase ;segment for regen buffer
mov es,ax
; calculate byte address of dot in regen buffer
mov si,y ;get y coordinate
shl si,1 ;mult by 2 to get offset in Scan Line Table
mov si,[bx][si] ;get address of start of scan line from table
mov ax,x ;get x coordinate
mov cl,3
shr ax,cl ;divide by 8 to get byte offset
add si,ax ;es:si has address of byte with the bit
; build the bit mask for the specific dot in the byte
mov cx,x ;get x coordinate
and cx,0007h ;get bit number within the byte
mov al,80h ;prepare bit mask
shr al,cl ;al has bit mask
; pick up the bit from the regen buffer
test byte ptr es:[si],al
jz readhgc020 ;branch if bit is zero
mov ax,1 ;else return foreground bit value
jmp short readhgc030
readhgc020:
xor ax,ax ;bit is zero
readhgc030:
ret
readhgc ENDP
.data
gtable db 35h,2dh,2eh,07h
db 5bh,02h,57h,57h
db 02h,03h,00h,00h
ttable db 61h,50h,52h,0fh
db 19h,06h,19h,19h
db 02h,0dh,0bh,0ch
;offsets into HGC regen buffer for each scan line
HGCRegen dw 0,8192,16384,24576,90,8282,16474,24666
dw 180,8372,16564,24756,270,8462,16654,24846
dw 360,8552,16744,24936,450,8642,16834,25026
dw 540,8732,16924,25116,630,8822,17014,25206
dw 720,8912,17104,25296,810,9002,17194,25386
dw 900,9092,17284,25476,990,9182,17374,25566
dw 1080,9272,17464,25656,1170,9362,17554,25746
dw 1260,9452,17644,25836,1350,9542,17734,25926
dw 1440,9632,17824,26016,1530,9722,17914,26106
dw 1620,9812,18004,26196,1710,9902,18094,26286
dw 1800,9992,18184,26376,1890,10082,18274,26466
dw 1980,10172,18364,26556,2070,10262,18454,26646
dw 2160,10352,18544,26736,2250,10442,18634,26826
dw 2340,10532,18724,26916,2430,10622,18814,27006
dw 2520,10712,18904,27096,2610,10802,18994,27186
dw 2700,10892,19084,27276,2790,10982,19174,27366
dw 2880,11072,19264,27456,2970,11162,19354,27546
dw 3060,11252,19444,27636,3150,11342,19534,27726
dw 3240,11432,19624,27816,3330,11522,19714,27906
dw 3420,11612,19804,27996,3510,11702,19894,28086
dw 3600,11792,19984,28176,3690,11882,20074,28266
dw 3780,11972,20164,28356,3870,12062,20254,28446
dw 3960,12152,20344,28536,4050,12242,20434,28626
dw 4140,12332,20524,28716,4230,12422,20614,28806
dw 4320,12512,20704,28896,4410,12602,20794,28986
dw 4500,12692,20884,29076,4590,12782,20974,29166
dw 4680,12872,21064,29256,4770,12962,21154,29346
dw 4860,13052,21244,29436,4950,13142,21334,29526
dw 5040,13232,21424,29616,5130,13322,21514,29706
dw 5220,13412,21604,29796,5310,13502,21694,29886
dw 5400,13592,21784,29976,5490,13682,21874,30066
dw 5580,13772,21964,30156,5670,13862,22054,30246
dw 5760,13952,22144,30336,5850,14042,22234,30426
dw 5940,14132,22324,30516,6030,14222,22414,30606
dw 6120,14312,22504,30696,6210,14402,22594,30786
dw 6300,14492,22684,30876,6390,14582,22774,30966
dw 6480,14672,22864,31056,6570,14762,22954,31146
dw 6660,14852,23044,31236,6750,14942,23134,31326
dw 6840,15032,23224,31416,6930,15122,23314,31506
dw 7020,15212,23404,31596,7110,15302,23494,31686
dw 7200,15392,23584,31776,7290,15482,23674,31866
dw 7380,15572,23764,31956,7470,15662,23854,32046
dw 7560,15752,23944,32136,7650,15842,24034,32226
dw 7740,15932,24124,32316
END