📄 draw.asm
字号:
PAGE 56,132
TITLE DRAW - Draw Statement Support
;***
; DRAW - Draw Statement Support
;
; Copyright <C> 1986, Microsoft Corporation
;
;Purpose:
;
; BASIC Syntax mapping to included runtime entry points:
;
; - DRAW Statement:
;
; DRAW string
; |
; $DRA
;
;******************************************************************************
INCLUDE switch.inc
INCLUDE rmacros.inc ; Runtime Macro Defintions
USESEG _BSS
USESEG _DATA
USESEG CONST
USESEG GR_TEXT
INCLUDE seg.inc ;segment definitions
INCLUDE rtps.inc ; variable types
INCLUDE string.inc
sBegin _BSS
;
;****************************************************************************
; External low-level function vectors
;****************************************************************************
;
externW b$SetAttr
externW b$MapXYC
externW B$GRPACX ;defined in GWDATA.ASM
externW B$GRPACY ;defined in GWDATA.ASM
externD B$GRFACX ;defined in GWDATA.ASM
externD B$GRFACY ;defined in GWDATA.ASM
externB B$DRWFLG ;defined in GWDATA.ASM
externW B$DRWSCL ;defined in GWDATA.ASM
externW B$DRWANG ;defined in GWDATA.ASM
externB b$ScreenMode ; defined in LLCGRP.ASM
externW B$ASPRF ;defined in GWDATA.ASM
externB B$DFRACX ;defined in GWDATA.ASM
externB B$DFRACY ;defined in GWDATA.ASM
externW B$COSA ;defined in GWDATA.ASM
externW B$MSINA ;defined in GWDATA.ASM
externW B$DSINA ;defined in GWDATA.ASM
externB b$Buf3
$BGTNUL EQU b$Buf3
externW B$TILFLG ;defined in GWDATA.ASM
externW B$TIPROG ;defined in GWDATA.ASM
externW B$TILNDX ;defined in GWDATA.ASM
sEnd _BSS
sBegin CONST
externD b$FP_256 ; s.p. constant 256.0
.8087
staticD FP_PI180,0.017453293 ; s.p. PI/180
sEnd CONST
externFP B$COS4
externFP B$SIN4
assumes CS,GR_TEXT
sBegin GR_TEXT
externNP B$GRMODE
externNP B$ftolrnd ; force to integer in AX
externNP B$ERR_FC
externNP B$STCPCT ; Compact string space
externNP B$STGETFRESIZ ; Get available size in string space
externNP B$fmlds
externNP B$fmldw
;low-level routines:
externNP B$PaintInit
externNP B$SCINIT ; Performs screen initialization
externNP B$INVIEW
externNP B$PAINTBEG
externNP B$INTQNOCPCT ; Init paint queue w/o compaction.
SUBTTL GML - Graphics Macro Language Support
externNP B$GTABSC
externNP B$CLINE2
MLCMD MACRO MC,ACTION
DB mc
DW OFFSET action
ENDM
MLARG MACRO MC,ACTION
DB mc+128
DW OFFSET action
ENDM
;EXT.CO FETCHR,VARGET
externNP B$VALSCN
externNP B$DECFET
externNP B$MACLNG
externNP B$MCLXEQ
externNP B$FETCHZ
;***
;B$DRAW - process Draw statement
;
;Purpose:
; Execute macro language substring containing DRAW commands.
;Entry:
; sdDraw == string descriptor
;Exit:
; None.
;Uses:
; Per convention.
;Exceptions:
; Control could be transfered to B$ERR_FC
;****
cProc B$DRAW,<PUBLIC,FAR>,<SI,DI>
parmSD sdDraw
cBegin
CALL B$SCINIT ; initialize screen if not already done
GetpSD BX,sdDraw ; BX = psdDraw
XOR AL,AL ;CLEAR OUT DRAW FLAGS
call B$GRMODE ; are we in a graphics mode?
JNZ OKDRAW ;Brif in Graphics mode
JMP B$ERR_FC ; else error
OKDRAW: ;In graphics mode: OK to draw
; At this point, check if adequate room exists for a potential paint queue
; If not, then compact the string heap now. The compaction cannot be done
; later since it will invalidate the MCL string offsets.
PUSH BX ; Save psd
CALL B$STGETFRESIZ ; Determine the free size
CMP BX,900 ; Is there space for 100 entries?
JAE DRAW_PROCEED ; Brif so - no need to compact
CALL B$STCPCT ; Else compact only the string space
DRAW_PROCEED:
POP BX ; Get back BX (psd)
MOV DX,OFFSET DRWTAB ;DISPATCH TABLE FOR GML
MOV B$DRWFLG,AL ; AL must still be zero!
CALL B$MACLNG ; GO DO IT.
cEnd
DRWTAB:
MLARG "U",DRUP ;UP ;GPS 29-JUN-83 ASM86 doesn't like DUP
MLARG "D",DDOWN ;DOWN
MLARG "L",DLEFT ;LEFT
MLARG "R",DRIGHT ;RIGHT
MLCMD "M",DMOVE ;MOVE
MLARG "E",DRWEEE ;-,-
MLARG "F",DRWFFF ;+,-
MLARG "G",DRWGGG ;+,+
MLARG "H",DRWHHH ;-,+
MLARG "A",DANGLE ;ANGLE COMMAND
MLCMD "T",TANGLE ;360 Degree Angle Command
MLCMD "B",DNOPLT ;MOVE WITHOUT PLOTTING
MLCMD "N",DNOMOV ;DON'T CHANGE CURRENT COORDS
MLCMD "X",B$MCLXEQ ;EXECUTE STRING
MLARG "C",DCOLR ;COLOR
MLARG "S",DSCALE ;SCALE
MLCMD "P",DPAINT ;PAINT fc,bc
DB 00 ;END OF TABLE
subttl DRAW subcommands
page
;***
; The following series of entry points handle integer arguments
; to draw subcommands. These entry points are the ones contained
; in the draw subcommand dispatch table and are entered by a jump
; from the macro language processor (mclprc.asm). However, if a
; "V1" draw subcommand is in effect (indicated by b$fTrans being
; TRUE), then the draw subcommand arguments are interpreted as
; floating point rather than integer arguments. Floating point
; arguments are handled by the corresponding routines with an "F"
; prefix in the name (see above). The two cases (integer or
; floating point arguments) are distinguished before the dispatch
; as follows: mclprc.asm executes "cmp b$fTrans, TRUE" just prior
; the the dispatch. Thus psw.z will be set iff floating point
; arguments are being used. Therefore each entry point for integer
; args branches to the corresponding routine for floating point
; args iff psw.z is set. The psw is also stored in ah after the
; "cmp b$fTrans,TRUE" and before the dispatch.
;****
;***
;DRUP
;Purpose:
; Move up using integer args.
;Input:
; ah = psw
; psw.z set if args are f.p.
; psw.z clear if args are integer
;Outputs:
; move up specified amount
;****
DRUP:
NEG DX ;MOVE +0,-Y
;***
;DDOWN
;Purpose:
; Move down using integer args.
;Input:
; ah = psw
; psw.z set if args are f.p.
; psw.z clear if args are integer
;Outputs:
; move down specified amount
;****
DDOWN: ;MOVE +0,+Y
MOV CX,0 ;DX=0
JMP SHORT DOMOVR ; TREAT AS RELATIVE MOVE
;***
;DLEFT
;Purpose:
; Move left using integer args.
;Input:
; ah = psw
; psw.z set if args are f.p.
; psw.z clear if args are integer
;Outputs:
; move left specified amount
;****
DLEFT:
NEG DX ;MOVE -X,+0
;***
;DRIGHT
;Purpose:
; Move right using integer args.
;Input:
; ah = psw
; psw.z set if args are f.p.
; psw.z clear if args are integer
;Outputs:
; move right specified amount
;****
DRIGHT: ;MOVE +X,+0
MOV CX,DX ;[CX]=VALUE
MOV DX,0 ;DY=0
JMP SHORT DOMOVR ; TREAT AS RELATIVE MOVE
;***
;DRWHHH
;Purpose:
; Move up and left using integer args.
;Input:
; ah = psw
; psw.z set if args are f.p.
; psw.z clear if args are integer
;Outputs:
; move up and left specified amount
;****
DRWHHH:
NEG DX ;MOVE -X,-Y
;***
;DRWFFF
;Purpose:
; Move down and right using integer args.
;Input:
; ah = psw
; psw.z set if args are f.p.
; psw.z clear if args are integer
;Outputs:
; move down and right specified amount
;****
DRWFFF:
MOV CX,DX ;MOVE +X,+Y
JMP SHORT DOMOVR ; TREAT AS RELATIVE MOVE
;***
;DRWEEE
;Purpose:
; Move up and right using integer args.
;Input:
; ah = psw
; psw.z set if args are f.p.
; psw.z clear if args are integer
;Outputs:
; move up and right specified amount
;****
DRWEEE:
DRWHHC: ; continuation of DRWGGG
MOV CX,DX ;MOVE +X,-Y
NEG DX
JMP SHORT DOMOVR ; TREAT AS RELATIVE MOVE
;***
;DRWGGG
;Purpose:
; Move down and left using integer args.
;Input:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -