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

📄 text4.asm

📁 汇编课程设计
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;*********************************************************
;滚动窗体宏定义
 win	MACRO	lux,luy,rdx,rdy,attr

	MOV	AH,6
	MOV	AL,0
	MOV	BH,attr			;前景背景属性
	MOV	CH,lux
	MOV	CL,luy
	MOV	DH,rdx
	MOV	DL,rdy
	INT	10h

	ENDM
;滚动窗体宏定义2
 win2	MACRO	lal,lux,luy,rdx,rdy,attr

	MOV	AH,6
	MOV	AL,lal
	MOV	BH,attr			;前景背景属性
	MOV	CH,lux
	MOV	CL,luy
	MOV	DH,rdx
	MOV	DL,rdy
	INT	10h

	ENDM

saveE         MACRO
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSH      DS
              PUSH      SI
              ENDM
recover       MACRO
              POP       SI
              POP       DS
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              ENDM

fileIO		MACRO     X,Y


              LEA		DX,X
              MOV		AH,Y
              INT		21H

              ENDM
 showM        MACRO     messM
              poscur    24,0
              LEA       DX,messM
              MOV       AH,09H
              INT       21H
              ENDM
;------------------------------------

;字符串显示宏定义
show	MACRO	mess

	LEA	DX,mess
	MOV	AH,09h
	INT	21h

	ENDM
;-------------------------------------

;光标定位宏定义
posget  MACRO                             ;读光标位置
         MOV AH,03h
         MOV BH,0
         INT 10h
ENDM
posgetS       MACRO
              saveE
         	  MOV AH,03h
        	  MOV BH,0
         	  INT 10h
              MOV       row,DH
              MOV       column,DL
              recover
              ENDM

poscur MACRO x,y

              MOV	AH,2
              MOV	DH,x
              MOV	DL,y
              MOV	BH,0
              INT	10h

	ENDM
 ;-------------------------------------
;读取键盘
readChar      MACRO
              MOV       BH,0
              MOV		AH,8h
              INT       10h
              ENDM
putchar       MACRO     x
              MOV       DL,x
              MOV       AH,02H
              INT       21H
              ENDM

getchar  MACRO
         MOV       AH,0
         INT       16h
         ENDM

;*************************************************
;********************************************************
;数据段定义
          ;    .386
data_seg          SEGMENT
              totalChars	DB        0		;字符总数,以此来控制数据缓冲区,
		  CHar1		DB	    0b3h    ;常量,是一个竖线
              tempchar  	DB        ?		;临时字节变量
              musicInt 		DB        0    	;文件数量
              musicIndex  	DB        30h     ;默认文件名的最后一个字符,随新建打开而增1,关闭减1
              SaveAsFlag 	DB        0   	;已调用过filesaveas函数
              modifyFlag  	DB        0		;为0时已做修改
              AsOrIfFlag	DB        0		;为0时是saveas调用
              saveActive      DB        78h     ;根据musicInt来判断是否激活save,saveAs菜单
              copyActive	DB        78h 	;根据copyFlag来判断是否激活copy,cut菜单
              pasteActive	DB        78h	;根据paste来判断是否激活paste菜单
              CLearFlag		DB        0		;clearFlag为0时表示不需要处理选择文本,如将反色显示还原
              pasteFlag		DB        0		;pasteFlag为0时为不能粘贴,
              copyFlag		DB        0		;copyFlag为0时为不能复制与剪切,
              pasteNum		DB        0		;粘贴缓冲区中字符个数.
              PasteBuffer	DB        25 DUP (0)
              			DB        '$'
              						;复制粘贴缓冲区
              INsertNum		DB        1		;insertNum为插入字符的个数
              save      	DB        0		;
              path     	      DB        30 DUP (0)		;文件名存放缓冲区
              	      	DB        '$'
              buffer 		DB 	    2000 DUP(?)		;buffer为数据缓冲区
              bak       	DB 		3850 DUP(0) 	;视频缓冲区的备份
              row       	DB 		2  			;保存行号,
              column    	DB 		1                 ;保存列号.
              rowBak		DB        2
              columnbak		DB        1
              peak     		DB        0Dah, 78 DUP(0C4h) ,0BFh,13,10,'$' ;顶端横线
              errormess1	DB	'can not creat the file,path is wrong!  ','$'
              errormess2 	DB	'can not write to the file!             ','$'
              errormess3     	DB    'the filename is  too long!             ','$'
              errormess4	DB	'can not open the file,filename is wrong','$'
              errormess5	DB	'can not read the file!                 ','$'
              mess1     	DB 	'Please input save file name:','$'
        	  mess2 		DB 	' Please input open file name:','$'
       	  mess3 		DB 	' ***The file is not save! Save it now? (Y/N)***: ','$'
              mess4		DB	'please input the filename again        ','$'
              mess5		DB	'your put is wrong!please input Y/N  again','$'
 		  mess6		DB	0b3H,' row:???  column:???','$'
              mess7		DB	'Creat a new file                       ','$'
              mess8		DB    'loads an exiting file from disk        ','$'
              mess9		DB	'save current file                      ','$'
              mess10		DB	'save current file with new name        ','$'
              mess11		DB	'Exits the editor                       ','$'
              mess12		DB	'F1:file menu  F3:Edit  F4:help   ','$'
              mess21		DB	'Copy selected text to buffer           ','$'
              mess22		DB	'Deletes selected text and copys it     ','$'
              mess23		DB	'Inserts buffer contents here           ','$'
              mess13		DB	0b3H,'modified  ','$'
              mess14		DB	0b3h,'NoModified','$'
              mess15		DB	'   editing...    press Esc can escape  ','$'
              mess16		DB	'                      made by dengchao and hujia',13,10,'$'
              mess17		DB	'                           TextEdit                 ',13,10,'$'
              mess18		DB	'                        2008 ,  12. 18  ..          ',13,10,'$'
              mess19		DB	'                    email:253421981@qq.com       ',13,10,'$'
              mess20 		DB	'                    Press any keys to return','$'
              musicname 	DB        'd:\dengchao0',0
                        RF		DB         13,10,'$'
