📄 a20-1.asm
字号:
STACK SEGMENT STACK
DW 64 DUP(?)
TOP LABEL WORD
STACK ENDS
DATA SEGMENT
TS DB 14H
SPEC DW 0030H
IBAND DW 0060H
KPP DW 1060H
KII DW 0010H
KDD DW 0020H
CH1 DB ?
CH2 DB ?
YK DW ?
CK DB ?
VADD DW ?
ZV DB ?
ZVV DB ?
TC DB ?
FPWM DB ?
CK_1 DB ?
EK_1 DW ?
AEK_1 DW ?
BEK DW ?
AAA DB ?
VAA DB ?
BBB DB ?
VBB DB ?
MARK DB ?
R0 DW ?
R1 DW ?
R2 DW ?
R3 DW ?
R4 DW ?
R5 DW ?
R6 DW ?
R7 DB ?
R8 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MAIN: CALL SYSTEM ;Initiate System
CALL INIT ;Initiate Varable
STI
M1: MOV AL,TS ;Judge Ts=Tc ?
SUB AL,TC
JNC M1
MOV TC,00H ;Get Yk
MOV AL,ZVV
MOV AH,00H
MOV YK,AX
CALL PID ;Count Ck
MOV AL,CK ;Translate Ck into PWM
SUB AL,80H
JC IS0
MOV AAA,AL
JMP COU
IS0: MOV AL,10H
MOV AAA,AL
COU: MOV AL,7FH
SUB AL,AAA
MOV BBB,AL
MOV AX,SPEC ;SPEC to CH1
MOV CH1,AL
MOV AX,YK ;YK to CH2
MOV CH2,AL
CALL PUT_COM ;Display Wave
JMP M1
PUT_COM:
MOV AL,31H
OUT 0C1H,AL
MOV AL,CH1
OUT 0C0H,AL
WAIT1: IN AL,0C1H
TEST AL,01H
JZ WAIT1
MOV AL,CH2
OUT 0C0H,AL
WAIT2: IN AL,0C1H
TEST AL,01H
JZ WAIT2
MOV AL,34H
OUT 0C1H,AL
RET
INIT: NOP
PUSH DS
XOR AX,AX
MOV DS,AX
MOV AX,OFFSET IRQ6 ;8259 IRQ6(T0:1ms)
ADD AX,2000H ;LOAD IP adress=2000H
MOV SI,0038H
MOV [SI],AX
MOV AX,0000H
MOV SI,003AH
MOV [SI],AX
MOV AX,OFFSET IRQ7 ;8259 IRQ7(INT0:HR-OUT,COUNT-VVV)
ADD AX,2000H ;LOAD IP adress=2000H
MOV SI,003CH
MOV [SI],AX
MOV AX,0000H
MOV SI,003EH
MOV [SI],AX
CLI
POP DS
IN AL,21H
AND AL,3FH ;allow IRQ6,IRQ7
OUT 21H,AL
MOV VADD,0000H
MOV ZV,00H
MOV ZVV,00H
MOV CK,00H
MOV YK,0000H
MOV CK_1,00H
MOV EK_1,0000H
MOV AEK_1,0000H
MOV BEK,0000H
MOV BBB,00H
MOV VBB,00H
MOV R0,0000H
MOV R1,0000H
MOV R2,0000H
MOV R3,0000H
MOV R4,0000H
MOV R5,0000H
MOV R6,0000H
MOV R7,00H
MOV R8,0000H
MOV MARK,00H
MOV FPWM,01H
MOV AAA,7FH
MOV VAA,7FH
MOV TC,00H
MOV AL,80H ;Initiate 8255-B
OUT 63H,AL
MOV AL,00H
OUT 61H,AL
MOV AL,0B6H ;8253-OUT2
OUT 43H,AL
MOV AL,8FH ;1ms
OUT 42H,AL
MOV AL,04H
OUT 42H,AL
RET
SYSTEM: MOV AL,76H
OUT 43H,AL
MOV AL,0CH
OUT 41H,AL
MOV AL,00H
OUT 41H,AL
MOV AL,00H
OUT 0C1H,AL
CALL DALLY
OUT 0C1H,AL
CALL DALLY
OUT 0C1H,AL
CALL DALLY
OUT 0C0H,AL
CALL DALLY
OUT 0C0H,AL
CALL DALLY
MOV AL,40H
OUT 0C1H,AL
CALL DALLY
MOV AL,7EH
OUT 0C1H,AL
CALL DALLY
MOV AL,34H
OUT 0C1H,AL
CALL DALLY
IN AL,21H
OR AL,01H
OUT 21H,AL
RET
DALLY: NOP
PUSH CX
MOV CX,3000H
B2: PUSH AX
POP AX
LOOP B2
POP CX
RET
IRQ7: NOP
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSHF
MOV AL,MARK
CMP AL,01H
JZ IN1
MOV MARK,01H
IN2: NOP
MOV AL,20H ;Close IRQ7
OUT 20H,AL
POPF
POP DX
POP CX
POP BX
POP AX
IRET
IN1: MOV MARK,00H
CALL VV
MOV AL,ZV
MOV ZVV,AL
JMP IN2
VV: MOV DX,0000H
MOV AX,03E8H
MOV CX,VADD
CMP CX,0000H
JZ MM1
DIV CX
MM: MOV ZV,AL
MOV VADD,0000H
MM1: RET
IRQ6: NOP
PUSH AX
PUSHF
INC TC
CALL KJ
CLC
CMP MARK,01H
JC TT1
INC VADD
CMP VADD,0700H
JC TT1
MOV VADD,0700H
MOV MARK,00H
TT1: NOP
MOV AL,20H ;Close IRQ6
OUT 20H,AL
POPF
POP AX
IRET
KJ: NOP
PUSH AX
CMP FPWM,01H
JNZ TEST2
CMP VAA,00H
JNZ ANOT0
MOV FPWM,02H
MOV AL,BBB
CLC
RCR AL,01H
MOV VBB,AL
JMP TEST2
ANOT0: DEC VAA
MOV AL,01H
OUT 61H,AL
TEST2: CMP FPWM,02H
JNZ OUTT
CMP VBB,00H
JNZ BNOT0
MOV FPWM,01H
MOV AL,AAA
CLC
RCR AL,01H
MOV VAA,AL
JMP OUTT
BNOT0: DEC VBB
MOV AL,00H
OUT 61H,AL
OUTT: POP AX
RET
PID: MOV AX,SPEC
SUB AX,YK
MOV R0,AX
MOV R1,AX
SUB AX,EK_1
MOV R2,AX
SUB AX,AEK_1
MOV BEK,AX
MOV R8,AX
MOV AX,R1
MOV EK_1,AX
MOV AX,R2
MOV AEK_1,AX
TEST R1,8000H
JZ EK1
NEG R1
EK1: MOV AX,R1
SUB AX,IBAND
JC II
MOV R3,00H
JMP DDD
II: MOV AL,TS
MOV AH,00H
MOV CX,R1
MUL CX
MOV CX,KII
DIV CX
MOV R3,AX
TEST R0,8000H
JZ DDD
NEG R3
DDD: TEST BEK,8000H
JZ DDD1
NEG BEK
DDD1: MOV AX,BEK
MOV CX,KDD
MUL CX
PUSH AX
PUSH DX
MOV AL,TS
MOV AH,00H
MOV CX,0008H
MUL CX
MOV CX,AX
POP DX
POP AX
DIV CX
MOV R4,AX
TEST R8,8000H
JZ DD1
NEG R4
DD1: MOV AX,R3
ADD AX,R4
MOV R5,AX
JO L9
L2: MOV AX,R5
ADD AX,R2
MOV R6,AX
JO L3
L5: MOV AX,R6
MOV CX,KPP
IMUL CX
MOV CX,1000H
IDIV CX
MOV CX,AX
RCL AH,01H
PUSHF
RCR AL,01H
POPF
JC LLL1
CMP CH,00H
JZ LLL2
MOV AL,7FH
JMP LLL2
LLL1: CMP CH,0FFH
JZ LLL2
MOV AL,80H
LLL2: MOV R7,AL
ADD AL,CK_1
JO L8
L18: MOV CK_1,AL
ADD AL,80H
MOV CK,AL
RET
L8: TEST R7,80H
JNZ L17
MOV AL,7FH
JMP L18
L17: MOV AL,80H
JMP L18
L9: TEST R3,8000H
JNZ L1
MOV R5,7FFFH
JMP L2
L1: MOV R5,8000H
JMP L2
L3: TEST R2,8000H
JNZ L4
MOV R6,7FFFH
JMP L5
L4: MOV R6,8000H
JMP L5
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -