From 91d7affc233a97da68f886b663f440399c3a0037 Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Wed, 23 Apr 2025 01:31:43 +0200 Subject: [PATCH 1/3] kout --- arch/serial.cc | 15 +++++++++------ device/serialstream.cc | 5 ++++- device/serialstream.h | 3 +++ device/textstream.cc | 3 --- main.cc | 39 +++++++++++++++++++++++++++------------ object/stringbuffer.cc | 6 +++++- tools/qemu.mk | 2 +- 7 files changed, 49 insertions(+), 24 deletions(-) diff --git a/arch/serial.cc b/arch/serial.cc index 2a6b2bc..8b7e5df 100644 --- a/arch/serial.cc +++ b/arch/serial.cc @@ -40,10 +40,13 @@ char Serial::readReg(RegisterIndex reg) { } int Serial::write(char out) { - // TODO: Implement - if(readReg(LINE_STATUS_REGISTER) & TRANSMITTER_EMPTY){ - writeReg(TRANSMIT_BUFFER_REGISTER, out); - return out; - } - return -1; + //TODO fix behavior when \r\n ist actually sent + if(out == '\n') + write('\r'); + + if(readReg(LINE_STATUS_REGISTER) & TRANSMITTER_EMPTY){ + writeReg(TRANSMIT_BUFFER_REGISTER, out); + return out; + } + return -1; } diff --git a/device/serialstream.cc b/device/serialstream.cc index bb029f1..6d3f7e9 100644 --- a/device/serialstream.cc +++ b/device/serialstream.cc @@ -5,8 +5,11 @@ SerialStream::SerialStream(ComPort port, BaudRate baud_rate, DataBits data_bits, StopBits stop_bits, Parity parity) :Serial(port, baud_rate, data_bits, stop_bits, parity) {} +SerialStream kout = SerialStream(); + void SerialStream::flush() { - print(buffer, strlen(buffer)); + print(buffer, pos); + pos = 0; } // https://stackoverflow.com/questions/3440726/what-is-the-proper-way-of-implementing-a-good-itoa-function diff --git a/device/serialstream.h b/device/serialstream.h index 83450ee..5e1122b 100644 --- a/device/serialstream.h +++ b/device/serialstream.h @@ -141,3 +141,6 @@ class SerialStream : public OutputStream, public Serial { */ void print(char* str, int length); }; + +extern SerialStream kout; + diff --git a/device/textstream.cc b/device/textstream.cc index b7dd125..0a210d3 100644 --- a/device/textstream.cc +++ b/device/textstream.cc @@ -15,7 +15,4 @@ TextStream::TextStream(unsigned from_col, void TextStream::flush() { print(buffer,pos); pos = 0; - - - } diff --git a/main.cc b/main.cc index a6c23e7..37e36d6 100644 --- a/main.cc +++ b/main.cc @@ -38,18 +38,33 @@ extern "C" int main() { //Serial s = Serial(); //s.write('a'); - // test SerialStream - SerialStream ss = SerialStream(); - ss.print("test", 4); - ss.setAttribute(SerialStream::UNDERSCORE); - ss.print("test", 4); - ss.setAttribute(SerialStream::RESET); - ss.setForeground(SerialStream::MAGENTA); - ss.print("test", 4); - ss.setBackground(SerialStream::CYAN); - ss.print("test", 4); - ss.setPos(10, 10); - ss.print("test", 4); + //// test SerialStream + //SerialStream ss = SerialStream(); + //ss.print("test", 4); + //ss.setAttribute(SerialStream::UNDERSCORE); + //ss.print("test", 4); + //ss.setAttribute(SerialStream::RESET); + //ss.setForeground(SerialStream::MAGENTA); + //ss.print("test", 4); + //ss.setBackground(SerialStream::CYAN); + //ss.print("test", 4); + //ss.setPos(10, 10); + //ss.print("test", 4); + + kout << "Test -> " << endl; + kout << "bool: " << true << " -> true" << endl; + kout << "zero: " << 0 << " -> 0" << endl; + kout << "binary: " << bin << 42 << dec << " -> 0b101010" << endl; + kout << "octal: " << oct << 42 << dec << " -> 052" << endl; + kout << "hex: " << hex << 42 << dec << " -> 0x2a" << endl; + kout << "uint64_t max: " << ~((uint64_t)0) << " -> 18446744073709551615" << endl; + kout << "int64_t max: " << ~(1ll<<63) << " -> 9223372036854775807" << endl; + kout << "int64_t min: " << (1ll<<63) << " -> -9223372036854775808" << endl; + kout << "some int64_t: " << (-1234567890123456789) << " -> -1234567890123456789" << endl; + kout << "some int64_t: " << (1234567890123456789) << " -> 1234567890123456789" << endl; + kout << "pointer: " << reinterpret_cast(1994473406541717165ull) + << " -> 0x1badcafefee1dead" << endl; + kout << "smiley: " << static_cast(1) << endl; /* Start application processors * To avoid unexpected behaviour, make sure that interrupts are not diff --git a/object/stringbuffer.cc b/object/stringbuffer.cc index c0f0903..bbdb312 100644 --- a/object/stringbuffer.cc +++ b/object/stringbuffer.cc @@ -1,3 +1,7 @@ #include "stringbuffer.h" -void Stringbuffer::put(char c) { (void)c; } +void Stringbuffer::put(char c) { + buffer[pos++] = c; + if(pos > 80) + flush(); +} diff --git a/tools/qemu.mk b/tools/qemu.mk index 7526310..af6fbff 100644 --- a/tools/qemu.mk +++ b/tools/qemu.mk @@ -59,7 +59,7 @@ kvm: all # Execute Qemu with activated GDB stub and directly connect GDB to the spawned Qemu. gdb: all - ${VERBOSE} $(GDB) "$(DBGKERNEL)" \ + ${VERBOSE} cgdb -d $(GDB) "$(DBGKERNEL)" \ -ex "set arch $(DBGARCH)" \ -ex "target remote | exec $(QEMU) -gdb stdio $(QEMUKERNEL) -smp $(QEMUCPUS) -S $(QEMUFLAGS) $(DBGFLAGS)" From 8b0354b709b917dc25ecd9ae445eb2a70efeadd9 Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Wed, 23 Apr 2025 02:05:37 +0200 Subject: [PATCH 2/3] remove itoa hack --- device/serialstream.cc | 59 ++++++++++---------------------------------------- main.cc | 25 +++++++++++---------- 2 files changed, 24 insertions(+), 60 deletions(-) diff --git a/device/serialstream.cc b/device/serialstream.cc index 6d3f7e9..80179a0 100644 --- a/device/serialstream.cc +++ b/device/serialstream.cc @@ -8,55 +8,15 @@ SerialStream::SerialStream(ComPort port, BaudRate baud_rate, DataBits data_bits, SerialStream kout = SerialStream(); void SerialStream::flush() { - print(buffer, pos); - pos = 0; -} - -// https://stackoverflow.com/questions/3440726/what-is-the-proper-way-of-implementing-a-good-itoa-function -// Yet, another good itoa implementation -// returns: the length of the number string -int itoa(int value, char *sp, int radix) -{ - char tmp[16];// be careful with the length of the buffer - char *tp = tmp; - int i; - unsigned v; - - int sign = (radix == 10 && value < 0); - if (sign) - v = -value; - else - v = (unsigned)value; - - while (v || tp == tmp) - { - i = v % radix; - v /= radix; - if (i < 10) - *tp++ = i+'0'; - else - *tp++ = i + 'a' - 10; - } - - int len = tp - tmp; - - if (sign) - { - *sp++ = '-'; - len++; - } - - while (tp > tmp) - *sp++ = *--tp; - - return len; + print(kout.buffer, kout.pos); + kout.pos = 0; } void SerialStream::setForeground(Color c) { write(0x1b); write('['); - write('3'); - write(c + 0x30); + kout << 30+c; + flush(); write('m'); } @@ -82,10 +42,13 @@ void SerialStream::reset() { void SerialStream::setPos(int x, int y) { //char out[] = {0x1b, '[', 0, 0, ';', 0, 0, 'H', 0}; - *this << 0x1b; - *this << '['; - *this << dec << x; - *this << ';' << y << 'H' << endl; + //*this << 0x1b; + write(0x1b); + kout << '['; + kout << dec << x; + kout << ';'; + kout << dec << y; + kout << 'H'; flush(); //itoa(x, &out[2], 10); //itoa(y, &out[5], 10); diff --git a/main.cc b/main.cc index 37e36d6..435920d 100644 --- a/main.cc +++ b/main.cc @@ -38,18 +38,19 @@ extern "C" int main() { //Serial s = Serial(); //s.write('a'); - //// test SerialStream - //SerialStream ss = SerialStream(); - //ss.print("test", 4); - //ss.setAttribute(SerialStream::UNDERSCORE); - //ss.print("test", 4); - //ss.setAttribute(SerialStream::RESET); - //ss.setForeground(SerialStream::MAGENTA); - //ss.print("test", 4); - //ss.setBackground(SerialStream::CYAN); - //ss.print("test", 4); - //ss.setPos(10, 10); - //ss.print("test", 4); + // test SerialStream + SerialStream ss = SerialStream(); + ss.print("test", 4); + ss.setAttribute(SerialStream::UNDERSCORE); + ss.print("test", 4); + ss.setAttribute(SerialStream::RESET); + ss.setForeground(SerialStream::MAGENTA); + ss.print("test", 4); + ss.setBackground(SerialStream::CYAN); + ss.print("test", 4); + ss.setPos(10, 10); + ss.print("test\n", 5); + ss.setBackground(SerialStream::BLACK); kout << "Test -> " << endl; kout << "bool: " << true << " -> true" << endl; From 4fd8b7d749db20847fe8f12abb9b0c42b05d4960 Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Fri, 25 Apr 2025 17:53:15 +0200 Subject: [PATCH 3/3] rename serial output to sout --- device/serialstream.cc | 18 +++++++++--------- device/serialstream.h | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/device/serialstream.cc b/device/serialstream.cc index 80179a0..7313626 100644 --- a/device/serialstream.cc +++ b/device/serialstream.cc @@ -5,17 +5,17 @@ SerialStream::SerialStream(ComPort port, BaudRate baud_rate, DataBits data_bits, StopBits stop_bits, Parity parity) :Serial(port, baud_rate, data_bits, stop_bits, parity) {} -SerialStream kout = SerialStream(); +SerialStream sout = SerialStream(); void SerialStream::flush() { - print(kout.buffer, kout.pos); - kout.pos = 0; + print(sout.buffer, sout.pos); + sout.pos = 0; } void SerialStream::setForeground(Color c) { write(0x1b); write('['); - kout << 30+c; + sout << 30+c; flush(); write('m'); } @@ -44,11 +44,11 @@ void SerialStream::setPos(int x, int y) { //char out[] = {0x1b, '[', 0, 0, ';', 0, 0, 'H', 0}; //*this << 0x1b; write(0x1b); - kout << '['; - kout << dec << x; - kout << ';'; - kout << dec << y; - kout << 'H'; + sout << '['; + sout << dec << x; + sout << ';'; + sout << dec << y; + sout << 'H'; flush(); //itoa(x, &out[2], 10); //itoa(y, &out[5], 10); diff --git a/device/serialstream.h b/device/serialstream.h index 5e1122b..d1708ff 100644 --- a/device/serialstream.h +++ b/device/serialstream.h @@ -142,5 +142,5 @@ class SerialStream : public OutputStream, public Serial { void print(char* str, int length); }; -extern SerialStream kout; +extern SerialStream sout;