136 lines
4.2 KiB
C
136 lines
4.2 KiB
C
#include <stdio.h>
|
||
#include <sys/io.h>
|
||
#include <stdlib.h>
|
||
#include <unistd.h>
|
||
|
||
#include "substitutions.h"
|
||
|
||
#define PortCan0 0x40
|
||
|
||
void beep(unsigned iTone, unsigned iDlit);
|
||
|
||
void delay(unsigned int ms)
|
||
{
|
||
usleep(ms * 1000);
|
||
}
|
||
|
||
int main(void) {
|
||
|
||
long int lCnt = 0;
|
||
int iA = 0x1234;
|
||
|
||
char *pT = (char *)0x46C;
|
||
printf("\nПечатаем 10 раз значение байта с известным адресом\n");
|
||
for (int i = 0; i < 10; i++)
|
||
{
|
||
printf(" \n %d ", *pT);
|
||
}
|
||
printf("\n Для продолжения нажмите любую клавишу \n");
|
||
system("pause"); // Ждем нажатия клавиши
|
||
|
||
printf("\n Читаем содержимое порта с адресом 40 с помощью функции Си \n");
|
||
printf("\n Для выхода из цикла - нажмите любую клавишу \n");
|
||
|
||
// Линуксу не сильно нравится, что ты насилуешь порты ввода и вывода процессора, поэтому нужно выдать ему на это дело разрешение
|
||
|
||
ioperm(PortCan0, 1, 3); // Что означает тройка напишу позже
|
||
set_input_mode();
|
||
while (isKeyPressed() == 0) {
|
||
printf("\n Порт40 = %d", inb(PortCan0));
|
||
delay(500);
|
||
}
|
||
reset_input_mode();
|
||
|
||
system("pause");
|
||
printf("\n Читаем содержимое порта с адресом 40 ассемблером \n");
|
||
|
||
set_input_mode();
|
||
while (isKeyPressed() == 0) {
|
||
// asm {
|
||
// push ax
|
||
// in al,0x40
|
||
// }
|
||
|
||
unsigned char Tmm = 0;
|
||
asm (
|
||
"push rax\n\t"
|
||
"in al, 0x40"
|
||
"mov %0, al"
|
||
"pop rax"
|
||
:"=r"(Tmm)
|
||
:
|
||
:"rax"
|
||
);
|
||
delay(500);
|
||
printf("\n Порт40 = %d", Tmm);
|
||
}
|
||
reset_input_mode();
|
||
system("pause");
|
||
printf("\n Для продолжения - нажмите любую клавишу \n");
|
||
system("pause");
|
||
|
||
long *pTime = (long *)0x46C;
|
||
set_input_mode();
|
||
while (isKeyPressed() == 0) {
|
||
printf("\n %ld", *pTime);
|
||
delay(1000);
|
||
}
|
||
reset_input_mode();
|
||
system("pause");
|
||
|
||
// Данная секция закомментирована, поскльку линукс не дает обратиться к
|
||
// не промапанной и не аллоцированной памяти. Но даже если ее аллоцировать
|
||
// mmem'ом, все равно эта память будет виртуальная, поэтому смысла делать
|
||
// это не имеет. Вариант просмотра содержимого условной ячейки памяти на nasm
|
||
// приведен в файле time.asm. Объяснить тот код, который я вижу
|
||
// на базовом уровне я в состоянии
|
||
|
||
// int Time;
|
||
// set_input_mode();
|
||
// while (isKeyPressed() == 0) {
|
||
// Здесь происходит операция получения времени суток при
|
||
// помощи обращения к специально размеченой области памяти
|
||
// Однако можно ли такой фокус сделать в linux это еще надо узнать
|
||
// asm push ds
|
||
// asm push si
|
||
// asm mov ax, 40h
|
||
// asm mov ds, ax
|
||
// asm mov si, 0x6C
|
||
// asm mov ax, [ds : si]
|
||
// asm mov Time, ax
|
||
// asm pop si
|
||
// asm pop ds
|
||
// asm(
|
||
// "mov "
|
||
// );
|
||
//
|
||
// printf("\n %d", Time);
|
||
// delay(300);
|
||
// }
|
||
// reset_input_mode();
|
||
//
|
||
// beep(400, 200);
|
||
// for (lCnt = 0; lCnt < 1000000; lCnt++) {
|
||
// a1:
|
||
// asm {
|
||
// mov ax,iA
|
||
// mov ax,iA
|
||
// mov ax,iA
|
||
// mov ax,iA
|
||
// mov ax,iA
|
||
// mov ax,iA
|
||
// mov ax,iA
|
||
// mov ax,iA
|
||
// mov ax,iA
|
||
// a2:
|
||
// mov ax,iA
|
||
// }
|
||
// }
|
||
// beep(400, 200);
|
||
|
||
// здесь секция для выполнения замеров времени. Поскольку доступ к звуку
|
||
// Я иметь не могу, если не буду использовать pulseaudio, замерим старыми дедовскими методами
|
||
// При помощи clock_gettime
|
||
}
|
||
|