10 #include <lib/string.h>
11 #include <io/serial_port.h>
17 uint16_t com_init[8] = {0};
25 void __com_setInit(uint16_t key, uint16_t value){
26 com_init[key] = value;
36 uint16_t __com_getInit(uint16_t key){
40 void __com_readBigData(uint16_t port, uint32_t *buffer,
size_t times) {
41 for (int32_t index = 0; index < times; index++) {
42 buffer[index] = inl(port);
54 void __com_writeBigData(uint16_t port, uint32_t *buffer,
size_t times) {
55 for (int32_t index = 0; index < times; index++) {
56 outl(port, buffer[index]);
67 void __com_readString(uint16_t port, uint32_t *buf,
size_t size){
68 __com_readBigData(port, buf, size);
76 int32_t __com_is_ready(uint16_t port){
77 return inb(port + 5) & 0x20;
85 void __com_writeChar(uint16_t port,
char a) {
86 while (__com_is_ready(port) == 0);
96 void __com_writeString(uint16_t port,
char *buf){
97 for (
size_t i = 0, len =
strlen(buf); i < len; i++) {
98 __com_writeChar(port, buf[i]);
107 void __com_io_wait(){
112 void __com_writeInt(int16_t port, ssize_t i){
113 char buffer[44] = {0};
117 __com_writeChar(port,
'0');
123 __com_writeChar(port,
'-');
127 buffer[index++] =
'0' + (i % 10);
132 __com_writeChar(port, buffer[index]);
136 void __com_writeUInt(int16_t port,
size_t i){
137 char buffer[44] = {0};
141 buffer[index++] =
'0' + (i % 10);
146 __com_writeChar(port, buffer[index]);
151 void __com_writeHex(int16_t port, uint32_t i,
bool mode){
152 const unsigned char hex[16] =
"0123456789ABCDEF";
154 uint32_t d = 0x10000000;
157 __com_writeString(port,
"0x");
159 while ((i / d == 0) && (d >= 0x10)) {
164 __com_writeChar(port,(
char)hex[n / d]);
168 __com_writeChar(port,(
char)hex[n]);
171 void __com_pre_formatString(int16_t port,
const char* format,
va_list args){
176 if (format[i] ==
'%') {
180 string = va_arg(args,
char*);
181 __com_writeString(port,
string ?
string :
"(nullptr)");
184 __com_writeChar(port, va_arg(args,
int));
187 __com_writeInt(port,va_arg(args,
int));
190 double a = va_arg(args,
double);
193 __com_writeString(port,
"!0.0000000");
199 __com_writeChar(port,
'-');
202 double rem = a - (int)a;
203 __com_writeInt(port,(
int)a);
204 __com_writeChar(port,
'.');
206 for(
int n = 0; n < 7; n++) {
209 (
unsigned int)(rem * ipow(10, n + 1)) % 10
216 __com_writeInt(port,va_arg(args,
int));
219 __com_writeUInt(port,va_arg(args,
unsigned int));
222 __com_writeHex(port,va_arg(args, uint32_t),
true);
225 __com_writeHex(port,va_arg(args, uint32_t),
false);
228 __com_writeChar(port,format[i]);
232 __com_writeChar(port,format[i]);
243 void __com_formatString(int16_t port,
char *text, ...) {
245 va_start(args, text);
246 if (__com_getInit(1) == 1){
247 __com_pre_formatString(port,text, args);
256 int __com_init(uint16_t port) {
257 outb(port + 1, 0x00);
258 outb(port + 3, 0x80);
259 outb(port + 0, 0x03);
260 outb(port + 1, 0x00);
261 outb(port + 3, 0x03);
262 outb(port + 2, 0xC7);
263 outb(port + 4, 0x0B);
264 outb(port + 4, 0x1E);
265 outb(port + 0, 0xAE);
267 if(inb(port + 0) != 0xAE) {
273 outb(port + 4, 0x0F);
uint32_t mode
Режим работы (0 - Обычный | 1 - Режим логирования)
bool fpu_isInitialized()
Возвращает статус FPU.
size_t strlen(const char *str)
Возращает длину строки