|
我已经设计出来了一段程序,但是有错误
不知道有没有大虾帮忙改一下. 程序如下: DATA SEGMENT DISPLAY DB ? MSG DB "PRESS 'ESC' TO EXIT...",10H,13H BKCOLOR DW 6D6DH MCOLOR DW 0030H SCOLOR DW 0028H MEM DW ? NUBTBL DB 1, 1, 1, 0, 1, 1, 1 ; 0 DB 0, 0, 1, 0, 0, 1, 0 ; 1 DB 1, 0, 1, 1, 1, 0, 1 ; 2 DB 1, 0, 1, 1, 0, 1, 1 ; 3 DB 0, 1, 1, 1, 0, 1, 0 ; 4 DB 1, 1, 0, 1, 0, 1, 1 ; 5 DB 1, 1, 0, 1, 1, 1, 1 ; 6 DB 1, 0, 1, 0, 0, 1, 0 ; 7 DB 1, 1, 1, 1, 1, 1, 1 ; 8 DB 1, 1, 1, 1, 0, 1, 1 ; 9 PTSEG DW 7,2,35,10 DW 2,7,10,35 DW 32,7,40,35 DW 7,32,35,40 DW 2,37,10,65 DW 32,37,40,65 DW 7,62,35,70 DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX MOV AX,0A000H MOV ES,AX
MOV AH,0FH INT 10H MOV DISPLAY,AL ;save display
MOV AX,0013H INT 10H ;set display
CLD MOV AX,BKCOLOR XOR DI,DI MOV CX,08000H REP STOSW _WAIT: MOV AH,2CH INT 21H ;read time
PUSH CX PUSH DX CALL MYTIME
MOV AH,1 INT 16H ;read buffer of keyboard
PUSH AX MOV DL,0FFH MOV AX,0C06H ;clear keyboard buffer INT 21H
POP AX SUB AL,1BH JNZ _WAIT
MOV AL,DISPLAY MOV AH,00 INT 10H ;resume the model of displing
MOV AX,4C00H INT 21H ;return to dos
;************* End Of Main() *************************
;------------ my three process --------------------- ;------------ proc 0: MYTIME PROC NEAR PASCAL USES AX BX CX DX DI SI, hm:word,sec:word MOV CX,HM ;hour XOR AX,AX MOV AL,CH AAM PUSH AX MOV CL,8 SHR AX,CL MOV DX,20 PUSH DX MOV DX,50 PUSH DX PUSH MCOLOR PUSH AX CALL DISPLAYDIGIT
POP AX AND AX,0FH MOV DX,62 PUSH DX MOV DX,50 PUSH DX PUSH MCOLOR PUSH AX CALL DISPLAYDIGIT MOV CX,HM ;mintute XOR AX,AX MOV AL,CL AAM PUSH AX MOV CL,8 SHR AX,CL MOV DX,116 PUSH DX MOV DX,50 PUSH DX PUSH MCOLOR PUSH AX CALL DISPLAYDIGIT
POP AX AND AX,0FH MOV DX,158 PUSH DX MOV DX,50 PUSH DX PUSH MCOLOR PUSH AX CALL DISPLAYDIGIT MOV CX,SEC ;second XOR AX,AX MOV AL,CH AAM PUSH AX MOV CL,8 SHR AX,CL MOV DX,212 PUSH DX MOV DX,50 PUSH DX PUSH SCOLOR PUSH AX CALL DISPLAYDIGIT
POP AX AND AX,0FH MOV DX,254 PUSH DX MOV DX,50 PUSH DX PUSH SCOLOR PUSH AX CALL DISPLAYDIGIT
RET MYTIME ENDP
;------------ proc 1: DISPLAYDIGIT PROC NEAR PASCAL USES AX BX CX DX DI SI, x:word,y:word,color:word,num:word LEA SI,NUBTBL MOV BX,7 MOV AX,NUM MUL BX ADD SI,AX ;choise a number LEA DI,PTSEG XOR CX,CX _FOR: MOV BX,BKCOLOR CMP BYTE PTR DS:[SI],0 JE DISPL MOV BX,COLOR DISPL: MOV DX,X ADD DX,DS:[DI] PUSH DX
MOV DX,Y ADD DX,DS:[DI+2] PUSH DX
MOV DX,X ADD DX,DS:[DI+4] PUSH DX
MOV DX,Y ADD DX,DS:[DI+6] PUSH DX PUSH BX CALL DRAWSIXGON
INC SI ADD DI,8 INC CX CMP CX,7 JNE _FOR
RET DISPLAYDIGIT ENDP
;------------ proc 2: DRAWSIXGON PROC NEAR PASCAL USES AX BX CX DX DI SI, startX:word,startY:word,endX:word,endY:word,color:word LOCAL FLAG:word
MOV FLAG,1 MOV BX,startX MOV SI,startY MOV AX,320 MUL SI ADD AX,BX MOV MEM,AX ;mem=320*startY+startX MOV AX,endY SUB AX,startY MOV DX,endX SUB DX,startX MOV CX,DX
CMP AX,DX JC DRAW MOV FLAG,320 ;direct MOV CX,AX DRAW: XOR BX,BX XOR SI,SI MOV DX,3 MOV BX,COLOR SUB CX,8 ;length of line - 8 PUSH CX ABOVE: MOV DI,SI ;retive point of starting PUSH DX MOV AX,FLAG MUL DX POP DX ADD SI,AX ADD SI,MEM L1: MOV BYTE PTR ES:[SI],BL ADD SI,FLAG ;next pix DEC CX ;bx-->next line JNZ L1 POP CX ADD CX,2 PUSH CX CMP FLAG,1 JNE L2 ADD DI,320 JMP $+3 L2: INC DI MOV SI,DI ;next line DEC DX JNZ ABOVE DOWN: MOV DI,SI ;retive point of starting PUSH DX MOV AX,FLAG MUL DX POP DX ADD SI,AX ADD SI,MEM L3: MOV BYTE PTR ES:[SI],BL ADD SI,FLAG DEC CX JNZ L3 POP CX SUB CX,2 PUSH CX CMP FLAG,1 JNE L4 ADD DI,320 JMP $+3 L4: INC DI MOV SI,DI INC DX CMP DX,4 JNZ DOWN
POP CX RET DRAWSIXGON ENDP CODE ENDS END START |
|