load Font in a non-contiguous area of memory

This commit is contained in:
Kartik K. Agaram 2021-08-29 20:34:53 -07:00
parent 354c72a637
commit b1dcfb03d0
5 changed files with 44 additions and 13 deletions

View File

@ -83,7 +83,7 @@ draw-grapheme-on-screen-buffer: # buffer: (addr byte), g: grapheme, x: int, y:
0f 8d/jump-if->= $draw-grapheme-on-screen-buffer:end/disp32
# var letter-bitmap/esi = font[g]
69/multiply %esi 0x21/imm32/glyph-size 6/r32/esi
81 0/subop/add %esi Font/imm32
81 0/subop/add %esi 0x0010000c/imm32/Font # see boot.subx
# dispatch based on letter-bitmap->size
b8/copy-to-eax 0/imm32
8a/byte-> *esi 0/r32/AL
@ -116,7 +116,7 @@ wide-grapheme?: # g: grapheme -> _/eax: boolean
0f 8d/jump-if->= $wide-grapheme?:end/disp32
# var letter-bitmap/eax = font[g]
69/multiply %eax 0x21/imm32/glyph-size 0/r32/eax
05/add-to-eax Font/imm32
05/add-to-eax 0x0010000c/imm32/Font # see boot.subx
# dispatch based on letter-bitmap->size
8a/byte-> *eax 0/r32/AL
25/and-eax-with 0xff/imm32

View File

@ -16,6 +16,7 @@
# Memory map of a Mu computer:
# code: [0x00007c00, 0x0007de00)
# system font: [0x00100000, 0x00f00000)
# stack: (0x02000000, 0x01000000]
# heap: [0x02000000, 0x80000000)
# see 120allocate.subx; Qemu initializes with 128MB RAM by default; simulating 2GB RAM is known to work
@ -275,6 +276,13 @@ initialize_32bit_mode:
bc/copy-to-esp 0x02000000/imm32
## install the font somewhere non-contiguous (keep sync'd with memory map up top)
c7 0/subop/copy *0x00100000 0/imm32/read
c7 0/subop/copy *0x00100004 0/imm32/write
c7 0/subop/copy *0x00100008 0x00e00000/imm32/size
(load-sectors Primary-bus-primary-drive 0x2328 0x120 0x00100000) # source 0x2328 = sector 9000 on disk, destination 0x00100000
# Font is now loaded starting at 0x0010000c.
## load interrupt handlers
# We can't refer to the label directly because SubX doesn't do the right
# thing for lidt, so rather than make errors worse in most places we instead

View File

@ -11,9 +11,6 @@
# * If it's 16, the glyph is 16 pixels wide, and each row consists of two
# bytes.
== data
Font:
# 0x00-0x1f: unprintable ASCII
08/size # nul character hard-coded to 8 bits wide
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # nul character hard-coded to blank

View File

@ -6,7 +6,9 @@ set -e
# Map of the Mu code disk
export DISK=20160 # 20*16*63 512-byte sectors = almost 10MB
dd if=/dev/zero of=code.img count=$DISK
# code: sectors 0-10079
# code: sectors 0-8999
# font: sectors 9000-10079 (1080 sectors = space enough for 16k glyphs (1080 * 512 / 33 bytes per glyph))
export FONT=9000 # keep this sync'd with boot.subx
# debug: sector 10080 onwards
export DEBUG=10080
@ -14,7 +16,7 @@ export DEBUG=10080
cat $* [0-9]*.mu |linux/mu > a.subx
cat boot.subx font.subx mu-init.subx [0-9]*.subx a.subx |linux/braces > a.braces
cat boot.subx mu-init.subx [0-9]*.subx a.subx |linux/braces > a.braces
cat a.braces |linux/calls > a.calls
@ -47,9 +49,9 @@ then
exit 1
fi
if [ `stat --printf="%s" a.bin` -ge $(($DEBUG*512)) ]
if [ `stat --printf="%s" a.bin` -ge $(($FONT*512)) ]
then
echo "a.bin will overwrite debug info on disk"
echo "a.bin will overwrite font in disk"
exit 1
fi
@ -68,3 +70,14 @@ then
fi
dd if=labels of=code.img seek=$DEBUG conv=notrunc # keep this sync'd with abort.subx
## Some space for font data at another well-defined location
cat font.subx |sed 's,#.*,,' |sed 's,/[^ ]*,,' |linux/hex > a.font
if [ `stat --printf="%s" a.bin` -ge $(( ($DEBUG - $FONT) * 512 )) ]
then
echo "font will overwrite debug info in disk"
exit 1
fi
dd if=a.font of=code.img seek=$FONT conv=notrunc

View File

@ -10,7 +10,9 @@ set -v
# Map of the Mu code disk
export DISK=20160 # 20*16*63 512-byte sectors = almost 10MB
dd if=/dev/zero of=code.img count=$DISK
# code: sectors 0-10079
# code: sectors 0-8999
# font: sectors 9000-10079 (1080 sectors = space enough for 16k glyphs (1080 * 512 / 33 bytes per glyph))
export FONT=9000
# debug: sector 10080 onwards
export DEBUG=10080
@ -18,7 +20,7 @@ export DEBUG=10080
cat $* [0-9]*.mu |linux/bootstrap/bootstrap run linux/mu > a.subx
cat boot.subx font.subx mu-init.subx [0-9]*.subx a.subx |linux/bootstrap/bootstrap run linux/braces > a.braces
cat boot.subx mu-init.subx [0-9]*.subx a.subx |linux/bootstrap/bootstrap run linux/braces > a.braces
cat a.braces |linux/bootstrap/bootstrap run linux/calls > a.calls
@ -51,9 +53,9 @@ then
exit 1
fi
if [ `stat --printf="%s" a.bin` -ge $(($DEBUG*512)) ]
if [ `stat --printf="%s" a.bin` -ge $(($FONT*512)) ]
then
echo "a.bin will overwrite debug info on disk"
echo "a.bin will overwrite font in disk"
exit 1
fi
@ -72,3 +74,14 @@ then
fi
dd if=labels of=code.img seek=$DEBUG conv=notrunc # keep this sync'd with abort.subx
## Some space for font data at another well-defined location
cat font.subx |sed 's,#.*,,' |sed 's,/[^ ]*,,' |linux/hex > a.font
if [ `stat --printf="%s" a.bin` -ge $(( ($DEBUG - $FONT) * 512 )) ]
then
echo "font will overwrite debug info in disk"
exit 1
fi
dd if=a.font of=code.img seek=$FONT conv=notrunc