From c1d849946fba7f7461fb5148dbe0868842b6567a Mon Sep 17 00:00:00 2001 From: David Schmenk <dschmenk@gmail.com> Date: Tue, 17 Apr 2018 10:39:05 -0700 Subject: [PATCH] BIG change so FOR/NEXT exits with proper terminal value in variable --- src/libsrc/apple/uthernet2.pla | 198 +++++++++++++++++---------------- src/libsrc/dhcp.pla | 6 +- src/libsrc/inet.pla | 49 ++++---- src/libsrc/jit16core.pla | 32 +++--- src/libsrc/jitcore.pla | 28 ++--- src/toolsrc/codegen.pla | 20 ++++ src/toolsrc/lex.pla | 4 +- src/toolsrc/parse.c | 25 ++--- src/toolsrc/parse.pla | 21 ++-- src/toolsrc/plasm.pla | 2 +- src/vmsrc/apple/plvm01.s | 20 +--- src/vmsrc/apple/plvm02.s | 20 +--- src/vmsrc/apple/plvm03.s | 42 +++---- src/vmsrc/apple/plvm802.s | 24 +--- src/vmsrc/apple/plvmjit02.s | 20 +--- src/vmsrc/c64/plvmc64.s | 20 +--- 16 files changed, 237 insertions(+), 294 deletions(-) diff --git a/src/libsrc/apple/uthernet2.pla b/src/libsrc/apple/uthernet2.pla index fc63e82..26bc120 100644 --- a/src/libsrc/apple/uthernet2.pla +++ b/src/libsrc/apple/uthernet2.pla @@ -180,12 +180,12 @@ end // // Local network parameters // -const MAX_WIZ_CHANNELS = 4 +const MAX_WIZ_CHANNELS = 4 // // Channel protocols // -const WIZ_PROTO_CLOSED = 0 -const WIZ_PROTO_TCP = 1 +const WIZ_PROTO_CLOSED = 0 +const WIZ_PROTO_TCP = 1 const WIZ_PROTO_UDP = 2 const WIZ_PROTO_IP = 3 const WIZ_PROTO_RAW = 4 @@ -212,7 +212,7 @@ struc t_channel word channel_recv_func word channel_recv_parm end -byte[t_channel * MAX_WIZ_CHANNELS] wizChannel +byte[t_channel] wizChannel[MAX_WIZ_CHANNELS] // // Service ICMP hook // @@ -227,11 +227,11 @@ end // Swap bytes in word // asm swab(val) - LDA ESTKL,X - LDY ESTKH,X - STA ESTKH,X - STY ESTKL,X - RTS + LDA ESTKL,X + LDY ESTKH,X + STA ESTKH,X + STY ESTKL,X + RTS end // // Wiznet I/O functions @@ -239,118 +239,122 @@ end // POKE WORD TO I/O SPACE // Note: Big Endian format // -asm _pokeiow(val) - LDA ESTKH,X +asm _pokeiow(val)#0 + LDA ESTKH,X end asm _pokeiowl - STA $C000 - LDA ESTKL,X + STA $C000 + LDA ESTKL,X end asm _pokeiowh - STA $C000 - RTS + STA $C000 + INX + RTS end // // POKE BYTE TO I/O SPACE // -asm _pokeio(val) - LDA ESTKL,X +asm _pokeio(val)#0 + LDA ESTKL,X end asm _pokeiol - STA $C000 - RTS + STA $C000 + INX + RTS end // // PEEK BYTE FROM I/O SPACE // asm _peekio - DEX + DEX end asm _peekiol - LDA $C000 - STA ESTKL,X - LDA #$00 - STA ESTKH,X - RTS + LDA $C000 + STA ESTKL,X + LDA #$00 + STA ESTKH,X + RTS end // // PEEK WORD FROM I/O SPACE // Note: Big Endian format // asm _peekiow - DEX + DEX end asm _peekiowl - LDA $C000 - STA ESTKH,X + LDA $C000 + STA ESTKH,X end asm _peekiowh - LDA $C000 - STA ESTKL,X - RTS + LDA $C000 + STA ESTKL,X + RTS end // // WRITE DATA INTO I/O SPACE // pokedata(BUF, LEN) // -asm pokedata(buf, len) - LDA ESTKL+1,X - STA SRCL - LDA ESTKH+1,X - STA SRCH - LDY ESTKL,X - BEQ POKELP - LDY #$00 - INC ESTKH,X -POKELP LDA (SRC),Y +asm pokedata(buf, len)#0 + LDA ESTKL+1,X + STA SRCL + LDA ESTKH+1,X + STA SRCH + LDY ESTKL,X + BEQ POKELP + LDY #$00 + INC ESTKH,X +POKELP LDA (SRC),Y end asm _pokedata - STA $C000 - INY - BNE + - INC SRCH -+ DEC ESTKL,X - BNE POKELP - DEC ESTKH,X - BNE POKELP - INX - RTS + STA $C000 + INY + BNE + + INC SRCH ++ DEC ESTKL,X + BNE POKELP + DEC ESTKH,X + BNE POKELP + INX + INX + RTS end // // READ DATA FROM I/O SPACE // peekdata(BUF, LEN) // -asm peekdata(buf, len) - LDA ESTKL+1,X - STA DSTL - LDA ESTKH+1,X - STA DSTH - LDY ESTKL,X - BEQ PEEKLP - LDY #$00 - INC ESTKH,X +asm peekdata(buf, len)#0 + LDA ESTKL+1,X + STA DSTL + LDA ESTKH+1,X + STA DSTH + LDY ESTKL,X + BEQ PEEKLP + LDY #$00 + INC ESTKH,X end asm _peekdata -PEEKLP LDA $C000 - STA (DST),Y - INY - BNE + - INC DSTH -+ DEC ESTKL,X - BNE PEEKLP - DEC ESTKH,X - BNE PEEKLP - INX - RTS +PEEKLP LDA $C000 + STA (DST),Y + INY + BNE + + INC DSTH ++ DEC ESTKL,X + BNE PEEKLP + DEC ESTKH,X + BNE PEEKLP + INX + INX + RTS end -def pokeiow(io, data) +def pokeiow(io, data)#0 _pokeiowl.1 = io _pokeiowh.1 = io+1 - return _pokeiow(data) + _pokeiow(data) end -def pokeio(io, data) +def pokeio(io, data)#0 _pokeiol.1 = io - return _pokeio(data) + _pokeio(data) end def peekio(io) _peekiol.1 = io @@ -361,26 +365,26 @@ def peekiow(io) _peekiowh.1 = io+1 return _peekiow() end -def pokereg(reg, data) +def pokereg(reg, data)#0 _pokeiow(reg) - return _pokeio(data) + _pokeio(data) end def peekreg(reg) _pokeiow(reg) return _peekio() end -def pokeregs(reg, buf, len) +def pokeregs(reg, buf, len)#0 _pokeiow(reg) - return pokedata(buf, len) + pokedata(buf, len) end -def peekregs(reg, buf, len) +def peekregs(reg, buf, len)#0 _pokeiow(reg) - return peekdata(buf, len) + peekdata(buf, len) end -def pokeregw(reg, dataw) +def pokeregw(reg, dataw)#0 _pokeiow(reg) _pokeio(dataw.1) - return _pokeio(dataw.0) + _pokeio(dataw.0) end def peekregw(reg) word dataw @@ -415,7 +419,7 @@ def wizSendUDP(wiz, ipdst, portdst, data, len) splitlen = WIZ_TXSIZE - txrr pokeregs(wizdata + txrr, data, splitlen) pokeregs(wizdata, data + splitlen, len - splitlen) - else + else pokeregs(wizdata + txrr, data, len) fin // @@ -480,14 +484,14 @@ end // def wizCloseUDP(wiz) if isuge(wiz, @wizChannel) and isult(wiz, @wizChannel + MAX_WIZ_CHANNELS * t_channel) - // - // Clear notiications on this port - // + // + // Clear notiications on this port + // if wiz->channel_proto == WIZ_PROTO_UDP wiz->channel_proto = WIZ_PROTO_CLOSED pokereg(wiz=>channel_regs + WIZ_SnCR, $10) // CLOSE - return 0 - fin + return 0 + fin fin // // Invalid port @@ -508,8 +512,8 @@ def wizListenTCP(lclport, callback, param) for i = 1 to MAX_WIZ_CHANNELS if wiz->channel_proto == WIZ_PROTO_TCP and wiz->channel_state == TCP_STATE_LISTEN and wiz=>channel_lclport == lclport break - fin - wiz = wiz + t_channel + fin + wiz = wiz + t_channel next if i > MAX_WIZ_CHANNELS // @@ -519,8 +523,8 @@ def wizListenTCP(lclport, callback, param) for i = 1 to MAX_WIZ_CHANNELS if !wiz->channel_proto break - fin - wiz = wiz + t_channel + fin + wiz = wiz + t_channel next if i > MAX_WIZ_CHANNELS return 0 @@ -670,10 +674,10 @@ end def wizSetParam(wiz, param) if wiz->channel_proto == WIZ_PROTO_UDP or wiz->channel_proto == WIZ_PROTO_TCP // - // Update param on this port - // - wiz=>channel_recv_parm = param - return 0 + // Update param on this port + // + wiz=>channel_recv_parm = param + return 0 fin // // Invalid port diff --git a/src/libsrc/dhcp.pla b/src/libsrc/dhcp.pla index 1a4f32f..ef3bc25 100644 --- a/src/libsrc/dhcp.pla +++ b/src/libsrc/dhcp.pla @@ -137,7 +137,7 @@ end def recvDHCP(remip, remport, pkt, len, param) word servopts, maskopts, gwopts, dnsopts - //putip(remip);putc(':');puti(remport);putln + //puts("recvDHCP: ");putip(remip);putc(':');puti(remport);putln //dumpdhcp(pkt) if pkt=>dhcp_xid:0 == $0201 and pkt=>dhcp_xid:2 == $0403 when pkt->dhcp_opts.[parseopts(@pkt->dhcp_opts, 53) + 2] @@ -155,10 +155,10 @@ def recvDHCP(remip, remport, pkt, len, param) iNet:sendUDP(portDHCP, 0, DHCP_SERVER_PORT, @DHCP, @endDHCP - @DHCP) break is DHCP_ACK - optsOP.2 = DHCP_ACK // // Copy parameters to working copy // + optsOP.2 = DHCP_ACK memcpy(@localip, @pkt->dhcp_yourip, IP4ADR_SIZE) maskopts = parseopts(@pkt->dhcp_opts, 1) + 2 if maskopts >= 0 @@ -187,7 +187,7 @@ iNet:getInterfaceHA(@optsCID.3) // // Clear our local IP address // -iNet:setInterfaceIP(@zeros,@ones, @zeros) +iNet:setInterfaceIP(@zeros, @ones, @zeros) // // Prepare to receive DHCP packets from a server // diff --git a/src/libsrc/inet.pla b/src/libsrc/inet.pla index b25e0ed..246e5e8 100644 --- a/src/libsrc/inet.pla +++ b/src/libsrc/inet.pla @@ -33,7 +33,7 @@ end // // External interface to net class. Must be first. // -export byte[t_inet] iNet +res[t_inet] iNet // // List of loadable network device drivers // @@ -87,14 +87,14 @@ def parseIP(ipstr, ipaddr) endstr = ipstr + ^ipstr for i = 0 to 3 - ipstr = ipstr + 1 - while ^ipstr >= '0' and ^ipstr <= '9' and ipstr <= endstr - ipaddr->[i] = ipaddr->[i] * 10 + ^ipstr - '0' ipstr = ipstr + 1 - loop - if ^ipstr <> '.' and ipstr < endstr - return 0 - fin + while ^ipstr >= '0' and ^ipstr <= '9' and ipstr <= endstr + ipaddr->[i] = ipaddr->[i] * 10 + ^ipstr - '0' + ipstr = ipstr + 1 + loop + if ^ipstr <> '.' and ipstr < endstr + return 0 + fin next return i == 3 end @@ -105,11 +105,11 @@ def parseDomain(domstr, msgptr) l = 0 for i = 1 to ^domstr if domstr->[i] == '.' - msgptr->[l] = i - l - 1 - l = i - else - msgptr->[i] = domstr->[i] - fin + msgptr->[l] = i - l - 1 + l = i + else + msgptr->[i] = domstr->[i] + fin next msgptr->[l] = i - l - 1 msgptr = msgptr + i @@ -171,7 +171,7 @@ def iNetResolve(namestr, ipaddr) // // Query Domain Name Server for address // - dnspkt = heapmark // Use heap as working DNS query packet + dnspkt = heapalloc(^namestr + t_dnshdr + 8) // Use heap as working DNS query packet msgptr = dnspkt msgptr=>dnsID = $BEEF msgptr=>dnsCode = $0001 // RD (Recursion Desired) @@ -181,9 +181,8 @@ def iNetResolve(namestr, ipaddr) msgptr=>dnsArCount = 0 msgptr = parseDomain(namestr, msgptr + t_dnshdr) msgptr=>0 = $0100 // BE TYPE = Address - msgptr=>2 = $0100 // BE CLASS = INternet + msgptr=>2 = $0100 // BE CLASS = Internet msglen = msgptr - dnspkt + 4 - heapalloc(msglen) // // Prepare to receive DNS answer from server // @@ -210,21 +209,17 @@ def iNetInit // Look for net hardware // while ^driver - //puts(driver);putln if cmdsys:modexec(driver) >= 0 - break + // + // Get an IP address + // + cmdsys:modexec("DHCP") + iNet:resolveIP = @iNetResolve + return @iNet fin driver = driver + ^driver + 1 loop - if !^driver - return 0 - fin - // - // Get an IP address - // - cmdsys:modexec("DHCP") - iNet:resolveIP = @iNetResolve - return @iNet + return NULL end // diff --git a/src/libsrc/jit16core.pla b/src/libsrc/jit16core.pla index d4417d5..b3ab4be 100644 --- a/src/libsrc/jit16core.pla +++ b/src/libsrc/jit16core.pla @@ -982,14 +982,13 @@ def compiler(defptr)#0 codeptr=>5 = $0350 // BVC +3 codeptr->7 = $49 // EOR #$8000 codeptr=>8 = $8000 - codeptr=>10 = $0510 // BPL +5 - codeptr=>12 = $6868 // PLA; PLA - codeptr->14 = $4C // JMP abs - codeptr=>15 = addrxlate=>[dest] - if not (codeptr->16 & $80) // Unresolved address list - addrxlate=>[dest] = codeptr + 15 - *jitcodeptr + codeptr=>10 = $0310 // BPL +3 + codeptr->12 = $4C // JMP abs + codeptr=>13 = addrxlate=>[dest] + if not (codeptr->14 & $80) // Unresolved address list + addrxlate=>[dest] = codeptr + 13 - *jitcodeptr fin - codeptr = codeptr + 17 + codeptr = codeptr + 5 A_IS_TOS = FALSE break is $A2 // BRLT - FOR/NEXT SPECIFIC TEST & BRANCH @@ -1005,14 +1004,13 @@ def compiler(defptr)#0 codeptr=>3 = $0350 // BVC +3 codeptr->5 = $49 // EOR #$8000 codeptr=>6 = $8000 - codeptr=>8 = $0510 // BPL +5 - codeptr=>10 = $6868 // PLA; PLA - codeptr->12 = $4C // JMP abs - codeptr=>13 = addrxlate=>[dest] - if not (codeptr->14 & $80) // Unresolved address list - addrxlate=>[dest] = codeptr + 13 - *jitcodeptr + codeptr=>8 = $0310 // BPL +3 + codeptr->10 = $4C // JMP abs + codeptr=>11 = addrxlate=>[dest] + if not (codeptr->12 & $80) // Unresolved address list + addrxlate=>[dest] = codeptr + 11 - *jitcodeptr fin - codeptr = codeptr + 15 + codeptr = codeptr + 13 A_IS_TOS = FALSE break is $A4 // INCBRLE - FOR/NEXT SPECIFIC INC & TEST & BRANCH @@ -1055,8 +1053,7 @@ def compiler(defptr)#0 if not (codeptr->14 & $80) // Unresolved address list addrxlate=>[dest] = codeptr + 13 - *jitcodeptr fin - codeptr=>15 = $6868 // PLA; PLA - codeptr = codeptr + 17 + codeptr = codeptr + 15 A_IS_TOS = FALSE break is $A8 // DECBRGR - FOR/NEXT SPECIFIC DEC & TEST & BRANCH @@ -1100,8 +1097,7 @@ def compiler(defptr)#0 if not (codeptr->12 & $80) // Unresolved address list addrxlate=>[dest] = codeptr + 11 - *jitcodeptr fin - codeptr=>13 = $6868 // PLA; PLA - codeptr = codeptr + 15 + codeptr = codeptr + 13 A_IS_TOS = FALSE break is $AC // BRAND - LOGICAL AND SPECIFIC BRANCH diff --git a/src/libsrc/jitcore.pla b/src/libsrc/jitcore.pla index 788b57b..2b0aa13 100644 --- a/src/libsrc/jitcore.pla +++ b/src/libsrc/jitcore.pla @@ -1172,14 +1172,13 @@ def compiler(defptr)#0 codeptr=>6 = $C0F5//+(VX<<8) // SBC ESTKH codeptr=>8 = $0250 // BVC +2 codeptr=>10 = $8049 // EOR #$80 - codeptr=>12 = $0510 // BPL +5 - codeptr=>14 = $E8E8 // INX; INX - codeptr->16 = $4C // JMP abs - codeptr=>17 = addrxlate=>[dest] - if not (codeptr->18 & $80) // Unresolved address list - addrxlate=>[dest] = codeptr + 17 - *jitcodeptr + codeptr=>12 = $0310 // BPL +3 + codeptr->14 = $4C // JMP abs + codeptr=>15 = addrxlate=>[dest] + if not (codeptr->16 & $80) // Unresolved address list + addrxlate=>[dest] = codeptr + 15 - *jitcodeptr fin - codeptr = codeptr + 19 + codeptr = codeptr + 17 A_IS_TOSL = FALSE break is $A2 // BRLT - FOR/NEXT SPECIFIC TEST & BRANCH @@ -1200,14 +1199,13 @@ def compiler(defptr)#0 codeptr=>4 = $C0F5+$0100//+(VX<<8) // SBC ESTKH+1 codeptr=>6 = $0250 // BVC +2 codeptr=>8 = $8049 // EOR #$80 - codeptr=>10 = $0510 // BPL +5 - codeptr=>12 = $E8E8 // INX; INX - codeptr->14 = $4C // JMP abs - codeptr=>15 = addrxlate=>[dest] - if not (codeptr->16 & $80) // Unresolved address list - addrxlate=>[dest] = codeptr + 15 - *jitcodeptr + codeptr=>10 = $0310 // BPL +3 + codeptr->12 = $4C // JMP abs + codeptr=>13 = addrxlate=>[dest] + if not (codeptr->14 & $80) // Unresolved address list + addrxlate=>[dest] = codeptr + 13 - *jitcodeptr fin - codeptr = codeptr + 17 + codeptr = codeptr + 15 A_IS_TOSL = FALSE break is $A4 // INCBRLE - FOR/NEXT SPECIFIC INC & TEST & BRANCH @@ -1259,7 +1257,6 @@ def compiler(defptr)#0 addrxlate=>[dest] = codeptr + 15 - *jitcodeptr fin codeptr = codeptr + 17 - VX = VX + 2 // INX; INX A_IS_TOSL = FALSE break is $A8 // DECBRGR - FOR/NEXT SPECIFIC DEC & TEST & BRANCH @@ -1321,7 +1318,6 @@ def compiler(defptr)#0 addrxlate=>[dest] = codeptr + 13 - *jitcodeptr fin codeptr = codeptr + 15 - VX = VX + 2 // INX; INX A_IS_TOSL = FALSE break is $AC // BRAND - LOGICAL AND SPECIFIC BRANCH diff --git a/src/toolsrc/codegen.pla b/src/toolsrc/codegen.pla index d098aa0..8ad0fb7 100644 --- a/src/toolsrc/codegen.pla +++ b/src/toolsrc/codegen.pla @@ -153,6 +153,26 @@ def emit_code(bval)#0 codeptr++ if codeptr - codebuff > codebufsz; exit_err(ERR_OVER|ERR_CODE|ERR_TABLE); fin end +def emit_slb(offset)#0 + emit_pending_seq + emit_byte($74) + emit_byte(offset) +end +def emit_slw(offset)#0 + emit_pending_seq + emit_byte($76) + emit_byte(offset) +end +def emit_sab(tag, offset)#0 + emit_pending_seq + emit_byte($78) + emit_addr(tag, offset) +end +def emit_saw(tag, offset)#0 + emit_pending_seq + emit_byte($7A) + emit_addr(tag, offset) +end def emit_dlb(offset)#0 emit_pending_seq emit_byte($6C) diff --git a/src/toolsrc/lex.pla b/src/toolsrc/lex.pla index 934c351..616c248 100644 --- a/src/toolsrc/lex.pla +++ b/src/toolsrc/lex.pla @@ -36,7 +36,9 @@ // loop // chrptr = tknptr - 1 // while keywrds[keypos] == tknlen -// i = 1; while i <= tknlen and ^(chrptr + i) == keywrds[keypos + i]; i++; loop +// for i = 1 to tknlen +// if ^(chrptr + i) <> keywrds[keypos + i]; break; fin +// next // if i > tknlen // return keywrds[keypos + keywrds[keypos] + 1] // fin diff --git a/src/toolsrc/parse.c b/src/toolsrc/parse.c index 1301921..7e3c821 100755 --- a/src/toolsrc/parse.c +++ b/src/toolsrc/parse.c @@ -8,7 +8,7 @@ int parse_mods(void); -int infunc = 0, break_tag = 0, cont_tag = 0, stack_loop = 0, infor = 0; +int infunc = 0, break_tag = 0, cont_tag = 0, stack_loop = 0; long infuncvals = 0; t_token prevstmnt; static int lambda_num = 0; @@ -831,7 +831,7 @@ t_opseq *parse_set(t_opseq *codeseq) int parse_stmnt(void) { int tag_prevbrk, tag_prevcnt, tag_else, tag_endif, tag_while, tag_wend, tag_repeat, tag_for, tag_choice, tag_of; - int type, addr, step, cfnvals, prev_for, constsize, casecnt, i; + int type, addr, step, cfnvals, constsize, casecnt, i; int *caseval, *casetag; long constval; char *idptr; @@ -891,8 +891,6 @@ int parse_stmnt(void) parse_error("Missing IF/FIN"); break; case WHILE_TOKEN: - prev_for = infor; - infor = 0; tag_while = tag_new(BRANCH_TYPE); tag_wend = tag_new(BRANCH_TYPE); tag_prevcnt = cont_tag; @@ -917,11 +915,8 @@ int parse_stmnt(void) emit_codetag(tag_wend); break_tag = tag_prevbrk; cont_tag = tag_prevcnt; - infor = prev_for; break; case REPEAT_TOKEN: - prev_for = infor; - infor = 0; tag_prevbrk = break_tag; break_tag = tag_new(BRANCH_TYPE); tag_repeat = tag_new(BRANCH_TYPE); @@ -945,12 +940,9 @@ int parse_stmnt(void) emit_seq(seq); emit_codetag(break_tag); break_tag = tag_prevbrk; - infor = prev_for; break; case FOR_TOKEN: stack_loop += 2; - prev_for = infor; - infor = 1; tag_prevbrk = break_tag; break_tag = tag_new(BRANCH_TYPE); tag_for = tag_new(BRANCH_TYPE); @@ -1029,13 +1021,15 @@ int parse_stmnt(void) emit_decbrge(tag_for); } emit_codetag(break_tag); + if (type & LOCAL_TYPE) + type & BYTE_TYPE ? emit_slb(addr) : emit_slw(addr); + else + type & BYTE_TYPE ? emit_sab(addr, 0, type) : emit_saw(addr, 0, type); + emit_drop(); break_tag = tag_prevbrk; - infor = prev_for; stack_loop -= 2; break; case CASE_TOKEN: - prev_for = infor; - infor = 0; tag_prevbrk = break_tag; break_tag = tag_new(BRANCH_TYPE); tag_choice = tag_new(BRANCH_TYPE); @@ -1111,15 +1105,10 @@ int parse_stmnt(void) free(casetag); emit_codetag(break_tag); break_tag = tag_prevbrk; - infor = prev_for; break; case BREAK_TOKEN: if (break_tag) - { - if (infor) - emit_drop2(); emit_brnch(break_tag); - } else parse_error("BREAK without loop"); break; diff --git a/src/toolsrc/parse.pla b/src/toolsrc/parse.pla index c846fcc..c95f8be 100644 --- a/src/toolsrc/parse.pla +++ b/src/toolsrc/parse.pla @@ -596,7 +596,7 @@ def parse_set(codeseq) return codeseq end def parse_stmnt - byte type, elem_type, elem_size, cfnvals, prev_for + byte type, elem_type, elem_size, cfnvals word seq, fromseq, toseq, tag_prevbrk, tag_prevcnt, tag_else, tag_endif, tag_while, tag_wend word tag_repeat, tag_for, tag_choice, tag_of, idptr, addr, stepdir word caseconst, casecnt, caseval, casetag, i @@ -650,8 +650,6 @@ def parse_stmnt if token <> FIN_TKN; exit_err(ERR_MISS|ERR_CLOSE|ERR_STATE); fin break is WHILE_TKN - prev_for = infor - infor = FALSE tag_while = new_tag(RELATIVE_FIXUP) tag_wend = new_tag(RELATIVE_FIXUP) tag_prevcnt = cont_tag @@ -676,11 +674,8 @@ def parse_stmnt emit_tag(tag_wend) break_tag = tag_prevbrk cont_tag = tag_prevcnt - infor = prev_for break is REPEAT_TKN - prev_for = infor - infor = FALSE tag_repeat = new_tag(RELATIVE_FIXUP) tag_prevbrk = break_tag break_tag = new_tag(RELATIVE_FIXUP) @@ -704,11 +699,8 @@ def parse_stmnt emit_seq(seq) emit_tag(break_tag) break_tag = tag_prevbrk - infor = prev_for break is FOR_TKN - prev_for = infor - infor = TRUE stack_loop = stack_loop + 2 tag_for = new_tag(RELATIVE_FIXUP) tag_prevcnt = cont_tag @@ -782,13 +774,16 @@ def parse_stmnt fin fin emit_tag(break_tag) + if type & LOCAL_TYPE + if type & BYTE_TYPE; emit_slb(addr); else; emit_slw(addr); fin + else + if type & BYTE_TYPE; emit_sab(addr, 0); else; emit_saw(addr, 0); fin + fin + emit_code(DROP_CODE) break_tag = tag_prevbrk stack_loop = stack_loop - 2 - infor = prev_for break is CASE_TKN - prev_for = infor - infor = FALSE tag_prevbrk = break_tag break_tag = new_tag(RELATIVE_FIXUP) tag_choice = new_tag(RELATIVE_FIXUP) @@ -861,11 +856,9 @@ def parse_stmnt heaprelease(caseval) emit_tag(break_tag) break_tag = tag_prevbrk - infor = prev_for break is BREAK_TKN if break_tag - if infor; emit_code(DROP2_CODE); fin emit_branch(break_tag) else exit_err(ERR_INVAL|ERR_STATE) diff --git a/src/toolsrc/plasm.pla b/src/toolsrc/plasm.pla index e129806..82f9e7a 100755 --- a/src/toolsrc/plasm.pla +++ b/src/toolsrc/plasm.pla @@ -298,7 +298,7 @@ const RVALUE = 1 const LAMBDANUM = 16 word strconstbuff word strconstptr -byte infunc, inlambda, infor +byte infunc, inlambda byte stack_loop byte prevstmnt word infuncvals diff --git a/src/vmsrc/apple/plvm01.s b/src/vmsrc/apple/plvm01.s index 8f073ca..3f9b738 100644 --- a/src/vmsrc/apple/plvm01.s +++ b/src/vmsrc/apple/plvm01.s @@ -933,20 +933,16 @@ BRGT LDA ESTKL+1,X SBC ESTKH,X BVS + BPL NOBRNCH -- INX ; DROP FOR VALUES - INX - BNE BRNCH ; BMI BRNCH + BMI BRNCH BRLT LDA ESTKL,X CMP ESTKL+1,X LDA ESTKH,X SBC ESTKH+1,X BVS + BPL NOBRNCH - INX ; DROP FOR VALUES - INX - BNE BRNCH ; BMI BRNCH + BMI BRNCH + BMI NOBRNCH - BPL - + BPL BRNCH DECBRGE DEC ESTKL,X LDA ESTKL,X CMP #$FF @@ -958,9 +954,7 @@ _BRGE LDA ESTKL,X SBC ESTKH+1,X BVS + BPL BRNCH -- INX ; DROP FOR VALUES - INX - BNE NOBRNCH ; BMI NOBRNCH + BMI NOBRNCH INCBRLE INC ESTKL,X BNE _BRLE INC ESTKH,X @@ -970,11 +964,9 @@ _BRLE LDA ESTKL+1,X SBC ESTKH,X BVS + BPL BRNCH - INX ; DROP FOR VALUES - INX - BNE NOBRNCH ; BMI NOBRNCH + BMI NOBRNCH + BMI BRNCH - BPL - + BPL NOBRNCH SUBBRGE LDA ESTKL+1,X SEC SBC ESTKL,X diff --git a/src/vmsrc/apple/plvm02.s b/src/vmsrc/apple/plvm02.s index a24cabf..6df5f81 100755 --- a/src/vmsrc/apple/plvm02.s +++ b/src/vmsrc/apple/plvm02.s @@ -1298,20 +1298,16 @@ BRGT LDA ESTKL+1,X SBC ESTKH,X BVS + BPL NOBRNCH -- INX ; DROP FOR VALUES - INX - BNE BRNCH ; BMI BRNCH + BMI BRNCH BRLT LDA ESTKL,X CMP ESTKL+1,X LDA ESTKH,X SBC ESTKH+1,X BVS + BPL NOBRNCH - INX ; DROP FOR VALUES - INX - BNE BRNCH ; BMI BRNCH + BMI BRNCH + BMI NOBRNCH - BPL - + BPL BRNCH DECBRGE DEC ESTKL,X LDA ESTKL,X CMP #$FF @@ -1323,9 +1319,7 @@ _BRGE LDA ESTKL,X SBC ESTKH+1,X BVS + BPL BRNCH -- INX ; DROP FOR VALUES - INX - BNE NOBRNCH ; BMI NOBRNCH + BMI NOBRNCH INCBRLE INC ESTKL,X BNE _BRLE INC ESTKH,X @@ -1335,11 +1329,9 @@ _BRLE LDA ESTKL+1,X SBC ESTKH,X BVS + BPL BRNCH - INX ; DROP FOR VALUES - INX - BNE NOBRNCH ; BMI NOBRNCH + BMI NOBRNCH + BMI BRNCH - BPL - + BPL NOBRNCH SUBBRGE LDA ESTKL+1,X SEC SBC ESTKL,X diff --git a/src/vmsrc/apple/plvm03.s b/src/vmsrc/apple/plvm03.s index 70df616..d6f30ad 100755 --- a/src/vmsrc/apple/plvm03.s +++ b/src/vmsrc/apple/plvm03.s @@ -1262,32 +1262,16 @@ BRGT LDA ESTKL+1,X CMP ESTKL,X LDA ESTKH+1,X SBC ESTKH,X - BVS + - BPL NOBRNCH -- INX ; DROP FOR VALUES - INX - BNE BRNCH ; BMI BRNCH + BVS ++ +- BPL NOBRNCH + BMI BRNCH BRLT LDA ESTKL,X CMP ESTKL+1,X LDA ESTKH,X SBC ESTKH+1,X - BVS + + BVS ++ BPL NOBRNCH - BMI - -+ BMI NOBRNCH - BPL - -INCBRLE INC ESTKL,X - BNE _BRLE - INC ESTKH,X -_BRLE LDA ESTKL+1,X - CMP ESTKL,X - LDA ESTKH+1,X - SBC ESTKH,X - BVS + - BPL BRNCH -- INX ; DROP FOR VALUES - INX - BNE NOBRNCH ; BMI NOBRNCH + BMI BRNCH DECBRGE DEC ESTKL,X LDA ESTKL,X CMP #$FF @@ -1297,11 +1281,19 @@ _BRGE LDA ESTKL,X + CMP ESTKL+1,X LDA ESTKH,X SBC ESTKH+1,X - BVS + + BVS - BPL BRNCH - BMI - -+ BMI BRNCH - BPL - + BMI NOBRNCH +INCBRLE INC ESTKL,X + BNE _BRLE + INC ESTKH,X +_BRLE LDA ESTKL+1,X + CMP ESTKL,X + LDA ESTKH+1,X + SBC ESTKH,X + BVS - +++ BPL BRNCH + BMI NOBRNCH SUBBRGE LDA ESTKL+1,X SEC SBC ESTKL,X diff --git a/src/vmsrc/apple/plvm802.s b/src/vmsrc/apple/plvm802.s index c8fb981..3fa5ee2 100644 --- a/src/vmsrc/apple/plvm802.s +++ b/src/vmsrc/apple/plvm802.s @@ -1543,21 +1543,15 @@ BRGT LDA NOS,S SBC TOS,S BVS + BPL NOBRNCH - PLA ; DROP FOR VALUES - PLA - BRA BRNCH ; BMI BRNCH + BMI BRNCH BRLT LDA TOS,S SEC SBC NOS,S BVS + BPL NOBRNCH - PLA ; DROP FOR VALUES - PLA - BRA BRNCH ; BMI BRNCH + BMI BRNCH + BMI NOBRNCH - PLA ; DROP FOR VALUES - PLA - BRA BRNCH ; BMI BRNCH + BPL BRNCH DECBRGE PLA DEC PHA @@ -1566,9 +1560,7 @@ _BRGE LDA TOS,S SBC NOS,S BVS + BPL BRNCH - PLA ; DROP FOR VALUES - PLA - BRA NOBRNCH ; BMI NOBRNCH + BMI NOBRNCH INCBRLE PLA INC PHA @@ -1577,13 +1569,9 @@ _BRLE LDA NOS,S SBC TOS,S BVS + BPL BRNCH - PLA ; DROP FOR VALUES - PLA - BRA NOBRNCH ; BMI NOBRNCH + BMI NOBRNCH + BMI BRNCH - PLA ; DROP FOR VALUES - PLA - BRA NOBRNCH ; BMI NOBRNCH + BPL NOBRNCH SUBBRGE LDA NOS,S SEC SBC TOS,S diff --git a/src/vmsrc/apple/plvmjit02.s b/src/vmsrc/apple/plvmjit02.s index 58c0413..3e10cd2 100755 --- a/src/vmsrc/apple/plvmjit02.s +++ b/src/vmsrc/apple/plvmjit02.s @@ -1770,20 +1770,16 @@ BRGT LDA ESTKL+1,X SBC ESTKH,X BVS + BPL NOBRNCH -- INX ; DROP FOR VALUES - INX - BNE BRNCH ; BMI BRNCH + BMI BRNCH BRLT LDA ESTKL,X CMP ESTKL+1,X LDA ESTKH,X SBC ESTKH+1,X BVS + BPL NOBRNCH - INX ; DROP FOR VALUES - INX - BNE BRNCH ; BMI BRNCH + BMI BRNCH + BMI NOBRNCH - BPL - + BPL BRNCH DECBRGE DEC ESTKL,X LDA ESTKL,X CMP #$FF @@ -1795,9 +1791,7 @@ _BRGE LDA ESTKL,X SBC ESTKH+1,X BVS + BPL BRNCH -- INX ; DROP FOR VALUES - INX - BNE NOBRNCH ; BMI NOBRNCH + BMI NOBRNCH INCBRLE INC ESTKL,X BNE _BRLE INC ESTKH,X @@ -1807,11 +1801,9 @@ _BRLE LDA ESTKL+1,X SBC ESTKH,X BVS + BPL BRNCH - INX ; DROP FOR VALUES - INX - BNE NOBRNCH ; BMI NOBRNCH + BMI NOBRNCH + BMI BRNCH - BPL - + BPL NOBRNCH SUBBRGE LDA ESTKL+1,X SEC SBC ESTKL,X diff --git a/src/vmsrc/c64/plvmc64.s b/src/vmsrc/c64/plvmc64.s index a26ba10..6681817 100644 --- a/src/vmsrc/c64/plvmc64.s +++ b/src/vmsrc/c64/plvmc64.s @@ -1047,20 +1047,16 @@ BRGT LDA ESTKL+1,X SBC ESTKH,X BVS + BPL NOBRNCH -- INX ; DROP FOR VALUES - INX - BNE BRNCH ; BMI BRNCH + BMI BRNCH BRLT LDA ESTKL,X CMP ESTKL+1,X LDA ESTKH,X SBC ESTKH+1,X BVS + BPL NOBRNCH - INX ; DROP FOR VALUES - INX - BNE BRNCH ; BMI BRNCH + BMI BRNCH + BMI NOBRNCH - BPL - + BPL BRNCH DECBRGE DEC ESTKL,X LDA ESTKL,X CMP #$FF @@ -1072,9 +1068,7 @@ _BRGE LDA ESTKL,X SBC ESTKH+1,X BVS + BPL BRNCH -- INX ; DROP FOR VALUES - INX - BNE NOBRNCH ; BMI NOBRNCH + BMI NOBRNCH INCBRLE INC ESTKL,X BNE _BRLE INC ESTKH,X @@ -1084,11 +1078,9 @@ _BRLE LDA ESTKL+1,X SBC ESTKH,X BVS + BPL BRNCH - INX ; DROP FOR VALUES - INX - BNE NOBRNCH ; BMI NOBRNCH + BMI NOBRNCH + BMI BRNCH - BPL - + BPL NOBRNCH SUBBRGE LDA ESTKL+1,X SEC SBC ESTKL,X