.TITLE WNDIO .IDENT /050183/ ; ; ; ; WRITTEN BY RAY DI MARCO ; 23-SEP-80. ; ; ; ; VERSION 230980/07. ; ; ; ;------------------------------------------------------------------------ ; ; ; THIS MODULE CONTAINS VT52 WINDOW ORIENTATED I/O PRIMITIVES. THE ROUTINES ; AVAILABLE ARE- ; ; WND.SU SET UP DISPLAY WINDOW DESCRIPTOR BLOCK ; WND.SH SHOW CONTENTS OF WINDOW ; WND.IN INPUT/EDIT/MODIFY CONTENTS OF DISPLAY WINDOW ; WND.XY POSITION CUSOR IN DISPLAY WINDOW ; ; THESE ROUTINES MUST BE LINKED WITH THE 'CONIO' AND 'IOMNG' ROUTINES TO ; FUNCTION CORRESTLY. ; ; ; .SBTTL MODIFICATIONS ; ; ; 12-JAN-81 ADD IN 'WND.FL' TABLE ; 27-FEB-80 CHANGE SO THAT <300!X> --> SEQUENCE IN 'WND.IN' ; 22-APR-81 ALLOW LC IN ASCII/ALPHA FIELDS ; 11-SEP-81 USE 203/204 SPECIAL CODES TO HIGHLIGHT "FG" (WND.SH/WND.IN) ; 27-APR-82 setup so VT100 $P, $Q, $R and $S sequences more useful ; 05-Jan-82 WND.IN @4000$ (insert character routine) fudges Next Field ; operation if WNDIOT INSERT routine sets WND.FL+2 byte ; ; .SBTTL DOCUMENTATION - ARGUMENT PASSING ; ; ; THE 'WND.SU' ROUTINE EXPECTS THE CALLER TO PLACE THE ADDRESS OF THE ; DESCRIPTOR BLOCK IN 'R0' AT ENTRY. IT PRESERVES ALL REGISTERS. ; ; THE 'WND.SH' ROUTINE ACCEPTS NO ARGUMENTS AND PRESERVES ALL REGISTERS. ; ; THE 'WND.IN' ROUTINE PRESERVES ALL REGISTERS OTHER THAN R0, WHICH IS ; USED TO RETURN THE CHARACTER WHICH ABORTED THE INPUT. ; ; THE 'WND.XY' ROUTINE ACCEPTS NO ARGUMENTS AND PRESERVES ALL REGISTERS. ; ; ; ; .SBTTL DOCUMENTATION - 'WND.BL' TABLE ; ; ; THIS TABLE IS USED TO STORE THE ATTRIBUTES/PARAMETERS FOR THE CURRENTLY ; ACTIVE DISPLAY FIELD. THE 'WND.SU' ROUTINE IS USED TO COPY THE FIELD ; PARAMETERS INTO THIS BLOCK. THE TABLE STRUCTURE IS- ; ; .WORD ; CUSOR POSITION WITHIN FIELD ; .WORD ; Y COORDINATE OF FIELD ; .WORD ; X ORIGIN ON SCREEN ; .WORD ; Y COORDINATE OF FIELD ; .WORD ; NUMBER OF CHARACTERS IN FIELD ; .WORD ; SPARE ; .WORD ; ADDRESS OF BUFFER ; .WORD ; INSERT ROUTINE ADDRESS ; .WORD ; CLEAR FIELD ROUTINE ADDRESS ; .WORD ; DELETE (LEFT OF CUSOR) ROUTINE ; .WORD ; DELETE (RIGHT OF CUSOR) ROUTINE ; ; THE PARAMETER BLOCK POINTED TO BY R0 WHEN 'WND.SU' IS CALLED IS THE ; SAME EXCEPT THAT THE FIRST TWO WORDS ARE MISSING. ; ; ; .SBTTL DOCUMENTATION - USING THE MODULE ; ; ; THE USER MUST FIRST SET UP A WINDOW DESCRIPTOR PARAMETER BLOCK, AND USE ; 'WND.SU' TO COPY THESE PARAMETERS INTO THE 'WND.BL' TABLE, THEREBY ; ACTIVATING THE WINDOW. ; ; ONCE THE WINDOW IS ACTIVATED IT CAN BE DISPLAYED BY CALLING 'WND.SH', ; OR EDITED BY CALLING 'WND.IN'. ; ; ; ; .SBTTL DOCUMENTATION - OPERATION OF WND.IN ; ; ; ANY ALPHA-NUMERIC CHARACTER THAT IS TYPED IS ENTERED IN THE CURRENT CUSOR ; POSITION. ALL CHARACTERS UNDER AND TO THE RIGHT OF THE CUSOR ARE MOVED ; 1 PLACE RIGHT. THE RIGHTMOST CHARACTER IN THE WINDOW IS LOST. THE CUSOR ; IS ADVANCED RIGHT. ; ; THE <$A>, <$B>, <$C> AND <$D> SEQUNCES MOVE THE CUSOR TO THE LEFT MARGIN, ; RIGHT MARGIN, TO THE RIGHT OR LEFT. ; ; THE KEY DELETES THE CHARACTER TO THE LEFT OF THE CUSOR, AND ; CAUSES ALL CHARACTERS UNDER OR TO THE RIGHT OF THE CUSOR TO BE MOVED ; LEFT. ; ; THE <$P> SEQUENCE DELETES THE CHARACTER UNDER THE CUSOR. CHARACTERS TO ; THE RIGHT OF THE CUSOR ARE MOVED LEFT TO FILL THE VACANCY. ; ; A CONTROL-K CHARACTER CAUSES THE CONTENTS OF THE WINDOW TO BE ERASED. ; ; IF A CONTROL CHARACTER OTHER THAN THOSE DETAILED ABOVE IS TYPED CONTROL ; RETURNS TO THE CALLER, WITH THE TERMINATING CHARACTER HELD IN 'R0'. ; ; ; .SBTTL DECLARATIONS ; ; .MCALL .PUSH,.POP ; STACKING ; .GLOBL WND.SU,WND.SH,WND.IN,WND.XY ; ENTRIES .GLOBL WND.FL ; FLAGS ; .GLOBL CON.XY ; 'CONIO' ; ; ; ; .SBTTL DEFINITIONS - CHARATER CODES ; ; .IIF NDF,BELL, BELL = 'G-'@ ; BELL .IIF NDF,TAB, TAB = 'I-'@ ; TAB .IIF NDF,LF, LF = 'J-'@ ; LINEFEED .IIF NDF,CR, CR = 'M-'@ ; CARRIAGE RETURN .IIF NDF,ESC, ESC = 33 ; CHARACTER 'ESCAPE' .IIF NDF,ESCOUT, ESCOUT = 155. ; CHARACTER 'ESCAPE' .IIF NDF,DELETE, DELETE = 177 ; DELETE CHARACTER ; ; .PSECT CODE ; OPEN CODE SECTION ; ------ ---- ; ; .SBTTL DEFINITION - MACRO '.OUT' ; ; ; THIS ROUTINE CAUSES A NUMBER OF CHARCATERS TO BE OUTPUT TO ; THE CONSOLE. ; ; .MACRO .OUT CHAR .GLOBL CON.CO .IF B, CALL CON.CO .MEXIT .ENDC MOV R0,-(SP) .IRP X, MOVB X,R0 CALL CON.CO .ENDR MOV (SP)+,R0 .ENDM .OUT ; ; ; .SBTTL DEFINITION - MACRO '.IN' ; ; .MACRO .IN .GLOBL CON.CI CALL CON.CI .ENDM .IN ; ; .SBTTL DEFINITION - MACRO 'ENTRY' ... DISPATCH TABLE ENTRY ; ; ; .MACRO ENTRY CHAR1,CHAR2,ADDRESS .BYTE CHAR1,CHAR2 .WORD ADDRESS .ENDM ENTRY ; ; ; .SBTTL ROUTINE - 'WND.SU' ... SET UP FIELD DESCRIPTOR BLOCK ; ; ; ; THIS ROUTINE IS USED TO SET UP THE FIELD DESCRIPTOR BLOCK. ; THE ADDRESS OF THE FIELD DESCRIPTOR IS PASSED OVER IN R0. ; ; ; ; ; WND.SU: .PUSH ; SAVE MOV #WND.BL+4,R1 ; STORE POINTER -> R1 MOV #9.,R2 ; COUNTER -> R2 10$: MOV (R0)+,(R1)+ ; COPY SOB R2,10$ ; LOOP CLR XPOS ; POSITION CUSOR AT START OF FIELD CLR YPOS ; RESET YPOS .POP ; RESTORE RETURN ; HOME ; ; ; .SBTTL ROUTINE - 'WND.SH' ... SHOW FIELD CONTENTS ; ; ; ; THIS ROUTINE SHOWS (PRINTS) THE CONTENTS OF THE FIELD ON THE ; SCREEN. ; ; ; WND.SH: .PUSH XPOS ; SAVE XPOS CLR XPOS ; CLEAR IT CALL WND.XY ; POSITION CUSOR .POP XPOS ; RESTORE XPOS ; .PUSH ; SAVE .OUT #203 ;; TURN ON "FG" MOV BUFADD,R1 ; POINT R1 TO STRING MOV XMAX,R2 ; COUNT -> R2 10$: .OUT (R1)+ ; OUTPUT CHARACTER SOB R2,10$ ; LOOP .OUT #204 ;; TURN OF "FG" .POP ; RESTORE RETURN ; DONE ; ; .SBTTL ROUTINE - 'WND.IN' ... INPUT A CHARACTER ; ; ; ; THIS ROUTINE ALLOWS THE FIELD CONTENTS TO BE MODIFIED. AFTER ; EACH KEY SEQUENCE THE FIELD CONTENTS ARE DISPLAYED. NORMAL ; ALPHA CHARACTERS ARE INSERTED INTO THE FIELD. SPECIAL ESCAPE ; SEQUENCES AND CONTROL CHARACTERS ALLOW THE CUSOR TO BE MOVED ; IN THE FIELD, CHARACTERS DELETED ETC. THE TABLE '100$' IS USED ; FOR DISPATCHING CONTROL. ; ; WND.IN: .PUSH ; SAVE .OUT #203 ;; TURN ON "FG" 10$: TSTB WND.FL ; TIME FOR TOTAL REFRESH? BEQ 20$ ; NO -> SKIP CLRB WND.FL ; CLEAR FLAG FOR NEXT TIME CALL WND.SH ; display field contents .OUT #203 ;; TURN ON "FG" ; 20$: TSTB WND.FL+1 ; auto-insert enabled? BEQ 40$ ; no -> skip DECB WND.FL+1 ; used up 1 auto-insert character 40$: CALL WND.XY ; POSITION CUSOR .IN ; INPUT A CHARACTER MOV #100$,R1 ; TABLE ADDRESS -> R1 CALL DSPTH ; DISPATCH TO TABLE BCC 10$ ; OK --> LOOP .OUT #204 ;; TURN OF "FG" .POP ; RESTORE RETURN ; FAILED -> HOME ; ; 100$: ENTRY 11.,11.,2000$ ; ON ^K CLEAR OUT FIELD ENTRY 25,25,2000$ ; ON ^U CLEAR OUT FIELD ENTRY 40,176,4000$ ; any alpha insert ENTRY 177,177,9000$ ; ON <177> delete previous ENTRY 301,301,1110$ ; ON top of field ENTRY 302,302,1120$ ; ON bottom of field ENTRY 303,303,1130$ ; ON Right of field ENTRY 304,304,1140$ ; ON Left of field ENTRY 320,320,1150$ ; ON

