;
8086\gupi.she v1999.10.10 (c)1999 Chris Pressey, Cat's-Eye Technologies.
8086-compatible semantics for GUPI.
;
; input stack -> output stack ;
; bottom..top -> top..bottom ;
; word -> void ; [ pop-ax ]:pop
; word -> word word; [ pop-ax push-ax push-ax ]:dup
; wrd1 wrd2 -> wrd1 wrd2; [ pop-ax pop-bx push-ax push-bx ]:swap
; addr -> byte ; [ pop-ax xchg-bx-ax mov-ax[bx] xor-ah-ah push-ax ]:getb
; byte addr -> void ; [ pop-ax xchg-bx-ax pop-cx mov[bx]cl ]:putb
; addr -> word ; [ pop-ax xchg-bx-ax push[bx] ]:getw
; word addr -> void ; [ pop-ax xchg-bx-ax pop-cx mov[bx]cx ]:putw
; word -> word ; [ pop-ax inc-ax push-ax ]:++
; word -> word ; [ pop-ax dec-ax push-ax ]:--
; word -> word ; [ pop-ax shl-ax-1 push-ax ]:**
; word -> word ; [ pop-ax shr-ax-1 push-ax ]://
; word word -> word ; [ pop-ax xchg-cx-ax pop-ax shl-ax-cl push-ax ]:<<
; word word -> word ; [ pop-ax xchg-cx-ax pop-ax shr-ax-cl push-ax ]:>>
; addr -> void ; [ pop-bx mov-ax[bx] inc-ax mov[bx]ax ]:@++
; addr -> void ; [ pop-bx mov-ax[bx] dec-ax mov[bx]ax ]:@--
; word word -> word ; [ pop-ax pop-dx add-ax-dx push-ax ]:+
; word word -> word ; [ pop-ax pop-dx sub-dx-ax xchg-dx-ax push-ax ]:-
; word word -> word ; [ pop-ax pop-dx imul-dx push-ax ]:*
; word word -> word ; [ pop-ax xchg-cx-ax pop-ax xor-dx-dx idiv-cx push-ax ]:/
; word word -> word ; [ pop-ax xchg-cx-ax pop-ax xor-dx-dx idiv-cx push-dx ]:%
; word word -> word word; [ pop-ax xchg-cx-ax pop-ax xor-dx-dx idiv-cx push-dx push-ax ]:/%
; word word -> word ; [ pop-ax pop-dx or-ax-dx push-ax ]:|
; word word -> word ; [ pop-ax pop-dx and-ax-dx push-ax ]:&
; word word -> word ; [ pop-ax pop-dx xor-ax-dx push-ax ]:~
; word -> word ; [ pop-ax not-ax push-ax ]:!
; word -> word ; [ pop-ax or-ax-ax je _4 xor-ax-ax jmp _1 inc-ax push-ax ]:zero
; word word -> word ; [ pop-ax pop-bx cmp-bx-ax ja _4 xor-ax-ax jmp _1 inc-ax push-ax ]:>
; addr -> (call) ; [ pop-ax call-ax ]:do
; addr -> (branch) ; [ pop-ax jmp-ax ]:to
; bool addr -> (call) ; [ pop-ax pop-dx or-dx-dx je _2 jmp-ax ]:toif
; bool addr -> (branch) ; [ pop-ax pop-dx or-dx-dx je _2 call-ax ]:doif
; memory for call stack: ; [ __0 __0 __0 __0 __0 __0 __0 __0
__0 __0 __0 __0 __0 __0 __0 __0
__0 __0 __0 __0 __0 __0 __0 __0
__0 __0 __0 __0 __0 __0 __0 __0 ]=clstk
; memory for stack pointer; [ __0 ]=clsp
; (call) -> void ; [ pop-ax _139 _30 _^clsp _137 _135 _^clstk _131 _6 _^clsp _2 ]:begin
; void -> (return) ; [ _131 _46 _^clsp _2 _139 _30 _^clsp _139 _135 _^clstk push-ax _195 ]:end
; sizw -> ptrw ;
[ mov-bx __260 mov-ax[bx]
pop-dx
push-ax
add-ax-dx
mov-bx __260 mov[bx]ax ]:malloc
; ptrw -> void ;
[ pop-ax mov-bx __260 mov[bx]ax ]:mfree