-------------------------------------------------------------------------------------------- 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