This commit is contained in:
Michaelangel007 2016-02-20 18:51:00 -08:00
parent bb457280d2
commit 87b0ae3ecf

398
printm.s
View File

@ -5,7 +5,7 @@
.feature leading_dot_in_identifiers .feature leading_dot_in_identifiers
.PC02 ; 65C02 .PC02 ; 65C02
/* Version 33 /* Version 34
printm - a modular micro printf replacement for 65C02 printm - a modular micro printf replacement for 65C02
Michael Pohoreski Michael Pohoreski
Copyleft {c} Feb, 2016 Copyleft {c} Feb, 2016
@ -99,12 +99,57 @@ don't need "every" feature. Seriously, when was the last time
you _needed_ octal? :-) you _needed_ octal? :-)
printm() has manually been optimized for size. In gcc parlance, `-Os`. printm() has manually been optimized for size. In gcc parlance, `-Os`.
With everything enabled printm() takes up $1C9 = 457 bytes With everything enabled printm() takes up $1C7 = 455 bytes
(Plus 2 bytes in zero page.) (Plus 2 bytes in zero page.)
Whoa! I thought you said this was micro!? Whoa! I thought you said this was micro!?
With all 15 features turned OFF the core routines use $62 = 98 bytes. Believe me it is. Here are some of the optimization tricks used:
1) Using BIT to skip instructions in common entry point
EntryPointA SEC
db BIT_ZP ; skip over next instruction
EntryPointB
CLC
...common set up code...
BCC _CodeForA
_CodeForB
_CodeForA
_CodeForAll
2) Self-modifying code for dynamic width
EntryPointA LDA n1
db BIT_ABS ; skip next instruction
EntryPointB LDA n2 ; intentional fall into common code
_SetWidth STA _DynamicWidth+1
LDX #0
...code...
_DynamicWidth
CPX #n
3) No CMPs to preserve the Carry flag for common entry points
4) Jump table is 3 bytes/entry, using 65C02: JUMP (FUNCS+1,X)
char, word_ptr_to_func
5) A negative buffer offset so that a register will reach zero
and we can test for end of processing without using a CMP
which would trash the carry:
LDY #$FD ; $00-$FD=-3 bcd[0] bcd[1] bcd[2] bcd[3]
@DoubleDabble: ; Y=FD Y=FE Y=FF Y=00
LDA _bcd-$FD,Y
ADC _bcd-$FD,Y
STA _bcd-$FD,Y
INY
BNE @DoubleDabble
; When Y=0, we'll be at _bcd[3]
With all 15 features turned OFF the core routines use $60 = 96 bytes.
With the common setting (default) features: With the common setting (default) features:
BinAsc, Dec2, Dec3, Dec5, Hex2, Hex4, and StrA BinAsc, Dec2, Dec3, Dec5, Hex2, Hex4, and StrA
@ -122,21 +167,21 @@ To toggle features on / off change USE_* to 0 or 1:
; core _PrintDec routine. ; core _PrintDec routine.
; ;
; Feature Size Bytes Total Notes ; Feature Size Bytes Total Notes
USE_BIN_ASC = 1 ; $7E 126 \. $84 (132 bytes) USE_BIN_ASC = 1 ; $7C 124 \. $82 (130 bytes)
USE_BIN_INV = 0 ; $7E 126 / USE_BIN_INV = 1 ; $7C 124 /
USE_DEC_2 = 1 ; $D5 213 \ USE_DEC_2 = 1 ; $D3 211 \
USE_DEC_3 = 1 ; $D5 213 \.$FE (254 bytes) USE_DEC_3 = 1 ; $D3 213 \.$FE (254 bytes)
USE_DEC_5 = 1 ; $D5 213 / USE_DEC_5 = 1 ; $D5 213 /
USE_DEC_BYTE = 0 ; $ED 237 / sets ENABLE_DEC USE_DEC_BYTE = 1 ; $EB 235 / sets ENABLE_DEC
USE_HEX_2 = 1 ; $99 153 \. $9E (158 bytes) USE_HEX_2 = 1 ; $99 153 \. $9E (158 bytes)
USE_HEX_4 = 1 ; $99 153 / USE_HEX_4 = 1 ; $99 153 /
USE_OCT_3 = 0 ; $92 146 \. $98 (152 bytes) USE_OCT_3 = 1 ; $92 146 \. $98 (152 bytes)
USE_OCT_6 = 0 ; $92 146 / USE_OCT_6 = 1 ; $92 146 /
USE_PTR_2 = 0 ; $A8 168 \. $AD (173 bytes) sets ENABLE_HEX USE_PTR_2 = 1 ; $A8 168 \. $AD (173 bytes) sets ENABLE_HEX
USE_PTR_4 = 0 ; $A8 168 / USE_PTR_4 = 1 ; $A8 168 /
USE_STR_A = 1 ; $78 120 \ USE_STR_A = 1 ; $78 120 \
USE_STR_C = 0 ; $78 120 > $A6 (166 bytes) USE_STR_C = 1 ; $78 120 > $A6 (166 bytes)
USE_STR_PASCAL = 0 ; $7A 122 / USE_STR_PASCAL = 1 ; $7A 122 /
/* /*
@ -181,23 +226,23 @@ Demo (All features) + Library text dump:
4120:DA FD AD 0D 43 85 FE 20 4120:DA FD AD 0D 43 85 FE 20
4128:DA FD 20 AB 41 20 4D 41 4128:DA FD 20 AB 41 20 4D 41
4130:A2 F2 A0 42 20 8F 41 AE 4130:A2 F2 A0 42 20 8F 41 AE
4138:6E 43 86 FE 64 FF 8A 20 4138:85 43 86 FE 64 FF 8A 20
4140:DA FD 20 AB 41 20 4D 41 4140:DA FD 20 AB 41 20 4D 41
4148:A9 8D 4C ED FD 9C A3 44 4148:A9 8D 4C ED FD 9C A1 44
4150:9C A4 44 9C A5 44 A2 10 4150:9C A2 44 9C A3 44 A2 10
4158:F8 06 FE 26 FF A0 FD B9 4158:F8 06 FE 26 FF A0 FD B9
4160:A6 43 79 A6 43 99 A6 43 4160:A4 43 79 A4 43 99 A4 43
4168:C8 D0 F4 CA D0 EB D8 A2 4168:C8 D0 F4 CA D0 EB D8 A2
4170:05 88 B9 A6 43 4A 4A 4A 4170:05 88 B9 A4 43 4A 4A 4A
4178:4A 18 69 B0 20 ED FD CA 4178:4A 18 69 B0 20 ED FD CA
4180:B9 A6 43 29 0F 18 69 B0 4180:B9 A4 43 29 0F 18 69 B0
4188:20 ED FD CA 10 E3 60 86 4188:20 ED FD CA 10 E3 60 86
4190:FC 84 FD A0 00 B1 FC F0 4190:FC 84 FD A0 00 B1 FC F0
4198:06 20 ED FD C8 D0 F6 60 4198:06 20 ED FD C8 D0 F6 60
41A0:A2 08 85 FE 06 FE 6A CA 41A0:A2 08 85 FE 06 FE 6A CA
41A8:D0 FA 60 A9 A0 4C ED FD 41A8:D0 FA 60 A9 A0 4C ED FD
41B0:98 20 C1 FB A6 28 A4 29 41B0:98 20 C1 FB A6 28 A4 29
41B8:8E 86 44 8C 87 44 60 D8 41B8:8E 9B 44 8C 9C 44 60 D8
41C0:BD 23 A0 D9 BD 64 A0 A4 41C0:BD 23 A0 D9 BD 64 A0 A4
41C8:BD 78 BA 40 A0 25 FE 3F 41C8:BD 78 BA 40 A0 25 FE 3F
41D0:00 BF 41 27 00 BF 00 DE 41D0:00 BF 41 27 00 BF 00 DE
@ -239,64 +284,64 @@ Demo (All features) + Library text dump:
42F0:A4 00 A0 E2 F9 F4 E5 F3 42F0:A4 00 A0 E2 F9 F4 E5 F3
42F8:8D A0 A0 A0 A0 AE E6 E5 42F8:8D A0 A0 A0 A0 AE E6 E5
4300:E1 F4 F5 F2 E5 F3 A0 BD 4300:E1 F4 F5 F2 E5 F3 A0 BD
4308:A0 A4 A0 A0 00 C9 01 8E 4308:A0 A4 A0 A0 00 C7 01 8E
4310:93 44 8C 94 44 9C 91 44 4310:2A 43 8C 2B 43 9C 28 43
4318:20 8C 44 8E 67 43 8C 68 4318:20 23 43 8E 7E 43 8C 7F
4320:43 80 43 38 A9 18 20 8C 4320:43 80 5A 20 27 43 AA A0
4328:44 90 03 20 60 44 8A 20 4328:00 B9 DE C0 EE 28 43 D0
4330:60 44 80 2A 38 A9 18 20 4330:03 EE 2B 43 A8 86 FE 84
4338:8C 44 A0 00 B1 FE 90 EF 4338:FF 60 38 A9 18 20 23 43
4340:AA C8 B1 FE 80 E5 20 8C 4340:90 03 20 75 44 8A 20 75
4348:44 A0 00 B1 FE 10 0A 20 4348:44 80 2A 38 A9 18 20 23
4350:85 44 C8 D0 F6 E6 FF 80 4350:43 A0 00 B1 FE 90 EF AA
4358:F2 09 80 20 85 44 EE 67 4358:C8 B1 FE 80 E5 20 23 43
4360:43 D0 03 EE 68 43 AD DE 4360:A0 00 B1 FE 10 0A 20 9A
4368:C0 F0 12 30 EE A2 0F CA 4368:44 C8 D0 F6 E6 FF 80 F2
4370:30 EC DD AB 44 D0 F8 8A 4370:09 80 20 9A 44 EE 7E 43
4378:0A AA 7C BA 44 60 A9 02 4378:D0 03 EE 7F 43 AD DE C0
4380:2C A9 01 2C A9 00 8D B7 4380:F0 B7 30 EE A2 2D CA CA
4388:43 20 8C 44 8E A9 44 8C 4388:CA 30 EA DD A9 44 D0 F6
4390:AA 44 9C A3 44 9C A4 44 4390:7C AA 44 A9 02 2C A9 01
4398:9C A5 44 A2 10 F8 0E A9 4398:2C A9 00 8D CC 43 20 23
43A0:44 2E AA 44 A0 FD B9 A6 43A0:43 8E A7 44 8C A8 44 9C
43A8:43 79 A6 43 99 A6 43 C8 43A8:A1 44 9C A2 44 9C A3 44
43B0:D0 F4 CA D0 E9 D8 A0 03 43B0:A2 10 F8 0E A7 44 2E A8
43B8:F0 0A B9 A3 44 20 6D 44 43B8:44 A0 FD B9 A4 43 79 A4
43C0:20 85 44 88 B9 A3 44 20 43C0:43 99 A4 43 C8 D0 F4 CA
43C8:60 44 88 10 F7 80 8F A9 43C8:D0 E9 D8 A0 03 F0 0A B9
43D0:31 2C A9 B1 8D E4 43 20 43D0:A1 44 20 82 44 20 9A 44
43D8:8C 44 A0 08 8A 0A AA A9 43D8:88 B9 A1 44 20 75 44 88
43E0:B0 90 02 A9 B1 20 85 44 43E0:10 F7 80 91 A9 31 2C A9
43E8:88 D0 F1 4C 5E 43 20 8C 43E8:B1 8D F9 43 20 23 43 A0
43F0:44 8A 10 0A A9 AD 20 85 43F0:08 8A 0A AA A9 B0 90 02
43F8:44 8A 49 FF AA E8 A0 00 43F8:A9 B1 20 9A 44 88 D0 F1
4400:A9 01 8D B7 43 4C 8C 43 4400:4C 75 43 20 23 43 8A 10
4408:A9 06 2C A9 03 8D 2A 44 4408:0A A9 AD 20 9A 44 8A 49
4410:20 8C 44 A2 00 A5 FE 29 4410:FF AA E8 A0 00 A9 01 8D
4418:07 18 69 B0 9D A3 44 A0 4418:CC 43 4C A1 43 A9 06 2C
4420:03 46 FF 66 FE 88 D0 F9 4420:A9 03 8D 3F 44 20 23 43
4428:E8 E0 06 D0 E8 CA 30 BB 4428:A2 00 A5 FE 29 07 18 69
4430:BD A3 44 20 85 44 80 F5 4430:B0 9D A1 44 A0 03 46 FF
4438:20 8C 44 A0 00 B1 FE F0 4438:66 FE 88 D0 F9 E8 E0 06
4440:AA 20 85 44 C8 D0 F6 E6 4440:D0 E8 CA 30 BB BD A1 44
4448:FF 80 F2 20 8C 44 A0 00 4448:20 9A 44 80 F5 20 23 43
4450:B1 FE F0 97 AA C8 B1 FE 4450:A0 00 B1 FE F0 AA 20 9A
4458:20 85 44 CA D0 F7 F0 8B 4458:44 C8 D0 F6 E6 FF 80 F2
4460:20 6D 44 A5 FE 20 85 44 4460:20 23 43 A0 00 B1 FE F0
4468:A5 FF 4C 85 44 48 4A 4A 4468:97 AA C8 B1 FE 20 9A 44
4470:4A 4A 20 78 44 85 FE 68 4470:CA D0 F7 F0 8B 20 82 44
4478:29 0F C9 0A 90 02 69 06 4478:A5 FE 20 9A 44 A5 FF 4C
4480:69 B0 85 FF 60 8D DE C0 4480:9A 44 48 4A 4A 4A 4A 20
4488:EE 86 44 60 20 90 44 AA 4488:8D 44 85 FE 68 29 0F C9
4490:A0 00 B9 DE C0 EE 91 44 4490:0A 90 02 69 06 69 B0 85
4498:D0 03 EE 94 44 A8 86 FE 4498:FF 60 8D DE C0 EE 9B 44
44A0:84 FF 60 00 00 00 00 00 44A0:60 00 00 00 00 00 00 00
44A8:00 00 00 3F 25 62 75 64 44A8:00 3F E4 43 25 E7 43 62
44B0:23 78 24 26 40 4F 6F 70 44B0:03 44 75 93 43 64 96 43
44B8:73 61 CF 43 D2 43 EE 43 44B8:23 99 43 78 3A 43 24 3C
44C0:7E 43 81 43 84 43 23 43 44C0:43 26 4B 43 40 4D 43 4F
44C8:25 43 34 43 36 43 08 44 44C8:1D 44 6F 20 44 70 60 44
44D0:0B 44 4B 44 38 44 46 43 44D0:73 4D 44 61 5D 43
*/ */
@ -942,17 +987,13 @@ __PRINTM
; self-modifying variable aliases ; self-modifying variable aliases
_pScreen = PutChar +1 _pScreen = PutChar +1
_pFormat = GetFormat +1 _pFormat = GetFormat +1
_iArg = NxtArgByte+1 _pArg = NxtArgByte+1
_pArg = IncArg +1
.if ENABLE_DEC .if ENABLE_DEC
_nDecWidth = DecWidth +1 _nDecWidth = DecWidth +1
.endif .endif
.if ENABLE_OCT .if ENABLE_OCT
_nOctWidth = OctWidth +1 _nOctWidth = OctWidth +1
.endif .endif
;.if ENABLE_HEX
; _nHexWidth = HexWidth +1
;.endif
; Entry Point ; Entry Point
; ====================================================================== ; ======================================================================
@ -961,14 +1002,39 @@ __PRINTM
PrintM PrintM
STX _pArg+0 STX _pArg+0
STY _pArg+1 STY _pArg+1
STZ _iArg FirstArg
NextArg
JSR NxtArgYX JSR NxtArgYX
STX _pFormat+0 ; lo STX _pFormat+0 ; lo
STY _pFormat+1 ; hi STY _pFormat+1 ; hi
BRA GetFormat ; always BRA GetFormat ; always
; ======================================================================
; @return next arg as 16-bit arg value in Y,X
NxtArgToTemp
NxtArgYX
JSR NxtArgByte
TAX
; @return _Arg[ _Num ]
NxtArgByte
LDA $C0DE ; _pArg NOTE: self-modifying!
INC _pArg ;
BNE @_SamePage
INC _pArg+1 ;
@_SamePage
TAY
; Callers of NxtToArgYX don't use _temp
_NxtArgToTemp
STX _temp+0 ; zero-page for (ZP),Y
STY _temp+1
;XYtoVal
; STX _val+0 ; may be tempting to move this to NxtArgYX
; STY _val+1 ;
_Done
RTS
; $ Hex 2 Byte ; $ Hex 2 Byte
; x Hex 4 Byte ; x Hex 4 Byte
@ -1118,24 +1184,21 @@ GetFormat
; Instead we count the number of features enabled ; Instead we count the number of features enabled
GetNumFeatures GetNumFeatures
.if (NumMeta > 0) .if (NumMeta > 0)
LDX #NumMeta ; pos = meta LDX #NumMeta*3 ; pos = meta
.else .else
.out "INFO: No meta commands, defaulting to text" .out "INFO: No meta commands, defaulting to text"
BRA ForceAPPLE BRA ForceAPPLE
.endif .endif
FindMeta FindMeta
DEX
DEX
DEX DEX
BMI NextFormat BMI NextFormat
CMP MetaChar,X CMP MetaTable,X
BNE FindMeta BNE FindMeta
CallMeta CallMeta
TXA JMP (MetaTable+1,X)
ASL
TAX
JMP (MetaFunc,X)
_Done
RTS
; ______________________________________________________________________ ; ______________________________________________________________________
@ -1189,8 +1252,8 @@ DEBUG .sprintf( "PrintDec2() @ %X", * )
ASL _val+0 ASL _val+0
ROL _val+1 ROL _val+1
LDY #$FD LDY #$FD ; $00-$FD=-3 bcd[0] bcd[1] bcd[2] bcd[3]
@DoubleDabble: @DoubleDabble: ; Y=FD Y=FE Y=FF Y=00
LDA _bcd-$FD,Y LDA _bcd-$FD,Y
ADC _bcd-$FD,Y ADC _bcd-$FD,Y
STA _bcd-$FD,Y STA _bcd-$FD,Y
@ -1201,12 +1264,12 @@ DEBUG .sprintf( "PrintDec2() @ %X", * )
BNE @Dec2BCD BNE @Dec2BCD
CLD CLD
.if 1 ; NEW_PRINT_DEC
DecWidth: DecWidth:
LDY #3 ; default to 6 digits LDY #3 ; default to 6 digits
BEQ @EvenBCD BEQ @EvenBCD ; special case 0 -> only 2 digits
; Print low nibble, skip high nibble ; otherwise have odd digits,
@OddBCD: ; X = num digits to print ; Print low nibble, skip high nibble
@OddBCD: ; Y = num digits/2 to print
LDA _bcd,Y ; __c??? _b_?XX a_YYXX LDA _bcd,Y ; __c??? _b_?XX a_YYXX
JSR HexA JSR HexA
JSR PutChar JSR PutChar
@ -1217,29 +1280,6 @@ DEBUG .sprintf( "PrintDec2() @ %X", * )
DEY DEY
BPL @EvenBCD BPL @EvenBCD
BRA NextFormat ; always BRA NextFormat ; always
.else
LDX #5 ; was Y, default to 6 digits
@BCD2Char: ; NOTE: Digits are reversed!
LDA _bcd,Y ; __c??? _b_?XX a_YYXX
LSR
LSR
LSR
LSR
CLC
ADC #'0'+$80
STA _bcd,X ; __c??X _b_YXX aZYYXX
DEX ; was Y
@BCDBotNib:
LDA _bcd,Y ; __c??X _b_YXX aZYYXX
AND #$F
CLC
ADC #'0'+$80
STA _bcd,X ; __c?XX _bYYXX ZZYYXX
DEX
BPL @BCD2Char
DecWidth:
LDX #5 ; _nDecDigits NOTE: self-modifying!
.endif
.endif ; ENABLE_DEC .endif ; ENABLE_DEC
@ -1326,7 +1366,6 @@ DEBUG .sprintf( "PrintOct6() @ %X", * )
PrintOct6: PrintOct6:
LDA #6 LDA #6
.if USE_OCT_3 .if USE_OCT_3
;BNE _PrintOct
db $2C ; BIT $abs skip next instruction db $2C ; BIT $abs skip next instruction
.endif .endif
.endif .endif
@ -1460,155 +1499,84 @@ PutChar
JMP COUT JMP COUT
.endif .endif
; ======================================================================
; @return next arg as 16-bit arg value in Y,X
NxtArgToTemp
NxtArgYX
JSR NxtArgByte
TAX
; @return _Arg[ _Num ]
NxtArgByte
LDY #00 ; _iArg NOTE: self-modifying!
IncArg
LDA $C0DE,Y ; _pArg NOTE: self-modifying!
INC _iArg ;
BNE @_SamePage
INC _pArg+1 ;
@_SamePage
TAY
; Callers of NxtToArgYX don't use _temp
_NxtArgToTemp
STX _temp+0 ; zero-page for (ZP),Y
STY _temp+1
;XYtoVal
; STX _val+0 ; may be tempting to move this to NxtArgYX
; STY _val+1 ;
RTS
; ;
; ====================================================================== ; ======================================================================
_bcd ds 6 ; 6 chars for printing dec _bcd ds 6 ; 6 chars for printing dec
_val dw 0 ; PrintHex2 PrintHex4 temp _val dw 0 ; PrintHex2 PrintHex4 temp
MetaChar MetaTable
.if ENABLE_BIN .if ENABLE_BIN
.if USE_BIN_INV .if USE_BIN_INV
db '?' ; PrintBinInv NOTE: 1's printed in inverse db '?' ; PrintBinInv NOTE: 1's printed in inverse
.endif
.if USE_BIN_ASC
db '%' ; PrintBinAsc
.endif
.endif
.if ENABLE_DEC
.if USE_DEC_BYTE
db 'b' ; PrintByte NOTE: Signed -128 .. +127
.endif
.if USE_DEC_5
db 'u' ; PrintDec5
.endif
.if USE_DEC_3
db 'd' ; PrintDec3
.endif
.if USE_DEC_2
db '#' ; PrintDec2
.endif
.endif
.if ENABLE_HEX
.if USE_HEX_4
db 'x' ; PrintHex4
.endif
.if USE_HEX_2
db '$' ; PrintHex2
.endif
.if USE_PTR_4
db '&' ; PrintPtr4
.endif
.if USE_PTR_2
db '@' ; PrintPtr2
.endif
.endif
.if ENABLE_OCT
.if USE_OCT_6
db 'O' ; PrintOct6
.endif
.if USE_OCT_3
db 'o' ; PrintOct3
.endif
.endif
.if ENABLE_STR
.if USE_STR_PASCAL
db 'p' ; PrintStrP NOTE: Pascal string; C printf 'p' is pointer!
.endif
.if USE_STR_C
db 's' ; PrintStrC NOTE: C string, zero terminated
.endif
.if USE_STR_A
db 'a' ; PrintStrA NOTE: Last byte is ASCII
.endif
.endif
_MetaCharEnd
MetaFunc
.if ENABLE_BIN
.if USE_BIN_INV
dw PrintBinInv dw PrintBinInv
.endif .endif
.if USE_BIN_ASC .if USE_BIN_ASC
db '%' ; PrintBinAsc
dw PrintBinAsc dw PrintBinAsc
.endif .endif
.endif .endif
.if ENABLE_DEC .if ENABLE_DEC
.if USE_DEC_BYTE .if USE_DEC_BYTE
db 'b' ; PrintByte NOTE: Signed -128 .. +127
dw PrintByte dw PrintByte
.endif .endif
.if USE_DEC_5 .if USE_DEC_5
db 'u' ; PrintDec5
dw PrintDec5 dw PrintDec5
.endif .endif
.if USE_DEC_3 .if USE_DEC_3
db 'd' ; PrintDec3
dw PrintDec3 dw PrintDec3
.endif .endif
.if USE_DEC_2 .if USE_DEC_2
db '#' ; PrintDec2
dw PrintDec2 dw PrintDec2
.endif .endif
.endif .endif
.if ENABLE_HEX .if ENABLE_HEX
.if USE_HEX_4 .if USE_HEX_4
db 'x' ; PrintHex4
dw PrintHex4 dw PrintHex4
.endif .endif
.if USE_HEX_2 .if USE_HEX_2
db '$' ; PrintHex2
dw PrintHex2 dw PrintHex2
.endif .endif
.if USE_PTR_4 .if USE_PTR_4
db '&' ; PrintPtr4
dw PrintPtr4 dw PrintPtr4
.endif .endif
.if USE_PTR_2 .if USE_PTR_2
db '@' ; PrintPtr2
dw PrintPtr2 dw PrintPtr2
.endif .endif
.endif .endif
.if ENABLE_OCT .if ENABLE_OCT
.if USE_OCT_6 .if USE_OCT_6
db 'O' ; PrintOct6
dw PrintOct6 dw PrintOct6
.endif .endif
.if USE_OCT_3 .if USE_OCT_3
db 'o' ; PrintOct3
dw PrintOct3 dw PrintOct3
.endif .endif
.endif .endif
.if ENABLE_STR .if ENABLE_STR
.if USE_STR_PASCAL .if USE_STR_PASCAL
db 'p' ; PrintStrP NOTE: Pascal string; C printf 'p' is pointer!
dw PrintStrP dw PrintStrP
.endif .endif
.if USE_STR_C .if USE_STR_C
db 's' ; PrintStrC NOTE: C string, zero terminated
dw PrintStrC dw PrintStrC
.endif .endif
.if USE_STR_A .if USE_STR_A
db 'a' ; PrintStrA NOTE: Last byte is ASCII
dw PrintStrA dw PrintStrA
.endif .endif
.endif .endif
@ -1618,5 +1586,5 @@ __END
DEBUG .sprintf( "_bcd @ %X", _bcd ) DEBUG .sprintf( "_bcd @ %X", _bcd )
DEBUG .sprintf( "Total size: %X (%d bytes)", __END -__MAIN, __END -__MAIN) DEBUG .sprintf( "Total size: %X (%d bytes)", __END -__MAIN, __END -__MAIN)
DEBUG .sprintf( "Demo size: %X (%d bytes)", __PRINTM-__MAIN, __PRINTM-__MAIN) DEBUG .sprintf( "Demo size: %X (%d bytes)", __PRINTM-__MAIN, __PRINTM-__MAIN)
DEBUG .sprintf( "printm size: %X (%d bytes)", __LIB_SIZE , __LIB_SIZE ) .out .sprintf( "printm size: %X (%d bytes)", __LIB_SIZE , __LIB_SIZE )