Fix for PrintF Routine#
Fix for PrintF on Action! Toolkit
The PrintF routine on the Action! Toolkit works great unless you try to print a CARD value greater than 32767, or try to print the INT value -32768. The reason these problems occur is that the PROC PF_NBase in the PRINTF.ACT file uses the "/" and "MOD" operators, which call the cartridge divide routine. The divide routine is a SIGNED divide, so it doesn't work for large card values. The solution is to insert an UNSIGED divide routine into the PRINTF.ACT file and use it, instead. First, insert the following code at the beginning of PRINTF.ACT:
CARD Quotient, Remainder PROC UDiv( CARD a, divisor ) DEFINE GETCARRY="~[$2E carry]" BYTE carry, i CARD temp Remainder = 0 FOR i = 1 TO 16 DO Remainder ==LSH 1 Quotient ==LSH 1 IF (a&$8000)#0 THEN Remainder ==% 1 FI a ==LSH 1 temp = Remainder - divisor GETCARRY IF (carry&1)#0 THEN Remainder = temp Quotient ==+ 1 FI OD RETURN
Some code in the PROCedure PF_NBase must also be changed. Find the section of code that reads as follows:
WHILE n>0 DO d=n MOD base <- IF d<10 THEN d==+'0 ELSE d==+55 FI s(ptr)=d ptr==-1 length==+1 n=n/base <- ODAnd change the two lines indicated so the code reads like this:
WHILE n>0 DO UDiv( n, base ) <- d=Remainder <- IF d<10 THEN d==+'0 ELSE d==+55 FI s(ptr)=d ptr==-1 length==+1 n=Quotient <- OD
The resulting PrintF routine will work properly for all CARD and INTeger numbers.