.TITLE OCTPUS octal print .IDENT /01.01/ ; ; OCTPUS reads characters from the console and prints their octal ASCII codes. ; This program was modeled after the ITS program of the same name. ; ; 05-AUG-2005 H. Rosenfeld ; .LIST ME .NLIST CND .ENABL REG .LIBRARY /USRLIB.SML/ .LIBRARY /JOBCTL.SML/ .LIBRARY /MEMORY.SML/ .LIBRARY /SYSCLL.SML/ .LIBRARY /TTYCTL.SML/ .LIBRARY /IOSYS.SML/ .LIBRARY /CALL.SML/ .MCALL $SYS .MCALL $EXIT,$WAIT,$CRASH .MCALL $IOREQ,$OPEN,$CLOS,$MODE .MCALL $M$ALLO,$P$INIT .MCALL .IOSYS,.IOFUNC,.IOERR,.IOCLR .MCALL .IMAGE,.CALL,.RETRN,.ENTRY .MCALL .TTYMOD .MCALL .ULDEFS,$CNV8S,$GETC,$PUTS,$PUTC .IOSYS .IOFUNC .IOERR .TTYMOD .ULDEFS .IMAGE OCTPUS .CSECT OCTPUS::.ENTRY $M$ALLO #0,#200,#^RUSR,#^RO$P,#^ROOL ; allocate a pool partition BCC 1$ ; continue if no error JMP INIERR ; abort on error 1$: $P$INIT R0,#200,#20 ; initialize pool partition .IOCLR #IORQP ; clear I/O request packet $CLOS #IORQP ; initialize I/O channels BCS INIERR ; abort on error 2$: $OPEN #IORQP,#^RTTY,#^R000,#^RTTY ; open terminal BCC 3$ ; continue if successful $WAIT #^RTTY,#^R000 ; wait for terminal if not BR 2$ ; try again 3$: MOVB R0,IORQP ; store I/O channel number $MODE #IORQP,#0 ; switch terminal into character mode BCS INIERR ; abort on error $PUTS #IORQP,#GREET,#61 ; print greeting BCC LOOP ; enter main loop INIERR: $CRASH ; error occured, crash process LOOP:: $GETC #IORQP ; get character BCS INIERR ; abort on error MOV R0,R4 ; save character $CNV8S #R$OCT,R4,#OCTBUF ; convert character to octal MOV R4,R3 ; save "real" character CMP R4,#040 ; control character? BCC 1$ ; nay, just print CMP R4,#033 ; escape character? BEQ 1$ ; yea $PUTC #IORQP,#'^ ; print up-arrow ADD #100,R4 ; convert to ascii 1$: CMP R4,#033 ; escape character? BNE 4$ ; nay MOV #'$,R4 ; print dollar sign BR 2$ 4$: CMP R4,#177 ; delete character? BNE 2$ ; nay, just print $PUTC #IORQP,#'^ ; print up-arrow MOV #'?,R4 ; print ? character 2$: $PUTC #IORQP,R4 ; print character $PUTS #IORQP,#OUTBUF,#12 ; print octal CMP R3,#032 ; Ctrl-Z? BNE LOOP ; nay, just repeat $PUTS #IORQP,#CTRLZ,#40 ; ask user what to do $GETC #IORQP ; get answer CMP R0,#'Y ; "yes"? BEQ 3$ ; yea CMP R0,#'y ; "yes"? BEQ 3$ ; yea $PUTS #IORQP,#NO,#5 ; no. JMP LOOP ; repeat 3$: $PUTS #IORQP,#YES,#6 ; yes. $CLOS #IORQP ; close I/O channel $EXIT ; exit program .PSECT DATA GREET: .ASCIZ /Howdy. Type the chars. ^Z will offer to exit./<15><12> CTRLZ: .ASCIZ /Do you want to exit? (Y or N) / YES: .ASCIZ /yes./<15><12> NO: .ASCIZ /no./<15><12> OUTBUF: .ASCII / --> / OCTBUF: .ASCIZ /000/<15><12> .EVEN IORQP: .BLKW 10 .END OCTPUS