mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-18 02:14:04 +09:00
Compare commits
3 Commits
6bc49e3f0b
...
8d7d534bc8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d7d534bc8 | ||
|
|
dc3c73252e | ||
|
|
2053526dfa |
2
.idea/runConfigurations/AppLoader.xml
generated
2
.idea/runConfigurations/AppLoader.xml
generated
@@ -3,7 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="21" />
|
<option name="ALTERNATIVE_JRE_PATH" value="21" />
|
||||||
<option name="MAIN_CLASS_NAME" value="net.torvald.tsvm.AppLoader" />
|
<option name="MAIN_CLASS_NAME" value="net.torvald.tsvm.AppLoader" />
|
||||||
<module name="tsvm_executable" />
|
<module name="tsvm_executable" />
|
||||||
<option name="VM_PARAMETERS" value="-ea --upgrade-module-path=lib/compiler-23.1.10.jar:lib/compiler-management-23.1.10.jar:lib/truffle-compiler-23.1.10.jar:lib/truffle-api-23.1.10.jar:lib/truffle-runtime-23.1.10.jar:lib/polyglot-23.1.10.jar:lib/collections-23.1.10.jar:lib/word-23.1.10.jar:lib/nativeimage-23.1.10.jar:lib/jniutils-23.1.10.jar -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI --add-exports=java.base/jdk.internal.misc=jdk.internal.vm.compiler" />
|
<option name="VM_PARAMETERS" value="-ea --upgrade-module-path=lib/compiler-23.1.10.jar:lib/compiler-management-23.1.10.jar:lib/truffle-compiler-23.1.10.jar:lib/truffle-api-23.1.10.jar:lib/truffle-runtime-23.1.10.jar:lib/polyglot-23.1.10.jar:lib/collections-23.1.10.jar:lib/word-23.1.10.jar:lib/nativeimage-23.1.10.jar:lib/jniutils-23.1.10.jar -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseZGC -XX:+UseDynamicNumberOfGCThreads --add-exports=java.base/jdk.internal.misc=jdk.internal.vm.compiler" />
|
||||||
<extension name="coverage">
|
<extension name="coverage">
|
||||||
<pattern>
|
<pattern>
|
||||||
<option name="PATTERN" value="net.torvald.tsvm.*" />
|
<option name="PATTERN" value="net.torvald.tsvm.*" />
|
||||||
|
|||||||
2
.idea/runConfigurations/TsvmEmulator.xml
generated
2
.idea/runConfigurations/TsvmEmulator.xml
generated
@@ -2,7 +2,7 @@
|
|||||||
<configuration default="false" name="TsvmEmulator" type="Application" factoryName="Application" nameIsGenerated="true">
|
<configuration default="false" name="TsvmEmulator" type="Application" factoryName="Application" nameIsGenerated="true">
|
||||||
<option name="MAIN_CLASS_NAME" value="net.torvald.tsvm.TsvmEmulator" />
|
<option name="MAIN_CLASS_NAME" value="net.torvald.tsvm.TsvmEmulator" />
|
||||||
<module name="tsvm_executable" />
|
<module name="tsvm_executable" />
|
||||||
<option name="VM_PARAMETERS" value="-ea --upgrade-module-path=lib/compiler-23.1.10.jar:lib/compiler-management-23.1.10.jar:lib/truffle-compiler-23.1.10.jar:lib/truffle-api-23.1.10.jar:lib/truffle-runtime-23.1.10.jar:lib/polyglot-23.1.10.jar:lib/collections-23.1.10.jar:lib/word-23.1.10.jar:lib/nativeimage-23.1.10.jar:lib/jniutils-23.1.10.jar -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI --add-exports=java.base/jdk.internal.misc=jdk.internal.vm.compiler" />
|
<option name="VM_PARAMETERS" value="-ea --upgrade-module-path=lib/compiler-23.1.10.jar:lib/compiler-management-23.1.10.jar:lib/truffle-compiler-23.1.10.jar:lib/truffle-api-23.1.10.jar:lib/truffle-runtime-23.1.10.jar:lib/polyglot-23.1.10.jar:lib/collections-23.1.10.jar:lib/word-23.1.10.jar:lib/nativeimage-23.1.10.jar:lib/jniutils-23.1.10.jar -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseZGC -XX:+UseDynamicNumberOfGCThreads --add-exports=java.base/jdk.internal.misc=jdk.internal.vm.compiler" />
|
||||||
<extension name="coverage">
|
<extension name="coverage">
|
||||||
<pattern>
|
<pattern>
|
||||||
<option name="PATTERN" value="net.torvald.tsvm.*" />
|
<option name="PATTERN" value="net.torvald.tsvm.*" />
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ _TVDOS.variables = {
|
|||||||
LANG: "EN",
|
LANG: "EN",
|
||||||
KEYBOARD: "us_qwerty",
|
KEYBOARD: "us_qwerty",
|
||||||
PATH: "\\tvdos\\bin;\\home",
|
PATH: "\\tvdos\\bin;\\home",
|
||||||
PATHEXT: ".com;.bat;.app;.js",
|
PATHEXT: ".com;.bat;.app;.js;.alias",
|
||||||
HELPPATH: "\\tvdos\\help",
|
HELPPATH: "\\tvdos\\help",
|
||||||
OS_NAME: "TSVM Disk Operating System",
|
OS_NAME: "TSVM Disk Operating System",
|
||||||
OS_VERSION: _TVDOS.VERSION
|
OS_VERSION: _TVDOS.VERSION
|
||||||
@@ -423,11 +423,11 @@ _TVDOS.DRV.FS.SERIAL.sread = (fd) => {
|
|||||||
}
|
}
|
||||||
_TVDOS.DRV.FS.SERIAL.bread = (fd) => {
|
_TVDOS.DRV.FS.SERIAL.bread = (fd) => {
|
||||||
let str = _TVDOS.DRV.FS.SERIAL.sread(fd)
|
let str = _TVDOS.DRV.FS.SERIAL.sread(fd)
|
||||||
let bytes = new Int8Array(str.length)
|
let bytes = []//new Int8Array(str.length)
|
||||||
for (let i = 0; i < str.length; i++) {
|
for (let i = 0; i < str.length; i++) {
|
||||||
// let p = str.charCodeAt(i)
|
// let p = str.charCodeAt(i)
|
||||||
// bytes[i] = (p > 127) ? p - 255 : p
|
// bytes[i] = (p > 127) ? p - 255 : p
|
||||||
bytes[i] = str.charCodeAt(i)
|
bytes.push(str.charCodeAt(i))
|
||||||
}
|
}
|
||||||
return bytes
|
return bytes
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -753,6 +753,25 @@ shell.execute = function(line) {
|
|||||||
shell.execute(line)
|
shell.execute(line)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
else if ("ALIAS" == extension) {
|
||||||
|
// parse alias
|
||||||
|
// $0: all arguments
|
||||||
|
// $1..9: specific arguments
|
||||||
|
var lines = programCode.split('\n').filter(function(it) { return it.length > 0 }) // this return is not shell's return!
|
||||||
|
lines.forEach(function(line) {
|
||||||
|
var newLine = line
|
||||||
|
|
||||||
|
// replace $1..$9
|
||||||
|
for (let j = 1; j < 9; j++) {
|
||||||
|
newLine = newLine.replaceAll('$'+j, tokens[j])
|
||||||
|
}
|
||||||
|
|
||||||
|
// replace $0
|
||||||
|
newLine = newLine.replaceAll('$0', tokens.slice(1).join(' '))
|
||||||
|
|
||||||
|
shell.execute(newLine)
|
||||||
|
})
|
||||||
|
}
|
||||||
else if ("APP" == extension) {
|
else if ("APP" == extension) {
|
||||||
let appexec = `A:${_TVDOS.variables.DOSDIR}\\sbin\\appexec.js`
|
let appexec = `A:${_TVDOS.variables.DOSDIR}\\sbin\\appexec.js`
|
||||||
let foundFile = searchFile.fullPath
|
let foundFile = searchFile.fullPath
|
||||||
|
|||||||
1
assets/disk0/tvdos/bin/microtone.alias
Normal file
1
assets/disk0/tvdos/bin/microtone.alias
Normal file
@@ -0,0 +1 @@
|
|||||||
|
taut $0
|
||||||
@@ -8,9 +8,7 @@ const win = require("wintex")
|
|||||||
const font = require("font")
|
const font = require("font")
|
||||||
const taud = require("taud")
|
const taud = require("taud")
|
||||||
const keys = require("keysym")
|
const keys = require("keysym")
|
||||||
|
const gl = require("gl")
|
||||||
font.setLowRom("A:/tvdos/bin/tautfont_low.chr")
|
|
||||||
font.setHighRom("A:/tvdos/bin/tautfont_high.chr")
|
|
||||||
|
|
||||||
const BUILD_DATE = "260424"
|
const BUILD_DATE = "260424"
|
||||||
const TRACKER_SIGNATURE = "TsvmTaut"+BUILD_DATE // 14-byte string
|
const TRACKER_SIGNATURE = "TsvmTaut"+BUILD_DATE // 14-byte string
|
||||||
@@ -83,6 +81,9 @@ doubledot:"\u008419u",
|
|||||||
statusstop:"\u008420u\u008421u",
|
statusstop:"\u008420u\u008421u",
|
||||||
statusplay:"\u008422u\u008423u",
|
statusplay:"\u008422u\u008423u",
|
||||||
playhead:"\u00A7",
|
playhead:"\u00A7",
|
||||||
|
|
||||||
|
leftshade:'\u00B0',
|
||||||
|
rightshade:'\u00B2',
|
||||||
}
|
}
|
||||||
|
|
||||||
const fxNames = {
|
const fxNames = {
|
||||||
@@ -552,6 +553,10 @@ const VOCSIZE_ORDERS = Math.floor((SCRW - 8) / 4)
|
|||||||
const VIEW_TIMELINE = 0
|
const VIEW_TIMELINE = 0
|
||||||
const VIEW_CUES = 1
|
const VIEW_CUES = 1
|
||||||
const VIEW_PATTERN_DETAILS = 2
|
const VIEW_PATTERN_DETAILS = 2
|
||||||
|
const VIEW_SAMPLES = 3
|
||||||
|
const VIEW_INSTRMNT = 4
|
||||||
|
const VIEW_PROJECT = 5
|
||||||
|
const VIEW_FILE = 6
|
||||||
|
|
||||||
const colPlayback = 86
|
const colPlayback = 86
|
||||||
const colHighlight = 41
|
const colHighlight = 41
|
||||||
@@ -562,11 +567,13 @@ const colStatus = 253
|
|||||||
const colVoiceHdr = 230
|
const colVoiceHdr = 230
|
||||||
const colSep = 252
|
const colSep = 252
|
||||||
const colPushBtnBack = 143
|
const colPushBtnBack = 143
|
||||||
const colTabBarBack = 187
|
const colTabBarBack = 225
|
||||||
const colTabBarOrn = 91//135
|
const colTabBarBack2 = 135
|
||||||
|
const colTabBarOrn = 136
|
||||||
const colBrand = 211
|
const colBrand = 211
|
||||||
const colPopupBack = 91
|
const colPopupBack = 52
|
||||||
|
const colTabActive = 239
|
||||||
|
const colTabInactive = 45
|
||||||
|
|
||||||
// protip: avoid using colour zero
|
// protip: avoid using colour zero
|
||||||
const colWHITE = 239
|
const colWHITE = 239
|
||||||
@@ -665,14 +672,16 @@ function drawStatusBar() {
|
|||||||
con.color_pair(colEffOp, 255); print(`${sSpd}`)
|
con.color_pair(colEffOp, 255); print(`${sSpd}`)
|
||||||
|
|
||||||
// app title
|
// app title
|
||||||
let s1 = "Microtone"
|
/*let s1 = "Microtone"
|
||||||
let s2 = "tracker for tsvm"
|
let s2 = "tracker for tsvm"
|
||||||
con.move(1, (SCRW - (s1.length & 254)) >>> 1)
|
con.move(1, (SCRW - (s1.length & 254)) >>> 1)
|
||||||
con.color_pair(colBrand, 255); print('Micro')
|
con.color_pair(colBrand, 255); print('Micro')
|
||||||
con.color_pair(colStatus, 255); print('tone')
|
con.color_pair(colStatus, 255); print('tone')
|
||||||
con.move(2, (SCRW - (s2.length & 254)) >>> 1)
|
con.move(2, (SCRW - (s2.length & 254)) >>> 1)
|
||||||
con.color_pair(colSep, 255); print('tracker for ')
|
con.color_pair(colSep, 255); print('tracker for ')
|
||||||
con.color_pair(74, 255); print('tsvm')
|
con.color_pair(74, 255); print('tsvm')*/
|
||||||
|
gl.drawTexImage(logoTexture, (graphics.getPixelDimension()[0]-logoTexture.width) >>> 1, 6)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawTabBar() {
|
function drawTabBar() {
|
||||||
@@ -688,9 +697,16 @@ function drawTabBar() {
|
|||||||
if (i > 0) con.curs_right(TAB_GAP);
|
if (i > 0) con.curs_right(TAB_GAP);
|
||||||
let tabName = PANEL_NAMES[i]
|
let tabName = PANEL_NAMES[i]
|
||||||
|
|
||||||
let col = (currentPanel === i) ? 161 : 240
|
let colFore = (currentPanel === i) ? colTabActive : colTabInactive
|
||||||
|
let colBack = (currentPanel === i) ? colTabBarBack2 : colTabBarBack
|
||||||
|
let colFore2 = (currentPanel === i) ? colTabBarBack2 : colTabBarBack
|
||||||
|
let colBack2 = (currentPanel === i) ? colTabBarBack : colTabBarBack
|
||||||
|
let spcL = (currentPanel === i) ? sym.leftshade : ' '
|
||||||
|
let spcR = (currentPanel === i) ? sym.rightshade : ' '
|
||||||
|
|
||||||
con.color_pair(col, colTabBarBack); print(` ${tabName} `)
|
con.color_pair(colFore2, colBack2); print(spcL)
|
||||||
|
con.color_pair(colFore, colBack); print(tabName)
|
||||||
|
con.color_pair(colFore2, colBack2); print(spcR)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -840,7 +856,8 @@ function drawControlHint() {
|
|||||||
// ['q','Quit'],
|
// ['q','Quit'],
|
||||||
]
|
]
|
||||||
|
|
||||||
let hintElems = [hintElemTimeline, hintElemOrders, hintElemPatterns]
|
const hintElemExternal = [['Tab','Panel']]
|
||||||
|
let hintElems = [hintElemTimeline, hintElemOrders, hintElemPatterns, hintElemExternal, hintElemExternal, hintElemExternal, hintElemExternal]
|
||||||
|
|
||||||
// erase current line
|
// erase current line
|
||||||
con.move(SCRH, 1)
|
con.move(SCRH, 1)
|
||||||
@@ -1112,7 +1129,8 @@ function setTimelineRowStyle(style) {
|
|||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
con.curs_set(0)
|
con.curs_set(0)
|
||||||
graphics.setBackground(34, 38, 51)
|
graphics.setBackground(0x23,0x39,0x58)
|
||||||
|
//graphics.setBackground(0x12,0x32,0x5f)
|
||||||
graphics.setGraphicsMode(0)
|
graphics.setGraphicsMode(0)
|
||||||
|
|
||||||
let currentPanel = VIEW_TIMELINE
|
let currentPanel = VIEW_TIMELINE
|
||||||
@@ -1145,6 +1163,12 @@ if (fullPathObj === undefined) {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const logofile = files.open("A:/tvdos/bin/tauthdr.r8")
|
||||||
|
const logoBytes = logofile.bread(); logofile.close()
|
||||||
|
const logoTexture = new gl.Texture(88, 12, logoBytes)
|
||||||
|
|
||||||
|
font.setLowRom("A:/tvdos/bin/tautfont_low.chr")
|
||||||
|
font.setHighRom("A:/tvdos/bin/tautfont_high.chr")
|
||||||
const song = loadTaud(fullPathObj.full, 0)
|
const song = loadTaud(fullPathObj.full, 0)
|
||||||
|
|
||||||
const voiceMutes = new Array(NUM_VOICES).fill(false)
|
const voiceMutes = new Array(NUM_VOICES).fill(false)
|
||||||
@@ -1156,6 +1180,22 @@ function resetAudioDevice() {
|
|||||||
audio.stop(PLAYHEAD)
|
audio.stop(PLAYHEAD)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function applyMuteTransition(toPanel) {
|
||||||
|
if (toPanel === VIEW_PATTERN_DETAILS) {
|
||||||
|
timelineMuteSnapshot = voiceMutes.slice()
|
||||||
|
if (voiceMutes[0]) {
|
||||||
|
voiceMutes[0] = false
|
||||||
|
audio.setVoiceMute(PLAYHEAD, 0, false)
|
||||||
|
}
|
||||||
|
} else if (toPanel === VIEW_TIMELINE && timelineMuteSnapshot !== null) {
|
||||||
|
for (let i = 0; i < song.numVoices; i++) {
|
||||||
|
voiceMutes[i] = timelineMuteSnapshot[i]
|
||||||
|
audio.setVoiceMute(PLAYHEAD, i, voiceMutes[i])
|
||||||
|
}
|
||||||
|
timelineMuteSnapshot = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function redrawFull() { drawAll() }
|
function redrawFull() { drawAll() }
|
||||||
|
|
||||||
function redrawPanel() {
|
function redrawPanel() {
|
||||||
@@ -1273,7 +1313,7 @@ function timelineInput(wo, event) {
|
|||||||
const oldVoiceOff = voiceOff
|
const oldVoiceOff = voiceOff
|
||||||
const prevVox = cursorVox
|
const prevVox = cursorVox
|
||||||
let triedCross = false
|
let triedCross = false
|
||||||
if (shiftDown) {
|
if (shiftDown || timelineRowStyle > 0) {
|
||||||
cursorVox += dir * moveDelta
|
cursorVox += dir * moveDelta
|
||||||
timelineColCursor = dir > 0 ? 0 : 5
|
timelineColCursor = dir > 0 ? 0 : 5
|
||||||
} else {
|
} else {
|
||||||
@@ -1750,8 +1790,38 @@ function patternsInput(wo, event) {
|
|||||||
|
|
||||||
const panelTimeline = new win.WindowObject(1, PTNVIEW_OFFSET_Y, SCRW, PTNVIEW_HEIGHT, timelineInput, drawTimelineContents, undefined, ()=>{})
|
const panelTimeline = new win.WindowObject(1, PTNVIEW_OFFSET_Y, SCRW, PTNVIEW_HEIGHT, timelineInput, drawTimelineContents, undefined, ()=>{})
|
||||||
const panelOrders = new win.WindowObject(1, PTNVIEW_OFFSET_Y, SCRW, PTNVIEW_HEIGHT, ordersInput, drawOrdersContents, undefined, ()=>{})
|
const panelOrders = new win.WindowObject(1, PTNVIEW_OFFSET_Y, SCRW, PTNVIEW_HEIGHT, ordersInput, drawOrdersContents, undefined, ()=>{})
|
||||||
const panelPatterns = new win.WindowObject(1, PTNVIEW_OFFSET_Y, SCRW, PTNVIEW_HEIGHT, patternsInput, drawPatternsContents, undefined, ()=>{})
|
const panelPatterns = new win.WindowObject(1, PTNVIEW_OFFSET_Y, SCRW, PTNVIEW_HEIGHT, patternsInput, drawPatternsContents, undefined, ()=>{})
|
||||||
const panels = [panelTimeline, panelOrders, panelPatterns]
|
|
||||||
|
// External sub-program panels: drawContents launches the sub-program synchronously.
|
||||||
|
// The sub-program draws rows 4+ and does NOT touch rows 1-3 (drawn by taut.js before launch).
|
||||||
|
// On exit, the sub-program sets _G.taut_nextPanel to request a tab switch.
|
||||||
|
function makeExternalPanelDraw(progName) {
|
||||||
|
return function(wo) {
|
||||||
|
// stop any playback first
|
||||||
|
stopPlayback()
|
||||||
|
// update the top bar
|
||||||
|
drawAlwaysOnElems()
|
||||||
|
|
||||||
|
_G.taut_nextPanel = undefined
|
||||||
|
_G.shell.execute(`${progName} ${fullPathObj.full} ${currentPanel}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawProjectContents(wo) {
|
||||||
|
fillLine(PTNVIEW_OFFSET_Y - 1, colVoiceHdr, 255)
|
||||||
|
for (let y = PTNVIEW_OFFSET_Y; y < SCRH; y++) fillLine(y, colBackPtn, 255)
|
||||||
|
con.move(PTNVIEW_OFFSET_Y + 2, 3)
|
||||||
|
con.color_pair(colStatus, 255)
|
||||||
|
print('[Project settings — not yet implemented]')
|
||||||
|
}
|
||||||
|
function externalPanelInput(wo, event) {}
|
||||||
|
|
||||||
|
const panelSamples = new win.WindowObject(1, PTNVIEW_OFFSET_Y, SCRW, PTNVIEW_HEIGHT, externalPanelInput, makeExternalPanelDraw('taut_sampleedit'), undefined, ()=>{})
|
||||||
|
const panelInstrmnt = new win.WindowObject(1, PTNVIEW_OFFSET_Y, SCRW, PTNVIEW_HEIGHT, externalPanelInput, makeExternalPanelDraw('taut_instredit'), undefined, ()=>{})
|
||||||
|
const panelProject = new win.WindowObject(1, PTNVIEW_OFFSET_Y, SCRW, PTNVIEW_HEIGHT, externalPanelInput, drawProjectContents, undefined, ()=>{})
|
||||||
|
const panelFile = new win.WindowObject(1, PTNVIEW_OFFSET_Y, SCRW, PTNVIEW_HEIGHT, externalPanelInput, makeExternalPanelDraw('taut_fileop'), undefined, ()=>{})
|
||||||
|
|
||||||
|
const panels = [panelTimeline, panelOrders, panelPatterns, panelSamples, panelInstrmnt, panelProject, panelFile]
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// PLAYBACK STATE
|
// PLAYBACK STATE
|
||||||
@@ -1925,6 +1995,11 @@ function updatePlayback() {
|
|||||||
clampCursor()
|
clampCursor()
|
||||||
if (currentPanel === VIEW_TIMELINE) redrawPanel()
|
if (currentPanel === VIEW_TIMELINE) redrawPanel()
|
||||||
else if (currentPanel === VIEW_PATTERN_DETAILS && song.numPats > 0) { simStateKey = ''; redrawPanel() }
|
else if (currentPanel === VIEW_PATTERN_DETAILS && song.numPats > 0) { simStateKey = ''; redrawPanel() }
|
||||||
|
else if (currentPanel === VIEW_CUES) {
|
||||||
|
if (cueIdx < ordersScroll) ordersScroll = cueIdx
|
||||||
|
if (cueIdx >= ordersScroll + PTNVIEW_HEIGHT) ordersScroll = Math.max(0, cueIdx - PTNVIEW_HEIGHT + 1)
|
||||||
|
drawOrdersContents()
|
||||||
|
}
|
||||||
} else if (previewActive || nowCue === cueIdx) {
|
} else if (previewActive || nowCue === cueIdx) {
|
||||||
const oldCursor = cursorRow
|
const oldCursor = cursorRow
|
||||||
const oldScroll = scrollRow
|
const oldScroll = scrollRow
|
||||||
@@ -2020,9 +2095,14 @@ const popupDrawFrame = (wo) => {
|
|||||||
// imprint title
|
// imprint title
|
||||||
let titleWidth = wo.title.length
|
let titleWidth = wo.title.length
|
||||||
con.move(wo.y, wo.x + (((wo.width - titleWidth - 2) & 254) >>> 1))
|
con.move(wo.y, wo.x + (((wo.width - titleWidth - 2) & 254) >>> 1))
|
||||||
let col = (wo.isHighlighted) ? 161 : 240
|
|
||||||
con.color_pair(col, colTabBarBack)
|
let colFore = colTabActive
|
||||||
print(` ${wo.title} `)
|
let colBack = colTabBarBack2
|
||||||
|
let colFore2 = colTabBarBack2
|
||||||
|
let colBack2 = colTabBarBack
|
||||||
|
con.color_pair(colFore2, colBack2); print(sym.leftshade)
|
||||||
|
con.color_pair(colFore, colBack); print(wo.title)
|
||||||
|
con.color_pair(colFore2, colBack2); print(sym.rightshade)
|
||||||
|
|
||||||
// fill content area
|
// fill content area
|
||||||
for (let r = 1; r < wo.height - 1; r++) {
|
for (let r = 1; r < wo.height - 1; r++) {
|
||||||
@@ -2063,7 +2143,7 @@ function applyGoto(num) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function openConfirmQuit() {
|
function openConfirmQuit() {
|
||||||
const pw = 24
|
const pw = 25
|
||||||
const ph = 5
|
const ph = 5
|
||||||
const px = ((SCRW - pw) / 2 | 0) + 1
|
const px = ((SCRW - pw) / 2 | 0) + 1
|
||||||
const py = ((SCRH - ph) / 2 | 0)
|
const py = ((SCRH - ph) / 2 | 0)
|
||||||
@@ -2077,7 +2157,7 @@ function openConfirmQuit() {
|
|||||||
|
|
||||||
con.move(py + 2, px + 2)
|
con.move(py + 2, px + 2)
|
||||||
con.color_pair(colStatus, colPopupBack)
|
con.color_pair(colStatus, colPopupBack)
|
||||||
print('Exit taut? ')
|
print('Exit Microtone? ')
|
||||||
con.color_pair(230, 240)
|
con.color_pair(230, 240)
|
||||||
print('[Y/N]')
|
print('[Y/N]')
|
||||||
|
|
||||||
@@ -2085,11 +2165,13 @@ function openConfirmQuit() {
|
|||||||
|
|
||||||
let result = false
|
let result = false
|
||||||
let done = false
|
let done = false
|
||||||
|
let eventJustReceived = true
|
||||||
while (!done) {
|
while (!done) {
|
||||||
input.withEvent(ev => {
|
input.withEvent(ev => {
|
||||||
if (ev[0] !== 'key_down') return
|
if (ev[0] !== 'key_down') return
|
||||||
if (1 !== ev[2]) return
|
if (1 !== ev[2]) return
|
||||||
const ks = ev[1]
|
const ks = ev[1]
|
||||||
|
|
||||||
if (ks === 'y' || ks === 'Y' || ks === '\n') { result = true; done = true }
|
if (ks === 'y' || ks === 'Y' || ks === '\n') { result = true; done = true }
|
||||||
else if (ks === 'n' || ks === 'N' || ks === '<ESC>') { done = true }
|
else if (ks === 'n' || ks === 'N' || ks === '<ESC>') { done = true }
|
||||||
})
|
})
|
||||||
@@ -2121,12 +2203,12 @@ function openGotoPopup() {
|
|||||||
const ks = ev[1]
|
const ks = ev[1]
|
||||||
if (1 !== ev[2]) return // not key just hit
|
if (1 !== ev[2]) return // not key just hit
|
||||||
|
|
||||||
if (eventJustReceived) { // filter Shift-G input
|
if (eventJustReceived) { // filter lingering input
|
||||||
eventJustReceived = false
|
eventJustReceived = false
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ks === '<ESC>') {
|
if (ks === '<ESC>' || ks === 'x') {
|
||||||
done = true
|
done = true
|
||||||
} else if (ks === '\n') {
|
} else if (ks === '\n') {
|
||||||
if (buf.length > 0) applyGoto(parseInt(buf, 16))
|
if (buf.length > 0) applyGoto(parseInt(buf, 16))
|
||||||
@@ -2152,7 +2234,17 @@ taud.uploadTaudFile(fullPathObj.full, 0, PLAYHEAD)
|
|||||||
audio.setMasterVolume(PLAYHEAD, 255)
|
audio.setMasterVolume(PLAYHEAD, 255)
|
||||||
audio.setMasterPan(PLAYHEAD, 128)
|
audio.setMasterPan(PLAYHEAD, 128)
|
||||||
|
|
||||||
|
function isExternalPanel(p) {
|
||||||
|
return p === VIEW_SAMPLES || p === VIEW_INSTRMNT || p === VIEW_FILE
|
||||||
|
}
|
||||||
|
|
||||||
|
// Launching a sub-program from inside an input.withEvent callback causes the triggering
|
||||||
|
// Tab event to leak into the sub-program's own withEvent call (the event hasn't been
|
||||||
|
// consumed yet when the callback is still executing). We avoid this by deferring the
|
||||||
|
// actual shell.execute until after withEvent returns.
|
||||||
let exitFlag = false
|
let exitFlag = false
|
||||||
|
let pendingExternalDraw = false
|
||||||
|
|
||||||
while (!exitFlag) {
|
while (!exitFlag) {
|
||||||
input.withEvent(event => {
|
input.withEvent(event => {
|
||||||
if (event[0] !== "key_down") return
|
if (event[0] !== "key_down") return
|
||||||
@@ -2166,28 +2258,18 @@ while (!exitFlag) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (keyJustHit && keysym === "<TAB>") {
|
if (keyJustHit && keysym === "<TAB>") {
|
||||||
const prevPanel = currentPanel
|
|
||||||
currentPanel = (currentPanel + (shiftDown ? -1 : 1))
|
currentPanel = (currentPanel + (shiftDown ? -1 : 1))
|
||||||
if (currentPanel < 0) currentPanel += panels.length
|
if (currentPanel < 0) currentPanel += panels.length
|
||||||
currentPanel = currentPanel % panels.length
|
currentPanel = currentPanel % panels.length
|
||||||
|
applyMuteTransition(currentPanel)
|
||||||
if (currentPanel === VIEW_PATTERN_DETAILS) {
|
if (isExternalPanel(currentPanel)) {
|
||||||
// Entering Patterns: save mute state and ensure voice 0 (preview voice) is audible
|
// Redraw header now so the tab highlight is visible immediately,
|
||||||
timelineMuteSnapshot = voiceMutes.slice()
|
// but defer the actual sub-program launch to after withEvent returns.
|
||||||
if (voiceMutes[0]) {
|
con.clear(); drawAlwaysOnElems(); drawControlHint()
|
||||||
voiceMutes[0] = false
|
pendingExternalDraw = true
|
||||||
audio.setVoiceMute(PLAYHEAD, 0, false)
|
} else {
|
||||||
}
|
drawAll()
|
||||||
} else if (currentPanel === VIEW_TIMELINE && timelineMuteSnapshot !== null) {
|
|
||||||
// Returning to Timeline: restore saved mute state
|
|
||||||
for (let i = 0; i < song.numVoices; i++) {
|
|
||||||
voiceMutes[i] = timelineMuteSnapshot[i]
|
|
||||||
audio.setVoiceMute(PLAYHEAD, i, voiceMutes[i])
|
|
||||||
}
|
|
||||||
timelineMuteSnapshot = null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
drawAll()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2199,6 +2281,24 @@ while (!exitFlag) {
|
|||||||
panels[currentPanel].processInput(event)
|
panels[currentPanel].processInput(event)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Launch external sub-program OUTSIDE the withEvent callback so the triggering
|
||||||
|
// Tab event is fully consumed before the sub-program's event loop begins.
|
||||||
|
if (pendingExternalDraw) {
|
||||||
|
pendingExternalDraw = false
|
||||||
|
redrawPanel()
|
||||||
|
while (_G.taut_nextPanel !== undefined && _G.taut_nextPanel !== null) {
|
||||||
|
currentPanel = _G.taut_nextPanel
|
||||||
|
_G.taut_nextPanel = undefined
|
||||||
|
applyMuteTransition(currentPanel)
|
||||||
|
if (isExternalPanel(currentPanel)) {
|
||||||
|
con.clear(); drawAlwaysOnElems(); drawControlHint()
|
||||||
|
redrawPanel()
|
||||||
|
} else {
|
||||||
|
drawAll()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (playbackMode !== PLAYMODE_NONE) updatePlayback()
|
if (playbackMode !== PLAYMODE_NONE) updatePlayback()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2207,6 +2307,7 @@ resetAudioDevice()
|
|||||||
sys.free(SCRATCH_PTR)
|
sys.free(SCRATCH_PTR)
|
||||||
font.resetLowRom()
|
font.resetLowRom()
|
||||||
font.resetHighRom()
|
font.resetHighRom()
|
||||||
|
graphics.clearPixels(255)
|
||||||
con.clear()
|
con.clear()
|
||||||
con.move(1, 1)
|
con.move(1, 1)
|
||||||
con.curs_set(1)
|
con.curs_set(1)
|
||||||
|
|||||||
@@ -1 +1,77 @@
|
|||||||
// filesystem navigator for Taut
|
/**
|
||||||
|
* TAUT File Operations
|
||||||
|
* Sub-program launched by taut.js when the File tab is active.
|
||||||
|
* Rows 1-3 are owned by the parent; this program draws rows 4+.
|
||||||
|
*
|
||||||
|
* exec_args[1] = path to .taud file
|
||||||
|
* Sets _G.taut_nextPanel before returning to request a panel switch.
|
||||||
|
*
|
||||||
|
* Created by minjaesong on 2026-04-27
|
||||||
|
*/
|
||||||
|
|
||||||
|
const win = require("wintex")
|
||||||
|
|
||||||
|
const PANEL_COUNT = 7
|
||||||
|
const MY_PANEL = 6 // VIEW_FILE
|
||||||
|
|
||||||
|
const [SCRH, SCRW] = con.getmaxyx()
|
||||||
|
const PANEL_Y = 4
|
||||||
|
const PANEL_H = SCRH - PANEL_Y
|
||||||
|
|
||||||
|
const colStatus = 253
|
||||||
|
const colContent = 240
|
||||||
|
const colHdr = 230
|
||||||
|
|
||||||
|
function drawFileOpContents(wo) {
|
||||||
|
for (let y = PANEL_Y; y < SCRH; y++) {
|
||||||
|
con.move(y, 1)
|
||||||
|
con.color_pair(colContent, 255)
|
||||||
|
print(' '.repeat(SCRW))
|
||||||
|
}
|
||||||
|
con.move(PANEL_Y + 1, 3)
|
||||||
|
con.color_pair(colHdr, 255)
|
||||||
|
print('[ File ]')
|
||||||
|
con.move(PANEL_Y + 3, 3)
|
||||||
|
con.color_pair(colStatus, 255)
|
||||||
|
print('placeholder — not yet implemented')
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawHints() {
|
||||||
|
con.move(SCRH, 1)
|
||||||
|
con.color_pair(colStatus, 255)
|
||||||
|
print(' '.repeat(SCRW - 1))
|
||||||
|
con.move(SCRH, 1)
|
||||||
|
con.color_pair(colHdr, 255); print('Tab ')
|
||||||
|
con.color_pair(colStatus, 255); print('Panel')
|
||||||
|
}
|
||||||
|
|
||||||
|
function fileOpInput(wo, event) {
|
||||||
|
// placeholder — no interaction yet
|
||||||
|
}
|
||||||
|
|
||||||
|
const panel = new win.WindowObject(1, PANEL_Y, SCRW, PANEL_H, fileOpInput, drawFileOpContents, undefined, ()=>{})
|
||||||
|
|
||||||
|
panel.drawContents()
|
||||||
|
drawHints()
|
||||||
|
|
||||||
|
let done = false
|
||||||
|
while (!done) {
|
||||||
|
input.withEvent(event => {
|
||||||
|
if (event[0] !== 'key_down') return
|
||||||
|
const keysym = event[1]
|
||||||
|
const keyJustHit = (1 == event[2])
|
||||||
|
const shiftDown = (event.includes(59) || event.includes(60))
|
||||||
|
|
||||||
|
if (!keyJustHit) return
|
||||||
|
|
||||||
|
if (keysym === '<TAB>') {
|
||||||
|
_G.taut_nextPanel = (MY_PANEL + (shiftDown ? -1 : 1) + PANEL_COUNT) % PANEL_COUNT
|
||||||
|
done = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
panel.processInput(event)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|||||||
@@ -0,0 +1,77 @@
|
|||||||
|
/**
|
||||||
|
* TAUT Instrument Editor
|
||||||
|
* Sub-program launched by taut.js when the Instrmnt tab is active.
|
||||||
|
* Rows 1-3 are owned by the parent; this program draws rows 4+.
|
||||||
|
*
|
||||||
|
* exec_args[1] = path to .taud file
|
||||||
|
* Sets _G.taut_nextPanel before returning to request a panel switch.
|
||||||
|
*
|
||||||
|
* Created by minjaesong on 2026-04-27
|
||||||
|
*/
|
||||||
|
|
||||||
|
const win = require("wintex")
|
||||||
|
|
||||||
|
const PANEL_COUNT = 7
|
||||||
|
const MY_PANEL = 4 // VIEW_INSTRMNT
|
||||||
|
|
||||||
|
const [SCRH, SCRW] = con.getmaxyx()
|
||||||
|
const PANEL_Y = 4
|
||||||
|
const PANEL_H = SCRH - PANEL_Y
|
||||||
|
|
||||||
|
const colStatus = 253
|
||||||
|
const colContent = 240
|
||||||
|
const colHdr = 230
|
||||||
|
|
||||||
|
function drawInstEditContents(wo) {
|
||||||
|
for (let y = PANEL_Y; y < SCRH; y++) {
|
||||||
|
con.move(y, 1)
|
||||||
|
con.color_pair(colContent, 255)
|
||||||
|
print(' '.repeat(SCRW))
|
||||||
|
}
|
||||||
|
con.move(PANEL_Y + 1, 3)
|
||||||
|
con.color_pair(colHdr, 255)
|
||||||
|
print('[ Instrument Editor ]')
|
||||||
|
con.move(PANEL_Y + 3, 3)
|
||||||
|
con.color_pair(colStatus, 255)
|
||||||
|
print('placeholder — not yet implemented')
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawHints() {
|
||||||
|
con.move(SCRH, 1)
|
||||||
|
con.color_pair(colStatus, 255)
|
||||||
|
print(' '.repeat(SCRW - 1))
|
||||||
|
con.move(SCRH, 1)
|
||||||
|
con.color_pair(colHdr, 255); print('Tab ')
|
||||||
|
con.color_pair(colStatus, 255); print('Panel')
|
||||||
|
}
|
||||||
|
|
||||||
|
function instEditInput(wo, event) {
|
||||||
|
// placeholder — no interaction yet
|
||||||
|
}
|
||||||
|
|
||||||
|
const panel = new win.WindowObject(1, PANEL_Y, SCRW, PANEL_H, instEditInput, drawInstEditContents, undefined, ()=>{})
|
||||||
|
|
||||||
|
panel.drawContents()
|
||||||
|
drawHints()
|
||||||
|
|
||||||
|
let done = false
|
||||||
|
while (!done) {
|
||||||
|
input.withEvent(event => {
|
||||||
|
if (event[0] !== 'key_down') return
|
||||||
|
const keysym = event[1]
|
||||||
|
const keyJustHit = (1 == event[2])
|
||||||
|
const shiftDown = (event.includes(59) || event.includes(60))
|
||||||
|
|
||||||
|
if (!keyJustHit) return
|
||||||
|
|
||||||
|
if (keysym === '<TAB>') {
|
||||||
|
_G.taut_nextPanel = (MY_PANEL + (shiftDown ? -1 : 1) + PANEL_COUNT) % PANEL_COUNT
|
||||||
|
done = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
panel.processInput(event)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|||||||
@@ -0,0 +1,77 @@
|
|||||||
|
/**
|
||||||
|
* TAUT Sample Editor
|
||||||
|
* Sub-program launched by taut.js when the Samples tab is active.
|
||||||
|
* Rows 1-3 are owned by the parent; this program draws rows 4+.
|
||||||
|
*
|
||||||
|
* exec_args[1] = path to .taud file
|
||||||
|
* Sets _G.taut_nextPanel before returning to request a panel switch.
|
||||||
|
*
|
||||||
|
* Created by minjaesong on 2026-04-27
|
||||||
|
*/
|
||||||
|
|
||||||
|
const win = require("wintex")
|
||||||
|
|
||||||
|
const PANEL_COUNT = 7
|
||||||
|
const MY_PANEL = 3 // VIEW_SAMPLES
|
||||||
|
|
||||||
|
const [SCRH, SCRW] = con.getmaxyx()
|
||||||
|
const PANEL_Y = 4
|
||||||
|
const PANEL_H = SCRH - PANEL_Y
|
||||||
|
|
||||||
|
const colStatus = 253
|
||||||
|
const colContent = 240
|
||||||
|
const colHdr = 230
|
||||||
|
|
||||||
|
function drawSampleEditContents(wo) {
|
||||||
|
for (let y = PANEL_Y; y < SCRH; y++) {
|
||||||
|
con.move(y, 1)
|
||||||
|
con.color_pair(colContent, 255)
|
||||||
|
print(' '.repeat(SCRW))
|
||||||
|
}
|
||||||
|
con.move(PANEL_Y + 1, 3)
|
||||||
|
con.color_pair(colHdr, 255)
|
||||||
|
print('[ Sample Editor ]')
|
||||||
|
con.move(PANEL_Y + 3, 3)
|
||||||
|
con.color_pair(colStatus, 255)
|
||||||
|
print('placeholder — not yet implemented')
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawHints() {
|
||||||
|
con.move(SCRH, 1)
|
||||||
|
con.color_pair(colStatus, 255)
|
||||||
|
print(' '.repeat(SCRW - 1))
|
||||||
|
con.move(SCRH, 1)
|
||||||
|
con.color_pair(colHdr, 255); print('Tab ')
|
||||||
|
con.color_pair(colStatus, 255); print('Panel')
|
||||||
|
}
|
||||||
|
|
||||||
|
function sampleEditInput(wo, event) {
|
||||||
|
// placeholder — no interaction yet
|
||||||
|
}
|
||||||
|
|
||||||
|
const panel = new win.WindowObject(1, PANEL_Y, SCRW, PANEL_H, sampleEditInput, drawSampleEditContents, undefined, ()=>{})
|
||||||
|
|
||||||
|
panel.drawContents()
|
||||||
|
drawHints()
|
||||||
|
|
||||||
|
let done = false
|
||||||
|
while (!done) {
|
||||||
|
input.withEvent(event => {
|
||||||
|
if (event[0] !== 'key_down') return
|
||||||
|
const keysym = event[1]
|
||||||
|
const keyJustHit = (1 == event[2])
|
||||||
|
const shiftDown = (event.includes(59) || event.includes(60))
|
||||||
|
|
||||||
|
if (!keyJustHit) return
|
||||||
|
|
||||||
|
if (keysym === '<TAB>') {
|
||||||
|
_G.taut_nextPanel = (MY_PANEL + (shiftDown ? -1 : 1) + PANEL_COUNT) % PANEL_COUNT
|
||||||
|
done = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
panel.processInput(event)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
BIN
assets/disk0/tvdos/bin/tauthdr.png
Normal file
BIN
assets/disk0/tvdos/bin/tauthdr.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 353 B |
1
assets/disk0/tvdos/bin/tauthdr.r8
Normal file
1
assets/disk0/tvdos/bin/tauthdr.r8
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷嗷嗷<EFBFBD><EFBFBD>嗷嗷嗷<EFBFBD><EFBFBD><EFBFBD>嗷嗷嗷嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷嗷嗷嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD>嗷嗷<EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD>嗷嗷<EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD>嗷嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷嗷嗷<EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷嗷嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷嗷<EFBFBD><EFBFBD><EFBFBD>嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗷嗷嗷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
@@ -45,7 +45,7 @@ exports.SpriteSheet = function(tilew, tileh, tex) {
|
|||||||
return ty;
|
return ty;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
exports.drawTexPattern = function(texture, x, y, width, height, framebuffer, fgcol, bgcol) {
|
exports.drawTexPattern = function(texture, x, y, width = texture.width, height = texture.height, framebuffer = false, fgcol, bgcol) {
|
||||||
if (!(texture instanceof exports.Texture) && !(texture instanceof exports.MonoTex)) throw Error("Texture is not a GL Texture types");
|
if (!(texture instanceof exports.Texture) && !(texture instanceof exports.MonoTex)) throw Error("Texture is not a GL Texture types");
|
||||||
|
|
||||||
let paint = (!framebuffer) ? graphics.plotPixel : graphics.plotPixel2
|
let paint = (!framebuffer) ? graphics.plotPixel : graphics.plotPixel2
|
||||||
|
|||||||
Reference in New Issue
Block a user