Shop OBEX P1 Docs P2 Docs Learn Events
Peter Jakacki - Forth2020 Facebook Group - Mirror — Parallax Forums

Peter Jakacki - Forth2020 Facebook Group - Mirror

MJBMJB Posts: 1,235
edited 2021-08-05 06:18 in Forth

Peter went quiet here at the forums - but is still active on the new Forth2020 Facebook Group

here:
https://facebook.com/groups/2225595150855239/user/100001403722826

you can find Peter's posts.

And since I decided to collect his posts into a word document for better future reference
I can also copy/paste the posts here for all without Facebook access.

I hope this helps keeping the friends of Tachyon /Taqoz up to date and motivated.

Comments

  • Brilliant ! Thanks.
    I have watched some of the recordings on YT from the Forth2020 group meetings, with great interst, I mean the Peter's parts and he did a really great job there promoting Propeller chips and his forths.

  • MJBMJB Posts: 1,235

    Peter Jakacki Forth2020 Users-Group

    I'm a bit confused as to what this group covers. Is it Forth2020 for PCs and also somehow ESP32 eForth as well, or are these simply the main focus of the group at present?
    I'm wondering because my main focus at the moment is with the P1 and P2
    chips although I have written industrial grade embedded Forths for dozens of different micros including the LPC2148 back in 2005 for my noPC which also generated color VGA graphics using interrupts etc. I can't say though that any of my Forths have been standard because of the need to maximize and adapt to the power of the particular MCU.
    While I do use ESP32s for instance, I haven't given any thought to implementing a custom Forth for it, although I could easily enough do so I guess. I have given thought to implementing Forth for RISC-V chips, such as the tiny 32-bit packages and also the dual-core 64-bit K210 etc.
    At the moment though I find TAQOZ on the P2 is keeping me busy as I am starting a new expandable open-hardware/software test instrument that can even replace an expensive MSO using the power of the P2, its 8 cores, and the 64 "peripherals-in-a-pin" smartpins etc. Of course the software is written in Forth so I can also customize the instrument and even write what I call "quick&dirty one-liners" as required.

  • "At the moment though I find TAQOZ on the P2 is keeping me busy as I am starting a new expandable open-hardware/software test instrument that can even replace an expensive MSO using the power of the P2, its 8 cores, and the 64 "peripherals-in-a-pin" smartpins etc."

    Maybe that is (the above) what's keeping Peter too busy to be bothered by the forum members' requests or suggestions. Maybe, and that would be a logical step for me, he just wants to do it his own way and only come here to announce his creation ?
    I would certainly hope so. That would be really great. I really need a sort of device he's mentioning. Fingers crossed.

  • MJBMJB Posts: 1,235

    Peter JakackiForth2020 Users-Group

    My introduction to Forth was around 1983 when I did a short stint as a tech with an Apple dealer. The software guy there showed me MicroMotion Forth he was playing with and I was fascinated. I subsequently used this interactive but bare metal friendly "FORTH" to write diagnostic routines. They also had "Starting Forth" so I grabbed a copy and devoured it.
    Shortly thereafter I was "reactivated" and asked to design a POS terminal control board. I got very excited thinking about how useful Forth would be and researched my hardware design for a suitable CPU that could also run Forth. Fortunately the Rockwell R6511 single chip MCU was available with Forth kernel and dev ROMS, so I purchased the lot and designed my first pcb and hacked the ROMs etc.
    (The POS project was a huge multi-million dollar success btw)
    My original copy of Starting Forth and subsequent backup copy have long ago disappeared into the deep and dark chasm of borrowed books but I managed to find one second-hand in gc a couple of years ago and I had to have it.
    Here now I have laid out all the Forth books I could find including some manuals etc. Another day I will lay out some of my Forth hardware designs including the original R6511.

  • MJBMJB Posts: 1,235

    Peter JakackiForth2020 Users-Group

    Something I found useful in my Forths is to have a trace function, especially in the early stages of a new kernel. The other thing is a timing function. What kind of debug tools do you have or like to have?
    Here's a partial screenshot of my trace function which I can also invoke from the serial receive routine if necessary, as in the case some code seems to hang etc.

  • MJBMJB Posts: 1,235

    Peter JakackiForth2020 Users-Group

    Forth is a very productive "tool", and I say tool as I hate to say "language" because most people envisage a huge compiler and libraries hosted on a PC that spits out a binary blob for a target processor whereas embedded Forth is a living interactive language and runtime environment that is on and in the target processor. Even $1 chips these days have the resources to host a Forth dev environment.
    Now, here's the problem. I have tiny 8-pin PIC chips embedded in designs that are very useful for all kinds of little things and the chips are "cheap as chips". But I am very very tired of Microchip's tools growing every more ginormous just to program an itty-bitty PIC in assembler. They also stop supporting older ICSP tools such as some of the PICkits etc but either way, those things are still awkward and tethered to a PC.
    Well, not no more. Forth to the rescue! Yesterday I wrote an ICSP and exerciser and today in between life I wrote an assembler that uses standard Microchip syntax etc. The day before I built the ICSP with a ZIF socket etc and mounted and wired it into one of my Propeller boards.
    I still need to add some finishing touches to it so that it is completely standalone in a production environment with a keyboard and VGA monitor but total code and dictionary is not worthy of Wiggins (Thinking Forth p66).
    Code bytes used = 614
    Name bytes used = 718
    Most of the dictionary usage is simply for the assembler mnemonics though.
    I plan to add a menu so production chips can just be programmed, verified and exercised with a touch of button and even timestamped and logged as well as burn a serial number etc. The files are stored on the SD card and in addition there are other programs too, some using the RS232 and RS422/485 ports for testing datacomms products and displaying the analysis on the monitor.
    Oh, I mentioned an assembler and source code will be on this standalone Forth PC with a 2k block editor for the assembly source code files so no longer will I need to download hundreds of megabytes and wrestle with it to make it work.
    Remember ----- Use the Forth
    I will be away for the next few days but I want to have it finished for Monday so I will post photos by then!

  • MJBMJB Posts: 1,235

    Peter JakackiForth2020 Users-Group

    Here's something nice and simple I can show you. The good old Mandelbrot zoomed right up. I can then do a frame buffer grab and save it as a BMP file on the SD card. I have to convert it for FB though since it doesn't allow those radical BMP files in.
    No photo description available.

  • MJBMJB Posts: 1,235

    Peter JakackiForth2020 Users-Group

    I had mentioned that I first used Forth in a commercial project using the R6511 chip and hacked combo of the RSC-Forth ROMS.
    Well, here is the original board I designed both as a development board with Floppy interface, and as a target board where an adaptor pcb could be plugged in over the CPU.
    The astute reader will notice that I used 8kB x6 CMOS SRAMS and the huge big component is a 1F supercap from back in the day when supercaps were just hitting the market. So that's 48kB of non-volatile SRAM which was needed to hold compacted product data files and sales info etc. Of course it also proved very useful for development purposes too. Alongside this was a 16kB EPROM. I still have my original red and blue taped pcb artwork for this too.
    What did I use for decode? Why bipolar PROMs of course! 😁
    Not long after I changed to a more compact credit card sized plugin module which had all the smarts and plugged into a product specific motherboard that had the matching connectors for the product and perhaps any additional interface chips which btw were mainly on the I2C bus. I will show you a photo of that one another day.

  • I used to hate the Rockwell65xx footprint. 25% of our assemblers bent the pins. Had to get my technicians to straighten them out.

  • Cluso99Cluso99 Posts: 18,069
    edited 2021-07-20 18:55

    I used the Rockwell modem chips in the late 80’s. Those Quip64 chips were fragile but our assemblers did a good job. Initially we used sockets but I removed them when we found they caused more problems than they solved. We sold 100,000’s of modems that I designed and programmed, including to Apple as the Apple Modem 2400. How slow is 2400 baud now ;)

  • MJBMJB Posts: 1,235

    Peter JakackiForth2020 Users-Group 7 April 2021

    Back in 2005 I wrote a Forth for the LPC21xx ARM chips. It used the full 32-bit ISA (before Cortex) and featured bytecode and it was fast. The chip was clocked at just over 66MHz and I used it in my noPC board. How does it compare with TAQOZ, the P2 Forth? Let's have a look at the ARM version first for timing and reporting one million empty loops and then also seeing inside the code as well out of curiosity.

    .VER
    ARM7 IVOS - 1.0b Peter Jakacki (Nov 2 2006-00:06:37)
    Copyright 2005 Peter Jakacki
    ok
    DECIMAL ok
    DEMO MS@ 1000000 0 DO LOOP MS@ SWAP - . ; ok
    DEMO 2028 ok

    SEE DEMO ....

    4000.0800: LFA 0001.E869
    4000.0804: ATR FF
    4000.0805: NFA 44 45 4D 4F 00 00 00

    4000.080C: CFA E1A0E00F 0FE1A0E0

    • LONG CALL TO FORTH INTERPRETER *
      4000.0814: FD 201B MS@
      4000.0817: E2 000F.4240 LIT32
      4000.081C: 00 0
      4000.081D: 2B (DO)
      4000.081E: F8 FF (LOOP) <4000.081E
      4000.0820: FD 201B MS@
      4000.0823: 59 SWAP
      4000.0824: 66 -
      4000.0825: C5 .

    4000.0826: FF EXIT

    That's pretty good and only 19 code bytes as well.
    EDIT: I forgot to count the CFA of 8 bytes which brings that to 27 bytes.

    Now let's try out the P2 and compare them.

    TAQOZ# .VER --- Parallax P2 TAQOZ RELOADED sIDE V2.8 'CHIP' Prop_Ver G 340MHz 210401-1230
    ok
    TAQOZ# : DEMO GETMS 1000000 0 DO LOOP GETMS SWAP - . ; --- ok
    TAQOZ# DEMO --- 95 ok
    TAQOZ# SEE DEMO
    1B834: pub DEMO
    0B42E: 0FF4 GETMS
    0B430: 0083 := 131
    0B436: 1800 0
    0B438: 10BC DO
    0B43A: 0143 LOOP
    0B43C: 0FF4 GETMS
    0B43E: 00A4 SWAP
    0B440: 00BB -
    0B442: 2B6F . ;
    ( 22 bytes )
    TAQOZ# 340 66 / . --- 5 ok

    TAQOZ# 2028 95 / . --- 21 ok

    So TAQOZ was 21 times faster and used 22 bytes since it uses wordcode (addresses and encoded instructions) but no CFA as such. But the P2 is running at 340MHz so scale that to the 66MHz of the LPC2148 and it is still a good 4 times faster. What's more, it still has 7 other cores spare. So overall and in reallife the P2 is 21 times faster or with all 8 cores crunching away it could be 168 times faster than the LPC2148 running an empty loop.
    You've seen my tiny P2D2 board before but here's the LPC2148 noPC board that I just used. It is still being used in products in different forms to this day and in fact this unit was only assembled last week.

  • MJBMJB Posts: 1,235

    Peter JakackiForth2020 Users-Group April 16

    CAUTION: The real question is at the end of this post 🙂
    I was looking back at a Forth I wrote for the MSP430 over 20 years ago when they started coming out with the embedded Flash. I think I used the MSP430F149 a lot IIRC. They were built into many commercial products and I even had other companies using my Forth as well.
    As I was looking at how I implemented the address interpreter I saw that it seemed quite efficient with a single "br @IP+". While it was a great chip mainly for the fact that it was a clean 16-bit ISA that reminded me of the TMS9900, the top clock speed was very limited although great for low-power uses and analog.
    However, my post is more about threading models and fields, and my current Tachyon/TAQOZ implementation. What I do there is assume addresses below a certain limit are simply assembly code and call it without any kind of CFA. For instance, @ is nothing more than a single instruction which includes a return operation set in its condition field, like this:
    ' @ ( addr -- long ) Fetch a long from hub memory
    00a54 10a 0b004623 FETCH ret rdlong a,a
    Note: The 10a address indicates that it ends up inside the 512x32 internal memory of the cog, where any address can be code or a register etc.
    When @ is compiled then the 16-bit address $10A is compiled and the address interpreter will always call it directly.
    Here it is as it would be compiled.
    TAQOZ# : DEMO @ PRINT ; --- ok
    TAQOZ# SEE DEMO
    1BC1B: pub DEMO
    0ABBA: 010A @
    0ABBC: 2B73 PRINT ;
    The $010A is called directly as code but the $2B73 for PRINT is recognized as high-level code and normally the IP is saved except the lsb is used to indicate a built-in exit which works a bit like the ret condition did on the assembly code.
    To show how DEMO itself would be compiled when referenced we can look at this code:
    TAQOZ# : DEMO2 DEMO ; --- ok
    TAQOZ# SEE DEMO2
    1BC13: pub DEMO2
    0ABBE: ABBB DEMO ;
    If you are still following me this far, you can see that excluding the lsb exit bit, that $ABBA was compiled, and unlike the Eurovision group, this is the address loaded into the IP, but there was no "CFA", it was implied.
    For reference, I have attached part of the address interpreter as a screenshot.
    REAL QUESTION
    Here's my big question, amongst all the anomalies of Tachyon, how best would you describe this Forth? I am at a loss to describe it as I only write Forths, not classify them.

  • MJBMJB Posts: 1,235

    Peter Jakacki shared a link. April 21

    I have been playing with UTF-8 characters in my minicom ANSI terminal. I guess it should work in TeraTerm and other terminals too. Here are some snippets and terminal output but there is a lot lot more with dingbats and much more possible.
    https://apps.timwhitlock.info/emoji/tables/unicode
    ( Using UTF-8 in ANSI terminals to display emojis and other symbols )
    EMOJI $F0 EMIT $9F EMIT DUP 6 >> $98 + EMIT $3F AND $80 + EMIT ;
    GRIN $01 EMOJI ;
    TEARS $02 EMOJI ;
    ( etc )
    TAQOZ# GRIN --- 😁 ok
    TAQOZ# TEARS --- 😂 ok
    TAQOZ# SMILE --- 😃 ok
    TAQOZ# HAPPY --- 😄 ok
    TAQOZ# RELIEF --- 😅 ok
    TAQOZ# JOY --- 😆 ok
    TAQOZ# WINK --- 😉 ok
    TAQOZ# CHEERY --- 😊 ok
    TAQOZ# YUM --- 😋 ok
    TAQOZ# RELIEVED --- 😌 ok
    TAQOZ# HEARTS --- 😍 ok
    TAQOZ# SMIRK --- 😏 ok
    TAQOZ# MEH --- 😒 ok
    TAQOZ# NERVOUS --- 😓 ok
    TAQOZ# PENSIVE --- 😔 ok
    TAQOZ# OHNO --- 😖 ok
    TAQOZ# KISS --- 😘 ok
    TAQOZ# KISSME --- 😚 ok
    TAQOZ# JOKE --- 😜 ok
    TAQOZ# AWESOME --- 😝 ok
    TAQOZ# NOGOOD --- 😞 ok
    TAQOZ# ANGRY --- 😠 ok
    TAQOZ# POUT --- 🙎 ok
    TAQOZ# CRY --- 😢 ok
    TAQOZ# PERSEVERE --- 😣 ok
    TAQOZ# TRIUMPH --- 😥 ok
    TAQOZ# FEAR --- 😨 ok
    TAQOZ# WEARY --- 😩 ok
    TAQOZ# SLEEPY --- 😪 ok
    TAQOZ# TIRED --- 😫 ok
    TAQOZ# CRYING --- 😭 ok
    TAQOZ# CAUGHT --- 😰 ok
    TAQOZ# TERROR --- 😱 ok
    TAQOZ# WHAT --- 😲 ok
    TAQOZ# FLUSHED --- 😳 ok
    TAQOZ# DIZZY --- 😵 ok
    TAQOZ# COVID --- 😷 ok
    TAQOZ# FROWN --- 🙍 ok
    TAQOZ# POUT --- 🙎 ok
    TAQOZ# CLAP --- 🙏 ok
    TAQOZ# --- ok
    TAQOZ# $500 FOR I EMOJI NEXT --- 😀😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏😐😑😒😓😔😕😖😗😘�
    �😚😟��😝😞😟😠😡😢😣😤😥😦😧😨😩😪😫😬😭😮😯😰😱😲😳😴😵😶😷😸😹😺😻�
    ���😽😾😿🙀🙁🙂🙃🙄🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏🙐🙑🙒🙓🙔🙕🙖🙗🙘🙙🙚🙟��🙝�
    �🙟🙠🙡🙢🙣🙤🙥🙦🙧🙨🙩🙪🙫🙬🙭🙮🙯🙰🙱🙲🙳🙴🙵🙶🙷🙸🙹🙺🙻🙼🙽🙾🙿�
    �🚁🚂🚃🚄🚅🚆🚇🚈🚉🚊🚋🚌🚍🚎🚏🚐🚑🚒🚓🚔🚕🚖🚗🚘🚙🚚🚟��🚝🚞🚟🚠🚡🚢�
    ���🚤🚥🚦🚧🚨🚩🚪🚫🚬🚭🚮🚯🚰🚱🚲🚳🚴🚵🚶🚷🚸🚹🚺🚻🚼🚽🚾🚿�����������
    �����������������������������������������������������🜀🜁🜂🜃🜄🜅🜆�
    ��🜈🜉🜊🜋🜌🜍🜎🜏🜐🜑🜒🜓🜔🜕🜖🜗🜘🜙🜚🜟��🜝🜞🜟🜠🜡🜢🜣🜤🜥🜦🜧🜨🜩
    🜪🜫🜬🜭🜮🜯🜰🜱🜲🜳🜴🜵🜶🜷🜸🜹🜺🜻🜼🜽🜾🜿🝀🝁🝂🝃🝄🝅🝆🝇🝈🝉🝊🝋
    🝌🝍🝎🝏🝐🝑🝒🝓🝔🝕🝖🝗🝘🝙🝚🝟��🝝🝞🝟🝠🝡🝢🝣🝤🝥🝦🝧🝨🝩🝪🝫🝬🝭�
    ��🝯🝰🝱🝲🝳🝴🝵🝶🝷🝸🝹🝺🝻🝼🝽🝾🝿🞀🞁🞂🞃🞄🞅🞆🞇🞈🞉🞊🞋🞌🞍🞎🞏�
    ��🞑🞒🞓🞔🞕🞖🞗🞘🞙🞚🞟��🞝🞞🞟🞠🞡🞢🞣🞤🞥🞦🞧🞨🞩🞪🞫🞬🞭🞮🞯🞰🞱🞲
    🞳🞴🞵🞶🞷🞸🞹🞺🞻🞼🞽🞾🞿🟀🟁🟂🟃🟄🟅🟆🟇🟈🟉🟊🟋🟌🟍🟎🟏🟐🟑🟒🟓🟔
    🟕🟖🟗🟘🟙🟚🟟��🟝🟞🟟🟠🟡🟢🟣🟤🟥🟦🟧🟨🟩🟪🟫🟬🟭🟮🟯🟰🟱🟲🟳🟴🟵🟶�
    ��🟸🟹🟺🟻🟼🟽🟾🟿🠀🠁🠂🠃🠄🠅🠆🠇🠈🠉🠊🠋🠌🠍🠎🠏🠐🠑🠒🠓🠔🠕🠖🠗🠘�
    ��🠚🠟��🠝🠞🠟🠠🠡🠢🠣🠤🠥🠦🠧🠨🠩🠪🠫🠬🠭🠮🠯🠰🠱🠲🠳🠴🠵🠶🠷🠸🠹🠺🠻
    🠼🠽🠾🠿🡀🡁🡂🡃🡄🡅🡆🡇🡈🡉🡊🡋🡌🡍🡎🡏🡐🡑🡒🡓🡔🡕🡖🡗🡘🡙🡚🡟��🡝�
    ��🡟🡠🡡🡢🡣🡤🡥🡦🡧🡨🡩🡪🡫🡬🡭🡮🡯🡰🡱🡲🡳🡴🡵🡶🡷🡸🡹🡺🡻🡼🡽🡾🡿�
    ��🢁🢂🢃🢄🢅🢆🢇🢈🢉🢊🢋🢌🢍🢎🢏🢐🢑🢒🢓🢔🢕🢖🢗🢘🢙🢚🢟��🢝🢞🢟🢠🢡🢢
    🢣🢤🢥🢦🢧🢨🢩🢪🢫🢬🢭🢮🢯🢰🢱🢲🢳🢴🢵🢶🢷🢸🢹🢺🢻🢼🢽🢾🢿🣀🣁🣂🣃🣄
    🣅🣆🣇🣈🣉🣊🣋🣌🣍🣎🣏🣐🣑🣒🣓🣔🣕🣖🣗🣘🣙🣚🣟��🣝🣞🣟🣠🣡🣢🣣🣤🣥🣦�
    ��🣨🣩🣪🣫🣬🣭🣮🣯🣰🣱🣲🣳🣴🣵🣶🣷🣸🣹🣺🣻🣼🣽🣾🣿🤀🤁🤂🤃🤄🤅🤆🤇🤈�
    ��🤊🤋🤌🤍🤎🤏🤐🤑🤒🤓🤔🤕🤖🤗🤘🤙🤚🤟��🤝🤞🤟🤠🤡🤢🤣🤤🤥🤦🤧🤨🤩🤪🤫
    🤬🤭🤮🤯🤰🤱🤲🤳🤴🤵🤶🤷🤸🤹🤺🤻🤼🤽🤾🤿🥀🥁🥂🥃🥄🥅🥆🥇🥈🥉🥊🥋🥌🥍
    🥎🥏🥐🥑🥒🥓🥔🥕🥖🥗🥘🥙🥚🥟��🥝🥞🥟🥠🥡🥢🥣🥤🥥🥦🥧🥨🥩🥪🥫🥬🥭🥮🥯�
    ��🥱🥲🥳🥴🥵🥶🥷🥸🥹🥺🥻🥼🥽🥾🥿🦀🦁🦂🦃🦄🦅🦆🦇🦈🦉🦊🦋🦌🦍🦎🦏🦐🦑�
    ��🦓🦔🦕🦖🦗🦘🦙🦚🦟��🦝🦞🦟🦠🦡🦢🦣🦤🦥🦦🦧🦨🦩🦪🦫🦬🦭🦮🦯🦰🦱🦲🦳🦴
    🦵🦶🦷🦸🦹🦺🦻🦼🦽🦾🦿🧀🧁🧂🧃🧄🧅🧆🧇🧈🧉🧊🧋🧌🧍🧎🧏🧐🧑🧒🧓🧔🧕🧖
    🧗🧘🧙🧚🧟��🧝🧞🧟🧠🧡🧢🧣🧤🧥🧦🧧🧨🧩🧪🧫🧬🧭🧮🧯🧰🧱🧲🧳🧴🧵🧶🧷🧸�
    ��🧺🧻🧼🧽🧾🧿🨀🨁🨂🨃🨄🨅🨆🨇🨈🨉🨊🨋🨌🨍🨎🨏🨐🨑🨒🨓🨔🨕🨖🨗🨘🨙🨚�
    ����🨝🨞🨟🨠🨡🨢🨣🨤🨥🨦🨧🨨🨩🨪🨫🨬🨭🨮🨯🨰🨱🨲🨳🨴🨵🨶🨷🨸🨹🨺🨻🨼🨽
    🨾🨿🩀🩁🩂🩃🩄🩅🩆🩇🩈🩉🩊🩋🩌🩍🩎🩏🩐🩑🩒🩓🩔🩕🩖🩗🩘🩙🩚🩟��🩝🩞🩟�
    ��🩡🩢🩣🩤🩥🩦🩧🩨🩩🩪🩫🩬🩭🩮🩯🩰🩱🩲🩳🩴🩵🩶🩷🩸🩹🩺🩻🩼🩽🩾🩿🪀🪁�
    ��🪃🪄🪅🪆🪇🪈🪉🪊🪋🪌🪍🪎🪏🪐🪑🪒🪓🪔🪕🪖🪗🪘🪙🪚🪟��🪝🪞🪟🪠🪡🪢🪣🪤
    🪥🪦🪧🪨🪩🪪🪫🪬🪭🪮🪯🪰🪱🪲🪳🪴🪵🪶🪷🪸🪹🪺🪻🪼🪽🪾🪿🫀🫁🫂🫃🫄🫅🫆
    🫇🫈🫉🫊🫋🫌🫍🫎🫏🫐🫑🫒🫓🫔🫕🫖🫗🫘🫙🫚🫟��🫝🫞🫟🫠🫡🫢🫣🫤🫥🫦🫧🫨�
    ��🫪🫫🫬🫭🫮🫯🫰🫱🫲🫳🫴🫵🫶🫷🫸🫹🫺🫻🫼🫽🫾🫿 ok
    TAQOZ#
    UTF8 $E2 EMIT DUP 6 >> $80 + EMIT $3F AND $80 + EMIT ;
    UTFS ( from cnt -- ) ADO I $3F AND 0= IF CRLF I .W TAB THEN SPACE I UTF8 LOOP ;
    TAQOZ# 0 $1000 UTFS ---
    $0000 ​ ‌ ‍ ‎ ‏ ‐ ‑ ‒ – — ― ‖ ‗ ‘ ’ ‚ �“ ” „ ‟ �
    �� ‡ • ‣ ․ ‥ … ‧ 
 
 ‪ ‫ ‬ ‭ ‰ ‱ ′ ″ ‴ ‵ ‶ ‷ ‸ ‹ › ※ ‼ ‽ ‾ ‿
    $0040 ⁀ ⁁ ⁂ ⁃ ⁄ ⁅ ⁆ ⁇ ⁈ ⁉ ⁊ ⁋ ⁌ ⁍ ⁎ ⁏ ⁐ ⁑ ⁒ ⁓ ⁔ ⁕ ⁖ ⁗ ⁘ ⁙ ⁚ �⁜ ⁝ ⁞   �
    �� ⁡ ⁢ ⁣ ⁤ ⁥ ⁦ ⁧ ⁨ ⁩       ⁰ ⁱ ⁲ ⁳ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁿ
    $0080 ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎ ₏ ₐ ₑ ₒ ₓ ₔ ₕ ₖ ₗ ₘ ₙ ₚ �ₜ ₝ ₞ ₟ �
    �� ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫ € ₭ ₮ ₯ ₰ ₱ ₲ ₳ ₴ ₵ ₶ ₷ ₸ ₹ ₺ ₻ ₼ ₽ ₾ ₿
    $00C0 ⃀ ⃁ ⃂ ⃃ ⃄ ⃅ ⃆ ⃇ ⃈ ⃉ ⃊ ⃋ ⃌ ⃍ ⃎ ⃏ ⃐ ⃑ ⃒ ⃓ ⃔ ⃕ ⃖ ⃗ ⃘ ⃙ ⃚ �⃜ ⃝ ⃞ ⃟ �
    �� ⃡ ⃢ ⃣ ⃤ ⃥ ⃦ ⃧ ⃨ ⃩ ⃪ ⃫ ⃬ ⃭ ⃮ ⃯ ⃰ ⃱ ⃲ ⃳ ⃴ ⃵ ⃶ ⃷ ⃸ ⃹ ⃺ ⃻ ⃼ ⃽ ⃾ ⃿
    $0100 ℀ ℁ ℂ ℃ ℄ ℅ ℆ ℇ ℈ ℉ ℊ ℋ ℌ ℍ ℎ ℏ ℐ ℑ ℒ ℓ ℔ ℕ № ℗ ℘ ℙ ℚ �ℜ ℝ ℞ ℟ �
    �� ℡ ™ ℣ ℤ ℥ Ω ℧ ℨ ℩ K Å ℬ ℭ ℮ ℯ ℰ ℱ Ⅎ ℳ ℴ ℵ ℶ ℷ ℸ ℹ ℺ ℻ ℼ ℽ ℾ ℿ
    $0140 ⅀ ⅁ ⅂ ⅃ ⅄ ⅅ ⅆ ⅇ ⅈ ⅉ ⅊ ⅋ ⅌ ⅍ ⅎ ⅏ ⅐ ⅑ ⅒ ⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ �⅜ ⅝ ⅞ ⅟ �
    �� Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ Ⅼ Ⅽ Ⅾ Ⅿ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ⅺ ⅻ ⅼ ⅽ ⅾ ⅿ
    $0180 ↀ ↁ ↂ Ↄ ↄ ↅ ↆ ↇ ↈ ↉ ↊ ↋ ↌ ↍ ↎ ↏ ← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ↚ �↜ ↝ ↞ ↟ �
    �� ↡ ↢ ↣ ↤ ↥ ↦ ↧ ↨ ↩ ↪ ↫ ↬ ↭ ↮ ↯ ↰ ↱ ↲ ↳ ↴ ↵ ↶ ↷ ↸ ↹ ↺ ↻ ↼ ↽ ↾ ↿
    $01C0 ⇀ ⇁ ⇂ ⇃ ⇄ ⇅ ⇆ ⇇ ⇈ ⇉ ⇊ ⇋ ⇌ ⇍ ⇎ ⇏ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇖ ⇗ ⇘ ⇙ ⇚ �⇜ ⇝ ⇞ ⇟ �
    �� ⇡ ⇢ ⇣ ⇤ ⇥ ⇦ ⇧ ⇨ ⇩ ⇪ ⇫ ⇬ ⇭ ⇮ ⇯ ⇰ ⇱ ⇲ ⇳ ⇴ ⇵ ⇶ ⇷ ⇸ ⇹ ⇺ ⇻ ⇼ ⇽ ⇾ ⇿
    $0200 ∀ ∁ ∂ ∃ ∄ ∅ ∆ ∇ ∈ ∉ ∊ ∋ ∌ ∍ ∎ ∏ ∐ ∑ − ∓ ∔ ∕ ∖ ∗ ∘ ∙ √ �∜ ∝ ∞ ∟ �
    �� ∡ ∢ ∣ ∤ ∥ ∦ ∧ ∨ ∩ ∪ ∫ ∬ ∭ ∮ ∯ ∰ ∱ ∲ ∳ ∴ ∵ ∶ ∷ ∸ ∹ ∺ ∻ ∼ ∽ ∾ ∿
    $0240 ≀ ≁ ≂ ≃ ≄ ≅ ≆ ≇ ≈ ≉ ≊ ≋ ≌ ≍ ≎ ≏ ≐ ≑ ≒ ≓ ≔ ≕ ≖ ≗ ≘ ≙ ≚ �≜ ≝ ≞ ≟ �
    �� ≡ ≢ ≣ ≤ ≥ ≦ ≧ ≨ ≩ ≪ ≫ ≬ ≭ ≮ ≯ ≰ ≱ ≲ ≳ ≴ ≵ ≶ ≷ ≸ ≹ ≺ ≻ ≼ ≽ ≾ ≿
    $0280 ⊀ ⊁ ⊂ ⊃ ⊄ ⊅ ⊆ ⊇ ⊈ ⊉ ⊊ ⊋ ⊌ ⊍ ⊎ ⊏ ⊐ ⊑ ⊒ ⊓ ⊔ ⊕ ⊖ ⊗ ⊘ ⊙ ⊚ �⊜ ⊝ ⊞ ⊟ �
    �� ⊡ ⊢ ⊣ ⊤ ⊥ ⊦ ⊧ ⊨ ⊩ ⊪ ⊫ ⊬ ⊭ ⊮ ⊯ ⊰ ⊱ ⊲ ⊳ ⊴ ⊵ ⊶ ⊷ ⊸ ⊹ ⊺ ⊻ ⊼ ⊽ ⊾ ⊿
    $02C0 ⋀ ⋁ ⋂ ⋃ ⋄ ⋅ ⋆ ⋇ ⋈ ⋉ ⋊ ⋋ ⋌ ⋍ ⋎ ⋏ ⋐ ⋑ ⋒ ⋓ ⋔ ⋕ ⋖ ⋗ ⋘ ⋙ ⋚ �⋜ ⋝ ⋞ ⋟ �
    �� ⋡ ⋢ ⋣ ⋤ ⋥ ⋦ ⋧ ⋨ ⋩ ⋪ ⋫ ⋬ ⋭ ⋮ ⋯ ⋰ ⋱ ⋲ ⋳ ⋴ ⋵ ⋶ ⋷ ⋸ ⋹ ⋺ ⋻ ⋼ ⋽ ⋾ ⋿
    $0300 ⌀ ⌁ ⌂ ⌃ ⌄ ⌅ ⌆ ⌇ ⌈ ⌉ ⌊ ⌋ ⌌ ⌍ ⌎ ⌏ ⌐ ⌑ ⌒ ⌓ ⌔ ⌕ ⌖ ⌗ ⌘ ⌙ ⌚ �⌜ ⌝ ⌞ ⌟ �
    �� ⌡ ⌢ ⌣ ⌤ ⌥ ⌦ ⌧ ⌨ 〈 〉 ⌫ ⌬ ⌭ ⌮ ⌯ ⌰ ⌱ ⌲ ⌳ ⌴ ⌵ ⌶ ⌷ ⌸ ⌹ ⌺ ⌻ ⌼ ⌽ ⌾ ⌿
    $0340 ⍀ ⍁ ⍂ ⍃ ⍄ ⍅ ⍆ ⍇ ⍈ ⍉ ⍊ ⍋ ⍌ ⍍ ⍎ ⍏ ⍐ ⍑ ⍒ ⍓ ⍔ ⍕ ⍖ ⍗ ⍘ ⍙ ⍚ �⍜ ⍝ ⍞ ⍟ �
    �� ⍡ ⍢ ⍣ ⍤ ⍥ ⍦ ⍧ ⍨ ⍩ ⍪ ⍫ ⍬ ⍭ ⍮ ⍯ ⍰ ⍱ ⍲ ⍳ ⍴ ⍵ ⍶ ⍷ ⍸ ⍹ ⍺ ⍻ ⍼ ⍽ ⍾ ⍿
    $0380 ⎀ ⎁ ⎂ ⎃ ⎄ ⎅ ⎆ ⎇ ⎈ ⎉ ⎊ ⎋ ⎌ ⎍ ⎎ ⎏ ⎐ ⎑ ⎒ ⎓ ⎔ ⎕ ⎖ ⎗ ⎘ ⎙ ⎚ �⎜ ⎝ ⎞ ⎟ �
    �� ⎡ ⎢ ⎣ ⎤ ⎥ ⎦ ⎧ ⎨ ⎩ ⎪ ⎫ ⎬ ⎭ ⎮ ⎯ ⎰ ⎱ ⎲ ⎳ ⎴ ⎵ ⎶ ⎷ ⎸ ⎹ ⎺ ⎻ ⎼ ⎽ ⎾ ⎿
    $03C0 ⏀ ⏁ ⏂ ⏃ ⏄ ⏅ ⏆ ⏇ ⏈ ⏉ ⏊ ⏋ ⏌ ⏍ ⏎ ⏏ ⏐ ⏑ ⏒ ⏓ ⏔ ⏕ ⏖ ⏗ ⏘ ⏙ ⏚ �⏜ ⏝ ⏞ ⏟ �
    �� ⏡ ⏢ ⏣ ⏤ ⏥ ⏦ ⏧ ⏨ ⏩ ⏪ ⏫ ⏬ ⏭ ⏮ ⏯ ⏰ ⏱ ⏲ ⏳ ⏴ ⏵ ⏶ ⏷ ⏸ ⏹ ⏺ ⏻ ⏼ ⏽ ⏾ ⏿
    $0400 ␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ �␜ ␝ ␞ ␟ �
    �� ␡ ␢ ␣ ␤ ␥ ␦ ␧ ␨ ␩ ␪ ␫ ␬ ␭ ␮ ␯ ␰ ␱ ␲ ␳ ␴ ␵ ␶ ␷ ␸ ␹ ␺ ␻ ␼ ␽ ␾ ␿
    $0440 ⑀ ⑁ ⑂ ⑃ ⑄ ⑅ ⑆ ⑇ ⑈ ⑉ ⑊ ⑋ ⑌ ⑍ ⑎ ⑏ ⑐ ⑑ ⑒ ⑓ ⑔ ⑕ ⑖ ⑗ ⑘ ⑙ ⑚ �⑜ ⑝ ⑞ ⑟ �
    �� ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿
    $0480 ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ �⒜ ⒝ ⒞ ⒟ �
    �� ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ
    $04C0 Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ �ⓜ ⓝ ⓞ ⓟ �
    �� ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
    $0500 ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ �├ ┝ ┞ ┟ �
    �� ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿
    $0540 ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏ ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ �╜ ╝ ╞ ╟ �
    �� ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯ ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿
    $0580 ▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ ▐ ░ ▒ ▓ ▔ ▕ ▖ ▗ ▘ ▙ ▚ �▜ ▝ ▞ ▟ �
    �� □ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ▪ ▫ ▬ ▭ ▮ ▯ ▰ ▱ ▲ △ ▴ ▵ ▶ ▷ ▸ ▹ ► ▻ ▼ ▽ ▾ ▿
    $05C0 ◀ ◁ ◂ ◃ ◄ ◅ ◆ ◇ ◈ ◉ ◊ ○ ◌ ◍ ◎ ● ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗ ◘ ◙ ◚ �◜ ◝ ◞ ◟ �
    �� ◡ ◢ ◣ ◤ ◥ ◦ ◧ ◨ ◩ ◪ ◫ ◬ ◭ ◮ ◯ ◰ ◱ ◲ ◳ ◴ ◵ ◶ ◷ ◸ ◹ ◺ ◻ ◼ ◽ ◾ ◿
    $0600 ☀ ☁ ☂ ☃ ☄ ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☎ ☏ ☐ ☑ ☒ ☓ ☔ ☕ ☖ ☗ ☘ ☙ ☚ �☜ ☝ ☞ ☟ �
    �� ☡ ☢ ☣ ☤ ☥ ☦ ☧ ☨ ☩ ☪ ☫ ☬ ☭ ☮ ☯ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ☸ ☹ ☺ ☻ ☼ ☽ ☾ ☿
    $0640 ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇ ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ ♔ ♕ ♖ ♗ ♘ ♙ ♚ �♜ ♝ ♞ ♟ �
    �� ♡ ♢ ♣ ♤ ♥ ♦ ♧ ♨ ♩ ♪ ♫ ♬ ♭ ♮ ♯ ♰ ♱ ♲ ♳ ♴ ♵ ♶ ♷ ♸ ♹ ♺ ♻ ♼ ♽ ♾ ♿
    $0680 ⚀ ⚁ ⚂ ⚃ ⚄ ⚅ ⚆ ⚇ ⚈ ⚉ ⚊ ⚋ ⚌ ⚍ ⚎ ⚏ ⚐ ⚑ ⚒ ⚓ ⚔ ⚕ ⚖ ⚗ ⚘ ⚙ ⚚ �⚜ ⚝ ⚞ ⚟ �
    �� ⚡ ⚢ ⚣ ⚤ ⚥ ⚦ ⚧ ⚨ ⚩ ⚪ ⚫ ⚬ ⚭ ⚮ ⚯ ⚰ ⚱ ⚲ ⚳ ⚴ ⚵ ⚶ ⚷ ⚸ ⚹ ⚺ ⚻ ⚼ ⚽ ⚾ ⚿
    $06C0 � � � � � � � � � � � � � � � � � � � � � � � � � � � �� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
    $0700 ✀ ✁ ✂ ✃ ✄ ✅ ✆ ✇ ✈ ✉ ✊ ✋ ✌ ✍ ✎ ✏ ✐ ✑ ✒ ✓ ✔ ✕ ✖ ✗ ✘ ✙ ✚ �✜ ✝ ✞ ✟ �
    �� ✡ ✢ ✣ ✤ ✥ ✦ ✧ ✨ ✩ ✪ ✫ ✬ ✭ ✮ ✯ ✰ ✱ ✲ ✳ ✴ ✵ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ✽ ✾ ✿
    $0740 ❀ ❁ ❂ ❃ ❄ ❅ ❆ ❇ ❈ ❉ ❊ ❋ ❌ ❍ ❎ ❏ ❐ ❑ ❒ ❓ ❔ ❕ ❖ ❗ ❘ ❙ ❚ �❜ ❝ ❞ ❟ �
    �� ❡ ❢ ❣ ❤ ❥ ❦ ❧ ❨ ❩ ❪ ❫ ❬ ❭ ❮ ❯ ❰ ❱ ❲ ❳ ❴ ❵ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿
    $0780 ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓ ➔ ➕ ➖ ➗ ➘ ➙ ➚ �➜ ➝ ➞ ➟ �
    �� ➡ ➢ ➣ ➤ ➥ ➦ ➧ ➨ ➩ ➪ ➫ ➬ ➭ ➮ ➯ ➰ ➱ ➲ ➳ ➴ ➵ ➶ ➷ ➸ ➹ ➺ ➻ ➼ ➽ ➾ ➿
    $07C0 ⟀ ⟁ ⟂ ⟃ ⟄ ⟅ ⟆ ⟇ ⟈ ⟉ ⟊ ⟋ ⟌ ⟍ ⟎ ⟏ ⟐ ⟑ ⟒ ⟓ ⟔ ⟕ ⟖ ⟗ ⟘ ⟙ ⟚ �⟜ ⟝ ⟞ ⟟ �
    �� ⟡ ⟢ ⟣ ⟤ ⟥ ⟦ ⟧ ⟨ ⟩ ⟪ ⟫ ⟬ ⟭ ⟮ ⟯ ⟰ ⟱ ⟲ ⟳ ⟴ ⟵ ⟶ ⟷ ⟸ ⟹ ⟺ ⟻ ⟼ ⟽ ⟾ ⟿
    $0800 ⠀ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏ ⠐ ⠑ ⠒ ⠓ ⠔ ⠕ ⠖ ⠗ ⠘ ⠙ ⠚ �⠜ ⠝ ⠞ ⠟ �
    �� ⠡ ⠢ ⠣ ⠤ ⠥ ⠦ ⠧ ⠨ ⠩ ⠪ ⠫ ⠬ ⠭ ⠮ ⠯ ⠰ ⠱ ⠲ ⠳ ⠴ ⠵ ⠶ ⠷ ⠸ ⠹ ⠺ ⠻ ⠼ ⠽ ⠾ ⠿
    $0840 ⡀ ⡁ ⡂ ⡃ ⡄ ⡅ ⡆ ⡇ ⡈ ⡉ ⡊ ⡋ ⡌ ⡍ ⡎ ⡏ ⡐ ⡑ ⡒ ⡓ ⡔ ⡕ ⡖ ⡗ ⡘ ⡙ ⡚ �⡜ ⡝ ⡞ ⡟ �
    �� ⡡ ⡢ ⡣ ⡤ ⡥ ⡦ ⡧ ⡨ ⡩ ⡪ ⡫ ⡬ ⡭ ⡮ ⡯ ⡰ ⡱ ⡲ ⡳ ⡴ ⡵ ⡶ ⡷ ⡸ ⡹ ⡺ ⡻ ⡼ ⡽ ⡾ ⡿
    $0880 ⢀ ⢁ ⢂ ⢃ ⢄ ⢅ ⢆ ⢇ ⢈ ⢉ ⢊ ⢋ ⢌ ⢍ ⢎ ⢏ ⢐ ⢑ ⢒ ⢓ ⢔ ⢕ ⢖ ⢗ ⢘ ⢙ ⢚ �⢜ ⢝ ⢞ ⢟ �
    �� ⢡ ⢢ ⢣ ⢤ ⢥ ⢦ ⢧ ⢨ ⢩ ⢪ ⢫ ⢬ ⢭ ⢮ ⢯ ⢰ ⢱ ⢲ ⢳ ⢴ ⢵ ⢶ ⢷ ⢸ ⢹ ⢺ ⢻ ⢼ ⢽ ⢾ ⢿
    $08C0 ⣀ ⣁ ⣂ ⣃ ⣄ ⣅ ⣆ ⣇ ⣈ ⣉ ⣊ ⣋ ⣌ ⣍ ⣎ ⣏ ⣐ ⣑ ⣒ ⣓ ⣔ ⣕ ⣖ ⣗ ⣘ ⣙ ⣚ �⣜ ⣝ ⣞ ⣟ �
    �� ⣡ ⣢ ⣣ ⣤ ⣥ ⣦ ⣧ ⣨ ⣩ ⣪ ⣫ ⣬ ⣭ ⣮ ⣯ ⣰ ⣱ ⣲ ⣳ ⣴ ⣵ ⣶ ⣷ ⣸ ⣹ ⣺ ⣻ ⣼ ⣽ ⣾ ⣿
    $0900 ⤀ ⤁ ⤂ ⤃ ⤄ ⤅ ⤆ ⤇ ⤈ ⤉ ⤊ ⤋ ⤌ ⤍ ⤎ ⤏ ⤐ ⤑ ⤒ ⤓ ⤔ ⤕ ⤖ ⤗ ⤘ ⤙ ⤚ �⤜ ⤝ ⤞ ⤟ �
    �� ⤡ ⤢ ⤣ ⤤ ⤥ ⤦ ⤧ ⤨ ⤩ ⤪ ⤫ ⤬ ⤭ ⤮ ⤯ ⤰ ⤱ ⤲ ⤳ ⤴ ⤵ ⤶ ⤷ ⤸ ⤹ ⤺ ⤻ ⤼ ⤽ ⤾ ⤿
    $0940 ⥀ ⥁ ⥂ ⥃ ⥄ ⥅ ⥆ ⥇ ⥈ ⥉ ⥊ ⥋ ⥌ ⥍ ⥎ ⥏ ⥐ ⥑ ⥒ ⥓ ⥔ ⥕ ⥖ ⥗ ⥘ ⥙ ⥚ �⥜ ⥝ ⥞ ⥟ �
    �� ⥡ ⥢ ⥣ ⥤ ⥥ ⥦ ⥧ ⥨ ⥩ ⥪ ⥫ ⥬ ⥭ ⥮ ⥯ ⥰ ⥱ ⥲ ⥳ ⥴ ⥵ ⥶ ⥷ ⥸ ⥹ ⥺ ⥻ ⥼ ⥽ ⥾ ⥿
    $0980 ⦀ ⦁ ⦂ ⦃ ⦄ ⦅ ⦆ ⦇ ⦈ ⦉ ⦊ ⦋ ⦌ ⦍ ⦎ ⦏ ⦐ ⦑ ⦒ ⦓ ⦔ ⦕ ⦖ ⦗ ⦘ ⦙ ⦚ �⦜ ⦝ ⦞ ⦟ �
    �� ⦡ ⦢ ⦣ ⦤ ⦥ ⦦ ⦧ ⦨ ⦩ ⦪ ⦫ ⦬ ⦭ ⦮ ⦯ ⦰ ⦱ ⦲ ⦳ ⦴ ⦵ ⦶ ⦷ ⦸ ⦹ ⦺ ⦻ ⦼ ⦽ ⦾ ⦿
    $09C0 ⧀ ⧁ ⧂ ⧃ ⧄ ⧅ ⧆ ⧇ ⧈ ⧉ ⧊ ⧋ ⧌ ⧍ ⧎ ⧏ ⧐ ⧑ ⧒ ⧓ ⧔ ⧕ ⧖ ⧗ ⧘ ⧙ ⧚ �⧜ ⧝ ⧞ ⧟ �
    �� ⧡ ⧢ ⧣ ⧤ ⧥ ⧦ ⧧ ⧨ ⧩ ⧪ ⧫ ⧬ ⧭ ⧮ ⧯ ⧰ ⧱ ⧲ ⧳ ⧴ ⧵ ⧶ ⧷ ⧸ ⧹ ⧺ ⧻ ⧼ ⧽ ⧾ ⧿
    $0A00 ⨀ ⨁ ⨂ ⨃ ⨄ ⨅ ⨆ ⨇ ⨈ ⨉ ⨊ ⨋ ⨌ ⨍ ⨎ ⨏ ⨐ ⨑ ⨒ ⨓ ⨔ ⨕ ⨖ ⨗ ⨘ ⨙ ⨚ �⨜ ⨝ ⨞ ⨟ �
    �� ⨡ ⨢ ⨣ ⨤ ⨥ ⨦ ⨧ ⨨ ⨩ ⨪ ⨫ ⨬ ⨭ ⨮ ⨯ ⨰ ⨱ ⨲ ⨳ ⨴ ⨵ ⨶ ⨷ ⨸ ⨹ ⨺ ⨻ ⨼ ⨽ ⨾ ⨿
    $0A40 ⩀ ⩁ ⩂ ⩃ ⩄ ⩅ ⩆ ⩇ ⩈ ⩉ ⩊ ⩋ ⩌ ⩍ ⩎ ⩏ ⩐ ⩑ ⩒ ⩓ ⩔ ⩕ ⩖ ⩗ ⩘ ⩙ ⩚ �⩜ ⩝ ⩞ ⩟ �
    �� ⩡ ⩢ ⩣ ⩤ ⩥ ⩦ ⩧ ⩨ ⩩ ⩪ ⩫ ⩬ ⩭ ⩮ ⩯ ⩰ ⩱ ⩲ ⩳ ⩴ ⩵ ⩶ ⩷ ⩸ ⩹ ⩺ ⩻ ⩼ ⩽ ⩾ ⩿
    $0A80 ⪀ ⪁ ⪂ ⪃ ⪄ ⪅ ⪆ ⪇ ⪈ ⪉ ⪊ ⪋ ⪌ ⪍ ⪎ ⪏ ⪐ ⪑ ⪒ ⪓ ⪔ ⪕ ⪖ ⪗ ⪘ ⪙ ⪚ �⪜ ⪝ ⪞ ⪟ �
    �� ⪡ ⪢ ⪣ ⪤ ⪥ ⪦ ⪧ ⪨ ⪩ ⪪ ⪫ ⪬ ⪭ ⪮ ⪯ ⪰ ⪱ ⪲ ⪳ ⪴ ⪵ ⪶ ⪷ ⪸ ⪹ ⪺ ⪻ ⪼ ⪽ ⪾ ⪿
    $0AC0 ⫀ ⫁ ⫂ ⫃ ⫄ ⫅ ⫆ ⫇ ⫈ ⫉ ⫊ ⫋ ⫌ ⫍ ⫎ ⫏ ⫐ ⫑ ⫒ ⫓ ⫔ ⫕ ⫖ ⫗ ⫘ ⫙ ⫚ �⫝̸ ⫝ ⫞ ⫟ �
    �� ⫡ ⫢ ⫣ ⫤ ⫥ ⫦ ⫧ ⫨ ⫩ ⫪ ⫫ ⫬ ⫭ ⫮ ⫯ ⫰ ⫱ ⫲ ⫳ ⫴ ⫵ ⫶ ⫷ ⫸ ⫹ ⫺ ⫻ ⫼ ⫽ ⫾ ⫿
    $0B00 ⬀ ⬁ ⬂ ⬃ ⬄ ⬅ ⬆ ⬇ ⬈ ⬉ ⬊ ⬋ ⬌ ⬍ ⬎ ⬏ ⬐ ⬑ ⬒ ⬓ ⬔ ⬕ ⬖ ⬗ ⬘ ⬙ ⬚ �⬜ ⬝ ⬞ ⬟ �
    �� ⬡ ⬢ ⬣ ⬤ ⬥ ⬦ ⬧ ⬨ ⬩ ⬪ ⬫ ⬬ ⬭ ⬮ ⬯ ⬰ ⬱ ⬲ ⬳ ⬴ ⬵ ⬶ ⬷ ⬸ ⬹ ⬺ ⬻ ⬼ ⬽ ⬾ ⬿
    $0B40 ⭀ ⭁ ⭂ ⭃ ⭄ ⭅ ⭆ ⭇ ⭈ ⭉ ⭊ ⭋ ⭌ ⭍ ⭎ ⭏ ⭐ ⭑ ⭒ ⭓ ⭔ ⭕ ⭖ ⭗ ⭘ ⭙ ⭚ �⭜ ⭝ ⭞ ⭟ �
    �� ⭡ ⭢ ⭣ ⭤ ⭥ ⭦ ⭧ ⭨ ⭩ ⭪ ⭫ ⭬ ⭭ ⭮ ⭯ ⭰ ⭱ ⭲ ⭳ ⭴ ⭵ ⭶ ⭷ ⭸ ⭹ ⭺ ⭻ ⭼ ⭽ ⭾ ⭿
    $0B80 ⮀ ⮁ ⮂ ⮃ ⮄ ⮅ ⮆ ⮇ ⮈ ⮉ ⮊ ⮋ ⮌ ⮍ ⮎ ⮏ ⮐ ⮑ ⮒ ⮓ ⮔ ⮕ ⮖ ⮗ ⮘ ⮙ ⮚ �⮜ ⮝ ⮞ ⮟ �
    �� ⮡ ⮢ ⮣ ⮤ ⮥ ⮦ ⮧ ⮨ ⮩ ⮪ ⮫ ⮬ ⮭ ⮮ ⮯ ⮰ ⮱ ⮲ ⮳ ⮴ ⮵ ⮶ ⮷ ⮸ ⮹ ⮺ ⮻ ⮼ ⮽ ⮾ ⮿
    $0BC0 ⯀ ⯁ ⯂ ⯃ ⯄ ⯅ ⯆ ⯇ ⯈ ⯉ ⯊ ⯋ ⯌ ⯍ ⯎ ⯏ ⯐ ⯑ ⯒ ⯓ ⯔ ⯕ ⯖ ⯗ ⯘ ⯙ ⯚ �⯜ ⯝ ⯞ ⯟ �
    �� ⯡ ⯢ ⯣ ⯤ ⯥ ⯦ ⯧ ⯨ ⯩ ⯪ ⯫ ⯬ ⯭ ⯮ ⯯ ⯰ ⯱ ⯲ ⯳ ⯴ ⯵ ⯶ ⯷ ⯸ ⯹ ⯺ ⯻ ⯼ ⯽ ⯾ ⯿
    $0C00 Ⰰ Ⰱ Ⰲ Ⰳ Ⰴ Ⰵ Ⰶ Ⰷ Ⰸ Ⰹ Ⰺ Ⰻ Ⰼ Ⰽ Ⰾ Ⰿ Ⱀ Ⱁ Ⱂ Ⱃ Ⱄ Ⱅ Ⱆ Ⱇ Ⱈ Ⱉ Ⱊ �Ⱌ Ⱍ Ⱎ Ⱏ �
    �� Ⱑ Ⱒ Ⱓ Ⱔ Ⱕ Ⱖ Ⱗ Ⱘ Ⱙ Ⱚ Ⱛ Ⱜ Ⱝ Ⱞ Ⱟ ⰰ ⰱ ⰲ ⰳ ⰴ ⰵ ⰶ ⰷ ⰸ ⰹ ⰺ ⰻ ⰼ ⰽ ⰾ ⰿ
    $0C40 ⱀ ⱁ ⱂ ⱃ ⱄ ⱅ ⱆ ⱇ ⱈ ⱉ ⱊ ⱋ ⱌ ⱍ ⱎ ⱏ ⱐ ⱑ ⱒ ⱓ ⱔ ⱕ ⱖ ⱗ ⱘ ⱙ ⱚ �ⱜ ⱝ ⱞ ⱟ �
    �� ⱡ Ɫ Ᵽ Ɽ ⱥ ⱦ Ⱨ ⱨ Ⱪ ⱪ Ⱬ ⱬ Ɑ Ɱ Ɐ Ɒ ⱱ Ⱳ ⱳ ⱴ Ⱶ ⱶ ⱷ ⱸ ⱹ ⱺ ⱻ ⱼ ⱽ Ȿ Ɀ
    $0C80 Ⲁ ⲁ Ⲃ ⲃ Ⲅ ⲅ Ⲇ ⲇ Ⲉ ⲉ Ⲋ ⲋ Ⲍ ⲍ Ⲏ ⲏ Ⲑ ⲑ Ⲓ ⲓ Ⲕ ⲕ Ⲗ ⲗ Ⲙ ⲙ Ⲛ �Ⲝ ⲝ Ⲟ ⲟ �
    �� ⲡ Ⲣ ⲣ Ⲥ ⲥ Ⲧ ⲧ Ⲩ ⲩ Ⲫ ⲫ Ⲭ ⲭ Ⲯ ⲯ Ⲱ ⲱ Ⲳ ⲳ Ⲵ ⲵ Ⲷ ⲷ Ⲹ ⲹ Ⲻ ⲻ Ⲽ ⲽ Ⲿ ⲿ
    $0CC0 Ⳁ ⳁ Ⳃ ⳃ Ⳅ ⳅ Ⳇ ⳇ Ⳉ ⳉ Ⳋ ⳋ Ⳍ ⳍ Ⳏ ⳏ Ⳑ ⳑ Ⳓ ⳓ Ⳕ ⳕ Ⳗ ⳗ Ⳙ ⳙ Ⳛ �Ⳝ ⳝ Ⳟ ⳟ �
    �� ⳡ Ⳣ ⳣ ⳤ ⳥ ⳦ ⳧ ⳨ ⳩ ⳪ Ⳬ ⳬ Ⳮ ⳮ ⳯ ⳰ ⳱ Ⳳ ⳳ ⳴ ⳵ ⳶ ⳷ ⳸ ⳹ ⳺ ⳻ ⳼ ⳽ ⳾ ⳿
    $0D00 ⴀ ⴁ ⴂ ⴃ ⴄ ⴅ ⴆ ⴇ ⴈ ⴉ ⴊ ⴋ ⴌ ⴍ ⴎ ⴏ ⴐ ⴑ ⴒ ⴓ ⴔ ⴕ ⴖ ⴗ ⴘ ⴙ ⴚ �ⴜ ⴝ ⴞ ⴟ �
    �� ⴡ ⴢ ⴣ ⴤ ⴥ ⴦ ⴧ ⴨ ⴩ ⴪ ⴫ ⴬ ⴭ ⴮ ⴯ ⴰ ⴱ ⴲ ⴳ ⴴ ⴵ ⴶ ⴷ ⴸ ⴹ ⴺ ⴻ ⴼ ⴽ ⴾ ⴿ
    $0D40 ⵀ ⵁ ⵂ ⵃ ⵄ ⵅ ⵆ ⵇ ⵈ ⵉ ⵊ ⵋ ⵌ ⵍ ⵎ ⵏ ⵐ ⵑ ⵒ ⵓ ⵔ ⵕ ⵖ ⵗ ⵘ ⵙ ⵚ �ⵜ ⵝ ⵞ ⵟ �
    �� ⵡ ⵢ ⵣ ⵤ ⵥ ⵦ ⵧ ⵨ ⵩ ⵪ ⵫ ⵬ ⵭ ⵮ ⵯ ⵰ ⵱ ⵲ ⵳ ⵴ ⵵ ⵶ ⵷ ⵸ ⵹ ⵺ ⵻ ⵼ ⵽ ⵾ ⵿
    $0D80 ⶀ ⶁ ⶂ ⶃ ⶄ ⶅ ⶆ ⶇ ⶈ ⶉ ⶊ ⶋ ⶌ ⶍ ⶎ ⶏ ⶐ ⶑ ⶒ ⶓ ⶔ ⶕ ⶖ ⶗ ⶘ ⶙ ⶚ �⶜ ⶝ ⶞ ⶟ �
    �� ⶡ ⶢ ⶣ ⶤ ⶥ ⶦ ⶧ ⶨ ⶩ ⶪ ⶫ ⶬ ⶭ ⶮ ⶯ ⶰ ⶱ ⶲ ⶳ ⶴ ⶵ ⶶ ⶷ ⶸ ⶹ ⶺ ⶻ ⶼ ⶽ ⶾ ⶿
    $0DC0 ⷀ ⷁ ⷂ ⷃ ⷄ ⷅ ⷆ ⷇ ⷈ ⷉ ⷊ ⷋ ⷌ ⷍ ⷎ ⷏ ⷐ ⷑ ⷒ ⷓ ⷔ ⷕ ⷖ ⷗ ⷘ ⷙ ⷚ �ⷜ ⷝ ⷞ ⷟ �
    �� ⷡ ⷢ ⷣ ⷤ ⷥ ⷦ ⷧ ⷨ ⷩ ⷪ ⷫ ⷬ ⷭ ⷮ ⷯ ⷰ ⷱ ⷲ ⷳ ⷴ ⷵ ⷶ ⷷ ⷸ ⷹ ⷺ ⷻ ⷼ ⷽ ⷾ ⷿ
    $0E00 ⸀ ⸁ ⸂ ⸃ ⸄ ⸅ ⸆ ⸇ ⸈ ⸉ ⸊ ⸋ ⸌ ⸍ ⸎ ⸏ ⸐ ⸑ ⸒ ⸓ ⸔ ⸕ ⸖ ⸗ ⸘ ⸙ ⸚ �⸜ ⸝ ⸞ ⸟ �
    �� ⸡ ⸢ ⸣ ⸤ ⸥ ⸦ ⸧ ⸨ ⸩ ⸪ ⸫ ⸬ ⸭ ⸮ ⸯ ⸰ ⸱ ⸲ ⸳ ⸴ ⸵ ⸶ ⸷ ⸸ ⸹ ⸺ ⸻ ⸼ ⸽ ⸾ ⸿
    $0E40 ⹀ ⹁ ⹂ ⹃ ⹄ ⹅ ⹆ ⹇ ⹈ ⹉ ⹊ ⹋ ⹌ ⹍ ⹎ ⹏ ⹐ ⹑ ⹒ ⹓ ⹔ ⹕ ⹖ ⹗ ⹘ ⹙ ⹚ �⹜ ⹝ ⹞ ⹟ �
    �� ⹡ ⹢ ⹣ ⹤ ⹥ ⹦ ⹧ ⹨ ⹩ ⹪ ⹫ ⹬ ⹭ ⹮ ⹯ ⹰ ⹱ ⹲ ⹳ ⹴ ⹵ ⹶ ⹷ ⹸ ⹹ ⹺ ⹻ ⹼ ⹽ ⹾ ⹿
    $0E80 ⺀ ⺁ ⺂ ⺃ ⺄ ⺅ ⺆ ⺇ ⺈ ⺉ ⺊ ⺋ ⺌ ⺍ ⺎ ⺏ ⺐ ⺑ ⺒ ⺓ ⺔ ⺕ ⺖ ⺗ ⺘ ⺙ ⺚ �⺜ ⺝ ⺞ ⺟ �
    �� ⺡ ⺢ ⺣ ⺤ ⺥ ⺦ ⺧ ⺨ ⺩ ⺪ ⺫ ⺬ ⺭ ⺮ ⺯ ⺰ ⺱ ⺲ ⺳ ⺴ ⺵ ⺶ ⺷ ⺸ ⺹ ⺺ ⺻ ⺼ ⺽ ⺾ ⺿
    $0EC0 ⻀ ⻁ ⻂ ⻃ ⻄ ⻅ ⻆ ⻇ ⻈ ⻉ ⻊ ⻋ ⻌ ⻍ ⻎ ⻏ ⻐ ⻑ ⻒ ⻓ ⻔ ⻕ ⻖ ⻗ ⻘ ⻙ ⻚ �⻜ ⻝ ⻞ ⻟ �
    �� ⻡ ⻢ ⻣ ⻤ ⻥ ⻦ ⻧ ⻨ ⻩ ⻪ ⻫ ⻬ ⻭ ⻮ ⻯ ⻰ ⻱ ⻲ ⻳ ⻴ ⻵ ⻶ ⻷ ⻸ ⻹ ⻺ ⻻ ⻼ ⻽ ⻾ ⻿
    $0F00 ⼀ ⼁ ⼂ ⼃ ⼄ ⼅ ⼆ ⼇ ⼈ ⼉ ⼊ ⼋ ⼌ ⼍ ⼎ ⼏ ⼐ ⼑ ⼒ ⼓ ⼔ ⼕ ⼖ ⼗ ⼘ ⼙ ⼚ �⼜ ⼝ ⼞ ⼟ �
    �� ⼡ ⼢ ⼣ ⼤ ⼥ ⼦ ⼧ ⼨ ⼩ ⼪ ⼫ ⼬ ⼭ ⼮ ⼯ ⼰ ⼱ ⼲ ⼳ ⼴ ⼵ ⼶ ⼷ ⼸ ⼹ ⼺ ⼻ ⼼ ⼽ ⼾ ⼿
    $0F40 ⽀ ⽁ ⽂ ⽃ ⽄ ⽅ ⽆ ⽇ ⽈ ⽉ ⽊ ⽋ ⽌ ⽍ ⽎ ⽏ ⽐ ⽑ ⽒ ⽓ ⽔ ⽕ ⽖ ⽗ ⽘ ⽙ ⽚ �⽜ ⽝ ⽞ ⽟ �
    �� ⽡ ⽢ ⽣ ⽤ ⽥ ⽦ ⽧ ⽨ ⽩ ⽪ ⽫ ⽬ ⽭ ⽮ ⽯ ⽰ ⽱ ⽲ ⽳ ⽴ ⽵ ⽶ ⽷ ⽸ ⽹ ⽺ ⽻ ⽼ ⽽ ⽾ ⽿
    $0F80 ⾀ ⾁ ⾂ ⾃ ⾄ ⾅ ⾆ ⾇ ⾈ ⾉ ⾊ ⾋ ⾌ ⾍ ⾎ ⾏ ⾐ ⾑ ⾒ ⾓ ⾔ ⾕ ⾖ ⾗ ⾘ ⾙ ⾚ �⾜ ⾝ ⾞ ⾟ �
    �� ⾡ ⾢ ⾣ ⾤ ⾥ ⾦ ⾧ ⾨ ⾩ ⾪ ⾫ ⾬ ⾭ ⾮ ⾯ ⾰ ⾱ ⾲ ⾳ ⾴ ⾵ ⾶ ⾷ ⾸ ⾹ ⾺ ⾻ ⾼ ⾽ ⾾ ⾿
    $0FC0 ⿀ ⿁ ⿂ ⿃ ⿄ ⿅ ⿆ ⿇ ⿈ ⿉ ⿊ ⿋ ⿌ ⿍ ⿎ ⿏ ⿐ ⿑ ⿒ ⿓ ⿔ ⿕ ⿖ ⿗ ⿘ ⿙ ⿚ �⿜ ⿝ ⿞ ⿟ �
    �� ⿡ ⿢ ⿣ ⿤ ⿥ ⿦ ⿧ ⿨ ⿩ ⿪ ⿫ ⿬ ⿭ ⿮ ⿯ ⿰ ⿱ ⿲ ⿳ ⿴ ⿵ ⿶ ⿷ ⿸ ⿹ ⿺ ⿻ ⿼ ⿽ ⿾ ⿿ ok
    TAQOZ#
  • MJBMJB Posts: 1,235

    Peter JakackiForth2020 Users-Group April 25th

    After all these years Forth now has a group that's worthy of Forth, and not only that, it also has a sense of community Forth spirit. It's that spirit of enthusiastic openness and sharing and just plain having fun.
    But Forther's brains must be wired differently from most and while we can express our creative side with Forth, we may be shy or feel that we aren't "good enough", or simply unable to express ourselves.
    Well, if you have ever been invited to a potluck you always bring something that's yours, and indeed it may be "different", but that's what makes a potluck what it is, a sense of community and sharing.
    So please, if you have never posted or shared, please take part in this potluck and let's all have some Forth fun and be inspired.
    (Remember, gems may be small but that's what people ouu n ahh over.)

  • MJBMJB Posts: 1,235

    Melody player
    Peter Jakacki·Saturday, 1 May 2021·
    Playing melodies using simple square wave generation is nothing new, but in Forth it is fun and can be as simple as : TWINKLE STAR SKY SKY STAR ;

    Here is a program in Forth that runs on my Tachyon and TAQOZ Forth but is very easy to adapt.

    MELODY PRINT" Simple melody player " ;
    --- simple note timing variable constant

    tempo 300 ;
    --- crotchet quarter note timing
    q 300 ' tempo VC! ;
    --- half/slower and double/faster timing
    h tempo 2* ' tempo VC! ;
    d tempo 2/ ' tempo VC! ;
    --- octave variable constant 0..8
    octave 4 ;
    o ( n -- ) 0 8 LIMIT 8 SWAP - ' octave C! ;
    NOTE octave >> HZ
    --- rest - also holds notes before muting
    r tempo ms MUTE 50 ms ;
    --- define notes in their 8th octave so we only have to divide down
    B 7902 NOTE ;
    A# 7459 NOTE ;
    A 7040 NOTE ;
    G# 6645 NOTE ;
    G 6272 NOTE ;
    F# 5920 NOTE ;
    F 5588 NOTE ;
    E 5274 NOTE ;
    D# 4978 NOTE ;
    D 4699 NOTE ;
    C# 4435 NOTE ;
    C 4186 NOTE ;
    --- sample melody - TWINKLE TWINKLE LITTLE STAR
    STAR q C C G G A A h G q F F E E D D h C ;
    SKY q G G F F E E h D ;
    TWINKLE STAR SKY SKY STAR ;

    Notes: Short literals are encoded with the 16-bit instruction and are also used as variable constants so VC! is used to encode a new constant that is written.

  • MJBMJB Posts: 1,235

    Peter JakackiForth2020 Users-Group May 5th

    RETURN STACK is for return addresses
    Use a LOOP STACK for loops
    I like to keep the return stack for return addresses as far as possible since a stack bug there can cause an embedded system to crash badly. Think of mechanical systems that are hooked up or valves or regulation of some kind. When the software misbehaves then there is more than just a BSOD to worry about. Very real damage can result (Try this on a 3-phase 1,500kVA regulator).
    For that reason I implement loop stacks which also push the loop address for fast looping and also has the advantage that DO and LOOP are now runtime words and do not need any special compile-time considerations.
    What do you think?
    Here is a decompilation and timing of a DO LOOP and the assembly code for loop.

       TAQOZ# : DEMO 1,000,000 0 DO LOOP ; --- ok
        TAQOZ# SEE DEMO
        1BC9D: pub DEMO
        0A908: 0083 := 131
        0A90E: 1800 0
        0A910: 10BC DO
        0A912: 0143 LOOP
        0A914: 0060 ;
        ( 14 bytes )
    
    TAQOZ# LAP DEMO LAP .LAP --- 32,000,296 cycles= 100,000,925ns @320MHz ok
    
    
    The kernel P2 assembly code for LOOP.
    
    add index,#1 ' increment index
    cmps limit,index wcz
    if_a mov PTRA,loopip ' Branch to the loop address
    if_a ret
    
  • MJBMJB Posts: 1,235

    Peter JakackiForth2020 Users-Group May 9

    While I enjoyed the zoom meeting last night I wasn't able to stay awake this time for the whole meeting. I thought I'd catch 40 winks at 3am but ended up not waking up. I will watch the recording though. Thanks for the opportunity to share!
    I was a bit disappointed too that I wasn't able to present the screen in the manner I had intended and ended up with the phone camera zoomed in on the screen instead. For some reason the text was always a bit blurry. A solid year on and we are still coming to grips with zoom.
    btw, when I said that TAQOZ fits in 64k, what I also meant was this was all that it needs but even though it uses 16-bit threads it can easily cross the 64k boundary seamlessly and the only "penalty" if that is that any reference to extended code is an additional 16-bit paging instruction. But hard as I try I haven't filled that 64k and I have to force it to for testing purposes. The dictionary builds down and is located at top of the first 128k in anticipation of a large code base, but nonetheless, the dictionary can be dynamically relocated at any time.
    Although the VGA was shown as a window on my PC monitor, it was only displaying as a Picture-In-Picture that some monitors allow which I did so that I could keep the zoom camera in one place. I needed a capture dongle that didn't arrive in time which would have allowed it to become a movable and zoom sharable window on the PC (next time). The P2 generates VGA from a spare cog and any pins can be used and they all have DAC functions with all kinds of output drive modes so these pins feed directly into the VGA monitor without any need for resistors or any other external components. Each cog also has 4 fast configurable DACs that are normally used for video.

  • MJBMJB Posts: 1,235

    Peter JakackiForth2020 Users-Group May 10th

    TAQOZ CODE PAGING
    I wanted to load up TAQOZ with as many modules as possible to push beyond the first 64k of code space. I put all the web and ftp servers in, the CPU simulators, the disassemblers, the logic analyzer, and you name it on top of the normal multimedia and filesystem etc. Finally, by nefarious and determined means it crossed that boundary. You can see DASMOP being referenced here and it only required an extra page instruction but all references always revert back to page0 so no other code is affected.

    For every doubling of Forth code I estimate that the codebase capabilities to perhaps increase up to 10 times even. I know that even adding just a few kB to it increases the functionality greatly. The Ethernet servers need less than 4k for instance. Is there anything that ridiculously compact, fast, and efficient?
    I also have PAGE2 to PAGE7 as cog kernel instructions but I don't think that they will ever get used.

    1024E: 10C4 FOR
    10250: FE8E .PC
    10252: FCDE GETOPS
    10254: 0054 PAGE1
    10256: 0202 DASMOP
    10258: 3562 KEY
    1025A: FC4E op
    1025C: 010A @
    1025E: 0080 -1
    10260: 00F2 =
    10262: 00CB OR
    10264: 014D ?NEXT

Sign In or Register to comment.