2022-08-21 09:07:57 +00:00
|
|
|
;
|
|
|
|
; grafix --- egagrafa.asm
|
|
|
|
;
|
|
|
|
; stuff to plot points fast in 8086 assembler (BLEECH!!!)
|
|
|
|
;
|
|
|
|
; Written 4/87 by Scott Snyder (ssnyder@romeo.caltech.edu or @citromeo.bitnet)
|
|
|
|
;
|
|
|
|
; Modified 5/29/87 by sss to allow for different memory models
|
|
|
|
;
|
|
|
|
|
|
|
|
title egagrafa
|
|
|
|
|
|
|
|
include macros.ah
|
|
|
|
|
|
|
|
sseg
|
|
|
|
endss
|
|
|
|
|
|
|
|
g_linsiz equ 80
|
|
|
|
g_pixbyte equ 8
|
|
|
|
ega_gr_data equ 03cfh
|
|
|
|
|
|
|
|
dseg
|
|
|
|
|
|
|
|
ex g_drawbuf, dword
|
|
|
|
ex g_xor, word
|
|
|
|
ex g_xcliplo, word
|
|
|
|
ex g_xcliphi, word
|
|
|
|
ex g_ycliplo, word
|
|
|
|
ex g_ycliphi, word
|
|
|
|
|
|
|
|
endds
|
|
|
|
|
|
|
|
exProc EGA_point_set
|
|
|
|
exProc EGA_point_res
|
|
|
|
|
|
|
|
cseg _egagrafa
|
|
|
|
|
|
|
|
EGA_plot label byte ; to get accurate profiling data
|
|
|
|
|
|
|
|
; plot a point. ax = y; bl = c; cx = x;
|
|
|
|
|
|
|
|
pBegin plot
|
|
|
|
|
|
|
|
les si, g_drawbuf ; get address of buffer
|
|
|
|
mov dx, g_linsiz ; y * g_linsiz
|
|
|
|
mul dx
|
|
|
|
add si, ax ; add to offset
|
|
|
|
mov ax, cx ; x to AC (ohhh... what symmetry!)
|
|
|
|
mov cx, g_pixbyte ; move it to use it...
|
|
|
|
div cx
|
|
|
|
add si, ax ; add quotient to offset (now complete)
|
|
|
|
mov al, 80h ; make mask
|
|
|
|
mov cx, dx
|
|
|
|
shr ax, cl ; shift it
|
|
|
|
mov dx, ega_gr_data ; shove it out to the mask register
|
|
|
|
out dx, al
|
|
|
|
mov al, es:[si] ; read data into latches
|
|
|
|
mov es:[si], al ; and do a write
|
|
|
|
ret
|
|
|
|
|
|
|
|
pEnd plot
|
|
|
|
|
|
|
|
;
|
|
|
|
; C interface for point plotter
|
|
|
|
;
|
|
|
|
; EGA_point(x, y, c)
|
|
|
|
;
|
|
|
|
|
|
|
|
pBegin EGA_point
|
|
|
|
|
|
|
|
push bp
|
|
|
|
mov bp, sp
|
|
|
|
push si
|
|
|
|
push di
|
|
|
|
|
|
|
|
push [bp+argbase+4] ; call setup routine
|
|
|
|
call EGA_point_set
|
|
|
|
add sp, 2
|
|
|
|
|
|
|
|
mov ax, [bp+argbase+2]
|
|
|
|
mov bx, [bp+argbase+4]
|
|
|
|
mov cx, [bp+argbase]
|
|
|
|
call plot
|
|
|
|
|
|
|
|
call EGA_point_res ; reset EGA
|
|
|
|
|
|
|
|
pop di
|
|
|
|
pop si
|
|
|
|
mov sp, bp
|
|
|
|
pop bp
|
|
|
|
ret
|
|
|
|
|
|
|
|
pEnd EGA_point
|
|
|
|
|
|
|
|
;
|
|
|
|
; write for pixels for circle drawing
|
|
|
|
;
|
|
|
|
; void EGA_write_pix(x1, y1, x2, y2, c)
|
|
|
|
;
|
|
|
|
; can just ignore color here 'cause that's all setup at setup time...
|
|
|
|
;
|
|
|
|
|
|
|
|
pBegin EGA_write_pix
|
|
|
|
|
|
|
|
push bp
|
|
|
|
mov bp, sp
|
|
|
|
push si
|
|
|
|
push di
|
|
|
|
|
|
|
|
mov cx, [bp+argbase] ; cx = x1
|
|
|
|
cmp cx, g_xcliplo ; check for clipping
|
|
|
|
jb w2
|
|
|
|
cmp cx, g_xcliphi
|
|
|
|
ja w2
|
|
|
|
|
|
|
|
mov ax, [bp+argbase+2] ; ax = y1
|
|
|
|
cmp ax, g_ycliplo ; do clipping
|
|
|
|
jb w1
|
|
|
|
cmp ax, g_ycliphi
|
|
|
|
ja w1
|
|
|
|
|
|
|
|
push cx ; plot (x1, y1)
|
|
|
|
call plot
|
|
|
|
pop cx
|
|
|
|
|
|
|
|
w1: mov ax, [bp+argbase+6] ; ax = y2
|
|
|
|
cmp ax, g_ycliplo
|
|
|
|
jb w2
|
|
|
|
cmp ax, g_ycliphi
|
|
|
|
ja w2
|
|
|
|
|
|
|
|
call plot ; plot (x1, y2)
|
|
|
|
|
|
|
|
w2: mov cx, [bp+argbase+4] ; cx = x2
|
|
|
|
cmp cx, g_xcliplo
|
|
|
|
jb w4
|
|
|
|
cmp cx, g_xcliphi
|
|
|
|
ja w4
|
|
|
|
|
|
|
|
mov ax, [bp+argbase+2] ; ax = y1
|
|
|
|
cmp ax, g_ycliplo ; do clipping
|
|
|
|
jb w3
|
|
|
|
cmp ax, g_ycliphi
|
|
|
|
ja w3
|
|
|
|
|
|
|
|
push cx ; plot (x2, y1)
|
|
|
|
call plot
|
|
|
|
pop cx
|
|
|
|
|
|
|
|
w3: mov ax, [bp+argbase+6] ; ax = y2
|
|
|
|
cmp ax, g_ycliplo
|
|
|
|
jb w4
|
|
|
|
cmp ax, g_ycliphi
|
|
|
|
ja w4
|
|
|
|
|
|
|
|
call plot ; plot (x2, y2)
|
|
|
|
|
|
|
|
w4: pop di
|
|
|
|
pop si
|
|
|
|
mov sp, bp
|
|
|
|
pop bp
|
|
|
|
ret
|
|
|
|
|
|
|
|
pEnd EGA_write_pix
|
|
|
|
|
|
|
|
df_ EGA_point
|
|
|
|
df_ EGA_write_pix
|
|
|
|
df_ EGA_plot
|
|
|
|
|
|
|
|
endcs _egagrafa
|
|
|
|
|
|
|
|
end
|