.TITLE MASTRM ;MASTERMIND GAME .IDENT 'V001A' ; ; PROGRAM TO PLAY A GAME OF MASTERMIND. ; ; LINKS TO SGAS: ; (4K) RO LIBRARY: SYSRES -- FOR FCS ROUTINES ; ; TASK ATTRIBUTES: /AB /CP /DS /FP /FX /HD /MU /-PI /-PR /-TA /-TR ; ; LUN ASSIGNMENTS: ; MO:1 (MESSAGE OUTPUT) ; TI:2 (INPUT) ; TI:3 (OUTPUT) ; ; TASKNAME: MASTRM ; PARTITION: GEN ; POOL LIMIT: 40 ; PRIORITY: 30 ; STACK: 256 ; UIC: [221,44] ; UNITS: 3 ; ; MACRO CALLS: ; RSXMAC: .MCALL GTIM$S,EXIT$S .MCALL FSRSZ$,FDBDF$,FDAT$A,FDRC$A,FDOP$A,FDBF$A,NMBLK$ .MCALL FINIT$,OPEN$W,CLOSE$,PUT$ .MCALL GCMLB$,GCML$ ; MITMAC: .MCALL FDBERR ; ; FLOATING-POINT REGISTER DEFINITIONS: ; F0 = %0 F1 = %1 ; ; OTHER DEFINITIONS: ; EOT = 4 ;ASCII EOT CHARACTER OUTEF = 1 ;OUTPUT FILE I/O EVENT FLAG CMILUN = 2 ;INPUT LUN OUTLUN = 3 ;OUTPUT LUN NTITS = 26. ;NO. OF LINES OF TITLES PEGMIN = 2 ;MINIMUM ALLOWED NO. OF PEGS PEGMAX = 6 ;MAXIMUM ALLOWED NO. OF PEGS COLMIN = 1 ;MINIMUM ALLOWED NO. OF COLORS COLMAX = 9. ;MAXIMUM ALLOWED NO. OF COLORS NEST = 1 ;MAXIMUM COMMAND NEST DEPTH LINLEN = 72. ;LENGTH OF OUTPUT LINE INLLEN = 81. ;INPUT LINE LENGTH + 1 NBUF = 1 ;NO. OF OUTPUT BUFFERS ; ; READ/WRITE DATA AREA: ; .PSECT MASRW,D ; SAVESP: .WORD 0 ;INITIAL STACK POINT LINECT: .WORD 0 ;COUNT OF TRIALS ATTEMPTED NPEGS: .WORD 0 ;NO. OF PEGS NCOLOR: .WORD 0 ;NO. OF COLORS CODE: .BLKW PEGMAX ;CODE TO BE GUESSED TRIAL: .BLKW PEGMAX ;TRIAL CODE DONE: .BLKW PEGMAX ;TRIAL (LOW BYTE) & CODE (HIGH BYTE) ;POSITIONS ALREADY DONE I1: .WORD 0 ;RANDOM NO. WORD 1 I2: .WORD 0 ;RANDOM NO. WORD 2 X: .WORD 0,0 ;RANDOM NO. RESULT ; ; OUTPUT FILE FDB: ; OUTFDB: FDBDF$ FDAT$A R.VAR,FD.CR ;VARIABLE RECORDS WITH CARRIAGE CTL FDRC$A FD.PLC,LINEBF,LINLEN;LOCATE MODE; BUFFER ADDR., LENGTH FDOP$A OUTLUN,,OUTDFN ;OUTPUT LUN; DEFAULT FILENAME BLOCK FDBF$A OUTEF,,NBUF ;OUTPUT EVENT FLAG & NO. OF BUFFERS ; ; GET COMMAND LINE BLOCK: ; GCLBLK: GCMLB$ NEST,MAS,,CMILUN;NEST LEVEL, PROMPT, LUN ; ; OUTPUT LINE BUFFER: ; LINEBF: .BLKB LINLEN ;LENGTH "LINLEN" ; ; INPUT LINE BUFFER (ALSO STORAGE FOR TIME DATA): ; TIMBLK: INLINE: .BLKB INLLEN ;LENGTH "INLLEN" ; ; READ-ONLY DATA AREA: ; .PSECT MASRD,RO,D ; ; SUBROUTINE "RAN" ARGUMENT LIST: ; RANARG: .WORD 3 ;3 ARGUMENTS .WORD I1 ;RANDOM NO. 1 .WORD I2 ;RANDOM NO. 2 .WORD X ;RESULTING RANDOM NO. ; ; OUTPUT FILE DEFAULT FILE NAME BLOCK: ; OUTDFN: NMBLK$ MASOUT,LST ;MASOUT.LST ; ; STRINGS: ; COLORS: .ASCII 'NONE ' .ASCII 'WHITE ' .ASCII 'RED ' .ASCII 'ORANGE' .ASCII 'YELLOW' .ASCII 'GREEN ' .ASCII 'BLUE ' .ASCII 'INDIGO' .ASCII 'VIOLET' .ASCII 'PINK ' ; TITF: .ASCIZ '*** MASTERMIND GAME ***' .ASCIZ ' ' .ASCIZ 'IN THIS GAME, A HIDDEN CODE MADE UP OF COLORED PEGS' .ASCIZ 'IN ANY COMBINATION IS CHOSEN BY THE COMPUTER. THE' .ASCIZ 'OBJECT IS TO BREAK THE CODE USING THE INFORMATION GIVEN' .ASCII 'BY THE COMPUTER IN RESPONSE TO GUESSES MADE BY THE ' .ASCIZ 'PLAYER.' .ASCIZ ' ' .ASCIZ 'FIRST, THE PLAYER ENTERS THE NUMBER OF PEGS OUT OF' .ASCIZ 'WHICH THE CODE WILL BE MADE, AND THE NUMBER OF COLORS' .ASCIZ 'OF PEGS AVAILABLE; A VACANT PEG POSITION FORMS AN' .ASCIZ 'ADDITIONAL POSSIBILITY, WHICH MAY BE THOUGHT OF AS AN' .ASCIZ 'EXTRA COLOR. THE PLAYER MUST THEN TRY TO DUPLICATE THE' .ASCII 'EXACT COLORS AND POSITIONS OF THE SECRET CODE BY ' .ASCIZ 'ENTERING' .ASCII 'A LINE OF COLORS, SEPARATED BY COMMAS, WHICH IS HIS ' .ASCIZ 'GUESS.' .ASCII 'NAMES OF COLORS MAY BE SPELLED OUT IN FULL OR ' .ASCIZ 'ABBREVIATED' .ASCIZ 'TO THE FIRST LETTER. THE COMPUTER RESPONDS BY PRINTING' .ASCIZ "THE PLAYER'S GUESS FOLLOWED BY A LIST OF KEY PEGS WHICH" .ASCIZ 'MAY BE "WHT" OR "BLK". EACH "BLK" KEY PEG MEANS A CODE' .ASCII 'PEG IN THE TRIAL IS THE SAME COLOR AND IN EXACTLY THE ' .ASCIZ 'SAME' .ASCII 'POSITION AS ONE OF THE SECRET CODE PEGS. EACH "WHT" ' .ASCIZ 'KEY PEG' .ASCIZ 'MEANS A HIDDEN CODE PEG IS MATCHED IN COLOR BUT NOT' .ASCIZ 'POSITION BY A PEG IN THE TRIAL. NO KEY PEG IS GIVEN' .ASCIZ 'FOR EVERY TRIAL CODE PEG THAT IS INCORRECT.' .ASCIZ ' ' .ASCIZ 'THE GAME IS ENDED WHEN THE PLAYER ENTERS THE CORRECT' .ASCIZ 'CODE, OR TYPES CONTROL-Z (MEANING "I GIVE UP").' HMPF: .ASCIZ 'HOW MANY PEGS TO MAKE THE CODE (BETWEEN 2 AND 6)?' .ASCIZ 'YOUR ANSWER MUST BE BETWEEN 2 AND 6!' HMCF: .ASCIZ 'HOW MANY DIFFERENT COLORS OF PEGS (BETWEEN 1 AND 9)?' .ASCIZ 'YOUR ANSWER MUST BE BETWEEN 1 AND 9!' COLF: .ASCIZ 'ENTER GUESSES USING COLORS: ' BADF: .ASCIZ 'NOT A VALID COLOR THERE, TRY AGAIN' NEPF: .ASCIZ "YOU DIDN'T TYPE ENOUGH PEGS: YOU MUST GIVE " BLKF: .ASCIZ ' BLK' WHTF: .ASCIZ ' WHT' DONF: .ASCIZ 'CONGRATULATIONS, YOU GUESSED IT!' ACTF: .ASCIZ 'GIVING UP? THE CODE WAS:' ; ; DEFINE FCS STORAGE AREA: ; FSRSZ$ 2,512.* ;TWO FILES (INPUT & OUTPUT) ; ; READ-ONLY INSTRUCTION AREA: ; .PSECT MASRO,RO ; MASTRM::SETI ;SET 1 WORD INTEGER MODE SETF ;SET SINGLE PRECISION FLTG. PT. MOV SP,SAVESP ;SAVE STACK POINT FINIT$ ;INITIALIZE FCS MOV #TIMBLK,R0 ;ADDRESS OF TIME DATA BLOCK GTIM$S R0 ;GET TIME OF DAY MOV G.TICT(R0),R3 ;CLOCK TICKS... MUL G.TISC(R0),R3 ;...TIMES SECONDS BIC #176000,R3 ;TAKE LOW ORDER PART INC R3 ;MAKE NON-ZERO 1$: JSR PC,RANDNO ;GET A RANDOM NO. SOB R3,1$ ;REPEAT A FEW TIMES OPEN$W #OUTFDB ;OPEN OUTPUT FILE FDBERR ,XIT ;QUIT IF CAN'T MOV F.NRBD+2(R0),R0 ;GET LINE ADDRESS CLR LINECT ;CLEAR COUNT OF TRIALS MADE MOV #TITF,R5 ;ADDR. OF TITLES MOV #NTITS,R4 ;NO. OF TITLE LINES 2$: JSR PC,MOVE ;MOVE TITLE TO BUFFER JSR PC,PUT ;WRITE IT OUT SOB R4,2$ ;DO ALL TITLES JSR PC,PUT ;BLANK LINE 3$: MOV #HMPF,R5 ;ADDR. OF HOW MANY PEGS MESSAGE JSR PC,MOVE ;MOVE IT TO LINE JSR PC,PUT ;WRITE IT OUT JSR PC,GETNUM ;GET NUMBER OF PEGS CMP R1,#PEGMIN ;TOO FEW? BLT 4$ ;YES, UNACCEPTABLE CMP R1,#PEGMAX ;TOO MANY? BLE 5$ ;NO, OK 4$: JSR PC,MOVE ;MOVE BAD NO. MESSAGE TO LINE JSR PC,PUT ;WRITE IT OUT BR 3$ ;TRY AGAIN 5$: MOV R1,NPEGS ;SET NO. OF PEGS 6$: MOV #HMCF,R5 ;HOW MANY COLORS MESSAGE JSR PC,MOVE ;MOVE IT TO LINE JSR PC,PUT ;WRITE LINE JSR PC,GETNUM ;GET NUMBER OF COLORS CMP R1,#COLMIN ;TOO FEW? BLT 7$ ;YES, COMPLAIN CMP R1,#COLMAX ;TOO MANY? BLE PRTCOL ;NO, OK 7$: JSR PC,MOVE ;MOVE BAD NO. MESSAGE TO LINE JSR PC,PUT ;WRITE IT OUT BR 6$ ;TRY AGAIN PRTCOL: MOV R1,NCOLOR ;SET NO. OF COLORS MOV #COLF,R5 ;AVAILABLE COLORS MESSAGE JSR PC,MOVE ;MOVE IT TO LINE JSR PC,PUT ;WRITE LINE MOV NCOLOR,R1 ;NO. OF COLORS INC R1 ;ADD ONE (INCLUDE "NONE") MOV #COLORS,R2 ;ADDRESS OF FIRST COLOR 1$: MOV #6,R3 ;NO. OF LETTERS IN COLOR 2$: MOVB (R2)+,(R0)+ ;COPY COLOR TO LINE SOB R3,2$ ;ALL LETTERS MOVB #' ,(R0)+ ;DELIMIT BY BLANK SOB R1,1$ ;DO ALL COLORS JSR PC,PUT ;WRITE OUT LINE MOV NPEGS,R2 ;GET NO. OF PEGS MOV #CODE,R3 ;ADDRESS OF CODE ARRAY 3$: MOV NCOLOR,R1 ;GET NO. OF COLORS JSR PC,RANDNO ;GET RANDOM NO. BETWEEN 0 AND NO. COLORS MOV R1,(R3)+ ;RESULT IS NEXT CODE PEG SOB R2,3$ ;DO ALL PEGS NEWTRY: INC LINECT ;COUNT ANOTHER TRIAL ASKTRY: MOV R0,-(SP) ;SAVE OUTPUT LINE ADDRESS 1$: GCML$ #GCLBLK ;GET LINE OF TRIAL PEG COLORS BCC 3$ ;WORKED! CMPB G.ERR(R0),#GE.EOF;CONTROL-Z TYPED? BNE 2$ ;NO JMP QUIT ;YES, QUIT GAME 2$: JSR PC,GCLERR ;PRINT ERROR MESSAGE BR 1$ ;TRY AGAIN 3$: MOV G.CMLD(R0),R1 ;GET LENGTH OF LINE BEQ 1$ ;ZERO, IGNORE IT MOV G.CMLD+2(R0),R0 ;GET ADDRESS OF LINE MOV #INLINE,R2 ;ADDR. OF INPUT LINE BUFFER 4$: MOVB (R0)+,(R2) ;COPY CHARACTER TO BUFFER BEQ 5$ ;IF NULL, IGNORE IT CMPB (R2),#' ;IS IT A BLANK? BEQ 5$ ;YES, IGNORE IT TOO INC R2 ;NO, ADVANCE TO NEXT 5$: SOB R1,4$ ;DO WHOLE LINE MOVB #';,(R2)+ ;PUT IN SEMICOLON AS TERMINATOR MOV NPEGS,R5 ;NO. OF PEGS MOV #INLINE,R0 ;START OF INPUT LINE MOV #TRIAL,R4 ;ADDR. OF TRIAL PEG ARRAY SCAN: CMPB (R0),#'A ;A OR BIGGER? BLO 1$ ;NO CMPB (R0),#'Z ;Z OR SMALLER? BLOS 2$ ;YES, FOUND A COLOR 1$: CMPB (R0),#'; ;REACHED END OF LINE? BEQ 8$ ;YES, NOT ENOUGH PEGS INC R0 ;NO, SKIP PAST CHARACTER BR SCAN ;KEEP LOOKING 2$: MOV R0,R1 ;R0 POINTS TO START OF COLOR 3$: CMPB (R1),#'A ;A OR BIGGER? BLO 4$ ;NO, FOUND LAST LETTER OF COLOR CMPB (R1),#'Z ;Z OR SMALLER? BHI 4$ ;NO, FOUND END OF COLOR INC R1 ;YES, GO TO NEXT LETTER BR 3$ ;KEEP LOOKING FOR END 4$: MOV R1,-(SP) ;SAVE END OF COLOR ADDRESS SUB R0,R1 ;LENGTH OF COLOR TYPED CMP R1,#6 ;LONGER THAN 6 LETTERS? BLE 5$ ;NO MOV #6,R1 ;YES, ONLY LOOK AT FIRST 6 5$: MOV #COLORS,R3 ;START OF COLOR TABLE CLR R2 ;COLOR COUNT MOV R0,-(SP) ;SAVE START OF COLOR ENTERED MOV R1,-(SP) ;ALSO LENGTH MOV R3,-(SP) ;ALSO START OF COLOR IN TABLE 6$: CMPB (R0)+,(R3)+ ;COMPARE COLOR WITH TABLE ENTRY BEQ 7$ ;MATCHES ADD #6,(SP) ;NO MATCH, GO TO NEXT COLOR IN TABLE MOV (SP),R3 ;RESTORE TABLE ADDRESS MOV 2(SP),R1 ;RESTORE LENGTH MOV 4(SP),R0 ;RESTORE ADDRESS INC R2 ;COUNT COLOR CMP R2,NCOLOR ;TRIED THEM ALL? BLE 6$ ;NO, KEEP TRYING ADD #8.,SP ;YES, CLEAN STACK MOV (SP)+,R0 ;RESTORE OUTPUT LINE ADDRESS MOV #BADF,R5 ;BAD COLOR MESSAGE JSR PC,MOVE ;MOVE IT TO LINE BR 9$ 7$: SOB R1,6$ ;COMPARE ALL LETTERS ADD #6,SP ;CLEAN STACK MOV R2,(R4)+ ;PUT COLOR CODE INTO TRIAL ARRAY MOV (SP)+,R0 ;GET END OF COLOR ADDRESS SOB R5,SCAN ;SCAN UNTIL ALL PEGS READ MOV (SP)+,R0 ;RESTORE OUTPUT LINE ADDRESS BR WRTOUT 8$: MOV (SP)+,R0 ;RESTORE OUTPUT LINE ADDRESS MOV #NEPF,R5 ;NOT ENOUGH PEGS MESSAGE JSR PC,MOVE ;MOVE IT TO LINE MOV NPEGS,R1 ;GET ACTUAL NO. OF PEGS IN CODE CLR R2 ;FLAG: SUPPRESS LEADING ZEROES JSR PC,$CBDMG ;CONVERT IT TO ASCII 9$: JSR PC,PUT ;WRITE OUT LINE BR ASKTRY ;ASK AGAIN WRTOUT: MOV LINECT,R1 ;GET TRIAL NUMBER CLR R2 ;FLAG: SUPPRESS LEADING ZEROES JSR PC,$CBDMG ;CONVERT IT TO ASCII MOV NPEGS,R1 ;GET NO. OF PEGS IN CODE MOV #TRIAL,R2 ;ADDRESS OF TRIAL CODE MOV #DONE,R5 ;ADDRESS OF PEGS DONE FLAGS 1$: MOV (R2)+,R3 ;GET TRIAL PEG COLOR CODE CLR (R5)+ ;CLEAR PEG DONE FLAG MOV #6,R4 ;NO. OF LETTERS IN COLOR MUL R4,R3 ;TIMES COLOR CODE... ADD #COLORS,R3 ;...PLUS START OF COLORS MOVB #' ,(R0)+ ;INSERT A BLANK 2$: MOVB (R3)+,(R0)+ ;COPY COLOR TO LINE SOB R4,2$ ;(ALL LETTERS) SOB R1,1$ ;REPEAT FOR ALL TRIAL PEGS MOVB #'=,(R0)+ ;INSERT SEPARATOR CLR R3 ;COUNT OF CORRECT PEGS MOV NPEGS,R4 ;NO. OF PEGS IN CODE 3$: MOV NPEGS,R1 ;NO. OF PEGS... DEC R1 ;...MINUS ONE JSR PC,RANDNO ;PICK A RANDOM PEG ASL R1 ;CONVERT PEG NO. TO WORD INDEX TSTB DONE(R1) ;WAS THIS ONE DONE ALREADY? BNE 3$ ;YES, TRY ANOTHER INCB DONE(R1) ;NO, BUT SET DONE CMP TRIAL(R1),CODE(R1);DID PLAYER GUESS RIGHT? BNE 4$ ;NO INC R3 ;YES, COUNT A CORRECT PEG MOV #BLKF,R5 ;"BLK" KEY PEG BR 6$ 4$: CLR R2 ;TRIAL PEG NUMBER MOV NPEGS,R5 ;NO. OF PEGS 5$: CMP TRIAL(R1),CODE(R2);IS TRIAL PEG SAME COLOR AS CODE PEG? BNE 7$ ;NO CMP CODE(R2),TRIAL(R2);YES, BUT IS THIS CODE MATCHED ALREADY? BEQ 7$ ;YES TSTB DONE+1(R2) ;NO: DID WE GIVE WHT FOR THIS ALREADY? BNE 7$ ;YES INCB DONE+1(R2) ;NO, BUT DO SO NOW MOV #WHTF,R5 ;"WHT" KEY PEG 6$: JSR PC,MOVE ;MOVE KEY PEG TO LINE BR 8$ 7$: TST (R2)+ ;GO TO NEXT TRIAL PEG SOB R5,5$ ;SEARCH ALL OF THEM 8$: SOB R4,3$ ;LOOP OVER ALL CODE PEGS JSR PC,PUT ;WRITE OUT LINE CMP R3,NPEGS ;ARE ALL PEGS CORRECT? BEQ 9$ ;YES JMP NEWTRY ;NO, GET MORE GUESSES 9$: MOV #DONF,R5 ;GAME DONE MESSAGE JSR PC,MOVE ;MOVE IT TO LINE JSR PC,PUT ;WRITE LINE BR LEAVE ;TERMINATE QUIT: MOV (SP)+,R0 ;RESTORE OUTPUT LINE ADDRESS MOV #ACTF,R5 ;ACTUAL CODE MESSAGE JSR PC,MOVE ;MOVE IT TO LINE JSR PC,PUT ;WRITE OUT LINE MOV NPEGS,R1 ;GET NO. OF PEGS MOV #CODE,R2 ;START OF CODE 1$: MOV (R2)+,R3 ;GET NEXT PEG COLOR CODE MOV #6,R4 ;NO. OF LETTERS IN COLOR MUL R4,R3 ;TIMES COLOR CODE... ADD #COLORS,R3 ;...PLUS START OF COLORS MOVB #' ,(R0)+ ;INSERT A BLANK 2$: MOVB (R3)+,(R0)+ ;COPY COLOR TO LINE SOB R4,2$ ;(ALL LETTERS) SOB R1,1$ ;DO ALL PEGS JSR PC,PUT ;WRITE LINE LEAVE: CLOSE$ #OUTFDB ;CLOSE OUTPUT FILE FDBERR ;ERROR CHECK XIT: EXIT$S ;THE END ; ; SUBROUTINES FOR MASTERMIND PROGRAM: ; ; SUBROUTINE RANDNO -- GET RANDOM INTEGER BETWEEN 0 AND GIVEN NUMBER ; ENTERED WITH R1=TOP OF SELECTION RANGE ; RETURNS WITH R1=RANDOM INTEGER BETWEEN 0 AND INITIAL R1 INCLUSIVE ; NOTE: FLOATING REGISTERS F0 AND F1 ARE ALTERED BY THIS ROUTINE ; RANDNO: MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) STFPS -(SP) ;SAVE FPP STATUS MOV #RANARG,R5 ;ADDRESS OF RANDOM NO. SUBR ARGUMENTS JSR PC,RANDU ;CALL F4+ RANDOM NO. GENERATOR LDFPS (SP)+ ;RESTORE FPP STATUS LDF X,F0 ;PUT RESULT INTO F0 MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 INC R1 ;MAXIMUM INTEGER PLUS ONE LDCIF R1,F1 ;CONVERT TO FLOATING MULF F0,F1 ;TIMES RANDOM NO. IN [0.0,1.0) STCFI F1,R1 ;TRUNCATE TO INTEGER RTS PC ;RETURN ; ; SUBROUTINE PUT -- WRITE OUT CURRENT LINE & SET UP ANOTHER ; ENTERED WITH R0=ADDR. OF NEXT AVAILABLE CHARACTER IN LINE BUFFER ; RETURNS WITH R0=FIRST CHARACTER IN NEW LINE BUFFER ; ON ERROR, EXITS TO LABEL "LEAVE" IN MAIN PROGRAM ; PUT: MOV R4,-(SP) ;SAVE R4 MOV R0,R4 ;OUTPUT LINE ADDRESS (CURRENT) MOV #OUTFDB,R0 ;OUTPUT FDB ADDRESS SUB F.NRBD+2(R0),R4 ;SUBTRACT START OF LINE GIVING LENGTH PUT$ R0,,R4 ;WRITE OUT THE LINE FDBERR ,1$ ;ERROR CHECK MOV F.NRBD+2(R0),R0 ;GET NEW LINE ADDRESS MOV (SP)+,R4 ;RESTORE R4 RTS PC ;RETURN 1$: MOV SAVESP,SP ;SET STACK TO INITIAL PLACE BR LEAVE ;LEAVE PREMATURELY ; ; SUBROUTINE GETNUM -- GET A NUMBER FROM KEYBOARD ; RETURNS WITH NUMBER IN R1 ; GETNUM: MOV R0,-(SP) ;SAVE REGISTERS MOV R2,-(SP) 1$: GCML$ #GCLBLK ;GET A "COMMAND" LINE BCC 2$ ;WORKED CMPB G.ERR(R0),#GE.EOF;CONTROL-Z TYPED? BEQ 3$ ;YES, LEAVE QUICKLY JSR PC,GCLERR ;NO, TELL PEOPLE WHAT HAPPENED BR 1$ ;TRY AGAIN 2$: MOV G.CMLD+2(R0),R0 ;GET ADDRESS OF COMMAND JSR PC,$CDTB ;CONVERT DECIMAL ASCII TO BINARY NO. MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R0 RTS PC ;RETURN 3$: MOV SAVESP,SP ;RESTORE STACK POSITION BR LEAVE ;LEAVE PROGRAM ; .END MASTRM