90 lines
1.5 KiB
ArmAsm
90 lines
1.5 KiB
ArmAsm
.define .cii
|
|
.sect .text
|
|
.sect .rom
|
|
.sect .data
|
|
.sect .bss
|
|
.sect .text
|
|
|
|
! Convert integer to integer
|
|
! Expects in a-reg: 1 for signed integer to signed integer (cii)
|
|
! 0 for unsigned integer to unsigned integer (cuu)
|
|
! Expects on stack: destination size
|
|
! source size
|
|
! source
|
|
! Yields on stack: result
|
|
|
|
.cii: pop h
|
|
shld .retadr
|
|
mov h,b
|
|
mov l,c
|
|
shld .bcreg
|
|
|
|
sta .areg ! save a-register
|
|
pop b
|
|
mov e,c
|
|
pop b ! c = source size
|
|
mov b,e ! b = destination size
|
|
mov a,b
|
|
cmp c
|
|
jz 3f ! destination size = source size
|
|
jc shrink ! destination size < source size
|
|
|
|
! if destination size > source size only:
|
|
lxi h,0
|
|
dad sp
|
|
mov e,l
|
|
mov d,h ! de = stackpointer
|
|
mov a,b
|
|
sub c ! c = (still) source size
|
|
mov b,a ! b = destination size - source size
|
|
cma
|
|
mov l,a
|
|
mvi h,255
|
|
inx h
|
|
dad d ! hl = stackpointer - (dest. size - source size)
|
|
sphl ! new stackpointer
|
|
|
|
1: ldax d ! move source downwards
|
|
mov m,a
|
|
inx d
|
|
inx h
|
|
dcr c
|
|
jnz 1b
|
|
|
|
ral ! a-reg still contains most significant byte of source
|
|
jnc 1f ! jump if is a positive integer
|
|
lda .areg
|
|
ora a
|
|
jz 1f ! jump if it is a cuu
|
|
mvi c,255 ! c-reg contains filler byte
|
|
|
|
1: mov m,c ! fill
|
|
inx h
|
|
dcr b
|
|
jnz 1b
|
|
jmp 3f ! done
|
|
|
|
!if destination size < source size only:
|
|
shrink: mov l,c ! load source size in hl
|
|
mvi h,0
|
|
dad sp
|
|
mov d,h
|
|
mov e,l ! de points just above source
|
|
mov l,b ! load destination size in hl
|
|
mvi h,0
|
|
dad sp ! hl points just above "destination"
|
|
|
|
1: dcx d ! move upwards
|
|
dcx h
|
|
mov a,m
|
|
stax d
|
|
dcr b
|
|
jnz 1b
|
|
sphl
|
|
|
|
3: lhld .bcreg
|
|
mov b,h
|
|
mov c,l
|
|
lhld .retadr
|
|
pchl
|