IOX MACRO V05.00 Friday 14-Oct-83 19:32 Table of contents 1- 14 MACRO DEFINITIONS 3- 1 GENERAL PURPOSE ROUTINES 4- 1 WRITEC - CHARACTER OUTPUT 6- 2 READC - CHARACTER READ SUBROUTINE 8- 12 WRITEO - OCTAL NUMERIC OUTPUT ROUTINE 9- 1 READO - OCTAL NUMERIC INPUT ROUTINE 10- 1 READD - DECIMAL NUMERIC INPUT ROUTINE 11- 1 WRITED - DECIMAL NUMERIC OUTPUT ROUTINE IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 1 1 .LIST TTM,ME,TOC 2 .NLIST BEX 3 ; INPUT-OUTPUT EXECUTIVE ROUTINES FOR CS213 4 ; PROGRAMMER T.WESLOWSKI 10-SEP-79 5 ; MODIFIED 21 JAN 1980 6 ; RE-MODIFIED ON 20-FEB-80 7 ; PATCHES--- 8 ; 29-FEB-80 P1. FIX READC SO IT FLUSHES CHARACTER BUFFER. 9 ; 22-MAY-80 P2.PUT IN PATCH FOR XM MONITOR. ALSO RSTS/E 10 ; EMULATION OF RT11 NEEDS THIS PATCH. 11 ; 10-SEP-80 P3. FORCE EVEN ADDRESSES ON ALL READD,READO,WRITED 12 ; AND WRITEO USER ARGUMENTS 13 .TITLE IOX 14 .SBTTL MACRO DEFINITIONS 15 ; BASIC SYSTEM MACROS 16 17 .MACRO .PRINT ADDR 18 .IF NB 19 .IF DIF ,R0 20 MOV ADDR,%0 21 .ENDC 22 .ENDC 23 EMT ^O351 24 .ENDM 25 26 .MACRO .TTYIN CHAR 27 .IIF DF XM BISB #100,@#^O44 ; I KNOW THIS AIN'T KOSHER, BUT..... 28 EMT ^O340 29 BCS .-2 30 .IF NB 31 .IF DIF ,R0 32 MOVB %0,CHAR 33 .ENDC 34 .ENDC 35 .ENDM 36 37 .MACRO .TTINR 38 .IIF DF XM BISB #100, @#^O44 ; LITTLE TWEAK FOR RSTS 39 EMT ^O340 40 .ENDM 41 42 .MACRO .EXIT 43 EMT ^O350 44 .ENDM 45 46 .MACRO .RCTRLO 47 EMT ^O355 48 .ENDM 49 IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 2 MACRO DEFINITIONS 1 ; LOCAL MACROS 2 3 .MACRO GOTO LBL ; THE 'GO TO' MACRO 4 .IF DF LBL 5 DIST=.-LBL 6 .IF GE DIST ; A REVERSE 'GOTO' 7 .IF LE 255.-DIST 8 JMP LBL 9 .IFF 10 BR LBL 11 .ENDC 12 .IFF ; A FORWARD 'GO TO' - WHICH IS ILLEGAL 13 ILLEGAL FORWARD REFERENCE -- LBL 14 .ENDC 15 .IFF 16 UNDEFINED LABEL IN GO TO ---- LBL 17 .ENDC 18 .ENDM GOTO 19 20 .MACRO CALL SUBR,REG 21 .IF B 22 JSR R5,SUBR 23 .IFF 24 JSR REG,SUBR 25 .ENDC 26 .ENDM CALL 27 28 .MACRO RETURN 29 RTS R5 30 .ENDM RETURN 31 000001 P1134=1 ; FLAG FOR 11/34 32 ; LSI11=1 ; FLAG FOR YOU KNOW WHOM 33 ; KEV11=1 34 ; FIS=1 35 ; EIS=1 36 .IF DF LSI11 37 .IF DF KEV11 38 FIS=1 39 EIS=1 40 .ENDC 41 .IFF 42 .IF DF FIS 43 EIS=1 44 .ENDC 45 .ENDC 46 .IF DF P1134 47 000001 EIS=1 48 000001 XM=1 49 .ENDC 50 .IF NDF EIS 51 52 .MACRO SOB REG,LBL 53 DSP=LBL-. 54 .IF GE DSP 55 DEC REG 56 BNE LBL 57 .IFF IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 2-1 MACRO DEFINITIONS 58 LABEL ERROR IN SOB 59 .ENDC 60 .ENDM SOB 61 .ENDC IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 3 GENERAL PURPOSE ROUTINES 1 .SBTTL GENERAL PURPOSE ROUTINES 2 3 .MACRO SAVREG 4 .IRP REG,<0,1,2,3,4> 5 MOV R'REG,-(SP) 6 .ENDR 7 MOV R5,DUMP 8 .ENDM SAVREG 9 10 .MACRO RSTREG 11 .IRP REG,<4,3,2,1,0> 12 MOV (SP)+,R'REG 13 .ENDR 14 .ENDM RSTREG 15 000000 055 HDRMSG: .ASCIZ /--R0-- --R1-- --R2-- --R3-- --R4--/ 16 17 .MACRO FATAL XMSG ; FATAL ERROR CRASH ROUTINE 18 .ENABL LSB 19 MOV DUMP,1$ ; SAVE USER PC 20 CALL WRITEC 21 XMSG 22 CALL WRITEC 23 MSG 24 CALL WRITEO 25 1,1$ ; AND WRITE OUT HIS PC 26 CALL WRITEC 27 HDRMSG ; WRITE OUT REGISTER HEADER 28 .IRP N,<10,6,4,2,0> ; UNLOAD STACK 29 MOV (SP)+,INBUF+N 30 .ENDR 31 CALL WRITEO ; AND PRINT OUT USERS REG AT TIME OF CRASH. 32 5 33 .IRP N <0,2,4,6,10> 34 .WORD INBUF+N 35 .ENDR 36 .EXIT 37 1$: 0 38 .DSABL LSB 39 .ENDM FATAL IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 4 WRITEC - CHARACTER OUTPUT 1 .SBTTL WRITEC - CHARACTER OUTPUT 2 3 000015 CR=15 4 000012 LF=12 5 .EVEN 6 000044 000024 TOPS:: .WORD 20. ; MAX # OF ALLOWABLE ARGUMENTS. MAY BE 7 ; CHANGED BY THE USER. 8 000046 006412 CRLF: CR*256.+LF IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 5 WRITEC - CHARACTER OUTPUT 1 ; **************************************************** 2 ; * WRITEC * 3 ; * * 4 ; **************************************************** 5 ; CALLED BY THE CALL: 6 ; JSR R5, WRITEC 7 ; .WORD OBUF 8 ; WHERE ----- OBUF IS THE STARTING ADDRESS OF THE USER OUTPUT BUFFER. 9 ; WRITEC WILL TRANSMIT ASCII BYTES TO THE USER KEYBOARD UNTIL 10 ; IT ENCOUNTERS AN ASCII NULL (0). 11 12 13 14 15 000050 WRITEC:: 16 000050 010046 MOV R0,-(SP) ; SAVE USER REG ON STACK 17 000052 .RCTRLO ; MAKE SURE USER HAS NOT DONE ^O 000052 104355 EMT ^O355 18 000054 012500 MOV (5)+,R0 ; GET ADDRESS OF USER BUFFER 19 000056 .PRINT ; AND PRINT THE BUFFER .IF NB <> .IF DIF <>,R0 MOV ,%0 .ENDC .ENDC 000056 104351 EMT ^O351 20 000060 012600 MOV (SP)+,R0 ; RESTORE THE USER'S REG... 21 000062 RETURN ; AND RETURN TO USER PROGRAM. 000062 000205 RTS R5 22 23 24 25 IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 6 WRITEC - CHARACTER OUTPUT 1 .if ndf diskio 2 .SBTTL READC - CHARACTER READ SUBROUTINE 3 ; *************************************************** 4 ; * * 5 ; * READC * 6 ; * * 7 ; *************************************************** 8 ; CALLED BY THE USER WITH THE JSR R5, READC 9 ; .WORD N,INBUF 10 ; WHERE ---- N IS THE -->NUMBER<-- (NOT ADDRESS) OF CHARACTERS 11 ; TO ALLOW TO BE INPUT TO THE USER INPUT BUFFER, AND 12 ; -------- INBUF IS THE USER INPUT BUFFER ADDRESS. 13 ; ANY EXCESS CHARACTERS (UP TO THE PAIR) 14 ; ARE DISCARDED. IF FEWER THAN 'N' CHARACTERS 15 ; ARE ENTERED, THE PAIR (OR JUST THE - DEPENDING 16 ; ON USER BUFFER LENGTH) ARE TRANSMITTED TO 17 ; THE USER INPUT BUFFER. IT IS POSSIBLE TO 'TYPE' AHEAD 18 ; OF THE READC ROUTINEAND CHARACTER DATA WILL BE 19 ; FAITHFULLY TRANSMITTED TO THE USER PROGRAM WHEN THE ROUTINE 20 ; IS CALLED. 21 22 000064 READC:: SAVREG .IRP REG,<0,1,2,3,4> MOV R'REG,-(SP) .ENDR 000064 010046 MOV R0,-(SP) 000066 010146 MOV R1,-(SP) 000070 010246 MOV R2,-(SP) 000072 010346 MOV R3,-(SP) 000074 010446 MOV R4,-(SP) 000076 010567 MOV R5,DUMP 23 000102 012502 MOV (5)+,R2 ; GET THE NUMBER OF CHARS TO RECIEVE 24 000104 003432 BLE ERR1 ; AND BLOW UP IF .LE. 0 25 000106 012501 MOV (5)+,R1 ; GET ADDRESS OF USERS INPUT BUFFER 26 000110 LOOP0: .TTYIN ; AND START INPUTTING CHARACTERS... 000110 152737 .IIF DF XM BISB #100,@#^O44 ; I KNOW THIS AIN'T KOSHER, BUT..... 000116 104340 EMT ^O340 000120 103776 BCS .-2 .IF NB <> .IF DIF <>,R0 MOVB %0, .ENDC .ENDC 27 000122 110021 MOVB R0,(1)+ ; TRANSMIT THE CHARACTER TO THE USER BUFFER 28 000124 120027 CMPB R0,#LF ; AND CHECK TO SEE IF IT WAS A 29 000130 001407 BEQ EXI99 ; IF IT WAS, PROCEED TO EXIT ROUTINE 30 000132 077212 SOB R2,LOOP0 ; OTHERWISE DECREMENT THE CHARACTER 31 ; COUNTER, AND CONTINUE IF STILL >0 32 000134 LOOP9: .TTINR ; IF WE GET HERE USER HAS TYPED TO MANY 000134 152737 .IIF DF XM BISB #100, @#^O44 ; LITTLE TWEAK FOR RSTS 000142 104340 EMT ^O340 33 ; CHARACTERS. WE ARE NOW GOING TO EXPUNGE 34 ; THE INPUT BUFFER UP TO ITS END. 35 000144 103404 BCS EXI9 ; IF CARRY BIT SET, LEAVE 36 000146 000772 BR LOOP9 ; IF NOT, CONTINUE EXPUNGING CHARACTERS 37 000150 005702 EXI99: TST R2 ; SEE IF ROOM IN USER BUFFER FOR A <0> 38 000152 001401 BEQ EXI9 ; NOPE. LEAVE! IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 6-1 READC - CHARACTER READ SUBROUTINE 39 000154 105011 CLRB (1) ; PLACE A NULL BYTE AT END OF TEXT 40 000156 EXI9: RSTREG .IRP REG,<4,3,2,1,0> MOV (SP)+,R'REG .ENDR 000156 012604 MOV (SP)+,R4 000160 012603 MOV (SP)+,R3 000162 012602 MOV (SP)+,R2 000164 012601 MOV (SP)+,R1 000166 012600 MOV (SP)+,R0 41 000170 RETURN ; AND RETURN TO THE USER PROGRAM 000170 000205 RTS R5 42 ; ********* ERROR ROUTINES FOR READC ************ 43 000172 ERR1: FATAL EMSG1 ; FATAL ERROR .ENABL LSB 000172 016767 MOV DUMP,1$ ; SAVE USER PC 000200 CALL WRITEC .IF B <> 000200 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 000204 000302' EMSG1 000206 CALL WRITEC .IF B <> 000206 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 000212 000316' MSG 000214 CALL WRITEO .IF B <> 000214 004567 JSR R5,WRITEO .IFF JSR ,WRITEO .ENDC 000220 000001 1,1$ ; AND WRITE OUT HIS PC 000224 CALL WRITEC .IF B <> 000224 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 000230 000000' HDRMSG ; WRITE OUT REGISTER HEADER .IRP N,<10,6,4,2,0> ; UNLOAD STACK MOV (SP)+,INBUF+N .ENDR 000232 012667 MOV (SP)+,INBUF+10 000236 012667 MOV (SP)+,INBUF+6 000242 012667 MOV (SP)+,INBUF+4 000246 012667 MOV (SP)+,INBUF+2 000252 012667 MOV (SP)+,INBUF+0 000256 CALL WRITEO ; AND PRINT OUT USERS REG AT TIME OF CRASH. .IF B <> 000256 004567 JSR R5,WRITEO .IFF JSR ,WRITEO IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 6-2 READC - CHARACTER READ SUBROUTINE .ENDC 000262 000005 5 .IRP N <0,2,4,6,10> .WORD INBUF+N .ENDR 000264 001220' .WORD INBUF+0 000266 001222' .WORD INBUF+2 000270 001224' .WORD INBUF+4 000272 001226' .WORD INBUF+6 000274 001230' .WORD INBUF+10 000276 .EXIT 000276 104350 EMT ^O350 000300 000000 1$: 0 .DSABL LSB 44 .iff 45 readc:: savreg 46 mov #inbuf,-(sp) 47 mov #1,-(sp) 48 clr -(sp) 49 clr -(sp) 50 bis #100,44 ;tell rsts we is the xm monitor 51 emt 345 ;.gtlin 52 mov #inbuf,r0 53 mov (5)+,r1 54 dec r1 55 mov (5)+,r2 56 loop: movb (0)+,(2)+ 57 sob r1,loop 58 clrb (2) 59 rstreg 60 return 61 .endc IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 7 READC - CHARACTER READ SUBROUTINE 1 ; .SBTTL EXIT - RETURN TO RT11 MONITOR 2 ; ************************************** 3 ; * * 4 ; * EXIT * 5 ; * * 6 ; ************************************** 7 ; CALLED FROM THE USED ROUTINE BY THE CALL--- 8 ; JMP EXIT 9 10 11 12 ;EXIT:: .EXIT ; GLOBAL EXIT ROUTINE.... 13 ; RETURN TO MONITOR, CLOSE ALL OPEN FILES,ETC. 14 15 16 17 18 IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 8 READC - CHARACTER READ SUBROUTINE 1 ; ****************** ERROR MESSAGES************************* 2 000302 015 EMSG1: .ASCIZ /--READC--/ 3 000316 040 MSG: .ASCIZ / ILLEGAL FIRST ARGUMENT AT USER PC / 4 000362 OBUF: .BLKB 142. 5 000600 000 .BYTE 0 6 .EVEN 7 000602 000000 DUMP: 0 8 000604 000000 LOOP: 0 9 000606 000000 MASK: 0 10 000610 000000 DATA: 0 11 000612 000000 NARG: 0 12 .SBTTL WRITEO - OCTAL NUMERIC OUTPUT ROUTINE 13 ; ******************************************************* 14 ; * * 15 ; * WRITEO * 16 ; * * 17 ; ******************************************************* 18 ; CALLED FROM THE USER ROUTINE BY THE CALL: 19 ; JSR R5, WRITEO 20 ; .WORD N,ARG1,ARG2,ARG3,...,ARGN 21 ; WHERE----- N IS THE NUMBER OF ARGUMENTS IN THE ARGUMENT LIST 22 ; ARG1,ARG2,...ARGN ARE ADDRESSES IF NUMBERS TO BE 23 ; OUTPUT. 24 25 26 27 28 29 000614 TBUF: .BLKB 8. ; TEMPORARY WORKING AREA FOR WRITEO 30 000624 WRITEO:: SAVREG .IRP REG,<0,1,2,3,4> MOV R'REG,-(SP) .ENDR 000624 010046 MOV R0,-(SP) 000626 010146 MOV R1,-(SP) 000630 010246 MOV R2,-(SP) 000632 010346 MOV R3,-(SP) 000634 010446 MOV R4,-(SP) 000636 010567 MOV R5,DUMP 31 000642 012567 W1: MOV (5)+,NARG ; # OF ARGS ALSO SAVED HERE 32 000646 003510 BLE ERR2 ; IF ILLEGAL, QUIT 33 000650 026767 CMP NARG,TOPS 34 000656 003104 BGT ERR2 35 000660 012704 MOV #OBUF,R4 ; INITIALIZE OUTPUT BUFFER POINTER 36 000664 012567 LOOP1: MOV (5)+,DATA ; GET USER DATA ADDRESS 37 000670 042767 BIC #1,DATA ; MAKE SURE ADDRESS EVEN 38 000676 017767 MOV @DATA,DATA ; PICK UP THE DATA 39 000704 012767 MOV #6,LOOP ; THERE ARE 6 DIGITS IN AN OCTAL WORD 40 000712 012700 MOV #TBUF+6,R0 ; R0 <- ADDRESS IF UNITS DIGIT IN TEMP BUFFER 41 000716 012767 MOV #177770,MASK ; CRAP STRIPPER MASK 42 000724 016702 LOOP2: MOV DATA,R2 ; GET SOME USER DATA 43 000730 046702 BIC MASK,R2 ; AND STRIP THE CRAP 44 000734 000261 SEC ; SET THE MASK UP FOR NEXT TIME THRU LOOP 45 000736 006167 ROL MASK 46 000742 006167 ROL MASK 47 000746 006167 ROL MASK 48 000752 010003 MOV R0,R3 ; COMPUTE HOW FAR TO ROTATE USER DATA IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 8-1 WRITEO - OCTAL NUMERIC OUTPUT ROUTINE 49 000754 162703 SUB #6+TBUF,R3 50 000760 005403 NEG R3 51 000762 070327 MUL #3,R3 52 000766 001402 BEQ NEXT1 53 000770 006002 LOOP3: ROR R2 ; ROTATE USER DATA 54 000772 077302 SOB R3,LOOP3 55 000774 062702 NEXT1: ADD #60,R2 ; AND TURN IT INTO ASCII ** POOF ** 56 001000 110240 MOVB R2,-(0) ; PLACE COMPLETED CHARACTER INTO BUFFER 57 001002 005367 DEC LOOP ; AND SEE IF WE'VE DONE SIX DIGITS YET 58 001006 001346 BNE LOOP2 ; IF NOT, CONTINUE TO GENERATE DIGITS 59 001010 142767 BICB #6,TBUF ; A KLUDGE TO ZAP OME HIGH ORDER BITS 60 .ENABL LSB 61 001016 012701 MOV #6,R1 ; LOOP TO SHOVEL DATA FROM TBUF TO OBUF 62 001022 012702 MOV #TBUF,R2 63 001026 112224 1$: MOVB (2)+,(4)+ ; R4 POINTS TO OBUF 64 001030 077102 SOB R1, 1$ 65 .DSABL LSB 66 001032 112724 MOVB #' ,(4)+ ; PUT A SPACE BETWEEN NUMBERS 67 001036 005367 DEC NARG ; WE DONE YET??? 68 001042 001310 BNE LOOP1 ; IF NOT, DO THE NEXT NUMBER 69 001044 105024 CLRB (4)+ ; ELSE PLACE A NULL AT END OF OBUF 70 001046 CALL WRITEC ; AND OUTPUT THE LINE OF DATA .IF B <> 001046 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 71 001052 000362' OBUF 72 001054 RESTO: RSTREG .IRP REG,<4,3,2,1,0> MOV (SP)+,R'REG .ENDR 001054 012604 MOV (SP)+,R4 001056 012603 MOV (SP)+,R3 001060 012602 MOV (SP)+,R2 001062 012601 MOV (SP)+,R1 001064 012600 MOV (SP)+,R0 73 001066 RETURN 001066 000205 RTS R5 74 001070 ERR2: FATAL EMSG2 ; FATAL ERROR .ENABL LSB 001070 016767 MOV DUMP,1$ ; SAVE USER PC 001076 CALL WRITEC .IF B <> 001076 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 001102 001200' EMSG2 001104 CALL WRITEC .IF B <> 001104 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 001110 000316' MSG 001112 CALL WRITEO IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 8-2 WRITEO - OCTAL NUMERIC OUTPUT ROUTINE .IF B <> 001112 004567 JSR R5,WRITEO .IFF JSR ,WRITEO .ENDC 001116 000001 1,1$ ; AND WRITE OUT HIS PC 001122 CALL WRITEC .IF B <> 001122 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 001126 000000' HDRMSG ; WRITE OUT REGISTER HEADER .IRP N,<10,6,4,2,0> ; UNLOAD STACK MOV (SP)+,INBUF+N .ENDR 001130 012667 MOV (SP)+,INBUF+10 001134 012667 MOV (SP)+,INBUF+6 001140 012667 MOV (SP)+,INBUF+4 001144 012667 MOV (SP)+,INBUF+2 001150 012667 MOV (SP)+,INBUF+0 001154 CALL WRITEO ; AND PRINT OUT USERS REG AT TIME OF CRASH. .IF B <> 001154 004567 JSR R5,WRITEO .IFF JSR ,WRITEO .ENDC 001160 000005 5 .IRP N <0,2,4,6,10> .WORD INBUF+N .ENDR 001162 001220' .WORD INBUF+0 001164 001222' .WORD INBUF+2 001166 001224' .WORD INBUF+4 001170 001226' .WORD INBUF+6 001172 001230' .WORD INBUF+10 001174 .EXIT 001174 104350 EMT ^O350 001176 000000 1$: 0 .DSABL LSB 75 ; *********** ERROR MESSAGES ************** 76 001200 015 EMSG2: .ASCIZ /--WRITEO--/ 77 .EVEN 78 001216 000000 MULT: 0 79 001220 040 INBUF: .BYTE 40 ; INPUT BUFFER FOR READO AND READD SUBROUTINES 80 001221 .BLKB 131. 81 .EVEN 82 001424 ERR3: FATAL EMSG9 ; FATAL ERROR .ENABL LSB 001424 016767 MOV DUMP,1$ ; SAVE USER PC 001432 CALL WRITEC .IF B <> 001432 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 001436 002166' EMSG9 IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 8-3 WRITEO - OCTAL NUMERIC OUTPUT ROUTINE 001440 CALL WRITEC .IF B <> 001440 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 001444 000316' MSG 001446 CALL WRITEO .IF B <> 001446 004567 JSR R5,WRITEO .IFF JSR ,WRITEO .ENDC 001452 000001 1,1$ ; AND WRITE OUT HIS PC 001456 CALL WRITEC .IF B <> 001456 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 001462 000000' HDRMSG ; WRITE OUT REGISTER HEADER .IRP N,<10,6,4,2,0> ; UNLOAD STACK MOV (SP)+,INBUF+N .ENDR 001464 012667 MOV (SP)+,INBUF+10 001470 012667 MOV (SP)+,INBUF+6 001474 012667 MOV (SP)+,INBUF+4 001500 012667 MOV (SP)+,INBUF+2 001504 012667 MOV (SP)+,INBUF+0 001510 CALL WRITEO ; AND PRINT OUT USERS REG AT TIME OF CRASH. .IF B <> 001510 004567 JSR R5,WRITEO .IFF JSR ,WRITEO .ENDC 001514 000005 5 .IRP N <0,2,4,6,10> .WORD INBUF+N .ENDR 001516 001220' .WORD INBUF+0 001520 001222' .WORD INBUF+2 001522 001224' .WORD INBUF+4 001524 001226' .WORD INBUF+6 001526 001230' .WORD INBUF+10 001530 .EXIT 001530 104350 EMT ^O350 001532 000000 1$: 0 .DSABL LSB 83 84 85 86 87 88 IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 9 READO - OCTAL NUMERIC INPUT ROUTINE 1 .SBTTL READO - OCTAL NUMERIC INPUT ROUTINE 2 ; *********************************************** 3 ; * * 4 ; * READO * 5 ; * * 6 ; *********************************************** 7 ; CALLED FROM THE USER PROGRAM BY THE CALL: 8 ; JSR R5, READO 9 ; .WORD N,ARG1,ARG2,ARG3,.....,ARGN 10 ; WHERE N IS THE NUMBER OF ARGUMENTS IN THE ARGUMENT 11 ; LIST. THIS IS FOLLOWED BY... 12 ; ARG1,ARARE THE WORD ADDREASES 13 ; OF USER INPUT AREAS. READO WILL HANG IN A LOOP UNTILL THE NUMBER 14 ; OF INPUT WORDS ARE TRANSMITTED FROM THE KEYBOARD TO THE USER 15 ; ROUTINE. THE AREGUMENTS ARE TRANSMITTED ON A ONE-TO-ONE 16 ; CORRESPONDANCE BASIS, THAT IS, FIRST NUMBER TYPED WILL BE 17 ; TRANSMITTED TO THE FIRST ARGUMENT IN THE USER LIST, SECOND 18 ; NUMBER TYPED WILL BE TRANSMITTED TO THE SECOND NUMBER IN THE 19 ; USER LIST, ETC. 20 ; SHOULD AN EXCESS NUMBER OF ARGUMENTS BE TYPED, 21 ; THE EXCESS NUMBER OF ARGUMENTS ARE IGNORED, STARTING WITH 22 ; THE FIRST DATUM TYPED. THE USER IS INFORMED 23 ; OF THIS OCCURANCE BY A WARNING MESSAGE. 24 ; ARGUMENTS IN THE DATA LIST MAY BE SEPERATED BY 25 ; COMMAS AND/OR SPACES. FOR EXAMPLE, 26 ; IN RESPONSE TO THE CALL 27 ; JSR R5,READO 28 ; .WORD 3,IN1,IN2,MAXO 29 ; THE USER COULD TYPE 30 ; 123,446 772 31 ; 123 WOULD BE PLACED IN IN1, 446 WOULD BE PLACED IN IN2, 32 ; AND 772 WOULD BE PLACED IN MAXO. 33 ; IF THE USER TYPES AN ILLEGAL OCTAL CHARACTER, 34 ; THE ROUTINE INFORMS THE USER OF THE ERROR AND ASKS FOR A 35 ; RETRANSMITTAL OF THE DATA. 36 37 38 39 40 001534 READO:: SAVREG .IRP REG,<0,1,2,3,4> MOV R'REG,-(SP) .ENDR 001534 010046 MOV R0,-(SP) 001536 010146 MOV R1,-(SP) 001540 010246 MOV R2,-(SP) 001542 010346 MOV R3,-(SP) 001544 010446 MOV R4,-(SP) 001546 010567 MOV R5,DUMP 41 001552 010567 MOV R5,DUMP1 ; SAVE R5 IN CASE WE HAVE A SOFT CRASH 42 001556 012567 AGAIN: MOV (5)+,NARG ; GET NUMBER OF ARGUMENTS 43 001562 003720 BLE ERR3 ; AND BLOW UP IF .LE. 0 44 001564 026767 CMP NARG,TOPS ; REASONABLE # OF ARGS?? 45 001572 003314 BGT ERR3 ; IF NARG>TOPS GO TO ERR3 46 001574 112767 MOVB #40,INBUF ; MAKE SURE FIRST CHAR IS A SPACE 47 001602 CALL READC ; AND READ THE INPUT BUFFER .IF B <> IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 9-1 READO - OCTAL NUMERIC INPUT ROUTINE 001602 004567 JSR R5,READC .IFF JSR ,READC .ENDC 48 001606 000204 132.,INBUF+1 ; WE ALLOW THE USER A MAXIMUM OF 132 CHARACTERS. 49 ; (ONE LINE OF INPUT). AFTER THAT, TOUGH!!! 50 001612 016700 MOV NARG,R0 51 001616 005300 DEC R0 52 001620 006300 ASL R0 53 001622 060500 ADD R5,R0 ; ADD OFFSET INTO USER ARGS 54 001624 010067 MOV R0,ADDR ; ADDRESS OF LAST ARGUMENT 55 001630 005720 TST (0)+ 56 001632 010067 MOV R0,ADDR2 ; RETURN ADDRESS 57 001636 012700 MOV #INBUF,R0 58 001642 122027 LOOP4: CMPB (0)+,#CR 59 001646 001375 BNE LOOP4 60 001650 005300 DEC R0 61 001652 012767 ENDO1: MOV #1,MULT 62 001660 017701 MOV @ADDR,R1 ; R1 POINTS TO GRACI SPACE!! 63 001664 162767 SUB #2, ADDR ; ADJUST SO POINTS TO NEXT ARG 64 001672 005002 CLR R2 65 001674 124027 LOOP5: CMPB -(0),#' ; A SPACE!!! 66 001700 001004 BNE NEXT3 67 001702 020027 CMP R0,#INBUF 68 001706 002465 BLT EXO 69 001710 GOTO LOOP5 .IF DF LOOP5 000014 DIST=.-LOOP5 .IF GE DIST ; A REVERSE 'GOTO' .IF LE 255.-DIST JMP LOOP5 .IFF 001710 000771 BR LOOP5 .ENDC .IFF ; A FORWARD 'GO TO' - WHICH IS ILLEGAL ILLEGAL FORWARD REFERENCE -- LOOP5 .ENDC .IFF UNDEFINED LABEL IN GO TO ---- LOOP5 .ENDC 70 001712 121027 NEXT3: CMPB (0),#', ; A COMMA!!! 71 001716 001001 BNE NEXT44 72 001720 005300 DEC R0 73 001722 121027 NEXT44: CMPB (0),#' ; A SPACE 74 001726 001762 BEQ LOOP5 ; IF SO , GO LOOK FOR SOME MORE DIGITS 75 001730 121027 NEXT4: CMPB (0),#'0 76 001734 002472 BLT ERR4 77 001736 121027 CMPB (0),#'7 78 001742 003067 BGT ERR4 79 001744 111003 MOVB (0),R3 80 001746 042703 BIC #177770,R3 81 001752 070367 MUL MULT,R3 ; (* NOTICE THE LACK OF DOCUMANTATION *) 82 001756 060302 ADD R3,R2 83 001760 006367 ASL MULT 84 001764 103416 BCS EXO3 85 001766 006367 ASL MULT 86 001772 006367 ASL MULT IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 9-2 READO - OCTAL NUMERIC INPUT ROUTINE 87 001776 124027 CMPB -(0),#' 88 002002 001411 BEQ EXO1 89 002004 121027 CMPB (0),#', 90 002010 001406 BEQ EXO1 91 002012 020027 CMP R0,#INBUF 92 002016 003403 BLE EXO1 93 002020 GOTO NEXT4 .IF DF NEXT4 000070 DIST=.-NEXT4 .IF GE DIST ; A REVERSE 'GOTO' .IF LE 255.-DIST JMP NEXT4 .IFF 002020 000743 BR NEXT4 .ENDC .IFF ; A FORWARD 'GO TO' - WHICH IS ILLEGAL ILLEGAL FORWARD REFERENCE -- NEXT4 .ENDC .IFF UNDEFINED LABEL IN GO TO ---- NEXT4 .ENDC 94 002022 052702 EXO3: BIS #100000,R2 ; TURN ON BIT 15 95 002026 042701 EXO1: BIC #1,R1 ; MAKE SURE ADDRESS IS EVEN 96 002032 010211 MOV R2,(1) ; AND MOVE DATA BACK TO USER 97 002034 005367 DEC NARG ; SUBTRACT NUMBER OF ARGUMENTS 98 002040 001304 BNE ENDO1 ; AND CONTINUE IF NOT DONE 99 002042 RESTO3: RSTREG .IRP REG,<4,3,2,1,0> MOV (SP)+,R'REG .ENDR 002042 012604 MOV (SP)+,R4 002044 012603 MOV (SP)+,R3 002046 012602 MOV (SP)+,R2 002050 012601 MOV (SP)+,R1 002052 012600 MOV (SP)+,R0 100 002054 012605 MOV (SP)+,R5 ;RESTORE OLD R5 101 002056 016707 MOV ADDR2,PC ;RETURN TO CALLER 102 002062 EXO: CALL WRITEC .IF B <> 002062 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 103 002066 002166' EMSG9 104 002070 CALL WRITEC .IF B <> 002070 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 105 002074 002200' EMSG8 106 002076 GOTO RESTO3 .IF DF RESTO3 000034 DIST=.-RESTO3 .IF GE DIST ; A REVERSE 'GOTO' .IF LE 255.-DIST JMP RESTO3 IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 9-3 READO - OCTAL NUMERIC INPUT ROUTINE .IFF 002076 000761 BR RESTO3 .ENDC .IFF ; A FORWARD 'GO TO' - WHICH IS ILLEGAL ILLEGAL FORWARD REFERENCE -- RESTO3 .ENDC .IFF UNDEFINED LABEL IN GO TO ---- RESTO3 .ENDC 107 002100 ERR5: CALL WRITEC .IF B <> 002100 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 108 002104 002166' EMSG9 109 002106 CALL WRITEC .IF B <> 002106 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 110 002112 002243' EMSG7 111 002114 016705 AGN: MOV DUMP1,R5 ; RESTORE ARGUMENT ADDRESS POINTER 112 002120 GOTO AGAIN ; AND DO IT ALL OVER AGAIN .IF DF AGAIN 000342 DIST=.-AGAIN .IF GE DIST ; A REVERSE 'GOTO' .IF LE 255.-DIST JMP AGAIN .IFF 002120 000616 BR AGAIN .ENDC .IFF ; A FORWARD 'GO TO' - WHICH IS ILLEGAL ILLEGAL FORWARD REFERENCE -- AGAIN .ENDC .IFF UNDEFINED LABEL IN GO TO ---- AGAIN .ENDC 113 002122 ERR4: CALL WRITEC .IF B <> 002122 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 114 002126 002166' EMSG9 115 002130 CALL WRITEC .IF B <> 002130 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 116 002134 002311' EMSG6 117 002136 005200 INC R0 ; POINT R0 AFTER OFFENDING CHARACTER 118 002140 112720 MOVB #'<,(0)+ ; PUT IN A POINTER 119 002144 112720 MOVB #'-,(0)+ 120 002150 112720 MOVB #'-,(0)+ IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 9-4 READO - OCTAL NUMERIC INPUT ROUTINE 121 002154 105010 CLRB (0) ; SET NULL FOR END OF LINE 122 002156 CALL WRITEC ; AND DUMP THE BUFFER .IF B <> 002156 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 123 002162 001220' INBUF 124 002164 GOTO AGN .IF DF AGN 000050 DIST=.-AGN .IF GE DIST ; A REVERSE 'GOTO' .IF LE 255.-DIST JMP AGN .IFF 002164 000753 BR AGN .ENDC .IFF ; A FORWARD 'GO TO' - WHICH IS ILLEGAL ILLEGAL FORWARD REFERENCE -- AGN .ENDC .IFF UNDEFINED LABEL IN GO TO ---- AGN .ENDC 125 ; ****************** ERROR MESSAGES ****************** 126 002166 055 EMSG9: .ASCIZ /--READO--/ 127 002200 040 EMSG8: .ASCIZ / TO MUCH INPUT DATA-EXCESS IGNORED/ 128 002243 040 EMSG7: .ASCIZ / TO MANY DIGITS IN NUMBER-RETYPE LINE/ 129 002311 040 EMSG6: .ASCIZ / ILLEGAL INPUT CHARACTER-RETYPE LINE/ 130 002356 000000 DUMP1: 0 ; LOCAL-YOKAL STORAGE AREAS 131 002360 000000 ADDR: 0 132 002362 000000 ADDR2: 0 133 134 135 136 IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 10 READD - DECIMAL NUMERIC INPUT ROUTINE 1 .SBTTL READD - DECIMAL NUMERIC INPUT ROUTINE 2 ; ******************************************************* 3 ; * * 4 ; * READD * 5 ; * * 6 ; ******************************************************* 7 ; CALLED FROM THE USER PROGRAM BY THE CALL: 8 ; JSR R5,READD 9 ; .WORD N,ARG1,ARG2,....,ARGN 10 ; WHERE N IS THE NUMBER OF ARGUMENTS, AND 11 ; ARG1,...,ARGN ARE THEIR ADDRESSES. 12 ; THIS ROUTINE WILL ALLOW DECIMAL INPUT OF BOTH POSITIVE 13 ; AND NEGATIVE NUMBERS FROM THE KEYBOARD. LEGAL 14 ; DILIMITERS ARE COMMA(,), ANY NUMBER OF 15 ; SPACES, HORIZONTAL TAB , MINUS SIGN (-) OR 16 ; A PLUS SIGN (+). 17 ; INPUT RULES ARE THE SAME AS FOR READO. 18 002364 ERR10: FATAL EMSG10 ; FATAL ERROR .ENABL LSB 002364 016767 MOV DUMP,1$ ; SAVE USER PC 002372 CALL WRITEC .IF B <> 002372 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 002376 003625' EMSG10 002400 CALL WRITEC .IF B <> 002400 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 002404 000316' MSG 002406 CALL WRITEO .IF B <> 002406 004567 JSR R5,WRITEO .IFF JSR ,WRITEO .ENDC 002412 000001 1,1$ ; AND WRITE OUT HIS PC 002416 CALL WRITEC .IF B <> 002416 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 002422 000000' HDRMSG ; WRITE OUT REGISTER HEADER .IRP N,<10,6,4,2,0> ; UNLOAD STACK MOV (SP)+,INBUF+N .ENDR 002424 012667 MOV (SP)+,INBUF+10 002430 012667 MOV (SP)+,INBUF+6 002434 012667 MOV (SP)+,INBUF+4 002440 012667 MOV (SP)+,INBUF+2 002444 012667 MOV (SP)+,INBUF+0 002450 CALL WRITEO ; AND PRINT OUT USERS REG AT TIME OF CRASH. IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 10-1 READD - DECIMAL NUMERIC INPUT ROUTINE .IF B <> 002450 004567 JSR R5,WRITEO .IFF JSR ,WRITEO .ENDC 002454 000005 5 .IRP N <0,2,4,6,10> .WORD INBUF+N .ENDR 002456 001220' .WORD INBUF+0 002460 001222' .WORD INBUF+2 002462 001224' .WORD INBUF+4 002464 001226' .WORD INBUF+6 002466 001230' .WORD INBUF+10 002470 .EXIT 002470 104350 EMT ^O350 002472 000000 1$: 0 .DSABL LSB 19 002474 111 EMSG11: .ASCIZ /ILLEGAL NUMBER. RETYPE LINE./ 20 .EVEN 21 22 23 24 25 26 002532 READD:: SAVREG .IRP REG,<0,1,2,3,4> MOV R'REG,-(SP) .ENDR 002532 010046 MOV R0,-(SP) 002534 010146 MOV R1,-(SP) 002536 010246 MOV R2,-(SP) 002540 010346 MOV R3,-(SP) 002542 010446 MOV R4,-(SP) 002544 010567 MOV R5,DUMP 27 002550 010567 MOV R5,DUMP1 ; SAVE R5 FOR SOFT ERRORS 28 002554 016705 AGAIN2: MOV DUMP1,R5 ; INCASE OF SOFT ERROR 29 002560 012567 MOV (5)+,NARG ; GET # OF ARGS 30 002564 003677 BLE ERR10 ; IF UNREASONABLE, ERRORS 31 002566 026767 CMP NARG,TOPS 32 002574 003273 BGT ERR10 33 002576 112767 MOVB #40,INBUF ; PUT A SPACE AT START-O-THE BUFFER 34 002604 CALL READC ; AND GET SOME DATA. .IF B <> 002604 004567 JSR R5,READC .IFF JSR ,READC .ENDC 35 002610 000204 132.,INBUF+1 36 002614 016700 MOV NARG,R0 ; GET NUMBER OF ARGUMENTS 37 002620 005300 DEC R0 ; AND CALCULATE ADDRESS OF LAST USER ARGUMENT 38 002622 006300 ASL R0 39 002624 060500 ADD R5,R0 40 002626 010067 MOV R0,ADDR ; ADDR HAS ADDRESS OF LAST USER ARGUMENT 41 002632 005720 TST (0)+ 42 002634 010067 MOV R0,ADDR2 ; ADDR2 HAS RETURN ADDRESS 43 002640 012700 MOV #INBUF,R0 ; NOW WE ARE GONNA LOOK FOR DATA IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 10-2 READD - DECIMAL NUMERIC INPUT ROUTINE 44 002644 122027 LOOP44: CMPB (0)+,#CR ; END OF BUFFER?? 45 002650 001375 BNE LOOP44 ; IF NOT,TRY AGAIN. 46 002652 005300 DEC R0 ; R0 POINTS TO 47 002654 005300 INSERT: DEC R0 ; WE NOW LOOK FOR VALID DATA. 48 002656 020027 CMP R0,#INBUF ; MAKE SURE STILL IN BUFFER!!! 49 002662 002476 BLT WNUARG ; IF OUTSIDE, WRONG # ARGS 50 002664 121027 CMPB (0),#' ; A SPACE 51 002670 001771 BEQ INSERT 52 002672 121027 CMPB (0),#', ; A COMMA (SO WHAT?) 53 002676 001766 BEQ INSERT ; COMMAS MAKE THE USER HAPPY (WE TRY HARDER) 54 002700 121027 CMPB (0),#' ; A (SUGGESTED BY DON FRENCH) 55 002704 001763 BEQ INSERT 56 002706 121027 CMPB (0),#'0 ; IF AIN'T ONE OF THOSE, TIME TO GET SERIOUS. 57 002712 002500 BLT ILGL ; ILEGAL CHARACTER 58 002714 121027 CMPB (0),#'9 59 002720 003075 BGT ILGL 60 002722 005200 INC R0 ; TWEAK FOR NEXT ROUTINE 61 002724 005002 CLR R2 ; R2 WILL CONTAIN THE ANSWER 62 002726 012705 MOV #1,R5 ; THIS IS THE 'SHIFT' COUNTER 63 002732 124027 XLOOP: CMPB -(0),#'- ; NOW WE ARE IN THE NUMBER.. 64 002736 001433 BEQ EXMIN ; NORMAL EXIT (NOTE THAT - GIVES 0) 65 002740 121027 CMPB (0),#'+ ; MAKES USERS HAPPY TO USE PLUS SIGNS. 66 002744 001431 BEQ EX 67 002746 121027 CMPB (0),#' ; A SPACE IS OK 68 002752 001426 BEQ EX 69 002754 121027 CMPB (0),#', ; SO IS A COMMA, 70 002760 001423 BEQ EX 71 002762 121027 CMPB (0),#' ; SO IS A 72 002766 001420 BEQ EX 73 002770 121027 CMPB (0),#'0 ; MAKE SURE IS LEGAL CHAR. 74 002774 002447 BLT ILGL 75 002776 121027 CMPB (0),#'9 76 003002 003044 BGT ILGL 77 003004 111003 MOVB (0),R3 ; CHANGE ASCII TO BINARY 78 003006 042703 BIC #177760,R3 ; POOF. EES NOW BINARY 79 003012 070305 MUL R5,R3 ; 'SHIFT' IT 80 003014 060302 ADD R3,R2 ; AND ADD TO SUMMER 81 003016 103464 BCS ILGLN ; ILEGAL NUMBER (>32767) 82 003020 070527 MUL #10.,R5 ; TWEAK THE SHIFTER 83 003024 GOTO XLOOP ; AND WORK ON NEXT DIGIT. .IF DF XLOOP 000072 DIST=.-XLOOP .IF GE DIST ; A REVERSE 'GOTO' .IF LE 255.-DIST JMP XLOOP .IFF 003024 000742 BR XLOOP .ENDC .IFF ; A FORWARD 'GO TO' - WHICH IS ILLEGAL ILLEGAL FORWARD REFERENCE -- XLOOP .ENDC .IFF UNDEFINED LABEL IN GO TO ---- XLOOP .ENDC 84 003026 005402 EXMIN: NEG R2 ; HANDLE NEGATIVE NUMBERS. 85 003030 017701 EX: MOV @ADDR,R1 ; GET ADDRESS OF ADDRESS... 86 003034 042701 BIC #1,R1 ; ENSURE EVEN DST ADDRESS. IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 10-3 READD - DECIMAL NUMERIC INPUT ROUTINE 87 003040 010211 MOV R2,(1) ; SEND THE ANSWER TO THE USER. 88 003042 162767 SUB #2,ADDR ; AND TWEAK ARGUMENT POINTER 89 003050 005367 DEC NARG ; WE DONE YET??? 90 003054 001407 BEQ GOBACK ; IF 0, WE ARE DONE. 91 003056 GOTO INSERT ; ELSE GO PROCESS NEXT NUMBER. .IF DF INSERT 000202 DIST=.-INSERT .IF GE DIST ; A REVERSE 'GOTO' .IF LE 255.-DIST JMP INSERT .IFF 003056 000676 BR INSERT .ENDC .IFF ; A FORWARD 'GO TO' - WHICH IS ILLEGAL ILLEGAL FORWARD REFERENCE -- INSERT .ENDC .IFF UNDEFINED LABEL IN GO TO ---- INSERT .ENDC 92 93 ; ******************ERROR ROUTINES******************************* 94 95 003060 WNUARG: CALL WRITEC ; --READD-- .IF B <> 003060 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 96 003064 003625' EMSG10 97 003066 CALL WRITEC .IF B <> 003066 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 98 003072 002200' EMSG8 99 003074 GOBACK: RSTREG .IRP REG,<4,3,2,1,0> MOV (SP)+,R'REG .ENDR 003074 012604 MOV (SP)+,R4 003076 012603 MOV (SP)+,R3 003100 012602 MOV (SP)+,R2 003102 012601 MOV (SP)+,R1 003104 012600 MOV (SP)+,R0 100 003106 016705 MOV ADDR2,R5 ; RESTORE RETURN ADDRESS 101 003112 RETURN 003112 000205 RTS R5 102 003114 112767 ILGL: MOVB #40,INBUF ; PLACE A SPACE AT START OF BUFFER 103 003122 005200 INC R0 ; POINT R0 1 BEYOND THE OFFENDING CHARACTER 104 003124 112720 MOVB #'<,(0)+ ; PUT IN AN ARROW 105 003130 112720 MOVB #'-,(0)+ 106 003134 112720 MOVB #'-,(0)+ 107 003140 105010 CLRB (0) ; AND A NULL 108 003142 CALL WRITEC .IF B <> 003142 004567 JSR R5,WRITEC IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 10-4 READD - DECIMAL NUMERIC INPUT ROUTINE .IFF JSR ,WRITEC .ENDC 109 003146 003625' EMSG10 ; "READD" 110 003150 CALL WRITEC .IF B <> 003150 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 111 003154 002311' EMSG6 ; "ILLEGAL CHAR. RETYPE..." 112 003156 CALL WRITEC .IF B <> 003156 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 113 003162 001220' INBUF ; SHOW BAD CHARACTER 114 003164 NN: GOTO AGAIN2 ; TRY AGAIN. .IF DF AGAIN2 000410 DIST=.-AGAIN2 .IF GE DIST ; A REVERSE 'GOTO' .IF LE 255.-DIST 003164 000167 JMP AGAIN2 .IFF BR AGAIN2 .ENDC .IFF ; A FORWARD 'GO TO' - WHICH IS ILLEGAL ILLEGAL FORWARD REFERENCE -- AGAIN2 .ENDC .IFF UNDEFINED LABEL IN GO TO ---- AGAIN2 .ENDC 115 003170 ILGLN: CALL WRITEC .IF B <> 003170 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 116 003174 003625' EMSG10 ; "READD" 117 003176 CALL WRITEC .IF B <> 003176 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 118 003202 002474' EMSG11 ; ILLEGAL NUMBER 119 003204 GOTO NN .IF DF NN 000020 DIST=.-NN .IF GE DIST ; A REVERSE 'GOTO' .IF LE 255.-DIST JMP NN .IFF 003204 000767 BR NN .ENDC .IFF ; A FORWARD 'GO TO' - WHICH IS ILLEGAL IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 10-5 READD - DECIMAL NUMERIC INPUT ROUTINE ILLEGAL FORWARD REFERENCE -- NN .ENDC .IFF UNDEFINED LABEL IN GO TO ---- NN .ENDC 120 121 122 123 124 IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 11 WRITED - DECIMAL NUMERIC OUTPUT ROUTINE 1 .SBTTL WRITED - DECIMAL NUMERIC OUTPUT ROUTINE 2 ; ************************************************* 3 ; * * 4 ; * WRITED * 5 ; * * 6 ; ************************************************* 7 ; CALLED FROM THE USER PROGRAM VIA THE CALL 8 ; JSR R5,WRITED 9 ; .WORD N,ARG1,ARG2,....ARGN 10 ; THIS ROUTINE DOES DECIMAL OUTPUT OF A WORD. NO ERRORS 11 ; ARE POSSIBLE, AND RESTRICTIONS ARE THE SAME AS WRITEC. 12 13 14 15 16 17 003206 WRITED:: ; ALGORITHM WRITTEN BY CRAIG SILVER 18 003206 SAVREG .IRP REG,<0,1,2,3,4> MOV R'REG,-(SP) .ENDR 003206 010046 MOV R0,-(SP) 003210 010146 MOV R1,-(SP) 003212 010246 MOV R2,-(SP) 003214 010346 MOV R3,-(SP) 003216 010446 MOV R4,-(SP) 003220 010567 MOV R5,DUMP 19 003224 012567 MOV (5)+,NARG ; GET NUMBER OF ARGUMENTS 20 003230 003522 BLE ERR2D ; AND CHECK FOR LEGALITY 21 003232 026767 CMP NARG,TOPS 22 003240 003116 BGT ERR2D 23 003242 012767 MOV #OBUF,OPOINT ; OPOINT POINTS TO OUTPUT BUFFER 24 003250 012503 LOOP1D: MOV (5)+,R3 ; GET DATA ADDRESS 25 003252 042703 BIC #1,R3 ; MAKE SURE ADDRESS IS EVEN 26 003256 011303 MOV (3),R3 ; AND GET THE DATA. 27 003260 012700 MOV #TBUF,R0 ; INIT TEMPORARY OUTPUT BUFFER POINTER 28 003264 020327 CMP R3,#-32768. ; AND CHECK FOR SPECIAL CASE 29 003270 001461 BEQ SPECL 30 003272 005703 TST R3 ; + OR - DATA ??? 31 003274 002004 BGE PLUS ; TO INSTALL PROPER SIGN 32 003276 112720 MOVB #'-,(0)+ ; SET - SIGN AND 33 003302 005403 NEG R3 ; MAKE DATA + AGAIN. 34 003304 000402 BR NEXTWD ; SKIP REST OF THIS STUFF 35 003306 112720 PLUS: MOVB #'+,(0)+ ; INSTALL + SIGN 36 003312 012704 NEXTWD: MOV #DVSRS,R4 ; SET DIVISOR TABLE POINTER 37 003316 012701 MOV #4,R1 ; LOOP COU 38 003322 005002 LOOPWD: CLR R2 ; NECESSARY FOR DIVIDE 39 003324 071224 DIV (4)+,R2 40 003326 110210 MOVB R2,(0) ; MOVE OUT RESULT TO OBUF 41 003330 152720 BISB #60,(0)+ ; AND CHANGE TO ASCII 42 003334 077106 SOB R1,LOOPWD ; REPEAT UNTILL R1=0 43 003336 110310 MOVB R3,(0) ; SEND OUT LAST DIGIT 44 003340 152720 BISB #60,(0)+ 45 003344 012700 SPECL1: MOV #TBUF,R0 ; RESET POINTER 46 .ENABL LSB 47 003350 012701 MOV #6,R1 ; LOOP COUNTER 48 003354 112077 1$: MOVB (0)+,@OPOINT ; SHOVEL DATA FROM TEMP TO OBUF IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 11-1 WRITED - DECIMAL NUMERIC OUTPUT ROUTINE 49 003360 005267 INC OPOINT 50 003364 077105 SOB R1,1$ 51 003366 112777 MOVB #' ,@OPOINT ; BLANK BETWEEN NUMBERS 52 003374 005267 INC OPOINT 53 003400 005367 DEC NARG ; DONE??? 54 003404 001321 BNE LOOP1D ; IF NOT, CONTINUE 55 003406 105077 CLRB @OPOINT ; ELSE SET NULL AT END OF BUFFER 56 003412 CALL WRITEC ; AND OUTPUT RESULTS .IF B <> 003412 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 57 003416 000362' OBUF 58 003420 RSTREG .IRP REG,<4,3,2,1,0> MOV (SP)+,R'REG .ENDR 003420 012604 MOV (SP)+,R4 003422 012603 MOV (SP)+,R3 003424 012602 MOV (SP)+,R2 003426 012601 MOV (SP)+,R1 003430 012600 MOV (SP)+,R0 59 003432 RETURN 003432 000205 RTS R5 60 003434 SPECL: .IRPC CHAR$,<-32768> ; SPECIAL CASE 61 MOVB #''CHAR$,(0)+ 62 .ENDR 003434 112720 MOVB #'-,(0)+ 003440 112720 MOVB #'3,(0)+ 003444 112720 MOVB #'2,(0)+ 003450 112720 MOVB #'7,(0)+ 003454 112720 MOVB #'6,(0)+ 003460 112720 MOVB #'8,(0)+ 63 003464 GOTO SPECL1 .IF DF SPECL1 000120 DIST=.-SPECL1 .IF GE DIST ; A REVERSE 'GOTO' .IF LE 255.-DIST JMP SPECL1 .IFF 003464 000727 BR SPECL1 .ENDC .IFF ; A FORWARD 'GO TO' - WHICH IS ILLEGAL ILLEGAL FORWARD REFERENCE -- SPECL1 .ENDC .IFF UNDEFINED LABEL IN GO TO ---- SPECL1 .ENDC 64 003466 023420 DVSRS: 10000.,1000.,100.,10. 65 003476 ERR2D: FATAL EMSG2D ; FATAL ERROR .ENABL LSB 003476 016767 MOV DUMP,1$ ; SAVE USER PC 003504 CALL WRITEC .IF B <> 003504 004567 JSR R5,WRITEC .IFF IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 11-2 WRITED - DECIMAL NUMERIC OUTPUT ROUTINE JSR ,WRITEC .ENDC 003510 003610' EMSG2D 003512 CALL WRITEC .IF B <> 003512 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 003516 000316' MSG 003520 CALL WRITEO .IF B <> 003520 004567 JSR R5,WRITEO .IFF JSR ,WRITEO .ENDC 003524 000001 1,1$ ; AND WRITE OUT HIS PC 003530 CALL WRITEC .IF B <> 003530 004567 JSR R5,WRITEC .IFF JSR ,WRITEC .ENDC 003534 000000' HDRMSG ; WRITE OUT REGISTER HEADER .IRP N,<10,6,4,2,0> ; UNLOAD STACK MOV (SP)+,INBUF+N .ENDR 003536 012667 MOV (SP)+,INBUF+10 003542 012667 MOV (SP)+,INBUF+6 003546 012667 MOV (SP)+,INBUF+4 003552 012667 MOV (SP)+,INBUF+2 003556 012667 MOV (SP)+,INBUF+0 003562 CALL WRITEO ; AND PRINT OUT USERS REG AT TIME OF CRASH. .IF B <> 003562 004567 JSR R5,WRITEO .IFF JSR ,WRITEO .ENDC 003566 000005 5 .IRP N <0,2,4,6,10> .WORD INBUF+N .ENDR 003570 001220' .WORD INBUF+0 003572 001222' .WORD INBUF+2 003574 001224' .WORD INBUF+4 003576 001226' .WORD INBUF+6 003600 001230' .WORD INBUF+10 003602 .EXIT 003602 104350 EMT ^O350 003604 000000 1$: 0 .DSABL LSB 66 003606 000000 OPOINT: 0 ; TEMPORARY STORAGE FOR WRITED 67 003610 015 EMSG2D: .ASCIZ /--WRITED--/ 68 003625 015 EMSG10: .ASCIZ /--READD--/ B 69 003642 .blkw 20. ; work area for odt 70 000001 .END IOX MACRO V05.00 Friday 14-Oct-83 19:32 Page 11-3 Symbol table ADDR 002360R ERR5 002100R MULT 001216R ADDR2 002362R EX 003030R NARG 000612R AGAIN 001556R EXI9 000156R NEXTWD 003312R AGAIN2 002554R EXI99 000150R NEXT1 000774R AGN 002114R EXMIN 003026R NEXT3 001712R CR = 000015 EXO 002062R NEXT4 001730R CRLF 000046R EXO1 002026R NEXT44 001722R DATA 000610R EXO3 002022R NN 003164R DIST = 000120 GOBACK 003074R OBUF 000362R DUMP 000602R HDRMSG 000000R OPOINT 003606R DUMP1 002356R ILGL 003114R PLUS 003306R DVSRS 003466R ILGLN 003170R P1134 = 000001 EIS = 000001 INBUF 001220R READC 000064RG EMSG1 000302R INSERT 002654R READD 002532RG EMSG10 003625R LF = 000012 READO 001534RG EMSG11 002474R LOOP 000604R RESTO 001054R EMSG2 001200R LOOPWD 003322R RESTO3 002042R EMSG2D 003610R LOOP0 000110R SPECL 003434R EMSG6 002311R LOOP1 000664R SPECL1 003344R EMSG7 002243R LOOP1D 003250R TBUF 000614R EMSG8 002200R LOOP2 000724R TOPS 000044RG EMSG9 002166R LOOP3 000770R WNUARG 003060R ENDO1 001652R LOOP4 001642R WRITEC 000050RG ERR1 000172R LOOP44 002644R WRITED 003206RG ERR10 002364R LOOP5 001674R WRITEO 000624RG ERR2 001070R LOOP9 000134R W1 000642R ERR2D 003476R MASK 000606R XLOOP 002732R ERR3 001424R MSG 000316R XM = 000001 ERR4 002122R . ABS. 000000 000 (RW,I,GBL,ABS,OVR) 003712 001 (RW,I,LCL,REL,CON) Errors detected: 1 *** Assembler statistics Work file reads: 0 Work file writes: 0 Size of work file: 8924 Words ( 35 Pages) Size of core pool: 17408 Words ( 68 Pages) Operating system: RT-11 (Under RSTS/E) Elapsed time: 00:00:31.57 _SY:[1,201]IOX,_SY:[1,201]IOX=:IOX