From 4d9d7b5600ab615d68f671df5f8bc6c9fe4a5a09 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Wed, 24 Apr 2019 11:03:58 -0400 Subject: add pause to curses, remove unfinished calculator frontend --- .../calculator/CEdev/include/fasmg-ez80/ez80.inc | 862 --------------------- .../calculator/CEdev/include/fasmg-ez80/ld.fasmg | 759 ------------------ .../CEdev/include/fasmg-ez80/ti84pceg.inc | 61 -- .../CEdev/include/fasmg-ez80/tiformat.inc | 105 --- 4 files changed, 1787 deletions(-) delete mode 100644 frontends/calculator/CEdev/include/fasmg-ez80/ez80.inc delete mode 100644 frontends/calculator/CEdev/include/fasmg-ez80/ld.fasmg delete mode 100644 frontends/calculator/CEdev/include/fasmg-ez80/ti84pceg.inc delete mode 100644 frontends/calculator/CEdev/include/fasmg-ez80/tiformat.inc (limited to 'frontends/calculator/CEdev/include/fasmg-ez80') diff --git a/frontends/calculator/CEdev/include/fasmg-ez80/ez80.inc b/frontends/calculator/CEdev/include/fasmg-ez80/ez80.inc deleted file mode 100644 index 73c2175..0000000 --- a/frontends/calculator/CEdev/include/fasmg-ez80/ez80.inc +++ /dev/null @@ -1,862 +0,0 @@ -define @ez80 @ez80 -macro @ez80.suffix @l, @il* - @ez80.l = @l - @ez80.il = @il - @ez80.lil = @ez80.l or @ez80.il shl 1 - @ez80.pre = @ez80.lil or @ez80.lil shl 3 or 100o -end macro -macro @ez80.byte @values*& - db @values -end macro -macro @ez80.offset @value* - local value - value = @value - if elementsof value - err 'invalid offset' - else if value < -200o | 200o <= value - err 'offset is out of range' - end if - db value -end macro -macro @ez80.word @value* - local value - value = @value - if elementsof value - err 'invalid immediate' - end if - emit word + @ez80.il: @value -end macro -macro @ez80.idxpre @regs*& - local pre - iterate @reg, @regs - pre = @reg metadata 1 scale 1 - if pre > 300o - @ez80.byte pre - break - end if - end iterate -end macro -macro @ez80.idxoff @reg* - local reg - reg = @reg - if reg metadata 1 scale 1 > 300o - @ez80.offset @reg scale 0 - else if reg scale 0 - err 'invalid arguments' - end if -end macro -macro @ez80.emit @values*& - if defined @ez80.pre - db @ez80.pre - end if - iterate @value, @values - @ez80.@value - end iterate -end macro -macro @ez80.nest @inst*& - if defined @ez80.pre - @ez80.pre =: @ez80.pre - end if - @inst -end macro -macro @ez80.check @ind*, @expr& - match @left ) @right, <@expr> - match @ ( @mid, <@left> - @ez80.check @ind, @mid @right - else - @ind =: 0 - end match - else - @ind =: 1 - end match -end macro -macro @ez80.classify @val, @ind*, @arg& - match, @arg - @ind =: 0 - else - @val =: @arg - match ( @ ), @arg - @ez80.check @ind, @ - else - @ind =: 0 - end match - end match -end macro - -long? = 3 -; FIXME: dup relocations -macro dw? @values*& - if @ez80.adl - emit word?: @values - else - match left =dup? right, @values - emit word?: @values - else - iterate @value, @values - @ez80.word @value - end iterate - end match - end if -end macro -macro dl? @values*& - if @ez80.adl - match left =dup? right, @values - emit long?: @values - else - iterate @value, @values - @ez80.word @value - end iterate - end match - else - emit long?: @values - end if -end macro -iterate @name, dw, rw, dl, rl - struc (name) @name? @values*& - label name: long? - @name? @values - end struc -end iterate -macro assume? @expr* - match =adl? == @adl, @expr - local adl - adl = @adl - if adl = adl and 1 - @ez80.l = adl - @ez80.il = adl - @ez80.adl = adl - else - err 'adl assume should be 0 or 1' - end if - else - err 'invalid assume statement' - end match -end macro -assume? adl = 1 - -element @ez80.breg -element b?: @ez80.breg * 003o + 030o -element nz?: @ez80.breg * 010o + 001o -element z?: @ez80.breg * 010o + 011o -element nc?: @ez80.breg * 010o + 021o -element c?: @ez80.breg * 003o + 031o -element po?: @ez80.breg * 010o + 041o -element pe?: @ez80.breg * 010o + 051o -nv? = po? -v? = pe? -element p?: @ez80.breg * 010o + 061o -element m?: @ez80.breg * 010o + 071o -element d?: @ez80.breg * 003o + 032o -element e?: @ez80.breg * 003o + 033o -element h?: @ez80.breg * 003o + 034o -element ixh?: @ez80.breg * 335o + 034o -element iyh?: @ez80.breg * 375o + 034o -element l?: @ez80.breg * 003o + 035o -element ixl?: @ez80.breg * 335o + 035o -element iyl?: @ez80.breg * 375o + 035o -element f?: @ez80.breg * 002o + 036o -element a?: @ez80.breg * 003o + 037o - -element @ez80.irmb -element i?: @ez80.irmb * 107o + 127o -element r?: @ez80.irmb * 117o + 137o -element mb?: @ez80.irmb * 155o + 156o - -element @ez80.wreg -element bc?: @ez80.wreg * 007o + 000o -element de?: @ez80.wreg * 007o + 020o -element hl?: @ez80.wreg * 007o + 040o -element ix?: @ez80.wreg * 335o + 040o -element iy?: @ez80.wreg * 375o + 040o -element sp?: @ez80.wreg * 006o + 060o -element af?: @ez80.wreg * 001o + 060o -element af'? - -@ez80.is_reg equ metadata 1 element 1 eq - -macro inst! @name*, @params& - restore @name? - define @name? @name? - @ez80.oplist equ @name? - namespace @name? - macro s? @args& - @ez80.suffix 0, @ez80.il - @name? @args - end macro - macro l? @args& - @ez80.suffix 1, @ez80.il - @name? @args - end macro - macro is? @args& - @ez80.suffix @ez80.l, 0 - @name? @args - end macro - macro il? @args& - @ez80.suffix @ez80.l, 1 - @name? @args - end macro - macro sis? @args& - @ez80.suffix 0, 0 - @name? @args - end macro - macro lis? @args& - @ez80.suffix 1, 0 - @name? @args - end macro - macro sil? @args& - @ez80.suffix 0, 1 - @name? @args - end macro - macro lil? @args& - @ez80.suffix 1, 1 - @name? @args - end macro - end namespace - local @temp - virtual - iterate @param, @params - match @arg @, @param* - @temp = string `@arg shr 8 - db 'local ', @temp, ', ', @temp, 'ind', 10 - match @arg &, @param - db 'iterate @, ', `@arg, 10, 9, 'indx %%-%+1', 10, 9 - end match - db '@ez80.classify ', @temp, ', ', @temp, 'ind, ' - match @@ &, @param - db '@', 10, 'end iterate', 10 - else - db `@arg, 10 - end match - end match - end iterate - load @temp: $ - $$ from $$ - end virtual - esc macro @name?: @params - local before, after, noerr - label before - eval @temp -end macro -macro end?.inst! - label after - if ~defined noerr & before = after - err 'invalid arguments' - end if - restore @ez80.pre - assume? adl = @ez80.adl - esc end macro -end macro - -iterate <@name, @opc*>, \ - nop, 000o, \ - rlca, 007o, \ - rrca, 017o, \ - rla, 027o, \ - rra, 037o, \ - daa, 047o, \ - cpl, 057o, \ - scf, 067o, \ - ccf, 077o, \ - halt, 166o, \ - exx, 331o, \ - di, 363o, \ - ei, 373o, \ - neg, <355o, 104o>, \ - retn, <355o, 105o>, \ - reti, <355o, 115o>, \ - rrd, <355o, 147o>, \ - rld, <355o, 157o>, \ - slp, <355o, 166o>, \ - stmix, <355o, 175o>, \ - rsmix, <355o, 176o>, \ - inim, <355o, 202o>, \ - otim, <355o, 203o>, \ - ini2, <355o, 204o>, \ - indm, <355o, 212o>, \ - otdm, <355o, 213o>, \ - ind2, <355o, 214o>, \ - inimr, <355o, 222o>, \ - otimr, <355o, 223o>, \ - ini2r, <355o, 224o>, \ - indmr, <355o, 232o>, \ - otdmr, <355o, 233o>, \ - ind2r, <355o, 234o>, \ - ldi, <355o, 240o>, \ - cpi, <355o, 241o>, \ - ini, <355o, 242o>, \ - outi, <355o, 243o>, \ - outi2, <355o, 244o>, \ - ldd, <355o, 250o>, \ - cpd, <355o, 251o>, \ - ind, <355o, 252o>, \ - outd, <355o, 253o>, \ - outd2, <355o, 254o>, \ - ldir, <355o, 260o>, \ - cpir, <355o, 261o>, \ - inir, <355o, 262o>, \ - otir, <355o, 263o>, \ - oti2r, <355o, 264o>, \ - lddr, <355o, 270o>, \ - cpdr, <355o, 271o>, \ - indr, <355o, 272o>, \ - otdr, <355o, 273o>, \ - otd2r, <355o, 274o>, \ - inirx, <355o, 302o>, \ - otirx, <355o, 303o>, \ - indrx, <355o, 312o>, \ - otdrx, <355o, 313o> - inst @name - @ez80.emit - end inst -end iterate - -iterate @name, inc, dec - inst @name, @reg* - if regind - if reg relativeto reg element 1 & reg @ez80.is_reg @ez80.wreg \ - & reg metadata 1 scale 0 = 040o - @ez80.emit idxpre reg, byte 063o + %, idxoff reg - end if - else if reg eq reg element 1 - if reg @ez80.is_reg @ez80.wreg & reg metadata 1 scale 1 and 004o - @ez80.emit idxpre reg, byte reg metadata 1 scale 0 - 005o \ - + % shl 3 - else if reg @ez80.is_reg @ez80.breg \ - & reg metadata 1 scale 1 and 001o - @ez80.emit idxpre reg, byte reg metadata 1 scale 0 shl 3 \ - and 070o or % + 3 - end if - end if - end inst -end iterate - -inst ex, @arg1, @arg2* - if arg1ind - if arg2ind - err 'invalid indirection' - else if arg1 eq sp? & arg2 eq arg2 element 1 \ - & arg2 @ez80.is_reg @ez80.wreg & arg2 metadata 1 scale 0 = 040o - @ez80.emit idxpre arg2, byte 343o - end if - else if arg2ind - @ez80.nest ex? @arg2, @arg1 - else if (arg1 eq af? & arg2 eq af'?) | (arg1 eq af'? & arg2 eq af?) - @ez80.emit byte 010o - else if (arg1 eq de? & arg2 eq hl?) | (arg1 eq hl? & arg2 eq de?) - @ez80.emit byte 353o - end if -end inst - -inst djnz, @addr* - if addrind - err 'invalid indirection' - else - @ez80.emit byte 020o, offset addr - after - end if -end inst -inst jr, @arg1*, @arg2 - if arg1ind | arg2ind - err 'invalid indirection' - else if ~defined arg2 - @ez80.emit byte 030o, offset arg1 - after - else - if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \ - & arg1 metadata 1 scale 0 and 047o = 001o - @ez80.emit byte arg1 metadata 1 scale 0 and 030o or 040o, \ - offset arg2 - after - end if - end if -end inst -inst jq, @arg1*, @arg2 - local off, keep - if arg1ind | arg2ind - err 'invalid indirection' - else if ~defined arg2 - off = arg1 - before - 2 - if defined @ez80.pre - off = off - 1 - end if - if defined noerr & ~arg1 eq after | defined keep - define keep - end if - if defined after & arg1 eq after & ~defined keep - define noerr - else if ~elementsof off & -200o <= off & off < 200o - @ez80.emit byte 030o, offset off - else - @ez80.emit byte 303o, word arg1 - end if - else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \ - & arg1 metadata 1 scale 0 and 007o = 001o - off = arg2 - before - 2 - if defined @ez80.pre - off = off - 1 - end if - if defined noerr & ~arg2 eq after | defined keep - define keep - end if - if defined after & arg2 eq after & ~defined keep - define noerr - else if arg1 metadata 1 scale 0 < 040o & ~elementsof off & -200o <= off & off < 200o - @ez80.emit byte arg1 metadata 1 scale 0 and 030o or 040o, \ - offset off - else - @ez80.emit byte arg1 metadata 1 scale 0 and 070o or 302o, \ - word arg2 - end if - end if -end inst - -inst ld, @dst, @src* - local opc - if dstind & srcind - err 'invalid indirection' - else if dstind - if dst relativeto dst element 1 & dst @ez80.is_reg @ez80.wreg - if dst metadata 1 scale 0 = 040o - if src eq src element 1 & src @ez80.is_reg @ez80.breg \ - & src metadata 1 scale 1 = 003o - @ez80.emit idxpre dst, byte src metadata 1 scale 0 \ - and 007o or 160o, idxoff dst - else if src eq src element 1 & src @ez80.is_reg @ez80.wreg \ - & src metadata 1 scale 1 and 005o = 005o - opc = src metadata 1 scale 0 or 017o - if src metadata 1 scale 1 > 300o - if dst metadata 1 scale 1 xor src metadata 1 scale 1 \ - and 040o - opc = opc + 017o - else - opc = opc + 020o - end if - end if - if dst metadata 1 scale 1 > 300o - @ez80.emit idxpre dst, byte opc, idxoff dst - else - @ez80.emit - end if - else - @ez80.emit idxpre dst, byte 066o, idxoff dst, byte src - end if - else if src eq a? & dst metadata 1 scale 0 < 040o - @ez80.emit byte dst metadata 1 scale 0 or 002o - end if - else if src eq a? - @ez80.emit byte 062o, word dst - else if src eq src element 1 & src @ez80.is_reg @ez80.wreg \ - & src metadata 1 scale 1 and 004o - if src metadata 1 scale 0 = 040o - @ez80.emit idxpre src, byte 042o, word dst - else - @ez80.emit , word dst - end if - end if - else if srcind - if ~dst eq dst element 1 - else if src relativeto src element 1 & src @ez80.is_reg @ez80.wreg - if src metadata 1 scale 0 = 040o - if dst @ez80.is_reg @ez80.breg & dst metadata 1 scale 1 = 003o - @ez80.emit idxpre src, byte dst metadata 1 scale 0 \ - shl 3 and 070o or 106o, idxoff src - else if dst @ez80.is_reg @ez80.wreg \ - & dst metadata 1 scale 1 and 005o = 005o - opc = dst metadata 1 scale 0 or 007o - if dst metadata 1 scale 1 > 300o - if dst metadata 1 scale 1 xor src metadata 1 scale 1 \ - and 040o - opc = opc + 012o - else - opc = opc + 020o - end if - end if - if src metadata 1 scale 1 > 300o - @ez80.emit idxpre src, byte opc, idxoff src - else - @ez80.emit - end if - end if - else if dst eq a? & src metadata 1 scale 0 < 040o - @ez80.emit byte src metadata 1 scale 0 or 012o - end if - else if dst eq a? - @ez80.emit byte 072o, word src - else if dst @ez80.is_reg @ez80.wreg & dst metadata 1 scale 1 and 004o - if dst metadata 1 scale 0 = 040o - @ez80.emit idxpre dst, byte 052o, word src - else - @ez80.emit , word src - end if - end if - else if dst eq dst element 1 - if dst @ez80.is_reg @ez80.breg - if src eq src element 1 & src @ez80.is_reg @ez80.breg \ - & dst metadata 1 scale 1 and src metadata 1 scale 1 and 001o \ - & (dst metadata 1 scale 0 xor src metadata 1 scale 0 and 006o \ - | dst metadata 1 scale 1 = src metadata 1 scale 1) \ - & (~dst eq src | dst metadata 1 scale 0 > 033o) - @ez80.emit , \ - byte dst metadata 1 scale 0 shl 3 and 070o \ - + src metadata 1 scale 0 and 007o or 100o - else if src eq src element 1 & src @ez80.is_reg @ez80.irmb \ - & dst eq a? - @ez80.emit - else if dst metadata 1 scale 1 and 001o - @ez80.emit idxpre dst, \ - byte dst metadata 1 scale 0 shl 3 and 070o or 006o, \ - byte src - end if - else if dst @ez80.is_reg @ez80.wreg & dst metadata 1 scale 1 and 004o - if dst eq sp? & src eq src element 1 & src @ez80.is_reg @ez80.wreg \ - & src metadata 1 scale 0 = 040o - @ez80.emit idxpre src, byte 371o - else if dst eq hl? & src eq i? - @ez80.emit - else - @ez80.emit idxpre dst, byte dst metadata 1 scale 0 or 001o, \ - word src - end if - else if dst @ez80.is_reg @ez80.irmb & src eq a? - @ez80.emit - else if dst eq i? & src eq hl? - @ez80.emit - end if - end if -end inst - -inst add, @arg1*, @arg2 - if ~defined arg2 - @ez80.nest a?, @arg1 - else if arg1ind - err 'invalid indirection' - else if arg1 eq a? - if arg2ind - if arg2 relativeto arg2 element 1 & arg2 @ez80.is_reg @ez80.wreg \ - & arg2 metadata 1 scale 0 = 040o - @ez80.emit idxpre arg2, byte 206o, idxoff arg2 - end if - else if arg2 eq arg2 element 1 & arg2 @ez80.is_reg @ez80.breg \ - & arg2 metadata 1 scale 1 and 001o - @ez80.emit idxpre arg2, byte arg2 metadata 1 scale 0 and 007o \ - or 200o - else - @ez80.emit - end if - else if arg2ind - err 'invalid indirection' - else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.wreg \ - & arg2 eq arg2 element 1 & arg1 @ez80.is_reg @ez80.wreg \ - & arg1 metadata 1 scale 0 = 040o & arg2 metadata 1 scale 1 and 004o \ - & (arg1 metadata 1 scale 0 <> arg2 metadata 1 scale 0 \ - | arg1 metadata 1 scale 1 = arg2 metadata 1 scale 1) - @ez80.emit idxpre arg1, byte arg2 metadata 1 scale 0 or 011o - end if -end inst -iterate @name, adc, sbc - inst @name, @arg1*, @arg2 - if ~defined arg2 - if arg1 @ez80.is_reg @ez80.wreg - @ez80.nest hl?, @arg1 - else - @ez80.nest a?, @arg1 - end if - else if arg1ind - err 'invalid indirection' - else if arg1 eq a? - if arg2ind - if arg2 relativeto arg2 element 1 \ - & arg2 @ez80.is_reg @ez80.wreg \ - & arg2 metadata 1 scale 0 = 040o - @ez80.emit idxpre arg2, byte 176o + % shl 4, idxoff arg2 - end if - else if arg2 eq arg2 element 1 & arg2 @ez80.is_reg @ez80.breg \ - & arg2 metadata 1 scale 1 and 001o - @ez80.emit idxpre arg2, byte arg2 metadata 1 scale 0 and 007o \ - or 170o + % shl 4 - else - @ez80.emit - end if - else if arg2ind - err 'invalid indirection' - else if arg1 eq hl? & arg2 eq arg2 element 1 \ - & arg2 @ez80.is_reg @ez80.wreg \ - & arg2 metadata 1 scale 1 and 002o - @ez80.emit - end if - end inst -end iterate -iterate <@name, @opc*>, \ - sub, 220o, \ - and, 240o, \ - xor, 250o, \ - or, 260o, \ - cp, 270o - inst @name, @arg1*, @arg2 - if ~defined arg2 - if arg1ind - if arg1 relativeto arg1 element 1 \ - & arg1 @ez80.is_reg @ez80.wreg \ - & arg1 metadata 1 scale 0 = 040o - @ez80.emit idxpre arg1, byte @opc or 006o, idxoff arg1 - end if - else if arg1 relativeto arg1 element 1 \ - & arg1 @ez80.is_reg @ez80.breg \ - & arg1 metadata 1 scale 1 and 001o - @ez80.emit idxpre arg1, byte arg1 metadata 1 scale 0 and 007o \ - or @opc - else - @ez80.emit - end if - else if arg1ind - err 'invalid indirection' - else if arg1 eq a? - @ez80.nest @name? @arg2 - end if - end inst -end iterate -inst tst, @arg1*, @arg2 - if ~defined arg2 - if arg1ind - if arg1 eq hl? - @ez80.emit - end if - else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \ - & arg1 metadata 1 scale 1 = 003o - @ez80.emit - else - @ez80.emit - end if - else if arg1ind - err 'invalid indirection' - else if arg1 eq a? - @ez80.nest tst? @arg2 - end if -end inst - -inst ret, @cond - if ~defined cond - @ez80.emit byte 311o - else if condind - err 'invalid indirection' - else if cond eq cond element 1 & cond @ez80.is_reg @ez80.breg \ - & cond metadata 1 scale 0 and 007o = 001o - @ez80.emit byte cond metadata 1 scale 0 and 070o or 300o - end if -end inst -iterate @name, pop, push - inst @name, @reg*& - while defined reg + regind - if regind - err 'invalid indirection' - else if reg eq reg element 1 & reg @ez80.is_reg @ez80.wreg \ - & reg metadata 1 scale 1 and 001o - @ez80.emit idxpre reg, \ - byte reg metadata 1 scale 0 + 275o + % shl 2 - else if `@name = 'push' - @ez80.nest pea? reg - else - err 'invalid argument' - end if - restore reg, regind - end while - end inst -end iterate - -inst jp, @arg1*, @arg2 - if ~defined arg2 - if ~arg1ind - @ez80.emit byte 303o, word arg1 - else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.wreg \ - & arg1 metadata 1 scale 0 = 040o - @ez80.emit idxpre arg1, byte 351o - end if - else if arg1ind | arg2ind - err 'invalid indirection' - else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \ - & arg1 metadata 1 scale 0 and 007o = 001o - @ez80.emit byte arg1 metadata 1 scale 0 and 070o or 302o, word arg2 - end if -end inst -inst call, @arg1*, @arg2 - if arg1ind | arg2ind - err 'invalid indirection' - else if ~defined arg2 - @ez80.emit byte 315o, word arg1 - else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \ - & arg1 metadata 1 scale 0 and 007o = 001o - @ez80.emit byte arg1 metadata 1 scale 0 and 070o or 304o, word arg2 - end if -end inst -inst rst, @addr* - if addrind - err 'invalid indirection' - else if addr = addr and 070o - @ez80.emit byte addr or 307o - else - err 'invalid rst target' - end if -end inst - -iterate <@name, @opc*>, \ - rlc, 000o, \ - rrc, 010o, \ - rl, 020o, \ - rr, 030o, \ - sla, 040o, \ - sra, 050o, \ - srl, 070o - inst @name, @reg* - if `@name = 'rl' & ~defined @ez80.pre & ~elementsof reg - rb long? * reg - define noerr - else if regind - if reg relativeto reg element 1 & reg @ez80.is_reg @ez80.wreg \ - & reg metadata 1 scale 0 = 040o - @ez80.emit idxpre reg, byte 313o, idxoff reg, byte @opc or 006o - end if - else if reg eq reg element 1 & reg @ez80.is_reg @ez80.breg \ - & reg metadata 1 scale 1 = 003o - @ez80.emit - end if - end inst -end iterate -iterate @name, bit, res, set - inst @name, @bit, @reg* - if bitind - err 'invalid indirection' - else if regind - if reg relativeto reg element 1 & reg @ez80.is_reg @ez80.wreg \ - & reg metadata 1 scale 0 = 040o - @ez80.emit idxpre reg, byte 313o, idxoff bit shr 3 + reg, \ - byte bit shl 3 and 070o or % shl 6 or 006o - end if - else if reg eq reg element 1 - if reg @ez80.is_reg @ez80.breg & reg metadata 1 scale 1 = 003o \ - & bit = bit and 007o - @ez80.emit - else if reg @ez80.is_reg @ez80.wreg \ - & reg metadata 1 scale 1 = 007o & bit = bit and 017o - @ez80.emit - end if - end if - end inst -end iterate - -inst out, @port, @reg* - if ~portind - err 'missing indirection' - else if regind - err 'invalid indirection' - else if port eq bc? | port eq c? - if reg eq reg element 1 & reg @ez80.is_reg @ez80.breg \ - & reg metadata 1 scale 1 = 003o - @ez80.emit - else if ~reg - @ez80.emit - end if - else if reg eq a? - @ez80.emit - end if -end inst -inst in, @reg*, @port - if ~defined port - @ez80.nest in? f?, @reg - else if regind - err 'invalid indirection' - else if ~portind - err 'missing indirection' - else if port eq bc? | port eq c? & reg eq reg element 1 \ - & reg @ez80.is_reg @ez80.breg & reg metadata 1 scale 1 and 002o - @ez80.emit - else if reg eq a? - @ez80.emit - end if -end inst -inst in0, @reg*, @port - if ~defined port - @ez80.nest in0? f?, @reg - else if regind - err 'invalid indirection' - else if ~portind - err 'missing indirection' - else if reg eq reg element 1 & reg @ez80.is_reg @ez80.breg \ - & reg metadata 1 scale 1 and 002o - @ez80.emit - end if -end inst -inst out0, @port, @reg* - if ~portind - err 'missing indirection' - else if regind - err 'invalid indirection' - else if reg eq reg element 1 & reg @ez80.is_reg @ez80.breg \ - & reg metadata 1 scale 1 = 003o - @ez80.emit - end if -end inst -inst tstio, @src* - if srcind - err 'invalid indirection' - else - @ez80.emit - end if -end inst - -inst lea, @dst, @src* - if dstind | srcind - err 'invalid indirection' - else if dst eq dst element 1 & src relativeto src element 1 \ - & dst @ez80.is_reg @ez80.wreg & src @ez80.is_reg @ez80.wreg \ - & dst metadata 1 scale 0 <> 060o & src metadata 1 scale 1 > 300o - local opc - if dst metadata 1 scale 1 and 002o - opc = src metadata 1 scale 1 shr 5 and 001o \ - or dst metadata 1 scale 0 or 002o - else if dst relativeto src - opc = dst metadata 1 scale 1 shr 5 and 001o or 062o - else - opc = dst metadata 1 scale 1 shr 5 and 001o or 124o - end if - @ez80.emit , offset src scale 0 - end if -end inst -inst pea, @src* - if srcind - err 'invalid indirection' - else if src relativeto src element 1 & src @ez80.is_reg @ez80.wreg \ - & src metadata 1 scale 1 > 300o - @ez80.emit , \ - offset src scale 0 - end if -end inst - -inst im, @mode* - if modeind - err 'invalid indirection' - else if mode = 0 - @ez80.emit - else if mode = 1 - @ez80.emit - else if mode = 2 - @ez80.emit - else - err 'invalid mode' - end if -end inst - -inst mlt, @reg* - if regind - err 'invalid indirection' - else if reg eq reg element 1 & reg @ez80.is_reg @ez80.wreg \ - & reg metadata 1 scale 1 and 002o - @ez80.emit - end if -end inst - -purge inst -purge end?.inst diff --git a/frontends/calculator/CEdev/include/fasmg-ez80/ld.fasmg b/frontends/calculator/CEdev/include/fasmg-ez80/ld.fasmg deleted file mode 100644 index 3c3e168..0000000 --- a/frontends/calculator/CEdev/include/fasmg-ez80/ld.fasmg +++ /dev/null @@ -1,759 +0,0 @@ -assert "\"" = '"' ; check for patched fasmg -include 'tiformat.inc' -define ez80 ez80 -namespace ez80 - include 'ez80.inc' -end namespace -macro ?! $ : $ , \ - $@ : $@ , \ - $$ : $$ , \ - and : and , \ - assert : assert , \ - at : at , \ - break : break , \ - define : define , \ - defined : defined , \ - dup : dup , \ - else : else , \ - emit : emit , \ - end : end , \ - equ : equ , \ - err : err , \ - esc : esc , \ - ez80 : ez80 , \ - from : from , \ - if : if , \ - include : include , \ - irpv : irpv , \ - iterate : iterate , \ - label : label , \ - lengthof : lengthof , \ - load : load , \ - local : local , \ - macro : macro , \ - match : match , \ - mod : mod , \ - namespace: namespace, \ - not : not , \ - or : or , \ - purge : purge , \ - rb : rb , \ - repeat : repeat , \ - restore : restore , \ - restruc : restruc , \ - rawmatch : rawmatch , \ - segment : segment , \ - shl : shl , \ - shr : shr , \ - store : store , \ - struc : struc , \ - used : used , \ - virtual : virtual , \ - while : while , \ - xor : xor - local global, debug, files, segments, hex, output - global equ - segments equ - restore global, segments - - macro files.libs.parse file, offset, isused, anyused* - local private - namespace private - macro library?! name, version* - end if - if anyused - emit 1: $C0, name, 0, version - end if - if 0 - end macro - iterate each, export, export_pointer - macro each?! function* - end if - namespace ez80 - if used global._#function - isused = 1 - global._#function := $ + %-1 - jp offset - virtual - local name - emit 1: '_', `function - load name: $ - $$ from $$ - global equ name = global._#function - end virtual - end if - offset = offset + word + @ez80.il - end namespace - if 0 - end macro - end iterate - if 0 - esc include! file - end if - end namespace - end macro - macro files.libs.handle file, isused* - local offset, anyused - offset = 0 - files.libs.parse file, offset, isused, anyused - anyused := isused - end macro - - macro files.srcs.check file, isused* - local private - namespace private - iterate name, DEF, GLOBAL, PUBLIC, XDEF - iterate style, name, .name - macro style?! symbols*& - end if - iterate symbol, symbols - if used global.symbol - isused = 1 - end if - end iterate - if 0 - end macro - end iterate - end iterate - if 0 - esc include! file - end if - end namespace - end macro - macro files.srcs.parse file* - local private - namespace private - virtual segments.code.area - ?$ equ $ - ?XOR? equ xor - ?AND? equ and - ?OR? equ or - ?SHL? equ shl - ?SHR? equ shr - ?NOT? equ not - iterate name, LIST, NEWPAGE, NOLIST, PAGE - macro name? - end macro - end iterate - iterate name, CPU, TITLE - macro name? arg* - end macro - end iterate - iterate name, COPY, INCLUDE - macro name?! path* - include path - end macro - end iterate - iterate name, EXTERN, EXTERNAL, REF, XREF - macro name? symbols*& - match list : space, symbols - iterate symbol, list - symbol := global.symbol - end iterate - else - iterate symbol, symbols - symbol := global.symbol - end iterate - end match - end macro - end iterate - iterate name, DEF, GLOBAL, PUBLIC, XDEF - macro name? symbols*& - iterate symbol, symbols - global.symbol := symbol - virtual - local name - emit 1: `symbol - load name: $ - $$ from $$ - global equ name = global.symbol - end virtual - end iterate - end macro - end iterate - struc (symbol) EQU? expr* - local error - if ~defined error & defined symbol | error - err 'Symbol "', `symbol, '" already defined' - error = 1 - else - error = 0 - end if - ?symbol = expr - end struc - iterate name, VAR, SET - struc (symbol) name? expr* - ?symbol = expr - end struc - end iterate - macro DS? count - local c - c = count - rb c - end macro - struc DS? count - .: DS? count - end struc - iterate , B,B,1, W,W,2, W24,P,3, L,L,4 - macro D#def? vals*& - local v - iterate val, vals - v = val - emit size: v - end iterate - end macro - macro BLK#blk? count*, init - local c, i - c = count - match, init - emit size: c dup ? - else - i = init - emit size: c dup i - end match - end macro - iterate name, D#def, BLK#blk - struc name? args& - .: name? args - end struc - end iterate - end iterate - iterate , TRIO,DW24, DF,DL - macro name? vals*& - alias? vals - end macro - struc name? args& - .: name? args - end struc - end iterate - macro ALIGN? val* - local v - v = val - rb v-1 - ($ + v-1) mod v - end macro - macro SEGMENT? name* - segment name - end macro - macro ASSUME? expr* - namespace ez80 - assume? expr - end namespace - end macro - iterate register, B, NZ, Z, NC, C, PO, PE, P, M, D, E, \ - H, IXH, IYH, L, IXL, IYL, F, A, I, R, \ - MB, BC, DE, HL, IX, IY, SP, AF, AF' - register? := ez80.register? - end iterate - iterate suffix, , .s?, .l?, .is?, .il?, .sis?, .sil?, .lis?, .lil? - irpv name, ez80.@ez80.oplist - rawmatch rawname, name - define rawname rawname - macro rawname#suffix args& - namespace ez80 - name#suffix args - end namespace - end macro - end rawmatch - end irpv - macro LD? d, s* - namespace ez80 - @ez80.classify dst, dstind, d - @ez80.classify src, srcind, s - if ~dstind & dst eq dst element 1 & dst @ez80.is_reg @ez80.wreg \ - & dst metadata 1 scale 1 and 001o & ~srcind \ - & src relativeto src element 1 & src @ez80.is_reg @ez80.wreg - if src metadata 1 scale 1 = 007o - PUSH? s - POP? d - else - LEA? d, s - end if - else - LD? d, s - end if - end namespace - end macro - macro JR?#suffix args& - namespace ez80 - jq?#suffix args - end namespace - end macro - end iterate - iterate , UEXT,, SEXT,RLA - macro name? reg* - carry? - SBC? reg, reg - end macro - end iterate - macro COMMENT?! delim*& - end match - local inside - inside = 0 - macro ?! line& - local length, text - length = 0 - if inside - length = lengthof `line - text = `line - else if `line = 'end match' - inside = 1 - length = lengthof `delim - 1 - text = `delim shr 8 - end if - repeat length - if ~text xor `delim and $FF - purge ? - break - end if - text = text shr 8 - end repeat - end macro - end macro - - if defined debug - debug.enabled = 0 - debug.startAddr = $ - iterate name, ALIAS, BASE, DEFINE, ENDREC, SPACE, TAG - macro name? str1* - if debug.enabled - virtual debug - debug.uleb128 debug.name - debug.string str1 - end virtual - end if - end macro - end iterate - iterate name, BEGFUNC, ENDFUNC - macro name? str1, num1, str2* - if debug.enabled - local line, addr - line = num1 - addr = $ - virtual debug - debug.uleb128 debug.name - debug.string str1, str2 - debug.uleb128 line - debug.line, addr - debug.addr - end virtual - debug.line = line - debug.addr = addr - end if - end macro - end iterate - macro BEGREC? str1, num1* - if debug.enabled - virtual debug - debug.uleb128 debug.BEGREC - debug.string str1 - debug.uleb128 num1 - end virtual - end if - end macro - iterate , CLASS,u, DIM,u, LENGTH,u, REG,u, SIZE,u, TYPE,s, VALUE,s - macro name? num1* - if debug.enabled - virtual debug - debug.uleb128 debug.name - debug.signed#leb128 num1 - end virtual - end if - end macro - end iterate - macro DEBUG? str1* - virtual debug - debug.uleb128 debug.FILE, lengthof debug.source - emit 1: debug.source - debug.uleb128 debug.startAddr - debug.addr, debug.DEBUG - debug.string str1 - end virtual - debug.enabled = 1 - debug.line = 0 - debug.addr = debug.startAddr - end macro - macro END?! - end if - if debug.enabled - local addr - segment code - addr = $ - virtual debug - debug.uleb128 debug.END, addr - debug.addr - end virtual - debug.addr = addr - end if - if 0 - end macro - macro ENDEF? - if debug.enabled - virtual debug - debug.uleb128 debug.ENDEF - end virtual - end if - end macro - macro FILE? str1* - debug.source = str1 - end macro - macro LINE? num1* - local line, addr - line = num1 - addr = $ - if line <> debug.line | addr <> debug.addr & debug.enabled - virtual debug - debug.uleb128 debug.LINE, line - debug.line, addr - debug.addr - end virtual - debug.line = line - debug.addr = addr - end if - end macro - else - iterate name, ALIAS, BASE, BEGFUNC, BEGREC, CLASS, DEBUG, \ - DEFINE, DIM, ENDEF, ENDFUNC, ENDREC, FILE, \ - LENGTH, LINE, REG, SIZE, SPACE, TAG, TYPE, VALUE - macro name? args& - end macro - end iterate - macro END?! - end if - if 0 - end macro - end if - - struc ? def::& - . def - end struc - macro ? line& - match .rest, line - rest - else match first= .rest, line - first rest - else - line - end match - end macro - if 1 - include file - end if - purge ? - restruc ? - end virtual - end namespace - end macro - macro files.srcs.handle file, isused* - if ~isused - files.srcs.check file, isused - end if - if isused - files.srcs.parse file - end if - end macro - - macro symbol? args*& - iterate arg, args - rawmatch symbol == value, arg - namespace segments - global.symbol := value - virtual - local name - emit 1: `symbol - load name: $ - $$ from $$ - global equ = name global.symbol - end virtual - end namespace - else - 'Syntax error in symbol arguments' - end rawmatch - end iterate - end macro - - iterate name, srcs, libs - macro files.name.add file, used* - local isused - rawmatch rawused, used - namespace segments - isused = rawused - end namespace - end rawmatch - if `file and $FF = "'" - files.name equ file, isused - else - files.name equ `file, isused - end if - end macro - macro name? args*& - local require - iterate arg, args - match file= =used? =if?= used, arg - files.name.add file, used - else match file= =used?, arg - files.name.add file, 1 - else - files.name.add arg, 0 - end match - end iterate - end macro - end iterate - - macro locate? args*& - iterate arg, args - rawmatch name =at? location, arg - segments equ segments.name? - namespace segments - name? := `name - name.base? := location - end namespace - else - err 'Syntax error in locate argument' - end rawmatch - end iterate - end macro - macro range? args*& - iterate arg, args - rawmatch name lower : upper, arg - locate name at lower - namespace segments - name.high? := upper - end namespace - else - err 'Syntax error in range arguments' - end rawmatch - end iterate - end macro - macro order?: args*& - match first =, second =, rest, args - order first, second - order second, rest - else match first =, second, args - locate second at first.base + first.length - else - err 'Not enough order arguments' - end match - end macro - macro merge? args*& - match name == list, args - order list - iterate segment, list - locate name at segment.base - indx %% - namespace segments - name.top? := segment.base + segment.length - if defined segment.high - name.high? := segment.high - end if - end namespace - break - end iterate - else - err 'Syntax error in merge arguments' - end match - end macro - - macro hex value*, leading: '0', digits: 6 - local val, zero, digit, char - emit 1: ' ' - val = value - zero = leading - repeat digits - digit = (val shr ((%% - %) shl 2)) and 0Fh - if digit < 10 - char = '0' + digit - else - char = 'A' + digit - 10 - end if - if digit - zero = '0' - else if % <> %% - char = zero - end if - emit 1: char - end repeat - end macro - - macro map? - local longest, name - postpone ? - virtual as 'map' - longest = lengthof "Segment" - irpv segment, segments - if longest < lengthof segment - longest = lengthof segment - end if - end irpv - emit 1: "Segment", longest - lengthof "Segment" + 1 dup ' ', "Base Top High Length", 10, longest dup '-', 4 dup " ------", '-', 10 - irpv segment, segments - namespace segment - if longest < lengthof segment - longest = lengthof segment - end if - emit 1: segment, longest - lengthof segment dup ' ' - hex base - hex top - if defined high - hex high - else - emit 1: 7 dup ' ' - end if - hex length, ' ' - emit 1: 'h', 10 - end namespace - end irpv - match any, global - longest = lengthof "Label" - irpv symbol, global - match name == value, symbol - if longest < lengthof name - longest = lengthof name - end if - end match - end irpv - emit 1: 10, "Label", longest - lengthof "Label" + 3 dup ' ', "Value", 10, longest dup '-', 3 dup ' ', 6 dup '-', 10 - irpv symbol, global - match name == value, symbol - emit 1: name, longest - lengthof name + 1 dup ' ', '=' - hex value - emit 1: 10 - end match - end irpv - end match - end virtual - end postpone - end macro - macro dbg? - virtual as 'dbg' - debug:: - end virtual - namespace debug - virtual at 0 - iterate name, EOF, ALIAS, BASE, BEGFUNC, BEGREC, CLASS, DEBUG, DEFINE, \ - DIM, END, ENDEF, ENDFUNC, ENDREC, FILE, LENGTH, LINE, \ - REG, SIZE, SPACE, STRINGS, TAG, TYPE, VALUE - name rb 1 - end iterate - end virtual - line = 0 - addr = 0 - macro uleb128 values*& - iterate value, values - local val - val = value - assert val >= 0 - while val shr 7 > 0 - emit 1: val and 07Fh or 080h - val = val shr 7 - end while - emit 1: val - end iterate - end macro - macro sleb128 values*& - iterate value, values - local val - val = value - while val shr 6 <> 0 & val shr 6 <> -1 - emit 1: val and 07Fh or 080h - val = val shr 7 - end while - emit 1: val and 07Fh - end iterate - end macro - restore strings - macro string values*& - iterate value, values - local count, unfound - count = 0 - unfound = 1 - irpv each, debug.strings - if each = value - unfound = 0 - debug.uleb128 % - break - end if - count = %% - end irpv - if unfound - debug.uleb128 count + 1 - debug.strings =: value - end if - end iterate - end macro - end namespace - end macro - - macro segment name* - end virtual - virtual segments.name.area - end macro - - if ~defined segments - err 'No segments defined' - else - restore output.base, output.top ; forbid forward reference - irpv segment, segments - namespace segment - virtual at base - area?:: - end virtual - if ~defined output.base | output.base > base & ~defined high - output.base = base - end if - end namespace - end irpv - irpv file, files.srcs - files = 0 - files.srcs.handle file - end irpv - if ~defined files - err 'Please pass the input files with -i\'srcs "file1" [if require1], "file2" [if require2], ...\'' - end if - irpv file, files.libs - virtual segments.libs.area - files.libs.handle file - end virtual - end irpv - - if defined debug - virtual debug - if defined debug.strings - debug.uleb128 debug.STRINGS - irpv string, debug.strings - if % = 1 - debug.uleb128 %% - end if - debug.uleb128 lengthof string - emit 1: string - end irpv - end if - debug.uleb128 debug.EOF - end virtual - end if - - irpv segment, segments - namespace segment - virtual area - top? := $ - length? := $ - $$ - initlen? := $@ - $$ - end virtual - if ~defined high - if ~defined output.top | output.top < top - output.top = top - end if - else if top > high - repeat 1, len: length, over: top - high, max: high - base - err 'Segment ', segment, ' is ', `len, ' bytes, ', \ - `over, ' bytes larger than the maximum of ', \ - `max, ' bytes' - end repeat - end if - end namespace - end irpv - org output.base - rb output.top - $ - postpone ? - irpv segment, segments - namespace segment - if ~defined high - load output: initlen from area: base - store output: initlen at base - end if - end namespace - end irpv - end postpone - end if - purge ? -end macro diff --git a/frontends/calculator/CEdev/include/fasmg-ez80/ti84pceg.inc b/frontends/calculator/CEdev/include/fasmg-ez80/ti84pceg.inc deleted file mode 100644 index 8dac20d..0000000 --- a/frontends/calculator/CEdev/include/fasmg-ez80/ti84pceg.inc +++ /dev/null @@ -1,61 +0,0 @@ -macro ?! - ; assign needs to be local so that it is only - ; defined once (no purge!) so that it can be - ; forward referenced so that it can recurse - local assign - macro assign: name*, expr& - match left =% right, expr - assign name, left mod right - else match left =| right, expr - assign name, left or right - else match left =& right, expr - assign name, left and right - else match left =^ right, expr - assign name, left xor right - else match left =<=< right, expr - assign name, left shl right - else match left =>=> right, expr - assign name, left shr right - else match left =~ right, expr - assign name, left not right - else match =~ right, expr - assign name, not right - else - name? := expr - end match - end macro - struc (name) equ? expr& - assign name, expr - end struc - macro Ld args& - match =equ? expr, args - assign name, expr - end match - end macro - purge ? -end macro - -macro .list? -end macro -macro .nolist? -end macro -macro #define? name -end macro -macro #ifdef? name -end macro -macro #ifndef? name -end macro -macro #endif? -end macro - -element anovaf_vars? -include 'ti84pce.inc' - -restruc equ? -purge Ld -purge .list? -purge .nolist? -purge #define? -purge #ifdef? -purge #ifndef? -purge #endif? diff --git a/frontends/calculator/CEdev/include/fasmg-ez80/tiformat.inc b/frontends/calculator/CEdev/include/fasmg-ez80/tiformat.inc deleted file mode 100644 index 88faa36..0000000 --- a/frontends/calculator/CEdev/include/fasmg-ez80/tiformat.inc +++ /dev/null @@ -1,105 +0,0 @@ -macro format?.ti? clause& - local all, checkloc, checksum, cplx, data, exec, flag, head, name, process, prot, temp, type, ext, var - macro process: setting - match first rest, setting - process first - process rest - else match =ARCHIVED?, setting - flag = flag or 1 shl 7 - else match =EXECUTABLE?, setting - define exec - else match =PROTECTED?, setting - type = 6 - define prot - else match =REAL?, setting - type = 0 - ext = '8xn' - else match =LIST?, setting - if defined cplx - type = 13 - else - type = 2 - end if - ext = '8xl' - else match =MATRIX?, setting - type = 2 - ext = '8xm' - else match =EQUATION?, setting - type = 3 - ext = '8xy' - else match =STRING?, setting - type = 4 - ext = '8xs' - else match =PROGRAM?, setting - if defined prot - type = 6 - else - type = 5 - end if - ext = '8xp' - else match =PICTURE?, setting - type = 7 - ext = '8ci' - else match =GDB?, setting - type = 1 - ext = '8xd' - else match =COMPLEX?, setting - type = 12 - define cplx - ext = '8xc' - else match =APPVAR?, setting - type = 21 - ext = '8xv' - else match =GROUP?, setting - type = 23 - ext = '8xg' - else match =IMAGE?, setting - type = 26 - ext = '8ca' - else if setting eqtype 'name' - name = setting - else if setting eqtype 0 - type = setting - ext = '8x' - end if - end macro - name = 'A' - type = 6 - ext = '8xp' - flag = 0 - process clause - format binary as ext - assert ~$% & 'Unexpected data before format directive' - dq '**TI83F*' - db 26, 10, 0 - rb 42 - dw sizeof all - label all: checkloc - $% - dw sizeof head, sizeof data - label head: data - $ - db type - dq name - db 0, flag - dw sizeof data - label data: checkloc - $% - dw sizeof var - label var: checkloc - $% - if defined exec - dw 07BEFh - org 0D1A881h - else - org 0 - end if - postpone - label checkloc at $% - end postpone - postpone ? - assert checkloc = $% & 'Unexpected postpone before format directive' - checksum = 0 - repeat sizeof all - load temp: byte from: all + %-1 - checksum = (checksum + temp) and 0FFFFh - end repeat - dw checksum - end postpone -end macro -- cgit v1.2.3-101-g0448