.macro test_max_sl &A,&B .macro test_min_sl &A,&B .macro test_mul_l &op1, &op2 .macro test_divlu &op1, &op2 .macro divls_sub &op1, &op2 .macro test_divls &op1, &op2 .macro test_mul10l &NN .macro test_mul &op1, &op2 .macro test_min &A,&B .macro test_max &A,&B .macro minmax_test &A, &N, &E .macro minmaxu_test &A, &N, &E .macro test_max_s &A,&B .macro test_min_s &A,&B .macro test_divu &op1, &op2 .macro test_divs &op1, &op2 .macro test_atou &NUM .macro test_atoi &NUM .macro test_utoa &NUM .macro test_itoa &NUM .macro test_atoul &NUM .macro test_atoil &NUM .macro test_utoal &NUM .macro test_itoal &NUM .macro .assert_eq &n, &err .macro .assert_eq.b &n, &err .macro .assert_eq.l &n, &err .macro .virtual_ ; no test for ROP segment .macro ext.u8 ; hl = l.u .macro ext.s8 ; hl = l.s .macro ext_de.s8 ; de = e.s .macro ext.u16 ; hlhl = hl.u .macro ext.s16 ; hlhl = hl.s .macro ext_de.s16 ; dede = de.s .macro ext_de.u16 ; dede = de .macro exhlde.l ; hlhl <-> dede .macro pop_de.l ; dede = (sp++) .macro ld_hl_xhl ; hl = (hl) .macro .global_byte $name .macro .global_word $name .macro .global_long $name .macro _lvar_byte $name .macro _lvar_word $name .macro _lvar_long $name .macro _svar_byte &name .macro _svar_word &name .macro _svar_long &name .macro .local_byte &name .macro .local_word &name .macro .local_long &name .macro .get &r, &name .macro .get.l &r, &name .macro .set &name, &r .macro .set.l &name, &r .macro .gvar &name .macro .lvar &r, &name .macro PROC &name .macro PROC.0 &name .macro PROC.1 &name .macro PROC.w &name .macro ENDP &name .macro FUNC &name ; caller's BC register is saved and restored .macro FUNC_noBC &name ; caller's BC register not saved: -4 bytes, -30cc .macro ENDF &NAME ; end of non-reetrant FUNCtion .macro .arguments .macro .return .macro .return_void .macro .call &NAME .macro rop_define_lvar_byte &i .macro rop_define_lvar_word &i .macro rop_define_lvar_long &i .macro rop_define_svar_byte &i .macro rop_define_svar_word &i .macro rop_define_svar_long &i .macro rop_define_lvars .macro rop_define_svars .macro rop_define_func_returns .macro rop_final_resolver .macro .virtual ; IY=sp IP=pc mod. F, IX .macro .virtual_nostack ; IP=pc, no stack! pres. all .macro .native ; sp=IY pc=IP pres. all .macro .native_nostack ; pc=IP, no stack! pres. all .macro .ival &n ; hl = w == ldi hl,n alias .macro .ival.b &n ; l = b == ldi l,n alias .macro .ival.l &n ; hlhl' = l == ldi.l hlhl,n alias .macro .ldi &r, &n ; set byte or word register to immediate value .macro .ldi.b &r, &n ; set byte register to immediate value .macro .ldi.w &r, &n ; set word register to immediate value .macro .ldi.l &r, &n ; set long register to immediate value .macro .ldi.lw &r, &n ; set long register to immediate value .macro .ld0 &r ; set register to zero .macro .ld0.l &r ; set register to zero .macro .ld &zr,&qr ; load register from register .macro .ld.l &zr,&qr ; load register from register .macro .gget &r, &addr ; get global variable with no getter .macro .gget.l &r, &addr ; get global variable with no getter .macro .gset &addr, &r ; set global variable with no setter .macro .gset.l &addr, &r ; set global variable with no setter .macro .ivar &offs ; hl = addr+offs .macro .iget &r, &offs ; r = (addr+offs) .macro .iget.l &r, &offs ; r = (addr+offs) .macro .iset &offs, &r ; (addr+offs) = r .macro .iset.l &offs, &r ; (addr+offs) = r .macro .ati ; (hl:addr de:idx -- hl:addr) hl = addr+2*idx .macro .ati.b ; (hl:addr de:idx -- hl:addr) hl = addr+1*idx .macro .ati.l ; (hl:addr de:idx -- hl:addr) hl = addr+4*idx .macro .atiget &r ; (hl:addr de:idx -- r:nn) r = array[idx] .macro .atiget.b &r ; (hl:addr de:idx -- r:nn) r = array[idx] .macro .atiget.w &r ; (hl:addr de:idx -- r:nn) r = array[idx] .macro .atiget.l &r ; (hl:addr de:idx -- r:nn) r = array[idx] .macro .atiset &r ; array[idx] = r .macro .atiset.w ; (hl:addr de:idx stk:n16 -- ) array[idx] = n16 .macro .atiset.b ; (hl:addr de:idx stk:n8 -- ) array[idx] = n8 .macro .atiset.l ; (hl:addr de:idx stk:n32 -- ) array[idx] = n32 .macro .add &zr, &qr ; zr += qr .macro .add.b &zr, &qr ; zr += qr .macro .add.w &zr, &qr ; zr += qr .macro .add.l &zr, &qr ; zr += qr .macro .addi &zr, &n ; zr += n16 .macro .addi.b &zr, &n ; xhl.b += n8 .macro .addi.w &zr, &n ; xhl.w += n16 .macro .addi.l &zr, &n ; xhl.l/hlhl += n32 .macro .addi.lw &zr, &n ; xhl.l/hlhl += u16 .macro .sub &zr,&qr ; zr -= qr .macro .sub.b &zr,&qr ; zr -= qr .macro .sub.w &zr,&qr ; zr -= qr .macro .sub.l &zr,&qr ; zr -= qr .macro .subi &zr, &n ; zr -= n16 .macro .subi.b &zr, &n ; (hl) -= n8 .macro .subi.w &zr, &n ; (hl) -= n16 .macro .subi.l &zr, &n ; xhl/hlhl -= n32 .macro .subi.lw &zr, &n ; xhl -= u16 .macro .and.b &zr, &qr ; zr &= qr .macro .and.w &zr, &qr ; zr &= qr .macro .and.l &zr, &qr ; zr &= qr .macro .and.lw &zr, &qr ; zr &= qr .macro .and &zr, &qr ; zr &= qr .macro .andi.b &zr, &n ; xhl &= n8 .macro .andi.w &zr, &n ; xhl &= n16 .macro .andi.l &zr, &n ; xhl/hlhl &= n32 .macro .andi.lw &zr, &n ; xhl/hlhl &= n16 .macro .andi &zr, &n ; zr &= u16 .macro .or &zr, &qr ; zr |= qr .macro .or.b &zr, &qr ; zr |= qr .macro .or.w &zr, &qr ; zr |= qr .macro .or.l &zr, &qr ; zr |= qr .macro .or.lw &zr, &qr ; zr |= qr .macro .ori.b &zr, &n ; xhl |= n8 .macro .ori.w &zr, &n ; xhl |= n8 .macro .ori.l &zr, &n ; xhl/hlhl |= n32 .macro .ori.lw &zr, &n ; xhl/hlhl |= n16 .macro .ori &zr, &n ; zr |= u16 .macro .xor.b &zr, &qr ; zr ^= qr .macro .xor.w &zr, &qr ; zr ^= qr .macro .xor.l &zr, &qr ; zr ^= qr .macro .xor.lw &zr, &qr ; zr ^= qr .macro .xor &zr, &qr ; zr ^= qr .macro .xori.b &zr, &n ; xhl ^= n8 .macro .xori.w &zr, &n ; xhl ^= n16 .macro .xori.l &zr, &n ; xhl/hlhl ^= n32 .macro .xori.lw &zr, &n ; xhl/hlhl ^= n16 .macro .xori &zr, &n ; zr ^= u16 .macro .inc &zr ; zr += 1, x.b/x.w/x.l=(hl) .macro .inc.b &zr ; zr += 1, x.b/x.w/x.l=(hl) .macro .inc.w &zr ; zr += 1, x.b/x.w/x.l=(hl) .macro .inc.l &zr ; zr += 1, x.b/x.w/x.l=(hl) .macro .inc2 &zr ; zr += 2, zr=bc,hl,xhl .macro .inc4 &zr ; zr += 4, zr=bc,hl,xhl .macro .ldpp &zr,&qr ; b,c,bc,hl,l = bc++/b++/c++/(hl)++ x=(hl) .macro .ldpp.l &zr,&qr ; b,c,bc,hl,l = bc++/b++/c++/(hl)++ x=(hl) .macro .ppld &zr,&qr ; b,c,bc,hl,l = ++bc/++b/++c/++(hl) x=(hl) .macro .ppld.l &zr,&qr ; b,c,bc,hl,l = ++bc/++b/++c/++(hl) x=(hl) .macro .ldpp2 &zr,&qr ; hl = rr, rr+=2, rr=bc,xhl .macro .pp2ld &zr,&qr ; rr+=2, hl = rr, rr=bc,xhl .macro .ldpp4 &zr,&qr ; hl = rr, rr+=4, rr=bc,xhl .macro .pp4ld &zr,&qr ; rr+=4, hl = rr, rr=bc,xhl .macro .dec &zr ; zr -= 1 .macro .dec.b &r ; (hl).b -= 1 .macro .dec.w &r ; (hl).w -= 1 .macro .dec.l &r ; (hl).l -= 1 .macro .dec2 &zr ; zr -= 2, zr=bc,hl,xhl .macro .dec4 &zr ; zr -= 4, zr=bc,hl,xhl .macro .ldmm &zr,&qr ; hl|l = bc--|b--|c-- .macro .ldmm.l &zr,&qr ; hl|l = bc--|b--|c-- .macro .mmld &zr,&qr ; b,c,bc,hlhl,hl,l = --bc/--b/--c/--xhl .macro .mmld.l &zr,&qr ; b,c,bc,hlhl,hl,l = --bc/--b/--c/--xhl .macro .ldmm2 &zr,&qr ; hl = rr, rr-=2, rr=bc,xhl .macro .mm2ld &zr,&qr ; rr-=2, hl = rr, rr=bc,xhl .macro .ldmm4 &zr,&qr ; hl = rr, rr-=4, rr=bc,xhl .macro .mm4ld &zr,&qr ; rr-=4, hl = rr, rr=bc,xhl .macro .mul &zr, &qr ; zr *= qr .macro .mul.b &zr, &qr ; zr *= qr .macro .mul.w &zr, &qr ; zr *= qr .macro .mul.l &zr, &qr ; zr *= qr .macro .mul.wbu &zr,&qr ; mulu hlhl/hl, de/e .macro .mul.wbs &zr,&qr ; mulu hlhl/hl, de/e .macro .mul.lbu &zr,&qr ; mulu hlhl/hl, de/e .macro .mul.lbs &zr,&qr ; mulu hlhl/hl, de/e .macro .mul.lwu &zr,&qr ; mulu hlhl/hl, de/e .macro .mul.lws &zr,&qr ; mulu hlhl/hl, de/e .macro .mul10.b &r ; l hl hlhl .macro .mul10.w &r ; l hl hlhl .macro .mul10.l &r ; l hl hlhl .macro .mul10 &r ; l hl hlhl .macro .muli.b &zr, &n ; zr *= n8 .macro .muli.w &zr, &n ; zr *= n16 .macro .muli.l &zr, &n ; zr *= n32 .macro .muli.wb &zr, &n ; zr *= n8 .macro .muli.lb &zr, &n ; zr *= n8 .macro .muli.lw &zr, &n ; zr *= n16 .macro .muli &zr, &n ; zr *= n16 .macro .divu &zr, &qr ; zr /= qr, e/de = rem .macro .divu.lw &zr, &qr ; zr /= qr, e/de = rem .macro .divu.l &zr, &qr ; zr /= qr, dede = rem .macro .divs &zr, &qr ; zr /= qr, e/de = rem .macro .divs.lw &zr, &qr ; zr /= qr, e/de = rem .macro .divs.l &zr, &qr ; zr /= qr, dede = rem .macro .sl &zr, &qr ; zr <<= qr .macro .sl.b &zr, &qr ; zr <<= qr .macro .sl.w &zr, &qr ; zr <<= qr .macro .sl.l &zr, &qr ; zr <<= qr .macro .sl1 &zr ; zr <<= 1 .macro .sl1.b &zr ; (hl) <<= 1 .macro .sl1.w &zr ; (hl) <<= 1 .macro .sl1.l &zr ; (hl) <<= 1 .macro .sli.b &zr, &n ; zr <<= n .macro .sli.w &zr, &n ; zr <<= n .macro .sli.l &zr, &n ; zr <<= n .macro .sli &zr, &n ; zr <<= n .macro .sru &zr, &qr ; zr <<= qr .macro .sru.b &zr, &qr ; zr <<= qr .macro .sru.w &zr, &qr ; zr <<= qr .macro .sru.l &zr, &qr ; zr <<= qr .macro .sru1 &zr ; zr <<= 1 .macro .sru1.b &r ; (hl) <<= 1 .macro .sru1.w &r ; (hl) <<= 1 .macro .sru1.l &r ; (hl) <<= 1 .macro .srui.b &zr, &n ; zr <<= n .macro .srui.w &zr, &n ; zr <<= n .macro .srui.l &zr, &n ; zr <<= n .macro .srui &zr, &n ; zr <<= n .macro .srs &zr, &qr ; zr <<= qr .macro .srs.b &zr, &qr ; zr <<= qr .macro .srs.w &zr, &qr ; zr <<= qr .macro .srs.l &zr, &qr ; zr <<= qr .macro .srs1 &zr ; zr <<= 1 .macro .srs1.b &r ; (hl) <<= 1 .macro .srs1.w &r ; (hl) <<= 1 .macro .srs1.l &r ; (hl) <<= 1 .macro .srsi.b &zr, &n ; zr <<= n .macro .srsi.w &zr, &n ; zr <<= n .macro .srsi.l &zr, &n ; zr <<= n .macro .srsi &zr, &n ; zr <<= n .macro .neg &r .macro .neg.l &r .macro .cpl &r .macro .cpl.l &r .macro .not &r .macro .not.l &r .macro .abs &r .macro .abs.l &r .macro .sign &r .macro .sign.l &r .macro .extu &r .macro .extu.l &r .macro .exts &r .macro .exts.l &r .macro .exhlde.l ; ( a b -- b a ) .macro .exhlde ; ( a b -- b a ) .macro .ei ; ( -- ) .macro .di ; ( -- ) .macro .halt ; ( -- ) .macro .nop ; ( -- ) .macro .getchar ; ( -- char f:z ) .macro .putchar ; ( char -- ) .macro .putstr ; ( cstr -- ) .macro .message &text .macro .memset ; ( ptr cnt u8 -- ptr ) arg3 on stack .macro .memclr ; ( ptr cnt -- ) .macro .memcpy ; ( dest src cnt -- ) arg3 on stack .macro .min.sl ; ( i32 i32 -- i32 ) .macro .min.ul ; ( u32 u32 -- u32 ) .macro .max.sl ; ( i32 i32 -- i32 ) .macro .max.ul ; ( u32 u32 -- u32 ) .macro .min.s ; ( i16 i16 -- i16 ) .macro .min.u ; ( u16 u16 -- u16 ) .macro .max.s ; ( i16 i16 -- i16 ) .macro .max.u ; ( u16 u16 -- u16 ) .macro .min.sb ; ( i8 i8 -- i8 ) .macro .min.ub ; ( u8 u8 -- u8 ) .macro .max.sb ; ( i8 i8 -- i8 ) .macro .max.ub ; ( u8 u8 -- u8 ) .macro .rand ; ( -- n16 ) .macro .randomize ; ( -- ) .macro .atoi.l ; ( ptr -- i32 ) uses: af dede, stack, restore_sp .macro .atou.l ; ( ptr -- u32 ) uses: af dede, stack, restore_sp .macro .atoi ; ( ptr -- i16 ) uses: af de, stack, restore_sp .macro .atou ; ( ptr -- u16 ) uses: af de, stack, restore_sp .macro .utoa.b ; ( u8 ptr -- ptr ) uses: af de ix, stack, restore_sp .macro .itoa.b ; ( i8 ptr -- ptr ) uses: af de ix, stack, restore_sp .macro .utoa ; ( u16 ptr -- ptr ) uses: af de ix, stack, restore_sp .macro .itoa ; ( i16 ptr -- ptr ) uses: af de ix, stack, restore_sp .macro .utoa.l ; ( u32 ptr -- ptr ) uses: af de ix, stack, restore_sp .macro .itoa.l ; ( i32 ptr -- ptr ) uses: af de ix, stack, restore_sp .macro .mfree ; ( ptr -- ) .macro .malloc ; ( n16 -- ptr ) .macro .msize ; ( ptr -- u16 ) .macro .panic &errno ; ( [errno] -- ) .macro .cmpi.sl &n ; ( i32 [i32] -- f:cz ) .macro .cmp.sl ; ( i32 i32 -- f:cz ) .macro .cmp0.sl ; ( i32 -- f:cz ) .macro .cmpi.ul &n ; ( u32 [u32] -- f:cz ) .macro .cmp.ul ; ( u32 u32 -- f:cz ) .macro .cmp0.ul ; ( u32 -- f:cz ) .macro .cmpi.u &n ; ( u16 [u16] -- f:cz ) .macro .cmp.u ; ( u16 u16 -- f:cz ) .macro .cmp0.u ; ( u16 -- f:cz ) .macro .cmpi.s &n ; ( i16 [i16] -- f:cz ) .macro .cmp.s ; ( i16 i16 -- f:cz ) .macro .cmp0.s ; ( i16 -- f:cz ) .macro .cmpi.ub &n ; ( u8 [u8] -- f:cz ) .macro .cmp.ub ; ( u8 u8 -- f:cz ) .macro .cmp0.ub ; ( u8 -- f:cz ) .macro .cmp0.sb ; ( i8 -- f:cz ) .macro .cmpi.sb &n ; ( i8 [i8] -- f:cz ) .macro .cmp.sb ; ( i8 i8 -- f:cz ) .macro .cmp.sul ; ( i32 u32 -- f:zc ) .macro .cmp.usl ; ( u32 i32 -- f:zc ) .macro .cmp.su ; ( i16 u16 -- f:cz ) .macro .cmp.us ; ( u16 i16 -- f:cz ) .macro .cmp.usb ; ( u8 i8 -- f:cz ) .macro .cmp.sub ; ( i8 iu -- f:cz ) .macro .eq ; ( f:cz -- u1 ) .macro .ne ; ( f:cz -- u1 ) .macro .ge ; ( f:cz -- u1 ) .macro .lt ; ( f:cz -- u1 ) .macro .gt ; ( f:cz -- u1 ) .macro .le ; ( f:cz -- u1 ) .macro .jp &L ; jump always. uses hl .macro .jpeq &L ; jp if cond true. uses hl .macro .jpne &L ; jp if cond true. uses hl .macro .jpz &L ; jp if cond true. uses hl .macro .jpnz &L ; jp if cond true. uses hl .macro .jpc &L ; jp if cond true. uses hl .macro .jpnc &L ; jp if cond true. uses hl .macro .jplt &L ; jp if cond true. uses hl .macro .jpgt &L ; jp if cond true. uses hl .macro .jple &L ; jp if cond true. uses hl .macro .jpge &L ; jp if cond true. uses hl .macro .jp_xIX &L ; jump always. pres. hl .macro .jpz_xIX &L ; jp if z pres. hl .macro .jpnz_xIX &L ; jp if !z pres. hl .macro .if1 &cond ; execute next opcode if , cond = z nz lt ge le gt .macro .if2 &cond ; execute next 2 opcodes if , cond = z nz lt ge le gt .macro .switch &cases ; zero-based, no gaps. hint: use <..>. default jumps behind table