Code: Select all
.repeat 20, i
.assert number <> i, ldwarning, .sprintf("number is %d", i)
.endrepeat
Moderator: Moderators
Code: Select all
.repeat 20, i
.assert number <> i, ldwarning, .sprintf("number is %d", i)
.endrepeat
Code: Select all
.macro __ngin_decimalInteger integer
.local divider
divider .set 100000000
.local value
value = integer
; \note .charmap isn't a problem here, because string/character literals
; are not used.
; \todo This doesn't seem to work properly for signed numbers (try
; e.g. $FFFFFFFF).
.repeat 9, i
; Output the corresponding digit, or a space if the digit and all the
; more significant digits are zeroes. Unless we're outputting the least
; significant digit, which is always displayed (so that 0 is displayed).
.byte .lobyte( __ngin_choice \
(value/divider) <> 0 .or divider = 1, \
(value/divider) .mod 10 + ngin_Ascii::kZero, \
ngin_Ascii::kSpace )
divider .set divider/10
.endrepeat
.endmacro
Code: Select all
.define __ngin_choice( condition, if, else ) \
((!!(condition)) * (if) + (!(condition)) * (else))
Code: Select all
.enum ngin_Ascii
kLf = 10
kCr = 13
kSpace = 32
kQuote = 34
kZero = 48
kNine = kZero+9
kPlus = 43
kMinus = 45
kDot = 46
kA = 65
.endenum
Code: Select all
.macro Assembler_WRITE_NUMBER _Number, _Base, _Places, _Divisor
.ifblank _Divisor
Assembler_WRITE_NUMBER _Number, _Base, _Places, 1
.else
.if _Places > 0
Assembler_WRITE_NUMBER _Number, _Base, (_Places) - 1, (_Divisor) * _Base
.local _Digit
_Digit = ((_Number) / (_Divisor)) .mod _Base
.lobytes _Digit + $30 + (_Digit > 9) * $07
.endif
.endif
.endmacro
Code: Select all
Assembler_WRITE_NUMBER SomeLabel, 16, 4