This is a cross-referenced version of writeint.plan, to download the unmodified
source try writeint.plan.
#PROGRAM /GFWRITEINT(15AM,22AM,DBM,EBM)
#PAGE
#INCLUDE IOHEAD(/DEFS)
#INCLUDE STACK(/DEFS)
#PERMANENT GFWRITE6 [ consolidator doesn't have a #CUE
#PERMANENT GFWRITESP
#PROGRAM
# Write an integer.
# ERR = WRITEINT(FD, VAL, LEN)
# CALL 1 WRITEINT
# LDN 3 FD
# LDN 3 VAL [ value to write
# LDN 3 LEN [ field width
# If field width is -v left justify in field
# If field width is too small we will use
# minimum space necessary.
#SET ARGS=0
#DEFINE ARGFD=ARGS
#SET ARGS=ARGS+1
#DEFINE ARGVAL=ARGS
#SET ARGS=ARGS+1
#DEFINE ARGLEN=ARGS
#SET ARGS=ARGS+1
# Define stack frame
#SET STFRAME=SXFRAME
# First the arguments
#DEFINE STFD=SXPAR1 [ FD
#SET STFRAME=STFRAME+1
#DEFINE STVAL=SXPAR2 [ value to output
#SET STFRAME=STFRAME+1
#DEFINE STLEN=SXPAR3 [ Field width
#SET STFRAME=STFRAME+1
# Amd now the local variables
#DEFINE STBUF=STFRAME [ Buffer to hold text
#SET STFRAME=STFRAME+2 [ two words (8 chars) long
#DEFINE STDESC=STFRAME [ saveed FDESC
#SET STFRAME=STFRAME+1
# Fortran entry point, save args to the stack
STACK 2
OBEY ARGFD(1)
LDX 0 0(3) [ get FD
STO 0 STFD(2)
OBEY ARGVAL(1)
LDX 0 0(3) [ get val
STO 0 STVAL(2)
OBEY ARGLEN(1) [ get len
LDX 0 0(3)
STO 0 STLEN(2)
ADN 1 ARGS
# Pascal style entry point
#CUE GPWRITEINT
BEGIN 2 3,1,STFRAME
LDX 0 STFD(2)
STO 0 SXPAR1(3) [ is FD open?
LDN 0 1 [ in write mode
STO 0 SXPAR2(3)
CALL 1 GPIOCHECK
BNG 6 DONE
STO 6 STDESC(2)
# Crazy algorithm modified from George
#
# Comments indicate that +7036875 is
# 2**46/10**7, which it is if you
# round up.
LDX 4 STVAL(2) [ get value to output
LDN 3 STBUF(2) [ get pointer to buffer
MPY 4 '+7036875' [ TIMES CONVERSION FACTOR
BPZ 4 POS [ ok if +ve
NGXC 5 5 [ negate low word, setting carry
NGX 4 4 [ negate high word, + carry
LDN 0 #35 [ set output char to "-"
DCH 0 0(3) [ output "-"
BCHX 3 *+1 [ bump output pointer
POS MODE 0 [ no zero supression please
LDN 7 7 [ up to 7 digits
CBD 4 0 [ convert digit to X0
BNZ 0 TRAIL [ jump if not leading zero
BCT 7 *-2 [ loop back for more leading zero
LDN 7 1 [ output last, zero, digit
TRAIL DCH 0 0(3) [ save digit
BCHX 3 *+1 [ bump pointer
BRN REST [ enter trailing digit loop
CBD 4 0(3) [ CONVERT LAST DIGITS
BCHX 3 *+1 [ STEP POINTER
REST BCT 7 *-2 [ and back for more
# Ok, now X3 pointing at char after last used
# work out how long this is
# In 15AM the character counter/modifier is
# NNCCCCCCCAAAAAAAAAAAAAAA
# 2 bit char pos
# 7 bit count
# 15 bit word addr.
FILL SBN 3 STBUF(2) [ as a char pointer
SLC 3 2 [ as #chars
ANDN 3 #7777 [ Zap the 15AM count field
STO 3 STVAL(2) [ set true field length
LDX 4 STLEN(2) [ get wanted field width
SBX 4 3 [ subtract actual length
BNG 4 OUT [ jump if number > field
BZE 4 OUT
# Output number of spaces held in X4
RIGHT STACK 3
LDX 0 STFD(2)
STO 0 SXPAR1(3)
STO 4 SXPAR2(3)
CALL 1 GPWRITESP [ write spaces
BNG 6 BYE
OUT STACK 3
LDX 0 STFD(2)
STO 0 SXPAR1(3)
LDN 0 STBUF(2)
STO 0 SXPAR2(3)
STOZ SXPAR3(3)
LDX 0 STVAL(2)
STO 0 SXPAR4(3)
CALL 1 GPWRITE6
BNG 6 BYE
LEFT NGX 4 STLEN(2) [ get back wanted field width
SBX 4 STVAL(2) [ subtract actual width
BNG 4 DONE
BZE 4 DONE [ quit if no spaces
STACK 3
LDX 0 STFD(2)
STO 0 SXPAR1(3)
STO 4 SXPAR2(3)
CALL 1 GPWRITESP
BNG 6 BYE
DONE LDN 6 0 [ zero = success
BYE END 2 1,0
#END
#FINISH