--------------------------------------------------------------------------------------------
	PICOTRON VERSION HISTORY
--------------------------------------------------------------------------------------------


	0.2.0d:

		Added: rounded rectangles: rrect(x,y,w,h,radius,col) / rrectfill(...)
		Added: p8scii "\^o" for drawing outlines. 1 char: col, 2 chars hex to indicate neighbours. e.g. ?"\^o8ffhey"
		Added: gfx editor: can edit multiple sprites at once when they are the same size
		Added: map editor: can place multile tiles at once (shift + click & drag to select sprites)
		Added: /system/demos/tinypaint.p64 -- minimal undo/redo example
		Changed: icon colour 3 maps to a lighter theme colour (was the dark outline colour -- theme"icon3")
		Changed: gfx editor: can pick up colour with rmb or ctrl-click to search/replace regardless of selected tool 
		Changed: p8scii: print"\^w\^t\^=..." draws horizontal stripes (used to be the same as \^p)
		Changed: filenav / desktop does not display files if initial cd() failed (for debugging disk access issues)
		Changed: pal() doesn't reset the rgb display palette to system default (use pal(2) or reset())
		Fixed: crash when screenshot while running a cartridge file name that is a number
		Fixed: pal() not resetting changes made by palt() // dirty ram page bit not set by palt()
		Fixed: palt(bitfield) sometimes modifing wrong colour table
		Fixed: inverted ovalfill(), circfill() fails when width or height < 3
		Fixed: some api functions are not highlighted green in code editor
		Fixed: tokenoid() treats escaped quote at start of string as the closing quote
		Fixed: note(100, ...) stops all sound unless a channel index is explicitly given (regression)
		Fixed: print("foo",9) should behave the same as color(9) print("foo") (regression, + also fixed in terminal)


	0.2.0c:

		Added: colourful icons // can be disabled in settings or per-file with metadata.lowcol_icon
		Added: icon editor: full colour / low-colour toggle, colourful templates, undo/redo, ctrl-click to swap a colour
		Added: gui:attach_button{border=0x070e} for a 1px rounded border // colour when element has cursor in bits 0xff00
		Changed: about windows have space for 3 lines of notes
		Fixed: can not run sandboxed bbs carts using ctrl+r after load #foo ("can not find /ram/cart/main.lua")
		Fixed: syntax error causes terminal to get stuck in a pauseable state (can't use enter)
		Fixed: runtime error inside _init is not reported when corunning in terminal via CTRL+R
		Fixed: text editor search box is not dismissed when pressing escape (regression: keydown event not sent from wm)
		Fixed: x,y = print("\0",30,20) returns -1000000,-1000000 (should be 30,20 -- matches PICO-8 behaviour)
		Fixed: opening lua files via error messages causes multiple tabs of the same file (.unique_location ignored)


	0.2.0b:

		Added: options sub-menu when paused allowing host fullscreen toggle
		Added: export -e readme.txt foo.bin // to include files in the generated zips (can be a folder to flatten)
		Added: binary exports set the host window title
		Added: web exports can use fetch(stat(151).."extra.pod") to download extra files from the same location
		Added: web exports: stat(150) for full window.location.ref, stat(152) for location.host, stat(153) for location.hash
		Added: binary exports mount "/host_data" when a folder called "data" is found in the same path as the executable
		Changed: fullscreen binary exports block wm elements & workspace switching unless window{can_escape_fullscreen=true}
		Changed: exporter size limits: .p64.rom size can be 32MB (8MB for html) -- can use fetch() for more data
		Changed: mac exports are now inside a folder called foo_mac in order to allow bundling extra files 
		Changed: exported cartridge is now mounted as /ram/expcart (was /cart, which could be mistaken for persistent storage)
		Fixed: no way for binary exports to quit to host without using shortcuts (now: "Exit" means shutdown)
		Fixed: info command does not show up-to-date rom size; now saves and flushes to temporary .p64.rom first
		Fixed: windows that are too large to fit on desktop get stuck above the toolbar and can not easily be closed
		Fixed: filenav/desktop: icon colours outside of 0,1,13,6,7 are not mapped to theme
		Fixed: unmap() crashes when used on colour table memory regions
		Fixed: memmap() changes on live audio data does not immediately sync with PFX6416
		Fixed: pod() does not handle int64 userdata
		Fixed: process 2 freezes for a long time after binary export (e.g. can't use folder command)
		Fixed: widgets not loading on boot


	0.2.0:

		Added: binary exporters for windows, mac and 64-bit linux // > export foo.bin
		Added: window icon
		Changed: Anywhen does not log changes for folders ending in .bin
		Changed: readme.txt is not copied to desktop for web exports (only used for bbs player)
		Changed: no screensaver or wallpaper settings in exports // avoids runtime mismatches between exports
		Fixed: apps lose focus after using "Reset Cartridge" from the pause menu


	0.1.1f:

		Added: export foo.p64.png to save a copy of working cartridge (without switching from that working cart)
		Changed: only foreground process can read controller buttons
		Changed: ctrl-p opens picotron menu (useless now but reserved for future)
		Changed: linux uses dynamically loaded libcurl (wget no longer required), mac uses static libcurl
		Fixed: load #foo sometimes fails to fetch cartridge (when no version number specified)
		Fixed: batch cart downloads don't happen in parallel on mac, web (-> slow to open bbs://new/0 etc)
		Fixed: not caching cart fetches under web (now cached per session, but not persisted in IndexedDB)
		Fixed: system level crash when a process include()s itself (temporary hack: can't include file > 256 times)
		Fixed: exported html shell does not block all keypresses when picotron app has focus (e.g. ctrl-s, ctrl-o)
		Fixed: sandboxed dev cartridge can store() to self -- only /appdata and /appdata/shared should be writeable
		Fixed: (regression in 0.1.1e) some gui events are not dispatched when there are multiple active guis
		Fixed: hiding a button on click throws an error // https://www.lexaloffle.com/bbs/?pid=160440#p


	0.1.1e:

		Added: /system/widgets/owl.p64
		Added: widgets can be installed by dragging any window into the tooltray -- stored in /appdata/system/widgets.pod
		Added: bbs:// protocol // try "BBS Carts" from the Picotron menu
		Added: automatic sandboxing for all bbs carts. /appdata maps to /appdata/bbs/cart_id + restrictions on send_message()
		Added: files created by bbs:// carts are associated (metadata.prog) as a fallback default app to open it.
		Added: open(location) // uses /system/util/open.lua -- can be used by sandboxed cartridges w/ a rate limit
		Added: pitch ratios (TUNE *) can now compound and observe envelopes, RAND, multipliers, be set in ROOT.
		Added: mousewheel to adjust tracker number fields / mb + wheel for inst knobs & fields. hold ctrl for +8,-8
		Added: play music from a separate .sfx file: fetch("music.sfx"):poke(0x80000) music(0,0,nil,0x80000)
		Added: Audio mix volume (0x5538), music mix volume (0x5539) and per-channel volume (0x553a, used by sfx()).
		Added: ud:convert(type) // can convert between any type. f64 values are floored to convert to ints.
		Added: ud:sort(column, desc) // to sort by a given column index and desc==true to sort largest to smallest
		Added: ud:pow(), ud:sgn(), ud:sgn0(), ud:abs()
		Added: ud:transpose() works on any data type
		Added: diagonal flip bit + r to rotate selection in map + gfx editor. Supported by map(), but not tline3d() [yet?]
		Added: gui attributes: squash_to_clip, confine_to_clip, squash_to_parent, confine_to_parent
		Added: squashable windows: window{width=200,height=100,squashable=true} -- /system/demos/squashable.p64
		Added: menuitem() label can be a function that returns the string
		Added: screen / gif captures are named after the active window
		Added: /system/screensavers/xyzine.p64 (run directly to use it interactively)
		Added: desktop support for web in exports (allows exports with tabbed interfaces, gif & png captures, persist /desktop)
		Changed: Per-process RAM limit is 32MB, with 16MB addressable (was 16MB, 16MB)
		Changed: Userdata lookups have a separate function: ud:take(idx,...); *** ud:copy(idx,...) will be removed in 0.1.2!
		Changed: Reduced number of sprite banks from 64 -> 32 (in order to make diagonal flip bit standard)
		Changed: userdata:op() with no args is now a NOP for all ops except :copy; used to use self as RHS which is confusing
		Changed: include() returns the results from loaded function (used to return true) -> can use module loading pattern
		Changed: tweaked default palette for pairings & separation: 16,18,21,24,25,26,31
		Changed: cartridge label stored in ram in qoi format (was png) for faster encoding and .p64.png mounting
		Changed: default sandbox profile for bbs carts relaxed; can read /desktop, can R/W /ram/cart, can launch filenav.p64
		Changed: env().title removed, env().prog_name moved to env().argv[0]
		Changed: get_clipboard() can only read the host clipboard after ctrl-v is pressed inside picotron (security)
		Changed: all gui callbacks always get mx,my,mb (was missing in :update)
		Changed: ?vec(1/3,2,3.1E+234) prints with more precision, and integers without the fractional part (same as ?pod{...})
		Changed: map editor: f,v (and now r) when nothing is selected alters the current brush; not the whole map. cursors moves camera.
		Changed: pal() only charges cpu for colour tables that have changed since last call (~ 2x as fast)
		Changed: escape while running a fullscreen cartridge brings up pause menu. (use alt+L/R to switch to desktop instead)
		Fixed: terminal launched from another terminal sends print() output of launched programs to the parent terminal instead of self
		Fixed: .p64 files still sometimes only partially stored (!) // race condition; introduced atomic disk operations for safety
		Fixed: pending disk changes are not flushed when closing window immediately (<100ms) after copying / saving a cartridge
		Fixed: crash when > 256 carts are mounted in one session due to unneeded cart mounts not being swept
		Fixed: a:take(b2d) returns the correct shape when b is 2d, but only takes the first row of items.
		Fixed: a:copy(nil, dest, ...) does not observe offsets/strides
		Fixed: userdata ops with a scalar and an output e.g. a:add(3, b) -> reads from b instead of a
		Fixed: mutate() does not alter dimensionality
		Fixed: context menu cut / copy callbacks are broken
		Fixed: carts that are folders on host (folders named foo.64) are sorted out of order by ls()
		Fixed: unpod"{foo[hoge]}" crashes
		Fixed: srand() only gives a different seed every second in web player (see rain in /bbs/?tid=142370)
		Fixed: gui element draw() needs to exist for an element's children to be clipped and hidden
		Fixed: scrollbar content is clickable outside of parents even when clip_to_parent is true
		Fixed: abs(), sgn(), min(), max(), mid() are slow (using placeholder lua implementations)
		Fixed: coroutine.resume() doesn't handle nested coroutines -- now just an alias for coresume()
		Fixed: userdata :div(0), :idiv(0) throw an error; should behave same as regular operators (return -min,+max for that type)
		Fixed: pressing space while playing an instrument (in instrument editor) triggers sfx instead of stopping instrument
		Fixed: app menu sometimes appears partially outside visible desktop area (now uses confine_to_clip)
		Fixed: printing strings to terminal ending in \0 does not surpress "newline" // e.g. print("abc\0")print("def")
		Fixed: unpod() always returning floats for numbers stored as integers // ?unpod(pod(3)) -> 3.0, should be 3
		Fixed: tline3d flags in batch operation are ignored
		Fixed: The main instrument tune knob in the sfx editor does not work as expected when set to multiply by just ratios
		Fixed: Sandboxed carts grant read access to the folder they are inside
		Fixed: File dropped from host produces drop_items message without mx, my set (now always center of active window)
		Fixed: Wallpaper process sometimes set as active window (should be uninteractive except for mouse x,y,wheel_* events)
		Fixed: New Cart produces a completely empty cart folder; should match the default cart with main.lua, gfx/, sfx/, map/ 
		Fixed: Fill tool cursor is broken in gfx editor
		Fixed: ctrl-r, ctrl-m causes key("r"), key("m") to be true in active window
		Fixed: escape halts currently running pwc (run with ctrl-r) when not in that workspace
		Fixed: program corun in terminal can clobber env(), causing subsequent terminal commands to crash (ref: #picovania)
		Fixed: shift-ctrl-r broken // runs the file in the code editor and jumps back to output without restarting program
		Fixed: note() is sometimes delayed or has no audible effect on a channel that was previously used by sfx()
		Fixed: instrument playback logic is broken; should be able to hold, but also to stop long-tail instruments & tracks/music
		Fixed: pause menu doesn't close after selected item and callback returns falsey value
		Fixed: button state persists after closing pause menu (now: each button is ignored until released)
		Fixed: ord() with a negative number of items freezes
		Fixed: circ(x,y,rad) with no colour parameter is a NOP (should draw with current draw colour)


	0.1.1d:

		Added: batch gfx operations for pset,circfill,rectfill,tline3d,spr // many draws with a single function call
		Added: /system/demos/pixeldust.p64 // demos batch draw operations
		Added: userdata:lerp(offset, len, el_stride, num_lerps, lerp_stride)
		Added: userdata:copy(idx, ...) to perform a copy using idx as a lookup table
		Added: desktop file items close together form stacks (use mousewheel to flip through)
		Added: new context menu structure and items: create, load carts / cut,copy,paste / open cartridge contents
		Added: mouse(new_x, new_y) to warp mouse position // not supported under web [yet]
		Added: filenav: shift-click in list or grid mode for range selection
		Added: filenav list mode: show non-cart folders first with icons
		Changed: some vm inst cost only 1 cycle instead of 2 (same as PICO-8: add, sub, bitwise ops, load*, move, unm)
		Changed: ls() returns non-cart folders first, is case-insensitive, and sorts by numeric values first
		Changed: mousewheel events are passed to the window under the cursor (used to be the active window)
		Fixed: memcpy() freezes when len < 4
		Fixed: i64 userdata indexed writes have no effect // a = userdata("i64",64) a[0] = 3
		Fixed: drawing filled shapes completely outside of clip rectangle sometimes crashes under web (causes illegal read)
		Fixed: undercharging cpu for shapes partially clipped horizontally
		Fixed: overcharging cpu when expensive operation falls near the end of a process slice
		Fixed: host screensaver is blocked while Picotron is running // now using SDL_HINT_VIDEO_ALLOW_SCREENSAVER
		Fixed: fetch("http://..") fails // regression in 0.1.1c -- was handling only https
		Fixed: gif capture: frame delta is wrong when scanline palette (0x5400) changes
		Fixed: music fade in/out speed is slower than requested (was updating once per mix instead of once per tick)
		Fixed: filenav list mode: context menu not updated after right-clicking file
		Fixed: filenav list mode: file modified date missing (now loads from pod metadata when available)
		Fixed: filenav grid mode: when showing many files in grid mode, start to get visual junk
		Fixed: unnecessarily large mix buffer size (regression in 0.1.1c -- made sound triggering / tracker feel laggy)
		Fixed: matmul functions fail when output is same as input (because clobbering input data as generate output)
		Fixed: map editor sprite navigator showing sprites from wrong bank
		Fixed: /desktop/readme.txt stored in binary format by 0.1.1b (0.1.1d now re-saves in host-readable txt format)
		Fixed: ctrl-r in html exports drops to terminal (is meant to reset cartridge)
		Fixed: .p64.png inside an .p64 is listed twice by ls() (and so filenav, ls command etc)
		Fixed: panning position is not reset when audio channel is killed
		Fixed: default instrument 0 data not initialised for new process (relies on loading a default .sfx before using note())
		Fixed: when opening a file in host and in fullscreen, result of the action is not visible (now minimizes self)
		Fixed: pulldown menu: parent.onclose is not called (causes e.g. extra click needed for focus after using context menu)
		Fixed: renaming a file on desktop causes it to jump around
		Fixed: renaming a file via menu drops the original extension when not specified


	0.1.1c

		Added: inverted drawing for rectfill,circfill,ovalfill // set bit 0x800000000 in col parameter
		Added: ud:mutate(type, width, height) to change the type / size of a userdata object
		Added: cut/copy/paste/delete selected files in filenav
		Added: desktop snap to grid POC -- turn on with: store("/appdata/system/filenav.pod", {snap_to_grid=true})
		Added: /system/demos/birds.p64 // demos /ram/shared/windows.pod subscription pattern + transparent window
		Added: integer divide for f64 userdata // ?vec(-3.1,3.1,5.9) \ 1  --> (-4.0,3.0,5.0)
		Added: sfx(-2, channel_index) to hard kill a channel (leftover state like echos / decay are cut short)
		Added: shift-delete, ctrl-insert, shift-insert shortcuts in code editor to cut, copy and paste
		Added: userdata :max :min // returns the largest / smallest of each element
		Optimised: faster path for shape hspans where span_w >= 16, (window_w&0x7)==0, target_mask==0 (~6M pixels / frame @60fps)
		Optimised: filenav (uses cached render at rest), squishy windows, process blitting used by wm
		Changed: /ram/shared/windows.pod is published by wm every frame
		Changed: mouse cursor position is clamped to display region in host fullscreen (can hide at bottom right pixel)
		Changed: stat(400+chan_index, 12) returns -1 when sfx is not playing. 
		Changed: sfx() offset can be negative to create a delay of n rows before notes are issued
		Changed: sfx() channel selection prefers channel 8~15 to reduce accidental clobbering when music starts
		Changed: Debug is not available to sandboxed programs
		Fixed: event handling and menus breaks when using a custom mainloop; "vid(0)::_::flip()goto _" now works
		Fixed: menuitem{id="rename"} does not remove item from menu
		Fixed: menuitem() calls from non-active windows clobbering app menu (was affecting filenav)
		Fixed: icons missing on drive.loc and readme.txt after fresh install
		Fixed: capture.p64 doesn't respect video mode
		Fixed: p8scii control character \^c missing -- \^d, \a is still missing, but probably won't support in Picotron
		Fixed: filenav menu shows file ops for a single file when multiple files are selected (confusing)
		Fixed: nil + vec(1) hard crashes // nil values should be treated as 0 for userdata ops
		Fixed: dormant music channels that become active are played up to one mix buffer out of sync (erf!)
		Fixed: text input buffer spills into textfield when it becomes active ~ should clear on gaining focus
		Fixed: tracker playback following is broken when first track is empty, or when gui play button is used
		Fixed: pressing enter in tracker should clear selection or insert a row otherwise, but not both
		Fixed: ctrl-c to copy patterns in tracker cuts them
		Fixed: off by 1 when blitting process displays to negative positions // causes red pixel in corner of squishy windows
		Fixed: "picotron -home foo" host crashes when foo doesn't exist
		Fixed: wrangle.lua crashes when opening legacy pods that do not have .revision in metadata
		Fixed: gif encoder leaves inter-frame junk for colour 63 when using scanline display palette 3
		Fixed: read mask not applied for non-aligned spans while drawing shapes with target mask == 0
		Fixed: tonum(bool) doesn't return 0 or 1 (PICO-8 behaviour)
		Fixed: mousewheel message is propagated to parent of scrollbox (should consume)
		Fixed: Unable to send small number between processes // was happening for values serialised with scientific notation
		Fixed: default tab width doesn't line up with monospace font ._.
	

	0.1.1b

		Fixed: wm crash when trying to set workspace to "tooltray" when show_in_workspace == nil
		Fixed: _rm not defined in fs.lua (causing "load #foo" to fail)
		Fixed: gif recording initialisation sometimes fails silently and produces .gif of size 0


	0.1.1 

		Added: html exporter: export foo.html  //  single self-contained html file that can run locally
		Added: web support (bbs/exports): /appdata storage (IDBFS), mouselock(), extended gamepad (twin-stick + SL,SR)
		Added: gif capture // ctrl+8 to start, ctrl+9 to end -- max 16 seconds
		Added: capture.p64 tool - can be opened with with shift+ctrl+6 or shift+ctrl+8 to select a region from anywhere
		Added: FX:FILTER:RES knob can be multiplied by FX:FILTER:LOW for better resonant peak behaviour
		Added: FX:SHAPE:MIX knob can be multiplied by the instrument's root node volume
		Added: store("foo.bin", "some binary string\0\1\2\3", {metadata_format="none"}) to generate raw host file output
		Added: adaptive battery saver: drop down to 30fps when idle for 500ms, and not running fullscreen app or /ram/cart
		Added: sandboxing // WIP -- used by web bbs player to prevent carts from being able to clobber each other's data
		Added: semi-transparent notification bar
		Added: show selected colour index in sprite editor
		Added: headless script execution: picotron -x foo.lua (experimental! foo.lua must be inside picotron's drive)
		Added: picotron -home foo // to specify a home folder where config.txt / default drive is stored
		Changed: show_in_workspace taken defaults to true when creating a window
		Fixed: filenav is slow with many / large files // improved fstat(), fetch_metadata()
		Fixed: segfault when too many ord() results
		Fixed: pod("abc\0def", 0x0) only encodes "abc"
		Fixed: reading a cartridge as a file (fetch"foo.p64") immediately after its content changes returns the older version
		Fixed: screenshots do not observe scaneline palette
		Fixed: time() is wrong when battery saver is active
		Fixed: removed EXIT from pause menu when running in BBS player
		Fixed: stale audio ram mixed after poking to unmapped pages (is supposed to mark as dirty and send to pfx6416)
		Fixed: slide effects use same keys as SFX navigation (-, +) --> should block navigation when cursor is in fx channel!
		Fixed: sound is not paused when pause menu is active
		Fixed: arpeggios a-00, b-00 producing high-pitched when group of 4 contains empty rows
		Fixed: stereo mixing broken under web


	0.1.0h

		Added: PFX6416 effects: tremelo, vibrato, wibble, slide, fade, arps, retrigger, cut, delay, pan
		Added: PFX6416 stereo mixing, + wide instruments (allows nodes to have separate panning position)
		Added: tracker interface: thumbnails, channel output scopes, cursor/playback following, re-order instrument nodes
		Added: tracker can now handle up to 64 instruments, 384 SFXs and 128 patterns
		Added: text editor shortcuts: ctrl+e (end), ctrl+w (staWt), ctrl+up (same as ctrl-home), ctrl+down
		Added: text editor operations: ctrl+b (block comment) ctrl+d (duplicate) shift+enter (add "end" and indent), ctrl+l
		Added: monospace toggle button in code editor's app menu
		Added: file modification events // on_event("modified:/foo.txt", function(msg) end)
		Added: select/copy/paste multiple items (shift+drag/click): sprites, instruments, SFXs, patterns
		Added: gfx editor: batch resize and flag modification, shift to snap shape tools, 1,2 to switch colours
		Added: run command // similar to ctrl-r, but can pass commandline arguments
		Added: "Fullscreen:Window" in settings to be multi-monitor friendly (uses a borderless window)
		Added: memory accounting: max 16MB per process (stat(0)) // total Lua allocations + 4k ram pages allocated on write
		Added: fget / fset supports reading/writing a single bit  // fget(n, b), fset(n, b, val)
		Added: unmap(ud, addr) to unmap only one userdata that may still be mapped elsewhere
		Added: userdata :peek(addr) :poke(addr) // e.g. can fetch("/system/fonts/p8.font"):poke(0x4000)
		Added: map() can take tile_w, tile_h as the last two parameters (integers); defaults to 0x550e, 0x550f
		Added: userdata:row(), userdata:column()
		Added: ord("abc",1,3) multiple return values
		Changed: resonance knob in filter FX tweaked to have a more even distribution of values
		Changed: ctrl+left/right in text editor skips whitespace 
		Changed: memmap(ud, addr) (was memmap(addr, ud) -- that legacy form is still supported)
		Changed: maximum values that can be poked / peeked in a single call: 65536
		Changed: map() does not draw (or charge   for) spr 0 by default // for old behaviour: poke(0x5f36, 0x8)
		Changed: foldback uses a more usual triangle function instead of cosine (sounds similar, but less harmonic junk)
		Changed: many cpu accounting adjustments to get closer to real-world cost
		Optimised: transparent window blits (filenav.p64 on desktop), and pal() calls use less host cpu
		Fixed: crash when blit()ing to a region outside the target, but partially inside source userdata (0.1.0g fix was incomplete)
		Fixed: thread contention slowing down tracker while playing music in pattern mode on low end machines
		Fixed: text editor: doesn't handle trailing newline in selection
 		Fixed: text editor: cursor x position is lost when moving across short lines
		Fixed: text editor: shift-tab on selection does nothing when line starts with spaces instead of tabs
		Fixed: can't use file wrangler from /ram/cart; e.g. file open -> filenav launches terminal instead of /ram/cart
		Fixed: when saving a cart with ctrl+S, files deleted in /ram/cart are not also removed from the rewritten .p64
		Fixed: window{pauseable=false} doesn't disable pausing on Enter for fullscreen apps
		Fixed: changing draw target or display size does not release the old userdata for garbage collection
		Fixed: palt() ignores single integer parameter (is means to act as a 64-bit bitfield)
		Fixed: tline3d crash on tiles that use flip bits // now supports tile flipping
		Fixed: map editor slow when zoomed out and/or there are more than a few layers
		Fixed: can not assign integer userdata element to a real number using flat indexing // get_draw_target()[0] = 9.1
		Fixed: matmul cpu cost is wrong for large matrices (was charging for only w*h multiplies instead of w*h*h)
		Fixed: scalar-userdata operations with scalar on LHS treated as if RHS ((2/vec(1))[0] == 0.5 instead of 2.0
		Fixed: userdata:tranpose() broken for non-square matrices
		Fixed: f64 userdata loses its data type on copy (as reported by :attribs())
		Fixed: resetting a cartridge from the pause menu sometimes kills it
		Fixed: doubletap / doubleclick message firing even when two clicks are far apart
		Fixed: global mute setting not observed
		Fixed: (web) multiple webaudio mixer on reset / open multiple carts in one bbs thread (causes speedup / glitches)


	0.1.0g

		Added: pause menu for fullscreen programs (ENTER -> continue, toggle sound, reset cartridge, exit)
		Added: file extension associations. To specify a default app: default_app vgfx /apps/tools/veditor.p64
		Added: shortcuts: ctrl-home, ctrl-end in code/text editor;  ctrl-a (home) and ctrl-d (delete) in terminal
		Changed: .sfx format and resource loader now stores 256k by default (space for 398 SFX; is backwards compatible)
		Changed: Open File and New File (via app menu) always open in the program that requested it (ref: VisiTrack, VGFX)
		Changed: Can not rename a file over an existing filename in filenav
		Fixed: sometimes boot into an invalid workspace and need to switch back and forth to mend
		Fixed: web player: audio, key(), touch controls (but only P8 buttons for now)
		Fixed: the first file change logged by anywhen each day is stored as the newly written version instead of the old version
		Fixed: stray globals in terminal: k, res, cproj_draw, cproj_update
		Fixed: node output missing in instrument designer
		Fixed: crash when blit()ing from outside of source bitmap // was happening when using magnifying glass at bottom right
		Fixed: magnifying glass drawing black as transparent
		Fixed: btn(), btnp() when no _update() callback exists only works via ctrl-r and not when run directly from desktop / terminal
		Fixed: several types of crackles / discontinuities in audio mixer, mostly relating to echo nodes
		Fixed: SFXs 64 and above are not initialised to "empty" (instead, zeroed data that shows up as C0's)
		Fixed: some ctrl- combinations produce a textinput event. e.g. ctrl-1 // explicitly blocked in events.lua
		Fixed: (Mac) icon is slightly too big
		Fixed: (Mac) Option key not mapped to "alt"
		Fixed: cursor in terminal doesn't wrap with command string
		Fixed: Locked mouse speed is different along X & Y (partial fix)
		Fixed: Moving a folder inside itself causes folder to be deleted
		Fixed: crash if call clip() in _init (before a display is created)


	0.1.0f

		Added: reboot
		Added: logged disk writes for backups / versioning ("anywhen" in settings)
		Added: load cart.p64@2024-04-06_14:00:00 to load a cart from the past (or just @14:00 for short if same day -- local time)
		Added: date() can take a time to convert (string or epoch time) and a delta: date(nil, "2024-02-01_15:00:00", delta_secs)
		Added: stat(87) for timezone delta in seconds (add to local time to get UTC)
		Added: drag and drop host files into picotron (copied to /ram/drop -- not mounted) -> generates a "drop_items" message
		Added: drop a png into gfx editor to load it (colour fits to current display palette)
		Added: filenav: open files or folder on host via app menu ("View in Host OS")
		Added: can fetch .p64 host files directly as binary strings // same semantics as fetching "https://...foo.p64"		
		Added: PICO-8 style string indexing;  ?("abcde")[4] --> "d"    ?("abcde")[02] --> nil
		Added: btnp() repeat rates (follows PICO-8: initial repeat delay: @5f5c, subsequent delays at @5f5d specified at 30fps)
		Added: >>, << operators for integer userdata
		Added: Row markers in tracker pattern view + 
		Added: mouselock(true, event_sensitivity, movement_sensitivity) -- mouselock(false) to disable; dx,dy = mouselock()
		Added: tline3d dev flags (last param): 0x100 skip last pixel; 0x200 apply sub-pixel adjustment // see: /bbs/?tid=141647
		Added: music() fade in and out
		Changed: increased userdata ops per cycle (2x for mul,div,mod; 4x for others) 
		Changed: ls() sorts results with (non-cart) folders first by default
		Changed: renamed create_diff / apply_diff -> create_delta / apply_delta
		Changed: timestamps shown by about.p64 and default tooltray clock show local times
		Changed: when pixel_perfect is off, blitter prescales to 960x540 (still quite blurry though)
		Changed: screenshots stored to /desktop/host -- a folder automatically mounted on host at {Desktop}/picotron_desktop
		Changed: cp, mv take -f flags (required if copying over an existing folder / cartridge)
		Fixed: trailing slash for folders on tab complete in filenav, terminal
		Fixed: delete key + AltGr not working in terminal
		Fixed: tracker note keys using mapped key names -- should be raw scancode layout
		Fixed: tracker knobs hard to use when close to edge of the screen (now using mouselock and finer sensitivity)
		Fixed: using keyboard controls while a game controller is plugged in causes ghost button presses
		Fixed: ceil(1.0) returns 2 ._.
		Fixed: crash on multiplying userdata by scalar on LHS //  ?(tostring (1 * vec(1, 1, 1)))
		Fixed: redundant cartridge file flushing (writes that happen within 300ms are now batched)
		Fixed: search for an empty spot on desktop to create dropped files
		Fixed: key() / keyp() returns false when received keyup and keydown messages in same frame (should be true for 1 frame)
		Fixed: keyboard btn() responds to keypress one frame late
		Fixed: memmap(0x8000) crashes // update: can't unmap pages like this, can only unmap by userdata: unmap(ud)
		Fixed: high dpi display modes blurry [not sure if will be fixed in 0.1.0f]
		Fixed: fetching https:// forces url to be lowercase
		Fixed: LFO phase knob ignored


	0.1.0e

		Added: sfx tracker: undo / selections / copy + paste single instruments / track data / patterns
		Added: gfx bank selection in map editor
		Added: pixel_perfect x stretch: each axis separately uses largest integer multiple that fits
		Added: hold down ctrl x 2 to boot into terminal (useful for recovering from borked configurations)
		Added: create new tab flow: guess file extension from other files in the target folder when none is given
		Added: home/end/ctrl+e in terminal to control cursor position
		Changed: palt(1) sets colour 0 as transparent, not 63 (departure from P8 style)
		Fixed: double listings of .p64 files in /
		Fixed: host folders called foo.p64 collapse back into .p64 files on save (but still happens on mv / cp)
		Fixed: flip bits not observed when drawing with map()
		Fixed: map editor draws an out of bounds row and column at bottom and right
		Fixed: workspace icons lose transparency after using magnifying glass
		Fixed: \n\r pasted from windows creates overlapping lines in code editor (now filtered out)
		Fixed: host keypresses getting through to Picotron (alt+tab, ctrl+alt+left/right)
		Fixed: filenav crashes when actioning intention with a filename that can not be resolved
		Fixed: can not use AltGR during text entry 
		Fixed: default key mappings: command keys & delete were missing in 0.1.0d
		Fixed: bad keycodes.pod / scancodes.pod format causes wm crash on boot

	0.1.0d

		Added: default keyboard mapping for key()/keyp() uses host OS layout by default
		Added: can map multiple physical keys to a single virtual key
		Added: sfx len (becomes loop0 when loop1 > len)
		Added: warning on startup when the /system version does not match the build version
		Changed: about.p64 now shows/edits the metadata of /ram/cart by default (i.e. just type: about)
		Changed: rename triplane.p64 to biplane.p64 (need to re-select it again from wallpapers)
		Fixed: /system rom in 0.1.0c was the wrong version! (caused map drawing and other things to break)
		Fixed: (Windows) rm does not delete host folders 
		Fixed: (Mac) crashes after ~13.5 minutes
		Fixed: host system user data paths are clipped at non-ascii characters
		
	0.1.0c

		Added: custom map tile sizes (taken from sprite 0)
		Added: layer naming and ordering (the first layer in the list is now drawn on top)
		Added: mget(), mset(), ceil()
		Added: async remote fetch (put it in a coroutine)
		Added: /system/util: shutdown pwd info
		Added: right click on desktop to create new file / get file info
		Added: /appdata/system/keycodes.pod to map virtual key (to a raw name or directly to scancode)
			// store("/appdata/system/keycodes.pod", {a="q",z="w",q="a",w="z",m=51})
		Added: future version checking; a separate runtime version number is stored with each cart.
		Added: delete file menu item in filenav (moves a single file to /ram/compost)
		Added: send_message(pid, {msg=..., _delay = 2}) to send a delayed message (_delay is in seconds)		
		Changed: filenames can contain hyphens
		Changed: terminal searches for commands in current path /after/ standard paths (/system/util, ..)
		Changed: added more undo checkpoints to the text editor
		Changed: gui elements must explicitly :set_keyboard_focus(true) on click to consume textinput events
		Changed: screenshots and untitled cart filenames are given an integer suffix to reduce collisions 
		Changed: when saving a file with no extension, wrangler automatically adds the default filename extension
		Changed: track (sfx) length can be specified pico-8 style by increasing loop0 (memory layout doesn't change)
		Fixed: load #bbs_id twice over the same local file -> fails to unmount the first cartridge
		Fixed: audio lock causing random crashes on Mac (tentative ~ not sure if that was the cause or the only cause)
		Fixed: cp allows copying to inside self (-> crash; e.g. when save cart to /ram/cart)
		Fixed: reset() does not reset scanline palette selection bits at 0x5400
		Fixed: (Mac) vertical red line junk on letterboxed area in fullscreen mode
		Fixed: (Windows) printh doesn't send anything to terminal
		Fixed: drop file into a folder exactly when it opens --> hard freeze (wm crashes)
		Fixed: when dragging files and move mouse quickly, offset from mouse doesn't match original position
		Fixed: flr("garbage") causes runtime error (should return 0 to match PICO-8 behaviour)
		Fixed: text editor operations (undo, indent, double click select) stop working after using search
		Fixed: width/height fields dump earlier keypress junk + no way to delete characters
		Fixed: msg.has_pointer not always set when it should be (--> cursor not changing on window title)
		Fixed: msg.mx, msg.my absolute values for draw callbacks; should be relative to gui element 
		Fixed: no printh output under Windows (switched to using SDL_Log)
		Fixed: ctrl+6 screenshot while in video mode 3 or 4 is not scaled to cover the 480x270 output
		Fixed: flashing when windowed cartridge runs at < 60fps with a custom display palette (e.g. inst editor)
		Fixed: flashing when video mode 3 or 4 running at < 60fps
		Fixed: filenav selects .loc files (drive.loc) as target to save over instead of opening it like a folder
		Fixed: corrupted /desktop/drive.loc due to aforementioned bug -- now automatically mended on startup
		Fixed: run bells.p64 and then enter tracker -> audio is mixed from left over junk state 
		Fixed: note entry sometimes does not play in pattern editing mode 
		Fixed: can edit track that is not currently visible
		Fixed: ASDR release is calculated incorrectly (is way too long) when played in track view
		Fixed: clipping: tline3d (w is wrong), spr() when flipped


	0.1.0b

		Added: system event logging in log.txt (same folder as picotron_config.txt)
		Added: /appdata/system/scancodes.pod to remap physical key scancode
				// e.g. store("/appdata/system/scancodes.pod", {lctrl=57})
		Changed: apple option / windows menu keys are mapped to "ctrl"
		Fixed: Default mapping of lctrl is wrong
		Fixed: Windows file saving generating corrupt data (opened in text instead of binary mode)
		Fixed: Crash when reading corrupted lz4 pods -- now returns a nil object 
				// (& deals with existing corrupt settings.pod)
		Fixed: Windows BSOD on boot
		Fixed: Button mappings wrong for controller index 1 and above


	0.1.0 First release of binaries