.MACRO TERMINALIOSTUFF .PSECT IOSTUFF,LONG IN__: .ASCID "SYS$INPUT:" ; Input device logical name OUT__: .ASCID "SYS$OUTPUT:" ; Output device logical name CHI__: .BLKL 1 ; Input channel number CHO__: .BLKL 1 ; Output channel number STAT__: .BLKQ 1 ; Status after an I/O BCNT__=STAT__+2 ; Byte count on read PRO__: .ASCII "? " ; Prompt INO__: .BLKW 1 ; Descriptor for digit string .BYTE 14,2 .ADDRESS INUM__ INUM__: .BLKB 13 ; Digit string buffer INIT__: .BYTE 0 ; Initialization indicator REG0__: .BLKL 1 ; R0 saved here REG1__: .BLKL 1 ; R1 saved here EM1__: .BYTE 13,10,7 .ASCII "Error in input" ; Bad number on input EM2__: .BYTE 7,13,10 .ASCII "Too many digits" ; Bad specification on read .BYTE 7,13,10 ; For Initialization IOI__: MOVL R0,REG0__ ; Save the registers MOVL R1,REG1__ TSTB INIT__ ; Check if init done BEQL DOIT__ ; Not done, so do init RSB DOIT__: MOVB #1,INIT__ ; Indicate init done $ASSIGN_S DEVNAM=IN__, CHAN=CHI__ ; Set up channels $ASSIGN_S DEVNAM=OUT__, CHAN=CHO__ RSB ; For writing a longword number WRITENUM::BSBW IOI__ ; Check for initialization CVTLW REG1__,INO__ PUSHAL INO__ ; Set up conversion PUSHL REG0__ CALLS #2,G^OTS$CVT_L_TI ; Convert to text $QIOW_S CHAN=CHO__, FUNC=#IO$_WRITEVBLK, P1=INUM__,- P2=REG1__ ; Write the number MOVL REG0__,R0 ; Restore registers MOVL REG1__,R1 RSB ; For writing a character string WRITESTR::BSBW IOI__ ; Check for initialization $QIOW_S CHAN=CHO__, FUNC=#IO$_WRITEVBLK, P1=@REG0__,- P2=REG1__ ; Write the string MOVL REG0__,R0 ; Restore registers MOVL REG1__,R1 RSB ; For reading a longword number READNUM::BSBW IOI__ ; Read a number MOVL REG0__, (SP) TSTL REG1__ BLSS NL__ $QIOW_S CHAN=CHO__, FUNC=#IO$_WRITEVBLK, P1=PRO__,- P2=#2 ; Prompt for number BRB KOVR__ NL__: MNEGL REG1__,REG1__ KOVR__: CMPL #12,REG1__ ; Check specification BGEQ GET__ $QIOW_S CHAN=CHO__, FUNC=#IO$_WRITEVBLK, P1=EM2__,- P2=#21 ; Report error BRB BAD__ GET__: $QIOW_S CHAN=CHI__, FUNC=#IO$_READVBLK, IOSB=STAT__, P1=INUM__, P2=REG1__ ; Read the number MOVW BCNT__,INO__ ; Save byte count PUSHAL REG0__ PUSHAL INO__ CALLS #2,G^OTS$CVT_TI_L ; Convert to longword BLBC R0,RNE__ MOVL REG0__,@(SP) ; Store integer ESC__: MOVL (SP)+,R0 CVTWL BCNT__,R1 ; Get digit count RSB RNE__: $QIOW_S CHAN=CHO__, FUNC=#IO$_WRITEVBLK, P1=EM1__,- P2=#20 ; Report error BAD__: CLRL @(SP) BRB ESC__ ; For reading a character string READSTR::BSBW IOI__ ; Check for initialization TSTL REG1__ BLSS NPT__ $QIOW_S CHAN=CHO__, FUNC=#IO$_WRITEVBLK, P1=PRO__,- P2=#2 ; Prompt for input BRB KON__ NPT__: MNEGL REG1__,REG1__ KON__: CMPL #10000,REG1__ ; Check for no echo BLSS HID__ $QIOW_S CHAN=CHI__, FUNC=#IO$_READVBLK, IOSB=STAT__, P1=@REG0__, P2=REG1__ ; Read a string BRB GOO__ HID__: SUBL2 #10000,REG1__ ; Adjust for no echo $QIOW_S CHAN=CHI__, FUNC=#IO$_READVBLK!IO$M_NOECHO,- IOSB=STAT__, P1=@REG0__, P2=REG1__ GOO__: CVTWL BCNT__,R1 ; Get byte count MOVL REG0__,R0 RSB ; Resume .BLANK. PSECT .PSECT .ENDM TERMINALIOSTUFF