-------------------------------------------------------------------------------------------- PICOTRON VERSION HISTORY -------------------------------------------------------------------------------------------- 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