ok, function modal now has full coverage
This commit is contained in:
parent
25803914b3
commit
de013be794
38
boot.subx
38
boot.subx
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue