www.pudn.com > Demo_asm_80x86.rar > CrtDemo.asm


;****************************************************** 
;* 文件名:CrtDemo.asm 
;* 创建日期:2001.7.16 
;* 作者:陈文尧 
;* 功能:测试未来汇编CRT库函数 
;* 备注:1.本程序是由Turbo Pascal的一个例子改编而来 
;*      2.未来汇编CRT库函数只使用于80*25 16色(模式3) 
;****************************************************** 
include system.inc 
 
;****************************************************** 
;* 以下代码由汇编专家产生,不要随便修改 
;****************************************************** 
.CODE 
	ifdef __COM__ 
		org	100h 
	endif 
@@Start: 
;------------------------------------------------------ 
; 初始化数据段 
;------------------------------------------------------ 
	InitDS	cs 
;------------------------------------------------------ 
; 调用主函数 
;------------------------------------------------------ 
	call	main 
;------------------------------------------------------ 
; 正常返回DOS 
;------------------------------------------------------ 
	ReturnDos 
 
;++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
;+ 主函数,加入实现程序功能的代码 
;++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
main	proc 
	call		Initialize 
	call		MakeWindow 
@Continue: 
	LibCall	Getch 
	;Function keys 
	cmp		al,00h 
	jz		@FunKey 
	cmp		al,CTRL_C 
	jz		@End 
	cmp		al,KEY_ENTER 
	jz		@Crlf 
	cmp		al,KEY_ESC 
	jz		@End 
	; 
      ;本函数与PutChar对应:前者对于窗口;后者对于整个屏幕 
      ; 
	LibCall	Putch,ax 
	jmp		@Continue 
@FunKey: 
      LibCall	Getch 
      cmp		al,ALT_W 
      jz		@MakeWindow 
      cmp		al,ALT_R 
      jz		@RandomText 
      cmp		al,ALT_X 
      jz		@End 
      cmp		al,KEY_UP 
      jz		@Up 
      cmp		al,KEY_LEFT 
      jz		@Left 
      cmp		al,KEY_RIGHT 
      jz		@Right 
      cmp		al,KEY_DOWN 
      jz		@Down 
      cmp		al,KEY_INS 
      jz		@Ins 
      cmp		al,KEY_DEL 
      jz		@Del 
      jmp		@Continue      ;Others,then skip 
@MakeWindow: 
	call		MakeWindow 
	jmp		@Continue 
@RandomText: 
	call		RandomText 
	jmp		@Continue 
@Up: 
	; 
	;__WhereXY是内部函数(由WhereX、WhereY等调用),但效率比WhereX和WhereY高 
	;__WhereXY返回值:行在ah或dh,列在al或dl 
	;这不符合未来汇编库函数规则(规则见Arith.asm),故作为内部函数 
	; 
	LibCall	__WhereXY 
	dec		ah 
	jmp		short @GotoXY 
@Left: 
	LibCall	__WhereXY 
	dec		dx 
	jmp		short @GotoXY 
@Right: 
	LibCall	__WhereXY 
	inc		dx 
	jmp		short @GotoXY 
@Down: 
	LibCall	__WhereXY  
	inc		ah 
@GotoXY: 
	shr		ax,08h 
	LibCall	GotoXY,dx,ax 
	jmp		@Continue 
@Ins: 
	LibCall	InsLine 
	jmp		@Continue 
@Crlf: 
	; 
      ;本函数与Crlf对应 
      ; 
	LibCall	PutLn 
	jmp		@Continue 
@Del: 
      LibCall	DelLine 
      jmp		@Continue 
@End: 
      LibCall	Cls 
      ; 
	ret 
main	endp 
 
Initialize proc near 
           LibCall		Cls 
           LibCall		GotoXY,00,24d 
           LibCall		TextBackground,CR_BLACK 
           LibCall		TextColor,CR_WHITE 
           DisplayMessage	Prompt 
           LibCall		Randomize 
           ret 
Initialize endp 
 
MakeWindow proc near 
           ;si=Width,di=Heigh,bx=x,ax=y 
           LibCall		Random,80d-02d 
           mov			si,ax 
           inc			si 
           inc			si 
           LibCall		Random,25d-02d 
           mov			di,ax 
           inc			di 
           mov			ax,80d 
           sub			ax,si 
           LibCall		Random,ax 
           mov			bx,ax 
           mov			ax,24d 
           sub			ax,di 
           LibCall		Random,ax 
           ;bx=x1,ax=y1,si=x2,di=y2 
           add			si,bx 
           add			di,ax 
           LibCall		Window,bx,ax,si,di 
           ;Set color and blackground color 
           LibCall		Random,08h 
           LibCall		TextBackground,ax 
           LibCall		Random,07h 
           add			ax,09h 
           LibCall		TextColor,ax 
           ; 
           ;本函数与Cls对应 
           ; 
           LibCall		ClearScreen 
           ; 
           ret 
MakeWindow endp 
 
RandomText proc near 
@Next@Rand: 
           LibCall		Random,100h-20h 
           add			ax,20h 
           LibCall		Putch,ax 
           LibCall		Kbhit 
           or			al,al 
           jz			@Next@Rand 
           ret 
RandomText endp 
 
Prompt	db	'  Ins-InsLine  ' 
		db	'Del-DelLine  ' 
		db	1bh,18h,19h,1ah,'-Cursor  ' 
		db	'Alt+W-Window  ' 
		db	'Alt+R-Random  ' 
		db	'Esc-Exit$' 
;****************************************************** 
;* 标志程序结束并指定程序入口 
;****************************************************** 
	end	@@Start