.TITLE CRJOYD ;******************************************************** ; * ; FUNCTIONALLY TESTS THE ID-2000 CURSOR AND JOYSTICK * ; OPTIONS. SEE INDIVIDUAL TEST FOR A MORE DETAILED * ; EXPLANATION: * ; * ; 1. HARDWARE CURSOR * ; * ; A. TESTS ALL X&Y COORDINATE VALUES * ; B. TESTS ALL CURSOR FORMS * ; C. DISPLAYS EXPECTED & RECEIVED RESULTS * ; WHEN AN ERROR IS DETECTED. * ; * ; 2. JOYSTICK INTERFACE TEST * ; * ; A. DISPLAYS JOYSTICK COORDINATES * ; DYNAMICALLY FOR VISUAL INSPECTION * ; B. LEFT TO RIGHT ON SCREEN: * ; STATUS REG,AREG,BREG,XREG & YREG (8) * ; * ; 3. JOYSTICK POSITION TEST * ; * ; TRANSCRIBES JOYSTICK POSITION COORDINATES * ; DIRECTLY TO CURSOR #1. * ; * ; 4. JOYSTICK INTERRUPT TEST * ; * ; A. TESTS MANUAL(ENTER) AND AUTOMATIC * ; (TRACK) INTERRUPTS FROM JOYSTICK BOX * ; B. ERROR MESSAGES DISPLAYED * ; * ; * ; RUN PARAMETERS: * ; * ; 1. TESTS MAY BE EXECUTED IN SEQUENCE BY * ; SPECIFICATION OF ZERO FOR THE SELECTED * ; TEST OR REPEATEDLY BY SUPPLYING THE * ; DESIRED TEST #. * ; * ; 2. A CARRIAGE RETURN WILL TERMINATE THE * ; EXECUTION OF A REPEATING TEST OR * ; SEQUENCE,THEREBY PERMITTING NEW TEST * ; SELECTION. * ; * ; 3. SELECTION OF A TEST NUMBER > 4 * ; CAUSES THE AVAILABLE TESTS TO BE LISTED * ; ON THE CONSOLE TERMINAL. * ; * ; * ; PROGRAMMER: JOHN FRANZ * ; MODIFICATIONS BY: KEN DINWIDDIE * ; * ; MODIFICATIONS FOR DMA ADDRESSES: NOVEMBER, 1978 * ; * ; * ;******************************************************** .PAGE .SBTTL EQUATES ; CONSOLE TERMINAL REGISTER DEFINITIONS: KEYCSR =177560 ;CONSOLE KEYBOARD CONTROL/STATUS REGISTER KEYDAT =177562 ;CONSOLE KEYBOARD DATA REGISTER PRCSR =177564 ;CONSOLE PRINTER CONTROL/STATUS/REGISTER PRDAT =177566 ;CONSOLE PRINTER DATA REGISTER ; ID-2000 SERIES REGISTER DEFINITIONS (DMA): XREG =166020 ;X REGISTER YREG =166022 ;Y REGISTER BPMR =166024 ;BIT PLANE MASK CSR =166026 ;CONTROL/STATUS DATREG =166030 ;DATA REGISTER ; CURSOR REGISTER DEFINITIONS (DMA): X1 =166032 ;CURSOR ONE X1 Y1 =166033 ;CURSOR ONE Y1 X2 =166034 ;CURSOR TWO X2 Y2 =166035 ;CURSOR TWO Y2 CSRCTL =166036 ;CURSOR CONTROL/STATUS JOYCTL =166037 ; JOYSTICK CONTROL/STATUS/COORDINATES ; CSRCTL BIT & FIELD ASSIGNMENTS FORM0 =0 ; BOX FORM1 =1 ; DASHED BOX FORM2 =2 ; TWO FULL SCREEN CROSSHAIRS FORM3 =3 ; TWO SINGLE ELEMENTS FORM4 =4 ; CROSSHAIR & ALPHA-NUMERIC FORM5 =5 ; TWO DASHED CROSSHAIRS FORM6 =6 ; TWO SOLID CROSSHAIRS FORM7 =7 ; SOLID CROSSHAIR & DASHED CROSSHAIR RATE =10 ; BLINK RATE ENABL1 =20 ; ENABLE CURSOR 1 ENABL2 =40 ; ENABLE CURSOR 2 BLINK1 =100 ; BLINK CURSOR 1 BLINK2 =200 ; BLINK CURSOR 2 ; DMA REGISTER DEFINITIONS DAWC =166040 ;WORD COUNT DABA =166042 ;BUS ADDRESS DACS =166044 ;COMMAND/STATUS DASC =166050 ;SHIFTER CONTROL .PAGE .SBTTL MACRO DEFINITIONS .MACRO CRLF ;ASCII CARRIAGE RETURN/LINE FEED .BYTE 15,12 .ENDM .MACRO CRLFLF ;ASCII CARRIAGE RETURN/2 LINE FEEDS .BYTE 15,12,12 .ENDM .MCALL .REGDEF .REGDEF .PAGE .SBTTL INTERRUPT VECTOR INITIALIZATION .ASECT . =234 .WORD VECTOR,340 ;INITIALIZE INTERRUPT VECTOR LOCATIONS .CSECT START: CLR @#KEYCSR CLR @#PRCSR ; DISABLE CONSOLE INTERRUPTS .IIF DF TTY BR TSTSEL ; SKIP TEST LIST FOR TELETYPE .PAGE .SBTTL CONSOLE KEYBOARD TEST SELECTION LSTINS: MOV #TSTDSC,R5 JSR PC,SHOTXT ; LIST INSTRUCTIONS FOR DIAGNOSTICS TSTSEL: MOV @#KEYDAT,R0 ; RESET KEYBOARD READY MOV #TSTREQ,R5 JSR PC,SHOTXT ; ISSUE TEST REQUEST PROMP CLR REPEAT ; RESET REPEAT FLAG CLR R1 ; INITIALIZE TEST NUMBER SYNTHESIS REGISTER GETCHR: JSR PC,TTYIN ; GET A CHARACTER (0-7 OR CR) BCS DOIT ; PROCESS THE SELECTED TEST IF CR CLC .REPT 3 ROL R1 ; ROTATE ONE OCTAL DIGIT .ENDR BIC #177770,R0 ; STRIP TO LS 3 BITS BIS R0,R1 ; OR WITH PREVIOUS DIGIT BR GETCHR ; AND GO FOR THE NEXT DIGIT DOIT: TST R1 ; ZERO? BEQ CSRTST ; START THROUGH THE WHOLE SEQUENCE IF SO CMP #4,R1 BMI LSTINS ; LIST INSTRUCTIONS IF > 4 DEC REPEAT ; SET REPEAT FLAG FOR INDIVIDUAL TEST ROL R1 ; CREATE TABLE OFFSET BIC #177761,R1 ; DELETE INVALID BITS JMP @TSTTBL(R1) ;GO EXECUTE SELECTED TEST REPEAT: .BLKW 1 ; FLAG TO REPEAT SPECIFIED TEST TSTTBL: .WORD 0 .WORD CSRTST ; START OF CURSOR TEST .WORD JOYTST ; START OF JOYSTICK INTERFACE TEST .WORD JOYPOS ; START OF JOYSTICK POSITION TEST .WORD JOYIRP ; START OF JOYSTICK INTERRUPT TEST .WORD TSTSEL,TSTSEL,TSTSEL ; TRY AGAIN FOR NON-EXISTANT TESTS .PAGE .SBTTL HARDWARE CURSOR GENERATOR TEST ;******************************************************* ; * ; THE PURPOSE OF THIS TEST IS TO TEST ALL THE CURSOR * ; FORMS & CONTROL IN THE FOLLOWING ORDER: * ; 1. START X1=0, Y1=255., X2=255., Y2=0 & BOX * ; IN PERIMETER OF SCREEN TO VIEW. * ; 2. START X1=0, Y1=128., X2=255., Y2=128. & * ; ROTATE CURSOR 1 & 2, X & Y COORDINATES * ; CLOCKWISE TILL ORIG VALUE REACHED. * ; (DO FOR ALL CURSOR FORMS) * ; 3. REPEAT STEP 2 WITH CURSOR 1 BLINKING, * ; CURSOR 2 BLINKING, BOTH BLINKING & BLINK * ; RATE ENABLED. CURSOR FORM 7 ONLY. * ; 4. A COMPARE IS MADE AFTER EACH X & Y * ; COORDINATE IS CHANGED & THE EXPECTED & * ; RECEIVED COORDINATES PRINTED OUT IF THEY DO * ; NOT COMPARE. * ; * ;******************************************************* ;***** THIS ROUTINE TESTS PERIMETER ALIGNMENT OF THE CURSORS ***** CSRTST: MOV #60,@#CSRCTL ; ENABLE CURSORS 1&2 AND SELECT FORM=0=BOX MOV #177400,@#X1SAV ; X1SAV=0, Y1SAV=255. MOV #177400,@#X1 ; X1=0,Y1=255. MOV #377,@#X2SAV ; X2SAV=255, Y2SAV=0 MOV #377,@#X2 ; X2=255., Y2=0 JSR PC,CMPXY ; GO TEST FOR VALID X & Y COORDINATES MOV #177777,@#COUNT ;INITIAL WAIT COUNT JSR PC,TIME ;DELAY 2 SECONDS JSR PC,TIME JSR PC,TIME BICB #ENABL2,@#CSRCTL ;TURN OFF CURSOR 2 JSR PC,TIME ;DELAY 2 SECONDS JSR PC,TIME JSR PC,TIME BICB #ENABL1,@#CSRCTL ;TURN OFF CURSOR 1 JSR PC,TIME ;DELAY 2 SECONDS JSR PC,TIME JSR PC,TIME BISB #ENABL1,@#CSRCTL ;TURN ON CURSOR 1 JSR PC,TIME ;DELAY 2 SECONDS JSR PC,TIME JSR PC,TIME BISB #ENABL2,@#CSRCTL ;TURN ON CURSOR 2 JSR PC,TIME ;DELAY 2 SECONDS JSR PC,TIME JSR PC,TIME MOV #6250.,@#COUNT ;SET DELAY = 62.5 MS. ;***** THIS ROUTINE TESTS ALL THE CURSOR FORMS & CONTROL ***** CSRB: MOV #100000,@#X1SAV ; INIT X1SAV=0, Y1SAV=128. MOV #100000,@#X1 ; INIT X1=0,Y1=128. MOV #100377,@#X2SAV ; INIT X2SAV=255., Y2SAV=128. MOV #100377,@#X2 ; INIT X2=255., Y2=128. CSR1: JSR PC,CMPXY ; GO TEST FOR VALID X & Y COORDINATES JSR PC,TIME ; DELAY 250. MS. CMPB #128.,@#X1SAV ; QUARTER POINT REACHED? BEQ CSR2 ; YES, BRANCH INCB @#X1SAV ; INCREMENT X1 & Y1 SAVE AREA INCB @#Y1SAV MOV @#X1SAV,@#X1 ;UPDATE X1 & Y1 COORDINATES BY 1 DECB @#X2SAV ; DECREMENT X2 & Y2 SAVE AREA DECB @#Y2SAV MOV @#X2SAV,@#X2 ;UPDATE X2 & Y2 COORDINATES BY 1 BR CSR1 ; LOOP TILL QUARTER POINT REACHED ; CSR2: INCB @#X1SAV ; INCREMENT X1 SAVE AREA DECB @#Y1SAV ; DECREMENT Y1 SAVE AREA MOV @#X1SAV,@#X1 ;UPDATE X1 & Y1 COORDINATES BY 1 DECB @#X2SAV ; DECREMENT X2 SAVE AREA INCB @#Y2SAV ; INCREMENT Y2 SAVE AREA MOV @#X2SAV,@#X2 ;UPDATE X2 & Y2 COORDINATES BY 1 JSR PC,CMPXY ; GO TEST FOR VALID X & Y COORDINATES JSR PC,TIME ; DELAY 250. MS. CMPB #255.,@#X1SAV ; HALF POINT REACHED? BNE CSR2 ; NO, LOOP ; CSR3: DECB @#X1SAV ;YES,DECREMENT X1 SAVE AREA DECB @#Y1SAV ; DECREMENT Y1 SAVE AREA MOV @#X1SAV,@#X1 ;UPDATE X1 & Y1 COORDINATES BY 1 INCB @#X2SAV ; INCREMENT X2 SAVE AREA INCB @#Y2SAV ; INCREMENT Y2 SAVE AREA MOV @#X2SAV,@#X2 ;UPDATE X2 & Y2 COORDINATES BY 1 JSR PC,CMPXY ; GO TEST FOR VALID X & Y COORDINATES JSR PC,TIME ; DELAY 250. MS. CMPB #128.,@#X1SAV ; THREE QUARTER POINT REACHED? BNE CSR3 ; NO, LOOP ; CSR4: DECB @#X1SAV ; YES, DECREMENT X1 SAVE AREA INCB @#Y1SAV ; INCREMENT Y1 SAVE AREA MOV @#X1SAV,@#X1 ;UPDATE X1 &Y1 COORDINATES BY 1 INCB @#X2SAV ; INCREMENT X2 SAVE AREA DECB @#Y2SAV ; DECREMENT Y2 SAVE AREA MOV @#X2SAV,@#X2 ;UPDATE X2 & Y2 COORDINATES BY 1 JSR PC,CMPXY ;GO TEST FOR VALID X&Y COORDINATES JSR PC,TIME ;DELAY 250. MS TSTB @#X1SAV ; BACK TO STARTING POINT? BNE CSR4 ; NO, LOOP ; MOVB @#CSRCTL,R0 ; YES, GET CURSOR CONTROL BYTE BIC #177770,R0 ; INSOLATE CURSOR FORM INTO REG 0 CMP #7,R0 ; FORM=7? BEQ CSR5 ; YES, BRANCH JSR PC,CHKEY ;GO CHECK FOR TERMINATING KEYSTROKE JMP CSR10 ;THIS INST. NEEDED TO RETURN PROPERLY CSR10: INCB @#CSRCTL ; NO, GET NEXT CURSOR FORM JMP CSRB ;LOOP TEST WITH NEW FORM CSR5: BITB #10,@#CSRCTL ; BLINK RATE ON? BNE CSR9 ;YES,BRANCH BITB #300,@#CSRCTL ; YES,ARE BLINK CURSORS 1/2 ON? BNE CSR6 ; YES, BRANCH BISB #BLINK1,@#CSRCTL ; NO, SET BLINK CURSOR 1 JMP CSRB ;LOOP TEST WITH CURSOR 1 BLINKING CSR6: BITB #BLINK1,@#CSRCTL ; BLINK CURSOR 1 ON? BNE CSR7 ; YES, BRANCH BISB #BLINK1,@#CSRCTL ; NO, SET BLINK CURSOR 1 ALSO JMP CSRB ; LOOP TEST WITH BOTH CURSORS BLINKING CSR7: BITB #BLINK2,@#CSRCTL ; BLINK CURSOR 2 ON? BNE CSR8 ; YES, BRANCH BICB #BLINK1,@#CSRCTL ; NO, CLEAR CURSOR 1 BISB #BLINK2,@#CSRCTL ; SET BLINK CURSOR 2 JMP CSRB ; LOOP TEST WITH CURSOR 2 BLINKING CSR8: BISB #RATE,@#CSRCTL ; SET BLINK RATE JMP CSRB ; LOOP TEST WITH BLINK RATE ENABLED CSR9: JSR PC,CHKEY ;GO CHECK FOR TEMINATING KEY STROKE JMP CSRTST ;GO START TEST OVER .PAGE .SBTTL JOYSTICK INTERFACE TEST ;********************************************* ; * ; THE PURPOSE OF THIS TEST IS TO * ; TEST THE JOYSTICK INTERFACE & DISPLAY * ; THE COORDINATES ON THE CONSOLE DEVICE * ; IN OCTAL AS FOLLOWS: * ; DISPLAYS 5 OCTAL GROUPS OF NUMBERS * ; TO RIGHT-STATUS REG,REGA,REGB,REGX * ; AND REGY * ; * ;********************************************* ;***** JOYSTICK INTERFACE TEST ***** JOYTST: MOVB #3,@#JOYSEL ; SET-SELECT JOYSTICK REGISTER MASK CLC ;CLEAR CARRY BISB #10,@#CSRCTL+1 ; INITIALIZE INTERFACE & JOYSTICK CLRB @#CSRCTL+1 ;CLEAR JOYSTICK CONTROL JOYT2: MOVB @#JOYSEL,@#CSRCTL+1 ; SELECT A JOYSTICK REGISTER MOVB @#CSRCTL+1,R4 ; READ JOYSTICK COORDINATE SWAB R4 ; MOVE COORDINATE TO HIGH BYTE JSR PC,SHONUM ; GO DISPLAY COORDINATE IN OCTAL INCB @#JOYSEL ; GET NEXT REGISTER SELECTION CMPB #10,@#JOYSEL ; LAST COORDINATE? BEQ .+4 ; YES, LOOP TILL ALL COORDINATES PROCESSED BR JOYT2 ; PROCESS NEXT COORDINATE MOV #15,@#PRDAT ; CARRIAGE RETURN JSR PC,PREADY ; WAIT FOR PRINTER READY MOV #12,@#PRDAT ; LINE FEED JSR PC,CHKEY ; GO CHECK FOR TERMINATING KEYSTROKE JMP JOYTST ; LOOP TEST .PAGE .SBTTL JOYSTICK POSITION TEST ; ENABLES BLINKING DASHED CROSSHAIR FOR CURSOR #1, THEN ; REPEATEDLY ACQUIRES JOYSTICK COORDINATES AND CONVEYS THEM DIRECTLY ; TO CURSOR #1. JOYPOS: MOV #JPTEXT,R5 JSR PC,SHOTXT ; IDENTIFY JOYSTICK POSITION TEST MOVB #125,@#CSRCTL ; ENABLE CURSOR #1 BLINKING DASHED CROSSHAIR JOYPS1: MOVB #6,@#JOYCTL ; SELECT JOYSTICK X COORDINATE MOVB @#JOYCTL,@#X1 ; PASS TO CURSOR #1 X MOVB #7,@#JOYCTL ; SELECT JOYSTICK Y COORDINATE MOVB @#JOYCTL,@#Y1 ; PASS TO CURSOR #1 Y JSR PC,CHKEY ; GO CHECK FOR TERMINATING KEYSTROKE JMP JOYPS1 ; CARRY ON UNTIL SAME .PAGE .SBTTL JOYSTICK INTERRUPT TEST ;**************************************************** ; * ; THE PURPOSE OF THIS TEST IS TO TEST THE * ; JOY STICK INTERRUPT FOR ENTER BOTH MANUAL AND * ; AUTOMATIC(TRACK). * ; ERROR MESSAGES ARE DISPLAYED FOR UNWANTED * ; OR UNDETECTED INTERRUPTS. * ; * ;**************************************************** ;***** JOY STICK INTERRUPT TEST ***** JOYIRP: MOV #JINTXT,R5 JSR PC,SHOTXT ; IDENTIFY JOYSTICK INTERRUPT TEST MOV #67,@#CSRCTL ;ENABLE CURSORS 1 & 2 & SEL. FORM=7 MOV #100100,@#X1 ;X1=64. & Y=128. MOV #100300,@#X2 ;X2=192. & Y2=128. JOY: MOVB #10,@#JOYCTL ;INIT. INTERFACE & JOYSTICK CLRB @#JOYCTL ;CLEAR CNTL BYTE MOVB #20,@#JOYCTL ;ENABLE JOYSTICK INTERRUPT BIS #100,@#DACS ;ENABLE INTERRUPTS (DMA) CLR IFLAG ;CLEAR INTERRUPT FLAG JOY1: TST IFLAG ;WAS THERE AN INTERRUPT? BEQ KEYCHK ;NO,WAIT FOR INTERRUPT BMI JOY3 ;YES,BRANCH IF IN TRACK MODE(AUTO ENTRY) CMP #1,IFLAG ;MANUAL INTERRUPT? BEQ JOY2 ;YES,BRANCH CMP #2,IFLAG ;UNEXPECTED INTERRUPT? BNE JOY2 ;NO,BRANCH MOV #EMSG1,R5 ;POST ERROR MSG ADDRESS JSR PC,SHOTXT ;GO DISPLAY ERROR MSG BR JOY ;LOOP JOY2: MOV @#X1,TEMP ; PICK UP CURSOR ONE COORDINATES COMB TEMP+1 ; COMPLEMENT Y COORDINATE MOV TEMP,@#X2 ; AND PASS TO CURSOR TWO BR JOY ;LOOP JOY3: BIT #1,IFLAG BEQ JOY ; IGNORE IF NOT POSITION MODE MOVB #6,@#JOYCTL ; SELECT JOYSTICK X MOVB @#JOYCTL,TEMP ; PICK UP JOYSTICK X COORDINATE MOVB #7,@#JOYCTL ; SELECT JOYSTICK Y COORDINATE MOVB @#JOYCTL,TEMP+1 ; COMBINE WITH X MOV TEMP,@#X1 ; SUPPLY TO CURSOR #1 MOV TEMP,@#X2 ; AND CURSOR #2 BR JOY ;LOOP KEYCHK: JSR PC,CHKEY ;GO CHECK FOR TERMINATING KEYSTROKE JMP JOY1 ;RETURN TO WAITING FOR INTERRUPT .PAGE .SBTTL SUBROUTINES ;***** SUBROUTINE TO COMPARE CURSOR X&Y & PRINT EXPECTED & ***** ; RECEIVED RESULTS ON CONSOLE SCREEN CMPXY: MOV @#X1,@#XYWRK ;GET X1 & Y1 RECEIVED COMB @#XYWRK+1 ;COMPLEMENT Y1 CMP @#X1SAV,@#XYWRK ;X2 & Y2 EXPECTED = RECEIVED? BNE SHOERR ;NO,GO HANDLE ERROR MOV @#X2,@#XYWRK ;GET X2 & Y2 RECEIVED COMB @#XYWRK+1 ;COMPLEMENT Y2 CMP @#X2SAV,@#XYWRK ;X2 & Y2 EXPECTED = RECEIVED? BNE SHOERR ;NO,GO HANDLE ERROR CMPRET: RTS PC ;YES,RETURN ;***** DISPLAY EXPECTED COORDINATES FOR CURSOR TEST ***** SHOERR: MOV #XYEXP+6,R2 ; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO MOVB @#X1SAV,R4 ; POST X1 EXPECTED COORDINATE JSR PC,MOVNUM ; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE MOV #XYEXP+17.,R2 ; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO MOVB @#Y1SAV,R4 ;POST Y1 EXPECTED COORDINATE JSR PC,MOVNUM ; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE MOV #XYEXP+28.,R2 ; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO MOVB @#X2SAV,R4 ;POST X2 EXPECTED COORDINATE JSR PC,MOVNUM ; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE MOV #XYEXP+39.,R2 ; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO MOVB @#Y2SAV,R4 ;POST Y2 EXPECTED COORDINATE JSR PC,MOVNUM ; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE MOV #XYEXP,R5 ; POST PRINT BUFFER ADDRESS FOR X&Y EXPECTED DISPLAY JSR PC,SHOTXT ; DISPLAY X&Y EXPECTED COORDINATES ON SCREEN MOV #15,@#PRDAT ;CARRIAGE RETURN JSR PC,PREADY ;WAIT FOR PRINTER READY MOV #12,@#PRDAT ;LINE FEED ;***** DISPLAY RECEIVED COORDINATES FOR CURSOR TEST ***** MOV #XYREC+6,R2 ; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO MOVB @#X1,R4 ;POST X1 RECEIVED COORDINATE JSR PC,MOVNUM ; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE MOV #XYREC+17.,R2 ; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO MOVB @#Y1,R4 ; POST Y1 RECEIVED COORDINATE COMB R4 ;ONE'S COMPEMENT Y1 COORDINATE JSR PC,MOVNUM ; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE MOV #XYREC+28.,R2 ; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO MOVB @#X2,R4 ; POST X2 RECEIVED COORDINATE JSR PC,MOVNUM ; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE MOV #XYREC+39.,R2 ; POST PRINT IMAGE ADDRESS TO MOVE OCTAL TO MOVB @#Y2,R4 ; POST Y2 RECEIVED COORDINATE COMB R4 ;ONE'S COMPLEMENT Y2 COORDINATE JSR PC,MOVNUM ; GO CONVERT & MOVE OCTAL NUMBERS TO PRINT IMAGE MOV #XYREC,R5 ; POST PRINT BUFFER ADDRESS FOR X&Y RECEIVED DISPLAY JSR PC,SHOTXT ; GO DISPLAY X&Y RECEIVED COORDINATES ON SCREEN MOV #15,@#PRDAT ;CARRIAGE RETURN JSR PC,PREADY ;WAIT FOR PRINTER READY MOV #12,@#PRDAT ;LINE FEED BR CMPRET ; GO CLEAN UP & RETURN ;***** SUBROUTINE TO MOVE OCTAL NUMBERS INTO A PRINT IMAGE ***** ; ON ENTRY: R2 = ADDRESS IN PRINT IMAGE TO MOVE OCTAL NUMBERS ; AFTER ENTRY: R4 = UPPER BYTE = BYTE TO BE CONVERTED & MOVED. MOVNUM: SWAB R4 ; MOV COORDINATE TO HIGH BYTE CLC ; CLEAR CARRY BIT MOV #3,R3 ;INIT. OCTAL DIGIT COUNTER MOVNU1: ROL R4 ; * SHIFT OCTAL ROL R4 ; ** DIGIT TO ROL R4 ; *** BITS 2-0 MOV R4,R5 BIC #177770,R5 ; MASK OFF ALL BUT BITS 2-0 BIS #60,R5 ; MAKE ASCII 0-7 MOVB R5,(R2)+ ; MOVE OCTAL NUMBER TO PRINT IMAGE DEC R3 ; LAST OCTAL NUMBER BNE MOVNU1 ; NO, LOOP RTS PC ; YES RETURN ;***** SUBROUTINE TO HANDLE CONSOLE TEST SELECTION ***** CHKEY: TSTB @#KEYCSR ; KEYSTROKE? BPL CHKEY1 JMP TSTSEL ; ALLOW NEW TEST IF SO CHKEY1: TST REPEAT ; REPEAT FLAG SET? BNE CHKEY2 ; GO REPEAT TEST IF SO ADD #4,(SP) ; POINT TO NEXT TEST IN SEQUENCE CHKEY2: RTS PC ;***** SUBROUTINE TO DISPLAY TEXT ON A/N TERMINAL CONSOLE. ***** ; UPON ENTRY:R5=MESSAGE ADDRESS SHOTXT: MOVB (R5)+,R0 ;PICK UP CHARACTER BEQ SHOTX1 JSR PC,TTYOUT ;TRANSFER NON-ZERO BYTE TO CONSOLE TERMINAL BR SHOTXT SHOTX1: RTS PC ;RETURN ON ALL-ZERO BYTE ;***** SUBROUTINE TO FETCH VALID OCTAL DIGITS & CARRIAGE RETURN ***** TTYIN: TSTB @#KEYCSR BPL TTYIN ;WAIT FOR KEYSTROKE MOV @#KEYDAT,R0 ;PICK UP CHARACTER BIC #200,R0 ; STRIP PARITY BIT CMP #3,R0 ;CONTROL C ? BEQ QUIT ;GO EXIT IF SO CMP #15,R0 ;CARRIAGE RETURN ? BEQ CRFND ;TERMINATE IF SO CMP #57,R0 BPL TTYIN ;IGNORE IF < 60 CMP #67,R0 BMI TTYIN ;LIKEWISE IF > 67 TTYOUT: JSR PC,PREADY ;WAIT FOR OUTPUT READY MOV R0,@#PRDAT ;ECHO CHARACTER JSR PC,PREADY CLC ;SHOW VALID DIGIT RTS PC CRFND: JSR PC,PREADY MOV R0,@#PRDAT JSR PC,PREADY MOV #12,@#PRDAT ;LINE FEED FOR FREE JSR PC,PREADY SEC ;FLAG TERMINATOR RTS PC QUIT: EMT 350 ;RETURN TO RT-11 MONITOR PREADY: BIT #200,@#PRCSR BEQ PREADY ;WAIT FOR PRINTER READY RTS PC ;***** SUBROUTINE TO WAIT 250 MILLISECONDS ***** TIME: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV @#COUNT,R0 ;LOAD UP WAIT COUNT TIME1: DEC R0 ;DECREMENT COUNT BNE TIME1 TIME2: MOV (SP)+,R1 ;RESTORE R1 MOV (SP)+,R0 ;RESTORE R0 RTS PC ;RETURN .PAGE ; ***** SUBROUTINE TO DISPLAY OCTAL NUMBERS ON CONSOLE DEVICE ***** ; ON ENTRY:R4 UPPER BYTE = BYTE TO BE PRINTED IN OCTAL SHONUM: MOV #3,R3 ; INITIALIZE CHARACTER COUNTER CLC ; CLEAR CARRY BIT SHONU1: ROL R4 ; * SHIFT OCTAL ROL R4 ; ** DIGIT TO ROL R4 ; *** BITS 2-0 MOV R4,R5 BIC #177770,R5 ; MASK OFF ALL BUT BITS 2-0 BIS #60,R5 ; MAKE ASCII 0-7 JSR PC,PREADY ; WAIT FOR CONSOLE OUTPUT READ MOV R5,@#PRDAT ; SHOW DIGIT DEC R3 ; LAST OCTAL CHARACTER? BNE SHONU1 ; NO, LOOP MOV #2,R3 ; YES, SET NULL CHARACTER COUNTER SHONU2: JSR PC,PREADY ; WAIT FOR CONSOLE OUTPUT READ MOV #40,@#PRDAT ; SHOW NULL (SPACE) DEC R3 ; LAST NULL CHARACTER? BNE SHONU2 ; NO, LOOP JSR PC,PREADY ; WAIT FOR PRINTER READY RTS PC ; YES, RETURN .PAGE .SBTTL JOYSTICK INTERRUPT HANDLER VECTOR: MOV R0,-(SP) ; SAVE REGISTER 0 BIT #4000,@#DACS ; JOYSTICK INTERRRUPT ? BNE V1 ;YES,BRANCH MOV #2,IFLAG ;NO,POST RETURN CODE=2=UNEXPECTED INTERRUPT BR V4 ; AND GO RETURN V1: MOVB #13,@#JOYCTL ; SELECT JOYSTICK STATUS, DISABLING INTERRUPT MOVB @#JOYCTL,R0 ; AND RETRIEVE IT BIT #20,R0 ;AUTO ENTER? BNE V2 ;YES,BRANCH MOV #1,IFLAG ;NO,POST RETURN CODE=1=MANUAL INTERRUPT BR V4 V2: BIT #4,R0 ;POSITION MODE? BEQ V3 ;NO,BRANCH(RETURN CODE=-2=IGNORE INTERRUPT MOV #-1,IFLAG ;YES,POST RETURN CODE = -1=AUTO ENTER(TRACK) BR V4 V3: MOV #-2,IFLAG ; POST RETURN CODE = -2 = IGNORE INTERRUPT V4: MOV (SP)+,R0 ; RESTORE REGISTER 0 RTI ;RETURN FROM INTERRUPT .PAGE .SBTTL PROGRAM CONSTANTS, VARIABLES, STORAGE ; X1SAV: .BYTE 0 ; SAVE X1 FOR COMPARE Y1SAV: .BYTE 0 ; SAVE Y1 FOR COMPARE X2SAV: .BYTE 0 ; SAVE X2 FOR COMPARE Y2SAV: .BYTE 0 ; SAVE Y2 FOR COMPARE XYWRK: .WORD 0 ;X & Y RECEIVED WORKING REGISTER COUNT: .WORD 0 ;DELAY COUNT FOR WAIT SUBROUTINE JOYSEL: .WORD 0 ; MASK TO SELECT JOYSTICK REGISTER IFLAG: .WORD 0 ;INTERRUPT FLAG TEMP: .BLKW 1 ; STORAGE FOR CURSOR COORDINATES .PAGE .SBTTL ASCII STRINGS .EVEN .NLIST BIN ;DON'T BOTHER WITH EXPANSIONS XYEXP: .ASCIZ/X1EXP= Y1EXP= X2EXP= Y2EXP= / .EVEN XYREC: .ASCIZ/X1REC= Y1REC= X2REC= Y2REC= / .EVEN TSTDSC: CRLFLF .ASCII / * * * ID-2000 CURSOR/ .BYTE '/ .ASCII /JOYSTICK DIAGNOSTICS * * */ CRLFLF .ASCII / TESTS AVAILABLE:/ CRLF .ASCII / 1 = CURSOR / CRLF .ASCII / 2 = JOYSTICK INTERFACE / CRLF .ASCII / 3 = JOYSTICK POSITION / CRLF .ASCII / 4 = JOYSTICK INTERRUPT / CRLFLF .ASCII / 0 => EXECUTE ALL TESTS SEQUENTIALLY / CRLF .ASCIZ / >4 => LIST AVAILABLE TESTS / TSTREQ: CRLF .ASCIZ /TEST #: / JPTEXT: CRLF .ASCIZ /ENABLE CURSOR #1 IN POSITION MODE:/ JINTXT: CRLF .ASCII /ENABLE CURSOR #1 IN RATE MODE TO CHECK ENTER;/ CRLF .ASCIZ /SELECT POSITION AND TRACK TO CHECK AUTO ENTER:/ EMSG1: .ASCII / INTERRUPT NOT JOYSTICK! / CRLF .BYTE 0 .LIST BIN .END START