diff --git a/ueforth/Makefile b/ueforth/Makefile index 8e10567..f6dadcd 100644 --- a/ueforth/Makefile +++ b/ueforth/Makefile @@ -156,7 +156,7 @@ POSIX_BOOT = common/boot.fs common/conditionals.fs common/vocabulary.fs \ common/hide_calls.fs common/ansi.fs common/floats.fs \ posix/posix.fs posix/posix_highlevel.fs posix/termios.fs \ common/tasks.fs common/utils.fs common/highlevel.fs common/filetools.fs \ - common/locals.fs posix/posix_desktop.fs \ + common/locals.fs common/desktop.fs posix/posix_desktop.fs \ common/streams.fs common/blocks.fs \ posix/sockets.fs posix/telnetd.fs posix/httpd.fs posix/web_interface.fs \ posix/autoboot.fs \ @@ -167,8 +167,10 @@ $(GEN)/posix_boot.h: common/source_to_string.js $(POSIX_BOOT) | $(GEN) WINDOWS_BOOT = common/boot.fs common/conditionals.fs common/vocabulary.fs \ common/hide_calls.fs common/ansi.fs common/floats.fs \ windows/windows.fs windows/windows_highlevel.fs common/highlevel.fs \ - common/tasks.fs common/utils.fs common/filetools.fs common/streams.fs \ + common/tasks.fs common/utils.fs common/locals.fs common/desktop.fs \ + common/filetools.fs common/streams.fs \ common/blocks.fs common/locals.fs \ + posix/autoboot.fs \ common/fini.fs $(GEN)/windows_boot.h: common/source_to_string.js $(WINDOWS_BOOT) | $(GEN) $< -win boot $(VERSION) $(REVISION) $(WINDOWS_BOOT) >$@ diff --git a/ueforth/common/desktop.fs b/ueforth/common/desktop.fs new file mode 100644 index 0000000..132a2eb --- /dev/null +++ b/ueforth/common/desktop.fs @@ -0,0 +1,20 @@ +\ Copyright 2021 Bradley D. Nelson +\ +\ Licensed under the Apache License, Version 2.0 (the "License"); +\ you may not use this file except in compliance with the License. +\ You may obtain a copy of the License at +\ +\ http://www.apache.org/licenses/LICENSE-2.0 +\ +\ Unless required by applicable law or agreed to in writing, software +\ distributed under the License is distributed on an "AS IS" BASIS, +\ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +\ See the License for the specific language governing permissions and +\ limitations under the License. + +forth definitions internals + +: argc ( -- n ) 'argc @ ; +: argv ( n -- a n ) cells 'argv @ + @ z>s ; + +forth diff --git a/ueforth/common/opcodes.h b/ueforth/common/opcodes.h index cb5e5b5..618bdc1 100644 --- a/ueforth/common/opcodes.h +++ b/ueforth/common/opcodes.h @@ -65,10 +65,12 @@ typedef int64_t dcell_t; Y(OVER, DUP; tos = sp[-1]) \ Y(DROP, DROP) \ X("@", AT, tos = *(cell_t *) tos) \ - X("L@", LAT, tos = *(int32_t *) tos) \ + X("SL@", SLAT, tos = *(int32_t *) tos) \ + X("SW@", SWAT, tos = *(int16_t *) tos) \ X("C@", CAT, tos = *(uint8_t *) tos) \ X("!", STORE, *(cell_t *) tos = *sp--; DROP) \ X("L!", LSTORE, *(int32_t *) tos = *sp--; DROP) \ + X("W!", WSTORE, *(int16_t *) tos = *sp--; DROP) \ X("C!", CSTORE, *(uint8_t *) tos = *sp--; DROP) \ X("SP@", SPAT, DUP; tos = (cell_t) sp) \ X("SP!", SPSTORE, sp = (cell_t *) tos; DROP) \ diff --git a/ueforth/posix/posix.fs b/ueforth/posix/posix.fs index 8ed7049..9430f8a 100644 --- a/ueforth/posix/posix.fs +++ b/ueforth/posix/posix.fs @@ -30,7 +30,7 @@ posix : sysfunc ( z n "name" -- ) 0 sofunc ; : shared-library ( z "name" -- ) RTLD_NOW dlopen dup 0= throw create , does> @ sofunc ; -: sign-extend ( n -- n ) >r rp@ l@ rdrop ; +: sign-extend ( n -- n ) >r rp@ sl@ rdrop ; ( Major Syscalls ) z" open" 3 sysfunc open @@ -66,7 +66,7 @@ z" readdir" 1 sysfunc readdir ( Errno ) z" __errno_location" 0 sysfunc __errno_location -: errno ( -- n ) __errno_location l@ ; +: errno ( -- n ) __errno_location sl@ ; ( Default Pipes ) 0 constant stdin diff --git a/ueforth/posix/posix_desktop.fs b/ueforth/posix/posix_desktop.fs index 4f76cb6..8fffe09 100644 --- a/ueforth/posix/posix_desktop.fs +++ b/ueforth/posix/posix_desktop.fs @@ -12,11 +12,9 @@ \ See the License for the specific language governing permissions and \ limitations under the License. -( Arguments ) forth definitions internals -: argc ( -- n ) 'argc @ ; -: argv ( n -- a n ) cells 'argv @ + @ z>s ; ( Load Libraries ) : xlib s" posix/xlib_test.fs" included ; + forth diff --git a/ueforth/posix/termios.fs b/ueforth/posix/termios.fs index f4e42d7..6564e05 100644 --- a/ueforth/posix/termios.fs +++ b/ueforth/posix/termios.fs @@ -39,7 +39,7 @@ create new-termios sizeof(termios) allot : termios! ( a -- ) stdin TCSAFLUSH rot tcsetattr throw ; old-termios termios@ : raw-mode new-termios termios@ - _ECHO ICANON or invert new-termios .c_lflag l@ and new-termios .c_lflag l! + _ECHO ICANON or invert new-termios .c_lflag sl@ and new-termios .c_lflag l! 0 VTIME new-termios .c_cc[] c! 0 VMIN new-termios .c_cc[] c! new-termios termios! ; @@ -50,7 +50,7 @@ $5413 constant TIOCGWINSZ 4 2 * constant sizeof(winsize) create winsize sizeof(winsize) allot : form ( -- h w ) stdin TIOCGWINSZ winsize ioctl throw - winsize l@ dup $ffff and swap $10000 / ; + winsize sl@ dup $ffff and swap $10000 / ; 0 value pending : termios-key? ( -- f ) pending if -1 else stdin-key to pending pending 0<> then ; diff --git a/ueforth/posix/xlib_test.fs b/ueforth/posix/xlib_test.fs index ab74229..1d47675 100644 --- a/ueforth/posix/xlib_test.fs +++ b/ueforth/posix/xlib_test.fs @@ -61,8 +61,8 @@ create event xevent-size allot event c@ MotionNotify = if ." MotionNotify" then event c@ DestroyNotify = if ." DestroyNotify" then event c@ ConfigureNotify = if - event 3 16 * 8 + + l@ width ! - event 3 16 * 12 + + l@ height ! + event 3 16 * 8 + + sl@ width ! + event 3 16 * 12 + + sl@ height ! ." width & height: " width @ . height @ . ." ConfigureNotify" then diff --git a/ueforth/site/internals.html b/ueforth/site/internals.html index c0e7444..9ba9b4b 100644 --- a/ueforth/site/internals.html +++ b/ueforth/site/internals.html @@ -87,7 +87,7 @@ are then used to build up a small set of core opcodes defined in 1-3 lines each:
 0= 0< + U/MOD */MOD   AND OR XOR
 LSHIFT RSHIFT   DUP SWAP OVER DROP
-@ L@ C@ ! L! C!   SP@ SP! RP@ RP!
+@ SL@ SW@ C@ ! L! W! C!   SP@ SP! RP@ RP!
 >R R> R@   : ; EXIT
 EXECUTE BRANCH 0BRANCH DONEXT DOLIT
 ALITERAL CELL DOES> IMMEDIATE 'SYS
diff --git a/ueforth/windows/windows.fs b/ueforth/windows/windows.fs
index 0f3e987..5e5fe67 100644
--- a/ueforth/windows/windows.fs
+++ b/ueforth/windows/windows.fs
@@ -59,6 +59,7 @@ z" User32.dll" dll User32
 z" MessageBoxA" 4 User32 MessageBoxA
 
 z" Kernel32.dll" dll Kernel32
+
 z" AllocConsole" 0 Kernel32 AllocConsole
 z" ExitProcess" 1 Kernel32 ExitProcess
 z" GetStdHandle" 1 Kernel32 GetStdHandle
@@ -80,6 +81,24 @@ z" SetFilePointer" 4 Kernel32 SetFilePointer
 z" SetEndOfFile" 1 Kernel32 SetEndOfFile
 z" GetFileSize" 2 Kernel32 GetFileSize
 
+z" GetCommandLineW" 0 Kernel32 GetCommandLineW
+
+z" Shell32.dll" dll Shell32
+z" CommandLineToArgvW" 2 Shell32 CommandLineToArgvW
+
+variable wargc  variable wargv
+GetCommandLineW wargc CommandLineToArgvW wargv !
+: wz>sz ( a -- a n )
+   here swap begin dup sw@ 0<> while dup sw@ c, 2 + repeat drop 0 c, align ;
+: wargs-convert ( dst )
+   wargv @ wargc @ for aft
+      dup @ wz>sz >r swap r> over ! cell+ swap cell+
+   then next 2drop ;
+also internals
+wargc @ 'argc !
+here 'argv ! wargc @ cells allot
+'argv @ wargs-convert
+
 AllocConsole drop
 STD_INPUT_HANDLE GetStdHandle constant stdin
 STD_OUTPUT_HANDLE GetStdHandle constant stdout
@@ -157,8 +176,7 @@ r/o w/o or constant r/w
 ( Other Utils )
 : ms ( n -- ) Sleep ;
 
-forth
+only forth
 
 ( Setup entry )
 internals : ok   ." uEforth" raw-ok ; forth
-' forth ( leave on stack for fini.fs )