1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- .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
|