1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-01 01:39:15 +00:00
Files
PDP-10.its/src/draw/btext.500
2018-05-05 19:19:09 +02:00

1250 lines
25 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;<DRAW>BTEXT.FAI.64, 15-NOV-75 18:03:04, EDIT BY HELLIWELL
VERSION(BTEXT,3)
MD,<
;BODY TEXT MODE TEXT AND PROPERTY PLACEMENT
;TOP LEVEL COMMAND DISPATCH HERE
ENTBTB: MOVE A,BTBODY
HLRZ A,(A)
HRRZ A,1(A)
JRST ALREAD ;ENTER EDITOR ON THIS BODY
ENTBTM: PUSHJ P,GETCLS
JRST PERRET
MOVEM A,BTBODY
MOVEI T,BTXTM
JRST CHNGMD
BTXPLB: PUSHJ P,GETCLS
JRST PERRET
CAIA
BTXPLC: MOVE A,BTBODY
SETZM BTEXT
PUSHJ P,BTXPUT
JFCL
POPJ P,
;ADD NEW PROP TO BODY
;BTBODY = BODY TO ADD TO
BTXPRB: PUSHJ P,GETCLS
JRST PERRET
CAIA
BTXPRP: MOVE A,BTBODY
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/PROPERTY NAME?
/]
PUSHJ P,TREADU
POPJ P,
POPJ P,
MOVE T,B
PUSHJ P,BFPROP
JRST BTXPNW ;NOT FOUND
TROA TFLG ;REMEMBER FOUND IN BODY DEF
TRZ TFLG ;REMEMBER FOUND IN BODY
PUSHJ P,PUTFS ;RECLAIM TEXT STRING
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/OLD PROPERTY, NEW TEXT?
/]
;FALLS THRU
;BTXPR1 - PUT VALUE ON PROP IN T
;TFLG = PROP NAME FOUND IN TYPE, NOT BODY
;A = BODY
BTXPR1: MOVE E,T ;SAVE POINTER TO BLOCK
PUSHJ P,TXREAD
CAIE C,ALTMOD
SKIPN 1(B)
JRST PUTFS ;RETURN ANY TEXT READ
TRNE TFLG ;DID WE FIND IN BODY OR BODY DEF?
PUSHJ P,COPLTP ;COPY TEXT AND PROPERTIES INTO INDIRECT LIST
;IF COPLTP CALLED, E SET TO INDIRECT POINTER BLOCK
FETCH(TT,E,TXBIT) ;INDIRECT ?
TRZN TT,TXBIND
JRST BTXPR2 ;NO
;Property being modified is indirect to TYPE, make copy of indirect's prop
STORE(TT,E,TXBIT) ;MAKE LOCAL PROP
FETCH(T,E,TXIND) ;GET TEXT BLOCK OF TYPE
FETCH(TTT,T,TXXY) ;COPY TYPE'S PROPERTY
STORE(TTT,E,TXXY)
FETCH(TTT,T,TXOFF)
STORE(TTT,E,TXOFF)
FETCH(T,T,TXNAM) ;PROPERTY NAME
PUSH P,B ;PROPERTY VALUE
PUSHJ P,LSTCOP ;COPY PROPERTY NAME
STORE(B,E,TXNAM)
POP P,B ;PROP VALUE
MOVE T,TEXSIZ ;TEXT SIZE
SKIPGE T
MOVE T,STDBIG ;WHEN COPYING FROM TYPE, MAKE STD SIZE
BTXPR2: TRO MCHG!NEEDCL
FETCH(TT,E,TXVAL)
SKIPGE T
FETCH(T,TT,TSSIZ) ;OLD TEXT SIZE
STORE(T,B,TSSIZ)
STORE(B,E,TXVAL) ;SET PROP VAL
SKIPE B,TT
PUSHJ P,PUTFS ;RETURN OLD PROP VAL
MOVE B,E
PUSHJ P,CMPBDT ;COMPILE SPECIAL PROPS (BDY IN A)
MOVE C,E
FETCH(T,E,TXXY)
TRNN T,1
POPJ P, ;NO AUTO OFFSET
JRST EDTCEN ;GO CENTER IT
BTXPNW: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/NEW PROPERTY, /]
MOVEM T,BTEXT
PUSHJ P,BTXPUT
SKIPA B,BTEXT ;LOSE, MUST GIVE BACK PROPERTY NAME
POPJ P, ;WIN, RETURN
JRST PUTFS
;PUT PROPERTY ON BODY AT CURRENT CURSE LOC
;A = BODY POINTER
;BTEXT = PROPERTY NAME
;RETURNS
;SKIPS IF TEXT ENTERED SUCCESSFULLY
;C = POINTER TO TEXT/PROP BLOCK
;E = POINTER TO 2ND BLOCK OF TEXT BLOCK ???
BTXPUT: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/TEXT?
/]
PUSHJ P,TXREAD
CAIE C,ALTMOD
SKIPN 1(B)
JRST PUTFS ;LOSE, GIVE BACK WHATEVER WAS READ
TRO MCHG!NEEDCL
PUSHJ P,MAKTXT ;GET TEXT BLOCK IN TT
MOVE C,TT ;TEXT BLOCK
MOVE T,CURSE
ADJUST(SUB,T,<ADDR(A,BXY)>)
FETCH(F,A,BORI)
MOVE F,UNROT(F)
PUSHJ P,ORIENT
TRO T,1 ;AUTO OFFSET INITIALLY
STORE(T,C,TXXY)
FETCH(TT,A,BTXT) ;ANY PROP LIST NOW?
SKIPN TT ;YES, DON'T MAKE INITIAL INDIRECT LIST
PUSHJ P,COPLTP ;NO, COPY BODY DEF TEXT/PROPERTIES INTO INDIRECT LIST
FETCH(D,A,BTXT)
STORE(D,C,TXNXT)
STORE(C,A,BTXT) ;ADD NEW PROP TO HEAD OF LIST
MOVEI E,ADDR(C,TXNAM) ;COMPATIBILITY **
STORE(B,C,TXVAL) ;DEPOSIT POINTER TO TEXT
MOVE T,TEXSIZ
SKIPGE T ;IF NO SIZE TYPED,
MOVE T,STDBIG ;USE STANDARD
STORE(T,B,TSSIZ) ;DEPOSIT CHR SIZE IN FIRST BLOCK OF TEXT
MOVE T,BTEXT ;GET PROPERTY NAME
STORE(T,C,TXNAM)
AOS (P) ;SKIP TO INDICATE SUCCESS, AND FALL INTO EDTCEN
MOVE B,C ;PROPERTY BLOCK
PUSHJ P,CMPBDT ;COMPILE ANY SPECIAL PROPS (BDY IN A)
JRST EDTCEN ;OFFSET TEXT
;BODY TEXT COPY PROPS
BTCPRB: PUSHJ P,GETCLS
JRST PERRET
CAIA
BTCPRP: MOVE A,BTBODY
FETCH(TTT,A,BTXT)
JUMPE TTT,BTCPR1 ;NO PROP LIST NOW
PUSHJ P,BFCPRP
POPJ P,
TRZ TFLG ;FOUND IN BODY
BTCPR2: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/NEW TEXT?
/]
JRST BTXPR1
BTCPR1: FETCH(TTT,A,BTYP)
FETCH(TTT,TTT,TPROP)
PUSHJ P,BFCPRP
POPJ P,
TRO TFLG
JRST BTCPR2
;EDIT MODE TEXT AND PROPERTY PLACEMENT - FOR TYPES
EDTXT: SETZM BTEXT
PUSHJ P,EDTPUT
POPJ P, ;DON'T DIDLE SIZE IF NO CHANGE
FETCH(TT,C,TXVAL)
FETCH(T,TT,TSSIZ)
JUMPN T,CPOPJ ;ZERO SIZE?
MOVE T,STDBIG ;YES, NOT ALLOWED, USE STANDARD
STORE(T,TT,TSSIZ)
POPJ P,
EDTPRP: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/PROPERTY NAME?
/]
PUSHJ P,TREADU
POPJ P,
POPJ P,
MOVE T,B
MOVE A,CURBOD
PUSHJ P,FPROP
JRST EDTPNW ;NEW PROPERTY, ADD
PUSHJ P,PUTFS ;OLD PROP, RECLAIM STRING
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/OLD PROPERTY, NEW TEXT?
/]
EDTPR1: MOVE A,T ;SAVE BLOCK FOUND
PUSHJ P,TXREAD
CAIE C,ALTMOD
SKIPN ADDR(B,TSASC)
JRST PUTFS ;LOSE, GIVE BACK WHATEVER WAS READ
TRO MCHG!NEEDCL
FETCH(TT,A,TXVAL)
SKIPGE T
FETCH(T,TT,TSSIZ) ;IF NO SIZE TYPED, COPY OLD
STORE(T,B,TSSIZ)
STORE(B,A,TXVAL) ;STORE NEW PROP VAL
MOVE B,TT
PUSHJ P,PUTFS ;RELEASE OLD
MOVE B,A ;TEXT/PROP BLOCK
MOVE A,CURBOD
PUSHJ P,CMPTYT ;CHECK FOR SPECIAL PROP ON TYPE
MOVE C,B ;PROP BLOCK POINTER
FETCH(T,C,TXXY)
TRNN T,1 ;AUTO OFFSET?
POPJ P, ;NO
JRST EDTCEN
EDTPNW: MOVEM T,BTEXT
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/NEW PROPERTY, /]
PUSHJ P,EDTPUT
SKIPA B,BTEXT ;HE QUIT, GIVE BACK STRING
POPJ P, ;ALL OK
JRST PUTFS
;PUT TEXT UNDER PROPERTY - EDIT
;ALSO PUTS ON ALL BODIES OF THIS TYPE (IF THEY HAVE EXPLICIT PROP LISTS)
;CURBOD = PTR TO TYPE DEFINITION
;BTEXT = PROPERTY NAME (0 IF JUST TEXT)
;SKIPS
;C = TEXT/PROP BLOCK
EDTPUT: TLNN M,DSKACT!MACACT
OUTSTR [ASCIZ /TEXT?
/]
PUSHJ P,TXREAD ;READ TEXT
CAIE C,ALTMOD ;IF ALTMODE TYPED,
SKIPN 1(B) ;OR NULL TEXT
JRST PUTFS ;LOSE, GIVE BACK WHATEVER WAS READ
AOS (P) ;INDICATE SUCCESS
TRO MCHG!NEEDCL
MOVE A,CURBOD ;GET POINTER TO CURRENT TYPE
PUSHJ P,MAKTXT
MOVE C,TT ;NEW TYPE PROP BLOCK
STORE(B,C,TXVAL) ;DEPOSIT POINTER TO TEXT
MOVE T,TEXSIZ
SKIPGE T ;IF NO SIZE TYPED,
MOVE T,STDBIG ;USE STANDARD
STORE(T,B,TSSIZ) ;DEPOSIT CHR SIZE IN FIRST BLOCK OF TEXT
MOVE T,BTEXT ;GET PROPERTY NAME
STORE(T,C,TXNAM)
MOVE B,C ;PROP BLOCK
MOVE D,CURSE ;GET CURRENT POSITION
TRO D,1 ;SET AUTO OFFSET BIT
TLZ D,1 ;CLEAR MARK BIT
STORE(D,C,TXXY)
MOVE B,C
PUSHJ P,ADDPRT ;ADD PROP(B) TO TYPE(A)
;NOW CENTER TEXT
;FALLS THRU
;EDTCEN - CENTER BODY TEXT
;C = PTR TO TEXT/PROP BLOCK
;TEXLIN = #LINES,,MAX LENGTH
EDTCEN: TRO MCHG
FETCH(T,C,TXVAL)
FETCH(T,T,TSSIZ)
SKIPN T
MOVE T,STDBIG
PUSH P,T
ANDI T,377777 ;REMOVE VERT BIT
HRRZ TT,TEXLIN ;GET # CHARS
IMUL TT,VIRPTX(T)
ASH TT,-1 ;ONLY HALF FOR OFFSET
MOVNS TT
STORE(TT,C,TXOX) ;X PART
HLRZ TTT,TEXLIN ;GET # LINES-1
SUBI TTT,1
IMUL TTT,VIRPTY(T)
ASH TTT,-1
STORE(TTT,C,TXOY) ;Y OF CONSTANT OFFSET
POP P,T
TRNN T,400000 ;VERT?
POPJ P,
MOVEI F,1 ;YES 90 DEGREES CCW
FETCH(T,C,TXOFF)
PUSHJ P,ORIENT
STORE(T,C,TXOFF)
POPJ P,
;OFFSET TEXT
BTXTZ:
EDTTZ: PUSHJ P,GETCLS
JRST PERRET
MOVEI T,1
IORM T,ADDR(A,TXXY) ;TURN ON AUTO OFFSET BIT
EDTTZA: MOVEI T,1
LSH T,@MODE
TDNE T,[1EDTTM!1BTXTM]
TRNN TMOVE
JRST EDTTZ2
CAME A,CLOSES
JRST EDTTZ2
TRZE INMOV
TRO NEEDCL
EDTTZ2: FETCH(T,A,TXVAL)
ADD T,[POINT 7,1]
SETZB TT,TTT
EDTTZ1: PUSHJ P,GETTT
JRST [ CAILE TTT,(TT)
HRR TT,TTT
MOVEM TT,TEXLIN
MOVE C,A
JRST EDTCEN]
CAIE C,""
AOJA TTT,EDTTZ1
ADD TT,[1,,0]
CAILE TTT,(TT)
HRR TT,TTT
SETZ TTT,
JRST EDTTZ1
;$$Y IN EDIT MODES
EDCPRP: MOVE TTT,CURBOD
FETCH(TTT,TTT,TPROP)
PUSHJ P,BFCPRP
POPJ P,
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/NEW TEXT?
/]
JRST EDTPR1
EDTENT: MOVEI T,EDTTM
JRST CHNGMD
STOBTP: PUSHJ P,GETCLS
JRST PERRET
FETCH(T,A,TXNAM)
PUSHJ P,SETTT
JUMPE T,ITSTUF
JRST STOTX0
STOBTX: PUSHJ P,GETCLS
JRST PERRET
FETCH(T,A,TXVAL)
JRST STOTXB ;CALL ROUTINE FOR POINT TEXT
;PRINT ALL PROPERTIES FOR THIS BODY OR BODY DEF
LPROPS: MOVEI T,1
LSH T,@MODE
TDNE T,[ALLEDM!1EDTAM]
JRST EDTLPR
TDNE T,[1BTXTM]
JRST [ MOVE A,BTBODY
JRST BTXLPR]
TDNN T,[1BODM]
JRST PERRET
PUSHJ P,GETCLS
JRST PERRET
BTXLPR: TVOFF
MOVE H,A
OUTSTR [ASCIZ /
Package code: /]
FETCH(T,H,BPAK)
OUTSTR @PACKNM(T)
FETCH(G,H,BTXT)
JUMPE G,[OUTSTR[ASCIZ/
NO LOCAL BODY PROPERTIES.
/]
JRST BTSLPE]
OUTSTR[ASCIZ/
LOCAL BODY PROPERTIES:
* INDICATES PROPERTY FROM BODY DEF,
@ INDICATES PROPERTY FROM DIP DEF.
/]
PUSHJ P,LPROPL ;LIST PROPERTY LIST
BTSLPE: FETCH(H,H,BTYP)
JRST EDLPR1
EDTLPR: TVOFF
MOVE H,CURBOD ;LIST BODY DEF PROPERTIES
EDLPR1: OUTSTR[ASCIZ/
BODY NAME: /]
FETCH(T,H,TNAM) ;BODY NAME
PUSHJ P,OUTTXT
FETCH(B,H,TLIB) ;on library?
JUMPE B,EDLPR9
PUSHJ P,LIBTYP
OUTSTR [ASCIZ / from /]
OUTSTR NAMBUF
EDLPR9: OUTSTR [ASCIZ /
Type's package code: /]
FETCH(T,H,TPAK)
OUTSTR @PACKNM(T)
FETCH(G,H,TPROP)
JUMPE G,[OUTSTR[ASCIZ/
NO BODY DEFINITION PROPERTIES.
/]
JRST LPROP9]
OUTSTR[ASCIZ/
BODY DEFINITION PROPERTIES:
/]
PUSHJ P,LPROPL
LPROP9: TVON
POPJ P,
LPROPL: OUTSTR[ASCIZ/! INDICATES INVISIBLE PROPERTY.
/]
LPROP0: MOVE C,[" ",," "] ;ASSUME LOCAL
MOVE B,G
FETCH(T,G,TXBIT)
TRNN T,TXBIND
JRST LPROP1
HRLI C,"*" ;INDIRECT
FETCH(B,B,TXIND)
LPROP1: TRNE T,TXBDIP
HRRI C,"@"
FETCH(T,B,TXNAM) ;PROPERTY NAME
JUMPE T,LPROP2 ;SKIP TEXT
OUTCHR C
MOVSS C
OUTCHR C
FETCH(A,B,TXVAL)
HLRZ A,(A)
SKIPN A
OUTCHR["!"]
SKIPE A
OUTCHR[" "]
PUSHJ P,OUTTXT ;TYPE PROPERTY NAME
OUTCHR[":"]
FETCH(T,B,TXVAL)
PUSHJ P,OUTTXT
OUTSTR[ASCIZ/
/]
LPROP2: HRRZ G,(G)
JUMPN G,LPROP0
POPJ P,
;LINE EDIT TEXT
STANFO,<
LODTPN: FETCH(T,A,TXVAL)
PUSHJ P,LODED ;LOAD IT
POPJ P,
TPNTQ: PUSHJ P,TPNTQA
POPJ P,
JRST EDTDL1
BTPNTQ: PUSHJ P,TPNTQA
POPJ P,
JRST BTXDL0
TPNTQA: PUSHJ P,GETCLS
JRST PERRET ;NONE
PUSHJ P,LODTPN
JRST TPNTZ1
TPNTZ: PUSHJ P,TPNTZA
POPJ P,
JRST EDTDL1
BTPNTZ: PUSHJ P,TPNTZA
POPJ P,
JRST BTXDL0
TPNTZA: PUSHJ P,GETCLS
JRST PERRET
PUSHJ P,LODTPN ;LOAD IT
PTWRS9 [0
[BYTE(9)271,271,271,377,0]] ;CTRL1 999 BACKSPACE
TPNTZ1: PUSHJ P,TXREAD ;READ TEXT BACK
CAIN C,ALTMOD
JRST PUTFS ;NO CHANGE
SKIPN 1(B)
JRST [ PUSHJ P,PUTFS
JRST CPOPJ1]
FETCH(TT,A,TXNAM)
JUMPN TT,ZSIZOK
SKIPN T
MOVE T,STDBIG ;IF TEXT ONLY, MUST HAVE SIZE
ZSIZOK: SKIPGE T
MOVE T,STDBIG ;NO SIZE, USE STANDARD
HRLM T,(B) ;STO SIZE
FETCH(T,A,TXVAL) ;OLD VAL
STORE(B,A,TXVAL) ;REPLACE BY NEW
MOVE B,T
PUSHJ P,PUTFS
TRO MCHG
FETCH(T,A,TXXY)
TRNN T,1 ;AUTO OFFSET?
POPJ P, ;NO
MOVE C,A
JRST EDTCEN ;TT STILL SETUP FROM TXREAD
>;STANFO
;TEXT, KILL
;KILL (STOP DISPLAYING PROPERTY)
EDTKIL: PUSHJ P,GETCLS
JRST PERRET
TRO MCHG!NEEDCL
TRZ INMOV
FETCH(TT,A,TXNAM) ;PROP NAM
JUMPE TT,EDTDL1 ;JUST TEXT, DELETE IT
FETCH(T,A,TXVAL)
SKIPN T
PUSHJ P,FUCKUP
HRRZS (T) ;0 CHAR SIZE = NO DISPLAY
POPJ P,
;DELETE PROP FROM TYPE
EDTDEL: PUSHJ P,GETCLS
JRST PERRET
TRO MCHG!NEEDCL
TRZ INMOV
;FIRST DELETE ALL INDIRECTS FROM BODY'S TO THIS TEXT/PROP
;A = TEXT/PROP BLOCK TO DELETE
EDTDL1: MOVEI B,DBODPN
FBT1: PUSHJ P,FBTPTR ;GET NEXT BODY WITH PROP IN A
JRST EDTDL2
FETCH(TT,D,TXNXT) ;PATCH OUT INDIRECT BLOCK
STORE(TT,C,TXNXT)
RETBLK(D,TEXT)
JRST FBT1
;NEXT DELETE PROP FROM TYPE DEF
EDTDL2: FETCH(B,A,TXNAM) ;ANY PROP NAME?
JUMPE B,EDTDL3 ;NO, PLAIN TEXT
PUSH P,A
MOVE B,A ;PROP BLOCK
MOVE A,CURBOD
PUSHJ P,FLSTYP ;CLEAR ANY SPECIAL PROPS
POP P,A
FETCH(B,A,TXNAM)
PUSHJ P,PUTFS ;YES RETURN
EDTDL3: MOVE C,CURBOD
FETCH(B,C,TPROP)
CAMN B,A ;IS IT THE FIRST ONE?
JRST EDTKP1 ;YES
EDTKP2: MOVE C,B ;NO, PATCH IT OUT OF LIST
FETCH(B,C,TXNXT)
CAME B,A ;IS THIS IT?
JRST EDTKP2
FETCH(TT,A,TXNXT) ;RPLACD IT OUT
STORE(TT,C,TXNXT)
EDTKP3: FETCH(B,A,TXVAL)
PUSHJ P,PUTFS ;RETURN PROP VAL
RETBLK(A,TEXT) ;RETURN PROP BLOCK
POPJ P,
EDTKP1: FETCH(B,A,TXNXT) ;REMOVE FROM HEAD OF PROP LIST
STORE(B,C,TPROP)
JRST EDTKP3
;KILL, UNKILL PROP ON BODY
BTXKIL: PUSHJ P,GETCLS
JRST PERRET
TRO MCHG!NEEDCL
TRZ INMOV
FETCH(TT,A,TXNAM) ;A PROPERTY?
JUMPE TT,BTXDL0 ;NO, TEXT SO DELETE IT
FETCH(T,A,TXVAL) ;YES, SO MARK INVISIBLE
CLEAR(T,TSSIZ)
POPJ P,
BTXUKL: PUSHJ P,GETCLS
JRST PERRET
FETCH(T,A,TXVAL)
FETCH(TT,T,TSSIZ)
JUMPN TT,[TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/ALREADY VISIBLE.
/]
POPJ P,]
MOVE TT,STDBIG ;SET SIZE TO STANDARD
STORE(TT,T,TSSIZ)
POPJ P, ;THIS SHOULDN'T CHANGE PICTURE
;DELETE BODY TEXT/PROP
BTXDEL: PUSHJ P,GETCLS
JRST PERRET
TRO MCHG!NEEDCL
;DELETE BODY TEXT
;A = TEXT/PROP BLOCK TO DELETE
;CLAST = PREVIOUS PTR
;BTBODY = BODY
BTXDL0: HRL A,CLAST ;LAST PTR IN PROP LIST
BTXDL1: FETCH(T,A,TXNAM) ;PROPERTY?
JUMPE T,BTXDL4 ;NO, ONLY TEXT, JUST FLUSH IT
PUSH P,A
MOVE A,BTBODY
FETCH(A,A,BTYP)
PUSHJ P,FPROP ;LOOK FOR THIS PROPERTY(T) IN BODY DEF
JRST BTXDL2 ;NOT IN DEF, JUST DELETE
MOVE A,BTBODY ;YES, CONS UP INDIRECT PTR
PUSHJ P,MAKTXT
STORE(T,TT,TXIND)
MOVEI T,TXBIND
STORE(T,TT,TXBIT)
FETCH(T,A,BTXT)
STORE(T,TT,TXNXT)
STORE(TT,A,BTXT)
MOVE B,TT
PUSHJ P,CMPBDT ;POSSIBLY RE-COMPILE NEW VALUE
BTXDL2: HRRZ B,(P) ;PROP BLOCK
MOVE A,BTBODY
PUSHJ P,FLSBDY ;FLUSH SPECIAL PROPS FROM BODY
POP P,A
FETCH(B,A,TXNAM)
PUSHJ P,PUTFS ;RETURN PROP NAME
BTXDL4: FETCH(B,A,TXVAL)
PUSHJ P,PUTFS ;RETURN PROP VAL
HLRZ B,A ;PREV POINTER
HRRZ TT,(B)
CAIE TT,(A) ;CORRECT LAST?
PUSHJ P,FUCKUP
FETCH(C,A,TXNXT)
HRRM C,(B) ;BACK POINTER MAY BE TO BODY
RETBLK(A,TEXT)
;Now check if entire body list is indirect
MOVE A,BTBODY
FETCH(B,A,BTXT)
JUMPE B,CPOPJ
BTXDL3: FETCH(T,B,TXBIT)
TRNN T,TXBIND ;INDIRECT?
POPJ P, ;NO, MUST KEEP LIST
FETCH(B,B,TXNXT)
JUMPN B,BTXDL3
FETCH(C,A,BTXT)
CLEAR(A,BTXT) ;DELETE BODIES PROP LIST, ALL INDIRECT
JRST TXTREL
;$$D DELETE PROPERTY NAME
BTNPRP:
EDNPRP: PUSHJ P,GETCLS
JRST PERRET
FETCH(B,A,TXNAM)
JUMPE B,PERRET ;NO PROPERTY NAME, LOSE
FETCH(T,A,TXVAL)
FETCH(TT,T,TSSIZ)
SKIPN TT
MOVE TT,STDBIG
STORE(TT,T,TSSIZ)
JRST PUTFS
;ALL NEW BODY/BODY DEF PROPERTY/TEXT ROUTINES.
;FPROP - FIND BODY DEF PROPERTY
;T = STRING PROPERTY NAME
;A = TYPE
;SKIP RETURNS
;T = PROPERTY BLOCK POINTER
; (TTT NOW CONTAINS STRING POINTER)
;FPROPX - FIND PROPERTY NAME IN LIST SUPPLIED
;TTT = BODY OR TYPE DEF PROPERTY LIST POINTER
FPROP: FETCH(TTT,A,TPROP)
JUMPE TTT,CPOPJ
FPROPX: PUSH P,A
PUSH P,B
PUSH P,T
FPROP1: MOVE B,TTT
FETCH(T,B,TXBIT)
TRNN T,TXBIND
JRST FPROP3
FETCH(B,B,TXIND)
FPROP3: FETCH(B,B,TXNAM)
JUMPE B,FPROP2 ;JUST TEXT
MOVE A,(P)
PUSHJ P,TXTMAT
JRST FPROP2
POP P,T ;FOUND
POP P,B
POP P,A
EXCH T,TTT
JRST CPOPJ1
FPROP2: HRRZ TTT,(TTT)
JUMPN TTT,FPROP1
POP P,T
POP P,B
POP P,A
POPJ P,
;FNDIPT - FIND DIP FROM TYPE
;A = TYPE POINTER
;SKIP RETURNS
;T = DIPTYPE BLOCK POINTER
FNDIPT: MOVEI T,CDIPTY
PUSHJ P,FPROP
POPJ P,
FNDDP2: TLO T,400000
JRST CPOPJ1
;FNDDIP - FIND DIP TYPE FROM BODY OR TYPE
;A = BODY POINTER ,( -1,,TYPE IF TYPE POINTER)
;SKIP RETURNS
;T = DIPTYPE BLOCK POINTER (LH NEG IF FOUND ON TYPE)
FNDDIP: JUMPL A,FNDIPT ;FIND ON TYPE?
MOVEI T,CDIPTY
PUSHJ P,BFPROP
POPJ P,
JRST FNDDP2 ;FOUND IN TYPE
FETCH(TT,T,TXBIT) ;FOUND IN BODY, CHECK FOR INDIRECT
TRNN TT,TXBIND
JRST CPOPJ1
FETCH(T,T,TXIND)
JRST FNDDP2 ;MARK AS FROM TYPE
CDIPTY: XWD 0,.+2
ASCII /DIPTY/
0
ASCIZ /PE/
;BFPROP - FIND PROPERTY FOR BODY
;A = BODY POINTER
;T = STRING PROPERTY NAME
;SKIP RETURNS
;T = PROPERTY BLOCK POINTER
;SKIPS 1 IF FOUND IN BODY DEF (NO INDIRECT LIST IN BODY)
;SKIPS 2 IF FOUND IN BODY (INDIRECT OR DIRECT)
BFPROP: FETCH(TTT,A,BTXT)
PUSH P,A
JUMPE TTT,BFPRP4 ;NO BODY PROPERTIES
PUSH P,B ;YES, (LIST ALSO HAS INDIRECTS TO TYPE PROPERTIES)
PUSH P,T
BFPRP2: MOVE B,TTT
FETCH(T,B,TXBIT)
TRNN T,TXBIND
JRST BFPRP3 ;DIRECT PROP
FETCH(B,B,TXIND) ;NO, INDIRECT FROM TYPE DEF
BFPRP3: FETCH(B,B,TXNAM) ;PROPERTY NAME
JUMPE B,BFPRP1
MOVE A,(P)
PUSH P,TTT
PUSHJ P,TXTMAT
JRST BFPRP9
POP P,TTT
POP P,B ;MATCH STRING
POP P,B
POP P,A
MOVE T,TTT
JRST CPOPJ2
BFPRP9: POP P,TTT
BFPRP1: FETCH(TTT,TTT,TXNXT)
JUMPN TTT,BFPRP2
POP P,T
POP P,B
POP P,A
POPJ P,
BFPRP4: FETCH(A,A,BTYP) ;NO PROPERTIES ON BODY
PUSHJ P,FPROP ;LOOK IN BODY DEF
CAIA
AOS -1(P) ;SIGNAL FOUND
POP P,A
POPJ P,
;BFCPRP - FIND BODY OR BODY DEF PROPERTY BY CLOSEST MATCH NAME
;TTT = POINTER TO PROPERTY LIST
;T = RETURNS PROPERTY BLOCK OR INDIRECT POINTER
BFCPRP: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/PROPERTY NAME (ENOUGH TO UNIQUELY SPECIFY IT)?
/]
JUMPE TTT,[PUSHJ P,SCARF
POPJ P,
JRST NXPROP]
PUSHJ P,TREADU
POPJ P,
JRST NXPROP
PUSH P,A
PUSH P,B
TRZ TFLG ;NO MATCHS YET
EDCPR2: MOVE A,TTT
FETCH(B,A,TXBIT)
TRNN B,TXBIND
JRST EDCPR4
FETCH(A,A,TXIND)
EDCPR4: FETCH(A,A,TXNAM)
JUMPE A,EDCPR3
MOVE B,(P)
ADD A,[POINT 7,1]
ADD B,[POINT 7,1]
EDCPR5: PUSHJ P,BTGETB ;GET A MATCH CHARACTER
JRST EDCPR6 ;MATCH
PUSHJ P,BTGETA ;GET A PROPERTY NAME CHARACTER
JRST EDCPR3 ;NO MATCH
CAMN T,TT ;MATCH?
JRST EDCPR5 ;YES, LOOP
JRST EDCPR3 ;NO MATCH
EDCPR6: TROE TFLG ;FLAG ONE FOUND, CHECK FOR MORE THAN ONE
JRST AMBIGP ;AMBIGUOUS PROPERTY
MOVEM TTT,BTEXT ;SAVE MATCH HERE
PUSHJ P,BTGETA ;GET ONE MORE CHAR OF PROPERTY NAME
JRST EXPROP ;EXACT MATCH, WIN NOW
EDCPR3: HRRZ TTT,(TTT)
JUMPN TTT,EDCPR2
EXPROP: POP P,B
PUSHJ P,PUTFS
POP P,A
MOVE T,BTEXT ;GET MATCH (IF ANY)
TRNE TFLG ;WAS THERE A MATCH?
JRST EDCPR7 ;YES, PRINT NAME AND RETURN IT
NXPROP: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/SORRY, NO SUCH PROPERTY.
/]
POPJ P,
EDCPR7: TLNE M,DSKACT!MACACT
JRST CPOPJ1
PUSH P,T
MOVE TT,T
FETCH(TTT,TT,TXBIT)
TRNN TTT,TXBIND
JRST EDCPR8
FETCH(TT,TT,TXIND)
EDCPR8: FETCH(T,TT,TXNAM)
PUSHJ P,OUTTCR
POP P,T
JRST CPOPJ1
AMBIGP: POP P,B
PUSHJ P,PUTFS
POP P,A
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/SORRY, AMBIGUOUS PROPERTY NAME.
/]
POPJ P,
BTGETA: TLNN A,760000
JRST [ HRR A,-1(A)
TRNN A,-1
POPJ P,
JRST .+1]
ILDB T,A
JUMPE T,CPOPJ
JRST CPOPJ1
BTGETB: TLNN B,760000
JRST [ HRR B,-1(B)
TRNN B,-1
POPJ P,
JRST .+1]
ILDB TT,B
JUMPE TT,CPOPJ
JRST CPOPJ1
;MPROP - MAKE A PROPERTY BLOCK AND ADD TO TYPE DEF
;T = STRING PROPERTY NAME IN T
;A = TYPE
;RETURNS
;T = NEW BLOCK (WITH NO VALUE STRING YET)
MPROP: PUSHJ P,MAKTXT
MOVEI TTT,1
STORE(TTT,TT,TXXY) ;INITIALIZE TO AUTO OFFSET
CLEAR(TT,TXOFF) ;NO CHAR OFFSET
STORE(T,TT,TXNAM)
FETCH(TTT,A,TPROP)
STORE(TTT,TT,TXNXT)
STORE(TT,A,TPROP)
MOVE T,TT
POPJ P,
;MAKTXT - MAKE TEXT/PROPERTY BLOCK, POINTER RETURNED IN TT
MAKTXT: PUSH P,A
GETBLK(TT,TEXT)
BCLEAR(A,TT,TEXT)
JRST POPAJ
;FBTPTR - FIND INSTANCE OF PROPERTY/TEXT INDIRECT POINTER
;B = LAST BODY FOUND
;A = BODY DEF PROPERTY/TEXT BLOCK POINTER
;SKIP RETURNS
;B = NEW BODY
;D = POINTER TO INDIRECT BLOCK
;(C = PREVIOUS)
FBTPT1: FETCH(T,B,BTYP)
CAME T,CURBOD
JRST FBTPTR
MOVEI D,RADDR(B,BTXT,TXNXT)
JRST FBTPT3
FBTPT2: FETCH(T,D,TXBIT)
TRNN T,TXBIND
JRST FBTPT3 ;IGNORE LOCAL PROP/TEXT
FETCH(T,D,TXIND) ;SEE IF THIS USE OF THE TEXT FROM
CAMN T,A ;THE TYPE IS THE ONE WE WANT
JRST CPOPJ1
FBTPT3: MOVE C,D
FETCH(D,D,TXNXT)
JUMPN D,FBTPT2
FBTPTR: FETCH(B,B,BNXT)
JUMPN B,FBTPT1
POPJ P,
;COPLTP - MAKE INDIRECT LIST TO BODY DEF TEXT/PROPERTIES
;A = BODY POINTER
;(IF E POINTS TO BODY DEF PROPERTY, IT IS CHANGED TO POINT TO INDIRECT BLOCK)
;RETURNS
;E = POSSIBLY UPDATED POINTER TO INDIRECT BLOCK
;T = PTR TO END OF LIST
COPLTP: FETCH(T,A,BTYP)
FETCH(TTT,T,TPROP)
MOVEI T,ADDR(A,BTXT) ;POINT T TO NEW LISTHEAD
JUMPE TTT,CPOPJ ;LEAVE IF NO BODY DEF LIST TO COPY
CPLTP1: PUSHJ P,MAKTXT
HRRM TT,(T) ;LINK IN INDIRECT BLOCK
MOVEI T,TXBIND ;MARK AS INDIRECT
STORE(T,TT,TXBIT)
MOVE T,TT ;GET NEW END OF LIST
STORE(TTT,TT,TXIND) ;PUT IN INDIRECT POINTER
CAMN E,TTT ;DOES E POINT TO IT?
MOVE E,TT ;YES, POINT E TO INDIRECT BLOCK
HRRZ TTT,(TTT)
JUMPN TTT,CPLTP1
POPJ P,
;ASCCOP - MAKE INTERNAL FORMAT STRING FROM ASCIZ STRING
;TT = ASCIZ STRING POINTER
;RETURNS
;T = INTERNAL FORMAT STRING POINTER
ASCCOP: GETFS(T)
HRLM T,(P)
JRST ASCCP2
ASCCP1: GETFS(TTT)
HRRZM TTT,(T)
MOVE T,TTT
ASCCP2: MOVE TTT,(TT)
MOVEM TTT,1(T)
TRNN TTT,376
JRST ASCCP3
SKIPE 1(TT)
AOJA TT,ASCCP1
ASCCP3: SETZM (T)
HLRZ T,(P)
POPJ P,
;GETPRV - GET PREVIOUS LINK POINTER
;T = PTR TO LIST TO SEARCH
;TT = BLOCK TO LOOK FOR
; SKIPS OF FOUND
GETPRV: JUMPE T,CPOPJ ;??
GETPR1: HRRZ TTT,(T)
JUMPE TTT,CPOPJ
CAMN TT,TTT
JRST CPOPJ1
MOVE T,TTT
JRST GETPR1
;MERGEP - MERGE PROP LIST INTO BODY'S PROP LIST
;A = PTR TO BODY
;B = PROP LIST TO MERGE
MERGEP: PUSH P,C
PUSH P,D
MOVE D,B ;OLD PROP LIST IN D
PRPCP1: MOVE C,D ;GET NEXT TEXT/PROP OFF OLD LIST
FETCH(D,D,TXNXT)
FETCH(T,C,TXBIT)
TRNE T,TXBIND
JRST PRPCP2
FETCH(T,C,TXNAM)
JUMPE T,PRPCP3 ;NOT PROP, JUST TEXT
FETCH(TTT,A,BTXT) ;CHECK IF PROP IS ALREADY ON BODY
SKIPE TTT ;IF NO PROPS IN NEW BODY, JUST INSERT
PUSHJ P,FPROPX ;LOOK FOR THIS PROPERTY (T) ALREADY IN BODY (TTT)
JRST PRPCP3 ;NOT FOUND, INSERT NEW PROPERTY
FETCH(TTT,T,TXBIT) ;CHECK FOUND DUPLICATE FOR INDIRECT
TRNN TTT,TXBIND
JRST PRPCP2 ;NOT INDIRECT, BUG CHECK FOR DUPLICATE PROPERTY ON BODY
;Old local prop matches indirect to TYPE def, clobber the indirect
PUSH P,A
MOVE A,C ;NEW PROP
MOVE B,T ;OLD INDIRECT BLOCK
PUSHJ P,CPYPRP ;COPY NEW TEXT BLOCK ONTO OLD
POP P,A
PUSHJ P,CMPBDT ;CHECK FOR SPECIAL PROPS (A=BODY, B=PROP BLOCK)
JRST PRPCP2
PRPCP3: PUSHJ P,MAKTXT
FETCH(TTT,A,BTXT) ;SIMPLE, JUST ADD TO PROP LIST
STORE(TTT,TT,TXNXT) ;CONS OLD TEXT/PROP ONTO BODY'S LIST
STORE(TT,A,BTXT)
PUSH P,A
PUSH P,B
MOVE A,C
MOVE B,TT
PUSHJ P,CPYPRP
POP P,B
POP P,A
JRST PRPCP2
PRPCP2: JUMPN D,PRPCP1 ;LOOP IF MORE
POP P,D
POP P,C
POPJ P,
;ADDPRT - ADD PROPERTY TO TYPE
;A = TYPE
;B = PROPERTY
ADDPRT: FETCH(T,A,TPROP) ;PUT NEW BLOCK ON TYPE
STORE(T,B,TXNXT)
STORE(B,A,TPROP)
PUSHJ P,CMPTYT ;CHECK FOR SPECIAL PROPS
;Now also add indirects to all BODIES
PUSH P,D
PUSH P,E
SKIPN D,DBODPN
JRST ADDPR1 ;NO BODIES TO INSERT INTO
BTXINS: FETCH(TTT,D,BTYP)
CAME TTT,A ;THIS BODY OF OUR TYPE?
JRST BTXIN1 ;NO
FETCH(E,D,BTXT) ;YES, GET BODIES CURRENT PROP
JUMPE E,BTXIN1 ;NO CURRENT LIST, DON'T HAVE TO ADD TO IT
FETCH(T,B,TXNAM) ;PROPERTY NAME
JUMPE BTXIN2 ; ONLY TEXT, MAKE INDIRECT
FETCH(TTT,D,BTXT) ;BODY PROPERTY LIST
PUSHJ P,FPROPX ;SEE IF BODY ALREADY HAS THIS PROPERTY
JRST BTXIN2 ;BODY DOESN'T HAVE IT, ADD IT
JRST BTXIN1 ;BODY ALREADY HAS ONE, DON'T ADD IT
BTXIN2: PUSHJ P,MAKTXT ;MAKE IND PTR BLK
MOVEI TTT,TXBIND
STORE(TTT,TT,TXBIT) ;0 MEANS INDIRECT
STORE(B,TT,TXIND) ;PTR TO TYPE'S PROP BLOCK
FETCH(E,D,BTXT) ;ADD INDIRECT TO BODY
STORE(E,TT,TXNXT)
STORE(TT,D,BTXT)
BTXIN1: HRRZ D,(D) ;NEXT BODY
JUMPN D,BTXINS
ADDPR1: POP P,E
POP P,D
POPJ P,
;TXTREL - RELEASE PROPERTY LIST FROM TYPE OR BODY
; C = PROPERTY LIST
TXTREL: JUMPE C,CPOPJ ;DONE IF NO TEXT
PUSH P,A
PUSH P,B
GIVTXT: MOVE A,C
FETCH(B,A,TXBIT)
TRNE B,TXBIND ;INDIRECT?
JRST GIVTX1 ;YES, NO STRINGS TO FLUSH
FETCH(B,A,TXNAM)
PUSHJ P,PUTFS
FETCH(B,A,TXVAL)
PUSHJ P,PUTFS
GIVTX1: FETCH(C,A,TXNXT)
RETBLK(A,TEXT)
JUMPN C,GIVTXT
POP P,B
POP P,A
POPJ P,
;CPYPRP - COPY CONTENTS OF ONE TEXT BLOCK ONTO ANOTHER
;A = SOURCE TEXT BLOCK
;B = DESTINATION "
CPYPRP: FETCH(T,A,TXBIT)
STORE(T,B,TXBIT)
TRNE T,TXBIND
JRST [ FETCH(T,A,TXIND)
STORE(T,B,TXIND)
POPJ P,]
PUSH P,B
FETCH(T,A,TXNAM)
PUSHJ P,LSTCOP ;COPY IT OVER
MOVE T,(P)
STORE(B,T,TXNAM)
FETCH(T,A,TXVAL)
PUSHJ P,LSTCOP
MOVE T,(P)
STORE(B,T,TXVAL)
POP P,B
FETCH(T,A,TXXY)
STORE(T,B,TXXY)
FETCH(T,A,TXOFF)
STORE(T,B,TXOFF)
POPJ P,
;SPECIAL PROPERTIES
DEFINE PROPS
< PROPS1(PACKAGE,CMPPAK,CLRPAK)
PROPS1(DIPTYPE,CMPDIP,CLRDIP)
>
DEFINE PROPS1(NAME,COMPILER,CLEARER)
< [ASCIZ \NAME\]
>
PROPNT: PROPS
DEFINE PROPS1(NAME,COMPILER,CLEARER)
< COMPILER
>
PROPX: PROPS ;SKIPS IF OK
DEFINE PROPS1(NAME,COMPILER,CLEARER)
< CLEARER
>
PROPCL: PROPS ;CONTACT, PROP CLEAR
MXPROP__0
DEFINE PROPS1(NAME,COMPILER,CLEARER)
< MXPROP__MXPROP+1
>
PROPS
;CLRDIP - REMOVE POSSIBLY OLD DIPDEF LIST
;A = BODY/TYPE (-1 IN LH MEANS TYPE)
CMPDIP: AOS (P) ;ALWAYS SUCCEEDS
CLRDIP: JUMPL A,[FETCH(C,A,TDEF)
PUSHJ P,DDFREL
CLEAR(A,TDEF)
POPJ P,]
FETCH(C,A,BDEF)
PUSHJ P,DDFREL
CLEAR(A,BDEF)
POPJ P,
;CMPBDY,CMPTYP - COMPILE PROPERTIES ON BODY OR TYPE
;A = BODY OR TYPE
;LH A = FLG -1 MEANS TYPE
CMPBDY: TLZ A,-1
PUSH P,B
FETCH(B,A,BTXT) ;ANY PROPS ON BODY
CMPBD3: JUMPE B,CMPBD1
CMPBD2: PUSHJ P,CMPIT
FETCH(B,B,TXNXT)
JUMPN B,CMPBD2
CMPBD1: POP P,B
POPJ P,
CMPTYP: TLO A,-1
PUSH P,B
FETCH(B,A,TPROP)
JRST CMPBD3
;CMPIT - COMPILE PROPERTY FOR BODY OR TYPE
;A = BODY (0 LH) OR TYPE (-1 LH)
;B = PROPERTY
CMPBDT: TLZA A,-1 ;COMPILE ONE PROP ON BODY
CMPTYT: TLO A,-1 ; " ON TYPE
CMPIT: JUMPL A,CMPIT3 ;TYPE'S CAN'T HAVE INDIRECT
FETCH(T,B,TXBIT) ;BODY WITH INDIRECT?
TRNE T,TXBIND
POPJ P, ;DON'T COMPILE PROPS THAT ARE REALLY ON TYPE
CMPIT3: PUSH P,C
PUSH P,D
FETCH(C,B,TXNAM)
MOVSI D,-MXPROP
CMPIT1: HRRZ T,PROPNT(D)
PUSHJ P,MATTXT
JRST [ AOBJN D,CMPIT1
JRST CMPIT4]
FETCH(C,B,TXVAL)
PUSHJ P,@PROPX(D) ;A:BODY/TYPE, B:PROP, C:VALUE
JRST [ OUTSTR [ASCIZ /
PROPERTY: /]
FETCH(T,B,TXNAM)
PUSHJ P,OUTTXT
OUTSTR [ASCIZ /, WITH STRANGE VALUE - /]
FETCH(T,B,TXVAL)
PUSHJ P,OUTTXT
JRST CMPIT4]
CMPIT4: POP P,D
POP P,C
POPJ P,
;FLSBDY, FLSTYP - DELETING PROPERTY, CHECK AND FLUSH MAYBE
;A = BODY OR TYPE
;B = PROP BEING FLUSHED
FLSTYP: TLOA A,-1
FLSBDY: TLZ A,-1
PUSH P,C
PUSH P,D
FETCH(C,B,TXNAM)
MOVSI D,-MXPROP
FLSIT1: HRRZ T,PROPNT(D)
PUSHJ P,MATTXT
JRST FLSIT2
PUSHJ P,@PROPCL(D)
FLSIT2: AOBJN D,FLSIT1
POP P,D
POP P,C
POPJ P,
;VERPRP - CHECK BODY, TYPE FOR CONSISTENCY W.R.T. COMPILED SPECIAL PROPS
;A = BODY (0 IN LH), TYPE (-1 IN LH)
;RECMP - RECOMPILE PROPERTY ON BODY/TYPE
;A = BODY/TYPE (LH NEG MEANS TYPE)
;T = STRING NAME OF PROPERTY
;(ONLY RECOMPILES THOSE BODY PROPS THAT ARE LOCAL TO BODY, NOT ON TYPE)
RECMPT: TLOA A,-1
RECMPB: TLZ A,-1
RECMP: JUMPL A,[PUSHJ P,FPROP
POPJ P,
JRST RECMP1]
PUSHJ P,BFPROP
POPJ P,
POPJ P, ;FOUND ON TYPE, IGNORE
RECMP1: MOVE B,T
JRST CMPIT
CPAKAG: 0,,.+2
ASCII/PACKA/
0
ASCII/GE/
;MATTXT - MATCH ASCIZ AGAINST STRING
;C IS TEXT STRING
;T IS ASCIZ
MATTXT: MOVE TT,(T)
CAME TT,1(C)
POPJ P,
HRRZ C,(C)
TRNE TT,376
JRST [ JUMPE C,CPOPJ
AOJA T,MATTXT]
SKIPN C
AOS (P)
POPJ P,
>;MD