.TITLE SCREEN .LIST MEB ; .NLIST BIN ; .MCALL EXIT$S ; BOB MCCASKEY X-2708 ; ; .MCALL QIOW$S .MCALL QIO$S ; ; CR=15 ;CARRIAGE RETURN NCR=53 ;NO CARRIAGE RETURN LF=12 ;LINE FEED ES=33 ;ESCAPE CHARACTER MAXWID=80. ;WIDTH OF SCREEN MAXHI=40. ;MAXIMUM WIDTH FOR DOUBLE HIGH I/O. OFSET=37 ;INCREMENT ROW AND COLUMN FOR I/O SIX: .ASCII /6/ THREE: .ASCII /3/ FOUR: .ASCII /4/ F: .ASCII /F/ G: .ASCII /G/ MARK: .ASCII /?/ ;QUESTION MARK SEVEN: .ASCII /7/ EIGHT: .ASCII /8/ .EVEN ERR1: .ASCII/ERROR IN TERMINAL TYPE ... CHECK SCREEN GUIDE/ ERRLN1 = .-ERR1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;STORAGE AREA MISCALENEOUS SAVE1: .BYTE SAVE2: .BYTE SPACE: .ASCII / / .EVEN INT: .WORD COUNT: .WORD KOUNT: .WORD LOUNT: .WORD SAVEI: .WORD SAVE: .WORD IOSB: .BLKW 1 IODB: .BLKW 1 ITYPE: .BLKW 1 IOLEN: .BLKW 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ERASE SCREEN STRING CLER: .BYTE ES .ASCII /H/ .BYTE ES .ASCII /J/ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BEEP STRING BELL: .BYTE 07 .BYTE 00 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CONTROL SEQUENCE FOR I/O OF BUF CTL: .BYTE ES .ASCII /Y/ ROW: .BLKB 1 COL: .BLKB 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAIN I/O DATA BUFFER BUF: .BLKB MAXWID .BLKB 4. ;THIS FOUR IS FOR SET AND RESET ;GRAPHICS MODE IN "BLOCK" ROUTINE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GRAPHIC ESCAPE SEQUENCE ; GRA: .BYTE ES .ASCII /Y/ GROW: .BYTE GCOL: .BYTE .BYTE ES .ASCII /F/ CH: .BYTE ;CHARACTER GOES HERE .BYTE ES .ASCII /G/ .ASCII / / ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; THIS ONES FOR REVERSE VIDEO REV: .BYTE ES .ASCII /Y/ RROW: .BYTE RCOL: .BYTE .BYTE ES .ASCII / CMP IODB,#T.V100 ; CHECK TO SEE IF IT'S A 100 BNE FIFTWO MOVB #100.,ITYPE RETURN FIFTWO: CMP IODB,#T.VT52 ; NOT 100 NOW SEE IF IT'S A 52 BNE NONE MOVB #52.,ITYPE RETURN NONE: ; ; ; IF WE ADD MORE TERMINALS PUT THEIR CHECKS HERE!!! MOV #0.,ITYPE RETURN .EVEN .PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OPENS ;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INITIAL VALIDATION CALL ALSO CLEARS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TERMINAL ;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; FRTRAN EXAMPLE:: CALL OPENS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OPENS:: ; ; ROUTINE TO OPEN AND VALIDATE LUN ; CALL SETTTY ;GET TYPE OF TERMINAL STOP AND ERROR IF INVALID CMP ITYPE,#0 BNE GOOD ;OK WE CAN GO MOV #ERR1,R0 ;SET UP FOR MESSAGE MOV #ERRLN1,R1 ; PUT LENGTH IN R1 JSR PC,SEND ;SEND TO TI: EXIT$S ;GET OUT OF HERE GOOD: CALL ERASE ;CLEAR THE VIDEO RETURN ;GO BACK TO CALLING TASK ; ; ; ; .PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ERASE ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PUT CURSOR TO HOME AND ERASE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FROM CURRENT TO END OF SCREEN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FORTRAN SAMPLE: CALL ERASE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NOW TO ERASE THE V.D.T. ; .EVEN ERASE:: MOV #CLER,R0 ;MOVE ADDRESS OF SEQUENCE TO R0 MOV #4,R1 ; SEND LENGTH JMP SEND ;PUT ON TERMINAL ; ; ; .PAGE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SHOW ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FORTRAN SAMPLE:: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CALL SHOW(12,40,10,'CENTER SCR') ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OR CALL SHOW(12,40,10,BUF(4)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BUF(4) IS STARTING POINT OF STRING ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TO BE SHOWN ; THE MAIN SHOW SHOW:: ; ; ; FIRST MOVE PARAMETERS TO REGISTERS ; MOV @2(R5),R1 ;MOVE ROW TO R1 MOV @4(R5),R2 ;MOVE COLUMN TO R2 BR SKIP ;SKIP ONE SHOOO: ASL R2 ;SHIFT FOR INVALID TERMINAL HIGH AND WIDE SKIP: MOV @6(R5),R3 ;MOVE LENGTH TO R3 CMP #1,R3 ;VALIDATE LENGTH BGT DONE ;BAD ONE CMP R3,#MAXWID ;IS LEN TOO LARGE? BGT DONE ADD #OFSET,R1 ;INCREMENT FOR CONTROL ADD #OFSET,R2 ; INCREMENT FOR PROPER CARRIAGE CONTROL MOVB R1,ROW ;PLACE NUMBER IN ROW OF CONTROL STRING MOVB R2,COL ;PLACE COL IN CONTROL STRING ; MOVE INTO AREAS OF CARRIAGE CONTROL BUFFER MOV 10(R5),R4 ;GET START OF STRING MOV #BUF,R0 ;GET START OF OUTPUT BUFFER MOV R3,IOLEN ;SAVE LENGTH FOR LATER ADD #4,IOLEN ;INCREMENT TO INCLUDE CONTROL MOVE: MOVB (R4)+,(R0)+ SOB R3,MOVE ;;;;;;;;;;;;;;;;;;;;;;;;;; WE JUST MOVED STRING MOV #CTL,R0 ;PUT ADDRESS IN R0 FOR OUTPUT MOV IOLEN,R1 ;PUT LENGTH IN R1 FOR QIO SEND: QIOW$S #IO.WLB,#5,#3,#100,#IOSB,, ; SHOW THE SPECIFIED STRING DONE: RETURN .PAGE ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BEEP ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; THIS ROUTINE CAUSES AND AUDIBLE SOUND FROM TERMINAL ; (ONLY IF YOUR BEEP STILL WORKS) ; BEEP:: MOV #BELL,R0 MOV #2,R1 ; LENGTH OF SEND JMP SEND ;JUMP WHO WANTS TO BE BACK HERE .PAGE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CLEAR ;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ERASES PORTIONS OF THE V.D.T. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FORTRAN SAMPLE:: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CALL CLEAR(IROW,ICOL,ILEN) CLEAR:: MOV @2(R5),R1 ;GET ROW MOV @4(R5),R2 ;GET COL MOV @6(R5),R3 ;GET LEN MOV #BUF,R0 ;MOVE ADDRESS OF BUF TO R0 MOV @6(R5),R4 ; SPECIFY LENGTH BLANK: MOVB SPACE,(R0)+ SOB R4,BLANK ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GET BLANKS IN STRING ADD #OFSET,R1 ADD #OFSET,R2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INCREMENT FOR CONTROL MOVB R1,ROW MOVB R2,COL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOVE TO CONTROL AREA MOV #CTL,R0 ADD #4.,R3 MOV R3,R1 JMP SEND RETURN ;;;;;;;;;;;;;;;;;;;;; .PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GRAPH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ROUTINE TO PUT ONE GRAPHICS CHARACTER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ON THE V.D.T. AR ROW AND COL COORDINATES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FORTRAN SAMPLE:: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CALL GRAPH(IROW,ICOL,ICHR) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;; GRAPH:: MOV @2(R5),R0 MOV @4(R5),R1 MOVB @6(R5),CH ADD #OFSET,R0 ADD #OFSET,R1 MOVB R0,GROW MOVB R1,GCOL MOV #GRA,R0 MOV #9.,R1 ; LENGTH OF WRITE JMP SEND ; ; ; ; ; ; .PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; REVER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ON VT100 ONLY PUT GOODS IN ROW AND COL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IN REVERSE VIDEO THEN RESET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FORTRAN SAMPLE:: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CALL REVER (12,12,2,'AB') ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; REVERSE VIDEO OPTION REVER:: CMP ITYPE,#100. ;RESTRICT USE TO VT100 BNE SHOW ;OTHERWISE JUST SHOW MOV @2(R5),R1 ;GET ROW MOV @4(R5),R2 ;COLUMN ALSO MOV @6(R5),R3 ;NOW LENGTH MOV 10(R5),R4 ;NOW ADDRESS OF STRING ADD #OFSET,R2 ADD #OFSET,R1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INCREMENT ROW AND COL MOVB R1,RROW MOVB R2,RCOL ;PUT IN STRING MOV R4,R0 ; SET UP FOR SOB MOVE OF STRING CMP R3,#MAXWID ; VALIDATE LENGTH BGT DONE MOV #RBUF,R1 ;MOVE ADDRESS SWAP: MOVB (R0)+,(R1)+ SOB R3,SWAP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOVE STRING FOR R3'S LENGTH MOV #9.,R3 MOV #RESET,R0 ; PLACE ADDRESS OF RESET CONTROL IN R0 RE: MOVB (R0)+,(R1)+ SOB R3,RE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PUT RESET STRING ON NEXT MOV #REV,R0 MOV @6(R5),R1 ADD #19.,R1 ;PUT LENGTH OF WRITE IN R1 JMP SEND ;SEND TO V.D.T ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WIDE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ON VT100 SHOW STRING IN DOUBLE WIDE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FORMAT.... THIS CHANGES ENTIRE LINE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SO BE CAREFUL!! ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IF NOT VT100 WE WILL DOUBLE START PT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AND JUMP TO SHOW ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FORTRAN:: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CALL WIDE(IROW,ICOL,ILEN,BUFORSTRING) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WIDE:: MOVB #'W,SAVE ;SET THE WIDE FLAG BR AROND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; HIGH ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;; SIMILAR TO WIDE BUT EXTENDED FOR DOUBLE HIGH I/O ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; FORTRAN SAMPLE:: ;;;;;;;;;;;;;;;;;;;;;;; CALL HIGH(12,2,13,'NOW IS THE TIME') HIGH:: MOVB #'H,SAVE ;SET THE HIGH FLAG AROND: MOVB @2(R5),R1 ;GET ROW MOVB @4(R5),R2 ;GET COL CMP ITYPE,#100. ;RESTRICT USE TO VT100 BEQ HUND JMP SHOOO ;OTHERWISE JUST SHOW HUND: MOV @6(R5),R3 ;NOW FOR LEN MOV 10(R5),R4 ;NOW MOVE STRING START ADDRESS TO R4 ADD #OFSET,R2 ;INCREMENT CARRIAGE CONTROL ADD #OFSET,R1 MOVB R1,SROW ;NOW MOVE TO STRING MOVB R2,SCOL MOV R4,R0 ;SET UP FOR SOB MOVE OF STRING CMP R3,#MAXHI ; VALIDATE LENGTH BLE DNE JMP DONE ;TOO FAR TO BRANCH DNE: MOV #SBUF,R1 ;GET READY FOR STRING MOVE SWOP: MOVB (R0)+,(R1)+ ;MOVE BYTES TO SHOW AREA SOB R3,SWOP MOV #5.,R3 ;SET UP FOR RESET MOVE MOV #RESETA,R0 ; PLACE ADDRESS OF RESET CONTROL IN R0 PLACE: MOVB (R0)+,(R1)+ SOB R3,PLACE MOV #SPEC,R0 ;PUT ADDRESS IN R0 FOR SEND ROUTINE MOV @6(R5),R1 ADD #14.,R1 CMPB SAVE,#'W ;SEE IF WIDE BNE HI MOVB SIX,SFLG ;PUT A 'G' IN FLAG JMP SEND ;PUT ON TERMINAL ; ; HI: MOVB THREE,SFLG JSR PC,SEND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;; NOW ALL THE SAME FOR BOTTOM HALF ;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOV @2(R5),R2 ; ADD #40,R2 ;SET ROW TO NEXT ROW MOVB FOUR,SFLG ;SET OPTION FLAG MOVB R2,SROW JMP SEND ;WRITE SECOND HALF OF HIGH STRING ; .PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BLOCK:: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; SUBROUTINE TO DRAW BOX ON SCREEN ;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; AT UPPER RIGHT COORDINATES ROW @2(R5) COL @4(R5) ;;;;;;;;;;;;;;;;;; AND LOWER LEFT COORDINATES ROW @6(5R) COL @10(R5) ;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; FORTRAN EXAMPLE CALL BLOCK(1,1,24,80) ;;;;;;;;;;;;;;;;;; THIS WOULD DRAW BLOCK AROUND ENTIRE VDT ;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOV @2(R5),R2 ;PUT UR ROW IN R2 MOV @4(R5),R3 ;PUT UP RIGHT COL IN R3 ADD #OFSET,R2 ADD #OFSET,R3 MOVB R2,ROW MOVB R3,COL MOV #BUF,R0 ;PUT ADDRESS OF LINE BUFFER IN REG0 FOR MOVES MOVB #ES,(R0)+ ;SET UP ESCAPE SEQUENCE FOR SET GRAPHICS MODE MOVB F,(R0)+ ; COMPLETE SEQUENCE MOV R0,R3 ;SAVE POSITION FOR LATTER MOVB #154,(R0)+ ; PUT IN CORNER CHARACTER MOV @4(R5),R1 ;GET START OF STRING MOV @10(R5),R2 ;GET END OF STRING FOR TOP AND BOTTOM LINE SUB R1,R2 ;GET LENGTH OF BLOCK TO BE FILLED CMP R2,#1 ;VALIDATE LENGTH BLE SIDES ;JUST DO VERTICLE MOV R2,R1 ;SAVE LENGTH FOR WRITE (R1) SUB #1,R2 ;R2 NOW HAS NUMBER OF STRAIGHT CHARACTERS FILL: MOVB #161,(R0)+ ;PUT #161 IN LINE BUFFER SOB R2,FILL MOV R0,R4 ;SAVE POSITION OF CORNER MOVB #153,(R0)+ ;PUT IN UPPER RIGHT CORNER CHARACTER MOVB #ES,(R0)+ ;RESET FROM GRAPHICS MODE SEQUENCE MOVB G,(R0) ;COMPLETE RESET SEQUENCE ; ADD #9.,R1 ;INCREMENT LENGTH FOR CONTROL CHARACTERS MOV #CTL,R0 ;SET UP REGISTER FOR SEND JSR PC,SEND ;WRITE TOP LINE OF BLOCKS MOVB #155,(R3) ;PLACE LOWER LEFT CHARACTER IN LINE MOVB #152,(R4) ;PLACE LOWRE RIGHT CHARACTER IN LINE MOV @6(R5),R2 ; GET COLUMN ADD #OFSET,R2 ; INCREMENT FOR CONTROL MOVB R2,ROW ;GET READY FOR BOTTOM ROW JSR PC,SEND ;DRAW BOTTOM LINE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SIDES: MOV @2(R5),R2 ;GET UPPER ROW MOV @6(R5),R4 ;GET LOWER ROW SUB R2,R4 ;GET LEN OF VERTICAL LINES CMP R4,#1 ;VALIDATE LENGTH BGT GO RETURN GO: SUB #1,R4 ;DONT DRAW OVER CORNERS ADD #40,R2 ;INCREMENT FOR ROW MOVB R2,GROW ; SET UP FOR SEQUENCE MOV @4(R5),R3 ;GET COLUMN OF WRITE ADD #OFSET,R3 ;INCREMENT FOR CONTROL MOVB R3,GCOL ;SET COLUMN MOVB R3,SAVE1 ;SAVE COL MOV @10(R5),R3 ;GET RIGHT HAND COL ADD #OFSET,R3 ;INCREMENT MOVB R3,SAVE2 ;SAVE FOR TOGGLE MOVB #170,CH ;PUT IN GRAPHICS CHARACTER MOV #GRA,R0 ;SET UP FOR PLACEMENT MOV #9.,R1 ;SET LENGTH TAG: MOVB SAVE1,GCOL ;SET UP ROW JSR PC,SEND ;SEND CHARACTER MOVB SAVE2,GCOL ;UNSAVE RIGHT SIDE; JSR PC,SEND ;SEND RIGHT CHARACTER ADD #1,R2 ;INCREMENT FOR NEXT MOVB R2,GROW ;PUT IN NEXT ROW SOB R4,TAG ;DO PROPER NUMBER OF TIMES RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; GETSCR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; SUBROUTINE TO ALTER CONTENTS OF BYTE BUF PASSED ;;;;;;;;;;;;;;;;;;;; IN FROM FORTRAN ;;;;;;;;;;;;;;;;;;;; THIS ALTERATION WILL BE TERMINAL INTERACTIVE ;;;;;;;;;;;;;;;;;;;; FROM SCREEN COORDINATES SPECIFIED IN @2 AND @4(R5) ;;;;;;;;;;;;;;;;;;;; FOR THE LENGTH SPECIFIED IN @6(R5) ;;;;;;;;;;;;;;;;;;;; TERMINATION CHARACTER WILL BE RETURNED IN @10(R5) ;;;;;;;;;;;;;;;;;;;; UNLESS MAXIMUM LENGTH IS SURPASSED, IN WHICH CASE ;;;;;;;;;;;;;;;;;;;; NO TERMINATION CHARACTER WILL BE RETURNED ;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; FORTRAN FORMAT: ;;;;;;;;;;;;;;;;;;;; CALL GETSCR(IROW,ICOL,ILEN,ITERM,BUFF) ;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; DELETE CHARACTER WILL COMPRESS STRING ;;;;;;;;;;;;;;;;;;;; AND LINE-FEED WILL EXPAND STRING AND PLACE ;;;;;;;;;;;;;;;;;;;; BLANK AT CURRENT CURSOR POSITION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; SEE USER'S GUIDE FOR TERMINATION CHAR LIST ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GETSCR:: MOV 10(R5),SAVEI ;SAVE LOCATION OF ITERM MOV 12(R5),10(R5) ;MOVE POINTER DOWN FOR SHOW JSR PC,SHOW ;SHOW STRING MOV SAVEI,10(R5) ;RESTORE ITERM MOV #0,@10(R5) ;SET TERMINATION CHAR TO 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WE WILL NOW ALTER BUF AND MOVE BACK TO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FORTRAN AREA WHEN COMPLETE!! MOV #BUF,R2 ;POINT TO BUFF MOV @6(R5),R3 ;SET UP LENGTH MOV #0.,COUNT ;SET UP COUNTER CMP R3,#0 BGT LENOK ;LENGTH OK RETURN ;RETURN IF NOT LENOK: ;CONTINUE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PLACE CURSOR MOV @4(R5),R4 ;GET COLUMN LET ROW ALONE MOVB ROW,SROW ;GOING TO USE SPEC TO PLACE CURSOR MOV R4,INT ;PUT COLUMN IN INT ADD #OFSET,INT ;INCREMENT COLUMN WORD TOP: MOVB INT,SCOL ;LOAD SCOL QIOW$S #IO.WLB,#5,#3,#100.,#IOSB,,<#SPEC,#4,#00> ;PLACE CURSOR QIOW$S #IO.RAL,#5,#3,#100.,#IOSB,,<#CH,#1,#NCR> ;GET ONE CHAR CMPB CH,#13. ;TERMINATOR BEQ AFTER ;SET UP FOR RETURN CMPB CH,#09. ;TERMINATOR BEQ AFTER ;SET UP FOR RETURN CMPB CH,#10. ;TERMINATOR BEQ INSERT ;SET UP FOR RETURN CMPB CH,#127. ;TERMINATOR BEQ DELETE CMPB CH,#8. ;TERMINATOR BEQ BACKSPACE CMPB CH,#ES ;CHECK FOR SEQUENCE BNE NOSEQ ;NO ESCAPE SEQUENCE AGAIN: QIOW$S #IO.RNE,#5,#3,#100.,#IOSB,,<#CH,#1,#NCR> ;GET ESCAPE CH CMPB CH,MARK ;CHECK FOR EXTENDED BEQ AGAIN ;GET NEXT CMPB CH,#68. ;LEFT ARROW BEQ BACKSPACE CMPB CH,#67. ;RIGHT ARROW BEQ NEXT AFTER: MOVB CH,@10(R5) ;FILL IN TERMINATOR FOR RETURN BR COMPLETE ;NOW GO TO SWAP BUFFER ROUTINE DELETE: ;COMPRESS BUF DELETING CURRENT POSITION CHA CMP R3,#1 ;CHECK FOR ONE ONLY BEQ AFTER MOV R1,-(SP) ;PUSH R1 MOV R2,-(SP) MOV R4,-(SP) ;PUSH R4 MOV #BUF,R2 ;PUT BUF IN R2 ADD COUNT,R2 ;GET CURRENT POSITION MOV R2,R1 ;GET SCEOND POINTER ADD #1,R1 ;INCREMENT SECOND MOV R3,R4 ;SAVE LENGTH SUB #1.,R4 ;DECREMENT 'CAUSE COUNT NOT INCREMENTED SUB COUNT,R4 ;GET LENGTH OF COMPRESSION BEQ ONLY TAG3: MOVB (R1)+,(R2)+ ;COMPRESS STRING SOB R4,TAG3 ;RETRY UNTIL DONE ONLY: MOVB SPACE,(R2) ;INSERT FINAL SPACE TAG5: MOV (SP)+,R4 ;POP R4 MOV (SP)+,R2 ;POP R2 MOV (SP)+,R1 ;POP R1 JSR PC,SEND ;PUT ON SCREEN JMP TOP ;GET MORE INPUT INSERT: ;EXPAND BUF INSERTING CURRENT POSITION CHA CMP #1,R3 ;CHECK FOR LEN OF 1 BEQ AFTER ;IF ONLY ONE RETURN CH IN @10(R5) MOV R1,-(SP) ;PUSH R1 MOV R2,-(SP) MOV R4,-(SP) ;PUSH R4 MOV #BUF,R2 ;PUT BUF IN R2 ADD R3,R2 ;GET TOP POSITION MOV R2,R1 ;GET SCEOND POINTER SUB #1,R2 ;DECREMENT SECOND MOV R3,R4 ;SAVE LENGTH SUB #1.,R4 ;DECREMENT 'CAUSE COUNT NOT INCREMENTED SUB COUNT,R4 ;GET LENGTH OF EXPANSION BEQ ONLY1 PUSH: MOVB -(R2),-(R1) ;MOVE UP STRING SOB R4,PUSH ; ONLY1: MOVB SPACE,-(R1) ;PUT IN BLANK BR TAG5 ;GO SHARE CODE WITH DELETE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BACKSPACE: CMP #1,R3 ;CHECK FOR LEN OF ONE BEQ AFTER ;GET OUT IF THIS IS TRUE CMP COUNT,#0 ;ARE WE AT FIRST READ BNE SKIP4 ;WE ARE THERE JMP TOP SKIP4: SUB #1,COUNT ;DECREMENT COUNT SUB #1,INT ;DECREMENT COLUMN COUNTER SUB #1,R2 JMP TOP ;RETURN NEXT: ADD #1,R2 BR TAG2 ;SKIP NEXT INSTRUCTION NOSEQ: MOVB CH,(R2)+ TAG2: ADD #1,INT ;INCREMENT COLUMN SEQUENCE ADD #1,COUNT ;INCREMENT COUNT CMP COUNT,R3 ;COMPARE COUNT WITH MAX BGE COMPLETE JMP TOP COMPLETE: MOV @6(R5),R1 ;GET LENGTH MOV 12(R5),R2 ;GET AREA PASSED IN MOV #BUF,R3 ;GET BUF AROUND: MOVB (R3)+,(R2)+ ;MOVE CHARACTERS SOB R1,AROUND ;LOOP UNTIL COMPLETE RETURN ;BACK TO CALLING TASK ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GETKEY ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;; RETURN ONE CHARACTER HIT TO @2(R5) ;;;;;;;;;;;;;;;;;;;;;;;;; FORTRAN SAMPLE CALL GETKEY(BYTE) ;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;; ARROWS AND FUNCTION KEYS RETURN MORE THAN ONE GETKEY:: QIOW$S #IO.RAL,#5,#3,#100.,#IOSB,,<#CH,#1,#NCR> ;GET ONE CHAR MOVB CH,@2(R5) RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;READ NOT ECOING TO TERMINAL REMEMBER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ARROWS AND FUNCTIONS ARE MORE THAN ONE CHAR NOECO:: QIOW$S #IO.RNE,#5,#3,#50,#IOSB,,<#CH,#1,#NCR> ;GET ONE CHAR MOVB CH,@2(R5) ;PUT IN CHARACTER RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PLACE REQUEST TO READ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; NOWAIT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; PASS IN ONE BYTE WITH NON 0 VALUE IF THIS IS ;;;;;;;;;;;;;;;;;;;; CASE A NO WAIT WILL BE ISSUED AND EVERY TIME ;;;;;;;;;;;;;;;;;;;; A CHAR IS HIT IT WILL BE RETURNED TO CALLING TASK ;;;;;;;;;;;;;;;;;;;; AND ANOTHER NOWAIT ISSUED NOWAIT:: MOVB @2(R5),ROW ;PUT IN BYTE FOR CMP CMPB ROW,#0 ;SEE IF WE NEED QIO BEQ SKIPIT MOVB #0,CH ; QIO$S #IO.RNE,#5,#3,#50,#IOSB,,<#CH,#1,#00> ;GET ONE CHAR MOVB CH,@2(R5) ;NOW FETCH THE KEY RETURN SKIPIT: CMPB CH,#0 BEQ BACK MOVB CH,@2(R5) BACK: RETURN RETURN .END