.TITLE CHARACTER IO TEST .PSECT .MCALL .CSIGEN,.PRINT,.READW,.WRITW .MCALL .WAIT,.CLOSE,.DATE,.GTIM ERRBYT=52 ; EMT ERROR BYTE START: .CSIGEN #HSPACE,#DEFEXT,#0 ; GET COMM LINE ; %0 NOW POINTS TO FIRST FREE ADDRESS. MOV %0,LABS ; WILL BE SYMBOL TABLE ; SORT OUT THE SWITCHES PUSHED ON STACK BY .CSIGEN. ; /O,/X OCTAL OR HEX LISTING -- DEFAULT IS HEX ; /N,/W NARROW OR WIDE PAPER -- DEFAULT IS WIDE ; /B,/H BINARY OR HEX OBJECT -- DEFAULT BINARY ; /L LISTING ONLY ; /T SYMBOL TABLE ONLY CLR OCTAL ; DEFAULT OCTAL=FALSE CLR NARROW ; DEFAULT NARROW=FALSE CLR HEXOBJ ; DEFAULT HEX=FALSE MOV #1,LIST ; LIST BY DEFAULT MOV #1,TABLE ; TABLE BY DEFAULT MOV (SP)+,%0 ; GET NO OF SWITCHES BEQ INPFIL ; IF ANY GETSWT: MOV (SP)+,%1 ; GET A SWITCH DESCRIPTOR CMPB #'O,%1 ; O? BNE XSWT INC OCTAL ; OCTAL:=TRUE BR FNDSWT ; FOUND O XSWT: CMPB #'X,%1 ; X? BNE NSWT ; NO, TRY N CLR OCTAL ; OCTAL:=FALSE BR FNDSWT NSWT: CMPB #'N,%1 ; N? BNE WSWT ; NO, TRY W INC NARROW ; NARROW:=TRUE BR FNDSWT WSWT: CMPB #'W,%1 ; W? BNE BSWT ; NO, TRY B CLR NARROW ; NARROW:=FALSE BR FNDSWT BSWT: CMPB #'B,%1 ; B? BNE HSWT ; NO, TRY H CLR HEXOBJ ; HEX OBJ:=FALSE BR FNDSWT HSWT: CMPB #'H,%1 ; H? BNE TSWT ; TRY T INC HEXOBJ ; HEX OBJ:=TRUE TSWT: CMPB #'T,%1 ; T? BNE LSWT ; NO, TRY L CLR TABLE ; TABLE:=FALSE BR FNDSWT LSWT: CMPB #'L,%1 ; L? BNE FNDSWT ; NO, IGNORE ILLEGAL SW. CLR LIST ; LIST:=FALSE ; FOUND SWITCH, IGNORE A NUMERIC ARGUMENT FNDSWT: TST %1 ; BIT 15 SET IF ANY BPL .+4 TST (SP)+ ; IGNORE IT SOB %0,GETSWT ; BRANCH BACK FOR MORE IF ANY ; FINISHED WITH SWITCHES. WAS THERE AN INPUT FILE? INPFIL: .WAIT #3 ; CHAN 3 IF THERE WAS BCC STPASS ; CARRY SET NOW IF NOT .PRINT #NOIP ; MESSAGE IF NOT JMP START ; TRY AGAIN NOIP: .ASCIZ "?NO IP?" .EVEN STPASS: MOV #-1,OUTFIL ; NO O/P ON PASS 1 ; GET DATE AND TIME INTO STRING DATE2. .GTIM #AREA+4,#AREA ; GET SEC PAST MIDNIGHT *50 CLR %1 ; HOURS COUNTER MOV AREA+2,%3 ; %3=L.O. COUNT MOV AREA,%2 ; %2=H.O. HOURLP: CMP %2,HOURHI ; D.P. COMPARE BLT GOTHR ; HIGH ORDER BNE INCHR ; IF EQUAL, MUST TEST CMP %3,HOURLO ; LOW ORDER BLO GOTHR ; OF 3600*50(60) INCHR: INC %1 ; INC HOUR SUB #137440,%3 ; SUBTRACT L.O. OF HOURLO=.-2 ;#045700 FOR 60HZ ; 3600*50(60) SBC %2 ; DOUBLE PRECISION SUB #2,%2 ; HIGH ORDER OF HOURHI=.-2 ;#3 FOR 60 HZ ; 3600*50(60)=TICKS/HR BR HOURLP GOTHR: JSR %5,DEC2 ; FOUND HOUR IN %1 HOURS ; CONVERT IT DIV #3000.,%2 ; (%3)(%2)=MINS TICKS ;#3600. FOR 60HZ; 3000(3600)/MIN MOV %2,%1 ; QUOTIENT=MINS JSR %5,DEC2 ; CONVERT IT MINS CLR %2 DIV #50.,%2 ; REMAINDER=SECS*50(60) ;#60. FOR 60HZ MOV %2,%1 ; QUOTIENT=SECS JSR %5,DEC2 ; CONVERT IT SECS ; NOW THE DATE .DATE ; IN %0 MOV %0,%1 ; COPY DATE BIC #177740,%1 ; GET YEAR ADD #72.,%1 ; PAST 1972 JSR %5,DEC2 ; CONVERT TO STRING YEAR MOV %0,%1 ASH #-5,%1 ; GET DAY BIC #177740,%1 ; IN %1 JSR %5,DEC2 ; CONVERT IT DAY ASH #-10.,%0 ; GET MONTH MOV %0,%1 ; COPY IT JSR %5,DEC2 MONTH .PRINT #DATE2 JMP PASS1 ; RETURN HERE AT END OF EACH PASS NXPASS: INC OUTFIL ; INC O/P FILE POINTER CMP OUTFIL,#3 ; FINISHED IF 3 BLT NXTFIL .CLOSE #3 ; FINISHED WITH INPUT JMP START ; SO RESTART ; IS THIS O/P FILE OPEN? NXTFIL: .WAIT OUTFIL ; CARRY CLEAR IF SO BCS NXPASS ; IF NOT, TRY NEXT MOV #OUTBUF,OUTPTR ; SET O/P BUFFER CLR OUTBLK ; & FILE BLOCK ; RESET INPUT FILE, PASS 1 STARTS HERE PASS1: CLR INBLK ; BLOCK 0 OF FILE MOV #INBUFF+512.,INPTR ; TO FORCE A READ MOV #INBUFF,INEND CLR INEOF ; EOF FLAG=FALSE ; DUMMY PASS CONSISTS OF A SIMPLE COPY OF I/P TO O/P. ; USE OUTFIL TO DETERMINE TYPE OF PASS:- ; 0 = BINARY ; 1 = LISTING ; 2 = PROM ; -1= PASS 1 PASSLP: JSR PC,INCH ; GET A CHAR TST INEOF ; E.O.F.? BNE PASEND ; FINISH IF SO TST OUTFIL ; PASS1? BMI PASSLP ; SO NO O/P JSR PC,OUTCH ; COPY CHAR BR PASSLP ; AND LOOP ; END OF PASS PASEND: TST OUTFIL BMI FINPAS ; EXCEPT PASS 1 CLRFIL: MOV OUTPTR,%1 ; GET O/P POINTER CLRB @%1 ; PUT IN A NULL IN CASE ODD NO OF BYTES SUB #OUTBUF,%1 ; COMPUTE NO OF BYTES BEQ CLOSOP ; NOTHING TO DO IF BLOCK EMPTY ASR %1 ; CHANGE TO WORDS ADC %1 ; ROUNDING UP .WRITW #AREA,OUTFIL,#OUTBUF,%1,OUTBLK ; WRITE LAST (PARTIAL) BLOCK CLOSOP: .CLOSE OUTFIL ; CLOSE O/P FILE FINPAS: JMP NXPASS ; NEXT PASS ; SINGLE CHARACTER OUTPUT ROUTINE -- PRINTS CHAR IN %0 OUTCH: CMP OUTPTR,#OUTBUF+512. ; ALL CHARS FILLED? BLO OUTCHA ; NO PUT IN ANOTHER MOVB %0,-(SP) ; SAVE CHAR .WRITW #AREA,OUTFIL,#OUTBUF,#256.,OUTBLK MOVB (SP)+,%0 ; RESTORE CHAR BCS WTERR ; CARRY SET ON ERROR INC OUTBLK ; NEXT BLOCK NEXT TIME MOV #OUTBUF,OUTPTR ; RESET POINTER ; COPY CHAR TO OUTPUT. OUTCHA: MOVB %0,@OUTPTR ; COPY IT INC OUTPTR ; INC POINTER RTS PC ; AND RETURN WTERR: .PRINT #OUTERR ; PRINT MESSAGE TST (SP)+ ; POP STACK JMP START ; RESTART OUTERR: .ASCIZ "?OUT ERR?" .EVEN OUTFIL: -1 ; OUTPUT CHAN NO OUTBLK: 0 ; OUTPUT FILE BLOCK NO OUTPTR: OUTBUF ; POINTS TO NEXT CHAR SPACE OUTBUF: .BLKW 256. ; O/P BUFFER ; SINGLE CHARACTER INPUT ROUTINE -- INPUT CHAR TO %0. INCH: CMP INPTR,INEND ; BUFFER EMPTIED? BLO INCHA ; NO, GET BYTE .READW #AREA,#3,#INBUFF,#256.,INBLK BCS RDERR ; ERROR IF CARRY INC INBLK ; NEW BLOCK NEXT TIME MOV #INBUFF,INPTR ; CHARACTER ZERO MOV #INBUFF,INEND ; SET END OF BLOCK POINTER ASL %0 ; TO INBUFF + NO OF BYTES READ ADD %0,INEND INCHA: MOVB @INPTR,%0 ; GET CHAR INC INPTR ; INC POINTER FOR NEXT RTS PC ; AND RETURN ; READ ERROR RDERR: TSTB @#ERRBYT ; TEST EMT ERROR BYTE BEQ INCHE ; 0=E.O.F. CAN HANDLE THAT .PRINT #INERR ; BUT NOTHING ELSE TST (SP)+ ; POP STACK JMP START ; EXIT ABNORMAL ; END OF FILE INCHE: INC INEOF ; INPUT E.O.F. :=TRUE RTS PC INERR: .ASCIZ "?IN ERR?" .EVEN INBLK: 0 ; INPUT FILE BLOCK NO INPTR: INBUFF+512. ; INPUT BUFFER POINTER INEOF: 0 ; E.O.F. FLAG INEND: INBUFF ; END OF DATA POINTER INBUFF: .BLKW 256. ; INPUT BUFFER ; CONVERT A NO <=99. IN %1 TO A 2-CHAR STRING AT PARAMETER. DEC2: MOV %0,-(SP) ; SAVE %0 MOV %1,-(SP) ; & %1 MOV %2,-(SP) ; & %2 CLR %0 DIV #10.,%0 ; %0:=MSD, %1:=LSD ADD #'0,%0 ; CONVERT TO ASCII ADD #'0,%1 MOV (%5)+,%2 MOVB %0,(%2)+ ; COPY M.S.D. MOVB %1,@%2 ; & L.S.D. MOV (SP)+,%2 ; RESTORE STACK MOV (SP)+,%1 MOV (SP)+,%0 RTS %5 ; RETURN ; EMT TRAP STORAGE SPACE & HANDLER SPACE. AREA: .BLKW 10 ; WORKING AREA DEFEXT: .RAD50 "SAL" ; INPUT FILE DEFAULT EXTENSION .RAD50 "BIN" ; OBJECT FILE .RAD50 "LST" ; LIST FILE .RAD50 "PRM" ; PROM FILE OCTAL: 0 ; OCTAL/HEX LISTING FLAG NARROW: 0 ; NARROW/WIDE PAPER FLAG HEXOBJ: 0 ; BIN/HEX OBJECT FLAG LIST: 1 ; LISTING TABLE: 1 ; SYMBOL TABLE LABS: HSPACE ; SYMBOL TABLE START ADDRESS DATE2: .ASCII "DATE " YEAR: .ASCII " -" MONTH: .ASCII " -" DAY: .ASCII " TIME " HOURS: .ASCII " :" MINS: .ASCII " :" SECS: .ASCIZ " " .EVEN HSPACE=. ; HANDLER SPACE .END START