ok, function modal now has full coverage

This commit is contained in:
Kartik K. Agaram 2021-06-08 18:05:59 -07:00
parent 25803914b3
commit de013be794
4 changed files with 132 additions and 17 deletions

View File

@ -136,6 +136,20 @@
cd/syscall 0x13/imm8/bios-disk-services
0f 82/jump-if-carry disk_error/disp16
# load two more tracks of disk into addresses [0x56800, 0x66400)
b4/copy-to-ah 2/imm8/read-drive
# dl comes conveniently initialized at boot time with the index of the device being booted
b5/copy-to-ch 0/imm8/cylinder
b6/copy-to-dh 0xa/imm8/head # <====
b1/copy-to-cl 1/imm8/sector # 1-based
b0/copy-to-al 0x7e/imm8/num-sectors # 2*63 = 126
# address to write sectors to = es:bx = 0x56800, contiguous with boot segment
bb/copy-to-bx 0x5680/imm16 # <====
8e/->seg 3/mod/direct 3/rm32/bx 0/r32/es
bb/copy-to-bx 0/imm16
cd/syscall 0x13/imm8/bios-disk-services
0f 82/jump-if-carry disk_error/disp16
# reset es
bb/copy-to-bx 0/imm16
8e/->seg 3/mod/direct 3/rm32/bx 0/r32/es
@ -162,7 +176,7 @@
# We can't refer to the label directly because SubX doesn't do the right
# thing for lgdt, so rather than make errors worse in most places we instead
# pin gdt_descriptor below.
0f 01 2/subop/lgdt 0/mod/indirect 6/rm32/use-disp16 0x7ce0/disp16/gdt_descriptor
0f 01 2/subop/lgdt 0/mod/indirect 6/rm32/use-disp16 0x7de0/disp16/gdt_descriptor
# enable paging
0f 20/<-cr 3/mod/direct 0/rm32/eax 0/r32/cr0
66 83 1/subop/or 3/mod/direct 0/rm32/eax 1/imm8 # eax <- or 0x1
@ -170,7 +184,7 @@
# far jump to initialize_32bit_mode that sets cs to offset 8 in the gdt in the process
# We can't refer to the label directly because SubX doesn't have syntax for
# segment selectors. So we instead pin initialize_32bit_mode below.
ea/jump-far-absolute 0x00087d00/disp32 # address 0x7d00 in offset 8 of the gdt
ea/jump-far-absolute 0x00087e00/disp32 # address 0x7e00 in offset 8 of the gdt
disk_error:
# print 'D' to top-left of screen to indicate disk error
@ -187,7 +201,7 @@ disk_error:
}
## GDT: 3 records of 8 bytes each
== data 0x7ce0
== data 0x7de0
gdt_descriptor:
0x17/imm16 # final index of gdt = size of gdt - 1
gdt_start/imm32/start
@ -212,9 +226,15 @@ gdt_start:
00 # base[24:32]
# gdt_end:
== boot-sector-marker 0x7dfe
# final 2 bytes of boot sector
55 aa
## sector 2 onwards loaded by load_disk, not automatically on boot
## 32-bit code from this point
== code 0x7d00
== code 0x7e00
initialize_32bit_mode:
66 b8/copy-to-ax 0x10/imm16 # offset 16 from gdt_start
8e/->seg 3/mod/direct 0/rm32/ax 3/r32/ds
@ -229,7 +249,7 @@ initialize_32bit_mode:
# 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
# pin idt_descriptor below.
0f 01 3/subop/lidt 0/mod/indirect 5/rm32/use-disp32 0x7e00/disp32/idt_descriptor
0f 01 3/subop/lidt 0/mod/indirect 5/rm32/use-disp32 0x7f00/disp32/idt_descriptor
# For now, not bothering reprogramming the IRQ to not conflict with software
# exceptions.
@ -259,13 +279,7 @@ initialize_32bit_mode:
e9/jump Entry/disp32
== boot-sector-marker 0x7dfe
# final 2 bytes of boot sector
55 aa
## sector 2 onwards loaded by load_disk, not automatically on boot
== data 0x7e00
== data 0x7f00
idt_descriptor:
ff 03 # final index of idt = size of idt - 1
idt_start/imm32/start

View File

