www.pudn.com > 3_4test.rar > 3_4test.asm


       DATAS  SEGMENT 
         CHAR  DB       ? 
         NUM  DB        0,0,0 
         DIS  DW        ? 
     WIN_ULR  DB        5,5,18 
     WIN_ULC  DB        10,50,15 
     WIN_LRR  DB        15,15,22 
     WIN_LRC  DB        30,70,65 
   WIN_WIDTH  DB        20,20,50 
          WR  DB        15,15,22 
          WC  DB        10,50,15 
       DATAS  ENDS 
 
       CODES  SEGMENT 
              ASSUME    CS:CODES,DS:DATAS 
     
        MAIN  PROC      FAR 
      START: 
              MOV       AX,DATAS 
              MOV       DS,AX 
       
              CALL      CLEAR 
              CALL      RIGHT 
              MOV       AX,4C00H 
              INT       21H 
        MAIN  ENDP 
 
      SCROLL  PROC      NEAR        ;书P332 
              MOV       AH,6 
              MOV       AL,1 
              LEA       SI,WIN_ULR 
              ADD       SI,DIS 
              MOV       CH,[SI] 
              LEA       SI,WIN_ULC 
              ADD       SI,DIS 
              MOV       CL,[SI] 
              LEA       SI,WIN_LRR 
              ADD       SI,DIS 
              MOV       DH,[SI] 
              LEA       SI,WIN_LRC 
              ADD       SI,DIS 
              MOV       DL,[SI] 
              MOV       BH,7 
              INT       10H 
              MOV       BX,DIS 
              MOV       NUM[BX],0 
              MOV       DH,WIN_LRR[BX] 
              MOV       WR[BX],DH 
              MOV       DH,WIN_ULC[BX] 
              MOV       WC[BX],DH 
              RET 
      SCROLL  ENDP 
     
     
       CLEAR  PROC      NEAR        ;书p330 
              
     
              MOV       AH,6 
              MOV       AL,0 
              MOV       BH,7 
              MOV       CH,0 
              MOV       CL,0 
              MOV       DH,24 
              MOV       DL,79 
              INT       10H 
     
              MOV       DX,0 
              MOV       AH,2 
              INT       10H 
     
              
              RET 
       CLEAR  ENDP 
 
    GET_CHAR  PROC      NEAR        ;书P332 
               
              MOV       AH,0 
              INT       16H 
              CMP       AH,1 
              JE        TO_EXIT 
              JNE       CMPL 
    TO_EXIT:  CALL      EXIT 
       CMPL: 
              CMP       AH,4BH 
              JE        TO_LEFT 
              JNE       CMPR 
    TO_LEFT: 
              CALL      LEFT 
       CMPR: 
              CMP       AH,4DH 
              JE        TO_RIGHT 
              JNE       NEXT 
    TO_RIGHT: 
              CALL      RIGHT 
               
       NEXT: 
              MOV       DL,AL 
              MOV       AH,2 
 
              INT       21H 
              MOV       CHAR,AL 
              ADD       [SI],1 
              MOV       BX,DIS 
              ADD       NUM[BX],1 
              MOV       CL,WIN_WIDTH[BX] 
              CMP       NUM[BX],CL 
              JE        TO_SCROLL 
              JNE       RET1 
  TO_SCROLL: 
              CALL      SCROLL 
       RET1: 
              RET 
    GET_CHAR  ENDP 
 
    DIS_PLAY  PROC      NEAR        ;书P333 
 
              
              MOV       AH,9 
              MOV       AL,CHAR 
              MOV       BH,0 
              MOV       BL,7 
              MOV       CX,1 
              INT       10H 
              ADD       [SI],1 
              ADD       NUM+2,1 
              CMP       NUM+2,50 
              JE        TO_SCROLL2 
              JNE       RET2 
 TO_SCROLL2: 
              CALL      SCROLL 
       RET2: 
              RET 
    DIS_PLAY  ENDP 
 
  POSE_CURSE  PROC      NEAR        ;光标定位 书P331下 
              MOV       AH,2 
              LEA       SI,WR 
              ADD       SI,DIS 
              MOV       DH,[SI] 
              LEA       SI,WC 
              ADD       SI,DIS 
              MOV       DL,[SI] 
              MOV       BH,0 
              INT       10H 
              RET 
  POSE_CURSE  ENDP 
 
       RIGHT  PROC      NEAR 
               
     AGAIN: 
              MOV       DIS,1 
              CALL      POSE_CURSE 
              CALL      GET_CHAR 
              CALL      DOWN 
              JMP       AGAIN 
              RET 
       RIGHT  ENDP 
 
        LEFT  PROC      NEAR 
               
     AGAIN1: 
              MOV       DIS,0 
              CALL      POSE_CURSE 
              CALL      GET_CHAR 
              CALL      DOWN 
              JMP       AGAIN1 
              RET 
        LEFT  ENDP 
 
        DOWN  PROC      NEAR 
              MOV       DIS,2 
              CALL      POSE_CURSE 
              CALL      DIS_PLAY 
              RET 
        DOWN  ENDP 
 
        EXIT  PROC      NEAR 
              MOV       AH,2 
              MOV       DH,0 
              MOV       DL,0 
              MOV       BH,0 
              INT       10H 
              MOV       AX,4C00H 
              INT       21H 
        EXIT  ENDP 
       CODES  ENDS 
              END       START