;		 music	DW	2 DUP(262,294,330,262)			;两只老虎
			DW	2 DUP(330,349,392)
			DW	2 DUP(392,440,392,349,330,262)
			DW	2 DUP(294,196,262),0
		 time	DW	8 DUP(4)
			DW	2 DUP(4,4,8)
			DW	2 DUP(2,2,2,2,4,4)
			DW	2 DUP(4,4,8)
		music1	DW	262,294,330,349,392,440,494,523	;音阶
			DW	523,494,440,392,349,330,294,262,0
		time1	DW	16 DUP(25)
          ;文件相关数据定义
	    handler    DW       0
	    filename   DB        'e:/tiger.vol',0
	    CHartemp   DB		0
	    Buffertemp DB		4 DUP(0)
	    Bufferflag       DW        0
	    musicFinish	DB	0
	    musicTemp	DW	0
	    times		DW	1
	    musicBuffer DW      100 DUP(0)
	    bufferIndex DW      0
	    timeBuffer  DW	100  DUP(0)
          ;菜单数据定义
                  str_menu      DB        '   File(F1)                       Edit(F3)      Help(F4)',13,10,'$'
	    file_0   DB  0dah  ,    11 DUP(0C4H),0BFH ,13,10,'$'
	    file_1   DB 0B3H,' New       ',0B3H,13,10,'$'
	    file_2   DB 0B3H,' Open      ',0B3H,13,10,'$'
	    file_3   DB 0B3H,' Save      ',0B3H,13,10,'$'
	    file_4   DB 0B3H,' Save as   ',0B3H,13,10,'$'
	    file_5   DB 0B3H,' Exit      ',0B3H,13,10,'$'
	    file_6   DB 0c0H, 11 DUP(0c4h),0d9H,13,10,'$'
	    play_0   DB  0dah   ,   10 DUP(0C4H),0BFH   ,13,10,'$'
	    play_5   DB 0c0H, 10 DUP(0c4h),0d9H,13,10,'$'
	    edit_0   DB  0dah  ,    10 DUP(0C4H),0BFH ,13,10,'$'
	    edit_1   DB 0B3H,' Copy     ',0B3H,13,10,'$'
	    edit_2   DB 0B3H,' cut      ',0B3H,13,10,'$'
	    edit_3   DB 0B3H,' Paste    ',0B3H,13,10,'$'
	    edit_4   DB 0c0H, 10 DUP(0c4h),0d9H,13,10,'$'
	    error0        DB        'Open File failed',13,10,'$'
	    error1	      DB        'the file have illegal character', 13,10,'$'
	    error2	      DB        'the file have illegal character2', 13,10,'$'
	data_seg          ENDS
