.TITLE PNAME ; JEFFREY KODOSKY ARL NOV75 ; ; SUBR ; ENTRY: 1 ARG ; EXIT: 1 ARG ; ERRORS: NONE ; CALLS: ATM2ASCII ; STRBLD .GLOBL PNAME,ZPNAME,QATM2ASCII,QSTRBLD PNAME: CLR RSWVAL ;USE NON-LISP READABLE FORMAT QATM2ASCII BCC 1$ CLR @R5 ;RETURN NILL IF ILL FORMED ARG JMP @-(R4) 1$: BPL .+4 INC R3 ;BUMP PAST ' IF STRING TST (R5)+ ;POP ARG QSTRBLD ;MAKE A NEW STRING AND RETURN IT .WORD 0 ; ; ; ; UTILITY: CONVERT ATOM TO ASCII ; ENTRY: 1 ARG ; EXIT: R3 POINTS TO PNAME BUFFER START ; C BIT SET AND ARG RETURNED (UNCHANGED) ; IF IT WAS NOT ATOMIC ; N BIT SET IF ARG WAS STRING ; ERRORS: NONE ; CALLS: PNBUFI ; ATM2N ; LEXICL ; ICO ; GCO ; OCO ; NOTE: FOR STRING ATOMS THE FIRST CHARACTER IN THE BUFFER IS ' .GLOBL ATM2AS,QPNBUFI,RSWVAL,OSWVAL,QOCO .GLOBL QATM2N,QLEXICL,QICO,QGCO ATM2AS: ROOM 3 CLR R3 ;RESET PNAME BUFFER POINTER QPNBUFI MOV @R5,R0 BIT #2,(R0)+ BNE NUM01 ;JUMP IF NUMBER BIT #3,@R0 BNE ATM01 ;JUMP IF LITERAL OR STRING ATOM SEC ;OTHERWISE SIGNAL NON-ATOMIC JMP @-(R4) ;AND RETURN ATM01: BIT #2,@R0 BNE STR01 ;JUMP IF STRING ATOM MOV -(R0),R1;LITERAL OR GENSYM ATOM TST 2(R1) BPL LIT01 ;JUMP IF LITERAL ATOM MOV @(R1)+,R0 ;GET GENSYM INTEGER MOV R3,-(SP) MOVB @R1,(R3)+ ;GET GENSYM LETTER MOV R3,-(SP) MOV #6,-(SP) MOV R0,-(SP) QOCO ;CONVERT TO O6 MOV (SP)+,R3;POP BUFFER START CLRB 7(R3) ;TERMINATE BUFFER MOV R3,R2 GEN01: TSTB @R2 ;CHANGE LEADING SPACES TO ZEROS BEQ GEN05 CMPB @R2,#40 BNE GEN02 MOVB #60,@R2 GEN02: INC R2 BR GEN01 GEN05: CLR (R5)+ ;POP GENSYM ATOM(C,N BITS CLEAR) JMP @-(R4) ; STR01: MOV #47,R3 ;INSERT ' QPNBUFI MOV @(R5)+,R2 ;POP STRING BEQ STR10 ;JUMP IF NULL STRING STR02: MOV 2(R2),-(SP) ;GET TWO CHARACTERS MOVB @SP,R3 BEQ STR09 JSR PC,INSRTS MOVB 1(SP),R3 BEQ STR09 JSR PC,INSRTS MOV @R2,R2 TST (SP)+ BIC #2,R2 BNE STR02 BR STR10 STR09: TST (SP)+ STR10: CLR R3 ;RETURN BUFFER POINTER QPNBUFI TST #-1 ;SET N BIT TO SIGNAL STRING (CLEAR C BIT) JMP @-(R4) ; LIT01: MOV @(R5)+,R2 ;POP PNAME CLR LITFLG ;FLAG FIRST TWO CHARS LIT02: MOV 2(R2),-(SP) ;GET TWO CHARS MOVB @SP,R3 BEQ LIT09 JSR PC,INSRTL MOVB 1(SP),R3 BEQ LIT09 JSR PC,INSRTL TST (SP)+ MOV @R2,R2 BIC #2,R2 BNE LIT02 BR LIT10 LIT09: TST (SP)+ LIT10: CLR R3 QPNBUFI CCC ;CLEAR N AND C BITS SINCE NOT STRING ATOM JMP @-(R4) ; NUM01: MOV R3,-(SP);SAVE BUFFER ADDRESS QATM2N ;GET NUMBER BCS NUM10 ;JUMP IF FLOATING POINT MOV (SP)+,R0 MOV R3,-(SP);BUFFER START MOV #7,-(SP);FIELD LENGTH MOV R0,-(SP);NUMBER TST OSWVAL BEQ NUM02 QOCO ;O7 CONVERSION MOV (SP)+,R3 MOVB #'Q,7(R3) CLRB 8.(R3) BR CMPRES NUM02: QICO ;I7 CONVERSION MOV (SP)+,R3 CLRB 7(R3) BR CMPRES NUM10: MOV (SP)+,R0;POP FLOATING POINT NUMBER AND CHECK MOV (SP)+,R1;FOR +/- INFINITY BIT #77777,R0 BNE NUM12 TST R1 BEQ NUM12 MOV #INFBUF,R3 ;USE SPECIAL BUFFER FOR INFINITY ROL R0 BCS .+4 INC R3 CLR (SP)+ ;C,N BITS CLEAR SINCE NOT STRING ATOM JMP @-(R4) NUM12: MOV R3,-(SP);BUFFER START MOV #20.,-(SP) ;FIELD LENGTH MOV #7,-(SP) CLR -(SP) MOV R1,-(SP) MOV R0,-(SP) QGCO ;G20.7 CONVERSION MOV (SP)+,R3 CLRB 20.(R3) ;INSERT TERMINATING ZERO BYTE MOV R3,R2 ;CHECK FOR E FORMAT NUM13: TSTB @R2 BEQ NUM15 CMPB (R2)+,#'E BNE NUM13 CMPB (R2)+,#40 ;DON'T ALLOW SPACE AFTER E BNE CMPRES MOVB #'+,-(R2) BR CMPRES NUM15: MOV R3,R2 ;F FORMAT: TRIM TO 7 SIGNIFICANT DIGITS CLR R0 ;COUNT DIGITS BEFORE DECIMAL NUM16: CMPB (R2)+,#56 BEQ NUM17 ;JUMP IF DECIMAL POINT FOUND BLT NUM16 ;KEEP LOOKING IF CHAR IS +- OR SPACE INC R0 ;OTHERWISE COUNT THE DIGIT BR NUM16 NUM17: SUB #7,R0 ;ALLOW 7- DIGITS AFTER DECIMAL BGE NUM19 MOV R2,R1 SUB R0,R2 NUM18: CMPB -(R2),#'0 ;GET RID OF TRAILING ZEROS BEQ NUM18 ;AFTER DECIMAL POINT IN F FORMAT INC R2 CMP R2,R1 BNE NUM19 ;BUT ALWAYS LEAVE AT LEAST ONE DIRECTLY AFTER INC R2 NUM19: CLRB @R2 CMPRES: CMPB (R3)+,#40 ;DELETE LEADING BLANKS BEQ CMPRES TSTB -(R3) ;RETURN BUFFER AND CLEAR C,N BITS JMP @-(R4) ; INSRTS: TST RSWVAL BEQ INSRT2 QLEXICL ;INSERT ^ IF CHAR IS CLASS 7 OR 17. CMP R0,#7 BEQ INSRT1 CMP R0,#17. BNE INSRT2 INSRT1: SWAB R3 BISB #'^,R3 QPNBUFI SWAB R3 INSRT2: QPNBUFI ;PUT CHAR IN PNAME BUFFER RTS PC INSRTL: TST RSWVAL BEQ INSRT2 QLEXICL ;INSERT ^ IF CHAR IS CLASS 7-19. TST LITFLG BGT INSRT4 BEQ INSRT5 COM LITFLG CMP R0,#2 BEQ INSRT1 BR INSRT4 INSRT5: CMP R0,#2 BNE INSRT3 INC LITFLG ;IF 1ST CHAR IS THEN INSERT ^ BR INSRT1 INSRT3: CMP R0,#6 ;IF 1ST CHAR IS THEN CHECK NEXT BNE INSRT6 ;FOR BEING A DIGIT DEC LITFLG BR INSRT2 INSRT6: INC LITFLG CMP R0,#19. ;CLASS 19. IS OKAY AS 1ST CHAR BEQ INSRT2 INSRT4: CMP R0,#7 BLT INSRT2 BR INSRT1 ; LITFLG: .WORD 0 INFBUF: .ASCIZ /-1E999/ .EVEN ZPNAME=.-PNAME .END