tag:blogger.com,1999:blog-38266136072109489222024-03-17T20:02:32.583-07:00Better EconomicsA censored website accused of political incorrectnessMatt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.comBlogger27639125tag:blogger.com,1999:blog-3826613607210948922.post-55461810029716692292023-11-12T20:30:00.000-08:002023-12-21T09:21:41.729-08:00Ham Radio Assembly Language for Browsers<div><!-- HAL --></div><div><!DOCTYPE html></div><div><html></div><div><!-- Hi I am a comment --></div><div> <style ></div><div>body {background-color: gray;}</div><div> td { overflow='clip';}</div><div> textarea</div><div> {background-color: green; color: white; font-size: 25px; padding = 10px}</div><div> canvas {background-color=navy;}</div><div> th { color:black}</div><div> select { color:black;background-color : lime}</div><div> table {color: blue; text-align: center; border : 2px;}</div><div> button {background-color : red }</div><div> h1 {background-color : green; font-size : 24px; }</div><div> ul {background-color : blue; color : white; border : 4px ; text-align : center}</div><div> caption {background-color : yellow;font-size:20px;}</div><div> p {background-color : yellow; color: black;font-size: 15px;</div><div> text-align: center; vertical-align : top; width " 70"; hidden=true}</div><div></style></div><div> <h1 align='center'>HAL</h1></div><div> <form id = 'dummy' ></div><div> <button onclick ='ok()'>OK</button></div><div><button onclick ='cancel()'>Cancel</button></div><div><textarea cols=50 rows = 3 font-size = 14px>Javascript libraries use this part of the screen for user input. The dialog docking area. Operators hide this window as desired.</textarea></div><div><br /></div><div><br /></div><div></form></div><div> <div align = left></div><div><div></div><div> <table ></div><div> <caption>Simple Menu System V1.77</caption></div><div> <tbody ></div><div> <tr></div><div> <td></div><div> <textarea id = 'selectedItem' cols=10 rows=1>Top</textarea></div><div> </td></div><div> <td></div><div> <button id ='menuNext' >Next</button></div><div> <button id ='menuDown' >Down</button></div><div> <button id ='menuUp' >Up</button></div><div> </td></div><div> <td width=200></td></div><div><br /></div><div></tr></div><div></tbody></div><div></table></div><div></div></div><div><br /></div><div></div></div><div><br></div><div><table id = 'Display1' align = left></div><div> <caption>Incoming Connection Reports</caption></div><div> <tbody class = 'Display' id = 'Displays' ></div><div> <tr></div><div> <td ><textarea class = 'Display' cols=15 id = "D1"> Frequ 10</textarea></td></div><div> <td><textarea class = 'Display' cols=15 id = "D2"> Power 10</textarea></div><div> </td></div><div><br /></div><div> </div><div> </tr></div><div> <tr></div><div> <td id = 'connectTop'></div><div> <button name = 'B11' > B11</button><button name = 'B12' > B12</button><button name = 'B13'> B13</button> <button name = 'B14'> B14</button></div><div> </td></div><div> <td id = 'connectBottom'></div><div> <button name = 'B21' > B21</button><button name = 'B22' > B22</button><button name = 'B23' > B23</button><button name = 'B24'>B24</button></div><div> </td></div><div> </div><div> </tr></div><div> </tbody></div><div><br /></div><div> </table></div><div><br /></div><div><div ></div><div><br /></div><div><table ></div><div> <colgroup></div><div> <col valign=top/></div><div> <col valign=top/></div><div> </colgroup></div><div> <caption>Ham Assembly Language</caption></div><div> <tbody ></div><div> <tr></div><div> <th id= 'contexts'></div><div> <select name= "textMethods" onchange = "actionText(this)"></div><div> <option onclick = 'saveText()'>Save</option></div><div> <option onclick = 'closeText()'>Close</option></div><div> <option onclick = 'openText()'>Open</option></div><div> <option onclick = 'createText()'>Create</option></div><div> </select></div><div> </th></div><div> <th>Log</th></div><div> <th id = 'sources' contenteditable=true>Sources</th></div><div> </tr></div><div> <tr id = 'textareas' valign=top></div><div> <td></div><div> <ul class = 'visible' id = 'macroList'></ul></div><div> </td></div><div> <td></div><div> <textarea class = 'visible' id = 'logger' cols="35" rows="25" border = 2 >Logger </textarea></div><div> </td></div><div> <td id = "textanchor"></td></div><div> <td></div><div><br /></div><div> </td></div><div> </div><div> </tr></div><div> </tbody></div><div> </table></div><div><br /></div><div> </div></div><div><br /></div><div> <ul class = 'top' id = 'simpleMenu' hidden></div><div> <ul class = 'Debugger'></div><div> <li class = 'debug' onclick = 'DebugStep(INIT)'>Init</li></div><div> <li class = 'debug' onclick = 'DebugStep(TOKEN)'>Token</li></div><div> <li class = 'debug' onclick = 'DebugStep(LINE)'>Line</li></div><div> </ul></div><div> <ul class= "usb"></div><div> <li class = "method" onclick ="USBConnect(current)">Connect</li></div><div> <li class = "method" onclick = "openport()">open</li></div><div> <li class = "method" onclick ="getports()">Ports</li></div><div> <li class = "method" onclick ="getport()">Port</li></div><div> <li class = "method" onclick ="readport()">Read</li></div><div> <li class = "method" onclick ="writeport()">Write</li></div><div> <li class = "method" onclick ="closeport()">Close</li></div><div> <li class = "method" onclick ="infoport()">Info</li></div><div> <li class = "method" onclick ="freeport()">Free</li></div><div> </ul></div><div> <li class = 'Exec' onclick ="ExecSource(current);">RUN</li></div><div> </div><div> <ul class = 'Assembler'></div><div> <li class = 'list' onclick ="listLibrary()">Library</li></div><div> <li class = 'list' onclick ="listOpcodes()">Opcodes</li></div><div> <li class = 'list' onclick ="listSysOps();">Sysops</li></div><div> <li class = 'list' onclick ="listSymbols();">Symbols</li></div><div> </ul></div><div><br /></div><div><br /></div><div> </ul></div><div><br /></div><div><div id = 'startcode'></div><div><br /></div><div><br /></div><div>#log nice start;</div><div> add r0 hope;</div><div>#log end;</div><div>hope sub r0 r2;</div><div>#log done it;</div><div></div></div><div><br /></div><div> <script></div><div>//tokens</div><div>// tokens can have various types</div><div>// with precedances</div><div>// / scoping rules</div><div>const NEWLINE = 32;</div><div>const LITERAL = 20;</div><div>const VAL = 19; const NUM = 18; const REG = 17;</div><div>const MUL = 16; const DIV = 15;</div><div>const ADD = 14; const SUB = 13;</div><div>const LP = 12; const RP = 11;</div><div>const COMMA = 10;</div><div>const MACRO = 9;</div><div>const OP = 8; const SEMI = 7;</div><div>const ALPHA = 6;</div><div>const SYSOP = 5</div><div>const DISCARD = 4;</div><div>const QUOTE = 3;</div><div><br /></div><div>// return status</div><div>const OK = 101; const DONE =102; // normal or source done</div><div>const WAIT = 103; const ERROR = -3; // forward reference or syntax error</div><div><br /></div><div>// symbol classes</div><div>const USER = 40; const HAL = 41; const CONST = 42;</div><div>const EMBED = 43; const MODULE = 44; const LIB = 45;</div><div>// step indicators</div><div>const TEST = 56; const INIT = 55; const INDEX = 54;</div><div>const LINE = 53; const TOKEN = 52; const OFF = 51;</div><div><br /></div><div>// symbol,states</div><div>const NULL = -1; const UNDEF = -2;</div><div>const DEF = 202; const PREDEF = 203;</div><div>const LOG = document.getElementById('logger');</div><div></script></div><div><script id='halinone'></div><div> </div><div> //bigtable</div><div><br /></div><div>// const USER,OP,SYSOP,EMBED,MODULE,LIB / scoping rules</div><div>// All symbols in one table, sysops, opodes, user symbols</div><div>const Symbol = {str : "",expr : 0,type : 0,value : 0,handle : null}</div><div>var symtable = [</div><div> {str : 'R0',expr : RegExp(/R0/,'i'),type : USER, value : 0,handle : 0},</div><div> {str : 'R1',expr : RegExp(/R1/,'i'),type : USER, value : 1,handle : null},</div><div> {str : 'R2',expr : RegExp(/R2/,'i'),type : USER, value : 2,handle : null},</div><div> {str : 'R3',expr : RegExp(/R3/,'i'),type : USER, value : 3,handle : null},</div><div> {str : 'define', expr : RegExp(/define/), type : SYSOP, value : 0,handle : function(){return define()}},</div><div> {str : 'assign', expr : RegExp(/assign/), type : SYSOP,value : 0,handle : function(){return assign() }},</div><div> {str : 'include', expr : RegExp(/include/),type : SYSOP,value : 0,handle : function(){return include()}},</div><div> {str : 'end', expr : RegExp(/end/), type : SYSOP,value : 0,handle : function(){return OK}},</div><div> {str : 'log', expr : RegExp(/log/), type : SYSOP,value : 0,handle : function(){return log()}},</div><div> {str : 'ifdef', expr : RegExp(/ifdef/), type : SYSOP,value : 0,handle : function(){return OK }},</div><div> {str : 'else', expr : RegExp(/else/) , type : SYSOP,value : 0,handle :</div><div> function(){return OK }},</div><div> {str : 'seg', expr : RegExp(/seg/) , type : SYSOP,value : 0,handle :</div><div> function(){return OK }},</div><div> {str : 'add', expr : RegExp(/add/), type : OP, value : 0,handle : null},</div><div> {str : 'sub', expr : RegExp(/sub/), type : OP, value : 0,handle : null},</div><div> {str : 'mul' ,expr : RegExp(/mul/), type : OP, value : 0,handle : null},</div><div> {str : 'div' ,expr : RegExp(/div/), type : OP, value : 0,handle : null},</div><div> {str : 'shft',expr : RegExp(/shft/),type : OP, value : 0,handle : null},</div><div> {str : 'and', expr : RegExp(/and/), type : OP, value : 0,handle : null},</div><div> {str : 'or' ,expr : RegExp(/or/), type : OP, value : 0,handle : null},</div><div> {str : 'xor' ,expr : RegExp(/xor/), type : OP, value : 0,handle : null},</div><div> {str : 'addi',expr : RegExp(/addi/),type : OP, value : 0,handle : null},</div><div> {str : 'subi',expr : RegExp(/subi/),type : OP, value : 0,handle : null},</div><div> {str : 'ori', expr : RegExp(/ori/), type : OP, value : 0,handle : null},</div><div> {str : 'xori',expr : RegExp(/xori/),type : OP, value : 0,handle : null},</div><div> {str : 'clr' ,expr : RegExp(/clr/), type : OP, value : 0,handle : null},</div><div> {str : 'comp',expr : RegExp(/comp/),type : OP, value : 0,handle : null},</div><div> {str : 'jmp' ,expr : RegExp(/jmp/), type : OP, value : 0,handle : null},</div><div> {str : 'call',expr : RegExp(/call/),type : OP, value : 0,handle : null},</div><div> {str : 'bre' ,expr : RegExp(/br/) , type : OP, value : 0,handle : null},</div><div> {str : 'brn' ,expr : RegExp(/brn/), type : OP, value : 0,handle : null},</div><div> {str : 'br' ,expr : RegExp(/brp/), type : OP, value : 0,handle : null},</div><div> {str : 'ret' ,expr : RegExp(/ret/), type : OP, value : 0,handle : null},</div><div> {str : 'btst',expr : RegExp(/btst/),type : OP, value : 0,handle : null},</div><div> {str : 'bset',expr : RegExp(/bset/),type : OP, value : 0,handle : null},</div><div> {str : 'ld' ,expr : RegExp(/ld/), type : OP, value : 0,handle : null},</div><div> {str : 'ldm' ,expr : RegExp(/stm/), type : OP, value : 0,handle : null},</div><div> {str : 'ldw' ,expr : RegExp(/ldw/), type : OP, value : 0,handle : null},</div><div> {str : 'st' ,expr : RegExp(/st/), type : OP, value : 0,handle : null},</div><div> {str : 'stm' ,expr : RegExp(/stm/), type : OP, value : 0,handle : null},</div><div> {str : 'stw' ,expr : RegExp(/stw/), type : OP, value : 0,handle : null}</div><div> ]</div><div> var symLength = symtable.length;</div><div><br /></div><div> function listSymbols(type) {</div><div> clearLog();</div><div> strLog('\n Symbols ');</div><div> for(let i=0; i < symtable.length;i++)</div><div> if(symtable[i] = type)</div><div> strLog('\n: ' + i +' ' + symtable[i].str + ' '+symtable[i].expr +' '+symtable[i].value );</div><div> }</div><div><br /></div><div>function symValue(index) {</div><div> if(index == false) index =0;</div><div> if((index< 0) || (index > symtable.length)) return syntaxError('Bad index');</div><div> return symtable[index].value;</div><div>}</div><div><br /></div><div>function addSym(name,type,value) {</div><div> var index = findSym(name)</div><div> if(index > -1) {</div><div> symtable[index].expr = RegExp(name);</div><div> symtable[inde].type = type</div><div> symtable[index].value = value;</div><div> }</div><div> else{</div><div> var sym = Object(Symbol);</div><div> sym.str =name;</div><div> sym.expr = RegExp(name)</div><div> sym.type = type;</div><div> sym.value = value;</div><div> symtable.push(sym);</div><div> }</div><div> return OK;</div><div>}</div><div>function findSym(name) {</div><div> len = name.length;</div><div> for(let i =0; i < symtable.length;i++) {</div><div> if(len == symtable[i].str.length)</div><div> if(symtable[i].expr.test(name)) {</div><div> return i;</div><div> }</div><div> }</div><div> return UNDEF;</div><div>}</div><div>// Drop entries from user symbols</div><div> function delSym() {</div><div> do {</div><div> if(nextToken() < 0) return syntaxError('No token')</div><div> if(index = findSym(cc.slice) < 0)</div><div> break;</div><div> var type = cc.type;</div><div> if(type == SEMI) break;</div><div> symtable.splice(index,1);</div><div> } while(type != SEMI);</div><div> return endOfLine();</div><div>}</div><div><br /></div><div><br /></div><div> // assembler found a symbol</div><div> // a finite string of alpha numerics</div><div> // that begins with an alpha</div><div>function symbol(opContext) {</div><div> var index;</div><div> if(arguments.length == 0) {// symbol defined</div><div> console.log('New symbol');</div><div> index=newSym(cc.slice(),cc.line())</div><div> symtable[index].state = DEF;</div><div> symtable[index].value = cc.line();</div><div> return waitService(i);</div><div> } else { // this maybe a wait</div><div> if( (index = findSym(cc.slice())) < 0){</div><div> opContext.index =newSym(cc.slice());</div><div> return waitRequest(opContext); // opcode context pushed onto wait stack</div><div> } else {</div><div> if(symtable[index].state == UNDEF) {</div><div> opContext.index = index;</div><div> return waitRequest(opContext); // opcode context pushed onto wait stace</div><div> } else {</div><div> cc.setIndex(symtable[index].value)</div><div> cc.setType(VAL); //resolved</div><div> return OK</div><div> }</div><div> }</div><div> }</div><div>}</div><div>// text</div><div> function clearLog() {</div><div> LOG.textContent = ' ';</div><div>}</div><div>// send string to log</div><div>function strLog(str){</div><div> LOG.textContent+= str;</div><div> }</div><div> // send string to log</div><div>function strPrependLog(str){</div><div> LOG.textContent = str + LOG.textContent;</div><div> }</div><div>function srcCharByIndex(node,index) {</div><div> var ch = node.textContent.charAt(index);</div><div> return ch</div><div>}</div><div> function tokenText(str) {</div><div> var s= String();</div><div> s = '|'+cc.slice()+'|';</div><div> //s.replace(/\n/,'X')</div><div> if(arguments > 1) s += str;</div><div> strPrependLog(</div><div> '\nTok ' + s + ' ' + ' t: ' + cc.type()+' s: '+cc.start()+ ' e: ' + cc.end()+'\n' );</div><div>}</div><div><br /></div><div>// generic find a name among</div><div>// a list of html children</div><div>function findItemByName(items,name) {</div><div> for(i=0;i < items.length;i++)</div><div> if(items[i].name == name)</div><div> return items[i];</div><div> return null;</div><div>}</div><div>function findText(name) {</div><div> items = document.getElementById('textanchor').children;</div><div> return findItemByName(items,name);</div><div>}</div><div><br /></div><div>function findListItem(name) {</div><div> items = document.getElementsByClassName('openmacro');</div><div> return findItemByName(items,name);</div><div>}</div><div>// when the user clicks on a macro list item</div><div>function setListEvent(node) {</div><div> node.addEventListener('click', () => {</div><div> showText(node.name);</div><div> blinkListItems(node.name);</div><div> //console.log('Set up ' +node.name)</div><div> });</div><div>}</div><div>function newListItem(name) {</div><div> var list = document.createElement('li')</div><div> list.name = name;</div><div> list.className = 'openmacro'</div><div> list.textContent = name</div><div> //console.log('NewItem '+ name);</div><div> setListEvent(list);</div><div> document.getElementById('macroList').appendChild(list);</div><div> showText(name);</div><div> }</div><div>function delListItem(name) {</div><div> parent = document.getElementById('macroList');</div><div> node = findName(name,parent.children);</div><div> parents.removeChild(node);</div><div>}</div><div>////////////// Methods to manage textareas////////////////</div><div>function listTexts() {</div><div> var items = document.getElementById('textanchor').children;</div><div> for(let i =0; i < items.length;i++) {</div><div> strLog(': '+ items[i].name);</div><div> }</div><div>}</div><div>function saveText() {</div><div> strPrependLog('Save\n');</div><div> var nameNode = document.getElementById('sources');</div><div> var textNode = findTextByName(nameNode.textContent);</div><div> if(textNode.hidden == false) {// The macro in focus</div><div> localStorage.setItem(nameNode.name,textNode.textContent);</div><div> nameSelector();</div><div> }</div><div> return;</div><div>}</div><div>// th element as editable input</div><div>function newText(name) {</div><div> strPrependLog('New\n');</div><div> if(name == null)</div><div> name = document.findElementByID('sources').textContent;</div><div> addText(name);</div><div>}</div><div>function openText(name) {</div><div> strPrependLog('Open\n');</div><div>}</div><div>function closeText() { strPrependLog('Close\n');</div><div> parent = document.getElementById('macroList');</div><div> name = document.getElementById('sources').textContent;</div><div> node = nodeFindByName(parent.chldren,name);</div><div> parent.removeChild(node);</div><div> parent = documemt.getElementById('textanchor');</div><div> node = nodeFindByName(parent.chldren,name);</div><div> parent.removeChild(node);</div><div>}</div><div>function showText(name) {</div><div> items = document.getElementById('textanchor').children;</div><div> for(i=0;i < items.length;i++) {</div><div> if(items[i].name == name)</div><div> items[i].hidden=false;</div><div> else</div><div> items[i].hidden=true;</div><div> document.getElementById('sources').textContent = name;</div><div> }</div><div>}</div><div>function createText(name) {</div><div> var td = document.getElementById('textanchor');</div><div> var text = document.createElement('textarea');</div><div> text.hidden = false;</div><div> text.cols =30</div><div> text.rows = 15</div><div> if(name == null)</div><div> text.name = document.getElementById('sources').textContent;</div><div> else</div><div> text.name = name;</div><div> text.className = 'invisible';</div><div> td.appendChild(text);</div><div> showText(text.name);</div><div> return text;</div><div> }</div><div> function context() {</div><div> this.hidden = true;</div><div> this.nextSibling().hidden = false;</div><div> //this.parent.onchange();</div><div> }</div><div>function actionText(node) {</div><div> var items = node.children;</div><div> for(i=0;i < items.length;i++)</div><div> if(items[i].selected) {</div><div> items[i].onclick(items[i].value);</div><div> return;}</div><div> }</div><div><br /></div><div>function blinkListItems(name) {</div><div> items = document.getElementById('macroList').children;</div><div> radioButtons(name,items);</div><div>}</div><div><br /></div><div>function source(name) {</div><div> getElementById('sources').textContent=name;</div><div> showTextArea(name);</div><div> console.log('arrived');</div><div>}</div><div><br /></div><div>// Make a name list from local storage</div><div>function nameSelector() {</div><div> var len = localStorage.length;</div><div> parent = document.getElementById('sources');</div><div> var sel = document.createElement('select');</div><div> sel.hidden = true;</div><div> sel.onchange = 'source()'.</div><div> parent.append(sel);</div><div> for(let i = 0;i < len;i++) {</div><div> name = localStorage.key(i);</div><div> var opt = document.createElement('option');</div><div> opt.textContent = name;</div><div> sel.appendChild(opt)</div><div> }</div><div> opt = document.createElement('option');</div><div> opt.textContent='rename';</div><div> sel.appendChild(opt);</div><div>}</div><div><br /></div><div><br /></div><div>function listLibrary() {</div><div> clearLog();</div><div> var len = localStorage.length;</div><div> strLog('\nLocal storage ' + len)</div><div> for(let i =0;i < len;i++) {</div><div> var name = localStorage.key(i);</div><div> value = localStorage.getItem(name);</div><div> strLog('\n '+i+': ' +name + ' '+ value);</div><div> }</div><div> }</div><div> // sysops</div><div><br /></div><div> //Install a module from local storage</div><div>// put up a selector for it, add its own</div><div>// text area, and install the name</div><div>// on the sysop table</div><div>function installModule(name,str) {</div><div> console.log('Install');</div><div> if(arguments.length == 2)</div><div> localStorage.setItem(name,str);</div><div> var index = findSym(name); // is it installed?</div><div> if((index > -1) && (index < builtinsLength))</div><div> return syntaxError('Opcode redefined i '+index+' '+builtinsLength+'|'+name+'|')</div><div> if(index >= 0) { // already in the opcode table</div><div> node= findListItem(name);</div><div> if(node==null) syntaxError('Library misorder')</div><div> node = findText(name)</div><div> if(node== 0) syntaxError('Set up wrong')</div><div> } else { // new set up</div><div> strPrependLog('\nNew set '+name);</div><div> node = createText(name);</div><div> console.log('Installed '+node.name + ' '+name);</div><div> addSym(name);</div><div> newListItem(name);</div><div> }</div><div> node.textContent=localStorage.getItem(name);</div><div> return OK;</div><div>}</div><div><br /></div><div>// drop an entry in the sysop table</div><div> function undef() {</div><div> remove(delSys); }</div><div>// in user table</div><div>function remove() {</div><div> remove(delSym); }</div><div><br /></div><div>function define() {</div><div> do {</div><div> if(nextToken() < 0) return syntaxError('No token')</div><div> newSysop(cc.slice());</div><div> }while(cc.type() != SEMI)</div><div>}</div><div>// manipulate the user symbol table</div><div>function assign(){</div><div> do {</div><div> if(nextToken() < 0) return syntaxError('No token')</div><div> type = cc.type();</div><div> if(type() == SEMI) break;</div><div> token1 = cc.slice();</div><div> if(nextToken() > 0) {</div><div> type = cc.type()</div><div> if(type ==ARG)</div><div> newSym(token1,args.pop());</div><div> else if(type = NUM)</div><div> newSym(token1,JSON.parse(cc.slice()));</div><div> } else</div><div> newSym(token1,UNDEF);</div><div> strPrependLog('Define: '+ token1 + ' ' + symValue(findSym(token1))+'\n')</div><div> } while(cc.type() != SEMI);</div><div> //nextToken(); //pass the semi</div><div> return endOfLine();</div><div>}</div><div><br /></div><div>function log(ptr){</div><div> var start,end;</div><div> var eol = endOfLine(); // move the newline pointer</div><div> //console.log('log ' + newline.lastIndex + ' '+ SRC.textContent.length);</div><div> start = cc.end();</div><div> if(newline.lastIndex !== 0)</div><div> end = newline.lastIndex-1;</div><div> else</div><div> end = cc.node().textContent.length;</div><div> strPrependLog('\n '+ cc.slice(start,end)+'\n');</div><div> return eol;</div><div>}</div><div> function newSysop(name) {</div><div> var i=0;</div><div> var symbol = new Object(opCode);</div><div> i = findSym(name,optable)</div><div> console.log('New sys '+name + ' '+i)</div><div> if(i < 0) {// New entry</div><div> symbol.str = name;</div><div> symbol.expr = RegExp(name);</div><div> symbol.idx=optable.length+1;</div><div> optable.push(symbol);</div><div> opcodesLength = optable.length;</div><div> }</div><div> return OK;</div><div>}</div><div>function delsysop(name) {</div><div> i = findSym(name,optable);</div><div> if(i < 0) return OK;</div><div> optable.splice(i,1);</div><div> return OK;</div><div>}</div><div><br /></div><div>function include(){</div><div> var node;</div><div> console.log('Include');</div><div> do {</div><div> r=nextToken()</div><div> var type = cc.type();</div><div> if(type == SEMI)</div><div> break; // move the newline pointer</div><div> if(r < 0) return syntaxError('No token');</div><div> if(type != ALPHA) return syntaxError('Expected Name');</div><div> var name = cc.slice();</div><div> installsysop(name);</div><div> strPrependLog('Add sysop '+ name+'\n')</div><div> } while(type != SEMI);</div><div> return OK;</div><div>}</div><div>// Bracket quoted HAL must be valid</div><div>// Should end with end; pseudo opcode</div><div>function macro() {</div><div> var index = nextToken();</div><div> if(index > -1) syntaxError('cannot redefine');</div><div> token = cc.slice();</div><div> nextToken();</div><div> if(cc.type() != LB) syntaxError('No start');</div><div> newOpcode(token,cc.end());</div><div> while(true) {</div><div> nextToken()</div><div> if(cc.type() == RB)</div><div> break;</div><div> endOfLine(); // skip the line</div><div> }</div><div>}</div><div></script></div><div><br /></div><div><br /></div><div><script></div><div> </div><div>// sneak in a fake source on startup</div><div>function sneak() {</div><div> var str = document.getElementById('startcode').textContent</div><div> installModule('source',str);</div><div>}</div><div>sneak();</div><div></script></div><div><script></div><div> // exec</div><div><br /></div><div>//Define a context of some type of token</div><div>// must include the node holding textContent,</div><div>// and a start, end, lastIndex</div><div>// scanned in a textArea of node, possibly</div><div>//having a symbol index pointing into the symbol table</div><div>// .</div><div>const Context = { start : 0, end : 0, type : 0,</div><div> node : 0,index : 0,line:1,lastIndex:0}</div><div>var CS = Array();</div><div><br /></div><div>const cc = {</div><div> k : -1,</div><div> version : function(){ strPrependLog('V1.0\n')},</div><div> length : function(){ return CS[this.k].end - CS[this.k].start;},</div><div> get : function() {return CS[this.k]},</div><div> clear : function(){CS.length =0; this.k =-1;},</div><div> incLine : function(){ CS[this.k].line++;return CS[this.k].line;},</div><div> line : function(){ return CS[this.k].line;},</div><div> push : function(x){ this.k++; return CS.push(x)},</div><div> pop : function(){ this.k--; return CS.pop()},</div><div> startChar : function(){ return CS[this.k].node.textContent.charAt(CS[this.k].start)},</div><div> endChar : function(){ return CS[this.k].node.textContent.charAt(CS[this.k].end)},</div><div> indexChar : function(index) { return CS[this.k].node.textContent.charAt(index);},</div><div> setStart : function(start) {CS[this.k].start =start;},</div><div> incStart : function(start) {CS[this.k].start++;},</div><div> setLastIndex : function() {CS[this.k].lastIndex =CS[this.k].end;},</div><div> start : function(start) {return CS[this.k].start;},</div><div> setIndex : function(index) {CS[this.k].index =index;},</div><div> setEnd : function(end) { CS[this.k].end =end;},</div><div> end : function() {return CS[this.k].end;},</div><div> node : function() {return CS[this.k].node;},</div><div> setType : function(type) { CS[this.k].type =type;},</div><div> type : function() {return CS[this.k].type;},</div><div> text : function() { return CS[this.k.node.textContent];},</div><div> slice : function(start,end){</div><div> var s,e;</div><div> var i = this.k;</div><div> if(arguments.length > 0) s = start; else s = CS[this.k].start;</div><div> if(arguments.length > 1) e = end; else e =CS[this.k].end;</div><div> return CS[this.k].node.textContent.slice(s,e);</div><div> },</div><div> twoChars : function(){</div><div> var s = CS[this.k].end; // aftr the newline</div><div> return CS[this.k].node.textContent.slice(s,s+2);</div><div> }</div><div>}</div><div><br /></div><div>// Initialize the assembler</div><div>function initHal() {</div><div> tokend.lastIndex =0;</div><div> newline.lastIndex =0;//</div><div> clearLog();</div><div> resetRpn();</div><div> //resetWaits();</div><div> return OK;</div><div>}</div><div>function endOfLine() {</div><div> newline.lastIndex = tokend.lastIndex;</div><div> newline.exec(cc.node().textContent)</div><div> if(newline.lastIndex !== 0) {</div><div>// Do not allow parser to chew past arguments</div><div> tokend.lastIndex = newline.lastIndex;</div><div> return OK;</div><div> }else return DONE;</div><div> }</div><div> // everything needed to process textContent</div><div>function newContext(node) {</div><div> var p = new Object(CONTEXT);</div><div> var x =0;</div><div> p.lastIndex = 0;</div><div> p.line = 1;</div><div> p.start = 0;</div><div> p.end = 0;</div><div> p.type = DISCARD;</div><div> p.node = node;</div><div> p.name = node.name;</div><div> cc.push(p);</div><div> // Newline required here</div><div> if(cc.indexChar(0) != '\n') return syntaxError('No starting newline');</div><div> strLog('New Context ' + node.name);</div><div> return endOfLine();</div><div>}</div><div>function execLines(){</div><div> var result=OK;</div><div> var count = 0;</div><div> while( (result == OK) || (result == WAIT)) {</div><div> count++;</div><div> result = firstColumn();</div><div> if(result==DONE)</div><div> return strPrependLog('\nSource done');</div><div> }</div><div> syntaxAlert('Assembly error ' + result)</div><div> }</div><div> </div><div>function ExecSource() {</div><div> node = findText('source')</div><div> if(node == null) return syntaxError('Nosource');</div><div> initHal();</div><div> console.log('CC ' +cc.k)</div><div> newContext(node);</div><div> execLines();</div><div> return OK;</div><div>}</div><div><br /></div><div><br /></div><div><br /></div><div>function listToken() {</div><div> var result = nextToken();</div><div> if(result == OK)</div><div> tokenText();</div><div> return result;</div><div>}</div><div>function listTokens() {</div><div> var result=OK;</div><div> var str;</div><div> clearLog()</div><div> strPrependLog('\n...All tokens....');</div><div> cc.setStart(0);</div><div> cc.setEnd(1);</div><div> tokstart.lastIndex =0;</div><div> tokend.lastIndex = 0;</div><div> newline.lastIndex =0;</div><div> //endOfLine(); // to starting line</div><div> do result = listToken(); while(result == OK);</div><div> strPrependLog('End of source');</div><div> return result;</div><div>}</div><div>function DebugStep(as) {</div><div> var result;</div><div> switch(as) {</div><div> case TEST:</div><div> e = findText('source');</div><div> if(e.hidden == 1) delete e.hidden;</div><div> else e.hidden = 1;</div><div> break;</div><div> case TOKEN :</div><div> if(listToken() == DONE) InitHal();</div><div> break;+tokend.lastIndex</div><div> case LINE :</div><div> if(nextToken() != DONE);</div><div> result = firstColumn();</div><div> //console.log('col end |'+cc.slice()+'|'+tokend.lastIndex);</div><div> break;</div><div> case INDEX:</div><div> break;</div><div> case INIT:</div><div> var node = findText('source');</div><div> if(node == null) console.log('Nosource');</div><div> initHal();</div><div> newContext(node);</div><div> break;</div><div> }</div><div>}</div><div><br /></div><div>// forward reference array</div><div>var waits = new Array();</div><div>function waitService(index) {</div><div> var n = waits.length;</div><div> console.log('Wait service len ' + n)</div><div> for(let i = 0; i < n;i++)</div><div> if(waits[i].index == index) {</div><div> cc.push(waits[i]);</div><div> console.log('Service '+tokenText())</div><div> waits.splice(i,1);</div><div> argsProcess();</div><div> CS.pop();</div><div> }</div><div> return OK;</div><div> }</div><div>function waitRequest(context,index) {</div><div> console.log('Wait request');</div><div> context.index =index;</div><div> waits.push(context);</div><div> return WAIT;</div><div>}</div><div>function opProcess(token){}</div><div>function funProcess(token) {</div><div> var result = 0;</div><div> var textNodes = document.getElementsByClassName('invisible');</div><div> var el = findName(textNodes,optable[token.index].str);</div><div> initHal();</div><div> result = newContext(el);</div><div> while(result != DONE) {</div><div> result = firstColumn();</div><div> }</div><div> return OK;</div><div>}</div><div><br /></div><div> //</div><div>// Global and local regx</div><div>const newline = RegExp(/\n/ ,'g'); // a regx to find end of line</div><div>const tokstart = RegExp(/\S|\n/, 'g');</div><div>const semi = RegExp(/;/,'g');</div><div>const tokend = RegExp(/\W/,'g'); // no alpha or numeric</div><div>const quote = RegExp(/\"/,'g'); // open literal</div><div>const bracket = RegExp(/\{\}/,'g'); // open literal</div><div>// local operators</div><div><br /></div><div>const alum = RegExp(/\w/); // alpha or numeric</div><div>const space = RegExp(/\t| /); // valid separators</div><div>const nospace = RegExp(/\S/); // drk</div><div>const operator = RegExp(/[;\*\\\+\-#\(\)]/);</div><div>const white = RegExp(/\s/); //not words</div><div><br /></div><div>const primes = [</div><div>{ str : 'register', expr : RegExp(/r\d/), type : REG},</div><div>{ str : 'alpha', expr : RegExp(/[a-zA-Z]/),type : ALPHA},</div><div>{ str : 'number', expr : RegExp(/[0-9]/),type : NUM},</div><div>{ str : 'sysop', expr : RegExp(/#/),type : SYSOP},</div><div>{ str : 'muliply', expr : RegExp(/[\*]/),type : MUL},</div><div>{ str : 'divide', expr: RegExp(/[\\]/),type : DIV},</div><div>{ str : 'add', expr : RegExp(/[\+]/),type : ADD},</div><div>{ str : 'sub', expr : RegExp(/[\-]/),type : SUB},</div><div>{ str : 'comma', expr : RegExp(/\,/),type : COMMA},</div><div>{ str : 'semi', expr : RegExp(/;/),type : SEMI},</div><div>{ str : 'left', expr : RegExp(/\(/),type : LP},</div><div>{ str : 'right', expr : RegExp(/\)/),type : RP},</div><div>{ str : 'newline', expr : RegExp(/\n/),type : NEWLINE}</div><div>]</div><div>const primeLength = primes.length;</div><div><br /></div><div>function regtest(regx,str){</div><div> </div><div> let x = regx.test(str);</div><div> return x;</div><div>}</div><div> // errors</div><div>function syntaxAlert(msg) {</div><div> var l;</div><div> alert(msg +' type '+cc.type()+' '+cc.start()+' '+cc.end()+' '+cc.slice()+'\n')</div><div> return OK;</div><div> }</div><div> // errors</div><div>function syntaxError(msg) {</div><div> var l;</div><div> strPrependLog(msg +' '+cc.start()+' '+cc.end()+' '+cc.slice()+'\n')</div><div> return ERROR;</div><div> }</div><div>function typeGet(index,str){</div><div> let x = primes[index].expr.test(str);</div><div> if(x) return primes[index].type;</div><div> else return ERROR;</div><div>}</div><div>function updateToken(index) {</div><div> var type,ch;</div><div> ch = cc.indexChar(index);</div><div><br /></div><div> for(i=0;i < primeLength;i++)</div><div> if( (type = typeGet(i,ch)) > -1){</div><div> cc.setType(type);</div><div> return cc.type();</div><div> }</div><div> return syntaxError('No type |'+ch+'|' );</div><div> }</div><div><br /></div><div>//args process found a quote character</div><div>function literal() {</div><div> cc.setStart(cc.end());</div><div> quote.lastIndex = cc.start();</div><div> quote.exec(cc.text());</div><div> if( (quote.lastIndex ==0) || (quote.lastIndex >= newlne.lastIndex) )</div><div> return syntaxError('missing quote');</div><div> cc.setEnd(quote.lastIndex-1);</div><div> rpn();</div><div> return OK;</div><div> }</div><div> </div><div>// The function sets the start and end indices</div><div>// for a token of three classes:</div><div>// numeric, alphanumeric and single char operators</div><div>// New lin3 is a valid operator, right associated.</div><div>// It changes assmbler state based on the next two chars.</div><div> function nextToken() {</div><div> SRC= cc.node();</div><div> if(SRC ===null) syntaxError('No source');</div><div> var ch,index,result;</div><div> tokstart.lastIndex = tokend.lastIndex-1; // get end of last token</div><div> if(regtest(space,SRC.textContent.charAt(tokstart.lastIndex) )){</div><div> tokstart.exec(cc.node().textContent)</div><div> if(tokstart.lastIndex == 0) return DONE;</div><div> } else tokstart.lastIndex++;</div><div> updateToken(tokstart.lastIndex-1);</div><div> tokend.lastIndex = tokstart.lastIndex; // get start of current token</div><div> if(regtest(alum,SRC.textContent.charAt(tokend.lastIndex-1)) ){</div><div> tokend.exec(SRC.textContent);</div><div> if(tokend.lastIndex == 0) return syntaxError('No line terminator')</div><div> } else tokend.lastIndex++; //must be a single char</div><div> cc.setStart(tokstart.lastIndex-1);</div><div> cc.setEnd(tokend.lastIndex-1);</div><div> return OK;</div><div> }</div><div>//First argument always an opcode</div><div>// handle opcode and multiple arguments</div><div>// symbol argument, literals, end of line</div><div>function argsProcess() {</div><div> opContext = cc.get(); // restart here on forward reference</div><div> if(nextToken() == DONE) return DONE;</div><div> if(cc.type() == NEWLINE) { //blank line</div><div> return OK;</div><div> }</div><div> // opcode required here</div><div> index = findSym(cc.slice());</div><div> if( index< 0) return syntaxError('\nNo op ' + cc.slice())</div><div> rpn(); // process opcode</div><div> let type = cc.type();</div><div> while((type != SEMI) && (type != NEWLINE )) {</div><div> if(nextToken() == ERROR) return syntaxError('Or a bug'); // line done</div><div> type = cc.type();</div><div> if(type == QUOTE) { // literals shipped as is.</div><div> literal(); // one literal per line</div><div> break;</div><div> } else if(type == ALPHA)</div><div> if(symbol(opContext ) == WAIT ) {</div><div> return endOfLine(); // fludh to end of line</div><div> }</div><div> // ready to activate rpn)</div><div> if(type > OP )</div><div> rpn();</div><div> }</div><div> return OK;</div><div> //endOfLine();</div><div>}</div><div>//the currnt token is newline</div><div>// which triggers first column call</div><div> function firstColumn() {</div><div> var result;</div><div> if(cc.type() != NEWLINE) return syntaxError('Col bug');</div><div> var twochars = cc.twoChars();</div><div><br /></div><div> // arrive here once per line and never more</div><div> cc.incLine(); // Every context keeps its own line counter</div><div> if(white.test(twochars)) // if no column one work</div><div> return argsProcess(); // pass it on</div><div> console.log('after args |'+cc.slice()+'|'+tokend.lastIndex);</div><div> nextToken(); // there is column one work</div><div> if(cc.type() == SYSOP) {</div><div> if(nextToken() < 0)return syntaxError('No sysop ');</div><div> let index = findMacro(cc.slice());</div><div> if(index < 0)</div><div> return syntaxError('Undefined sysop ');</div><div> else {</div><div> //console.log('Sysop '+cc.slice())</div><div> return mactable[index].handle();</div><div> }</div><div> }</div><div> // source defines symbol</div><div> else if(cc.type() == ALPHA) {</div><div> // we just set the symbol to the current lineZ</div><div> symbol();</div><div> return argsProcess();</div><div> }</div><div> else</div><div> return syntaxError('Illegal char ');</div><div>}</div><div>if ("serial" in navigator) {</div><div> // The Web Serial API is supported.</div><div>}</div><div>var port;</div><div><br /></div><div>async function getport() {</div><div> console.log('get port')</div><div> port = await navigator.serial.requestPort();</div><div> if(port)</div><div> var info = port.getInfo();</div><div> else console.log('no port')</div><div> console.log('info '+ info)</div><div>}</div><div>// Get all serial ports the user has previously granted the website access to.</div><div>async function getports() {</div><div> ports = await navigator.serial.getPorts();</div><div> console.log('Get ports ' + ports.length)</div><div> console.log(ports[0])</div><div>}</div><div><br /></div><div>async function closeport() {</div><div> await port.close();</div><div>}</div><div><br /></div><div>// Filter on devices with te Arduino Uno USB Vendor/Product IDs.</div><div>const filters = [</div><div> { usbVendorId: 0x2341, usbProductId: 0x0043 },</div><div> { usbVendorId: 0x2341, usbProductId: 0x0001 }</div><div>];</div><div><br /></div><div>// Prompt user to select an Arduino Uno device.</div><div>async function getPort() {</div><div>port = await navigator.serial.requestPort([filters]);</div><div>if(port)</div><div> var info = port.getInfo();</div><div>}</div><div><br /></div><div>// Wait for the serial port to open.</div><div>async function openport() {</div><div>await port.open({ baudRate: 9600 });</div><div>}</div><div>//After the serial port connection is established, the readable and writable properties //from the SerialPort object return a ReadableStream and a WritableStream. Those will be //used to receive data from and send data to the serial device. Both use Uint8Array //instances for data transfer.</div><div><br /></div><div>//When new data arrives from the serial device, port.readable.getReader().read() returns //two properties asynchronously: the value and a done boolean. If done is true, the serial //port has been closed or there is no more data coming in. Calling //port.readable.getReader() creates a reader and locks readable to it. While readable is //locked, the serial port can't be closed.</div><div><br /></div><div>async function readport() {</div><div>reader = port.readable.getReader();</div><div> console.log('read '+ reader);</div><div>// Listen to data coming from the serial device.</div><div>while (true) {</div><div><br /></div><div> var { value, done } = await reader.read();</div><div> if (done)</div><div> {</div><div> console.log('Value ' + value.length)</div><div> // Allow the serial port to be closed later.</div><div> reader.releaseLock();</div><div> break;</div><div> }</div><div> // value is a Uint8Array.</div><div>}</div><div> console.log('Done '+value.length);</div><div>}</div><div>function freeport(){</div><div> if(reader)</div><div> reader.releaseLock();</div><div> if(writer)</div><div> writr.relaseLock();</div><div>}</div><div><br /></div><div>async function writeport() {</div><div> var writer = port.writable.getWriter();</div><div> var data = new Uint8Array([104, 101, 108, 108, 111,010,013]); // hello</div><div> await writer.write(data);</div><div> console.log('Written ');</div><div> // Allow the serial port to be closed later.</div><div> writer.releaseLock();</div><div>}</div><div>function getreader() {</div><div>const textDecoder = new TextDecoderStream();</div><div>const readableStreamClosed = port.readable.pipeTo(textDecoder.writable);</div><div>reader = textDecoder.readable.getReader();</div><div>}</div><div><br /></div><div>// menu</div><div>var iCount=-1;</div><div> var current;</div><div> var selected = document.getElementById("selectedItem")</div><div> var menuItems = document.getElementById('simpleMenu').childNodes</div><div> current= menuItems[0];</div><div> parent=current.parentNode;</div><div> </div><div> function radioButtons(name,items){</div><div> for(i=0;i < items.length;i++) {</div><div> if(items[i].name == name)</div><div> items[i].style.backgroundColor = "orange";</div><div> else</div><div> items[i].style.backgroundColor = "navy";</div><div> }</div><div>}</div><div> </div><div> // set up the radio buttons</div><div>function setRadioEvent(element) {</div><div> element.addEventListener('click', () => {</div><div> element.style.backgroundColor = 'red'</div><div> let items=element.parentNode.children;</div><div> radioButtons(element.name,items);</div><div> //for(i=0;i<items.length;i++)</div><div> // if(items[i].name != element.name)</div><div> // items[i].style.backgroundColor = "blue"</div><div> });</div><div> }</div><div><br /></div><div> </div><div>function setConnects(str) {</div><div> var element = document.getElementById(str)</div><div> var items = element.children</div><div> for(i=0; i < items.length;i++) setRadioEvent(items[i]);</div><div> }</div><div> </div><div>button = document.getElementById("menuNext")</div><div> button.addEventListener('click', () => {</div><div><br /></div><div> do{</div><div> iCount++</div><div> if(menuItems.length == iCount) iCount = 0;</div><div> current = menuItems[iCount];</div><div> if(current.nodeName=="UL")</div><div> selected.textContent= current.className;</div><div> else if(current.nodeName=="LI")</div><div> selected.textContent= current.textContent;</div><div> } while(current.nodeType !=1)</div><div> </div><div> });</div><div> </div><div> </div><div> </div><div> button = document.getElementById("menuDown")</div><div> button.addEventListener('click', () => {</div><div> if(current.nodeName == "UL") {</div><div> parent=current;</div><div> menuItems = parent.childNodes;</div><div> current = menuItems[0];</div><div> iCount=-1</div><div> if(current.nodeName=="UL")</div><div> selected.textContent= current.className</div><div> }</div><div> else {</div><div> selected.textContent= current.textContent;</div><div> current.onclick()</div><div> }</div><div> });</div><div><br /></div><div> button = document.getElementById("menuUp")</div><div> button.addEventListener('click', () => {</div><div> if(parent.nodeName =="UL") {</div><div> current = parent</div><div> parent = current.parentNode;</div><div> menuItems = parent.childNodes;</div><div> iCount=-1</div><div> selected.textContent= current.className</div><div> } else</div><div> console.log('To level')</div><div><br /></div><div> });</div><div> setConnects('connectTop')</div><div> setConnects('connectBottom')</div><div> </div><div> // resolve</div><div>objectCode = new Uint8Array(100);</div><div>arg = new Array();</div><div>oper = new Array();</div><div>function resetRpn() {</div><div> arg.length = 0;</div><div> oper.length = 0;}</div><div><br /></div><div>function operLast() {</div><div> return oper[oper.length-1]}</div><div>function argLast() {</div><div> return arg[arg.length-1]}</div><div> </div><div>function OpProcess(index) {</div><div> var result = 0;</div><div> switch(optable[index].type) {</div><div> case MODULE:</div><div> var str = optable[index].str;</div><div> var node = findTextarea(str);</div><div> newContext(node);</div><div> execLines();</div><div> cc.pop();</div><div> break</div><div> case MACRO:</div><div> var state = nextToken();</div><div> while(state != DONE)</div><div> executeLine();</div><div> break</div><div> case END:</div><div> return DONE;</div><div> break;</div><div>}</div><div> if(index < builtinsLength) processOpcode(index)</div><div> else { // must be a module</div><div> var str = optable[index].str;</div><div> var node = findText(str);</div><div> newContext(node);</div><div> execLines();</div><div> CS.pop();</div><div> }</div><div><br /></div><div> return OK;</div><div>}</div><div>function flushLiteral(addr) {</div><div> start = cc.start();</div><div> end = start + cc.length;</div><div> node=cc.node();</div><div> while(start < end) {</div><div> objectCode[addr] = node.textContent[start];</div><div> start++;addr++;</div><div> }</div><div>}</div><div>function flushNum(n,addr) {</div><div> var list = String('0123456789abcdef')</div><div> var out = String(' ');</div><div> bit = 1;</div><div> while(bit < n) {</div><div> var r = 0;</div><div> var t = 1;</div><div> for(j=0;j < 4;j++) { // for each bit</div><div> if(n & bit)</div><div> r += t;</div><div> t *=2;</div><div> bit *=2;</div><div> }</div><div> out = list[r] +out;</div><div> }</div><div> for(j=0;j < out.length;j++){</div><div> objectCode[addr] = out[j];</div><div> addr++;</div><div> }</div><div> return addr;</div><div>}</div><div>// numbers or operators</div><div>function flushExpression(arg,addr) {</div><div> var len = expr.length;</div><div> var x;</div><div> var y;</div><div> var z;</div><div> console.log('flush');</div><div> while(arg.length>2) { // there should remain one resolved literal</div><div> x = arg.pop();</div><div> y = arg.pop();</div><div> z = 0;</div><div> switch(lastOper.type) {</div><div> case MUL:</div><div> z = (x*y);</div><div> break;</div><div> case DIV:</div><div> z =(x/y);</div><div> break;</div><div> case ADD:</div><div> z =(x+y);</div><div> break;</div><div> case SUB:</div><div> z =(x-y)</div><div> break;</div><div> }</div><div> arg.push(z);</div><div> arg.splice(0,1)</div><div> }</div><div> flushNum(z);</div><div> return OK;</div><div> }</div><div>// make the source line shunted</div><div>// evaluate arg expressions</div><div>// separat arguments</div><div>var addr=0;</div><div>function rpn()</div><div>{</div><div> strLog('\nrpn ' + cc.slice());</div><div> var type = cc.type();</div><div> switch(type) {</div><div> case LITERAL:</div><div> addr=flushLiteral(addr);</div><div> break;</div><div> case VAL:</div><div> arg.push(cc.index());</div><div> break;</div><div> case NUM:</div><div> x = JSON.parse(cc.slice());</div><div> arg.push(x);</div><div> break;</div><div> case RP:</div><div> while(oper.length > 0 )</div><div> if (type = lastOper.type != LP)</div><div> arg.push(oper.pop().type)</div><div> else</div><div> addr = flushExpression(addr);</div><div> if(oper.length == 0)return syntaxError('no left parenth')</div><div> oper.pop();</div><div> break;</div><div> case SEMI: // The last argument</div><div> if(oper.length==0) return(syntaxError('Semi-colon mismatch'));</div><div> addr = flushExpression(addr); // one last arg</div><div> type = oper.pop().type;</div><div> if((type != OP) && (type != MACRO))</div><div> return(sytaxError('Line not closed'));</div><div> // call the OP or MACRO process</div><div> processOpcode(cc.index());</div><div> break;</div><div> break;</div><div> case COMMA:</div><div> addr = flushExpression(addr);</div><div> break</div><div> case ALPHA:</div><div> case SYSOP:</div><div> return syntaxError('Not prime');</div><div> break;</div><div> default:</div><div> while( (oper.length != 0) && (operLast.type > type) )</div><div> arg.push(oper.pop().type);</div><div> }</div><div> return OK;</div><div> }</div><div></script></div><div><br /></div><div> </html></div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-46571285297985924322023-09-25T14:27:00.001-07:002023-09-25T14:27:12.867-07:00Progressive politicians on the take<p> </p><h1 class="ArticleFull_title__FDrpw" style="box-sizing: border-box; color: #222222; font-family: DINOT, Impact, sans-serif; font-size: 30px; letter-spacing: 0.5px; line-height: 36px; margin: 10px 0px 25px;"><a href="https://www.zerohedge.com/political/busted-adam-schiff-funneled-millions-defense-contractors-after-taking-donations">Busted! Adam Schiff Funneled Millions To Defense Contractors After Taking Donations</a></h1><div><br /></div><div>Gavin Newsom, Liz Warren, Nancy and Diane, Menendez. All of them believe they are allowed to steal from the poor.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-45526169774259771612023-09-24T10:00:00.002-07:002023-09-24T10:00:12.224-07:00Commie rats are control freaks<span style="color: #2b00fe;"><a href="https://www.express.co.uk/news/world/1816127/china-economy-crisis-xi-jinping-ccp">EXCLUSIVE: </a>Xi Jinping's centralisation of China's economy appears to be causing a stall - something which could spell doom for the CCP, a former senior White House official told Daily Express US.</span><div><br /></div><div><br /></div><div><b>Sounds a lot like California where the teacher's union rules the ship</b>.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-90828388979841330942023-09-14T11:21:00.004-07:002023-09-23T16:44:17.644-07:00No, actually. I have seen the name thrown about<p><a href="https://hotair.com/karen-townsend/2023/09/14/boebert-behaving-badly-do-you-know-who-i-am-n577982"> <span style="font-size: x-large;"><span face="proxima-nova, Arial, sans-serif" style="color: #972123;"><span style="background-color: white; box-sizing: border-box; line-height: 47px;"><b>Boebert behaving badly: “Do you know who I am?”</b></span></span><span face="proxima-nova, Arial, sans-serif" style="background-color: white; color: #393939;"> </span></span></a></p>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-90847201230467784072023-09-05T11:30:00.003-07:002023-09-05T11:50:51.264-07:00Cannot disrespect the great color genderizor<p><span style="font-family: inherit; font-size: large;"> </span></p><h2 class="text-base md:text-xl lg:text-2xl xl:text-3xl text-black leading-tight mb-4" style="--tw-ring-color: rgba(59, 130, 246, 0.5); --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-text-opacity: 1; background-color: white; border-color: currentcolor; border-style: solid; border-width: 0px; box-sizing: border-box; color: rgba(0, 0, 0, var(--tw-text-opacity)); font-weight: inherit; line-height: 1.25; margin: 0px 0px 1rem;"><a class="text-black" href="https://dailycaller.com/2023/09/05/biden-racist-kamala-harris-gavin-newsom-2024/" style="--tw-ring-color: rgba(59, 130, 246, 0.5); --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-text-opacity: 1; border-color: currentcolor; border-style: solid; border-width: 0px; box-sizing: border-box; text-decoration: inherit;"><span style="font-family: inherit; font-size: large;">Biden Allies Say It Would Be Racist For Gavin Newsom To Run In 2024</span></a></h2><div><br /></div><div>The Kamalatic, a new kitchen tool we have to try out. It may, in fact, be illegal in California for Gavin to run this term. I think his unions have jurisdiction in this case. and they will vote for the color/genderizor.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-40757065604932035012023-08-30T12:35:00.004-07:002023-08-30T12:35:35.098-07:00Srokes in mid conference<span style="font-size: large;"><a href="https://www.businessinsider.com/mitch-mcconnell-freezes-up-again-press-conference-video-2023-8">Mitch McConnell freezes again during a press conference</a></span><div><span style="font-size: large;"><br /></span></div><div>Brains in the Swamp are turning to silly putty.</div><div><div class="quick-link" style="background-color: white; border-bottom: none; box-sizing: border-box; color: #111111; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; margin: 0px 0px 24px; padding-bottom: 0px;"><div class="tout-tag" data-component-type="client-tag" data-id="russia-ruble-failing-consumers-cutting-back-on-basic-goods-2023-8" data-site="bi" style="align-items: center; box-sizing: border-box; display: flex; flex-wrap: wrap; height: 21px; margin-bottom: 4px; width: 300px;"></div></div></div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-61278223970692911932023-08-21T14:37:00.003-07:002023-08-21T14:37:37.737-07:00Chicago street battles<span style="font-size: large;"><a href="https://abcnews.go.com/US/14-year-7-killed-33-wounded-chicago-weekend/story?id=102422972">14-year-old among 7 killed, 33 wounded in Chicago weekend gun violence</a></span>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-85612825891854396242023-08-17T11:10:00.002-07:002023-08-18T10:48:09.529-07:00What did Mickey Mouse say?<span style="font-size: large;"><a href="https://reason.com/2023/08/15/by-trying-to-move-on-desantis-admits-his-fight-with-disney-was-a-political-stunt-all-along/">By Trying To 'Move On,' DeSantis Admits His Fight With Disney Was a Political Stunt All Along</a></span><div><br /></div><div>Mickey may not be done with Ron!</div><div><br /></div><span style="font-size: large;"><a href="https://www.businessinsider.com/disney-desantis-feud-court-filing-park-wants-damages-contract-2023-8">Disney isn't going to let DeSantis walk away from their feud unscathed as the governor desperately tries to reboot his campaign</a></span>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-19882925287125803322023-08-16T07:43:00.004-07:002023-08-16T07:43:52.766-07:00You have your Trumpsters and now your Dump Trumpsters<p> </p><h3 class="h1" style="--paper-shadow: none; box-sizing: inherit; font-family: "Noto Serif", serif; font-size: var(--h1); font-weight: var(--hw, bold); line-height: var(--hl, 1.2em); margin: 0px; outline: none;"><a data-tb-link="" data-tb-shadow-region-link="1" data-tb-shadow-region-title="0" data-tb-title="" data-tbl-listen-index="0" href="https://www.fresnobee.com/opinion/editorials/article278276128.html#storylink=mainstage_lead" style="--paper-shadow: none; box-sizing: inherit; outline: none; text-decoration: var(--ld);">Kevin McCarthy, it’s time to dump Trump and restore the Republican party’s values | Opinion</a></h3>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-34381108558213075352023-08-08T22:17:00.005-07:002023-08-08T22:17:56.757-07:00Prolife Reubs plan to spend trillions on artificial wombs<p><span style="font-family: inherit; font-size: large;"> </span><a class="tout-title-link big-picture-tout" cmp-ltrk-idx="1" cmp-ltrk="Top story tout" data-analytics-product-area="politics" data-analytics-product-index="5" data-mrf-link="https://www.businessinsider.com/ohio-issue-1-turnout-election-abortion-roe-analysis-2023-8" href="https://www.businessinsider.com/ohio-issue-1-turnout-election-abortion-roe-analysis-2023-8" mrfobservableid="0209f909-71c2-47a2-add2-b3f9d0cddce1" style="box-sizing: border-box; text-decoration-line: none;"><span style="color: #2b00fe; font-family: inherit; font-size: large;">The GOP awakened a broad coalition to turn out to vote against their referendum designed to hinder abortion. It could be a massive problem for the party for a long time.</span></a></p><div>It is like signaling that the Dems do. The artificial wombs are just a few years away, it is easy to abort a fetus alive. Put those two together and the most massive miscalculation ever was letting the Supremes treat women as womb slaves. An incredible level os stupidity that sets the Repubs back for many years.</div><div><br /></div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-59856487700505236042023-08-08T14:54:00.002-07:002023-08-08T14:54:20.527-07:00No more attacking Mickey Mouse<div><a href="https://www.reuters.com/world/us/republican-ron-desantis-ousts-campaign-manager-amid-slump-polls-2023-08-08/" style="font-size: x-large;">Republican Ron DeSantis, in need of a momentum shift, ousts campaign chief</a></div><div><br /></div><div>Florida man flounders.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-61334956353687544532023-08-08T14:51:00.002-07:002023-08-08T14:51:14.874-07:00Learning the difference between signaling and intending<span style="font-size: large;"><a href="https://dailycaller.com/2023/08/08/dem-governor-declares-emergency-over-migrants-calls-on-biden-admin-for-urgent-help/">Dem Governor Declares Emergency Over Migrants, Calls On Biden Admin For Urgent Help</a></span><div><br /></div><div>She will be more careful next time.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-52025545646001550922023-08-06T19:00:00.003-07:002023-08-06T19:00:38.387-07:00A corrupt Swampt<span style="font-family: inherit; font-size: large;"><a href="https://www.zerohedge.com/economics/biden-energy-secretary-secretly-consulted-top-chinese-energy-official-spr-release-sales">Biden Energy Secretary Secretly Consulted Top Chinese Energy Official Before SPR Release, Sales To Hunter Biden-Linked Chinese Energy Giant</a></span><div><br /></div><div>The corruption is growing and spreading, out in the open these days.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-5984077470697751262023-08-04T21:31:00.004-07:002023-08-04T21:31:31.716-07:00Two welfare bums<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi-gu50DkxIxA-QRTE0wIbjvO8ekEuYIqMrcs79SYFi7sLqwSQvx96bPIf9JEMOAF8zvzu-WdStRRHYRcJPGvUN_c9dO8zsewa6UwsVqN2RiFnegtPB_9qFRlZkEIWNA8tadnsFwvfJI6ek1zQ-UVQ3wnpKIICLz9N4UeOKXbLhoQHJxop-8iSgiXzdjIwy" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="749" data-original-width="1000" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEi-gu50DkxIxA-QRTE0wIbjvO8ekEuYIqMrcs79SYFi7sLqwSQvx96bPIf9JEMOAF8zvzu-WdStRRHYRcJPGvUN_c9dO8zsewa6UwsVqN2RiFnegtPB_9qFRlZkEIWNA8tadnsFwvfJI6ek1zQ-UVQ3wnpKIICLz9N4UeOKXbLhoQHJxop-8iSgiXzdjIwy" width="320" /></a></div><div class="tout-copy featured-tout typography" style="-webkit-text-stroke-width: 0px; background-color: white; box-sizing: border-box; color: #4a4a4a; font-family: TiemposTextWeb, Georgia, Times, serif; font-size: 15px; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; line-height: 24px; margin-bottom: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><ul style="box-sizing: border-box; list-style-type: none; margin: 16px 0px; padding: 0px 0px 0px 22px;"></ul></div><p></p><h1 class="tout-title featured-tout" style="background-color: white; box-sizing: border-box; color: #111111; line-height: 2.5rem; margin: 0px 0px 17px;"><a class="tout-title-link" cmp-ltrk-idx="0" cmp-ltrk="Featured Tout" data-analytics-module="hero" data-analytics-position="1" data-mrf-link="https://www.businessinsider.com/putin-trump-2024-win-us-funding-cuts-ukraine-cnn-2023-8" href="https://www.businessinsider.com/putin-trump-2024-win-us-funding-cuts-ukraine-cnn-2023-8" mrfobservableid="acce1cf6-8fd7-47bb-969f-2d71acf84523" style="background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #111111; text-decoration-line: none;"><span style="font-family: inherit; font-size: medium;">Putin is likely counting on Trump to win the 2024 election in hopes that the US will cut support to Ukraine, officials say</span></a></h1><div><br /></div><div>Always run to some government authority for mutual bailout of their central plans.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-1402768273223937822023-08-03T06:33:00.002-07:002023-08-03T06:33:53.443-07:00Sorry, but the NAACP called it<span style="font-size: large;"><a href="https://dailycaller.com/2023/08/03/brandon-johnson-chicago-teen-looters/">‘Be Very Careful’: Chicago Mayor Brandon Johnson Defends Teen Looters From ‘Mob Action’ AllegationsBrandon Johnson defends teen looters</a></span><div><br /></div><div>They are mobs of Black teenagers. </div><div><br /></div><div>I have come up with all sorts of round abouts avoiding the specific ethnic. That tie is gone. These Black Teens in the inner city are losing badly in the next layerr of information revolution.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-52105392281102667542023-08-02T13:28:00.001-07:002023-08-02T13:28:06.864-07:00Trump does not have a Kamala<span style="font-size: large;"><a href="https://www.msn.com/en-us/news/politics/obama-warns-of-trump-s-political-strengths-in-private-talk-with-biden/ar-AA1eHcdT">Obama warns of Trump’s political strengths in private talk with Biden</a></span>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-19666695460928771932023-07-30T14:58:00.004-07:002023-07-30T14:59:01.977-07:00Witness tampering by Joe<p> </p><h2 class="Article_title___TC6d" style="background-color: #eeeeee; box-sizing: border-box; color: #222222; font-family: DINOT, Impact, sans-serif; font-size: 24px; grid-area: headline / headline / headline / headline; letter-spacing: 0.5px; line-height: 28px; margin: 0px;"><a href="https://www.zerohedge.com/political/doj-trying-jail-star-witness-against-hunter-biden-eve-congressional-testimony" style="box-sizing: border-box; color: #7a7a7a;">DOJ Trying To Jail Star Witness Against Hunter Biden On Eve Of Congressional Testimony</a></h2>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-7370120522221838342023-07-30T11:44:00.003-07:002023-07-30T11:44:22.754-07:00We can go to school and learn to be good slaves!<span style="font-size: large;"><a href="https://thehill.com/homenews/campaign/4127795-will-hurd-slams-desantis-over-florida-slavery-curriculum-mean-and-hateful/">Will Hurd slams DeSantis over Florida slavery curriculum: ‘Mean and hateful’ </a></span><br /><div><br /></div><div>Myself? I am studying to be an internet bot.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-82673494167437710432023-07-30T10:25:00.001-07:002023-07-30T10:25:29.124-07:00And my tax relief<p> </p><h1 class="entry-title" style="background-color: white; box-sizing: border-box; color: #333333; font-family: franklin-gothic-urw, Arial, Gadget; font-size: 1.95312rem; line-height: 1; margin-bottom: 0.3em; margin-top: 0px;">Democrats Propose Eliminating Student Loan Interest</h1><div><br /></div><div>Dems should always remember that the middle class gets a big tax cut along with student loan relief.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-27851483390277627112023-07-30T10:21:00.003-07:002023-07-30T10:21:37.118-07:00I'm all scaredy pooh<a href="https://thehill.com/homenews/administration/4125642-white-house-takes-the-gloves-off-ahead-of-2024/"><br /></a><div class="separator" style="clear: both; text-align: center;"><a href="https://thehill.com/homenews/administration/4125642-white-house-takes-the-gloves-off-ahead-of-2024/"></a><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgNpaSOd4_3YrSi1q-7vMd4sWlVJor34Npyn80Nu12OJMQQhAF0JvWBIEbObAtK6sRjUqIPHKBsF-okdlBR0grCub3dTfIuTVsORMe7cC9R65eTQuNp5-_O5sziQCGI1mnQAsu6enPP8fu2V7arrJAroywPIv39_aT5tDd_-cnQ_ORb0GJD6Ghydz1DrKPO" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="360" data-original-width="640" height="180" src="https://blogger.googleusercontent.com/img/a/AVvXsEgNpaSOd4_3YrSi1q-7vMd4sWlVJor34Npyn80Nu12OJMQQhAF0JvWBIEbObAtK6sRjUqIPHKBsF-okdlBR0grCub3dTfIuTVsORMe7cC9R65eTQuNp5-_O5sziQCGI1mnQAsu6enPP8fu2V7arrJAroywPIv39_aT5tDd_-cnQ_ORb0GJD6Ghydz1DrKPO" width="320" /></a></div><br /><br /><br /><span style="font-size: large;">White House takes the gloves off ahead of 2024</span><div><br /></div><div>Joe with his 'ball and chain'. She has a smile while Joe looks all meany. A candidate who asks permission from his politburo before he can exit the stage? The man is demented and held by strings like a puppet.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-56373261813853083232023-07-30T04:15:00.005-07:002023-07-30T04:15:58.558-07:00Joe hasn't died yet<span style="font-size: large;"><a href="https://www.politico.com/news/magazine/2023/07/26/kamala-harris-vice-presidency-00107856">Why Kamala Harris Is A Better VP Than You Think</a></span><div><br /></div><div>Her best quality is that he is not president. We need to keep it that way.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-24792372361578674772023-07-25T13:29:00.002-07:002023-07-25T13:29:28.763-07:00Gun lovers are sexual deviants.<span style="font-size: large;"><a href="https://abcnews.go.com/US/gilgo-beach-murders-police-finish-search-rex-heuermanns/story?id=101632027">Gilgo Beach murders: Police finish search at Rex Heuermann's Long Island home</a></span><div><br /></div><div>Our founding fathers wants deranged gun lovers to have weapons? No, the founders never wanted these idiots to have guns.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-78343172560988981282023-07-21T09:22:00.002-07:002023-07-21T09:22:47.949-07:00The alternative is worse<span style="font-size: large;"><a href="https://hotair.com/ed-morrissey/2023/07/21/are-half-of-all-americans-really-considering-a-third-party-vote-in-2024-n566160">Are half of all Americans really considering a third-party vote in 2024?</a></span><div><br /></div><div>How does President Kamala sound? How about Trump the Second?</div><div><br /></div><div>Trumpsters are pretty dumb about this, but the rest of us are saying no to these two boneheads. Joe is no better and he is a walking corpse anyway.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-19784303240465795342023-07-20T14:54:00.001-07:002023-07-20T14:54:14.251-07:00Mrs. Desantis dresses like a transgender<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhQSnUQpmjmMemEZXDjJvB98wguAF3ZDPa9tcUatIIz4AooUxWjLrL9u_gy5AK9YLRUytkX6aSLoVIPcfrXRlvsfznuXNSlk1FUQr1fx3hRX0Hm0jC2t4_NZ6ZK5RsromEywAH1r0O_o4VYDqI1JffVL-xK2Zo0LA3_FZfuYx_YyqkhKZ1I_VPXiySOX5qw" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="475" data-original-width="860" height="177" src="https://blogger.googleusercontent.com/img/a/AVvXsEhQSnUQpmjmMemEZXDjJvB98wguAF3ZDPa9tcUatIIz4AooUxWjLrL9u_gy5AK9YLRUytkX6aSLoVIPcfrXRlvsfznuXNSlk1FUQr1fx3hRX0Hm0jC2t4_NZ6ZK5RsromEywAH1r0O_o4VYDqI1JffVL-xK2Zo0LA3_FZfuYx_YyqkhKZ1I_VPXiySOX5qw" width="320" /></a></div>Ron don't like drag, how does his wife get away with it?<p></p>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0tag:blogger.com,1999:blog-3826613607210948922.post-39294759230338415312023-07-20T07:20:00.002-07:002023-07-20T07:20:15.986-07:00Send them all to Nancy Pelosi's house.<span style="font-size: large;"><a href="https://hotair.com/jazz-shaw/2023/07/19/massachusetts-asks-homeowners-to-take-in-illegal-migrants-n565669">Massachusetts asks homeowners to take in illegal migrants</a></span><div><br /></div><div>Nancy has been inviting migrants to Massachusetts for 30 years. I never hear Mass voters complain.</div>Matt Younghttp://www.blogger.com/profile/08404998406161097199noreply@blogger.com0