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

📄 text4.asm

📁 汇编课程设计
💻 ASM
📖 第 1 页 / 共 4 页
字号:
              poscur	 1,35
              show  	musicname
              win  	2,1,23,78,017h		;工作区为蓝底白字
              MOV       row,2
              MOV       column,1
              poscur	row,column
	        CALL      EDItfile
              recover
              RET
 filenew      ENDP
;*********最重要的函数之一**********
;可能被fileNew函数、fileOpen函数调用
;获取键盘输入,按照输入跳到不同的分支,
;每个分支都调用相应的函数来处理.
;注意不同的分支处理缓冲区的方式也不同
;处理函数是相应的键名+K,以区别以其标号

 EDItfile     PROC
              saveE
       MOV       BX,0
       CHargetF:
       	  posgets
       	  poscur	24,0
      	  show	mess15
              ;根据modifyFlag的值来显示是否已修改的信息.
              poscur	24,43
              CMP       modifyFlag,0
              JZ		MODifyMess
              show	mess14
              JMP       showedMess
    MODifyMess:
              show	mess13
    showedMess:
              poscur	row,Column
              CALL      showRC
                                  ;从键盘读字符 ah=扫描码 al=字符码
              MOV       AH,12h
              INT       16h
              AND       AL,00000011b
              JZ        notshift1
              posgets
              MOV       rowbak,DH
              MOV       columnbak,DL
 shift:
              MOV       CLearFlag,1
              GEtchar
              PUSH      AX
              MOV       AH,12h
              INT       16h
              AND       AL,00000011b
              JZ        exitshift
              POP       AX
      ;  	  CMP  	AH,48h                    ;上;待实现
       ; 	  JZ   	ups
        ;      CMP  	AH,50h                    ;下;待实现

       ;	  JZ   	downs
        	  CMP  	AH,4bh                    ;左
       	  JZ   	leftS
       	  CMP  	AH,4dh                    ;右
    	        JZ  	rightS
              JMP       exitShift
 notshift1:   JMP       NOTshift
 exitRet13:   JMP       exitRet
 ups:         CALL      upSProc
              JMP       shift
 downs:       CALL      downSProc
              JMP       shift
 LEfts:       CALL      LEftSProc				;S表示:selet
              JMP       shift
 rights:      CALL      rightsProc				;
              JMP       shift

 exitShift:
 		  POP       AX
              JMP       NOTshift2
 NOTshift:
              Getchar
 NOTshift2:

              posgets
     	        LEA DX,buffer
              MOV buffer[BX],AL
              INC       totalChars
              INC 	BX
        	  CMP  AH,48h                    ;上
        	  JZ   upk1
              CMP  AH,50h                    ;下
       	  JZ   down1
        	  CMP  AH,4bh                    ;左
       	  JZ   left1
       	  CMP  AH,4dh                    ;右
    	        JZ   right1
              CMP  AH,1ch                    ;回车
       	  JZ   enter1
              CMP AH,47h                ;home
    	        JZ  home1
       	  CMP AH,4fh                ;end
       	  JZ  _END1
       	  CMP AH,0eh                ;backspace
      	  JZ  bak_sp1
     		  CMP AH,53h
       	  JZ  del1
      	  CMP	AH,3bh
	     	  JZ	showFilen1
     	        CMP   AH,3ch
     		  JZ     showPlayn1
              CMP       AH,3Dh
              JZ        showEditn1
      	  CMP     AH,3Eh
              JZ    showhn1
              CMP       AH,01H
              JZ        exitRet1
              JMP       JMPsNext
