home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols200
/
vol259
/
gsx03.lbr
/
BWMMSKMS.AQ6
/
BWMMSKMS.A86
Wrap
Text File
|
1986-03-22
|
19KB
|
784 lines
;**************************************************************************
;* DEVICE SPECIFIC ROUTINES *
;* *
;* These routines and equates are device dependant. *
;* *
;* *
;* *
;**************************************************************************
;Hist
;Name Date Modification
;DH 9/29/83 Added background color
;DH 9/29/83 Added choice possibility for character returned
;SR 11/1/83 uses rom calls to init screens
;DH 11/9/83 Added microsoft mouse option
;DH 12/28/83 removed microsoft mouse option(included in mouse.a86)
dseg
copyright db 'GSX-86 V1.3 28 Dec 83'
db 'IBM monochrome screen driver'
db 'Serial No. XXXX-0000-654321 '
db 'Digital Research, Inc. '
cseg
;
public clearmem
public check_escape
public escfn0,escfn1,escfn2,escfn3
public escfn4,escfn5,escfn6,escfn7
public escfn8,escfn9,escf10,escf11
public escf12,escf13,escf14,escf15
public escf16,escf17,escf18,escf19
public concat
public valuator,choice,get_char
public plyfill_rot
public abline,draw_char
public next_address
public enable_cross,move_cross,clip_cross,get_loc_key
public device_table , size_table
public gcurx,gcury
public y1,y2,x1,x2
public lstlin
public arstl2
;
extrn entry:near ;the place to jump to if this module
;is linked in first
;
;integer array indexing equates
W_1 equ word ptr 0
W_2 equ word ptr 2
W_3 equ word ptr 4
W_4 equ word ptr 6
W_5 equ word ptr 8
W_6 equ word ptr 10
W_7 equ word ptr 12
W_8 equ word ptr 14
W_9 equ word ptr 16
W_10 equ word ptr 18
;
false equ 0
true equ not false
val_inc_big equ 10 ;maximum valuator increment
val_inc_small equ 1 ;minimum valuator increment
EJECT
;****************************************************************
; screen coordinate equates *
; these must be changed to the values for specific machines *
;****************************************************************
;
xresmx equ 639 ;X - Maximum resolution.
yresmx equ 199 ;Y - Maximum resolution.
xsize equ 169 ;size of pixel in microns
ysize equ 400 ;
graph_plane equ 0b800h ;start of graphics segment
plane_size equ 04000h ;size of graphics memory
msb_first equ true ;set if msb is first out
byte_swap equ false ;are bytes swapped
multiseg equ true
num_segs equ 2 ;number of graphics segments
bytes_line equ 80 ;used to compute addresses
chars_line equ 80 ;number of characters per line
lines_page equ 25 ;lines per alpha screen
last_dri_escape equ 19 ;last dri defined escape
mouse equ true ;mouse driver to be included
;
;****************************************************************
; device dependant equates *
; these may or may not be necessary depending on hardware *
;****************************************************************
;
if multiseg
next_line equ plane_size / num_segs ;offset to get to next segment
else
next_line equ bytes_line
endif
neg_next_line equ 0-next_line
move_to_first equ 0-plane_size+bytes_line
move_to_last equ plane_size-bytes_line ;from before first to last
curwtx equ 16 ;1/2 width of cross hair
curwty equ 8 ;1/2 height of cross hair
cur_mot_max_x equ 16 ;how far cursor moves fast in x
cur_mot_max_y equ 8 ;how far cursor moves fast in y
cur_mot_min_x equ 1 ;how far cursor moves slow in x
cur_mot_min_y equ 1 ;how far cursor moves slow in y
;
;****************************************************************
; IBM STANDARD ROM BIOS CALLS *
;****************************************************************
SCREEN equ 10H ;interrupts to use for rom routine I/O
KEYBD equ 16H
rev_vid_on equ 70h ;turn on reverse video bits
rev_vid_off equ 07h ;turn off reverse video bits
;
read_cur_pos equ 3 ;bios rom calls for char I/O
set_cur_pos equ 2
read_char equ 8
write_char equ 9
set_palette equ 0bh
get_character equ 0 ;keyboard read
;
EJECT
;
jmp entry ;if we come in from here, go to real entry
;
;****************************************
;* clearmem *
;* clears graphics memory *
;* uses ax,cx,di *
;* stores zeros in graphics plane *
;****************************************
clearmem:
mov ax,graph_plane ; ld in graphics memory address
mov es,ax
mov cx,plane_size/2 ;number of bytes to zero
mov al,bakcol
mov ah,al
mov di,0
rep stosw ; store plane_size zeros in graphmem
ret
;
;************************************************************************
;* escape functions *
;* handle character I/O , alpha and graphics cursor *
;* *
;* ENTRY *
;* contrl points to segment and offset of contrl *
;* intin points to segment and offset of intin *
;* ptsin points to segment and offset of ptsin *
;* intout points to segment and offset of intout *
;* ptsout points to segment and offset of ptsout *
;* *
;* *
;************************************************************************
;
;****************************************
;check_escape *
; checks escape function called *
; against last_escape *
;****************************************
check_escape:
cmp bx,last_dri_escape
jbe its_ok
xor bx,bx ;do a nop if its not valid
its_ok:
ret
;
;****************************************
;escape func 0
; Nop
;****************************************
escfn0:
ret
;
;****************************************
;escape func 1
; Inquire Addressable Character Cells
;****************************************
escfn1:
les di,intout
mov es:W_1[di], lines_page ; number of addressable rows.
mov es:W_2[di], chars_line ; number of addressable columns.
ret
;****************************************
;escape func 2
; Enter Graphics Mode
;****************************************
escfn2: ;
call escfn8 ; home alpha cursor.
call escfn9 ; clear alpha display.
push ds
mov ax,0
mov ds,ax
mov bx,410h
mov al,[bx] ;get current screen adapter
mov mode_save,al ;save it
and al,0cfh
or al,10h
mov [bx],al ;select color card
mov ah,0
mov al,6 ;hi-res graphics
int screen
pop ds
call clearmem ; clear graphics display
; mov si,offset crt_init_table_g
; call crt_init
if mouse
mov bl,1
call mouse_function ;initialize the mouse
endif
ret
;
;****************************************
;escape func 3
; Exit Graphics Mode
;****************************************
escfn3: ;
mov ax,graph_plane ; ld in graphics memory address
mov es,ax
mov cx,plane_size/2 ;number of bytes to zero
xor ax,ax
mov di,0
rep stosw ; store plane_size zeros in graphmem
; mov si,offset crt_init_table_a
; call crt_init
push ds
mov ax,0
mov ds,ax
mov bx,410h
mov al,mode_save ;get screen adapter
mov [bx],al ;select default card
mov ah,0
mov al,3 ;alpha mode
int screen
pop ds
mov attribute,rev_vid_off
call escfn8 ;home
call escfn9 ;clear to end of screen
if mouse
mov bl,2
call mouse_function
endif
ret
;
;*****************************************************************
;crt_init
; initializes the display controller with data from table
;*****************************************************************
crt_init:
mov dx,03d4h ;select port
mov bl,0 ;select register
mov cl,length crt_init_table_a
crt_init_loop:
mov al,bl
out dx,al
inc bx
inc dx
lodsb
out dx,al
dec dx
loop crt_init_loop
inc dx
inc dx
inc dx
inc dx
lodsb
out dx,al
inc dx
lodsb
out dx,al
ret
;
;****************************************
;escape func 4
; Cursor Up
;****************************************
escfn4:
mov ah,read_cur_pos
int screen
cmp dh,0 ;is cursor at top of screen
jz escfn4done ;if so, then done
dec dh
mov ah,set_cur_pos
int screen
escfn4done:
ret
;
;****************************************
;escape func 5
; Cursor Down
;****************************************
escfn5:
mov ah,read_cur_pos
int screen
cmp dh,lines_page ;is cursor at bottom of screen?
jz escfn5done ;if so, done
inc dh
mov ah,set_cur_pos
int screen
escfn5done:
ret
;
;****************************************
;escape func 6
; Cursor Right
;****************************************
escfn6:
mov ah,read_cur_pos
int screen
cmp dl,chars_line ;is cursor at edge of screen?
jz escfn6done ;if so, done
inc dl
mov ah,set_cur_pos
int screen
escfn6done:
ret
;
;****************************************
;escape func 7
; Cursor Left
;****************************************
escfn7:
mov ah,read_cur_pos
int screen
cmp dl,0 ;is cursor at edge of screen?
jz escfn7done ;if so, done
dec dl
mov ah,set_cur_pos
int screen
escfn7done:
ret
;
;****************************************
;escape func 8
; Home Cursor
;****************************************
escfn8:
mov dx,0
mov ah,set_cur_pos
int screen ; move cursor home
ret
;
;****************************************
;escape func 9
; Erase to end of screen
;****************************************
escfn9:
mov ah,read_cur_pos ;get current cursor position
int screen
push dx ;save it
xor cx,cx
mov cl,dl ;compute number of spaces to write
neg cl
add cl,bytes_line ;wrap cl around bytes_line
xor ax,ax
mov al,dh ;add bytes_line * number of columns
neg al
add al,lines_page
dec al ;don't count the line we're on
mov bl,bytes_line
mul bl ;bl=number of lines * bytes_line
add cx,ax
dec cx ;that last spot causes scroll
mov bx,rev_vid_off ;page zero and reverse off
mov ah,write_char
mov al,20h
int screen ;write cx spaces out
pop dx ;get original cursor position
mov ah,set_cur_pos
int screen ;restore cursor position
ret
;
;****************************************
;escape func 10
; Erase to end of line
;****************************************
escf10:
mov ah,read_cur_pos ;get current cursor position
int screen
push dx ;save it
xor cx,cx
mov cl,dl ;compute number of spaces to write
neg cl
add cl,bytes_line
mov bx,rev_vid_off ;page zero and everything to black
mov al,20h
mov ah,write_char
int screen ;write cx spaces out
pop dx
mov ah,set_cur_pos
int screen ;restore cursor position
ret
;
;****************************************
;escape func 11
; Move Cursor to x,y
;****************************************
escf11:
les di,intin
mov ax, es:[di] ; get the row number (1-24)
mov dh,al
dec dh ; make zero relative
mov ax, es: W_2[di] ; get the column number (1-80)
mov dl,al
dec dl ; zero relative
mov ah,set_cur_pos
mov bx,0 ;page zero
int screen
ret
;
;****************************************
;escape func 12
; Output text
;****************************************
escf12:
les di,contrl
mov cx, es: W_4[di] ; get string length.
and cx, cx ; test if 0 count
jz esc12_done
les di,intin
esc120:
mov al, es:[di] ; load character to be output.
push es
push di
push cx
mov cx,1
xor bx,bx
mov bl,attribute
mov ah,write_char
int screen
call escfn6
pop cx
pop di
pop es
inc di
inc di
loop esc120
esc12_done:
ret
;****************************************
;escape func 13
; Reverse video on
;****************************************
escf13:
mov attribute,rev_vid_on
ret
;
;****************************************
;escape func 14
; Reverse video off
;****************************************
escf14:
mov attribute,rev_vid_off
ret
;
;****************************************
;escape func 15
; Return Current Cursor Address
;****************************************
escf15:
les di,intout
mov ah,read_cur_pos
int screen
xor ax,ax ;zero high byte
mov al,dh
inc al ;make one relative
mov es:[di],ax ;return row address
mov al,dl
inc al
mov es:W_2[di],ax ;return column address
ret
;
;****************************************
;escape func 16
; Return Tablet Status
;****************************************
escf16:
les di,intout
if mouse
mov es:W_1[di],1 ;if mouse then return 1
else
mov es:W_1[di], 0 ;else return a 0
endif
ret
;
;****************************************
;escape func 17 NOT SUPPORTED
; Hard Copy
;****************************************
escf17:
ret
;
;****************************************
;escape func 18
; Place graphic cross-hair cursor at x,y
;****************************************
escf18:
les di,ptsin
mov ax,es:[di]
mov gcurx,ax
mov ax,es:W_2[di]
mov gcury,ax
call enable_cross
ret ; locator is called before esc19.
;****************************************
;escape func 19
; Remove cursor /Marker
;****************************************
escf19:
call enable_cross
esc19d: ret
EJECT
;****************************************************************
;CONCAT *
; ENTRY Reg. BX - X-coordinate (dev. coord.) *
; Reg. AX - Y-coordinate (dev. coord.) *
; *
; EXIT Reg. DI - Physical address *
; Reg. BL - Byte index *
; *
; Reg. Used. AX, BX, CX, DX, DI *
; *
;****************************************************************
concat:
and bx, 03ffh ;mask off 10 lsb for x-coord.
mov cx, yresmx ;normalize y-coordinate
sub cx, ax
mov ax, cx
shr ax,1
mov dh,cl
mov dl, bl ;save low order byte of x-coord
and dl, 07h ;mask off data bit index.
mov cl, 3 ;set count to 3
shr bx, cl ;shift out 3 lsb of x-coord.
mov cl,bytes_line
mul cl ;brute force calculation
;use shift and add if possible
add ax, bx ;concatenate y and x coordinates in AX
and dh,1
jz concat1
add ax,next_line ;if odd address, then start at next_line
concat1:mov di, ax ;di = memory address
xor dh, dh
mov bx, dx ;bx = bit index into data byte
ret
EJECT
;
;************************************************************************
;*get_loc_key *
;* Get Locator key *
;* Entry none *
;* Exit *
;* al=0 nothing happened *
;* *
;* al=1 button press *
;* ah = character information *
;* *
;* al=2 coordinate information *
;* bx = delta x *
;* cx = delta y *
;* *
;* *
;************************************************************************
get_loc_key:
if mouse
mov bl,3
call mouse_function
and al,al
jz get_loc_mouse
ret
get_loc_mouse:
endif
mov ah,1
int KEYBD ;see if ros has character
jz get_loc_key_none
xor ah,ah
int KEYBD
mov si,offset loc_tbl
mov cx,10 ;search table for locator key
loc_key_search:
cmp ax,[si]
jz found_loc_key
add si,6
loop loc_key_search
mov ah,al
mov al,1 ;not a locator key so return status
ret
found_loc_key:
add si,2
mov bx,[si] ;get delta x value
add si,2
mov cx,[si]
mov al,2
ret
get_loc_key_none:
xor al,al
ret
include mouse.a86
EJECT
;************************************************************************
;*valuator *
;* Get valuator increment *
;* Exit *
;* al=0 nothing happened *
;* *
;* al=1 button press *
;* ah = character information *
;* *
;* al=2 coordinate information *
;* bx = delta value *
;* *
;************************************************************************
valuator:
mov ah,1
int KEYBD ;see if ros has character
jz get_val_none
xor ah,ah
int KEYBD
mov si,offset val_tbl
mov cx,4 ;search table for locator key
val_key_search:
cmp ax,[si]
jz found_val_key
add si,4
loop val_key_search
mov ah,al
mov al,1 ;not a locator key so return status
ret
found_val_key:
add si,2
mov bx,[si] ;get delta x value
mov al,2
ret
get_val_none:
xor ax,ax
ret
EJECT
;
;************************************************************************
;* Get choice for choice input *
;* Entry none *
;* *
;* Exit *
;* al=0 nothing happened *
;* *
;* al=1 choice value *
;* bx = choice number 1 to max choice keys *
;* *
;* al=2 button press *
;* ah = character *
;* *
;************************************************************************
choice:
mov ah,1
int KEYBD ; see if ros has character
jz choice_none
xor ah,ah
int KEYBD
mov bl,ah ; swap byte choice runs from 3b00-4400
mov bh,al
sub bx,3bh
jc choice_key ; make it zero based if <0 then reject
cmp bx,10 ; test if too large
jnc choice_none
inc bx ; make 1-10
mov al,1 ; bx = choice number
xor ah,ah
ret
choice_key:
mov ah,al
mov al,2
ret
choice_none:
xor al,al
ret
EJECT
;
;************************************************************************
;*get_char *
;* Get character for string input *
;* Entry none *
;* *
;* Exit *
;* al=0 nothing happened *
;* *
;* al=1 button press *
;* bx = character information *
;* *
;************************************************************************
get_char:
mov ah,1
int KEYBD ; see if ros has character
jz get_char_none
xor ah,ah
int KEYBD
mov bl,al
xor bh,bh
mov al,1 ; return character in bx status in al
ret
get_char_none:
xor al,al
ret
EJECT
;
include monommre.a86
dseg
;***************************************************************************
;* *
;* Data Area *
;* contains data for escape functions *
;* and the values returned on open_workstation *
;* *
;* *
;* *
;***************************************************************************
;
extrn txtclx:word ;text color index
extrn txtcol:byte ;text writing mode
extrn wrmode:word ;writing mode
extrn plncol:byte ;polygon color index
extrn bakcol:byte ;back ground color
extrn style:word ;line style
extrn contrl:dword
extrn intin:dword
extrn ptsin:dword
extrn intout:dword
extrn ptsout:dword
;
mode_save db 0 ;save switch setting for default card
;
crt_init_table_g db 38h,28h,2bh,0ah,7fh,6h,64h,70h,2,1,0,0bh,0,0,0,0
db 1eh,3fh
;
crt_init_table_a db 71h,50h,5ah,0ah,1fh,6h,19h,1ch,2,7,6,7,0,0,0,0
db 29h,30h
;
attribute db 07h ;text attributes
;
;loc_tbl
; table of words for locator keys
; format
; word = key code
; word = delta x
; word = delta y
loc_tbl dw 4d00h ;right arrow un shifted
dw cur_mot_max_x
dw 0
dw 4d36h ;right arrow shifted
dw cur_mot_min_x
dw 0
dw 4b00h ;left arrow unshifted
dw 0-cur_mot_max_x
dw 0
dw 4b34h ;left arrow shifted
dw 0-cur_mot_min_x
dw 0
dw 4800h ;up arrow unshifted
dw 0
dw cur_mot_max_y
dw 4838H ;up arrow shifted
dw 0
dw cur_mot_min_y
dw 5000h ;down arrow unshifted
dw 0
dw 0-cur_mot_max_y
dw 5032h ;down arrow shifted
dw 0
dw 0-cur_mot_min_y
dw 4700h ;home un shifted
dw 0-xresmx
dw 0-yresmx
dw 4737h ;home shifted
dw 0-xresmx
dw 0-yresmx
;
;val_tbl
; decoding of valuator input
;
val_tbl dw 4800h ;up arrow unshifted
dw val_inc_big
dw 4838H ;up arrow shifted
dw val_inc_small
dw 5000h ;down arrow unshifted
dw 0-val_inc_big
dw 5032h ;down arrow shifted
dw 0-val_inc_small
;