Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Morse trainer
- empty forth definitions decimal application
- warning on
- : TITLE ." MORSE version 1.31 2021-07-16" cr ;
- cr .( Compiling: ) title 2 load
- cr .( Save to disk? ) y/n [if]
- \ tally @ pad + #256 + limit s0 @ - + set-limit
- turnkey program MORSE
- [then]
- variable TALLY 0 tally ! \ run-time memory tally
- defer ?STOP ' noop is ?stop \ user abort check
- defer CON-IO ' bios-io is con-io \ default console i/o mode
- defer ONERROR ' noop is onerror \ reset on-error handler
- defer ONSTART ' noop is onstart \ startup initialization
- blk @ 1+ #screens 1- thru \ load electives & application
- ' ?stopkey is ?stop \ enable user abort
- \ ' dos-io is con-io \ enable console redirection
- \ ' deloutfile +is onerror \ delete outfile on error
- \ wrtchk off \ disable overwrite check
- 1 fload DOSLIB \ DOSLIB library
- _Errors \ error handler
- \ _Inout1 \ number output
- \ _Inout2 \ number output
- \ _Inout3 \ deferred output
- \ _Compare1 \ basic compare
- _String1 \ basic strings
- \ _String2 \ extra strings
- _Parsing1 \ command-line parsing
- _Parsing2 \ command-line parsing
- _Fileprims \ file primitives
- _Files \ default files
- \ _Bufinfile \ buffered input file
- _Bufoutfile \ buffered output file
- _Random \ random numbers
- \ _Shuffle \ shuffle cells
- \ _Qsort \ quicksort cells
- \ _Dos1 \ dta
- \ _Dos2 \ ctl-brk int
- \ _Disk \ disk
- \ _Memory \ memory allocate
- \ _Timedate1 \ time/date
- \ _Timedate2 \ time/date
- \ _Timepack \ time/date packing
- \ _Filematch \ file find first/next
- \ _Wildexp \ file wildcard expander
- \ _Filestamp \ file stamp/attribute
- \ _Diskdir \ directory
- \ _Env \ environment
- \ _Exec \ exec prog/command
- \ _Video1 \ textcolor attrib cursor
- \ _Video2 \ mode page
- \ _Timing1 \ timer
- \ _Timing2 \ delay
- \ _Timing3 \ ticker mode
- \ _Device1 \ 8087 cpu keybd
- : HELP ( -- ) dos-io cr cr title
- cr ." Use: MORSE [-opt] txtfile[.TXT] [sndfile]" cr
- cr ." -S|Cn send/character speed WPM 5-40"
- cr ." -Dw,c word/char spacing Dits 2 min"
- cr ." -Tn tone Hz 400-1000"
- cr ." -Pn punctuation 0=none 1=basic 2=full"
- cr ." -O space compression off"
- cr ." -W|V[n] output to WAV/VOC file [voice 0-2]"
- cr ." -Un WAV/VOC volume 0-9"
- cr ." -G[n] generate random groups [Koch chars 2-40]"
- cr ." -Rccc generate random groups using chars ccc"
- cr ." -Fc,r,s random group format: cols,rows,size"
- cr ." -I ignore option settings in textfile"
- cr ." -L insert line start/end signals \\CT \\AR"
- cr ." -H hide screen output"
- cr
- cr ." default: send file, spaces compressed, no punctuation"
- cr
- cr ." Morse code trainer. Send text file as morse code"
- cr ." to PC speaker or WAV/VOC sound file. Create custom"
- cr ." groups of random characters."
- con-io abort ;
- \ Add single to double variable
- : M+! ( n addr -- ) dup >r 2@ rot m+ r> 2! ;
- \ Shuffle characters
- : SHUFFLE ( adr len -- )
- 1 swap do
- dup i random chars +
- 2dup c@ swap c@
- rot c! over c!
- char+
- -1 +loop drop ;
- variable CHAR.S \ character speed
- variable SEND.S \ send speed
- variable WSPACE \ word spacing in Dits
- variable CSPACE \ char spacing in Dits
- variable COMPRESS \ space compression
- variable GROUPCOLS \ random group columns
- variable GROUPROWS \ random group lines
- variable GROUPSIZE \ random group size
- variable IGNORE \ ignore option field
- variable LASTCHAR \ last character processed
- variable TRAIN \ mode 0=generate
- variable PUNCT \ punctuation
- variable RNDTXT \ random or plain text
- variable TONE \ audio frequency
- variable SHAPING \ flag for MQUIET
- variable SPACING \ flag for __ (space)
- 2variable WAVESIZ \ wavefile data size
- 2variable RATIO \ wavefile loops/msec ratio
- 2variable LINE \ input line pointer
- 0 value OUTDEV \ 0=TXT/SPKR 1=WAV 2=VOC
- 0 value D_ELEMENTS \ standard word dit elements
- 0 value S_ELEMENTS \ standard word space elements
- 0 value #BASIC \ basic character set
- 0 value #PUNCT \ including punctuation
- 0 value #EXTENDED \ including extended
- 0 value #CONTROLS \ ARRL control characters
- 5 40 2constant SPEEDRANGE \ min/max speed
- 132 constant LINEMAX \ max text line length
- create LBUF linemax 2+ allot \ line buffer
- 11025 constant BITRATE \ wavfile bits/sec
- 60 constant #PCMHDR \ PCM header bytes to strip
- variable KOCH \ Koch characters (2-40)
- 0 value #KOCH \ Koch character set count
- variable LSIGNAL \ line start/end signals
- variable WHITESPACE \ line is whitespace or empty
- 2000 constant GMAX \ max random group
- 0 value GBUF \ random group buffer addr
- 0 value GSIZE \ & size
- $1A constant EOF \ End-of-file character
- 0 value HIDE \ hide screen output
- variable VOLUME \ volume
- \ Conditionally output text
- : ?EMIT ( c -- ) hide if drop end emit ;
- : ?TYPE ( a u -- ) hide if 2drop end type ;
- : ?CR ( -- ) hide if end cr ;
- hex
- here ( 1 cycle - sine)
- 80 c, 80 c, 81 c, 83 c, 85 c, 85 c, 87 c, 89 c,
- 8B c, 8D c, 8D c, 8F c, 91 c, 93 c, 93 c, 95 c,
- 97 c, 99 c, 9A c, 9A c, 9C c, 9E c, 0A0 c, 0A0 c,
- 0A2 c, 0A4 c, 0A6 c, 0A6 c, 0A8 c, 0AA c, 0AC c, 0AC c,
- 0AE c, 0B0 c, 0B0 c, 0B2 c, 0B3 c, 0B5 c, 0B5 c, 0B7 c,
- 0B9 c, 0B9 c, 0BB c, 0BD c, 0BD c, 0BF c, 0C1 c, 0C1 c,
- 0C3 c, 0C5 c, 0C5 c, 0C7 c, 0C9 c, 0C9 c, 0CB c, 0CB c,
- 0CC c, 0CE c, 0CE c, 0D0 c, 0D0 c, 0D2 c, 0D4 c, 0D4 c,
- 0D6 c, 0D6 c, 0D8 c, 0D8 c, 0DA c, 0DA c, 0DC c, 0DC c,
- 0DE c, 0DE c, 0E0 c, 0E0 c, 0E2 c, 0E2 c, 0E4 c, 0E4 c,
- 0E5 c, 0E5 c, 0E7 c, 0E7 c, 0E7 c, 0E9 c, 0E9 c, 0EB c,
- 0EB c, 0EB c, 0ED c, 0ED c, 0ED c, 0EF c, 0EF c, 0EF c,
- 0F1 c, 0F1 c, 0F1 c, 0F1 c, 0F3 c, 0F3 c, 0F3 c, 0F5 c,
- 0F5 c, 0F5 c, 0F5 c, 0F5 c, 0F7 c, 0F7 c, 0F7 c, 0F7 c,
- 0F7 c, 0F7 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c,
- 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c,
- 0FB c, 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c,
- 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F9 c, 0F7 c,
- 0F7 c, 0F7 c, 0F7 c, 0F7 c, 0F7 c, 0F5 c, 0F5 c, 0F5 c,
- 0F5 c, 0F5 c, 0F3 c, 0F3 c, 0F3 c, 0F1 c, 0F1 c, 0F1 c,
- 0F1 c, 0EF c, 0EF c, 0EF c, 0ED c, 0ED c, 0ED c, 0EB c,
- 0EB c, 0EB c, 0E9 c, 0E9 c, 0E7 c, 0E7 c, 0E7 c, 0E5 c,
- 0E5 c, 0E4 c, 0E4 c, 0E2 c, 0E2 c, 0E0 c, 0E0 c, 0DE c,
- 0DE c, 0DC c, 0DC c, 0DA c, 0DA c, 0D8 c, 0D8 c, 0D6 c,
- 0D6 c, 0D4 c, 0D4 c, 0D2 c, 0D0 c, 0D0 c, 0CE c, 0CE c,
- 0CC c, 0CB c, 0CB c, 0C9 c, 0C9 c, 0C7 c, 0C5 c, 0C5 c,
- 0C3 c, 0C1 c, 0C1 c, 0BF c, 0BD c, 0BD c, 0BB c, 0B9 c,
- 0B9 c, 0B7 c, 0B5 c, 0B5 c, 0B3 c, 0B2 c, 0B0 c, 0B0 c,
- 0AE c, 0AC c, 0AC c, 0AA c, 0A8 c, 0A6 c, 0A6 c, 0A4 c,
- 0A2 c, 0A0 c, 0A0 c, 9E c, 9C c, 9A c, 9A c, 99 c,
- 97 c, 95 c, 93 c, 93 c, 91 c, 8F c, 8D c, 8D c,
- 8B c, 89 c, 87 c, 85 c, 85 c, 83 c, 81 c, 80 c,
- 80 c, 80 c, 7F c, 7D c, 7B c, 7B c, 79 c, 77 c,
- 75 c, 73 c, 73 c, 71 c, 6F c, 6D c, 6D c, 6B c,
- 69 c, 67 c, 66 c, 66 c, 64 c, 62 c, 60 c, 60 c,
- 5E c, 5C c, 5A c, 5A c, 58 c, 56 c, 54 c, 54 c,
- 52 c, 50 c, 50 c, 4E c, 4D c, 4B c, 4B c, 49 c,
- 47 c, 47 c, 45 c, 43 c, 43 c, 41 c, 3F c, 3F c,
- 3D c, 3B c, 3B c, 39 c, 37 c, 37 c, 35 c, 35 c,
- 34 c, 32 c, 32 c, 30 c, 30 c, 2E c, 2C c, 2C c,
- 2A c, 2A c, 28 c, 28 c, 26 c, 26 c, 24 c, 24 c,
- 22 c, 22 c, 20 c, 20 c, 1E c, 1E c, 1C c, 1C c,
- 1B c, 1B c, 19 c, 19 c, 19 c, 17 c, 17 c, 15 c,
- 15 c, 15 c, 13 c, 13 c, 13 c, 11 c, 11 c, 11 c,
- 0F c, 0F c, 0F c, 0F c, 0D c, 0D c, 0D c, 0B c,
- 0B c, 0B c, 0B c, 0B c, 09 c, 09 c, 09 c, 09 c,
- 09 c, 09 c, 07 c, 07 c, 07 c, 07 c, 07 c, 07 c,
- 07 c, 07 c, 07 c, 07 c, 07 c, 07 c, 07 c, 07 c,
- 05 c, 07 c, 07 c, 07 c, 07 c, 07 c, 07 c, 07 c,
- 07 c, 07 c, 07 c, 07 c, 07 c, 07 c, 07 c, 09 c,
- 09 c, 09 c, 09 c, 09 c, 09 c, 0B c, 0B c, 0B c,
- 0B c, 0B c, 0D c, 0D c, 0D c, 0F c, 0F c, 0F c,
- 0F c, 11 c, 11 c, 11 c, 13 c, 13 c, 13 c, 15 c,
- 15 c, 15 c, 17 c, 17 c, 19 c, 19 c, 19 c, 1B c,
- 1B c, 1C c, 1C c, 1E c, 1E c, 20 c, 20 c, 22 c,
- 22 c, 24 c, 24 c, 26 c, 26 c, 28 c, 28 c, 2A c,
- 2A c, 2C c, 2C c, 2E c, 30 c, 30 c, 32 c, 32 c,
- 34 c, 35 c, 35 c, 37 c, 37 c, 39 c, 3B c, 3B c,
- 3D c, 3F c, 3F c, 41 c, 43 c, 43 c, 45 c, 47 c,
- 47 c, 49 c, 4B c, 4B c, 4D c, 4E c, 50 c, 50 c,
- 52 c, 54 c, 54 c, 56 c, 58 c, 5A c, 5A c, 5C c,
- 5E c, 60 c, 60 c, 62 c, 64 c, 66 c, 66 c, 67 c,
- 69 c, 6B c, 6D c, 6D c, 6F c, 71 c, 73 c, 73 c,
- 75 c, 77 c, 79 c, 7B c, 7B c, 7D c, 7F c, 80 c,
- here over - 2constant SINDATA
- decimal
- hex
- here ( 1 cycle - shaped square 1)
- 80 c, 81 c, 81 c, 83 c, 85 c, 85 c, 87 c, 87 c,
- 89 c, 8B c, 8B c, 8D c, 8D c, 8F c, 8F c, 91 c,
- 91 c, 93 c, 93 c, 95 c, 97 c, 97 c, 99 c, 99 c,
- 9B c, 9B c, 9D c, 9D c, 9F c, 9F c, 0A1 c, 0A1 c,
- 0A3 c, 0A3 c, 0A5 c, 0A5 c, 0A7 c, 0A7 c, 0A9 c, 0A9 c,
- 0A9 c, 0AB c, 0AB c, 0AD c, 0AD c, 0AF c, 0AF c, 0B1 c,
- 0B1 c, 0B2 c, 0B2 c, 0B4 c, 0B4 c, 0B6 c, 0B6 c, 0B6 c,
- 0B8 c, 0B8 c, 0BA c, 0BA c, 0BC c, 0BC c, 0BE c, 0BE c,
- 0BE c, 0C0 c, 0C0 c, 0C2 c, 0C2 c, 0C4 c, 0C4 c, 0C6 c,
- 0C6 c, 0C6 c, 0C8 c, 0C8 c, 0CA c, 0CA c, 0CC c, 0CC c,
- 0CC c, 0CE c, 0CE c, 0D0 c, 0D0 c, 0D0 c, 0D2 c, 0D2 c,
- 0D4 c, 0D4 c, 0D4 c, 0D6 c, 0D6 c, 0D6 c, 0D8 c, 0D8 c,
- 0D8 c, 0DA c, 0DA c, 0DA c, 0DC c, 0DC c, 0DC c, 0DE c,
- 0DE c, 0DE c, 0E0 c, 0E0 c, 0E0 c, 0E2 c, 0E2 c, 0E2 c,
- 0E4 c, 0E4 c, 0E4 c, 0E4 c, 0E5 c, 0E5 c, 0E5 c, 0E7 c,
- 0E7 c, 0E7 c, 0E7 c, 0E9 c, 0E9 c, 0E9 c, 0E9 c, 0EB c,
- 0EB c, 0EB c, 0ED c, 0ED c, 0ED c, 0ED c, 0EF c, 0EF c,
- 0EF c, 0EF c, 0EF c, 0F1 c, 0F1 c, 0F1 c, 0F1 c, 0F3 c,
- 0F3 c, 0F3 c, 0F3 c, 0F3 c, 0F5 c, 0F5 c, 0F5 c, 0F5 c,
- 0F5 c, 0F7 c, 0F7 c, 0F7 c, 0F7 c, 0F7 c, 0F9 c, 0F9 c,
- 0F9 c, 0F9 c, 0F9 c, 0FB c, 0FB c, 0FB c, 0FB c, 0FB c,
- 0FB c, 0FB c, 0FB c, 0FB c, 0FB c, 0F9 c, 0F9 c, 0F7 c,
- 0F5 c, 0F5 c, 0F3 c, 0F1 c, 0EF c, 0ED c, 0E9 c, 0E7 c,
- 0E5 c, 0E4 c, 0E2 c, 0E0 c, 0DE c, 0DC c, 0DA c, 0D8 c,
- 0D8 c, 0D6 c, 0D4 c, 0D2 c, 0D0 c, 0CE c, 0CC c, 0CC c,
- 0CA c, 0C8 c, 0C6 c, 0C4 c, 0C4 c, 0C2 c, 0C0 c, 0BE c,
- 0BC c, 0BC c, 0BA c, 0B8 c, 0B6 c, 0B4 c, 0B4 c, 0B2 c,
- 0B1 c, 0AF c, 0AF c, 0AD c, 0AB c, 0AB c, 0A9 c, 0A7 c,
- 0A5 c, 0A5 c, 0A3 c, 0A1 c, 0A1 c, 9F c, 9D c, 9D c,
- 9B c, 99 c, 99 c, 97 c, 95 c, 95 c, 93 c, 91 c,
- 91 c, 8F c, 8F c, 8D c, 8B c, 8B c, 89 c, 87 c,
- 87 c, 85 c, 83 c, 83 c, 81 c, 81 c, 80 c, 7F c,
- 7F c, 7D c, 7D c, 7B c, 79 c, 79 c, 77 c, 77 c,
- 75 c, 73 c, 73 c, 71 c, 71 c, 6F c, 6F c, 6D c,
- 6D c, 6B c, 69 c, 69 c, 67 c, 67 c, 65 c, 65 c,
- 63 c, 63 c, 61 c, 61 c, 5F c, 5F c, 5D c, 5D c,
- 5B c, 5B c, 59 c, 59 c, 57 c, 57 c, 55 c, 55 c,
- 53 c, 53 c, 53 c, 51 c, 51 c, 4F c, 4F c, 4E c,
- 4E c, 4C c, 4C c, 4A c, 4A c, 48 c, 48 c, 48 c,
- 46 c, 46 c, 44 c, 44 c, 42 c, 42 c, 40 c, 40 c,
- 3E c, 3E c, 3E c, 3C c, 3C c, 3A c, 3A c, 38 c,
- 38 c, 38 c, 36 c, 36 c, 34 c, 34 c, 32 c, 32 c,
- 32 c, 30 c, 30 c, 2E c, 2E c, 2E c, 2C c, 2C c,
- 2A c, 2A c, 2A c, 28 c, 28 c, 28 c, 26 c, 26 c,
- 26 c, 24 c, 24 c, 24 c, 22 c, 22 c, 22 c, 20 c,
- 20 c, 20 c, 1E c, 1E c, 1E c, 1C c, 1C c, 1C c,
- 1B c, 1B c, 1B c, 19 c, 19 c, 19 c, 19 c, 17 c,
- 17 c, 17 c, 17 c, 15 c, 15 c, 15 c, 13 c, 13 c,
- 13 c, 13 c, 11 c, 11 c, 11 c, 11 c, 0F c, 0F c,
- 0F c, 0F c, 0F c, 0D c, 0D c, 0D c, 0D c, 0B c,
- 0B c, 0B c, 0B c, 0B c, 09 c, 09 c, 09 c, 09 c,
- 07 c, 07 c, 07 c, 07 c, 07 c, 07 c, 05 c, 05 c,
- 05 c, 05 c, 05 c, 03 c, 03 c, 03 c, 03 c, 03 c,
- 03 c, 03 c, 03 c, 03 c, 03 c, 05 c, 05 c, 07 c,
- 09 c, 0B c, 0B c, 0D c, 0F c, 13 c, 15 c, 17 c,
- 19 c, 1B c, 1C c, 1E c, 20 c, 22 c, 24 c, 26 c,
- 28 c, 28 c, 2A c, 2C c, 2E c, 30 c, 32 c, 32 c,
- 34 c, 36 c, 38 c, 3A c, 3C c, 3C c, 3E c, 40 c,
- 42 c, 44 c, 44 c, 46 c, 48 c, 4A c, 4A c, 4C c,
- 4E c, 4F c, 4F c, 51 c, 53 c, 55 c, 55 c, 57 c,
- 59 c, 59 c, 5B c, 5D c, 5D c, 5F c, 61 c, 61 c,
- 63 c, 65 c, 65 c, 67 c, 69 c, 69 c, 6B c, 6D c,
- 6D c, 6F c, 71 c, 71 c, 73 c, 73 c, 75 c, 77 c,
- 77 c, 79 c, 7B c, 7B c, 7D c, 7F c, 7F c, 80 c,
- here over - 2constant SQR1DATA
- decimal
- hex
- here ( 1 cycle - shaped square 2)
- 81 c, 81 c, 83 c, 83 c, 83 c, 83 c, 85 c, 85 c,
- 85 c, 87 c, 87 c, 87 c, 89 c, 89 c, 89 c, 89 c,
- 8B c, 8B c, 8B c, 8D c, 8D c, 8D c, 8D c, 8F c,
- 8F c, 8F c, 91 c, 91 c, 91 c, 93 c, 93 c, 95 c,
- 95 c, 95 c, 97 c, 97 c, 99 c, 99 c, 9A c, 9C c,
- 9C c, 9E c, 9E c, 0A0 c, 0A2 c, 0A2 c, 0A4 c, 0A6 c,
- 0A8 c, 0AA c, 0AA c, 0AC c, 0AE c, 0B0 c, 0B2 c, 0B3 c,
- 0B5 c, 0B7 c, 0B9 c, 0BB c, 0BD c, 0BF c, 0C1 c, 0C3 c,
- 0C5 c, 0C7 c, 0C9 c, 0CB c, 0CE c, 0D0 c, 0D2 c, 0D4 c,
- 0D6 c, 0D8 c, 0DA c, 0DC c, 0DE c, 0E0 c, 0E2 c, 0E4 c,
- 0E5 c, 0E7 c, 0E9 c, 0E9 c, 0EB c, 0ED c, 0EF c, 0F1 c,
- 0F1 c, 0F3 c, 0F5 c, 0F5 c, 0F7 c, 0F7 c, 0F9 c, 0F9 c,
- 0FB c, 0FB c, 0FB c, 0FD c, 0FD c, 0FD c, 0FE c, 0FE c,
- 0FE c, 0FE c, 0FE c, 0FE c, 0FE c, 0FE c, 0FE c, 0FE c,
- 0FE c, 0FE c, 0FE c, 0FD c, 0FD c, 0FD c, 0FD c, 0FD c,
- 0FB c, 0FB c, 0FB c, 0F9 c, 0F9 c, 0F9 c, 0F7 c, 0F7 c,
- 0F5 c, 0F5 c, 0F5 c, 0F3 c, 0F3 c, 0F1 c, 0F1 c, 0F1 c,
- 0EF c, 0EF c, 0ED c, 0ED c, 0ED c, 0EB c, 0EB c, 0E9 c,
- 0E9 c, 0E9 c, 0E7 c, 0E7 c, 0E7 c, 0E5 c, 0E5 c, 0E5 c,
- 0E4 c, 0E4 c, 0E4 c, 0E4 c, 0E2 c, 0E2 c, 0E2 c, 0E2 c,
- 0E0 c, 0E0 c, 0E0 c, 0E0 c, 0E0 c, 0DE c, 0DE c, 0DE c,
- 0DE c, 0DE c, 0DE c, 0DC c, 0DC c, 0DC c, 0DC c, 0DC c,
- 0DC c, 0DA c, 0DA c, 0DA c, 0DA c, 0DA c, 0DA c, 0D8 c,
- 0D8 c, 0D8 c, 0D8 c, 0D8 c, 0D6 c, 0D6 c, 0D6 c, 0D6 c,
- 0D4 c, 0D4 c, 0D4 c, 0D4 c, 0D4 c, 0D2 c, 0D2 c, 0D2 c,
- 0D2 c, 0D0 c, 0D0 c, 0D0 c, 0CE c, 0CE c, 0CE c, 0CC c,
- 0CC c, 0CC c, 0CB c, 0CB c, 0CB c, 0C9 c, 0C9 c, 0C9 c,
- 0C7 c, 0C7 c, 0C5 c, 0C5 c, 0C3 c, 0C3 c, 0C1 c, 0C1 c,
- 0BF c, 0BD c, 0BD c, 0BB c, 0BB c, 0B9 c, 0B7 c, 0B5 c,
- 0B5 c, 0B3 c, 0B2 c, 0B0 c, 0AE c, 0AC c, 0AA c, 0A8 c,
- 0A6 c, 0A4 c, 0A2 c, 0A0 c, 9E c, 9C c, 9A c, 99 c,
- 97 c, 93 c, 91 c, 8F c, 8D c, 89 c, 87 c, 85 c,
- 81 c, 80 c, 7F c, 7B c, 79 c, 77 c, 73 c, 71 c,
- 6F c, 6B c, 69 c, 67 c, 64 c, 62 c, 60 c, 5E c,
- 5A c, 58 c, 56 c, 54 c, 52 c, 50 c, 4E c, 4D c,
- 4B c, 49 c, 47 c, 45 c, 43 c, 41 c, 3F c, 3F c,
- 3D c, 3B c, 39 c, 39 c, 37 c, 37 c, 35 c, 34 c,
- 34 c, 32 c, 32 c, 30 c, 30 c, 2E c, 2E c, 2E c,
- 2C c, 2C c, 2C c, 2A c, 2A c, 28 c, 28 c, 28 c,
- 26 c, 26 c, 26 c, 24 c, 24 c, 24 c, 22 c, 22 c,
- 22 c, 20 c, 20 c, 20 c, 1E c, 1E c, 1E c, 1C c,
- 1C c, 1B c, 1B c, 19 c, 19 c, 19 c, 17 c, 17 c,
- 15 c, 15 c, 13 c, 13 c, 13 c, 11 c, 11 c, 0F c,
- 0F c, 0D c, 0D c, 0D c, 0B c, 0B c, 0B c, 09 c,
- 09 c, 09 c, 07 c, 07 c, 07 c, 05 c, 05 c, 05 c,
- 05 c, 05 c, 05 c, 03 c, 03 c, 03 c, 03 c, 03 c,
- 03 c, 03 c, 03 c, 03 c, 03 c, 05 c, 05 c, 05 c,
- 05 c, 05 c, 05 c, 05 c, 07 c, 07 c, 07 c, 07 c,
- 09 c, 09 c, 09 c, 09 c, 0B c, 0B c, 0B c, 0D c,
- 0D c, 0D c, 0F c, 0F c, 0F c, 0F c, 11 c, 11 c,
- 11 c, 13 c, 13 c, 13 c, 15 c, 15 c, 15 c, 15 c,
- 17 c, 17 c, 17 c, 17 c, 19 c, 19 c, 19 c, 1B c,
- 1B c, 1B c, 1B c, 1C c, 1C c, 1C c, 1E c, 1E c,
- 1E c, 20 c, 20 c, 20 c, 22 c, 22 c, 22 c, 24 c,
- 24 c, 26 c, 26 c, 26 c, 28 c, 28 c, 2A c, 2A c,
- 2C c, 2C c, 2E c, 30 c, 30 c, 32 c, 32 c, 34 c,
- 35 c, 35 c, 37 c, 37 c, 39 c, 3B c, 3B c, 3D c,
- 3F c, 3F c, 41 c, 43 c, 45 c, 45 c, 47 c, 49 c,
- 49 c, 4B c, 4D c, 4D c, 4E c, 50 c, 52 c, 52 c,
- 54 c, 56 c, 56 c, 58 c, 5A c, 5A c, 5C c, 5E c,
- 5E c, 60 c, 62 c, 62 c, 64 c, 64 c, 66 c, 67 c,
- 67 c, 69 c, 69 c, 6B c, 6D c, 6D c, 6F c, 6F c,
- 71 c, 71 c, 73 c, 73 c, 75 c, 75 c, 77 c, 77 c,
- 79 c, 79 c, 79 c, 7B c, 7B c, 7D c, 7D c, 7F c,
- here over - 2constant SQR2DATA
- decimal
- hex
- here ( exponential data - approx 10 mS at 11025 b/s)
- 0F4 c, 0E9 c, 0DE c, 0D5 c, 0CB c, 0C2 c, 0BA c, 0B1 c,
- 0A9 c, 0A2 c, 9B c, 94 c, 8D c, 87 c, 81 c, 7B c,
- 76 c, 71 c, 6C c, 67 c, 62 c, 5E c, 5A c, 56 c,
- 52 c, 4E c, 4B c, 47 c, 44 c, 41 c, 3E c, 3C c,
- 39 c, 36 c, 34 c, 32 c, 2F c, 2D c, 2B c, 29 c,
- 28 c, 26 c, 24 c, 23 c, 21 c, 20 c, 1E c, 1D c,
- 1B c, 1A c, 19 c, 18 c, 17 c, 16 c, 15 c, 14 c,
- 13 c, 12 c, 11 c, 11 c, 10 c, 0F c, 0F c, 0E c,
- 0D c, 0D c, 0C c, 0C c, 0B c, 0B c, 0A c, 0A c,
- 09 c, 09 c, 08 c, 08 c, 08 c, 07 c, 07 c, 07 c,
- 06 c, 06 c, 06 c, 06 c, 05 c, 05 c, 05 c, 05 c,
- 04 c, 04 c, 04 c, 04 c, 04 c, 04 c, 03 c, 03 c,
- 03 c, 03 c, 03 c, 03 c, 03 c, 02 c, 02 c, 02 c,
- 02 c, 02 c, 02 c, 02 c, 02 c, 02 c,
- here over - 2constant EXPDATA
- decimal
- : EXPSIZ ( -- n ) expdata nip ;
- defer CYCLEDATA
- : SINWAVE ( -- ) ['] sindata is cycledata ;
- : SQR1WAVE ( -- ) ['] sqr1data is cycledata ;
- : SQR2WAVE ( -- ) ['] sqr2data is cycledata ;
- sqr1wave
- \ Koch characters
- create KTABLE ( -- a )
- char K c, char M c, char R c, char S c, char U c,
- char A c, char P c, char T c, char L c, char O c,
- char W c, char I c, char . c, char N c, char J c,
- char E c, char F c, char 0 c, char Y c, char V c,
- char , c, char G c, char 5 c, char / c, char Q c,
- char 9 c, char Z c, char H c, char 3 c, char 8 c,
- char B c, char ? c, char 4 c, char 2 c, char 7 c,
- char C c, char 1 c, char D c, char 6 c, char X c,
- here ktable - to #koch
- \ Table of valid characters
- create LOOKUP ( -- a )
- bl c, here ( *)
- char A c, char B c, char C c, char D c, char E c,
- char F c, char G c, char H c, char I c, char J c,
- char K c, char L c, char M c, char N c, char O c,
- char P c, char Q c, char R c, char S c, char T c,
- char U c, char V c, char W c, char X c, char Y c,
- char Z c,
- char 0 c, char 1 c, char 2 c, char 3 c, char 4 c,
- char 5 c, char 6 c, char 7 c, char 8 c, char 9 c,
- ( *) here over - to #basic
- char . c, char / c, char ? c,
- ( *) here over - to #punct
- char ! c, char " c, char $ c, char & c, char ' c,
- char + c, char , c, char - c, char : c, char ; c,
- char = c, char _ c, char ( c, char ) c,
- ( *) here over - to #extended
- \ ARRL Morse Practice control codes
- $83 c, $89 c, $82 c,
- ( *) here swap - to #controls
- \ Get default wave filetype
- : WAVETYPE ( -- a u )
- outdev
- 1 of s" WAV" end
- 2 of s" VOC" end
- drop here 0 ;
- : SETVOICE ( a u -- a' 0 )
- firstnum if
- 0 of sinwave end
- 1 of sqr1wave end
- 2 of sqr2wave end
- badoption
- then ;
- : SETFORM ( a u -- a' 0 )
- firstnum if groupcols !
- nextnum if grouprows !
- nextnum if groupsize ! then
- then
- then ;
- : SETSPACE ( a u -- a' 0 ) \ values checked later
- firstnum if wspace !
- nextnum if cspace ! then
- then ;
- : SETSPEED ( a u -- a' 0 ) \ values checked later
- firstnum if send.s !
- nextnum if 0 of send.s @ then char.s ! then
- then ;
- : SETKOCH ( a u -- a' 0 )
- firstnum if \ use Koch character set
- dup 2 #koch between ?badoption
- koch ! 2 punct !
- then ;
- :noname ( a u char -- a u )
- upcase
- [char] S of setspeed end
- [char] C of /num char.s ! end
- [char] D of setspace end
- [char] T of 400 1000 /numrange tone ! end
- [char] P of 0 2 /numrange punct ! end
- [char] O of compress off end
- [char] W of 1 to outdev setvoice end
- [char] V of 2 to outdev setvoice end
- [char] U of 0 9 /numrange volume ! end
- [char] G of train off compress off setkoch end
- [char] R of train off compress off
- #koch min dup koch ! 2dup upper
- ktable swap cmove 2 punct ! 0 0 end
- [char] F of setform end
- [char] I of ignore on end
- [char] L of lsignal on end
- [char] H of true to hide end
- badoption ; is setoption
- \ Parse filenames
- :noname ( -- )
- argv 0= if help then
- s" TXT" +ext infile !fname
- argv 0= if \ no second name
- infile @fname \ use first
- train @ if -path -ext then
- then
- outdev if wavetype else s" TXT" then +ext
- outfile !fname ; is parsefilename
- \ Wait for a key and randomize seed
- : ANYKEY ( -- )
- cr ." [Any key to begin - ESC quits]"
- begin
- 1 rnd +! key?
- until ?stopkey cr ;
- : SPEEDCHECK ( -- )
- send.s @ char.s @
- 2dup speedrange between swap speedrange between and 0= if
- cr ." Speed out of range" .abort
- then > if
- cr ." Send speed greater than char speed" .abort
- then ;
- : SPACECHECK ( -- )
- cspace @ dup 2 < if
- cr ." Char space less than 2" .abort
- then
- wspace @ > if
- cr ." Word space less than char space" .abort
- then ;
- \ Show settings
- : .SETTINGS ( -- ) hide not if cr
- send.s @ 0 .r [char] / emit char.s @ . ." WPM "
- wspace @ 0 .r [char] / emit cspace @ . ." SPC "
- tone @ . ." Hz " koch @ ?dup if
- . ." chars "
- else punct @ cond
- 1 of ." basic" else
- 2 of ." full" else
- drop ." no"
- cont ." punct "
- then
- compress @ 0= if ." no compress " then
- lsignal @ if ." line signals" then cr
- then speedcheck spacecheck ;
- hex
- here ( WAV header)
- 52 c, 49 c, 46 c, 46 c, 00 c, 00 c, 00 c, 00 c,
- 57 c, 41 c, 56 c, 45 c, 66 c, 6D c, 74 c, 20 c,
- 10 c, 00 c, 00 c, 00 c, 01 c, 00 c, 01 c, 00 c,
- 11 c, 2B c, 00 c, 00 c, 11 c, 2B c, 00 c, 00 c,
- 01 c, 00 c, 08 c, 00 c, 64 c, 61 c, 74 c, 61 c,
- 00 c, 00 c, 00 c, 00 c,
- here over - 2constant WAV-HDR
- decimal
- hex
- here ( VOC header)
- 43 c, 72 c, 65 c, 61 c, 74 c, 69 c, 76 c, 65 c,
- 20 c, 56 c, 6F c, 69 c, 63 c, 65 c, 20 c, 46 c,
- 69 c, 6C c, 65 c, 1A c, 1A c, 00 c, 0A c, 01 c,
- 29 c, 11 c, 01 c, 00 c, 00 c, 00 c, A5 c, 00 c,
- here over - 2constant VOC-HDR
- decimal
- 0 value CYCADR ( -- adr ) \ cycle data
- 0 value SPCADR ( -- adr ) \ space data
- 0 value POINTS ( -- n ) \ points per cycle
- 0 value RISEADR ( -- adr ) \ rising data
- 0 value DECAYADR ( -- adr ) \ decaying data
- 0 value EPOINTS ( -- n ) \ points per exp cycles
- : CYCLEWAVE ( -- a n ) cycadr points ;
- : SPACEWAVE ( -- a n ) spcadr points ;
- : RISEWAVE ( -- a n ) riseadr epoints ;
- : DECAYWAVE ( -- a n ) decayadr epoints ;
- : MS-LOOPS ( -- u1 u2 ) ratio 2@ ;
- create LOGVAL \ logarithmic volume levels
- \ -24 -21 -18 -15 -12 -9 -6 -3 0
- 0 c, 16 c, 23 c, 32 c, 45 c, 64 c, 90 c, 128 c, 180 c, 255 c,
- \ Apply volume to sample
- : +VOL ( x -- x' )
- $80 - volume @ logval + c@ 255 */ $80 + ;
- \ Generate cycle data for specified tone
- : GENWAVE ( -- )
- points reserve to cycadr
- cycledata ( a n) points / tuck
- ( step a step) 2/ - ( center sampled data) ( step a')
- points 0 ?do
- over + dup c@ +vol cycadr i + c!
- loop 2drop ;
- \ Reserve epoints of cycledata for shaping
- : ERESERVE ( -- adr )
- epoints dup 1+ reserve dup rot points / 0 ?do
- >r cyclewave r@ swap cmove r> points +
- loop drop ;
- \ Generate rising data (approx 10 mS)
- : GENRISE ( -- )
- ereserve dup to riseadr
- ( adr) expdata bounds do
- dup c@ $80 - 255 i c@ - 255 */ $80 + over c! 1+
- loop drop ;
- \ Generate decaying data (approx 10 mS)
- : GENDECAY ( -- )
- ereserve dup to decayadr epoints + expsiz -
- ( adr) expdata bounds do
- dup c@ $80 - i c@ 255 */ $80 + over c! 1+
- loop drop ;
- : GENSPC ( -- ) \ gen space data for specified tone
- points reserve to spcadr
- points 0 ?do $80 spcadr i + c! loop ;
- : SETRATIO ( -- ) \ set loops/msec for specified tone
- 100 points over * 1000 um* bitrate um/mod nip ratio 2! ;
- : SETPOINTS ( -- ) \ set points for specified tone
- bitrate tone @ / dup to points
- expsiz over /mod swap if 1+ then * to epoints ;
- : INITWAVE ( -- )
- setpoints setratio genwave genrise gendecay genspc ;
- \ Write header
- : STARTWAVE ( -- )
- 0. wavesiz 2!
- outdev
- 1 of wav-hdr writedata end
- 2 of voc-hdr writedata end
- drop ;
- \ Patch WAV/VOC data size
- : !SIZE ( u -- )
- wavesiz 2@ swap pad 2! pad swap writedata ;
- \ Patch size
- : ENDWAVE ( -- )
- outdev
- 1 of 0 pad c! pad 1 writedata
- 40. seekoutfile 4 !size
- 36 wavesiz m+!
- 4. seekoutfile 4 !size end
- 2 of 0 pad c! pad 1 writedata
- 2 wavesiz m+!
- 27. seekoutfile 3 !size end
- drop ;
- \ Write u bytes wavedata to file
- : WRITEWAVE ( a u -- )
- tuck writedata wavesiz m+! ;
- \ Write wavedata to file for n millisec
- : WRITEMSEC ( a u ms -- )
- ms-loops */ 0 ?do 2dup writewave loop 2drop ;
- \ Adjust for rise/decay period
- : ADJUST ( ms1 -- ms2 )
- epoints 1000 bitrate */ - 0 max ;
- \ Output morse beep for n millisec
- : MBEEP ( n -- )
- outdev if
- risewave writewave shaping on
- cyclewave rot adjust writemsec
- end tone @ swap sound ;
- \ Output morse quiet for n millisec
- : MQUIET ( n -- )
- outdev if
- shaping @ if ( complete previous MBEEP )
- adjust decaywave writewave shaping off
- then spacewave rot writemsec
- end ms ;
- \ To keep average word speed correct adjust for plain or random
- \ text (not implemented)
- \ Set plain text mode
- : PLAIN-TEXT ( -- )
- 31 to d_elements 19 to s_elements rndtxt off ;
- \ Set random text mode
- : RANDOM-TEXT ( -- )
- 41 to d_elements 19 to s_elements rndtxt on ;
- \ TIM is basic timing element (one DIT). SPC is basic spacing
- \ element. If character/send speed are same then SPC=TIM.
- \ Length of one DIT (msec)
- : TIM ( -- ms )
- 60 1000 char.s @ d_elements s_elements + * */ ;
- \ Length of one space (msec)
- : SPC ( -- ms )
- 60 1000 send.s @ */ tim d_elements * - s_elements / ;
- \ Each morse element followed by 1*TIM space
- : DI ( -- ) tim mbeep tim mquiet ;
- : DA ( -- ) tim 3 * mbeep tim mquiet ;
- \ Each morse character followed by 3*SPC partial word space
- : DIT ( -- ) tim mbeep spc cspace @ * mquiet spacing on ;
- : DAH ( -- ) tim 3 * mbeep spc cspace @ * mquiet spacing on ;
- \ Word space adjusted for preceding partial
- : __ ( -- ) spc wspace @ cspace @ spacing @ and - * mquiet
- spacing off ;
- \ Insert word space only if preceding partial
- : ?SPACE ( -- ) spacing @ if __ then ;
- vocabulary MORSE
- morse definitions warning off
- \ Letters
- : A DI DAH ; : B DA DI DI DIT ; : C DA DI DA DIT ;
- : D DA DI DIT ; : E DIT ; : F DI DI DA DIT ;
- : G DA DA DIT ; : H DI DI DI DIT ; : I DI DIT ;
- : J DI DA DA DAH ; : K DA DI DAH ; : L DI DA DI DIT ;
- : M DA DAH ; : N DA DIT ; : O DA DA DAH ;
- : P DI DA DA DIT ; : Q DA DA DI DAH ; : R DI DA DIT ;
- : S DI DI DIT ; : T DAH ; : U DI DI DAH ;
- : V DI DI DI DAH ; : W DI DA DAH ; : X DA DI DI DAH ;
- : Y DA DI DA DAH ; : Z DA DA DI DIT ;
- \ Numbers
- : 1 DI DA DA DA DAH ; : 2 DI DI DA DA DAH ;
- : 3 DI DI DI DA DAH ; : 4 DI DI DI DI DAH ;
- : 5 DI DI DI DI DIT ; : 6 DA DI DI DI DIT ;
- : 7 DA DA DI DI DIT ; : 8 DA DA DA DI DIT ;
- : 9 DA DA DA DA DIT ; : 0 DA DA DA DA DAH ;
- \ Basic punctuation
- : . DI DA DI DA DI DAH ; : ? DI DI DA DA DI DIT ;
- : / DA DI DI DA DIT ;
- \ Extended punctuation
- : ! DA DI DA DI DA DAH ; : " DI DA DI DI DA DIT ;
- : $ DI DI DI DA DI DI DAH ; : & DI DA DI DI DIT ;
- : ' DI DA DA DA DA DIT ; : + DI DA DI DA DIT ;
- : , DA DA DI DI DA DAH ; : - DA DI DI DI DI DAH ;
- : :: DA DA DA DI DI DIT ; : ;; DA DI DA DI DA DIT ;
- : = DA DI DI DI DAH ; : _ DI DI DA DA DI DAH ;
- : (( DA DI DA DA DIT ; : ) DA DI DA DA DI DAH ;
- \ Prosigns
- : AA DI DA DI DAH ; : AR DI DA DI DA DIT ;
- : AS DI DA DI DI DIT ; : BT DA DI DI DI DAH ;
- : CT DA DI DA DI DAH ;
- : HH DI DI DI DI DI DI DI DIT ; : KN DA DI DA DA DIT ;
- : SK DI DI DI DA DI DAH ; : SN DI DI DI DA DIT ;
- : SOS DI DI DI DA DA DA DI DI DIT ;
- aka SK VA aka SN VE aka CT KA
- forth definitions
- warning on
- \ Send 1 minute of morse
- \ Using DOS under Windows will result in longer times
- : CALIBRATE ( -- )
- send.s @ 0 do
- rndtxt @ if
- [ morse ] C O D E X __ [ forth ]
- else
- [ morse ] P A R I S __ [ forth ]
- then
- key? if key drop break
- loop beep ;
- \ Morse execution table - must match LOOKUP
- create MTABLE ( -- a )
- morse ]
- __
- A B C D E F G H I J K L M
- N O P Q R S T U V W X Y Z
- 0 1 2 3 4 5 6 7 8 9
- . / ?
- ! " $ & ' + , - :: ;; = _ (( )
- AS BT AR
- [ forth
- \ Return range of valid characters
- : VALIDRANGE ( -- n )
- punct @
- 0 of #basic end
- 1 of #punct end
- 2 of #controls end \ include ARRL controls
- drop #basic ;
- \ Select character set for random groups
- : CHARSET ( -- adr len )
- koch @ ?dup if ktable else
- validrange #extended min \ exclude ARRL controls
- lookup 1+
- then swap ;
- \ Create group buffer
- : ALLOTGBUF ( -- )
- groupcols @ grouprows @ * groupsize @ *
- ( size) dup gmax 1+ 1 within if
- cr ." Groups must be 1.." gmax . ." chars" .abort
- then dup to gsize reserve to gbuf ;
- \ Fill group buffer with charset until full
- : FILLGBUF ( adr len -- )
- gsize over /mod 2>r
- gbuf r> 0 ?do ( chunks)
- >r 2dup r@ swap cmove dup r> +
- loop swap r> ( remaining) min cmove ;
- \ Fill group buffer with shuffled characters
- : FILLRANDOM ( -- )
- allotgbuf charset fillgbuf gbuf gsize shuffle ;
- \ Get randomized ascii char from buffer
- \ If char same as last rotate it to bottom
- : RANDOMCHAR ( -- char )
- gbuf c@ gsize 0 do
- dup lastchar @ - if break
- gbuf dup gsize 1 /string rot swap cmove
- ( c) gbuf gsize + 1- c! gbuf c@
- loop dup lastchar !
- gbuf 1+ to gbuf gsize 1- to gsize ;
- \ Write string to file
- : WRITECHARS ( a u -- ) bounds ?do i c@ writechar loop ;
- \ Write end-of-line to file
- : WRITECR ( -- ) (cr) writechars ;
- \ Write one line of groups
- : RANDOMLINE ( -- )
- groupcols @ 0 ?do
- bl writechar space
- groupsize @ 0 ?do randomchar dup ?emit writechar loop
- loop writecr ?cr ;
- \ Save settings to file
- : !SETTINGS ( -- )
- s" [options]" writechars
- s" -s" writechars send.s @ (.) writechars
- s" -c" writechars char.s @ (.) writechars
- s" -d" writechars wspace @ (.) writechars
- cspace @ dup 3 <> and ?dup if
- [char] , writechar (.) writechars
- then
- s" -t" writechars tone @ (.) writechars
- s" -o" compress @ 0= and writechars
- s" -p" writechars punct @ (.) writechars
- s" -l" lsignal @ 0<> and writechars
- s" -u" writechars volume @ (.) writechars
- writecr ;
- \ Make random groups
- : MAKEGROUPS ( -- )
- .settings !settings anykey
- fillrandom lastchar off
- grouprows @ 0 ?do randomline loop ;
- \ Character substitution
- : SUBSTITUTE ( char1 -- char2 )
- [char] [ of [char] ( end
- [char] ] of [char] ) end
- [char] { of [char] ( end
- [char] } of [char] ) end
- ;
- \ Check character substitute space if invalid
- : CHECKCHAR ( char1 -- char2 index )
- validrange
- begin
- 2dup lookup + c@ <>
- over 0<> and
- while
- 1-
- repeat
- dup 0= if ( invalid or space )
- nip bl swap
- then ;
- \ Sound the character
- : SOUNDCHAR ( index -- ) cells mtable + @ execute ;
- \ Output char to screen and speaker
- : MORSECHAR ( char -- )
- substitute checkchar
- over bl = lastchar @ bl = and if
- drop ( repeated space and compress on)
- else
- over ?emit soundchar
- then
- ( char) compress @ and lastchar ! ;
- \ Send start of line sequence
- : STARTLINE ( -- )
- lsignal @ whitespace @ not and if
- 1000 mquiet [ morse ] CT [ forth ] 1000 mquiet
- then ;
- \ Send end of line sequence
- : ENDLINE ( -- )
- ?space \ complete any partial space
- lsignal @ whitespace @ not and if
- 1000 mquiet [ morse ] AR [ forth ] 1000 mquiet
- then ;
- variable PCHAR \ proc type - prosign or PCM sample
- create PBUF linemax allot \ hash code or PCM filename
- : PNAME ( -- a u ) pbuf count ;
- : /PROC ( -- ) pchar off pbuf off lastchar off ;
- : +HASH ( c -- ) pbuf @ 4 lshift xor pbuf ! ;
- : +PNAME ( c -- ) pname dup 1+ pbuf c! + c! ;
- : +PROC ( c -- ) pchar @
- [char] \ of +hash end
- [char] | of +pname end
- drop ;
- system
- : HASH ( "ccc" -- ) /proc token bounds
- ?do i c@ +hash loop pbuf @ postpone literal ; immediate
- application
- \ Output prosign to speaker if ready
- : DO-PROSIGN ( -- ) ?space pbuf @
- hash AA of [ morse ] AA [ forth ] end
- hash AR of [ morse ] AR [ forth ] end
- hash AS of [ morse ] AS [ forth ] end
- hash BT of [ morse ] BT [ forth ] end
- hash CT of [ morse ] CT [ forth ] end
- hash HH of [ morse ] HH [ forth ] end
- hash KA of [ morse ] KA [ forth ] end
- hash KN of [ morse ] KN [ forth ] end
- hash SK of [ morse ] SK [ forth ] end
- hash SN of [ morse ] SN [ forth ] end
- hash SOS of [ morse ] SOS [ forth ] end
- hash VA of [ morse ] VA [ forth ] end
- hash VE of [ morse ] VE [ forth ] end
- drop s" <- unknown prosign ... ignoring" ?type ?cr
- ;
- handle PCMFILE \ create PCM file handle
- : PCMOPEN ( a u fam -- ) pcmfile tuck 2>r !fname 2r> (fopen) ;
- : PCMREAD ( a u -- a u' ) pcmfile >fid fread eof trim ;
- : PCMCLOSE ( -- ) pcmfile fclose drop ;
- \ Read PCM sample from disk
- : GETSAMPLE ( a u -- a' u' )
- r/o pcmopen pad unused 32767 umin pcmread pcmclose
- 0 trim #pcmhdr /string 0 max ;
- \ Insert PCM sample
- : DO-PCM ( -- )
- outdev if
- pname s" pcm" +ext getsample writewave spacing off
- end 900 ms ;
- \ Output procedure if exists
- : ?SENDPROC ( -- )
- pchar @ ?dup if
- cond
- [char] \ of do-prosign else
- [char] | of do-pcm else
- drop cont
- then /proc ;
- : SENDLINE ( a u -- )
- /proc bounds ?do
- i c@ dup $20 or $7c = if \ chars '\' or '|'
- ?sendproc dup pchar ! ( c) ?emit
- else
- pchar @ if \ within proc
- dup bl = if \ end proc
- ?sendproc ( bl) morsechar
- else
- ( c) dup +proc ?emit \ for each proc char
- then
- else ( c) morsechar then
- then
- ?stop
- loop ?sendproc ; \ handle proc at EOL
- \ Convert control chars, case and test whitespace
- : CLEAN ( a u -- a u' )
- 2dup >blanks 2dup upper
- 2dup -trailing nip 0= whitespace ! ;
- \ Output current line as Morse
- : MORSELINE ( -- )
- line 2@ clean
- over c@ [char] # = over 0<> and ( comment)
- over 0= ( empty line) or if ?type end
- startline sendline endline ;
- \ Get settings from file
- : @SETTINGS ( -- flag )
- line 2@ bl split
- s" [OPTIONS]" caps compare if 2drop false end
- !arg ignore @ not if parseoption initwave then true ;
- \ Get a line of text from file
- : GETLINE ( -- flag)
- lbuf linemax readtext -rot line 2! ;
- \ Send text file as morse
- : SENDMORSE ( -- )
- outdev 0= if anykey then
- getline if ( file not empty)
- initwave @settings ( flag) .settings
- startwave 4000 mquiet
- begin
- ( flag) 0= if morseline ?cr then getline
- while ( not EOF)
- @settings dup if .settings then
- repeat
- 2000 mquiet endwave
- then ;
- \ Run application
- : (RUN) ( -- )
- train @ if
- cr ." infile: " infile .fname r/o openinfile
- outdev if
- cr ." outfile: " outfile .fname r/w makeoutfile
- then
- cr sendmorse
- else
- cr ." outfile: " outfile .fname r/w makeoutfile
- cr makegroups
- then
- closefiles ;
- \ Set application defaults
- : DEFAULTS ( -- )
- 0 to outdev shaping off spacing off
- train on koch off
- plain-text punct off compress on ignore off
- 7 send.s ! 15 char.s ! 3 cspace ! 7 wspace !
- 700 tone ! 7 volume ! sqr1wave
- 6 groupcols ! 4 grouprows ! 3 groupsize !
- lsignal off 0 to hide ;
- defaults
- \ Run application with error handling
- : RUN ( -- )
- ['] (run) catch ?dup if >r onerror r> throw then ;
- \ Main
- : PROGRAM ( -- )
- onstart \ startup initialization
- con-io \ default console mode
- defaults \ set defaults
- cr title \ show application name
- cmdtail parsecmd \ process command-line
- run \ run application
- cr ." done" \ show success
- ;
Add Comment
Please, Sign In to add comment