diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-06-08 18:05:59 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-06-08 18:09:17 -0700 |
commit | de013be794851d41acc8c873d399e0c90546c309 (patch) | |
tree | d47dbf500b83ac67ac2ad657523173bc2e4cd0e0 | |
parent | 25803914b318617ee24c8d61fef6e4d961683039 (diff) | |
download | mu-de013be794851d41acc8c873d399e0c90546c309.tar.gz |
ok, function modal now has full coverage
-rw-r--r-- | boot.subx | 38 | ||||
-rw-r--r-- | shell/environment.mu | 107 | ||||
-rwxr-xr-x | translate_subx | 2 | ||||
-rwxr-xr-x | translate_subx_emulated | 2 |
4 files changed, 132 insertions, 17 deletions
diff --git a/boot.subx b/boot.subx index a06cec44..31d79d4f 100644 --- a/boot.subx +++ b/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 diff --git a/shell/environment.mu b/shell/environment.mu index f78c4597..a86cef8b 100644 --- a/shell/environment.mu +++ b/shell/environment.mu @@ -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 diff --git a/translate_subx b/translate_subx index 30729a06..f52e964d 100755 --- a/translate_subx +++ b/translate_subx @@ -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 diff --git a/translate_subx_emulated b/translate_subx_emulated index 43c7d954..68490ef2 100755 --- a/translate_subx_emulated +++ b/translate_subx_emulated @@ -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 |