Delete right ENTRY 321,321,1160$ ; ON Insert next character ENTRY 322,322,1170$ ; ON back one field ENTRY 323,323,1180$ ; ON forward one field .WORD 0 ; ; ; ; ; move cusor to first character in field. ; 1110$: CLR XPOS ; RESET POSITION INDICATOR CLC ; CLEAR FAIL FLAG RETURN ; HOME ; ; move cusor to last character in field ; 1120$: MOV XMAX,XPOS ; MOVE TO RIGHT DEC XPOS ; COME BACK WITHIN FIELD CLC ; CLEAR FAIL FLAG RETURN ; HOME ; ; move cosor 1 character right ; 1130$: INC XPOS ; MOVE LEFT CMP XPOS,XMAX ; STILL IN FIELD? BLO 1134$ ; YES -> OK DEC XPOS ; FIX UP 1134$: CLC ; CLEAR FAIL FLAG RETURN ; HOME ; ; move cusor 1 character left ; 1140$: DEC XPOS ; DOWN CHAR COUNT BGE 1144$ ; IN FIELD -> 1144$ CLR XPOS ; RESET INTO FIELD 1144$: CLC ; CLEAR FAIL FLAG RETURN ; HOME ; ; ; ; delete character under cusor ; 1150$: CALL @DELRHT ; DELETE FROM RIGHT CLC ; NO FAIL RETURN ; ; insert next character ; 1160$: MOVB #2,WND.FL+1 ; set 'want auto-insert' RETURN ; exit ; ; ; Back up one field. ; 1170$: MOV #'H-'@,R0 ; BS -> R0 SEC ; Indicate need to exit RETURN ; all done ; ; Advance to next field. ; 1180$: MOV #'I-'@,R0 ; TB -> R0 SEC ; indicate need to exit RETURN ; all done ; ; ; ; ; THIS CODE CAUSES THE INPUT FIELD TO BE CLEARED. ; ; 2000$: CALL @CLEAR ; CLEAR FIELD CLC ; CLEAR ERROR FLAG RETURN ; HOME ; ; ; THIS CODE CAUSES A CHARACTER TO BE INSERTED IN THE FIELD. ; ; 4000$: CLRB WND.FL+2 ; clear overflow flag CALL @INSERT ; INSERT THE CHARACTER TSTB WND.FL+2 ; overflowed? BNE 1180$ ; yes -> next field CLC ; CLEAR FAIL FLAG RETURN ; HOME ; ; ; THIS CODE DELETES A CHARACTER FROM THE FIELD. ; ; 9000$: CALL @DELLFT ; DELETE CHARACTER CLC ; CLEAR FAIL FLAG RETURN ; HOME ; ; .SBTTL ROUTINE - 'DSPTH' ... DISPATCH VIA TABLE ; ; ; THIS ROUTINE SEARCHS THE TABLE (R1) UNTIL IT FINDS A ENTRY ; MATCHING R0, AT WHICH TIME IT PASSES CONTROL TO THE ROUTINE ; ASSOCIATED WITH THE ENTRY. THE ENTRY FORMAT IS- ; ; .BYTE LOW ; .BYTE HIGH ; .WORD ADDRESS ; ; AND 'ADDRESS' IS CALLED IF LOW <= R0 <= HIGH. THE ENTRIES ARE ; ORDERED IN ASCENDING ORDER OF THE LOW BYTES, AND THE TABLE END ; IS INDICATED VIA A ENTRY FOR WHICH THE FIRST TWO BYTES ARE ; ZERO. ; ; IF THE ENTRY IS NOT FOUND THE ROUTINE RETURNS WITH 'C' SET. ALL ; REGISTERS OTHER THAN R1 ARE PRESERVED. ; ; ; DSPTH: TST (R1) ; AT EOT? BEQ 100$ ; YES -> 100$ CMPB R0,(R1) ; CHARACTER MATCH? BLO 100$ ; NOT IN RANGE -> 100$ CMPB R0,1(R1) ; COMPARE AGAINST HIGH LIMIT BLOS 200$ ; IN RANGE -> 200$ CMP (R1)+,(R1)+ ; UP TABLE POINTER BR DSPTH ; LOOP ; 100$: SEC ; SET FAIL FLAG RETURN ; HOME ; ; 200$: CALL @2(R1) ; DISPATCH TO ROUTINE RETURN ; HOME ; ; ; ; ; ; .SBTTL ROUTINE - 'WND.XY' ... POSITION CUSOR AT YPOS,XPOS ; ; ; THIS ROUTINE CUASES THE CUSOR TO BE POSITIONED AT YPOS,XPOS ; RELATIVE TO 'YBASE,XBASE'. ; ; WND.XY: .PUSH R0 ; SAVE R0 MOV YPOS,R0 ; Y POS -> R0 ADD YBASE,R0 ; ADDJUST SWAB R0 ; Y --> HOB ADD XPOS,R0 ; ADD IN X COORDINATE ADD XBASE,R0 ; ADJUST CALL CON.XY ; POSITION CUSOR .POP R0 ; RESTORE RETURN ; HOME ; ; ; ; ; .SBTTL FIELD DESCRIPTOR BLOCK - 'WND.BL' ; ; ; WND.FL: .WORD 0,0,0,0 ; FLAGS WND.BL:: ; START OF BLOCK XPOS: .WORD 0 ; X COORDINATE YPOS: .WORD 0 ; Y COORDINATE XBASE: .WORD 0 ; X ORIGIN YBASE: .WORD 0 ; Y ORIGIN XMAX: .WORD 0 ; X MAX YMAX: .WORD 0 ; Y MAX ; BUFADD: .WORD 0 ; INPUT BUFFER ADDRESS INSERT: .WORD 0 ; INSERT ROUTINE ADDRESS CLEAR: .WORD 0 ; CLEAR ROUTINE DELLFT: .WORD 0 ; DELETE ROUTINE ADDRESS DELRHT: .WORD 0 ; DELETE RIGHT ROUTINE ; ; ; .END