.TITLE PRINT ; JEFFREY KODOSKY ARL NOV75 ; ; SUBR: PRINT, PRIN1 ; ENTRY: 1 ARG ; EXIT: 1 ARG SAME ; ERRORS: NONE ; CALLS: ATM2ASCII ; GET ; PRNT ; ATOM .GLOBL PRINT,ZPRINT,PRIN1,ZPRIN1,QPRNT,QATOM,QATM2A,OUTSYS .GLOBL QPRIN1,RSWVAL,OSWVAL,QGET,APVAL,OSW,RSW,WSW,WSWVAL .GLOBL LASTPR PRINT: QPRIN1 BR TERP01 ZPRINT=.-PRINT ; ; ; SUBR: TERPRI, TERMINATE PRINT LINE ; ENTRY: NO ARGS ; EXIT: 1 ARG NIL ; ERRORS: NONE ; CALLS: PRNT .GLOBL TERPRI,ZTERPRI TERPRI: CLR -(R5) TERP01: MOV #CRLF,R3 QPRNT MOVB #-1,OUTSYS+1 ;RESTORE NORMAL SYSOUT JMP @-(R4) ZTERPRI=.-TERPRI ; PRIN1: MOV @R5,-(R5) ;COPY TO RETURN ROOM 3 MOV APVAL,-(R5) MOV RSW,-(R5) QGET MOV (R5)+,RSWVAL MOV APVAL,-(R5) MOV OSW,-(R5) QGET MOV (R5)+,OSWVAL MOV APVAL,-(R5) MOV WSW,-(R5) QGET MOV (R5)+,WSWVAL PRIN0: TST LASTPR BNE PRT00 ;DELIMIT PREVIOUS PRINTED MOV #SPC,R3 ;OUTPUT IF IT WAS ATOMIC QPRNT PRT00: ROOM 3 QATM2ASCII ;ATTEMPT TO CONVERT TO ASCII PNAME BCS PRT01 ;JUMP IF ITS NON-ATOMIC BPL 1$ ;JUMP IF NOT A STRING TST RSWVAL BNE .+4 INC R3 ;NO QUOTES UNLESS LISP READABLE FORMAT JSR PC,STRPRT TST RSWVAL BEQ 2$ 1$: QPRNT ;PRINT IT 2$: CLR LASTPR JMP @-(R4) PRT01: MOV #LPAR,R3 ;NON-ATOMIC: OPEN LIST WITH ( INC LASTPR QPRNT PRT02: MOV @R5,R0 MOV 2(R0),@R5 ;SAVE REST:=CD...DR[] MOV @R0,-(R5) ;IS CAR[] NIL? BNE PRT03 TST (R5)+ ;YES: POP IT AND PRINT () MOV #LRPAR,R3 QPRNT BR PRT04 PRT03: MOV #PRT04,(R4)+ ;NO: FAKE A TRAP TO PRINT CAR BR PRIN0 PRT04: MOV (R5)+,R0;NULL[REST]? BEQ PRT05 ;YES: PRINT ) AND RETURN MOV -(R5),-(R5) ;NO: COPY IT QATOM ;IS REST ATOMIC? TST (R5)+ BEQ PRT02 ;NO: LOOP BACK FOR NEXT CAR MOV #S.S,R3 ;YES: PRINT . QPRNT QATM2ASCII ;PRINT ATOM BPL 1$ TST RSWVAL BNE .+4 INC R3 JSR PC,STRPRT TST RSWVAL BEQ PRT05 1$: QPRNT PRT05: MOV #RPAR,R3;PRINT ) INC LASTPR QPRNT .WORD 0 ;AND RETURN STRPRT: MOVB (R3)+,TEMP ;SEND STRING CHARACTERS ONE AT BEQ STR1 ;A TIME SINCE LINE BOUNDARIES DON'T MOV R3,-(SP);MATTER FOR STRINGS MOV #TEMP,R3 QPRNT MOV (SP)+,R3 BR STRPRT STR1: MOV #QUOTE,R3 RTS PC LASTPR: .WORD 1 ;ZERO IF LAST PRINTED OBJECT WAS ATOMIC ;(I.E. DELIMITER REQUIRED WHEN LASTPR=0) TEMP: .WORD 0 QUOTE: .ASCIZ /'/ CRLF: .BYTE 15,12,0 LPAR: .ASCIZ /(/ LRPAR: .ASCIZ /()/ RPAR=.-2 S.S: .BYTE 240,56 ;"MARKED" SPACES (DELETED ON OUTPUT BY SPC: .BYTE 240,0 ;PRNT IF THEY'RE FIRST ON A NEW LINE) .EVEN ZPRIN1=.-PRIN1 .END