mirror of
https://github.com/forth-ev/VolksForth.git
synced 2024-06-14 16:29:26 +00:00
174 lines
170 KiB
Plaintext
174 lines
170 KiB
Plaintext
leer clv02feb88 \ Directory 13.5.87 ccclv8feb89 listbufs 2 frei 3-4 fehlerbehandlung-test 5-11 kw fehlerbehandlung-funktioniert 12-19 fehlerbeh 6 20-26 frei 27 SKIP[ ]SKIP 28 frei 29-32 fehlerbeh. mit tabort" 33-37 fehler (err in quit.. 38-44 backup ..R/W 45-53 frei 54-59 Terminal 60 \ listbufs clv14mar88 : listbufs prev BEGIN @ dup WHILE \ liste cr dup u. dup 2+ @ 1+ IF dup 2+ 2+ @ blk/drv /mod u. ." :" u. THEN stop? UNTIL drop ; clv8feb89 clv8feb89 \ fehlerbeh. test clv24nov87 .( fehlerbeh EXITS FAILS ;THEN ) cr .( 1.5 scr + 2 scr ueberdefinieren) : repare ['] (error errorhandler ! [ ' quit >body dup @ ] Literal Literal ! [ ' abort" >body dup @ ] Literal Literal ! [ ' error" >body 2+ @ >body dup @ ] Literal Literal ! ; : old repare ['] repare >name 4 - (forget save quit ; 1 5 +thru 6 +load \ beispiel ' throw errorhandler ! ' nquit ' quit >body ! \ patch ' n(abort" ' (abort" >body ! ' n(err" ' error" >body 2+ @ >body ! save quit \ ep eClrS throw catch clv19nov87 ( | ) User ep 0 ep ! ( | ) User eClrS eClrS on ( | ) : throw ep @ rp! r> ep ! r> [ last @ name> >body ] Literal >r >r ; \ rstack: ... throw catchAdr \ ' throw errorhandler ! \ (error Abort" Error" clv16nov87 : n(error ( string -- ) standardi/o space here .name count type space ?cr blk @ ?dup IF scr ! >in @ r# ! THEN eClrS @ IF clearstack THEN quit ; \\ : (abort" "lit swap IF eClrS on errorhandler perform exit THEN drop ; restrict | : (err" "lit swap IF eClrS off errorhandler perform exit THEN drop ; restrict : Abort" compile (abort" ," ; immediate restrict : Error" compile (err" ," ; immediate restrict \ clv16nov87 \ FAILS clv16nov87 Create: unfails r> ep ! rdrop ; Create: unexits r> ep ! ; : (fails ( --) r> dup 2+ >r ep @ >r rp@ ep ! unfails >r dup @ + >r ; restrict : (exits ( --) r> dup 2+ >r ep @ >r rp@ ep ! unexits >r dup @ + >r ; restrict \ branchtarget & catchpart follows \ rstack: ... adr oldep uncatch cont \ ep ---^ : FAILS compile (fails >mark -1 ; immediate restrict : EXITS compile (exits >mark -1 ; immediate restrict : ;THEN compile exit [compile] THEN ; immediate restrict \ quit clv16nov87 \ patches: : n(abort" rdrop "lit swap IF eClrS on errorhandler perform exit THEN drop ; restrict | : n(err" rdrop "lit swap IF eClrS off errorhandler perform exit THEN drop ; restrict : nquit rdrop r0 @ rp! [compile] [ FAILS n(error THEN 'quit ; \ installs toplevel errorhandling \ fehlerbeh. beispiel clv17nov87 : devon ." device ist on " ; : devoff ." device ist off " ; : mistake? ." Fehler=y " key capital Ascii Y = abort" aborted" ; : tf ." t-1 " devon FAILS ." t-f " devoff ;THEN ." t-2 " mistake? ." t-3 " devoff ; : te ." t-1 " devon EXITS ." t-f " devoff ;THEN ." t-2 " mistake? ." t-3 " ; : t cr ." mit FAILS:" tf cr tf cr cr ." mit EXITS:" te cr te ; \ fehlerbeh. 2 clv07feb88 .( fehlerbeh EXITS #FAILS END ) cr .( 4 scr + 1 scr ueberdefinieren) 1 5 +thru 6 7 +thru \ beispiel ' noop errorhandler ! ' nquit ' quit >body ! \ patch ' n(abort" ' (abort" >body ! ' n(err" ' error" >body 2+ @ >body ! save quit (c) clv 1988 \ pointer and rstack-handl. clv07feb88 ( | ) User ep \ error-return-pointer User err err off \ error-message User eClr eClr off \ error-clearstack Create: uncatch r> r> ep ! rp! ; ( |) Variable catchrp : <catch r> rp@ catchrp ! >r ; restrict : catch> r> ep @ >r rp@ ep ! catchrp @ >r uncatch >r >r ; restrict \ throw (exits (fails clv07feb88 : throw rdrop err @ 0= ?exit ep @ rp! r> ep ! ; restrict : (exits r> dup 2+ >r <catch catch> dup @ + >r ; restrict : (fails r> <catch dup 2+ >r catch> dup @ + >r ; restrict \ (#fails clv07feb88 : move>r ( from count--) r> -rot rp@ over - under rp! cmove >r ; restrict : r>move ( to count--) r> -rot under rp@ -rot cmove rp@ + rp! >r ; restrict create: getargs s0 @ r> - sp! sp@ r@ 1+ 2* r>move ; : (#fails ( ..args.. n--..args..) >r r@ sp@ s0 @ swap - sp@ r> 2+ 2* ( .args. n depth from bytes) r> <catch dup 2+ >r -rot move>r nip nip getargs >r catch> dup @ + >r ; restrict \ FAILS EXITS #FAILS END clv07feb88 : EXITS compile (exits >mark -1 ; immediate restrict : FAILS [compile] BEGIN compile (fails >mark -1 2swap ; immediate restrict : #FAILS ( n--) [compile] BEGIN compile (#fails >mark -1 2swap ; immediate restrict : END dup 2 = IF 2drop THEN abs 1 ?pairs compile throw >resolve ; immediate restrict \ (error (abort" quit clv07feb88 : n(error standardi/o space here .name err @ count type space ?cr err off blk @ ?dup IF scr ! >in @ r# ! THEN eClr @ IF clearstack THEN quit ; : n(abort" rdrop "lit swap IF err ! eClr on errorhandler perform throw THEN drop ; restrict | : n(err" rdrop "lit swap IF err ! eClr off errorhandler perform throw THEN drop ; restrict : nquit rdrop r0 @ rp! [compile] [ FAILS n(error END 'quit ; \ installs toplevel errorhandling \\ die RDROP sind nur wg. Patch \ fehlerbeh. beispiel clv19nov87 : devon ." device ist on " ; : devoff ." device ist off " ; : mistake? ." Fehler=y " key capital Ascii Y = abort" aborted" ; : tf ." t-1 " devon FAILS ." t-f " devoff END ." t-2 " mistake? ." t-3 " devoff ; : te ." t-1 " devon EXITS ." t-f " devoff END ." t-2 " mistake? ." t-3 " ; : t cr ." mit FAILS:" tf cr tf cr cr ." mit EXITS:" te cr te ; \ fhler test #FAILS clv07feb88 \ Fuer Neugierige: : .rs r0 @ rp@ DO cr I dup . ." :" @ dup . dup 2- @ uncatch 2- @ = IF ." -" 2- ELSE @ THEN >name .name 2 +LOOP ; : .stack ." Stack:" .s ; : action ( n1 n2 n3--nSum) ." action:" .stack + + mistake? ; : t#fails 1 2 3 3 #FAILS ." F:" .stack ." retry=y?" key Ascii y - UNTIL END action ." successfull:" .stack drop ; \ EH:LOADs exception handling clv24feb88 User ep \ error-return-pointer User err err off \ error-message 1 3 +thru \ throw EXITS #FAILS RETRY 4 +load \ patches (abort" (err" quit \ 5 7 +thru \ beispiel save quit \\ (c) 1988 volksFORTH83-Autoren in der Forth-Gesellschaft e.V. enwickelt von Claus Vogt, 1988 unter ultraFORTH83 Vs 3.8 auf CBM +4 Thanks to Klaus Schleisiek and TLC-Lisp \ EH:returnstack catch-throw clv24feb88 : <rstack r> rp@ >r >r ; restrict : ,r ( u--) r> r> rot >r >r >r ; restrict : rmove ( adr u --) r> r> rp@ 3 pick - rp! rp@ -rot >r >r swap cmove ; restrict Create: unstack r> rp! ; Create: uncatch r> r> ep ! rp! ; : rstack> r> unstack >r >r ; restrict : catch> r> r> ep @ >r rp@ ep ! >r uncatch >r >r ; restrict : throw err @ IF ep @ rp! r> ep ! ELSE rdrop THEN ; restrict : ?throw ( flag--) IF rdrop throw THEN ; restrict \ EH:(exits (fails (#fails clv24feb88 : (exits \ frame to be executed after \ error or exit r> err @ IF err dup push off THEN dup 2+ >r <rstack catch> dup @ + >r ; restrict : (fails \ frame executes after error r> <rstack dup 2+ ,r catch> dup @ + >r ; restrict Create: getargs \ restore: s0 @ r> 2* - sp! \ stack-pointer sp@ rp@ swap r@ 1+ 2* cmove \ values r> 2* rp@ + rp! ; \ returnstack : (#fails ( u*args u--u*args) >r sp@ r> \ saves also arguments r> <rstack dup 2+ ,r -rot under 2* rmove ,r depth ,r getargs ,r catch> dup @ + >r ; restrict \ EH:FAILS EXITS #FAILS RETRY clv24feb88 : EXITS compile (exits >mark -1 ; immediate restrict : FAILS compile (fails >mark -1 ; immediate restrict : #FAILS ( n--) compile (#fails >mark -1 ; immediate restrict : RETRY compile branch over 2- <resolve [compile] THEN ; immediate restrict \\ use: EXITS ... throw THEN ... (#)FAILS ... ?throw ... RETRY ... don't use: IF ... ELSE ... RETRY !!!! \ EH:(error (abort" quit clv24feb88 ' noop errorhandler ! | : err! ( flag--) rdrop "lit swap IF dup err ! errorhandler perform drop throw THEN drop ; restrict : n(abort" rdrop ( * ) err! ; restrict ' n(abort" ' (abort" >body ! : n(err" rdrop ( * ) err! ; restrict ' error" >body 2+ @ | Alias (err" ' n(err" ' (err" >body ! : .err space here .name err @ count type space ?cr ; : nquit rdrop ( * ) r0 @ rp! FAILS standardi/o .err blk @ ?dup IF scr ! >in @ r# ! THEN err @ 2- @ ['] (err" - IF clearstack THEN RETRY err off [compile] [ 'quit ; ' nquit ' quit >body ! \ EH:sample.. clv24feb88 : devon ." aktion begonnen " cr ; : devoff ." aktion beendet " cr ; : .ok ." alles erfolgreich" cr ; : .handle ." Ausnahmebehandlung: " ; : .stack ." Stack:" .s cr ; : ?y? ( --flag) ." =y " key capital Ascii Y = dup 0= IF del del ." n " THEN cr ; : ok? ." Fehler?" ?y? abort" abbruch" ; : retry? ( --flag) ." nochmal?" ?y? ; : action ( n1 n2 n3--nSum) devon .stack + + ok? devoff ; \ EH:..sample clv24feb88 : tf ." t-1 " devon FAILS .handle devoff throw THEN ." t-2 " ok? ." t-3 " devoff .ok ; : te ." t-1 " devon EXITS .handle devoff throw THEN ." t-2 " ok? .ok ; : t# 1111 2222 3333 3 #FAILS .handle .stack retry? 0= ?throw cr RETRY action .ok .stack drop ; : test 0 #FAILS cr cr ." alles" retry? 0= ?throw cr RETRY cr ." mit FAILS:" cr tf cr cr ." mit EXITS:" cr te cr cr ." mit #FAILS:" cr t# cr ; \ EH:ouput of returnstack clv24feb88 \ Fuer Neugierige: : tab at? &22 umax at ; : ?.n ( adr string--) swap >name ?dup IF swap count type tab .name rdrop exit THEN drop ; restrict : ?.name ( adr--) dup 2- " pfa of" ?.n dup 2- @ " " ?.n dup 4 - @ " data of" ?.n tab ." ???" ; : .rs r0 @ rp@ \ gibt rstack aus DO cr I 6 u.r I @ 6 u.r space I @ ?.name drop 2 +LOOP cr ep @ 6 u.r ." ep ! " ; \ SKIP[ ]SKIP clv13feb88 : ]SKIP 4 ?pairs >resolve ] ; : SKIP[ reveal compile branch >mark 4 [compile] [ ; immediate restrict \\ : t ." hier t" SKIP[ : t2 ." hier t2 " ; ]SKIP ." hier noch t" ; leer clv02feb88 leer clv02feb88 leer clv02feb88 leer clv02feb88 \ fehlerbeh. 4 clv22feb88 \ mit tabort" \ nur Studie, da nicht patchbar \ Beispiel wie gehabt 1 3 +thru \ EXITS #FAILS END 4 +load \ systemaenderungen \\ Veraenderungen im System: errorhandler wird leider gestrichen quit abort" (abort" error" (err" anders (error wird in quit integriert \ pointer and rstack-handl. clv22feb88 User ep ep off \ Error-Ret-Ptr Create: uncatch r> r> ep ! rp! ; ( |) Variable catchrp : <catch r> rp@ catchrp ! 0 >r >r ; restrict : catch> r> ep @ >r rp@ ep ! catchrp @ >r uncatch >r >r ; restrict : move>r ( from count--) r> -rot rp@ over - under rp! cmove >r ; restrict : r>move ( to count--) r> -rot under rp@ -rot cmove rp@ + rp! >r ; restrict \ throw (exits (fails (#fails clv22feb88 | : rdo ( pfa--pfa) r> swap 2+ >r >r ; | : rskip ( pfa--) rdrop dup @ + >r ; : (exits rdo rskip ; restrict : EXITS compile (exits >mark -1 ; immediate restrict : (fails r> <catch rdo catch> rskip ; restrict : (#fails ( ..args.. n--..args..) >r r@ sp@ s0 @ swap - sp@ r> 2+ 2* ( .args. n depth from bytes) r> <catch rdo -rot move>r nip nip EXITS s0 @ r> - sp! sp@ r@ 1+ 2* r>move exit THEN catch> rskip ; restrict \ FAILS #FAILS END clv22fclv22feb88 : FAILS [compile] BEGIN compile (fails >mark -1 2swap ; immediate restrict : #FAILS ( n--) [compile] BEGIN compile (#fails >mark -1 2swap ; immediate restrict : END dup 2 = IF 2drop THEN abs 1 ?pairs >resolve ; immediate restrict \ (error (abort" quit clv22feb88 : throw rdrop r> 2- \ points to tabort" ep @ 2- rp! r> 2- ! \ error-exit-pfa r> ep ! ; restrict : (tabort" throw ; restrict : (terr" throw ; restrict : abort" ( flag -- ) [compile] IF compile (tabort" ," [compile] THEN ; immediate restrict : error" ( flag -- ) [compile] IF compile (terr" ," [compile] THEN ; immediate restrict : quit r0 @ rp! \ kann ev weg FAILS standardi/o space here .name r> dup 2+ count type space dup ." at:" u. ?cr blk @ ?dup IF scr ! >in @ r# ! THEN ['] (tabort" = IF clearstack THEN REPEAT THEN [compile] [ 'quit ; \ fehlerbeh. 5 clv23feb88 \ (errror in quit, User: ep / err 1 3 +thru \ EXITS #FAILS END 4 +load \ patches (abort" (err" quit 5 6 +thru \ beispiel \\ ab hier wird gepatched: : -!- dup @ -rot , , , ; Variable patches ' noop errorhandler -!- ' nquit ' quit >body -!- ' n(abort" ' (abort" >body -!- ' n(err" ' error" >body 2+ @ >body -!- here patches ! : patch patches @ patches 2+ DO I 2 + @ I @ ! 6 +LOOP ; : unpatch patches @ patches 2+ DO I 4 + @ I @ ! 6 +LOOP ; \\ patch save quit \\ unpatch ' ep >name 4 - (forget save 0 +load \ pointer and rstack-handl. clv23feb88 ( | ) User ep \ error-return-pointer User err err off \ points to message Create: uncatch r> r> ep ! rp! ; ( |) Variable catchrp : <catch r> rp@ catchrp ! >r ; restrict : catch> r> ep @ >r rp@ ep ! catchrp @ >r uncatch >r >r ; restrict : move>r ( from count--) r> -rot rp@ over - under rp! cmove >r ; restrict : r>move ( to count--) r> -rot under rp@ -rot cmove rp@ + rp! >r ; restrict \ throw (exits (fails (#fails clv07feb88 : throw rdrop err @ 0= ?exit ep @ rp! r> ep ! ; restrict : (exits r> dup 2+ >r <catch catch> dup @ + >r ; restrict : (fails r> <catch dup 2+ >r catch> dup @ + >r ; restrict create: getargs s0 @ r> - sp! sp@ r@ 1+ 2* r>move ; : (#fails ( ..args.. n--..args..) >r r@ sp@ s0 @ swap - sp@ r> 2+ 2* ( .args. n depth from bytes) r> <catch dup 2+ >r -rot move>r nip nip getargs >r catch> dup @ + >r ; restrict \ FAILS EXITS #FAILS END clv07feb88 : EXITS compile (exits >mark -1 ; immediate restrict : FAILS [compile] BEGIN compile (fails >mark -1 2swap ; immediate restrict : #FAILS ( n--) [compile] BEGIN compile (#fails >mark -1 2swap ; immediate restrict : END dup 2 = IF 2drop THEN abs 1 ?pairs compile throw >resolve ; immediate restrict \ (error (abort" quit clv23feb88 | : err! ( flag--) rdrop ( deletes (ABORT" ) "lit swap IF err ! errorhandler perform throw THEN drop ; restrict : n(abort" rdrop err! ; restrict : n(err" rdrop err! ; restrict : .err space here .name err @ count type space ." AT:" err @ u. ?cr ; : nquit rdrop r0 @ rp! FAILS standardi/o .err blk @ ?dup IF scr ! >in @ r# ! THEN err @ 2- @ ['] (abort" = IF clearstack THEN REPEAT THEN err off [compile] [ 'quit ; \\ die RDROP sind nur wg. Patch \ fehlerbeh. beispiel clv07feb88 : devon ." device ist on " ; : devoff ." device ist off " ; : mistake? ." Fehler=y " key capital Ascii Y = abort" aborted" ; : tf ." t-1 " devon FAILS ." t-f " devoff END ." t-2 " mistake? ." t-3 " devoff ; : te ." t-1 " devon EXITS ." t-f " devoff END ." t-2 " mistake? ." t-3 " ; : t cr ." mit FAILS:" tf cr tf cr cr ." mit EXITS:" te cr te ; \ fhler test #FAILS clv07feb88 \ Fuer Neugierige: : .rs r0 @ rp@ DO cr I dup . ." :" @ dup . dup 2- @ uncatch 2- @ = IF ." -" 2- ELSE @ THEN >name .name 2 +LOOP ; : .stack ." Stack:" .s ; : action ( n1 n2 n3--nSum) ." action:" .stack + + mistake? ; : t#fails 1 2 3 3 #FAILS ." F:" .stack ." retry=y?" key Ascii y - UNTIL END action ." successfull:" .stack drop ; \ uniR/W clv15mar88 \ Zum Kopieren Disk/Tape \needs Code .( ?!! Code !!?) quit \needs s#>t+s (16 $46ee Alias s#>t+s C) \needs 2@ : 2@ dup 2+ @ swap @ ; 1 6 +thru \ diverse r/w's 7 8 +thru \ backup ' uniR/W Is r/w ' patch-sbufs ' save-buffers >body ! : uniIni supertape r/wf on virInit ; uniIni ' uniIni ' drvinit >body ! save \ tapeR/W clv14mar88 : nofile ( f--) abort" nofile" ; | Create blk. ," blk." Variable r/wf r/wf on \ greift auf interne Block-struktur!!! \ blk $ffff laedt naechsten block : ?r/wf ( rw/f--) dup r/wf @ - IF ." Press stop" key drop THEN r/wf ! ; : tapeR/W ( adr blk file r/wf -- flag) swap nofile dup ?r/wf IF swap dup 2- 2- blk. count bload over 2- off \ no flags over - b/blk - abort" block-crash" over true = IF 2drop false exit THEN 2- 2- @ 2dup - IF ." not" u. ." ! " u. true exit THEN 2drop ELSE drop dup 2- 2- swap b/blk + blk. count bsave THEN false ; \ blk# nofile ?dev clv14mar88 \ : blk# ( --blk) prev @ 2+ 2+ @ ; $FFB1 >label LISTEN $FF93 >label SECOND $FFAE >label UNLSN | Code (dev? sp x) lda $90 stx (16 $ae sta rom C) LISTEN jsr \ wg. Fehler im Betr.syst. $60 # lda SECOND jsr UNLSN jsr 0 # ldx 1 # ldy (16 ram C) $90 lda sp x) sta sp )y sta Next jmp end-code : dev? ( dev -- flag) i/o lock (dev? 0= i/o unlock ; \\ : ?device ( dev --) dev? ?exit buffers unlock true abort" no device" ; \ leer clv14mar88 \ simuliert mehrere Laufwerke auf Drv#0 Variable #drv Variable lastdrv : virInit 4 0 DO I 8 + dev? 0= IF I #drv ! leave THEN LOOP lastdrv on ; : virDrv ( drv--) dup 1 #drv @ uwithin IF (drv ! exit THEN (drv off lastdrv @ over - IF cr ." Insert disk#" dup u. lastdrv ! key THEN drop ; : virBlk ( blk--blkOnDrv) blk/drv /mod virDrv ; \ diskR/W clv14mar88 | $100 Constant b/sek : 1551r/w ( adr blk file r/wf -- flag) swap nofile -rot virBlk diskopen IF drop nip exit THEN 0 swap 2* 2* 4 bounds DO drop 2dup I rot IF s#>t+s readsector ELSE s#>t+s writesector THEN >r b/sek + r> dup IF LEAVE THEN LOOP -rot 2drop diskclose ; \ dirR/W clv15mar88 \ Benutzt blk als Laufwerksnummer : dirR/W ( adr blk file r/wf -- flag) -rot nofile virDrv ( adr r/wf) diskopen IF drop exit THEN 3 0 \ Directorie nur $300 lang !! DO ( adr r/wf) 2dup IF &18 I readsector ELSE &18 I writesector THEN IF 2drop false false leave THEN swap b/sek + swap LOOP drop 0= diskclose ; \ uniR/W clv15mar88 4 Constant tape $f Constant dir : info 2 pick IF ." r:" ELSE ." w:" THEN 2dup 3 u.r ." :" 3 u.r 10 spaces cr $91 ( CurUp ) con! ; : uniR/W ( adr blk file r/wf -- flag) 2 pick blk/drv /mod info dir case? IF tape case? IF tapeR/W exit THEN -rot 3 roll drop dirR/W exit THEN tape case? IF $ff = IF rot drop true -rot THEN tapeR/W exit THEN dup 4 u< IF drop drop 1551r/w exit THEN drop drop ramR/W ; \ sort-buffers clv15mar88 : du> ( d1 d2 --flag) rot 2dup - IF u< nip nip exit THEN drop drop u> ; | : swap? ( adr--flag) @ dup 2+ @ -1 = IF drop false exit THEN dup 2+ 2@ rot @ 2+ 2@ du> ; | : swapbufs ( adr--) dup @ dup @ dup @ >r swap r> over ! over ! over ! drop ; : sort-buffers prev BEGIN dup @ @ 0= IF drop exit THEN dup swap? IF swapbufs prev ELSE @ THEN REPEAT ; : patch-sbufs sort-buffers [ ' save-buffers >body @ , ] ; \ backup clv14mar88 : backup ( fromDrv toDrv--) lastdrv on over dir >drive over dir >drive copy >r >r 0 r@ >drive blk/drv 1- r> >drive 0 r> >drive convey ; \\ Drv 0..3: reelle/virtuelle Disks Drv 4 : tape-DEVICE Drv 15 : Directories \\ supertape 0 4 backup \ Disk-->Tape supertape 4 0 backup \ Tape-->Disk 0 1 backup \ Disk-->Disk leer clv14mar88 leer clv02feb88 leer clv02feb88 leer clv02feb88 leer clv02feb88 leer clv02feb88 \ TM:Terminal Loadscreen cclv28feb89 1 &11 +thru \ serial interface &12 +load \ cbm ascii conversion &13 +load \ tx more than byte &14 +load \ dumb terminal \ TM:Serielle Schnittstelle clv28feb89 | Variable INT \ location of interrupt | $fd00 Constant Port@ \ 6551 | $fd10 Constant uport@ \ cts-port | Variable ctrl | $314 Constant sint@ | sint@ @ >Label oldSint | $fcbe >Label intEnd \ system-depend \ interrupt end routine Create Queue 0 , $80 allot \\ 0 1 2 130 byte adr len out 128-byte-queue len ::= number of characters queued out ::= relative address of next output character (len+out)mod 128 = relative address of first byte empty \ TM:Serielle Schnittstelle clv8feb89 : tx ( c -- ) port@ c! ; : tx? ( -- f ) port@ 1+ c@ $10 and 0<> uport@ c@ $02 and 0<> and ; \\ | Label no 0 # lda | Label pushaa sp 2dec sp )y sta puta jmp end-code Code tx? ( -- f ) port@ 1+ lda $10 # and no beq \ ok? uport@ lda $02 # and no beq \ cts? | Label yes $ff # lda pushaa bne end-code Code tx ( c -- ) port@ sta pop jmp end-code \ TM:Serielle Schnittstelle clv28feb89 : +dtr port@ 2+ dup c@ 1 or swap c! ; : -dtr port@ 2+ dup c@ $fe and swap c! ; : +rts port@ 2+ dup c@ $04 or swap c! ; : -rts port@ 2+ dup c@ $f3 and swap c! ; \\ Code +dtr port@ 2+ lda $1 # or port@ 2+ sta next jmp end-code Code -dtr port@ 2+ lda $fe # and port@ 2+ sta next jmp end-code \ TM:Serielle Schnittstelle clv8feb89 | Label s-int port@ 1+ lda 0>= ?[ oldSint jmp ]? $08 # and 0= ?[ intEnd jmp ]? tya pha queue lda $68 # cmp 0>= ?[ port@ 2+ lda $f2 # and port@ 2+ sta ]? \ -dtr -rts clc queue 1+ adc $7f # and tay queue inc port@ lda queue 2+ ,y sta pla tay intEnd jmp end-code \ TM:Serielle Schnittstelle clv8feb89 : rx? ( -- f ) queue c@ ; Code sei sei next jmp end-code Code cli cli next jmp end-code : rx ( -- c ) queue c@ 0= IF +dtr +rts BEGIN queue c@ UNTIL THEN sei queue dup 1+ c@ + 2+ c@ -1 queue +! 1 queue 1+ +! cli ; \\ Code rx? ( -- f ) queue lda pushaa jmp end-code Code rx ( -- c ) queue lda 0= ?[ port@ 2+ lda 5 # or port@ 2+ sta \ +dtr +rts [[ queue lda 0<> ?] ]? sei queue 1+ ldy queue 2+ ,y lda queue dec queue 1+ inc cli push0a jmp end-code \ TM:Serielle Schnittstelle clv228feb89 : s-init s-int sint@ ! \ new interrupt ctrl @ port@ 2+ ! +dtr +rts ; : bye 0 port@ 2+ c! bye ; \ -dtr -rts -rxint \ clv228feb89 \ TM: ctrl: clv228feb89 | : ctrl: ( adr 8b -- ) Create not c, , does> ( 8b -- ) Create dup c@ c, 1+ @ , c, does> dup c@ over 1+ @ c@ and over 3+ c@ or swap 1+ @ c! ; \ The only meta-defining-word I ever saw \ TM: baudrate clclv8feb89 | ctrl 1+ %00011111 ctrl: bd: $11 bd: 50baud $12 bd: 75baud $13 bd: 110baud $14 bd: 135baud $15 bd: 150baud $16 bd: 300baud $17 bd: 600baud $18 bd: 1200baud $19 bd: 1800baud $1a bd: 2400baud $1b bd: 3600baud $1c bd: 4800baud $1d bd: 7200baud $1e bd: 9600baud $1f bd: 19200baud \ TM: bits stopbits clv228feb89 | ctrl 1+ %01100000 ctrl: ln: $00 ln: 8bits $20 ln: 7bits $40 ln: 6bits $60 ln: 5bits | ctrl 1+ %10000000 ctrl: st: $80 st: 1stop $00 st: xstop \\ xStop gives: 8 bit+1 parity -> 1stop 5 bit+0 parity -> 1.5 other -> 2stop \ TM: parity clv228feb89 | ctrl %11100000 ctrl: pa: $00 pa: noParity $80 pa: oddParity $c0 pa: evenParity $a0 pa: 1Parity $e0 pa: 0Parity | ctrl %00010000 ctrl: ec: $10 ec: +echo \ only if -rts !! $00 ec: -echo \\ 1parity means: send and receive high parity but no parity-check \ TM: cbm>asc asc>cbm cclv28feb89 : cbm>asc ( c -- c' ) dup $41 $5b uwithin IF $20 + exit THEN dup $61 $7b uwithin IF $60 + exit THEN dup $c1 $db uwithin IF $7f and exit THEN $dc case? IF $7c exit THEN $7c case? IF $dc exit THEN $14 case? IF $08 exit THEN $08 case? IF $14 exit THEN ; : asc>cbm ( c -- c' ) dup $41 $5b uwithin IF $80 or exit THEN dup $61 $7b uwithin IF $20 - exit THEN dup $c1 $db uwithin IF $60 - exit THEN $dc case? IF $7c exit THEN $7c case? IF $dc exit THEN $14 case? IF $08 exit THEN $08 case? IF $14 exit THEN ; \ TM: txType txblocks clv28feb89 $1a Constant #EOF | : ?break key? abort" ***aborted***" ; | : ?tx ( c -- ) BEGIN ?break tx? UNTIL cbm>asc #EOF case? IF $ff THEN tx ; : txType ( adr count -- ) bounds DO I c@ ?tx LOOP ; : txblocks ( fromBlk toBlk -- ) 2dup u> abort" nein!" s-init 1+ swap DO I block b/blk txType LOOP #EOF ?tx ; : txDisk 0 $a9 txBlocks ; \ TM: dumb Terminal clclv8feb89 \ Sample for an easy Terminal \needs #LF $0a Constant #LF | : ?rx pause rx? 0= ?exit rx asc>cbm #LF case? IF cr exit THEN #CR case? IF row 0 at exit THEN #BS case? IF del exit THEN emit ; | : ?tx ( c --) cbm>asc BEGIN ?rx tx? UNTIL tx ; 300baud noparity 1stop 8bits -echo : dumb s-init BEGIN BEGIN ?rx key? UNTIL key $1b case? IF -dtr exit THEN #cr case? IF #CR ?tx #LF THEN ?tx REPEAT ; clv8feb89 clv8feb89 clv8feb89 clv8feb89 clv8feb89 clv8feb89 clv20may87 clv8feb89 clv8feb89 clv8feb89 clv8feb89 clv8feb89 clv8feb89 clv8feb89 clv8feb89 \\ zu fehlerbeh. clv16nov87 ziel: CATCH (catch ---+ ... ... ! TO branch -- ! ---+ uncatch <-+ ! ... ... ! ENDCATCH throw ! uncatch <------+ ONERROR (catch ----+ branch --- ! --+ uncatch <--+ ! ... ... ! ENDONERROR throw <------+ ... ... ( ; macht uncatch ) \\ zu fehler clv16nov87 TRY <#> put# (catch -- <word> <word> branch -- uncatch ... ... RETRY get branch -- unstack uncatch ( .status push load clv20may87 Defer .status ' noop Is .status | Create pull 0 ] r> r> ! ; : push ( addr -- ) r> swap dup >r @ >r pull >r >r ; restrict : load ( blk --) ?dup 0= ?exit blk push blk ! >in push >in off .status interpret ; |