mirror of
https://github.com/PDP-10/its.git
synced 2026-01-17 00:33:22 +00:00
712 lines
12 KiB
Plaintext
712 lines
12 KiB
Plaintext
TITLE TIME -- P. D. LEBLING (PDL)
|
||
|
||
.MLLIT=1
|
||
|
||
A=1
|
||
B=2
|
||
C=3
|
||
D=4
|
||
E=5
|
||
F=6
|
||
G=7
|
||
|
||
MODE=10
|
||
PDTIM=11 ; number seconds since start of year
|
||
RYEAR=12 ; various info about this year
|
||
RTIME=13
|
||
RDATE=14
|
||
RDTIM=15 ; how long system has been up
|
||
DIETI=16 ; when system will go down
|
||
|
||
P=17
|
||
|
||
; mode bits
|
||
|
||
%TIDE==1
|
||
%POM==2
|
||
|
||
TYOC==2
|
||
|
||
DEFINE SECS D,H,M,S
|
||
<S+<60.*<M+<60.*<H+<24.*D>>>>>>
|
||
TERMIN
|
||
|
||
SPD==<SECS 1> ; 24.*60.*60.
|
||
|
||
PDL: BLOCK 40
|
||
|
||
RECORD: SETZ
|
||
SIXBIT/OPEN/
|
||
[.UII,,17]
|
||
[SIXBIT/SYS/]
|
||
[SIXBIT/RECORD/]
|
||
SETZ [SIXBIT/TIME/]
|
||
|
||
GETREC: SETZ
|
||
'RFDATE
|
||
MOVEI 17
|
||
SETZM A
|
||
|
||
SETREC: SETZ
|
||
'SFDATE
|
||
MOVEI 17
|
||
SETZ A
|
||
|
||
; val 1 The creation date of the file:
|
||
; 4.7-4.1 Year (mod 100.).
|
||
; 3.9-3.6 Month (January = 1).
|
||
; 3.5-3.1 Day of month.
|
||
; 2.9-1.1 Time of creation, in half-seconds
|
||
; after midnight.
|
||
|
||
COMMND: BLOCK 10.
|
||
|
||
START: MOVE P,[-40,,PDL]
|
||
.OPEN TYOC,[SIXBIT / !TTYXXXXXXYYYYYY/]
|
||
.VALUE
|
||
|
||
.BREAK 12,[5,,COMMND]
|
||
SETZ MODE,
|
||
SKIPN COMMND ; none there?
|
||
JRST GATHER
|
||
; for the moment, any jcl means print all crap...
|
||
TLO MODE,%TIDE+%POM
|
||
|
||
; gather ye rosebuds
|
||
GATHER: .RDATI RTIME,
|
||
CAMN RTIME,[-1]
|
||
.VALUE [ASCIZ /:
|
||
System time not set. Run PDSET.
|
||
|
||
:KILL
|
||
/]
|
||
.RLPDT PDTIM, ; also RYEAR into RYEAR
|
||
TLNE RYEAR,400000 ; if not leap year, after 2/28, back up a day
|
||
SUBI PDTIM,SPD
|
||
TLNE RYEAR,200000 ; if leap year, feb. has 29. days
|
||
AOS FEBRUA
|
||
TLNE RYEAR,100000 ; if daylight savings in effect, back up an hour
|
||
SUBI PDTIM,3600.
|
||
.CALL RDSYST
|
||
.VALUE
|
||
|
||
; time
|
||
OASC [ASCIZ /The time is /]
|
||
|
||
; hh:mm:ss
|
||
LDB A,[301400,,RTIME]
|
||
ROT A,-12.
|
||
OSIX A
|
||
OASCI ":
|
||
LDB A,[141400,,RTIME]
|
||
ROT A,-12.
|
||
OSIX A
|
||
OASCI ":
|
||
LDB A,[001400,,RTIME]
|
||
ROT A,-12.
|
||
OSIX A
|
||
|
||
ifn 1,[
|
||
;; hack configured timezone
|
||
tlnn ryear,10000 ;TZ known?
|
||
jrst tz5 ;No, assume 5 = EST
|
||
ldb a,[230400,,ryear] ;Get absolute TZ
|
||
tlne ryear,4000 ;Negative?
|
||
movns a
|
||
skipa
|
||
tz5: movei a,5
|
||
push p,b
|
||
hlrz b,tznam(a) ;Assume standard
|
||
tlne ryear,100000 ;DST?
|
||
hrrz b,tznam(a) ;Yes
|
||
skipe (b)
|
||
oasc [asciz / /]
|
||
oasc (b)
|
||
pop p,b
|
||
oascr [asciz /./]
|
||
]
|
||
.else [
|
||
; est or edt?
|
||
MOVEI A,[ASCIZ / EDT./]
|
||
TLNN RYEAR,100000
|
||
MOVEI A,[ASCIZ / EST./]
|
||
OASCR (A)
|
||
]
|
||
|
||
; date
|
||
OASC [ASCIZ /Today is /]
|
||
|
||
; day of week
|
||
LDB A,[320300,,RYEAR]
|
||
OASC @WEEK(A)
|
||
OASC [ASCIZ /day, the /]
|
||
|
||
; day of month
|
||
LDB A,[001400,,RDATE]
|
||
CAIG A,(SIXBIT / 09/)
|
||
ANDI A,77
|
||
MOVE B,A
|
||
ROT A,-6
|
||
TRNE A,77
|
||
JRST .-2
|
||
OSIX A
|
||
MOVE A,B
|
||
ANDI A,17 ; units digit
|
||
ANDI B,1700 ; tens digit
|
||
CAIN B,100
|
||
MOVEI A,0
|
||
CAIL A,4
|
||
MOVEI A,0
|
||
OASC @SUFFIX(A)
|
||
|
||
; month
|
||
OASC [ASCIZ / of /]
|
||
LDB B,[141400,,RDATE]
|
||
ANDI B,1700
|
||
LSH B,-6
|
||
IMULI B,10.
|
||
LDB A,[141400,,RDATE]
|
||
ANDI A,17
|
||
ADD A,B
|
||
OASC @MONTHS-1(A)
|
||
|
||
; year
|
||
OASC [ASCIZ /, /]
|
||
HRRZ A,RYEAR
|
||
ODEC A
|
||
OASCR [ASCIZ /./]
|
||
|
||
; phase of the moon
|
||
TLNE MODE,%TIDE
|
||
PUSHJ P,POM ; phase of the moon
|
||
|
||
; next and previous high tide in Boston Harbor
|
||
TLNE MODE,%POM
|
||
PUSHJ P,TIDE ; tides
|
||
|
||
; uptime
|
||
OSIX SYSTEM
|
||
OASC [ASCIZ / ITS /]
|
||
OSIX SYSVER
|
||
OASC [ASCIZ / has run for /]
|
||
|
||
; days, hours, minutes, seconds
|
||
MOVE A,RDTIM
|
||
PUSHJ P,PTIME
|
||
OASCR [ASCIZ /./]
|
||
|
||
; see if record-breaking uptime
|
||
CHKREC: .CALL RECORD
|
||
JRST NOREC
|
||
.CALL GETREC
|
||
JRST NOREC
|
||
TLNE A,177000
|
||
JRST NOREC ;SYSTEM DOESN'T STAY UP FOR YEARS ON END
|
||
;; LDB B,[220500,,A] ;GET NUMBER OF DAYS
|
||
;; BV: use more bits here (certainly we stay up more than 63 days)
|
||
ldb b,[221100,,a] ; Get up to 1023 days
|
||
IMULI B,<SPD*2>
|
||
ADDI B,(A) ;B := PREVIOUS RECORD IN HALF SEC
|
||
IMULI B,15. ;CONVERT TO JIFFIES
|
||
CAML B,RDTIM
|
||
JRST OLDREC
|
||
MOVE A,RDTIM ;NEW RECORD! STORE ON DISK
|
||
IDIVI A,15.
|
||
IDIVI A,<SPD*2>
|
||
HRLZ A,A ;DAYS IN LH
|
||
HRR A,B ;1/2 SECONDS IN RH
|
||
.CALL SETREC
|
||
JFCL
|
||
.CLOSE 17,
|
||
OASC [ASCIZ/Surpassing all previous /]
|
||
OSIX SYSTEM
|
||
OASCR [ASCIZ/ records for uptime!/]
|
||
JRST NOREC
|
||
|
||
OLDREC: MOVE A,B
|
||
MOVE B,RDTIM
|
||
ADD B,[30.*3600.*30.] ;WITHIN 30 HOURS OF RECORD?
|
||
CAMG B,A
|
||
JRST NOREC
|
||
OASC [ASCIZ/Approaching the previous /]
|
||
OSIX SYSTEM
|
||
OASC [ASCIZ/ record of /]
|
||
PUSHJ P,PTIME
|
||
OASCR [ASCIZ/./]
|
||
NOREC:
|
||
|
||
; sys down time
|
||
CAMN DIETI,[-1]
|
||
JRST CHKDBG ; not dying
|
||
CAMN DIETI,[-2]
|
||
JRST DEAD
|
||
OASC [ASCIZ /The system will go down in /]
|
||
|
||
; days, etc.
|
||
MOVE A,DIETI
|
||
PUSHJ P,PTIME
|
||
CONTIN: OASCR [ASCIZ /./]
|
||
JRST CHKDBG
|
||
|
||
DEAD: OASCR [ASCIZ /The system is down./]
|
||
|
||
; being debugged?
|
||
CHKDBG: SKIPN DBGSW
|
||
JRST QUIT
|
||
OASCR [ASCIZ /The system is being debugged./]
|
||
|
||
; exit
|
||
QUIT: .BREAK 16,140000
|
||
|
||
|
||
PMONDA: PUSH P,A
|
||
PUSH P,B
|
||
ADDI A,1
|
||
PMONIN: MOVSI B,-12.
|
||
PMONLP: CAMG A,MONLNG(B)
|
||
JRST PMOND1
|
||
SUB A,MONLNG(B)
|
||
AOBJN B,PMONLP
|
||
JRST PMONIN
|
||
PMOND1: HRRZS B
|
||
OASC @MONTHS(B)
|
||
OASCI "
|
||
ODEC A
|
||
POP P,B
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
PDATE: PUSH P,A
|
||
PUSH P,B
|
||
; TLNE RYEAR,400000 ; if not leap year, after 2/28, back up a day
|
||
; ADDI A,SPD
|
||
TLNE RYEAR,100000 ; if daylight savings in effect, back up an hour
|
||
ADDI A,3600.
|
||
IDIVI A,SPD
|
||
PUSHJ P,PMONDA
|
||
OASC [ASCIZ ", "]
|
||
MOVE A,B
|
||
IDIVI A,3600.
|
||
ODEC A
|
||
MOVE A,B
|
||
IDIVI A,60.
|
||
OASCI ":
|
||
ODEC 2,A
|
||
MOVE A,B
|
||
OASCI ":
|
||
ODEC 2,A
|
||
POP P,B
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
PTIME: PUSH P,A
|
||
PUSH P,B
|
||
PUSH P,C
|
||
|
||
CAIG A,15.
|
||
JRST PEPSI
|
||
ADDI A,15.
|
||
|
||
SETZ C,
|
||
IDIV A,[30.*60.*60.*24.]
|
||
JUMPE A,PHOURS
|
||
ODEC A
|
||
MOVE C,A
|
||
OASC [ASCIZ / day/]
|
||
CAIE C,1
|
||
OASCI "s
|
||
|
||
PHOURS: MOVE A,B
|
||
IDIVI A,30.*60.*60. ; HOURS IN A
|
||
JUMPE A,PMINUT
|
||
JUMPE C,PHOUR1
|
||
OASC [ASCIZ /, /]
|
||
PHOUR1: ODEC A
|
||
MOVE C,A
|
||
OASC [ASCIZ / hour/]
|
||
CAIE C,1
|
||
OASCI "s
|
||
|
||
PMINUT: MOVE A,B
|
||
IDIVI A,30.*60. ; MINS IN A+1
|
||
JUMPE A,PSECON
|
||
JUMPE C,PMINU1
|
||
OASC [ASCIZ /, /]
|
||
PMINU1: ODEC A
|
||
MOVE C,A
|
||
OASC [ASCIZ / minute/]
|
||
CAIE C,1
|
||
OASCI "s
|
||
|
||
PSECON: MOVE A,B
|
||
IDIVI A,30. ; SEC IN A+2
|
||
JUMPE A,PTIMEX
|
||
JUMPE C,PSECO1
|
||
OASC [ASCIZ /, /]
|
||
PSECO1: ODEC A
|
||
MOVE C,A
|
||
OASC [ASCIZ / second/]
|
||
CAIE C,1
|
||
OASCI "s
|
||
JRST PTIMEX
|
||
|
||
PEPSI: OASC [ASCIZ /a VERY short time/]
|
||
|
||
PTIMEX: POP P,C
|
||
POP P,B
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
; days of week
|
||
WEEK: [ASCIZ /Sun/]
|
||
[ASCIZ /Mon/]
|
||
[ASCIZ /Tues/]
|
||
[ASCIZ /Wednes/]
|
||
[ASCIZ /Thurs/]
|
||
[ASCIZ /Fri/]
|
||
[ASCIZ /Satur/]
|
||
|
||
; month table
|
||
MONTHS: [ASCIZ /January/]
|
||
[ASCIZ /February/]
|
||
[ASCIZ /March/]
|
||
[ASCIZ /April/]
|
||
[ASCIZ /May/]
|
||
[ASCIZ /June/]
|
||
[ASCIZ /July/]
|
||
[ASCIZ /August/]
|
||
[ASCIZ /September/]
|
||
[ASCIZ /October/]
|
||
[ASCIZ /November/]
|
||
[ASCIZ /December/]
|
||
|
||
MONLNG: 31.
|
||
FEBRUA: 28.
|
||
31. ? 30. ? 31. ? 30. ? 31. ? 31. ? 30. ? 31. ? 30. ? 31.
|
||
|
||
; number suffixes
|
||
SUFFIX: [ASCIZ /th/]
|
||
[ASCIZ /st/]
|
||
[ASCIZ /nd/]
|
||
[ASCIZ /rd/]
|
||
|
||
DEFINE TZONE STD,DST
|
||
[ASCIZ /STD/],,[ASCIZ /DST/]
|
||
TERMIN
|
||
repeat 12.-2,TZONE ;Dunno -3..-12
|
||
tzone EET,EEST ;-2
|
||
tzone CET,CEST ;-1
|
||
tznam: TZONE GMT,BST ; 0 How to ask for British Summer Time??
|
||
TZONE ; 1
|
||
TZONE ; 2
|
||
TZONE ; 3 (NST = Newfoundland is -0330)
|
||
TZONE AST,ADT ; 4 Atlantic
|
||
TZONE EST,EDT ; 5 Eastern
|
||
TZONE CST,CDT ; 6 Central
|
||
TZONE MST,MDT ; 7 Mountain
|
||
TZONE PST,PDT ; 8 Pacific
|
||
TZONE YST,YDT ; 9 Yukon
|
||
TZONE HST,HDT ; 10 Alaska-Hawaii
|
||
TZONE BST,BDT ; 11 Bering
|
||
REPEAT 24.-11.,TZONE ; 12-24 unspecified
|
||
|
||
|
||
; type out the phase of the moon
|
||
|
||
POM: OASC [ASCIZ "The Moon is "]
|
||
PUSHJ P,GNDS0 ; get number of days since 1/1/0000
|
||
MULI A,SPD ; convert to seconds in a and aa
|
||
JFCL 17,.+1 ; clear flags for following
|
||
ADD B,PDTIM ; # seconds since beginning of year
|
||
ADD B,SYNOFS ; moon doesn't quite believe in the gregorian calendar
|
||
JFCL 4,[AOJA A,.+1] ; cry1
|
||
ASHC A,2 ; convert to quarter seconds
|
||
DIV A,SYNP ; divide by number of seconds in a period to get
|
||
; number of quarters since then
|
||
ASH B,-2 ; convert remainder to seconds (# seconds into this
|
||
; quarter)
|
||
EXCH B,A
|
||
IMULI A,30. ; expressed in 1/30ths of a second
|
||
PUSHJ P,PTIME
|
||
|
||
ANDI B,3 ; get quarter in B
|
||
OASCR @PHASES(B)
|
||
POPJ P,
|
||
|
||
PHASES: [ASCIZ " past new."]
|
||
[ASCIZ " beyond its first quarter."]
|
||
[ASCIZ " past full."]
|
||
[ASCIZ " into its last quarter."]
|
||
|
||
SYNP: SECS 29.,12.,44.,3
|
||
; lunar month expressed in seconds (29d 12h 44m 2.7s)
|
||
SYNOFS: SECS 7.,23.,54.,42.
|
||
; offset of lunar period in seconds (7d 23h 54m 42s)
|
||
; (Basically, phase of the moon is reckoned from something
|
||
; like 12/23 in 1 BC.)
|
||
|
||
; type out the of the next high tide
|
||
|
||
TIDE: PUSH P,A
|
||
PUSH P,B
|
||
MOVE A,PDTIM ; seconds so far this year
|
||
SUB A,TIDOFS ; first high tide this year was...
|
||
ASH A,1 ; convert to half seconds
|
||
IDIV A,TIDEP ; divide by number of seconds in a period to get
|
||
; number of halves since then
|
||
IMUL A,TIDEP
|
||
MOVE B,A
|
||
ADD B,TIDEP
|
||
ASH A,-1
|
||
ADD A,TIDOFS
|
||
OASC [ASCIZ /Last high tide: /]
|
||
PUSHJ P,PDATE
|
||
OASCR [0]
|
||
OASC [ASCIZ /Next high tide: /]
|
||
MOVE A,B
|
||
ASH A,-1
|
||
ADD A,TIDOFS
|
||
PUSHJ P,PDATE
|
||
OASCR [0]
|
||
POP P,B
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
TIDTAB: MOVE B,TIDOFS
|
||
SETZ C,
|
||
TIDLUP: OALIGN 3,C
|
||
OHPOS 8.
|
||
MOVE A,B
|
||
PUSHJ P,PDATE
|
||
OASCR [0]
|
||
ADD B,TIDEP
|
||
AOJA C,TIDLUP
|
||
|
||
|
||
TIDEP: SECS 0,24.,49.,50.
|
||
; time between successive high tides
|
||
TIDOFS: SECS 0,10.,38.,30.
|
||
; offset of first high tide of 1976.
|
||
|
||
; get number of days since 1/1/0000 (as of 1/1/current year) in a
|
||
|
||
GNDS0: PUSH P,B
|
||
PUSH P,C
|
||
HRRZ C,RYEAR ; get year
|
||
MOVEI A,-1(C) ; also get year-1 in a
|
||
IMULI C,365. ; first approximation
|
||
IDIVI A,4
|
||
ADD C,A ; add number of years divisible by 4
|
||
IDIVI A,25.
|
||
SUB C,A ; subtract number of years divisible by 100
|
||
IDIVI A,4
|
||
ADD A,C ; add crud already calculated to number of years divisible
|
||
AOS A
|
||
POP P,C
|
||
POP P,B
|
||
POPJ P, ; by 400
|
||
|
||
; call block for .call /sstatu/
|
||
|
||
RDSYST: SETZ
|
||
'SSTATU
|
||
MOVEM DIETI ; time til system down
|
||
MOVEM DBGSW' ; debug mode?
|
||
MOVEM ; users
|
||
MOVEM ; parerr+cornxm
|
||
MOVEM RDTIM ; time system up
|
||
MOVEM SYSTEM' ; sixbit /system-name/
|
||
SETZM SYSVER' ; sixbit /system-version/
|
||
|
||
|
||
; ================================================================
|
||
; uuo handler (typeout uuos)
|
||
; ================================================================
|
||
|
||
ZZZ==.
|
||
LOC 40
|
||
0
|
||
JSR UUOH
|
||
LOC ZZZ
|
||
UUOCT==0
|
||
UUOTAB: JRST ILUUO
|
||
IRPS X,,[DEC BPTR OCT CTLP ASCC SIX ASC ASCI ASCR SIXS HPOS ALIGN SIGN]
|
||
UUOCT==UUOCT+1
|
||
O!X=UUOCT_27.
|
||
JRST UO!X
|
||
TERMIN
|
||
|
||
IFG UUOCT-37, PRINTC /---TOO MANY UUO'S---/
|
||
|
||
UUOMAX==.-UUOTAB
|
||
|
||
|
||
UUOD: 0 ; contents of UUO eff addr.
|
||
UUOE: 0 ; UUO effad.
|
||
|
||
UUOH: 0
|
||
PUSH P,A
|
||
PUSH P,B
|
||
PUSH P,C
|
||
PUSH P,D
|
||
MOVEI @40 ; get eff addr. of uuo
|
||
MOVEM UUOE
|
||
MOVE @0
|
||
MOVEM UUOD ; contents of eff adr
|
||
MOVE B,UUOE ; eff adr
|
||
LDB A,[270400,,40] ; get uuo ac,
|
||
LDB C,[330600,,40] ; op code
|
||
CAIL C,UUOMAX
|
||
MOVEI C,0 ; grt=>illegal
|
||
JRST @UUOTAB(C) ; go to proper rout
|
||
|
||
UUORET: POP P,D
|
||
POP P,C
|
||
POP P,B
|
||
POP P,A ; restore ac's
|
||
JRST 2,@UUOH
|
||
|
||
ILUUO: .VALUE [ASCIZ /:ILLEGAL UUO/]
|
||
|
||
UOBPTR: MOVEI C,0
|
||
MOVE B,UUOD
|
||
JRST UOASC1
|
||
|
||
UOASCR: SKIPA C,[^M] ; cr for end of type
|
||
UOASC: MOVEI C,0 ; no cr
|
||
HRLI B,440700 ; make ascii pointer
|
||
UOASC1: ILDB A,B ; get char
|
||
JUMPE A,.+3 ; finish?
|
||
PUSHJ P,IOTA
|
||
JRST .-3 ; and get another
|
||
SKIPE A,C ; get saved cr?
|
||
PUSHJ P,IOTA
|
||
JRST UUORET
|
||
|
||
UOASCC: HRLI B,440700 ; make ascii pointer
|
||
UOAS1C: ILDB A,B ; get char
|
||
CAIN A,^C
|
||
JRST UUORET
|
||
PUSHJ P,IOTA
|
||
JRST UOAS1C ; and get another
|
||
|
||
UOCTLP: MOVEI A,^P
|
||
PUSHJ P,IOTA1
|
||
|
||
UOASCI: MOVE A,B ; prt ascii immediate
|
||
PUSHJ P,IOTA
|
||
JRST UUORET
|
||
|
||
UOSIX: MOVE B,UUOD
|
||
USXOOP: JUMPE B,UUORET
|
||
LDB A,[360600,,B]
|
||
ADDI A,40
|
||
PUSHJ P,IOTA
|
||
LSH B,6
|
||
JRST USXOOP
|
||
|
||
UOSIXS: MOVE A,[440600,,UUOD]
|
||
USLOOP: ILDB C,A
|
||
ADDI C,40
|
||
PUSHJ P,IOTC
|
||
TLNE A,770000
|
||
JRST USLOOP
|
||
JRST UUORET
|
||
|
||
UOHPOS: SUB B,HPOS
|
||
SKIPG B
|
||
MOVEI B,1 ; always at least one space
|
||
UOHPO1: MOVEI A,40
|
||
PUSHJ P,IOTA
|
||
SOJG B,UOHPO1
|
||
JRST UUORET
|
||
|
||
POWER: 0 ? 1 ? 10. ? 100. ? 1000. ? 10000. ? 100000. ? 1000000.
|
||
|
||
UOSIGN: MOVM D,UUOD
|
||
ANDI A,7
|
||
MOVE A,POWER-1(A)
|
||
MOVEI C,40
|
||
UOSIG1: CAMLE A,D
|
||
PUSHJ P,IOTC
|
||
IDIVI A,10.
|
||
CAIE A,1
|
||
JRST UOSIG1
|
||
MOVEI A,"+
|
||
SKIPGE UUOD
|
||
MOVEI A,"-
|
||
SKIPN UUOD
|
||
MOVEI A,"
|
||
PUSHJ P,IOTA
|
||
SETZ A,
|
||
JRST UODEC
|
||
|
||
UOALIG: MOVE D,UUOD
|
||
ANDI A,7
|
||
MOVE A,POWER(A)
|
||
MOVEI C,40
|
||
UOALI1: CAMLE A,D
|
||
PUSHJ P,IOTC
|
||
IDIVI A,10.
|
||
CAIE A,1
|
||
JRST UOALI1
|
||
SETZ A,
|
||
|
||
UODEC: SKIPA C,[10.] ; get base for decimal
|
||
UOOCT: MOVEI C,8. ; octal base
|
||
MOVE B,UUOD ; get actual word to prt
|
||
JRST .+3 ; join code
|
||
UODECI: SKIPA C,[10.] ; decimal
|
||
UOOCTI: MOVEI C,8.
|
||
MOVEM C,BASE'
|
||
SKIPN A
|
||
HRREI A,-1 ; a=digit count
|
||
PUSHJ P,UONUM ; print numbr
|
||
JRST UUORET
|
||
|
||
UONUM: IDIV B,BASE
|
||
HRLM C,(P) ; save digit
|
||
SOJE A,UONUM1 ; done if 0
|
||
SKIPG A ; + => more
|
||
SKIPE B ; - => b=0 => done
|
||
PUSHJ P,UONUM ; else more
|
||
UONUM1: HLRZ C,(P) ; retreive digits
|
||
ADDI C,"0 ; make to ascii
|
||
CAILE C,"9 ; is it good dig
|
||
ADDI C,"A-"9-1 ; make hex digit
|
||
PUSHJ P,IOTC
|
||
POPJ P, ; ret
|
||
|
||
IOTC: PUSH P,A
|
||
MOVE A,C
|
||
PUSHJ P,IOTA
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
HPOS: 0 ; line pos
|
||
|
||
IOTA: CAIN A,^P
|
||
JRST [.IOT TYOC,["^]
|
||
ADDI A,100
|
||
JRST IOTA1]
|
||
CAIN A,^J
|
||
POPJ P,
|
||
IOTA1: .IOT TYOC,A
|
||
CAIE A,^M
|
||
JRST IOTTAB
|
||
SKIPE SCRFLG'
|
||
.IOT TYOC,[^J]
|
||
SETZM HPOS
|
||
POPJ P,
|
||
; update line pos
|
||
IOTTAB: CAIN A,^I
|
||
JRST [MOVE A,HPOS
|
||
ADDI A,10
|
||
ANDI A,7770
|
||
MOVEM A,HPOS
|
||
POPJ P,]
|
||
AOS HPOS
|
||
POPJ P,
|
||
|
||
END START
|
||
|
||
|