.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text

.define .proword, .probyte
.define .pro0, .pro2, .pro4

! BC is used as the frame pointer, but HL and DE can be corrupted.

.proword:
	pop h
	push b
	mov e, m
	inx h
	mov d, m
	inx h
	jmp .pron

.probyte:
	pop h
	push b
	mvi d, 0xff
	mov e, m
	inx h
	jmp .pron

.pro4:
	pop h
	push b
	lxi d, -4
	jmp .pron

.pro2:
	pop h
	push b
	lxi d, -2
	jmp .pron

.pro0:
	pop h
	push b
	lxi d, 0
	! fall through
.pron:
	shld .retadr
	! Copy the current stack pointer to BC.
	lxi h, 0
	dad sp
	mov b, h
	mov c, l
	! Calculate the new stack pointer.
	dad d
	sphl
	lhld .retadr
	pchl