;*********************代码段*************8
	code_seg          SEGMENT
	         ASSUME    CS:code_seg,DS:data_seg
 ;************主过程开始**************
	start:

	      MOV	AX,data_seg
		MOV	DS,AX
	      CALL      welcome
	   INit:
	      CALL      INitwin
	      GEtchar				;读键盘
	      CMP	AH,3bh             	;F1
		JZ	showFile
;	      CMP   AH,3ch			;F2
;	      JZ     showPlay
              CMP       AH,3dh
              JZ        showE
	      CMP     AH,3Eh			;F3
	      JZ    showh
	      CMP    AH,01h
	      JZ    exitf
	      JMP       INit

   showFile:     CALL  showmenuF
              JMP       INit
   showPlay:  CALL  showMenuP
              JMP       INit
   showE:     CALL      showMenuE
              JMP       INit
   showh:     CALL  showmenuh
              JMP       INit
    exitf:
              MOV     AH,  4ch
              INT       21h
;主执行代码结束,下面都是要调用的函数定义.
;***********************************
;**********欢迎模块*****************
 welcome     PROC
              saveE
              recover
              RET
 welcome        ENDP
 ;----------------------------
 ;***********初始化模块*******
 ;功能:初始化屏幕,显示菜单,提示信息,设置工作模式为3号字符模式
 ;****************************
 INitwin      PROC
              saveE
              MOV       AH,01h
              MOV       CH,03h
              INT       10h       ;设置为字符模式03
      win	0,0,24,79,70h 		;清屏
      win   1,0,23,79,07h
      win   2,1,23,78,27H
      poscur   0,0
      show    str_menu
              poscur 1,0
              show peak             ;显示上面的横线
               ;两个循环是画左右两条线的.
              MOV       CL,23
      LOOPf:
              poscur  CL,0
              putchar CHar1
              DEC       CL
              CMP       CL,1
              JNZ       LOOPf
      LOOPf2:
              INC       CL
              poscur  CL,79
              putchar CHar1
              CMP       CL,23
              JNZ       LOOPf2
              poscur	2,1
              posgets
              CALL      showRC
              poscur	24,1
              show	mess12
              poscur	2,1
              recover
              RET
 INitwin       ENDP
;*************************************

 ;************************************
;********文件菜单模块*****************
;功能:当在主过程或编辑状态检测到F1而被激活的.根据用户的选择来
;     执行相应的菜单命令
;入口参数有musicInt:文件数量,以此来判断是激活save,save as 菜单
;先保存视频缓冲区的内容 ,再获取键盘输入,按照输入跳到不同的分支,
;每个分支都调用相应的函数来处理.
;to*为当前选中项*的处理分支
;to*&,其中&是数字,为了解决汇编中的一些跳转指令分几次跳的问题,
 showmenuF     PROC
              saveE
              CALL 	savedisplay
              CMP       musicInt,0
              JZ        NOTactive
              MOV       saveActive,79h
              JMP       activeOK
	  notactive:
	              MOV       saveActive,78h
	  activeOK:
	     win       0,3,0,11,07h
	    poscur    0,0
	    show      str_menu
	    win       2,3,8,15,saveActive		;菜单不选中的颜色(白底黑字)
	    win       9,4,9,16,07h  			;菜单的阴影
	    win       3,16,9,16,07h  			;菜单的阴影
        ;显示各个菜单,并设置第一个菜单为默认项,
	    poscur    2,3
	    show      file_0
	    poscur    3,3
	    show  file_1
	    poscur    4,3
	    show  file_2
	    poscur    5,3
	    show  file_3
	    poscur    6,3
	    show  file_4
	    poscur    7,3
	    show  file_5
	    poscur    8,3
	    show      file_6
     ;to*为当前选中项*的处理分支
	 tonew:
	    win       7,4,7,14,79h        ;
	    poscur    7,3
	    show      file_5
	    win       4,4,4,14,79h
	    poscur    4,3
	    show      file_2
	    win       3,4,3,14,67h
	    poscur    3,3
	    show      file_1
          showM	  mess7
	    GEtchar
	    CMP       AH,50h				;若按下键下方向键
	    JZ        toOpen
	    CMP       AH,48H
	    JZ        toexit1
	    CMP       AH,1ch 				;若按了Enter键
	    JZ 	  NEwfile1
	    JMP         exitfile                  ;其他就返回
	toexit1:     JMP       toexit

	NEwfile1:      JMP     NEwfile
	toOpen:
	    win       3,4,3,14,79h
	    poscur    3,3
	    show      file_1
	    win       5,4,5,14,saveActive
	    poscur    5,3
	    show      file_3
	    win       4,4,4,14,67h
	    poscur    4,3
	    show      file_2
          showM	  mess8
	    GEtchar
	    CMP  AH,50h
	    JZ   toSave
	    CMP       AH,48H
          JZ        tonew1
          JMP       tonew3
