📄 8257.asm
字号:
PORT0 EQU 2B0H
PORT1 EQU 2B1H
STACK SEGMENT STACK
DB 200 DUP(?)
STACK ENDS
DATA SEGMENT
DA0 DB 5
DA1 DB 4
DA2 DB 3
DA3 DB 2
DA4 DB 1
DA5 DB 0 ;init led data address
SR1 DB 7 ;serc of modify_data
;UNDO DB 0 ;keep state
;CLEA DB 1 ;state clear
;STAR DB 2 ;state start
;SHIF DB 3 ;state shift
;STO DB 3 ;state stop
;EXI DB 4 ;state exit
;REFS DB 6 ;return the front state
;P_STA DB 1 ;present state
;F_STA DB ? ;front state
;S_STA DB ? ;set present state
ACT1 DB ? ;action G-1,D-2,C-3,E-4,error-0
;N_STA DB 2,0,2,0,3,0,0,1,1,4,4,4;table of next state
;BUF1 DB ? ;input buffer
COUNT1 DW 0F000H
;COUNT2 DW 7
;STA2 DW ?
LED DB 76H,79H,38H,38H,3FH,06H,00H ;"HELLO! "
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START: CLI
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV DX,PORT1
MOV AL,0D3H
OUT DX,AL
MOV AL,2AH
OUT DX,AL
MOV AL,40H
OUT DX,AL
MOV AL,00H
OUT DX,AL
MOV AL,80H
OUT DX,AL ;init 8279
L1: MOV DA0,5
MOV DA1,4
MOV DA2,3
MOV DA3,2
MOV DA4,1
MOV DA5,0
CALL CLEAR ;clear
MOV AL,ACT1
CMP AL,1
JZ L4
CMP AL,4
JNZ L1
JMP EXIT0
L4: MOV SI,OFFSET DA0
MOV CX,6
MOV BX,OFFSET LED
MOV DX,PORT1
MOV AL,90H
OUT DX,AL
L2: CLD
LODSB
XLAT
MOV DX,PORT0
OUT DX,AL
LOOP L2
;CALL READ_KEY
L5: CALL DELAY ;make a delay
MOV AL,ACT1
CMP AL,4
JZ EXIT0
CMP AL,3
JZ L1
CMP AL,2
JNZ L3
CALL STOP
MOV AL,ACT1
CMP AL,4
JZ EXIT0
CMP AL,3
JZ L1
JMP L5
L3: CALL LED_MO ;make led move,form left to right
MOV AL,ACT1
CMP AL,4
JZ EXIT0
CMP AL,3
JZ L1
JMP L5
EXIT0: MOV AX,4C00H
INT 21H
MAIN ENDP
CLEAR PROC NEAR ;clear main
PUSH AX
PUSH BX
PUSH CX
MOV DX,PORT1
MOV AL,0D1H
OUT DX,AL
CALL DISP0 ;clear display
LL2: MOV DX,PORT1
IN AL,DX
AND AL,07H
JZ LL2 ;when a key is pressed
LL3: MOV DX,PORT0
IN AL,DX
MOV BL,AL
AND AL,07H
AND BL,38H
MOV CL,03
SHR BL,CL
CMP BL,02H
JNZ LL4
CMP AL,0H
JNZ LL2
MOV ACT1,1 ;action beGin
JMP LL5
LL4: CMP BL,0H
JNZ LL2
CMP AL,6H
JNZ LL6
MOV ACT1,4 ;action Exit
JMP LL5
LL6: MOV ACT1,0
;judge the input,put the code of the action to ACT1
LL5: POP CX
POP BX
POP AX
RET
CLEAR ENDP
DISP0 PROC NEAR ;clear display
PUSH CX
MOV AX,DATA
MOV DS,AX
MOV DX,PORT1
MOV AL,90H
OUT DX,AL
MOV AL,6
MOV BX,OFFSET LED
XLAT
MOV CX,6
L21: MOV DX,PORT0
OUT DX,AL
LOOP L21
POP CX
RET
DISP0 ENDP
DISP1 PROC NEAR ;display led letter
PUSH CX
MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET DA0
MOV CX,6
MOV BX,OFFSET LED
MOV DX,PORT1
MOV AL,90H
OUT DX,AL
L61: CLD
LODSB
XLAT
MOV DX,PORT0
OUT DX,AL
LOOP L61
POP CX
RET
DISP1 ENDP
DELAY PROC NEAR
PUSH CX
MOV CX,100
L31: PUSH CX
MOV CX,COUNT1
L32: CALL READ_KEY ;read input
MOV AL,ACT1
CMP AL,0
JZ L34
CMP AL,1
JZ L34
JMP L33
L34: LOOP L32
POP CX
LOOP L31
JMP L35
L33: POP CX
L35: POP CX
RET
DELAY ENDP
DELAY1 PROC NEAR
PUSH CX
MOV CX,10
L91: PUSH CX
MOV CX,COUNT1
L92: CALL READ_KEY ;read input
MOV AL,ACT1
CMP AL,0
JZ L94
CMP AL,1
JZ L94
JMP L93
L94: LOOP L92
POP CX
LOOP L91
JMP L95
L93: POP CX
L95: POP CX
RET
DELAY1 ENDP
MODIFY_DA PROC NEAR ;modify the data of DA0....DA5
PUSH CX
PUSH AX
MOV SI,OFFSET DA0
MOV CX,06H
L41: MOV AL,[SI]
ADD AL,6
MOV AH,0
DIV SR1
MOV [SI],AH
INC SI
LOOP L41
POP AX
POP CX
RET
MODIFY_DA ENDP
LED_MO PROC NEAR ;make the led move
PUSH CX
MOV CX,7;COUNT2
L51: CALL MODIFY_DA
CALL DISP1
CALL DELAY1
MOV AL,ACT1
CMP AL,0
JZ L52
CMP AL,1
JZ L52
CMP AL,3
JZ L53
CMP AL,4
JZ L53
CALL STOP
MOV AL,ACT1
CMP AL,1
JZ L52
JMP L53
L52: LOOP L51
L53: ;MOV COUNT2,7
POP CX
RET
LED_MO ENDP
READ_KEY PROC NEAR ;read input and make note the code of this action
PUSH AX
PUSH BX
PUSH CX
L71: MOV DX,PORT1
IN AL,DX
AND AL,07H
JZ LNEXT ;when a key is pressed
L73: MOV DX,PORT0
IN AL,DX
MOV BL,AL
AND AL,07H
AND BL,38H
MOV CL,03
SHR BL,CL
CMP BL,02H
JNZ L74
CMP AL,0H
JNZ LNEXT
MOV ACT1,1 ;action beGin or Goto
JMP L75
L74: CMP BL,0H
JNZ LNEXT
CMP AL,5H
JNZ L76
MOV ACT1,2 ;action stop(D)
JMP L75
L76: CMP AL,4H
JNZ L77
MOV ACT1,3 ;action Clean
JMP L75
L77: CMP AL,6H
JNZ LNEXT
MOV ACT1,4 ;action Exit
JMP L75
LNEXT: MOV ACT1,0 ;no action or error action
L75: ;MOV DL,ACT1
;CMP DL,0
;JZ L72
;MOV DL,ACT1
;ADD DL,30H
;MOV AH,2
;INT 21H
L72: POP CX
POP BX
POP AX
RET
READ_KEY ENDP
STOP PROC NEAR
PUSH AX
L81: CALL READ_KEY
MOV AL,ACT1
CMP AL,0
JZ L81
CMP AL,2
JZ L81
POP AX
RET
STOP ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -