Benutzer-Werkzeuge

Webseiten-Werkzeuge


projects:gforth-as-pid-one:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
projects:gforth-as-pid-one:start [2014-08-31 16:10] – [Blocks und Datei-IO unter gforth-an] casprojects:gforth-as-pid-one:start [2014-10-21 16:17] (aktuell) – [gforth mit diet-libc bauen] cas
Zeile 47: Zeile 47:
  
 Bis es einen besseren Editor für gforth-na gibt (Freiwillige vor), kann der Retro-Forth Editor ([[http://retroforth.org/pages/?PortsOfRetroEditor]]) benutzt werden. Der Retro-Forth Editor ist klein genug, um Ihn einzutippen und dann mittels des Editors (nochmal) in einen Block zu schreiben, um den Editor danach direkt aus dem Block laden zu können. Bis es einen besseren Editor für gforth-na gibt (Freiwillige vor), kann der Retro-Forth Editor ([[http://retroforth.org/pages/?PortsOfRetroEditor]]) benutzt werden. Der Retro-Forth Editor ist klein genug, um Ihn einzutippen und dann mittels des Editors (nochmal) in einen Block zu schreiben, um den Editor danach direkt aus dem Block laden zu können.
 +
 +<code>
 +.( Retro Forth block editor for gForth ) 
 +cr 
 +
 +16 constant l/b 
 +: (block) scr @ block ; 
 +: (line) c/l * (block) + ; 
 +
 +: row dup c/l type c/l + cr ; 
 +: .rows l/b 0 do i . row loop ; 
 +: .block ." Block: " scr @ dup . updated? 43 + emit space ; 
 +: +--- ." +---" ; 
 +: :--- ." :---" ; 
 +: x--- +--- :--- +--- :--- ; 
 +: --- space space x--- x--- x--- x--- cr ; 
 +: vb --- scr @ block .rows drop --- ; 
 +: .stack ." Stack: " .s ; 
 +: status .block .stack ; 
 +: v cr vb status ; 
 +
 +: v* update v ; 
 +: s dup scr ! block drop v ; 
 +: ia (line) + >r 10 parse r> swap move v* ; 
 +: i 0 swap ia v* ; 
 +: d (line) c/l bl fill v* ; 
 +: x (block) l/b c/l * bl fill v* ; 
 +: p -1 scr +! v ; 
 +: n 1 scr +! v ; 
 +: e scr @ load ; 
 +
 +cr .( editor loaded ) cr
 +</code>
 +
 +==== Tastaturbelegung ====
 +
 +Der Standard-Linux-Kernel startet mit einer Tastaturbelegung für US-amerikanische Tastaturen. Um eine deutsche Tastaturbelegung zu bekommen, sind folgende Optionen:
 +
 +  * beim Kompilieren des Linux-Kernels die Datei "drivers/tty/vt/defkeymap.map" anpassen. Die Keymap-Dateien finden im Linux unter "/usr/share/keymaps"
 +  * Unter GForth mittels der Syscalls die Funktion des Linux-Programmes "loadkeys" nachbauen, um die Linux-Tastaturtabelle zu setzen
 +  * Unter Forth einen neuen Tastaturtreiber schreiben, welcher die Zeichen von US-amerikanisch auf deutsche Tastatur anpasst.
 +
 +Ein einfacher Tastaturtreiber:
 +
 +<code>
 +\ german keyboard mapping
 +
 +create keytab $100 allot
 +keytab $100 erase
 +
 +: keytrans: char keytab + c! ;
 +: keyb-de key dup keytab + c@ dup if swap then drop ;
 +' keyb-de IS xkey
 +
 +\ Incomplete german keyboard mapping
 +char z keytrans: y
 +char y keytrans: z
 +char " keytrans: @
 +char ö keytrans: ;
 +char Ö keytrans: :
 +char ä keytrans: '
 +char Ä keytrans: "
 +char ü keytrans: [
 +char Ü keytrans: {
 +char ; keytrans: <
 +char : keytrans: >
 +char # keytrans: \
 +char * keytrans: }
 +char } keytrans: +
 +char ' keytrans: |
 +char ? keytrans: _
 +char ( keytrans: *
 +char ) keytrans: (
 +char - keytrans: /
 +char = keytrans: )
 +char & keytrans: ^
 +char / keytrans: &
 +char _ keytrans: ?
 +</code>
 +===== Linux Syscalls aus GForth für amd64-64bit Linux =====
 +
 +<code>
 +abi-code sys-getpid
 +  -8 di d) r8 lea  \ adjust data stack pointer for new value
 +      39 # ax mov  \ getpid syscall is "39"
 +    $0F c, $05 c,  \ syscall
 +      ax r8 ) mov  \ move result to data-stack (pointer in R8)
 +        r8 ax mov  \ return new data-stack pointer in AX
 +              ret  \ return from call
 +end-code
 +
 +abi-code sys-sync
 +     162 # ax mov  \ sync syscall is "162"
 +    $0F c, $05 c,  \ syscall
 +        di ax mov  \ return data-stack pointer unchanged
 +              ret  \ return from call
 +end-code
 +
 +abi-code sys-poweroff
 +       169 # ax mov  \ reboot syscall is "169"
 + $fee1dead # di mov  \ magic 1
 +  85072278 # si mov  \ magic 2
 + $4321fedc # dx mov  \ command (poweroff)
 +      $0F c, $05 c,  \ syscall
 +                ret  \ we don't expect to come back
 +end-code
 +
 +abi-code sys-reboot
 +       169 # ax mov  \ reboot syscall is "169"
 + $fee1dead # di mov  \ magic 1
 +  85072278 # si mov  \ magic 2
 + $01234567 # dx mov  \ command (reboot)
 +      $0F c, $05 c,  \ syscall
 +                ret  \ we don't expect to come back
 +end-code
 +
 +\ re-define bye
 +: bye sys-sync sys-poweroff ;
 +</code>
  
 ===== Linux Syscalls aus GForth für ia86-32bit Linux ===== ===== Linux Syscalls aus GForth für ia86-32bit Linux =====
Zeile 88: Zeile 207:
 \ redefine "bye" \ redefine "bye"
 : bye sys-sync sys-poweroff ; : bye sys-sync sys-poweroff ;
 +</code>
 +
 +===== FAQ =====
 +
 +   * Frage: Kann gforth-na auf die Festplatte installiert werden
 +   * Antwort: ja. Bei einem Linux-System kann das ''gforth'' Programm (statisch gegen diet-libc gelinkt) in ein Verzeichnis kopiert werden (zusammen mit der Image-Datei ''gforth.fi''. Im Linux-Bootloader muss dann ein neuer Eintrag erstellt werden, welcher das gforth als init Prozess startet. Beispiel-Eintrag bei einem Debian-System mit ''grub'' Boot-Loader:
 +<code>
 +menuentry 'GNU/Forth almost native' --class debian --class gnu-linux --class gnu --class os {
 +        load_video
 +        insmod gzio
 +        insmod part_msdos
 +        insmod ext2
 +        set root='(hd0,msdos1)'
 +        search --no-floppy --fs-uuid --set=root 3413a572-49e9-47f0-9a27-fb3daa7c13b2
 +        echo    'Loading GNU/Forth ...'
 +        linux   /vmforth root=/dev/sda3 rw fbcon=font:SUN12x22 init=/bin/gforth
 +}
 +</code>
 +
 +  * Frage: welche Minimalanforderungen an den Rechner hat gforth-na?
 +  * Antwort: bei Benutzung eines (selbstkompilierten) 2.6.x Linux-Kernels: 386SX CPU mit 4 MB Hauptspeicher
 +
 +===== gforth mit diet-libc bauen =====
 +
 +diet-libc ist eine minimale kleine C-Runtime Library mit der statisch gelinkte, kleine Binaries erzeugt werden koennen. Anbei die Schritte, um das aktuelle gforth aus Bernds git Repository mit der diet-libc zu bauen. 
 +
 +Der "make" Durchgang schlaegt beim kompilieren des gforth-itc fehl. An dieser Stelle ist aber das normale gforth binary schon gebaut und kann installiert werden.
 + 
 +<code>
 +# cd /usr/src
 +# wget http://www.fefe.de/dietlibc/dietlibc-0.33.tar.bz2
 +--2014-10-21 15:42:56--  http://www.fefe.de/dietlibc/dietlibc-0.33.tar.bz2
 +Resolving www.fefe.de (www.fefe.de)... 2001:4d88:ffff:ffff:d0:b723:863f:2, 31.15.64.162
 +Connecting to www.fefe.de (www.fefe.de)|2001:4d88:ffff:ffff:d0:b723:863f:2|:80... connected.
 +HTTP request sent, awaiting response... 200 Coming Up
 +Length: 626885 (612K) [application/octet-stream]
 +Saving to: ‘dietlibc-0.33.tar.bz2’
 +
 +100%[==================================================================================>] 626,885      531KB/  in 1.2s   
 +
 +2014-10-21 15:42:57 (531 KB/s) - ‘dietlibc-0.33.tar.bz2’ saved [626885/626885]
 +
 +# tar xvfj dietlibc-0.33.tar.bz2
 +# make
 +# install bin-i386/diet /usr/local/bin
 +# export CC="diet gcc"
 +# git clone https://github.com/forthy42/gforth.git
 +# cd gforth
 +# autoreconf -i
 +# ./configure
 +# make
 +</code>
 +
 +Der "make" Befehl schlaegt beim bauen von gforth-itc fehl, das normale "gforth" Programm konnte aber schon gebaut werden.
 +
 +<code>
 +# make install
 +# strip $(which gforth)
 +# file $(which gforth-0.7.9_20140402)
 +/usr/local/bin/gforth-0.7.9_20140402: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), statically linked, BuildID[sha1]=19f1d32b09820cd21bc9f2ee552491f51f878fd8, stripped
 +# ls -l $(which gforth-0.7.9_20140402)
 +-rwxr-xr-x 1 root root 143496 Oct 21 16:06 /usr/local/bin/gforth-0.7.9_20140402
 </code> </code>
  
projects/gforth-as-pid-one/start.1409494248.txt.gz · Zuletzt geändert: 2014-08-31 16:10 von cas