⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.asm

📁 386ex初始化程序。使用中断、定时器、串口。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;* 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 + -