📄 init.asm
字号:
;* clear bit0 for reseting again *
;****************************************************************
MOV DX,092H
IN AL,DX
AND AL,0FEH
OUT DX,AL
;
;****************************************************************
;* 初始化管脚配置寄存器PINCFG: *
;* pincfg.0置0表示在设备管脚选择SSIOTX not RTS1; *
;* pincfg.1置0表示在设备管脚选择SRXCLK not DTR1; *
;* we don't use modem mode so upon two conf is not important *
;* pincfg.2置1表示在设备管脚选择TXD1; *
;* pincfg.3置1表示在设备管脚选择CTS1#; *
;* pincfg.4置1表示在设备管脚选择CS5#; *
;* pincfg.5置1表示在设备管脚选择定时器控制单元信号; *
;* pincfg.6置0表示在设备管脚选择CS6#。 *
;****************************************************************
MOV AX,3CH
MOV DX,0F826H
OUT DX,AL ; set PINCFG register
;
;****************************************************************
;* 初始化端口1配置p1cfg: *
;* p1cfg.0置0表示在设备管脚选择p1.0 not DCD0; *
;* p1cfg.1置0表示在设备管脚选择p1.1 not RTS0; *
;* p1cfg.2置0表示在设备管脚选择p1.2 not DTR0; *
;* p1cfg.3置0表示在设备管脚选择p1.3 not DSR0; *
;* p1cfg.4置0表示在设备管脚选择p1.4 not RI0; *
;* p1cfg.5置0表示在设备管脚选择p1.5 not LOCK; *
;* p1cfg.6置0表示在设备管脚选择p1.6 not HOLD; *
;* p1cfg.7置0表示在设备管脚选择p1.7 not HLDA; *
;****************************************************************
MOV AL,00
MOV DX,0f820h ;P1CFG_1
OUT DX,AL
;
;****************************************************************
;* 初始化端口2配置p2cfg: *
;* p2cfg.0置1表示在设备管脚选择cs0#; *
;* p2cfg.1置1表示在设备管脚选择cs1#; *
;* p2cfg.2置1表示在设备管脚选择cs2#; *
;* p2cfg.3置1表示在设备管脚选择cs3#; *
;* p2cfg.4置1表示在设备管脚选择cs4#; *
;* p2cfg.5置1表示在设备管脚选择RXD0; *
;* p2cfg.6置1表示在设备管脚选择TXD0; *
;* p2cfg.7置0表示在设备管脚选择p2.7 not CTS0; *
;****************************************************************
MOV AL,7FH
MOV DX,0f822h ;P2CFG_2
OUT DX,AL
;****************************************************************
;* 初始化端口3配置p3cfg: *
;* p3cfg.0置0(INTCFG.6=1)表示连接主IR4到SIOINT0; *
;* p3cfg.1置0(INTCFG.5=1)表示连接主IR3到SIOINT1; *
;* p3cfg.2置1表示连接主IR1到管脚INT0; *
;* p3cfg.3置1表示连接主IR5到管脚INT1; *
;* p3cfg.4置1表示连接主IR6到管脚INT2; *
;* p3cfg.5置1表示连接主IR7到管脚INT3; *
;* p3cfg.6置0表示连接选择设备管脚p3.6; *
;* p3cfg.7置0表示连接选择设备管脚p3.7。 *
;* though we haven't used INT0-3, we connect them for later *
;****************************************************************
MOV AL,3CH ; modified by bao for using sioint
MOV DX,0f824h ;P3CFG_3
OUT DX,AL ; set P3CFG
;****************************************************************
;* 初始化调制解调控制寄存器MCR0、MCR1: *
;* we don't use modem function *
;****************************************************************
MOV AL,00H ; modified by bao for adding sioint
MOV DX,03FCH
OUT DX,AL ; 设置MCR0
MOV DX,02FCH
OUT DX,AL ; 设置MCR1
;****************************************************************
;* 初始化输入输出端口 *
;* we don't use them yet *
;****************************************************************
; 初始化端口1
MOV AX,00H
MOV DX,0F864H ;P1DIR Direction config
OUT DX,AL
MOV AX,0FEH
MOV DX,0F862H ;PILTC latch config
OUT DX,AL
; 初始化端口2
MOV AX,0
MOV DX,0F86CH
OUT DX,AL
MOV AX,0FFH
MOV DX,0F86AH
OUT DX,AL
; 初始化端口3
MOV AX,0
MOV DX,0F874H
OUT DX,AL
MOV AX,0BFH ; p3.7:1-->串口发送使能
; p3.6:0-->串口接收使能
MOV DX,0F872H
OUT DX,AL
;
;********************************************************
; Initialize the Asynchronous Serial Port #1 for:
; word length of 8 bits.
; No parity.
; 12.0 MHz clocking frequency.(12.0/2/2=3.0 MHz)
; 1 top bit.
; Internal modem control sources.
; 19200 bps baud rate.
; divisor = 3000 / 19.2 / 16 = 9.8 ~ 10
; Interrupt sources: None Enabled
;********************************************************
MOV AX,80H ; allow access to the divisor latch register(DLLS)
MOV DX,2FBH
OUT DX,AL
MOV AX,0
MOV DX,2F9H
OUT DX,AL
MOV AX,0AH ; init DDL1
MOV DX,2F8H
OUT DX,AL
MOV AX,03H ; allow access to receive and transfer register
MOV DX,2FBH ; 8 bit character
OUT DX,AL
MOV AX,03H ; enable receive and transfer int
MOV DX,2F9H ; disable modem and receive status int
OUT DX,AL
MOV DX,2F8H ; read empty receive buffer
IN AL,DX
;
;********************************************************
; Initialize the Asynchronous Serial Port #0 for:
; word length of 8 bits.
; No parity.
; 12.0 MHz clocking frequency.(12.0/2/2=3.0 MHz)
; 1 top bit.
; Internal modem control sources.
; 19200 bps baud rate.
; divisor = 3000 / 19.2 / 16 = 9.8 ~ 10
; Interrupt sources: None Enabled
;********************************************************
MOV AX,80H ; allow access to the divisor latch register(DLLS)
MOV DX,3FBH
OUT DX,AL
MOV AX,0
MOV DX,3F9H
OUT DX,AL
MOV AX,0AH ; init DDL1
MOV DX,3F8H
OUT DX,AL
MOV AX,03H ; allow access to receive and transfer register
MOV DX,3FBH ; 8 bit character
OUT DX,AL
MOV AX,03H ; enable receive and transfer int
MOV DX,3F9H ; disable modem and receive status int
OUT DX,AL
MOV DX,3F8H ; read empty receive buffer
IN AL,DX
;****************************************************************
;* 初始化中断控制单元8259A: *
;* 主8259A和从8259A级联 *
;****************************************************************
; 主 8259A
MOV AX,11H ; 选择边沿触发IR输入信号,间隔为4
MOV DX,ICW1M_I1M ; 初始化命令字1(ICW1)
OUT DX,AL
MOV AX,20H ; 设置主8259A的中断向量基地址为20H
MOV DX,ICW2M_I2M ; 初始化命令字2(ICW2)
OUT DX,AL
MOV AX,04H ; 一个从8259A被连接到主8259A的IR2信号
MOV DX,ICW3M_I3M ; 初始化命令字3(ICW3)
OUT DX,AL
MOV AX,01H ; 选择完全嵌套方式;禁止自动EOI方式.
MOV DX,ICW4M_I4M ; 初始化命令字4(ICW4)
OUT DX,AL
MOV AL,0E6H ; OPEN SIO_0&1 INT
MOV DX,OCW1M_O1M ; 初始化OCW1
OUT DX,AL
MOV AL,20H ; 选择普通EOI命令
MOV DX,OCW2M_O2M ; 初始化OCW2
OUT DX,AL
; 从 8259A
MOV AX,11H ; 选择边沿触发IR输入信号,间隔为4.
MOV DX,ICW1S_I1S ; 初始化命令字1(ICW1)
OUT DX,AL
MOV AX,28H ; 设置从8259A的中断向量基地址为28H
MOV DX,ICW2S_I2S ; 初始化命令字2(ICW2)
OUT DX,AL
MOV AX,02H ; slave
MOV DX,ICW3S_I3S ; 初始化命令字3(ICW3)
OUT DX,AL
MOV AX,01H ; 选择完全嵌套方式;禁止自动EOI方式.
MOV DX,ICW4S_I4S ; 初始化命令字4(ICW4)
OUT DX,AL
MOV AL,0FFH ; 屏蔽所有从8259A中断
MOV DX,OCW1S_O1S ; 初始化OCW1
OUT DX,AL
MOV AL,20H ; 选择普通EOI命令
MOV DX,OCW2S_O2S ; 初始化OCW2
OUT DX,AL
;********** COPY IDT TO 0:0 ADDRESS ***************
PUSH AX
PUSH CX
PUSH DS
PUSH ES
MOV AX,0 ; OBJECT SEG
MOV ES,AX
MOV AX,SEG MY_INT
MOV DS,AX ; RESOURCE SEG
MOV DI,32*4
MOV SI,32*4
MOV CX,128 ; USING 32 INTS IS ENOUGH
CLD
REP MOVSW
POP ES
POP DS
POP CX
POP AX
;**************************************************
STI
;**********************************
MOV AX,SEG OBDH
PUSH AX
XOR AX,AX
PUSH AX
RET
MAIN ENDP
;
;*********************************************************************
; SIO-0 RECEIVING AND TRANSMITTING ISP ROUTINE
;*********************************************************************
;
PUBLIC SIO_0_INT
SIO_0_INT PROC FAR
PUSH AX
PUSH DX
PUSH BX
;***************************************
MOV DX,03FDH
IN AL,DX
TEST AL,20H ;transmit buffer is empty
JNZ SEND_NEXT_BYTE
TEST AL,01H ;receive buffer is full
JNZ RECV_BYTE
JMP SHORT SIO_0_INT_OUT
SEND_NEXT_BYTE:
MOV AX,SIO_0_SEND_NUM
MOV BX,SIO_0_SEND_COUNT
CMP AX,BX
JBE SIO_0_INT_OUT ;BELOW OR EQUAL -- ALL DATA HAS BEEN SENT
MOV AL,[SIO_0_SEND_BUFF + BX]
MOV DX,3F8H
OUT DX,AL ;SEND NEXT BYTE
INC SIO_0_SEND_COUNT
JMP SHORT SIO_0_INT_OUT
RECV_BYTE:
MOV DX,3F8H
IN AL,DX
MOV BX,SIO_0_RECV_NUM
LEA BX,[SIO_0_RECV_BUFF + BX]
MOV [BX],AL
;***************************************
SIO_0_INT_OUT:
MOV AL,20H
OUT OCW2M_O2M,AL ;sending EOI instruction
;***************************************
POP BX
POP DX
POP AX
IRET
SIO_0_INT ENDP
;
;*********************************************************************
; SIO-1 RECEIVING AND TRANSMITTING ISP ROUTINE
;*********************************************************************
;
PUBLIC SIO_1_INT
SIO_1_INT PROC FAR
PUSH AX
PUSH DX
PUSH BX
;***************************************
MOV DX,02FDH
IN AL,DX
TEST AL,20H ;transmit buffer is empty
JNZ SEND_NEXT_BYTE1
TEST AL,01H ;receive buffer is full
JNZ RECV_BYTE1
JMP SHORT SIO_1_INT_OUT
SEND_NEXT_BYTE1:
MOV AX,SIO_1_SEND_NUM
MOV BX,SIO_1_SEND_COUNT
CMP AX,BX
JBE SIO_1_INT_OUT ;BELOW OR EQUAL -- ALL DATA HAS BEEN SENT
MOV AL,[SIO_1_SEND_BUFF + BX]
MOV DX,2F8H
OUT DX,AL ;SEND NEXT BYTE
INC SIO_1_SEND_COUNT
JMP SHORT SIO_1_INT_OUT
RECV_BYTE1:
MOV DX,2F8H
IN AL,DX
MOV BX,SIO_1_RECV_NUM
LEA BX,[SIO_1_RECV_BUFF + BX]
MOV [BX],AL
;***************************************
SIO_1_INT_OUT:
MOV AL,20H
OUT OCW2M_O2M,AL ;sending EOI instruction
;***************************************
POP BX
POP DX
POP AX
IRET
SIO_1_INT ENDP
;*********************************************************************
;TIMER0_INT
;*********************************************************************
PUBLIC TIMER0_INT
TIMER0_INT PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DI
PUSH DS
MOV AX,MY_DATA
MOV DS,AX
INC COUNTER
MOV AL,20H
OUT ICW1M_I1M,AL
POP DS
POP DI
POP CX
POP BX
POP AX
IRET
TIMER0_INT ENDP
MY_CODE ENDS
MY_INT SEGMENT 'CODE'
II0_31 DD 32 DUP(218H)
II32 DW TIMER0_INT ;IR0--TMROUT0
DW MY_CODE
II33 DW 0 ;IR1--INT0
DW MY_CODE
II34 DW 0 ;IR2--Slave 82C59A
DW MY_CODE
II35 DW SIO_1_INT ;IR3--SIO1
DW MY_CODE
II36 DW SIO_0_INT ;IR4--SIO0
DW MY_CODE
II37_255 DD 219 DUP(218H)
MY_INT ENDS
END start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -