⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 draw.asm

📁 [随书类]Dos6.0源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	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 + -