.TITLE TIO .SBTTL INPUT/OUTPUT ROUTINES ;*********************************************************************** ; ; TERMINAL OUTPUT ROUTINE ; R1 = MESSAGE BLOCK POINTER (LENGTH,STRING) ; ;*********************************************************************** PRINT:: MOV (R1)+,MSGO+Q.IOPL+2 ;SAVE LENGTH MOV R1,MSGO+Q.IOPL ;STORE ADDRESS DIR$ #MSGO ;ISSUE THE MESSAGE DSWERR ;CHECK FOR ERROR RETURN ; MSGO: QIOW$ IO.WVB,1,1,,,,<0,0,40> ;*********************************************************************** ; ; OUTPUT TO A LISTING DEVICE ; R1 = MESSAGE FORMAT POINTER ; ;*********************************************************************** OUTPUT::PUSH R0 ;SAVE REGS PUSH R2 ; MOV #OUT,R0 ;OUTPUT BUFFER POINTER MOV #ARG,R2 ;ARG BLOCK POINTER CALL $EDMSG ;FORM THE MESSAGE PUT$ #OUTLST,#OUT,R1,OUTERR ;PRINT THE ASCII MESSAGE POP R2 ;RETRIEVE REGS POP R0 ; RETURN ;*********************************************************************** ; ; CLOSE ALL FILES ; ;*********************************************************************** CLOSE:: CLOSE$ #OUTCIL CLOSE$ #OUTLIL BIT #SPL,FLAG ;SPOOL FLAG SET? BEQ 1$ ;NO MOV #OUTLST,R0 ;FDB CALL .PRINT ;PRINT IT 1$: CLOSE$ #OUTLST CLOSE$ #PRIINP CLOSE$ #SECINP CALL INXDET RETURN ;*********************************************************************** ; ; READ FROM INPUT LDA, CIL,OR LICIL ; R0 = FDB ADDRESS ; R4 AND R5 RETURNED AS BUFF ADDRESS AND COUNT, RESPECTIVELY ; ;*********************************************************************** READ:: READ$ R0,,,,,,,INERR ;READ A BLOCK WAIT$ ; MOV #PRIBUF,R4 ;PTR TO BUFFER RETURN .PAGE ;*********************************************************************** ; ; CHECK WHERE WE ARE IN THE BUFFER ; R4 = BUFFER ADDRESS ; ;*********************************************************************** DCHK:: CMP #PRIBUF+512.,R4 ;ARE WE AT THE END OF BUFFER BGT .+6 ;NO CALL READ ;YES, READ A NEW BLOCK RETURN ;*********************************************************************** ; ; TERMINAL COMMAND INPUT ; R1 IS RETURNED AS # OF BYTES READ ; ;*********************************************************************** INPUT:: GCML$ #CMDL ;READ AN INDIRECT COMMAND BCC .+6 ;OKAY JMP CMDK ;CHECK OUT PROBLEMS MOV CMDL+G.CMLD,R1 ;CALC THE END OF COMMAND LINE ADD CMDL+G.CMLD+2,R1 ; MOVB #177,(R1) ;AND PUT A FLAG CHAR THERE FOR $CAT5 MOV CMDL+G.CMLD,R1 ;LENGTH MOV CMDL+G.CMLD+2,R0 ;ADDRESS RETURN CMDK: CMPB CMDL+G.ERR,#GE.EOF ;GOT A CONTROL Z BNE CMDK2 ;NO EXIT$S ;EXIT IF SO CMDK2: MOV #CMDKM,R1 ;MESSAGE FORMAT CALL PRINT ;PRINT IT EXIT$S ;AND EXIT CMDKM: .WORD CMDKML ;LENGTH .ASCII /CIL> *** INDIRECT CALL NECESSARY TO PROCESS INDIRECT/ .ASCII / COMMANDS ***/ CMDKML = .-CMDKM-2 .EVEN ;*********************************************************************** ; ; MODULE NOT FOUND IN CIL ; R2 = POINTER INTO INDIRECT COMMAND BUFFER ; ;*********************************************************************** MODNOT::MOV (R2)+,ARG ;SAVE NAME FOR OUTPUT MOV (R2)+,ARG2 ; MOV #-1,(R2)+ ;FLAG THAT BLOCK NOT EXIST TST (R2)+ ;SKIP TO START OF NEXT COMMAND PUSH R1 ;SAVE MOV #MODN,R1 ;MESSAGE FORMAT CALL OUTPUT ;PRINT THE WARNING POP R1 ;RECOVER RETURN MODN: .ASCIZ / *** %2R IS NOT FOUND IN INPUT ***/ .EVEN .PAGE ;*********************************************************************** ; ; WRITE TO CIL OR LICIL ; R0 = FDB POINTER ; ;*********************************************************************** WRITE:: WRITE$ R0,,,,,,,OUTERR ;READ A BLOCK WAIT$ ; RETURN ;*********************************************************************** ; ; ZERO OUT A BUFFER ; R1 = ADDR OF BUFFER, R2 = LENGTH ; ;*********************************************************************** BLANK:: CLR (R1)+ ;CLEAR A WORD SOB R2,BLANK ;LOOP RETURN ;*********************************************************************** ; ; CALCULATE CHECKSUM IN CKSUM ; R2 = PTR TO 1 WORD PAST WORD TO COUNT ; ;*********************************************************************** CHECK:: ADD -2(R2),CKSUM ;ADD ONCE SWAB -2(R2) ;SWAP BYTES ADD -2(R2),CKSUM ;AND ADD AGAIN SWAB -2(R2) ;PUT BYTES BACK RETURN ;IS THAT STUPID OR IS THAT STUPID! .PAGE ;*********************************************************************** ; ; ERROR ROUTINES ; ;*********************************************************************** IOERR:: MOV #IOER,R1 ;POINT TO MESSAGE CALL PRINT ;PRINT IT EXIT$S IOER:: .WORD IOERL ;DSW ERR MESSAGE .ASCII ?CIL>*** FATAL DIRECTIVE I/O ERROR? IOERL = .-IOER-2 ;LENGTH .EVEN OUTERR::MOV #OUTMG,R1 ;MESSAGE POINTER POP R2 ;CLEAN STACK POP R0 ; CALL PRINT ;PRINT IT CALL CLOSE ;CLOSE ALL FILES JMP RESTRT ;RESTART OUTMG: .WORD OUTMGL ;LENGTH .ASCII ?CIL> *** OUTPUT FILE I/O ERROR ***? OUTMGL = .-OUTMG-2 .EVEN INERR:: MOV #INMG,R1 ;MESSAGE POINTER CALL PRINT ;PRINT IT CALL CLOSE ;CLOSE ALL FILES JMP RESTRT ;RESTART INMG: .WORD INMGL ;LENGTH .ASCII ?CIL> *** INPUT FILE I/O ERROR ***? INMGL = .-INMG-2 .EVEN LSTERR::MOV #LSTER,R1 ;MESSAGE POINTER CALL PRINT ;PRINT IT CALL CLOSE ;CLOSE ALL FILES JMP RESTRT ;RESTART LSTER: .WORD LSTERL ;LENGTH .ASCII ?CIL> *** ERROR OPENING LISTING FILE ***? LSTERL = .-LSTER-2 .EVEN PRIERR::MOV #PRIMG,R1 ;MESSAGE POINTER CALL PRINT ;PRINT IT CALL CLOSE ;CLOSE ALL FILES JMP RESTRT ;RESTART PRIMG: .WORD PRIMGL ;LENGTH .ASCII ?CIL> *** ERROR OPENING PRIMARY INPUT ***? PRIMGL = .-PRIMG-2 .EVEN .PAGE FILERR::MOV #FILMG,R1 ;MESSAGE POINTER CALL PRINT ;PRINT IT CALL CLOSE ;CLOSE ALL FILES JMP RESTRT ;RESTART FILMG: .WORD FILMGL ;LENGTH .ASCII ?CIL> *** ERROR OPENING LICIL FILE FOR OUTPUT ***? FILMGL = .-FILMG-2 .EVEN UNDERR::MOV #UNDMG,R1 ;MESSAGE POINTER CALL PRINT ;PRINT IT CALL CLOSE ;CLOSE ALL FILES JMP RESTRT ;RESTART UNDMG: .WORD UNDMGL ;LENGTH .ASCII ?CIL> *** INPUT FILE NOT CIL OR LICIL FILE FORMAT ***? UNDMGL = .-UNDMG-2 .EVEN SIZERR::MOV #SIZMG,R1 ;MESSAGE POINTER CALL PRINT ;PRINT IT CALL CLOSE ;CLOSE ALL FILES JMP RESTRT ;RESTART SIZMG: .WORD SIZMGL ;LENGTH .ASCII ?CIL> *** A MODULE EXCEEDS MAXIMUM SIZE ***? SIZMGL = .-SIZMG-2 .EVEN .END