JMPs:
upk1:         JMP       upk
down1:        JMP       down
left1:        JMP       left
right1:       JMP       right
enter1:       JMP       enter
home1:        JMP       home
_END1:        JMP       _END
bak_sp1:      JMP       bak_sp
del1:         JMP       del
showFilen1:   JMP       showFilen
showPlayn1:   JMP       showPlayn
showEditn1:   JMP       showEditn
showhn1:      JMP	 	showhn
exitRet1:     JMP       exitRet
JMPsNext:
              CMP       AL,0
              JZ		CHargetF12
              PUSH	AX
              readChar
              CMP       AL,20h				;此处是判断是否需要后移文本
              JZ        putcharDirect  			;需要则调用MOVBACK
              posGets
              CALL      MovBack
    putcharDirect:
              POP       AX
              CMP       column,79
              JNZ       putchar1
              MOV       column,1
              INC       row
              poscur    row,column
      putchar1:
              INC       column
              putchar  AL
              MOV       modifyFlag,0
              CMP       CLearFlag,0
              JZ       CHargetf1
              JMP      CHargetF13
  CHargetF12: JMP       CHargetf1
  CHargetF13:
              MOV       CL,pasteNum
              MOV       CH,0
              MOV       SI,CX
              posgets
              poscur	rowbak,columnbak
              MOV       DH,rowbak
              MOV       DL,columnbak
 LOOPclear:								;此循环是为了恢复反显文本
              readChar
              MOV       BX,0017h
              MOV       CX,1
              MOV       AH,09h
              INT       10h
              DEC       SI
              INC       DL
              poscur	DH,DL
              CMP       SI,0
              JNZ       LOOPclear
          ;    mov	pasteFlag,0
           ;   MOV       pasteNum,0
              MOV       CLearFlag,0
              MOV       CopyFlag,0
              poscur    row,column
      CHargetF1:
              JMP       CHargetF
      upk:    CALL      upk2
              JMP       CHargetF
      down:   CALL      downk
              JMP       CHargetF
      LEft:   CALL      LEftk
              JMP       CHargetF
      right:  CALL      rightk
              JMP       CHargetF
      enter:  CALL      enterk
              JMP       CHargetF
      home:   CALL      homek
              JMP       CHargetF
      _END:   CALL      ENDk
              JMP       CHargetF
      bak_sp: CALL      bak_spk
              JMP       CHargetF
      del:    CALL      delk
              JMP       CHargetF
      showfilen:CALL      showmenuF
              JMP       CHargetF
      showplayn:CALL      showmenup
              JMP       CHargetF
      showEditn:
              CALL      showMenuE
              JMP       CHargetF
      showhn:   CALL      showmenuh
              JMP       CHargetF
      exitRet:
              CMP        modifyFlag,0
              JNZ        exitedit
              CALL      IFsave
      exitedit:
              MOV       SI,8
              DEC       musicname[SI]
              DEC       musicInt
              recover
              RET
 EDItfile     ENDP
 ;**********退出编辑状态时判断是否需要保存的模块***************
 ;当文件未保存时调用的函数
 ;入口参数为saveY,当用户输入Y/y时调用filesaveas函数进行保存
 ;当用户输入N/n时不保存,用户输入有误时提示再输入一次.
 ;出口参数 AsOrIfFlag,它会影响 filesaveas函数的执行分支的选择.
 ;AsOrIfFlag为1时为Ifsave函数调用filesaveas,否则为0时是用户按下
 ;save as菜单做出的函数调用.
 IFsave       PROC
              saveE
              win       10,15,12,67,07h
              win       9,14,11,66,24h
              poscur    10,15
              show      mess3
  GEtcharIS:
              GEtchar
              CMP       AL,59h
              JZ        saveY
              CMP       AL,79h
              JZ        saveY
              CMP       AL,6Eh
              JZ        exitifsave
              CMP       AL,4Eh
              JZ        exitifsave
              poscur    24,0
              show  	mess5
              JMP       GEtcharIS
   saveY:
              MOV       AsOrIfFlag,1
              CALL      filesaveas
   exitifsave:
              recover
              RET
  IFsave      ENDP
upsproc       PROC
              saveE
              recover
              RET
upsproc       ENDP
downsproc       PROC
              saveE
              recover
              RET
downsproc       ENDP
leftsproc       PROC
              saveE
              posgets
              readChar
              MOV       copyFlag,1
              MOV       BL,pasteNum
              MOV       BH,0
              MOV       BX,0071h
              MOV       CX,1
              MOV       AH,09h
              INT       10h
              INC       pasteNum
              CMP       column,1
              JZ        exitlefts
              MOV       AL,column
              DEC		AL
              poscur	row,AL
              INC       AL
              MOV       columnbak,AL
              MOV       DL,row
              MOV       rowbak,DL
exitlefts:
              recover
              RET
leftsproc      ENDP

rightsproc       PROC
              saveE
              MOV       copyFlag,1
              readChar
              MOV       BL,pasteNum
              MOV       BH,0
              INC       pasteNum
              MOV       BX,0071h
              MOV       CX,1
              MOV       AH,09h
              INT       10h
              posgets
              CMP       column,79
              JZ        exitrights
              INC		column
              poscur	row,column
              posgets
exitrights:
              recover
              RET
rightsproc       ENDP

;********按下向上的方向键时响应的函数****
 upk2 PROC
              saveE
              posgets
              CMP       row,2
              JZ        exitup
              DEC       row
              poscur	row,column
  exitup:     recover
              RET
  upk2        ENDP
