Hi und willkommen an Board!
Ich nehme mal an, dass du zwei Variablen x und y hast, die die Position des Cursors speichern. Mal angenommen du hast gerade "Hello World" in die erste Zeile geschrieben, dann ist y = 0 und x = 11. Bei einem \n musst du nun die Zeichen in der Zeile y im Bereich von 11 (= x) bis 79 mit Leerzeichen überschreiben. Manche lassen das am Anfang weg, aber dann schauts doof aus, wenn noch was auf dem Bildschirm steht. Anschließend musst du noch y um 1 erhöhen und x auf 0 setzen. Dann bist du in der nächsten Zeile.
Allerdings musst du einen Spezialfall betrachten: Wenn du in der letzten Zeile bist (d.h. y = 24), dann musst du den Bildschirm um eine Zeile hochscrollen. Dazu kannst du einfach prüfen, ob y den Wert 25 hat, nachdem du es eben gerade erhöht hast. Wenn ja, musst du y wieder um 1 verringern, und alle Zeilen von y = 0 bis y = 23 um ein Zeile nach oben kopieren. Das kannst du entweder manuell mit Schleifen machen oder mit memcpy:
unsigned short *video = (unsigned short *)0xb8000; // so eine Variable hast du hoffentlich irgendwo
memcpy(video, (void *)(((uintptr_t)video) + 2 * 80), 24 * 80);
und anschließend die letzte Zeile (24) leeren, z.B. auch manuell oder mit memset.memset((void *)(((uintptr_t)video) + 24 * 80 * 2), 0, 160);
Die ganzen Casts solltest du vielleicht noch etwas vereinfachen, je nachdem wie video bei dir tatsächlich deklariert ist.