M EQU Byte Ptr 0[BX]
TITLE 'SET ATTRIBUTE FUNCTIONS'
DGROUP GROUP DATA
;----------------------------------------------------------------------------*
; Revision : Nov. 08, 1983 File : "DOCOATTR.A86" Version 1.0 *
; *
;***** MODE NOTES : *********************************************************
; Modified from DOATTRMX for Color Support *
; Process Color 0 objects normally *
;***** MODE NOTES : *********************************************************
dseg
EXTRN NDLNSZ:byte, NDTXSZ:byte, NDMKSZ:byte, NDTXRT:byte
EXTRN WKID:byte, NDLNTY:byte, NDLNCO:byte, NDMKTY:byte
EXTRN NDMKCO:byte, NDTXTY:byte, NDTXCO:byte
EXTRN NDINTY:byte, NDFITY:byte, NDFICO:byte
EXTRN LSTYLE:word, CHRSZ:byte, CHRHT:byte, ndrite:byte
extrn dline:byte, dfill:byte, dtext:byte, dmark:byte, dcell:byte
extrn nopflg:byte, ritflg:byte, bitmask:byte, rflg:byte
extrn bmask:byte
extrn rflgl:byte, rflgt:byte, rflgm:byte, rflgf:byte
extrn bmaskt:byte, bmaskf:byte, bmaskl:byte, bmaskm:byte
cseg
PUBLIC SELNTY, SELNSZ, SELNCO, SEMKTY, SEMKSZ, SEMKCO
PUBLIC SETXSZ, SETXRT, SETXTY, SETXCO
PUBLIC SEFITY, SEFINX, SEFICO, serite
EXTRN GETBYT:near, GETNXT:near
;----------------------------------------------------------------------------+
; Set Char Height Opcode = 12 +
;----------------------------------------------------------------------------+
SETXSZ:
; Get Character size Indicator (1-16) from OBJLST
CALL GETNXT ;Returns NDTXSZ in
MOV Byte Ptr NDTXSZ,AL
MOV CH,AL
RCL AL,1
RCL AL,1
RCL AL,1
MOV Byte Ptr CHRHT,AL ;Character height : NDTXSZ * 8
SUB AL,CH
SUB AL,CH ;Character width : NDTXSZ * 6
MOV Byte Ptr CHRSZ,AL
RET
;----------------------------------------------------------------------------+
; Set Char Up Vector Opcode = 13 +
;----------------------------------------------------------------------------+
SETXRT:
; Get Character rotation indicator (0-3) from OBJLST
CALL GETNXT ;Returns NDTXRT in
MOV Byte Ptr NDTXRT,AL
RET
;----------------------------------------------------------------------------+
; Set Color Rep Opcode = 14
;----------------------------------------------------------------------------+
;*** NOACT RET
;----------------------------------------------------------------------------+
; Set Polyline Type Opcode = 15
;----------------------------------------------------------------------------+
SELNTY:
; Get Line style bit pattern No. from OBJLST
CALL GETNXT
MOV Byte Ptr NDLNTY,AL ;Current Device Line Style requested
; Set up requested Line Style Pattern in LSTYLE
SELN01:
MOV BX,(Offset LNTBL)
MOV DL,AL
MOV DH,0
; LAHF
ADD BX,DX
; SAHF
; LAHF
ADD BX,DX
; RCR SI,1
; SAHF
; RCL SI,1
MOV DL,M
; LAHF
INC BX
; SAHF
MOV DH,M
MOV Word Ptr LSTYLE,DX
RET
;----------------------------------------------------------------------------+
; Set Polyline Width Opcode = 16
;----------------------------------------------------------------------------+
SELNSZ:
; Get Line Size Indicator from Objlst
;*** CALL GETNXT
;*** STA NDLNSZ
RET
;----------------------------------------------------------------------------+
; Set Polyline Color Opcode = 17
;----------------------------------------------------------------------------+
SELNCO:
; Get the Color Index from OBJLST
CALL GETNXT
MOV Byte Ptr NDLNCO,AL
; cmp al, 0 ; check color, if color = 0, the object can only
; jne sel1 ; be drawn in replace mode
; mov rflgl, 1 ; the logical write operation is 'AND'
; mov bmaskl, 11111110b ; new bit = old bit AND 0
; jmp sel9
; if color = 1, then use the logical write flag and bit mask
; already set by the last set writing mode function
sel1: mov al, rflg
mov rflgl, al
mov al, bmask
mov bmaskl, al
sel9: ret
;----------------------------------------------------------------------------+
; Set Polymarker Typ Opcode = 18
;----------------------------------------------------------------------------+
SEMKTY:
; Get ASCII MAKER SYMBOL from OBJLST
CALL GETNXT
MOV Byte Ptr NDMKTY,AL
RET
;----------------------------------------------------------------------------+
; Set Polymarker Scl Opcode = 19
;----------------------------------------------------------------------------+
SEMKSZ:
; Get Maker Size factor from OBJLST
CALL GETNXT
MOV Byte Ptr NDMKSZ,AL
RET
;----------------------------------------------------------------------------+
; Set Polymarker Clr Opcode = 20
;----------------------------------------------------------------------------+
SEMKCO:
CALL GETNXT
MOV Byte Ptr NDMKCO,AL
; cmp al, 0 ; check color, if color = 0, the object can only
; jne sem1 ; be drawn in replace mode
; mov rflgm, 1 ; the logical write operation is 'AND'
; mov bmaskm, 11111110b ; new bit = old bit AND 0
; jmp sem9
; if color = 1, then use the logical write flag and bit mask
; already set by the last set writing mode function
sem1: mov al, rflg
mov rflgm, al
mov al, bmask
mov bmaskm, al
sem9: RET
;----------------------------------------------------------------------------+
; Set Text Font Opcode = 21
;----------------------------------------------------------------------------+
SETXTY:
;*** CALL GETNXT
;*** STA NDTXTP
RET
;----------------------------------------------------------------------------+
; Set Text Color Opcode = 22
;----------------------------------------------------------------------------+
SETXCO:
CALL GETNXT
MOV Byte Ptr NDTXCO,AL
; cmp al, 0 ; check color, if color = 0, the object can only
; jne set1 ; be drawn in replace mode
; mov rflgt, 1 ; the logical write operation is 'AND'
; mov bmaskt, 11111110b ; new bit = old bit AND 0
; jmp set9
; if color = 1, then use the logical write flag and bit mask
; already set by the last set writing mode function
set1: mov al, rflg
mov rflgt, al
mov al, bmask
mov bmaskt, al
set9: RET
;----------------------------------------------------------------------------+
; Set Fill Int Style Opcode = 23
;----------------------------------------------------------------------------+
SEFITY:
CALL GETNXT
MOV Byte Ptr NDFITY,AL
RET
;----------------------------------------------------------------------------+
; Set Fill Sty Index Opcode = 24
;----------------------------------------------------------------------------+
SEFINX:
CALL GETNXT
MOV Byte Ptr NDINTY,AL
RET
;----------------------------------------------------------------------------+
; Set Fill Color Opcode = 25
;----------------------------------------------------------------------------+
SEFICO:
CALL GETNXT
MOV Byte Ptr NDFICO,AL
; cmp al, 0 ; check color, if color = 0, the object can only
;; jne sef1 ; be drawn in replace mode
; mov rflgf, 1 ; the logical write operation is 'AND'
; mov bmaskf, 11111110b ; new bit = old bit AND 0
; jmp sef9
; if color = 1, then use the logical write flag and bit mask
; already set by the last set writing mode function
sef1: mov al, rflg
mov rflgf, al
mov al, bmask
mov bmaskf, al
sef9: RET
;----------------------------------------------------------------------------+
; Inq Color Rep Opcode = 26
;----------------------------------------------------------------------------+
;----------------------------------------------------------------------------+
; Inq Cell Array Opcode = 27
;----------------------------------------------------------------------------+
;----------------------------------------------------------------------------+
; Input Locator Opcode = 28 +
;----------------------------------------------------------------------------+
;----------------------------------------------------------------------------+
; Input Valuator Opcode = 29
;----------------------------------------------------------------------------+
;----------------------------------------------------------------------------+
; Input Choice Opcode = 30
;----------------------------------------------------------------------------+
;----------------------------------------------------------------------------+
; Input String Opcode = 31
;----------------------------------------------------------------------------+
;----------------------------------------------------------------------------+
; Set Writing Mode Opcode = 32
;----------------------------------------------------------------------------+
serite:
call getnxt ; get the writing mode
mov ndrite, al
cmp al, 0 ; check the writing mode
jne ser0
mov nopflg, al ; for replace mode, nopflg = 0
jmp ser1 ; use the same writing flag as set mode
ser0: mov nopflg, 1 ; for set/xor/clear mode, nopflg = 1
cmp al, 2
je ser2
ja ser3
ser1: ; for set mode and replace with color 1, rflg = 0 (OR)
mov bmask, 00000001b
mov rflg, 0 ; new bit = old bit OR 1
jmp ser99
ser2: ; for xor mode, rflg = -1 (XOR)
mov bmask, 00000001b
mov rflg, -1 ; new bit = old bit XOR 1
jmp ser99
ser3: ; for clear mode and replace with color 0, rflg = 1 (AND)
mov bmask, 11111110b
mov rflg, 1 ; new bit = old bit AND 0
ser99: ; Set logical op flags for line, marker, text, and fill
; each may be changed by a set color command later
mov al, bmask
mov bitmask, al ; Common mask
mov bmaskl, al ; line mask
mov bmaskm, al ; marker
mov bmaskt, al ; text
mov bmaskf, al ; fill
mov al, rflg
mov ritflg, al ; common flag
mov rflgl, al ; line
mov rflgm, al ; Marker
mov rflgt, al ; text
mov rflgf, al ; fill
ret
;----------------------------------------------------------------------------+
; Set Input Mode Opcode = 33
;----------------------------------------------------------------------------+
RET
DSEG
; 0 - SOLID, 1 - DASHED, 2 - DOTTE, 3 - DASHED-DOTTED, 4 - LONG DASH
; Bit patterns : 1-short dash = F0F0, 4-long dash = FF00,
; 2-dotted = 8888, 3-dash dotted = FC30,
; 5-dash dot dot = F088
LNTBL RS 0
DW 0FFFFH ;SOLID
DW 0F0F0H ;SHORT DASH
DW 8888H ;DOTTED
DW 0FC30H ;DASH DOTTED
DW 1111111111100000B ;LONG DASH
DW 0F088H ;DASH DOT DOT
CSEG
END