Red de conocimiento informático - Conocimiento del nombre de dominio - ¿Cuáles son las preguntas de programación sobre los principios de las microcomputadoras y la tecnología de interfaz?

¿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>

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

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