From cc1aee9834da1ac35a1ba4337520bde2132fcb4f Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Wed, 19 Oct 2016 10:06:37 -0600
Subject: [PATCH] Bootloader fixes on systems with wrong CS

---
 x86_64/bootsector.asm     | 104 +++++++++++++++++---------------------
 x86_64/print16.asm        |   9 ++--
 x86_64/startup-common.asm |   2 +-
 3 files changed, 51 insertions(+), 64 deletions(-)

diff --git a/x86_64/bootsector.asm b/x86_64/bootsector.asm
index 806ae49..11ea087 100644
--- a/x86_64/bootsector.asm
+++ b/x86_64/bootsector.asm
@@ -12,6 +12,14 @@ boot: ; dl comes with disk
     ; initialize stack
     mov sp, 0x7C00
 
+    ; initialize CS
+    push ax
+    push word .set_cs
+    retf
+
+.set_cs:
+
+    ; save disk number
     mov [disk], dl
 
     mov si, name
@@ -45,16 +53,16 @@ boot: ; dl comes with disk
 ; TODO rewrite to (eventually) move larger parts at once
 ; if that is done increase buffer_size_sectors in startup-common to that (max 0x80000 - startup_end)
 load:
-    cmp cx, 128
+    cmp cx, 127
     jbe .good_size
 
     pusha
-    mov cx, 128
+    mov cx, 127
     call load
     popa
-    add ax, 128
-    add dx, 128 * 512 / 16
-    sub cx, 128
+    add ax, 127
+    add dx, 127 * 512 / 16
+    sub cx, 127
 
     jmp load
 .good_size:
@@ -63,31 +71,7 @@ load:
     mov [DAPACK.count], cx
     mov [DAPACK.seg], dx
 
-        mov bx, [DAPACK.addr + 2]
-        call print_num
-
-        mov bx, [DAPACK.addr]
-        call print_num
-
-        mov al, '#'
-        call print_char
-
-        mov bx, [DAPACK.count]
-        call print_num
-
-        mov al, ' '
-        call print_char
-
-        mov bx, [DAPACK.seg]
-        call print_num
-
-        mov al, ':'
-        call print_char
-
-        mov bx, [DAPACK.buf]
-        call print_num
-
-        call print_line
+    call print_dapack
 
     mov dl, [disk]
     mov si, DAPACK
@@ -108,16 +92,16 @@ load:
   ; TODO rewrite to (eventually) move larger parts at once
   ; if that is done increase buffer_size_sectors in startup-common to that (max 0x80000 - startup_end)
   store:
-      cmp cx, 128
+      cmp cx, 127
       jbe .good_size
 
       pusha
-      mov cx, 128
+      mov cx, 127
       call store
       popa
-      add ax, 128
-      add dx, 128 * 512 / 16
-      sub cx, 128
+      add ax, 127
+      add dx, 127 * 512 / 16
+      sub cx, 127
 
       jmp store
   .good_size:
@@ -126,38 +110,41 @@ load:
       mov [DAPACK.count], cx
       mov [DAPACK.seg], dx
 
-          mov bx, [DAPACK.addr + 2]
-          call print_num
+      call print_dapack
+
+      mov dl, [disk]
+      mov si, DAPACK
+      mov ah, 0x43
+      int 0x13
+      jc error
+      ret
 
-          mov bx, [DAPACK.addr]
-          call print_num
+print_dapack:
+    mov bx, [DAPACK.addr + 2]
+    call print_num
 
-          mov al, '#'
-          call print_char
+    mov bx, [DAPACK.addr]
+    call print_num
 
-          mov bx, [DAPACK.count]
-          call print_num
+    mov al, '#'
+    call print_char
 
-          mov al, ' '
-          call print_char
+    mov bx, [DAPACK.count]
+    call print_num
 
-          mov bx, [DAPACK.seg]
-          call print_num
+    mov al, ' '
+    call print_char
 
-          mov al, ':'
-          call print_char
+    mov bx, [DAPACK.seg]
+    call print_num
 
-          mov bx, [DAPACK.buf]
-          call print_num
+    mov al, ':'
+    call print_char
 
-          call print_line
+    mov bx, [DAPACK.buf]
+    call print_num
 
-      mov dl, [disk]
-      mov si, DAPACK
-      mov ah, 0x43
-      int 0x13
-      jc error
-      ret
+    jmp print_line
 
 error:
     mov bh, 0
@@ -180,7 +167,6 @@ error:
 name: db "Redox Loader - Stage One",0
 errored: db "Could not read disk",0
 finished: db "Redox Loader - Stage Two",0
-line: db 13,10,0
 
 disk: db 0
 
diff --git a/x86_64/print16.asm b/x86_64/print16.asm
index 32dc69d..c4a04e1 100644
--- a/x86_64/print16.asm
+++ b/x86_64/print16.asm
@@ -4,7 +4,7 @@ USE16
 
 
 ; a newline
-newline: db 0xD, 0xA, 0
+newline: db 13,10,0
 
 ; print a string and a newline
 ; IN
@@ -13,8 +13,7 @@ newline: db 0xD, 0xA, 0
 ;   ax
 print_line:
     mov si, newline
-    call print
-    ret
+    jmp print
 
 ; print a string
 ; IN
@@ -22,11 +21,13 @@ print_line:
 ; CLOBBER
 ;   ax
 print:
+    cld
+.loop:
     lodsb
     test al, al
     jz .done
     call print_char
-    jmp print
+    jmp .loop
 .done:
     ret
 
diff --git a/x86_64/startup-common.asm b/x86_64/startup-common.asm
index 70b9f96..4bb9df7 100644
--- a/x86_64/startup-common.asm
+++ b/x86_64/startup-common.asm
@@ -14,7 +14,7 @@ startup:
 ; buffersize in multiple of sectors (512 Bytes)
 ; min 1
 ; max (0x70000 - startup_end) / 512
-buffer_size_sectors equ 128
+buffer_size_sectors equ 127
 ; buffer size in Bytes
 buffer_size_bytes equ buffer_size_sectors * 512
 
-- 
GitLab