www.pudn.com > dh.rar > f.asm


DLY  macro opr1,opr2              ;延时子程序 
local    dl1,dl2      
  PUSH CX 
       PUSH DX 
       MOV  DX,opr1 
DL1:   MOV  CX,opr2 
DL2:   LOOP DL2 
       DEC  DX 
       JNZ  DL1 
       POP  DX 
       POP  CX 
 endm 
PRO_NAM   SEGMENT                       ;数据段 
BUFA   DB 200 
       DB ? 
       DB 200 DUP(0) 
BUFB   DB 200 DUP(?) 
CAR    DB 7                  ;小汽车的字符图形表 
       DB 52H,7,0,0 
       DB 0B1H,7,0,1 
       DB 0DBH,7,0,1 
       DB 0DBH,7,0,1 
       DB 4FH,7,1,0 
       DB 4FH,7,0,-3 
       DB 2,7,-2,1 
       CHAR_CNT DW ? 
       POINTER DW ? 
       LINE_ON DB ? 
       COL_ON DB ? 
PRO_NAM ENDS 
STACK  SEGMENT stack                ;堆栈段定义 
       DB 200 DUP(0)                ;200字节空间 
STACK  ENDS 
code segment              ;代码段定义 
main proc far                
       ASSUME CS:CODE,DS:PRO_NAM,SS:STACK 
start: 
;set up stack for return 
        push ds 
        sub ax,ax 
        push ax 
;main  part of program goes here 
mov ah,0 
mov al,0dh 
int 10h 
      call line 
      call ligh 
      call bus 
      ret 
main endp 
;jmp main 
;#################################### 
line proc near 
       call hori 
     call vert 
     ret 
;******************************* 
hori proc near 
       push ax 
       push cx 
        push dx 
        mov dx,60 
hine:mov cx,0 
hdot: 
         mov al,0bH 
        mov ah,0ch    ; 像素功能 
        int 10h 
        inc cx 
        cmp cx,300 
        jl hdot 
       add dx,90          ;行间距 
        cmp dx,160 
        jl hine 
        pop dx 
        pop cx 
        pop ax 
        ret 
hori endp 
;************************************* 
vert proc near 
         push ax 
         push cx 
          push dx 
         mov cx,100 
vline:mov dx,0 
vdot: mov al,0bH 
          mov ah,0ch 
          int 10h 
           inc dx 
           cmp dx,200 
           jl vdot 
          add cx,90  ; 列间距 
          cmp cx,200 
           jl vline 
          pop dx 
          pop cx 
          pop ax 
           ret 
vert    endp 
;********************** 
    line   endp                   
;################################# 
ligh proc near 
rotate:   mov ah,2 
         mov dh,8 
         mov dl,22      
         mov bh,0     ;100 
         int 10h 
         Call red 
         dly 55500,42040 
          call yellow 
           dly 55100,42040 
           call green 
        DLY  55000,45001 
         ret 
         ligh endp 
green proc near 
         mov ah,9 
         mov al,'*' 
         mov bh,0 
         mov bl,02h 
         mov cx,1 
         int 10h 
         ret 
green endp 
;**************************** 
yellow proc near 
          mov ah,9 
          mov al,'*' 
          mov bh,0 
          mov bl,0eh 
          mov cx,1 
          int 10h 
           ret 
yellow endp 
;******************** 
red proc near 
 
          mov ah,9 
          mov al,'*' 
         mov bh,0 
         mov bl,4h 
          mov cx,1 
          int 10h 
          ret 
red endp 
;########################### 
bus proc near 
 begin:mov ax,pro_nam 
       mov ds,ax     ;ds段地 
       CALL QICHE 
       INT 21 
 
QICHE  PROC near              ;汽车子程序  
       PUSH AX 
       PUSH BX 
       PUSH CX 
       PUSH DX   
       LEA DI,CAR            ;DI指向字符图形表 
       MOV DH,12            ;从第9行9列位置开始显示汽车 
       MOV DL,0 
       CALL MOVE_SHAPE 
       RET 
QICHE  ENDP 
MOVE_SHAPE PROC NEAR          
       PUSH AX 
       PUSH BX 
       PUSH CX 
       PUSH DX 
       PUSH DI 
       MOV AH,0FH             ;取当前显示方式 
       INT 10H 
       SUB CH,CH 
       MOV CL,[DI]            ;CL放字符个数 
       INC DI                 ;DI指向字符图形表中的第一个字符 
       MOV CHAR_CNT,CX 
       MOV POINTER,DI 
       MOV LINE_ON,DH 
       MOV COL_ON,DL 
 
PLOT_NEXT:  
       ADD DH,[DI+2]          ;改变行列坐标 
       ADD DL,[DI+3] 
       CMP DL,80             ;出屏否? 
       JB MOV_CRSR 
       Pop DI 
       Pop DX 
       Pop CX 
       Pop BX 
       Pop AX 
       jmp exit2 
MOV_CRSR:   
       MOV AH,2                
       INT 10H 
       MOV AL,[DI]            ;取字符值 
       MOV BL,[DI+1]          ;取字符属性 
       PUSH CX 
       MOV CX,1 
       MOV AH,09              ;显示字符 
       INT 10H 
       POP CX 
       ADD DI,4               ;DI指向下一个字符 
       LOOP PLOT_NEXT 
         DLY 40000,6801 
       CALL ERASE 
       JMP SHORT PLOT_NEXT 
exit2: ret     
MOVE_SHAPE ENDP 
ERASE  PROC NEAR            ;檫除子程序 
       MOV CX,CHAR_CNT 
       MOV DI,POINTER 
       MOV DH,LINE_ON 
       MOV DL,COL_ON 
ERASE_NEXT:  
       ADD DH,[DI+2] 
       ADD DL,[DI+3] 
       MOV AH,2 
       INT 10H 
       MOV AL,[DI] 
       MOV BL,0 
       PUSH CX 
       MOV CX,1 
       MOV AH,9 
       INT 10H 
       POP CX 
       ADD DI,4 
       LOOP ERASE_NEXT 
       MOV CX,CHAR_CNT 
       MOV DI,POINTER 
       MOV DH,LINE_ON 
       INC COL_ON 
       MOV DL,COL_ON 
       RET 
ERASE  ENDP 
  bus endp 
;###################### 
code ends 
         end       start