;********按下向下的方向键时响应的函数****
 downk 	      PROC
              saveE
              posgets
              CMP       row,23
              JZ        exitdown
              INC       row
              poscur	row,column
  exitdown:   recover
              RET
 downk        ENDP
;********按下向左的方向键时响应的函数****
 LEftk PROC
              saveE
              posgets
              CMP       column,1
              JZ        exitleft
              DEC		column
              poscur	row,column
  exitleft:   recover
              RET
 LEftk        ENDP
;********按下向右的方向键时响应的函数****
 rightk PROC
              saveE
              posgets
              CMP       column,78
              JZ        exitright
              INC		column
              poscur	row,column
  exitright:  recover
              RET
 rightk        ENDP
;********按下回车时响应的函数****
;存在问题:
 enterk PROC
              saveE
              posgets
              CMP       row,23
              JZ        exitenter
              INC       row
              MOV       column,1
              poscur	row,column
  exitenter:
              recover
              RET
  enterk      ENDP
;********按下home时响应的函数****
 homek PROC
              saveE
              posgets
              MOV		column,1
              poscur	row,column
              recover
              RET
 homek        ENDP
 ;********按下end时响应的函数****
 ENDk PROC
              saveE
              posgets
              MOV		column,78
              poscur	row,column
              recover
              RET
 ENDk        ENDP
;********按下退格键时响应的函数****
;1、注意这个函数,它与DEL键的处理函数一样
;都需要修改视频缓冲区来达到被删除字符
;后面的字符都要向前移,2、同时也要修改数据
;缓冲区,否则你看到的屏幕上的字符与实际
;根据缓冲区里的字符储存的文件字符不一致
;3、这些修改是调用movhead函数来实现的.
;存在问题.
 bak_spk PROC
              saveE
              posgets
              ;列号不同跳到不同的分支.
              CMP       column,1
              JZ        bak_spk1
              DEC       column
              JMP       deal
  bak_spk1:
              CMP       row,2
              JZ        exitbak_spk
              DEC       row
              MOV       column,78
   deal:
              poscur	row,column
              putchar   0
              poscur    row,column
              CALL      MOVahead
   exitbak_spk:
              recover
              RET
 bak_spk        ENDP
;********按下退格键时响应的函数****
;注意事项请看bak_spk的注释
;存在问题.
 delk PROC
              saveE
              posgets
              ;列号不同跳到不同的分支.
              CMP       column,78
              JZ        delk1
              INC       column
              JMP       deldeal
  delk1:
              CMP       row,23
              JZ        exitdel
              INC       row
              MOV       column,1
   deldeal:
              poscur	row,column
              putchar   0
              poscur    row,column
              CALL      MOVahead
   exitdel:

              recover
              RET
 delk        ENDP
 ;********修改视频和数据缓冲区*****
 ;delk 和bak_spk函数将调用之.
 ;1、注意此函数的主体是一个循环,这个循环的入口参数是:
 ;2、CX用来控制循环次数,即修改次数,
 ;cx=21*78-(row-2)*78
 ;3、BX用来控制B800开始的视频缓冲区的偏移量
 ;BX=row*160+column*2
 ;4、注意最后一行应该特殊处理, 否则会出现很奇怪的现象
 ;
 ;存在问题.
 MOVahead     PROC
              saveE
              PUSH      ES
       	  MOV 	AX,0b800h
   	        MOV 	ES,AX
              MOV       SI,0
              ;计算SI
              MOV       AL,160d
              MUL       row
              MOV       SI,AX
              MOV       AL,2d
              MUL       column
              ADD       SI,AX
              ;计算CX
              MOV       AX,0
              MOV       AL,78d
              MOV       AH,row
              SUB       AH,2
              MUL       AH
              MOV       DL,column
              DEC       DL
              MOV       DH,0
              ADD       AX,DX
              MOV       CX,1638d
              SUB       CX,AX
              MOV       DL,column
              ;循环改变视频缓冲区.
 LOOPahead:
 exchang:
              INC       DL
              CMP       DL,79
              JZ        AHead1
              MOV       BX,ES:[SI+2]
              MOV       ES:[SI],BX
              ADD       SI,2
              JMP       AHeadContine
  AHead1:
              ;根据行号的不同选择不同的分支.
              CMP       row,23
              JZ        EXITMovahead
              MOV       BX,ES:[SI+6]
              MOV       ES:[SI],BX
              ADD       SI,6
              MOV       DL,1
  AHeadContine:
              LOOP      LOOPahead
  EXITMovahead:
              POP       ES
              recover
              RET
 MOVahead     ENDP
 MOVBack      PROC
              saveE
              PUSH      ES

⌨️ 快捷键说明

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