!!! 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          <-
      OD
}}}
And 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.