tonew1:       JMP       tonew
tonew3:
          CMP AH,1ch
	    JZ openfile1
	    JMP         exitfile

	openfile1:   JMP       openfile
	toSave:
	    win       4,4,4,14,79h
	    poscur    4,3
	    show      file_2
	    win       6,4,6,14,saveActive
	    poscur    6,3
	    show      file_4
	    win       5,4,5,14,67h
	    poscur    5,3
	    show      file_3
          showM	mess9
	    GEtchar
	    CMP  AH,50h
	    JZ   toSaveas
	    CMP       AH,48H
	    JZ        toOpen1
          JMP       toopen3
         toopen1:      JMP       toopen
toopen3:  CMP AH,1ch
	    JZ savefile1
	    JMP         exitfile

	savefile1:   JMP       savefile
	 toSaveas:
	    win       5,4,5,14,saveActive
	    poscur    5,3
	    show      file_3
	    win       7,4,7,14,79h
	    poscur    7,3
	    show      file_5
	    win       6,4,6,14,67h
	    poscur    6,3
	    show      file_4
          showM	  mess10
	    GEtchar
	    CMP  AH,50h
	    JZ   toExit
	    CMP       AH,48h
	    JZ        tosave1
              JMP       tosave3
tosave1:     JMP       tosave
tosave3:	    CMP AH,1ch
	    JZ saveasfile1
	    JMP         exitfile
       saveasfile1:   JMP       saveasfile
	 	 tosaveas1:    JMP       tosaveas
	 toExit:
	    win       6,4,6,14,saveActive
	    poscur    6,3
	    show      file_4
	    win       3,4,3,14,79h
	    poscur    3,3
	    show      file_1
	    win       7,4,7,14,67h
	    poscur    7,3
	    show      file_5
          showM	mess11
	    GEtchar
	    CMP  AH,50h
	    JZ   tonew2
          JMP       tonew4
tonew2:       JMP       tonew
tonew4:   CMP       AH,48h
	    JZ        tosaveas3
	    CMP AH,1ch
	    JZ EXITMusic
	    JMP       exitfile
tosaveas3:    JMP       tosaveas1

;****处理不同的分支所调用的不同的函数.****/

	 NEwfile:
	     CALL      filenew
	     JMP    exitfile
	                 ;播放完毕跳到初始位置
	 openfile:
	     CALL      fileopen
	     JMP    exitfile
	 savefile:
	     CALL	   filesave
	     JMP      exitfile
	 saveasfile:
	     CALL        filesaveas
	     JMP       exitfile

EXITMusic :    CMP        modifyFlag,0
              JNZ        exitfile20
              CALL       IFsave
              JMP	exitMusic

 exitfile20:  MOV  	AX,4C00h
              INT       21h
 exitfile:
              CALL      menuHide
              CALL      BackDisplay
              recover
              poscur row,column
	 	       RET
 showmenuF     ENDP
 ;************************************
 ;显示文件菜单
;先保存视频缓冲区的内容 ,再获取键盘输入,按照输入跳到不同的分支,
;每个分支都调用相应的函数来处理.
;to*为当前选中项*的处理分支
;to*&,其中&是数字,为了解决汇编中的一些跳转指令分几次跳的问题,
showMenuP     PROC
              saveE
              CALL 	savedisplay
    		  win       0,16,0,25,07h
    		  poscur    0,0
		    show      str_menu
		    win       2,16,7,27,79h  ;菜单不选中的颜色(白底黑字)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -