Not romable z80 compiler - mostly executable code - mostly not reentrant functions store locals inside code data types: - flag z or cy - int8 mostly in register A - int16 mostly in register HL - int32 mostly in register DEHL ABI calling convention: - last argument passed in A/HL/DEHL dep. on size - other arguments passed on stack - return value in A/HL/DEHL/c/z or none (void) - register BC must be preserved (used for local variables) Locals in code: (unless source is compiled reentrantrant or function is marked recursive) /* Source Example */ void foo ( int16 bar -- ) { int8 i = 0; do { print "i=", i, '\n'; i++; while (i < bar ); } } Intermediate code: lvar.i16 bar lvar.i8 i P_foo: lset.w bar ival.b 0 lset.b i l1: istr "i=" print_str lget.b i print_i8 ival.b '\n' print_char lvar i incr.b lget.b i cast_i8_to_i16 lget.w bar lt.i16 jp true,l1 return Assembly source: "-O0" #local _bar: data 2 ; i16: bar (arg1) _i: data 1 ; i8: i (lvar) _str1: db "i=", 0 ; "i=" (reusable) foo_i16:: ld (_bar), hl ; store arg1 in lvar xor a ; 0 ld (_i), a ; i! l1: ; do ld hl, _str1 ; "i=" call print_str ; . ld a, (_i) ; i? call print_i8 ; . ld a, '\n' ; '\n' call print_c8 ; . ld hl, _i ; i++ inc (hl) ; ld a, (_i) ; i? call cast_i8__i16 ; push hl ; bar? ld hl, (_bar) ; call lt_i16__c ; < jr c, l1 ; while ret ; return ; #endlocal Assembly source: "-O1" ;_bar data 2 _i equ B _str1: db "i=",0 pop hl P_foo: push bc ld (_bar),hl ld _i,0 l1: ld hl,_str1 call print_str ld hl,(_i) call print_int ld hl,'\n' call print_char inc _i ld a,_i call cast_i8_to_i16 ex de,hl _bar = $+1 ld hl,0 ; ld hl,(_bar) call cmp_lt jr c, l1 pop bc ret --------- _bar data 2 _i data 2 _str1: db "i=",0 retaddr: db 2 p_foo: ld (_bar),hl ld (retaddr),sp ld sp,vcode ret align 2 vcode: dw ival, 0 dw vset, _i l1: dw ival, _str1 dw print_str dw vget, _i dw print_int dw ival, '\n' dw print_char dw ival, _i dw incr dw vget, _i dw vget, _bar dw cmp_lt dw jp_true, l1 dw real ld sp,(retaddr) ret Source example: void foo ( int16 bar -- ) { int8 i = 0; do { print "i=", i, '\n'; i++; while (i < bar ); } } function: 'foo' ( int16 -- void ) does: lvar: 'bar' ( -- int16& ) instruction: arg1: on_stack ( -- int16 ) arg2: lvar 'bar' ( -- int16& ) does: poke (int16& int16 -- ) lvar: 'i' ( -- int8& ) label 'L1' instruction: arg1: istr "i=" does: print ( string -- ) instruction: arg1: lvar 'i' peek ( int8& -- int8 ) does: print ( int8 -- ) instruction: arg1: ival 10 does: print ( char -- ) instruction: arg1: lvar 'i' does: incr ( int8& -- ) instruction: a1: expression ( -- bool ) a1: lvar 'i' ( -- int8& ) peek8 ( int8& -- int8 ) casti8i16 ( int8 -- int16 ) a2: lvar 'bar' ( -- int16& ) peek16 ( int16& -- int16 ) does:oper '<' ( int16 int16 -- bool ) a2: label 'L1' does:jp_if1 ( bool label -- ) instruction: does: return ( -- )