; PC: instruction pointer (native code) ; SP: combined return and data stack ; DEHL: i32 bit top value ; HL: i16 bit top value ; A: i8 top value ; A,Z: boolean value ; - no top value ; BC: preserved: local variable(s) ; IX: tbd. ; IY: tbd. ; AF': tbd. ; exx: tbd. ; ========================================= ; host system ; ========================================= ; ----------------------------------------- ; putc ( i8 -- ) .macro put_c call _putc .endm ; ----------------------------------------- ; getc ( -- i8 ) .macro get_c call _getc .endm ; ----------------------------------------- ; getc_avail ( -- i8 ) .macro in_avail_c call _getc_avail .endm ; ----------------------------------------- ; putc_free ( -- i8 ) .macro out_free_c call _putc_free .endm ; ========================================= ; immediate values ; ========================================= ; ----------------------------------------- ; ival ( -- i32 ) .macro ival_l &value ld de, 0 + ((&value) >> 16) ld hl, 0 + ((&value) & 0xFFFF) .endm ; ----------------------------------------- ; ival ( -- i16 ) .macro ival_w &value ld hl, &value .endm ; ----------------------------------------- ; ival ( -- i8 ) .macro ival_c &value if &value ld a, &value else xor a endif .endm ; ----------------------------------------- ; ival ( -- i1 ) .macro ival_b &value if &value xor a inc a else xor a endif .endm ; ========================================= ; global variables ; ========================================= ; ----------------------------------------- ; gget ( -- i32 ) .macro gget_l &address ld hl, (0+(&address)) ld de, (2+(&address)) .endm ; ----------------------------------------- ; gset ( i32 -- ) .macro gset_l &address ld (0+(&address)), hl ld (2+(&address)), de .endm ; ----------------------------------------- ; gget ( -- i16 ) .macro gget_w &address ld hl, (&address) .endm ; ----------------------------------------- ; gset ( i16 -- ) .macro gset_w &address ld (&address), hl .endm ; ----------------------------------------- ; gget ( -- i8 ) .macro gget_c &address ld a, (&address) .endm ; ----------------------------------------- ; gset ( i8 -- ) .macro gset_c &address ld (&address), a .endm ; ----------------------------------------- ; gget ( -- bool ) .macro gget_b &address ld a, (&address) and a .endm ; ----------------------------------------- ; gset ( bool -- ) .macro gset_b &address ld (&address), a ; assumes z <=> a=0 .endm ; ========================================= ; stack ; ========================================= ; ----------------------------------------- ; push ( i16 -- ) .macro push_w push hl .endm ; ----------------------------------------- ; pop ( -- i16 ) .macro pop_w pop hl .endm ; ----------------------------------------- ; push ( i32 -- ) .macro push_l push hl push de .endm ; ----------------------------------------- ; pop ( -- i32 ) .macro pop_l pop de pop hl .endm ; ----------------------------------------- ; push ( i8 -- ) .macro push_c push af ; high byte! .endm ; ----------------------------------------- ; pop ( -- i8 ) .macro pop_c pop af ; high byte! .endm ; ----------------------------------------- ; push ( i1 -- ) .macro push_b push af ; z flag! .endm ; ----------------------------------------- ; pop ( -- i1 ) .macro pop_b pop af ; z flag! .endm ; ========================================= ; i8 arithmetics ; ========================================= ; ----------------------------------------- ; neg ( i8 -- i8 ) .macro neg_c neg .endm ; ----------------------------------------- ; cpl ( i8 -- i8 ) .macro cpl_w cpl .endm ; ========================================= ; i16 arithmetics ; ========================================= ; ----------------------------------------- ; neg ( i16 -- i16 ) .macro neg_w ex hl,de xor a ld h,a ld l,a sbc hl,de .endm ; ----------------------------------------- ; cpl ( i16 -- i16 ) .macro cpl_w ld a,h cpl ld h,a ld a,l cpl ld l,a .endm ; ----------------------------------------- ; add ( i16 i16 -- i16 ) .macro add_w pop de ; op1 add hl,de ; hl = result .endm ; ----------------------------------------- ; sub ( i16 i16 -- i16 ) .macro sub_w ex hl,de ; de = op2 pop hl ; hl = op1 and a sbc hl,de ; hl = result .endm ; ----------------------------------------- ; and ( i16 i16 -- i16 ) .macro and_w pop de ld a,h and d ld h,a ld a,l and e ld l,a .endm ; ----------------------------------------- ; or ( i16 i16 -- i16 ) .macro or_w pop de ld a,h or d ld h,a ld a,l or e ld l,a .endm ; ----------------------------------------- ; xor ( i16 i16 -- i16 ) .macro xor_w pop de ld a,h xor d ld h,a ld a,l xor e ld l,a .endm ; ----------------------------------------- ; incr ( i16 -- i16 ) .macro incr_w inc hl .endm ; ----------------------------------------- ; decr ( i16 -- i16 ) .macro decr_w dec hl .endm ; ----------------------------------------- ; incr ( i8 -- i8 ) .macro incr_c inc a .endm ; ----------------------------------------- ; decr ( i8 -- i8 ) .macro decr_c dec a .endm ; ----------------------------------------- ; incr ( i32 -- i32 ) .macro incr_l inc hl jr nz,$+3 inc de .endm ; ----------------------------------------- ; decr ( i32 -- i32 ) .macro decr_l ld a,h or l jr nz,$+3 dec de dec hl .endm ; ----------------------------------------- ; sl ( i16 -- i16 ) sl_w: macro add hl,hl .endm ; ----------------------------------------- ; sr ( i16 -- i16 ) .macro sru_w srl h rr l .endm ; ----------------------------------------- ; sr ( i16 -- i16 ) .macro srs_w sra h rr l .endm ; ----------------------------------------- ; sl ( i32 -- i32 ) sl_l: macro add hl,hl ex hl,de adc hl,hl ex hl,de .endm ; ----------------------------------------- ; sr ( i32 -- i32 ) .macro sru_l srl d rr e rr h rr l .endm ; ----------------------------------------- ; sr ( i32 -- i32 ) .macro srs_l srs d rr e rr h rr l .endm ; ----------------------------------------- ; sl ( i8 -- i8 ) sl_c: macro add a,a .endm ; ----------------------------------------- ; sr ( i8 -- i8 ) .macro sru_c srl a .endm ; ----------------------------------------- ; sr ( i8 -- i8 ) .macro srs_c sra a .endm