¿Cuáles son las preguntas de programación sobre los principios de las microcomputadoras y la tecnología de interfaz?
1. 8253
.MODEL TINY
PCIBAR3 EQU 1CH; dirección base del espacio de E/S de 8 bits (es la dirección base del instrumento experimental). , también DMA amp; 8237 en la placa de RAM de 32 BIT proporciona la dirección base)
Vendor_ID EQU 10EBH; Número de identificación del proveedor
Device_ID EQU 8376; p> .STACK 100
.DATA
COM_ADDR DW 00B3H
T0_ADDR DW 00B0H
T1_ADDR DW 00B1H
IO_Bit8_BaseAddress DW
msg0 DB 'BIOS no admite acceso a PCI
msg1 DB 'No se puede encontrar la tarjeta de placa Star PCI9052
msg2 DB 'Leer 8 bits Espacio de E/S Error en dirección base
.CODE
INICIO: MOV AX, @DATA
MOV DS, AX
NOP
CALL InitPCI
CALL ModifyAddress Convierte la dirección de desplazamiento en una dirección real según la dirección base proporcionada por PCI
mov dx, COM_ADD
mov al , 35h;?
out dx, al; El contador T0 está configurado en estado modo 2, conteo de código BCD
mov dx, T0_ADDR
mov al, 00h
salida dx, al
mov al, 10h
salida dx, al CLK0/1000
mov dx, COM_ADDR
mov al, 77h
out dx, al; el contador T1 está en modo 3, genera onda cuadrada, conteo de código BCD
mov dx , T1_ADDR
mov al, 00h
salida dx, al
mov al, 10h
salida dx, al;
START1: CALL IfExit; OUT1 genera una onda cuadrada con una frecuencia de 1S
JZ START1
JMP Exit
IfExit PROC NEAR
PUSH AX
PUSH DX
MOV AH, 06H
MOV DL, 0FFH
INT 21H
POP DX
POP AX
RET
SiSalir ENDP
IniciarPCI PROC NEAR
MOV AH, 00H
MOV AL, 03H
INT 10H; Borrar pantalla
MOV AH, 0B1H
MOV AL, 01H
INT 1AH
CMP AH, 0
JZ InitPCI2
LEA DX, msg0
InitPCI1: MOV AH , 09H
INT 21H
Salida JMP
InitPCI2: MOV AH, 0B1H
MOV AL, 02H
MOV CX, Device_ID
MOV DX, Vendor_ID
MOV SI, 0
INT 1AH
JNC InitPCI3 ¿Existe Star PCI9052? ? Placa
LEA DX, msg1
JMP InitPCI1
InitPCI3: MOV DI, PCIBAR3
MOV AH, 0B1H
MOV AL, 09H
INT 1AH; lee la dirección base de la tarjeta PCI9052
JNC InitPCI4
LEA DX, msg2
JMP InitPCI1
InitPCI4: AND CX, 0FFFCH
MOV IO_Bit8_BaseAddress, CX
RET
InitPCI ENDP
Modificar dirección PROC NEAR
AGREGAR COM_ADDR,CX
AGREGAR T0_ADDR,CX
AGREGAR T1_ADDR,CX
RET
ModificarDirección ENDP
Salir: MOV AH, 4CH
INT 21H
FINALIZAR INICIO
2. > .MODEL TINY
PCIBAR1 EQU 14H; dirección base de E/S PCI9052 (utilizada para acceder al registro de configuración local)
PCIBAR3 EQU 1CH; dirección base de espacio de E/S de 8 bits; (Es la dirección base del instrumento experimental y también proporciona la dirección base para 8237 en la placa DMA amp; 32 BIT RAM)
PCIIPR EQU 3CH número IRQ
INTCSR EQU; 4CH; dirección INTCSR PCI9052
mask_int_9052 EQU 24H
Vendor_ID EQU 10EBH; número de identificación del proveedor
Device_ID EQU 8376; .STACK 100
.DATA
IO8259_0 DW 00F0H
IO8259_1 DW 00F1H
RD_IO8259 DW 0000H
IO_Bit8_BaseAddress ¿DW?
P
¿CI_IO_BaseAddress0 DW?
PCI_IRQ_NUMBER DB?
INT_MASK DB?
INT_Vector DB?
INT_CS DW?
INT_IP DW ?
msg0 DB 'BIOS no admite acceso a PCI
msg1 DB 'No se puede encontrar la tarjeta de placa Star PCI9052
msg2 DB 'Error al leer la dirección base de E/S PCI9052$'
msg3 DB 'Error al leer la dirección base del espacio de E/S de 8 bits$'
msg4 DB 'Error al leer el número IRQ $ '
msg5 DB '8259 Interrumpido 00H veces$'
BUFFER DB
¿Contador DB?
ReDisplayFlag DB 0
.CODE
INICIO: MOV AX, @DATA
MOV DS, AX
MOV ES, AX
NOP
CALL InitPCI
CALL ModifyAddress; convierte la dirección de desplazamiento en una dirección real de acuerdo con la dirección base proporcionada por PCI
CALL ModifyVector; permitir interrupciones
MOV AH, 00H
MOV AL, 03H
INT 10H
MOV AH, 09H
LEA DX, msg5
INT 21H
CALL Init8259
Contador MOV, 0; número de interrupciones
MOV ReDisplayFlag , 1; pantalla requerida
STI; interrupción abierta
START1: CALL IfExit
CMP ReDisplayFlag, 0
JZ START1
LLAMADA a LedDisplay
MOV ReDisplayFlag, 0
JMP START1
Init8259 PROC NEAR
MOV DX, IO8259_0
mov al, 13H
salida dx, al
MOV DX, IO8259_1
mov al, 08H
salida dx , al
p>MOV AL, 09H
OUT DX, AL
mov al, 0feH; registro de máscara
OUT DX, AL
RET
Init8259 ENDP
ToChar PROC NEAR; Convertir a número hexadecimal visualizable
ADD AL, '0'
CMP AL,'9'<
/p>
JBE ToChar1
AÑADIR AL, 07H
ToChar1: RET
ToChar ENDP
LedDisplay PROC CERCA p> p>
MOV AL, Contador
MOV AH, AL
AND AL, 0FH
CALL ToChar
MOV Buffer 1 , AL
AND AH, 0F0H
ROR AH, 4
MOV AL, AH
CALL ToChar
Búfer MOV, AL
MOV AH, 02H
MOV DL, 10
MOV DH, 0
INT 10H; posición del cursor
MOV AH, 09H
LEA DX, Buffer
INT 21H
RET
LedDisplay ENDP
p>INT_0: PUSH DX
PUSH AX
LLAMADA ClearInt
JC INT_0_0
MOV DX, RD_IO8259
IN AL, DX
IN AL, DX; determinar qué fuente de interrupción causó la interrupción
MOV AL, Contador
ADD AL, 1
DAA
Contador MOV, AL
MOV ReDisplayFlag, 1
INT_0_0: MOV DX, IO8259_0
MOV AL, 20H
OUT DX, AL
POP AX
POP DX
IRET
SiSalir PROC NEAR
PUSH AX
PUSH DX
MOV AH, 06H
MOV DL, 0FFH
INT 21H
POP DX
POP AX
JZ IfExit1
JMP Salir
IfExit1: RET
IfExit ENDP
InitPCI PROC NEAR
MOV AH, 00H
MOV AL, 03H
INT 10H; Borrar pantalla
MOV AH, 0B1H
MOV AL, 01H
INT 1AH
CMP AH, 0
JZ InitPCI2
LEA DX, msg0
InitPCI1: MOV AH, 09H
INT 21H
Salida JMP
InitPCI2: MOV AH, 0B1H
MOV AL, 02H
MOV C
X, Device_ID
MOV DX, Vendor_ID
MOV SI, 0
INT 1AH
JNC InitPCI3 si existe la placa Star PCI9052;
LEA DX, msg1
JMP InitPCI1
InitPCI3: MOV DI, PCIBAR1
MOV AH, 0B1H
MOV AL, 09H
INT 1AH; lee la dirección base de la tarjeta PCI9052
JNC InitPCI4
LEA DX, msg2
JMP InitPCI1
InitPCI4: AND CX, 0FFFCH
MOV PCI_IO_BaseAddress0, CX
MOV DI, PCIBAR3
MOV AH, 0B1H
MOV AL, 09H
INT 1AH; Lee la dirección base IO extendida de 8 bits de la tarjeta
JNC InitPCI5
LEA DX, msg3
JMP InitPCI1
InitPCI5: AND CX, 0FFFCH
MOV IO_Bit8_BaseAddress, CX
MOV DI, PCIIPR
MOV AH, 0B1H
MOV AL, 09H
INT 1AH; leer número IRQ
JNC InitPCI6
LEA DX, msg4
p>JMP InitPCI1
InitPCI6: MOV PCI_IRQ_NUMBER, CL
RET
InitPCI ENDP
Modificar dirección PROC NEAR
p>MOV AX, IO_Bit8_BaseAddress
AGREGAR IO8259_0, AX
AGREGAR IO8259_1, AX
AGREGAR RD_IO8259, AX
RET
Modificar dirección ENDP
Modificar vector PROC NEAR
PUSH ES
MOV AL, PCI_IRQ_NUMBER
CMP AL, 08H
JAE ModifyVector1
AÑADIR AL, 08H; IRQ0..7 -gt; Vector de interrupción 8..F
JMP ModifyVector2
ModificarVector1: AÑADIR AL, 70H-08H; IRQ8..F -gt; Vector de interrupción 70H..77H
ModificarVector2: MOV INT_Vector, AL
MOV AH, 35H
INT 21H
MOV INT_IP, BX
MOV AX, ES
MOV IN;
T_CS, AX
MOV AL, INT_Vector
LEA DX, INT_0
PUSH DS
PUSH CS
POP DS
MOV AH, 25H
INT 21H; Establecer nuevo vector de interrupción
POP DS
MOV BL, PCI_IRQ_NUMBER
MOV DX, 21H
CMP AL, 08H
JB ModifyVector3
MOV DX, 0A1H
ModifyVector3: EN AL , DX
MOV INT_MASK, AL
AND BL, 07H
MOV CL, BL
MOV BL, 1
SHL BL, CL
NOT BL
AND AL, BL
OUT DX, AL; interrupción permitida
POP ES
STI
RET
ModifyVector ENDP
ClearInt PROC NEAR; borra el indicador de interrupción de PCI9052 y el controlador de interrupciones del sistema
MOV DX, PCI_IO_BaseAddress0
AGREGAR DX, INTCSR
; EN AL, DX
Y AL, mask_int_9052
; JZ ClearInt3 no es una interrupción causada por 8259
INC DX
IN AL, DX
OR AL, 0CH
OUT DX, AL ;Borre el bit de indicador de interrupción de PCI9052
MOV AL, PCI_IRQ_NUMBER
CMP AL, 08H
JAE ClearInt1
AND AL, 7
O AL, 60H
MOV DX, 20H
SALIDA DX, AL
JMP ClearInt2
ClearInt1: Y AL, 7
O AL, 60H
MOV DX, 0A0H
SALIDA DX, AL
MOV DX, 20H
p>MOV AL, 62H
SALIDA DX, AL
ClearInt2: CLC
RET
; ClearInt3: STC
; RET
ClearInt ENDP
Salir: CLI
MOV BL, PCI_IRQ_NUMBER
MOV DX, 21H
CMP AL, 08H
JB Salida1
MOV DX, 0A1H
Salida1: MOV AL, INT_MASK
OUT DX, AL; máscara de interrupción
PUSH DS
M
OV AL, INT_Vector
MOV DX, INT_IP; protege la dirección de la rutina de procesamiento de interrupciones original
MOV AX, INT_CS
MOV AH, 25H
INT 21H; Establecer nuevo vector de interrupción
POP DS
STI
MOV AH, 4CH
INT 21H
FINALIZAR INICIO
3.8251
.MODEL TINY
Usa el contador 0 de 8253, conéctalo a 2Mhz, divídelo por 26 y da. 8251, que genera 4800 bps
PCIBAR3 EQU 1CH; dirección base de espacio de E/S de 8 bits (es la dirección base del instrumento experimental y también proporciona la dirección base para 8237 en el DMA amp; 32 BIT Placa RAM)
Vendor_ID EQU 10EBH; Número de identificación del proveedor
Device_ID EQU 8376; Número de identificación del dispositivo
.STACK 100
.DATA
CTL_ADDR DW 00F1H; Palabra de control o palabra de estado
DATA_ADDR DW 00F0H; Leer y escribir datos
W_8253_T0 DW 00B0H; p>W_8253_C DW 00B3H ;Palabra de control
IO_Bit8_BaseAddress DW
msg0 DB 'BIOS no admite acceso a PCI
msg1 DB 'No se puede encontrar la tarjeta de placa Star PCI9052
msg2 DB 'Error al leer la dirección base del espacio de E/S de 8 bits$'
Receive_Buffer DB 10 DUP(0); búfer de recepción
Send_Buffer EQU Receiver_Buffer ; enviar buffer
.CODE
INICIO: MOV AX,@DATA
MOV DS, AX
MOV ES, AX
p>NOP
CALL InitPCI
CALL ModifyAddress Convierte la dirección de desplazamiento en una dirección real según la dirección base proporcionada por PCI
CALL INIT_8253
LLAMADA INIT_8251
INICIO1: MOV CX, 10
LLAMADA Grupo_recepción
MOV CX, 10
LLAMADA Send_Group
CALL IfExit; OUT1 genera una onda cuadrada con una frecuencia de 1S
JZ START1
JMP Exit
; /p>
INIT_8253 PROC NEAR
MOV DX, W_8253_C
MOV AL, 37H; temporizador 0, modo 3
OUT DX,
AL
MOV DX, W_8253_T0
MOV AL, 26H; código BCD 26 (2000000/26)=16*4800
SALIDA DX, AL
MOV AL, 0
SALIDA DX, AL
RET
INIT_8253 ENDP
INIT_8251 PROC NEAR
CALL RESET_8251
mov dx, CTL_ADDR
mov al, 7eh; el coeficiente de velocidad en baudios es 16, 8 bits de datos
out dxx, al ;A bit de parada, paridad par
CALL DLTIME ;Retraso
mov al, 15h; permitir recibir y enviar datos, borrar indicador de error
out dx, al p>
CALL DLTIME
RET
INIT_8251 ENDP
Reset_8251 PROC NEAR
MOV DX, CTL_ADDR
MOV AL, 0
OUT DX, AL; escriba "0" en el puerto de control
CALL DLTIME, esperando que se complete la operación de escritura
p>
SALIDA DX, AL; escribe "0" en el puerto de control
CALL DLTIME; retardo
SALIDA DX, AL; puerto
CALL DLTIME; Retraso
MOV AL, 40H; Escribe la palabra de reinicio 40H en el puerto de control
OUT DX, AL
CALL DLTIME
RET
Reset_8251 ENDP
Aceptar un grupo de datos, CX--aceptar número
Recibir_Grupo PROC NEAR
p >LEA DI, búfer_de_recepción
Grupo_de_recepción1: LLAMADA Byte_de_recepción
STOSB
LOOP Grupo_de_recepción1
RET
Receive_Group ENDP
;Recibir un byte
Recibir_Byte PROC NEAR
MOV DX, CTL_ADDR
Recibir_Byte1: en al, dx; Leer estado
prueba al, 2
jz Recibir_Byte1
mov dx, DATA_ADDR sí
en al, dx
p>RET
Recepción
ve_Byte ENDP
;Enviar un grupo de datos, CX--Enviar número
Send_Group PROC NEAR
LEA SI, Send_Buffer
Send_Group1 : lodsb
llamar a Sendbyte
bucle Send_Group1
RET
Send_Group ENDP
enviar un byte
; p>
p>
Sendbyte PROC NEAR
PUSH AX
MOV DX, CTL_ADDR estado de lectura
Sendbyte1: en al, dx<; /p>
test al, 1
jz Sendbyte1; ¿Permitir que se envíen datos?
pop ax; enviar
mov dx, DATA_
MOV CX, Device_ID
MOV DX, Vendor_ID
MOV SI, 0
INT 1AH
JNC InitPCI3; ¿Existe una placa Star PCI9052
LEA DX, msg1
JMP? InitPCI1
InitPCI3: MOV DI, PCIBAR3
MOV AH, 0B1H
MOV AL, 09H
INT 1AH lee la tarjeta PCI9052; Dirección base
JNC InitPCI4
LEA DX, msg2
JMP InitPCI1
InitPCI4: AND CX, 0FFFCH
MOV IO_Bit8_BaseAddress, CX
RET
InitPCI ENDP
Modificar dirección PROC NEAR
AGREGAR COM_ADD, CX
AGREGAR PA_ADD,CX
AGREGAR PB_ADD,CX
AGREGAR PC_ADD,CX
RET
Modificar dirección ENDP
Salida: MOV AH, 4CH
INT 21H
FIN INICIO