@ -323,7 +323,7 @@ fn test-function-modal {
var screen/edi: (addr screen) <- address screen-on-stack
initialize-screen screen, 0x80/width=72, 0x10/height, 0/no-pixel-graphics
# hit ctrl-g
edit-environment env, 0x7/ctrl-g, 0/no-disk
edit-environment env, 7/ctrl-g, 0/no-disk
render-environment screen, env
#
check-background-color-in-screen-row screen, 0xf/bg=modal, 0/y, " ", "F - test-function-modal/0"
@ -358,7 +358,7 @@ fn test-leave-function-modal {
var screen/edi: (addr screen) <- address screen-on-stack
initialize-screen screen, 0x80/width=72, 0x10/height, 0/no-pixel-graphics
# hit ctrl-g
edit-environment env, 0x7/ctrl-g, 0/no-disk
edit-environment env, 7/ctrl-g, 0/no-disk
render-environment screen, env
# cancel
edit-environment env, 0x1b/escape, 0/no-disk
@ -395,7 +395,7 @@ fn test-jump-to-function {
edit-environment env, 0x13/ctrl-s, 0/no-disk
render-environment screen, env
# hit ctrl-g
edit-environment env, 0x7/ctrl-g, 0/no-disk
edit-environment env, 7/ctrl-g, 0/no-disk
render-environment screen, env
# type function name
type-in env, screen, "fn1"
@ -425,6 +425,107 @@ fn test-jump-to-function {
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xf/y, " ", "F - test-jump-to-function/bg15"
}
fn test-function-modal-prepopulates-word-at-cursor {
var env-storage: environment
var env/esi: (addr environment) <- address env-storage
initialize-environment env
# setup: screen
var screen-on-stack: screen
var screen/edi: (addr screen) <- address screen-on-stack
initialize-screen screen, 0x80/width=72, 0x10/height, 0/no-pixel-graphics
# type a word at the cursor
type-in env, screen, "fn1"
# hit ctrl-g
edit-environment env, 7/ctrl-g, 0/no-disk
render-environment screen, env
# modal prepopulates word at cursor
check-background-color-in-screen-row screen, 0xf/bg=modal, 0/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/0"
check-background-color-in-screen-row screen, 0xf/bg=modal, 1/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/1"
check-background-color-in-screen-row screen, 0xf/bg=modal, 2/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/2"
check-background-color-in-screen-row screen, 0xf/bg=modal, 3/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/3"
check-background-color-in-screen-row screen, 0xf/bg=modal, 4/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/4"
check-background-color-in-screen-row screen, 0xf/bg=modal, 5/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/5"
check-screen-row screen, 6/y, " go to function (or leave blank to go to REPL) ", "F - test-function-modal-prepopulates-word-at-cursor/6-text"
check-background-color-in-screen-row screen, 0xf/bg=modal, 6/y, " ................................................................ ", "F - test-function-modal-prepopulates-word-at-cursor/6"
check-background-color-in-screen-row screen, 0xf/bg=modal, 7/y, " ................................................................ ", "F - test-function-modal-prepopulates-word-at-cursor/7"
# word at cursor
check-screen-row screen, 8/y, " fn1 ", "F - test-function-modal-prepopulates-word-at-cursor/8-text"
# new cursor position
check-background-color-in-screen-row screen, 0/bg=cursor, 8/y, " | ", "F - test-function-modal-prepopulates-word-at-cursor/8-cursor"
check-background-color-in-screen-row screen, 0xf/bg=modal, 8/y, " ... ............................................................ ", "F - test-function-modal-prepopulates-word-at-cursor/8"
check-background-color-in-screen-row screen, 0xf/bg=modal, 9/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/9"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xa/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/10"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xb/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/11"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xc/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/12"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xd/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/13"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xe/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/14"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xf/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/15"
# cancel
edit-environment env, 0x1b/escape, 0/no-disk
render-environment screen, env
# type one more space
edit-environment env, 0x20/space, 0/no-disk
render-environment screen, env
# hit ctrl-g again
edit-environment env, 7/ctrl-g, 0/no-disk
render-environment screen, env
# no word prepopulated since cursor is not on the word
check-background-color-in-screen-row screen, 0xf/bg=modal, 0/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-0"
check-background-color-in-screen-row screen, 0xf/bg=modal, 1/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-1"
check-background-color-in-screen-row screen, 0xf/bg=modal, 2/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-2"
check-background-color-in-screen-row screen, 0xf/bg=modal, 3/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-3"
check-background-color-in-screen-row screen, 0xf/bg=modal, 4/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-4"
check-background-color-in-screen-row screen, 0xf/bg=modal, 5/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-5"
check-screen-row screen, 6/y, " go to function (or leave blank to go to REPL) ", "F - test-function-modal-prepopulates-word-at-cursor/test2-6-text"
check-background-color-in-screen-row screen, 0xf/bg=modal, 6/y, " ................................................................ ", "F - test-function-modal-prepopulates-word-at-cursor/test2-6"
check-background-color-in-screen-row screen, 0xf/bg=modal, 7/y, " ................................................................ ", "F - test-function-modal-prepopulates-word-at-cursor/test2-7"
# no word at cursor
check-screen-row screen, 8/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-8-text"
# new cursor position
check-background-color-in-screen-row screen, 0/bg=cursor, 8/y, " | ", "F - test-function-modal-prepopulates-word-at-cursor/test2-8-cursor"
check-background-color-in-screen-row screen, 0xf/bg=modal, 8/y, " ............................................................... ", "F - test-function-modal-prepopulates-word-at-cursor/test2-8"
check-background-color-in-screen-row screen, 0xf/bg=modal, 9/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-9"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xa/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-10"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xb/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-11"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xc/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-12"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xd/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-13"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xe/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-14"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xf/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test2-15"
# cancel
edit-environment env, 0x1b/escape, 0/no-disk
render-environment screen, env
# move cursor to the left until it's on the word again
edit-environment env, 0x80/left-arrow, 0/no-disk
render-environment screen, env
edit-environment env, 0x80/left-arrow, 0/no-disk
render-environment screen, env
# hit ctrl-g again
edit-environment env, 7/ctrl-g, 0/no-disk
render-environment screen, env
# word prepopulated like before
check-background-color-in-screen-row screen, 0xf/bg=modal, 0/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-0"
check-background-color-in-screen-row screen, 0xf/bg=modal, 1/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-1"
check-background-color-in-screen-row screen, 0xf/bg=modal, 2/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-2"
check-background-color-in-screen-row screen, 0xf/bg=modal, 3/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-3"
check-background-color-in-screen-row screen, 0xf/bg=modal, 4/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-4"
check-background-color-in-screen-row screen, 0xf/bg=modal, 5/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-5"
check-screen-row screen, 6/y, " go to function (or leave blank to go to REPL) ", "F - test-function-modal-prepopulates-word-at-cursor/test3-6-text"
check-background-color-in-screen-row screen, 0xf/bg=modal, 6/y, " ................................................................ ", "F - test-function-modal-prepopulates-word-at-cursor/test3-6"
check-background-color-in-screen-row screen, 0xf/bg=modal, 7/y, " ................................................................ ", "F - test-function-modal-prepopulates-word-at-cursor/test3-7"
# word at cursor
check-screen-row screen, 8/y, " fn1 ", "F - test-function-modal-prepopulates-word-at-cursor/test3-8-text"
# new cursor position
check-background-color-in-screen-row screen, 0/bg=cursor, 8/y, " | ", "F - test-function-modal-prepopulates-word-at-cursor/test3-8-cursor"
check-background-color-in-screen-row screen, 0xf/bg=modal, 8/y, " ... ............................................................ ", "F - test-function-modal-prepopulates-word-at-cursor/test3-8"
check-background-color-in-screen-row screen, 0xf/bg=modal, 9/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-9"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xa/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-10"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xb/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-11"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xc/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-12"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xd/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-13"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xe/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-14"
check-background-color-in-screen-row screen, 0xf/bg=modal, 0xf/y, " ", "F - test-function-modal-prepopulates-word-at-cursor/test3-15"
}
fn render-function-modal screen: (addr screen), _self: (addr environment) {
var self/esi: (addr environment) <- copy _self
var width/eax: int <- copy 0

View File

@ -35,7 +35,7 @@ cat a.survey |linux/hex > a.bin
dd if=/dev/zero of=code.img count=20160 # 20*16*63 512-byte sectors = almost 10MB
dd if=a.bin of=code.img conv=notrunc
if [ `stat --printf="%s" a.bin` -ge 322560 ] # 10 tracks * 63 sectors per track * 512 bytes per sector (keep this sync'd with boot.subx)
if [ `stat --printf="%s" a.bin` -ge 387072 ] # 12 tracks * 63 sectors per track * 512 bytes per sector (keep this sync'd with boot.subx)
then
echo "a.bin won't all be loaded on boot"
exit 1

View File

@ -39,7 +39,7 @@ cat a.survey |linux/bootstrap/bootstrap run linux/hex
dd if=/dev/zero of=code.img count=20160 # 20*16*63 512-byte sectors = almost 10MB
dd if=a.bin of=code.img conv=notrunc
if [ `stat --printf="%s" a.bin` -ge 322560 ] # 10 tracks * 63 sectors per track * 512 bytes per sector (keep this sync'd with boot.subx)
if [ `stat --printf="%s" a.bin` -ge 387072 ] # 12 tracks * 63 sectors per track * 512 bytes per sector (keep this sync'd with boot.subx)
then
echo "a.bin won't all be loaded on boot"
exit 1