.TITLE TIORFS VT11/VS60 HANDLER .SBTTL VT11/VS60 HANDLER ; LAST EDIT ON 13-MAR-80 BY MARK BRAMHALL .IDENT /V36/ .SBTTL VT11/VS60 HARDWARE DEFINITIONS .DSECT ;REGISTER OFFSETS FROM "DPCADR" DPC: .BLKW ;DISPLAY PC DPS: .BLKW ;DISPLAY STATUS REGISTER ; STATUS REGISTER BIT EDGEFL = 40 ;EDGE FLAG INDICATOR ; MODES CHAR = 100000 ;CHARACTER MODE SHORTV = 104000 ;SHORT VECTOR MODE POINT = 114000 ;POINT MODE ; MODE MODIFIERS LINE0 = 4 ;SOLID LINES BLKOFF = 20 ;BLINK OFF BLKON = 30 ;BLINK ON LPOFF = 100 ;LIGHT PEN OFF INT4 = 3000 ;INTENSITY 4 ; COMMANDS DJMP = 160000 ;DISPLAY JUMP DSTOPN = 173000 ;STOP! DSTOP = 173400 ;STOP & INTERRUPT ; VECTOR MODE DATA MISVY = 100 ;SHORT NEGATIVE Y MISVX = 20000 ;SHORT NEGATIVE X INTX = 40000 ;INTENSIFY .SBTTL LOAD DISPLAY'S CSR ADDRESS INTO THE ROOT .PSECT SCRCTL,RO,D,GBL,REL,OVR ORG SCRCTL .ASSUME . EQ SCRCTL DPCVEC: .BLKW ;DPU'S VECTOR ADDRESS .ASSUME . EQ SCRCTL+2 ..DPC == . ;**PATCH** VT11/VS60 DISPLAY PC ADDRESS DPCADR: .WORD 172000 ;DPU'S CSR ADDRESS .SBTTL INTERNAL MACRO ;+ ; THIS MODULE IS WRITTEN TO BE LOADED ANYWHERE IN MEMORY. ; ALL RELOCATABLE REFERENCES ARE MARKED WITH THE 'PICREF' ; MACRO DEFINED BELOW. THE ENTRY POINT ("SCPLOD") WILL ; CORRECT ALL ADDRESS REFERENCES. ;- .MACRO PICREF ADDR,TOROOT .IRP NUM,<\PICNUM> .IF NB $PIC'NUM = ADDR+1 .IFF ;NB TOROOT $PIC'NUM = ADDR .ENDC ;NB TOROOT .ENDM PICNUM = PICNUM+1 .ENDM PICREF PICNUM = 0 ;START COUNTER AT ZERO .SBTTL CODE THAT IS ALWAYS RESIDENT (ONCE LOADED!) ORG TECOIO .ENABL LSB SCOPE: BIT #ET$RFS,ETYPE(R5) ;DO WE HAVE A VT11/VS60? BEQ 30$ ;BRANCH IF NOT, DON'T DO A THING TST NFLG(R5) ;IS THIS REALLY THE :W CALL? BMI 30$ ;BRANCH IF IT IS, WE DON'T HANDLE IT TST R0 ;WHAT SHOULD WE DO? BGT REFRSH ;>0 => REFRESH THE SCREEN BMI 30$ ;<0 => IGNORE THE CALL CLR GSTOPF ;=0 => TURN DISPLAY OFF, BRING DPU TO HALT 10$: TST GHALTD ;IS DPU HALTED? BNE 10$ ;BRANCH 'TILL DPU IS STOPPED... RELINK: MOV R0,-(SP) ;SAVE R0 MOV SCROLP,R0 ;ANY SCROLLER TO LINK TO? BEQ 20$ ;BRANCH IF NONE CMP (R0),LINK ;ONE, ARE WE LINKED INTO IT? BEQ 20$ ;NOPE, EVERYTHING'S ALREADY O.K. MOV LINK,(R0) ;ELSE RE-LINK IT TO ITSELF MOV LCTSAV,SCMAX-SCLINK(R0) ; AND RESTORE LINE COUNT MOV (R0),@DPCADR ; THEN RESTART SCROLLER PICREF .-2,TOROOT ;**PIC** UPDATED TO CORRECT ADDRESS 20$: MOV (SP)+,R0 ;RESTORE R0 30$: RETURN ;EXIT .DSABL LSB GTINT: TST GSTOPF ;FLAG TO STOP? BNE 10$ ;BRANCH IF DON'T STOP CLR GHALTD ;INDICATE DPU STOPPED RTI ;EXIT FROM INTERRUPT 10$: INC @DPCADR ;RESTART DISPLAY PICREF .-2,TOROOT ;**PIC** UPDATED TO CORRECT ADDRESS RTI ;EXIT FROM INTERRUPT .SBTTL DO A SCOPE REFRESH REFRSH: SAVREG ;SAVE ALL REGISTERS CMP R0,LINMAX ;TOO MANY LINES? BLOS 10$ ;NOPE MOV LINMAX,R0 ;YEP, SO RESET IT TO LEGAL MAXIMUM 10$: MOV R0,R1 ;COPY THE NUMBER OF LINES ASL R1 ;MAKE IT *2 INC R1 ; THEN +1 (TOTAL # OF LINES) MOV R1,LINNUM ;SAVE THE MAXIMUM LINE COUNT MOV P(R5),R4 ;SAVE CURRENT TEXT BUFFER POINTER NEG R0 ;GO BACKWARDS N LINES CALLX .VVV.V ; USING TECO'S MOVER MOV R4,P(R5) ;RESTORE TEXT POINTER ADD TXSTOR(R5),R4 ;COMPUTE CURSOR POINTER MOV R4,CURSR ; AND SAVE IT MOV ZZ(R5),OLDTXT ;SET END AS END OF TEXT BUFFER MOV DSPBUF,R4 ;POINT TO DISPLAY BUFFER CLR GSTOPF ;BRING DPU TO HALT 20$: TST GHALTD ;IS DPU HALTED? BNE 20$ ;BRANCH 'TILL DPU IS STOPPED... MOV #DISEND,DISLNK ;DO A NULL LINK UP INITIALLY PICREF .-4 ;**PIC** UPDATED TO CORRECT ADDRESS CALL LODBUF ;NOW GO INITIALLY LOAD THE DISPLAY BUFFER CMP R1,R3 ;ARE WE AT THE END OF THE TEXT BUFFER? BNE 30$ ;NOPE MOVB #DEL,(R4)+ ;YEP, FLAG END WITH A DELETE (BLOB) 30$: CALL DJMPIN,R0,0 ;INSERT A BLANK 'DJMP' MOV DISLNK,-2(R4) ; AND FILL IT IN MOV OLDBUF,DISLNK ; THEN DO A LINK UP TST LINNUM ;CAN WE DO MORE LINES? BLE DONE ;NOPE, SO DON'T MOV P(R5),-(SP) ;YEP, (RE-)SAVE TEXT BUFFER POINTER MOV OLDTXT,P(R5) ; THEN SET OLD STARTING POINT AS THE POINTER MOV #-1,R0 ;SET TO MOVE BACK ONE MORE LINE CALLX .VVV.V ; AND GO DO IT USING TECO'S MOVER MOV (SP)+,P(R5) ;RESTORE CORRECT TEXT BUFFER POINTER CMP R1,OLDTXT ;DID WE REALLY MOVE? BHIS DONE ;NO, AT START OF TEXT, QUIT CALL LODBUF ;PUT SOME MORE INTO THE DISPLAY BUFFER BCS DONE ;QUIT EARLY FOR SOME REASON, WE'LL QUIT ALSO TST R2 ;DID WE END UP BACK AT COLUMN ZERO? BEQ 30$ ;YEP, GO LOOP AROUND AGAIN... .BR DONE ;NOPE, QUIT NOW, DISPLAY WOULDN'T BE CORRECT .SBTTL TURN THE DISPLAY (BACK) ON DONE: MOV DPCVEC,R1 ;GET THE VT11/VS60 VECTOR ADDRESS PICREF .-2,TOROOT ;**PIC** UPDATE TO CORRECT ADDRESS MOV #GTINT,(R1)+ ;SET VECTOR PC PART PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS MOV #340,(R1) ; AND PS TO PRIORITY 7 MOV SP,GSTOPF ;DON'T STOP THE DPU MOV SP,GHALTD ; AND INDICATE DISPLAY RUNNING MOV SCROLP,R0 ;POINT TO THE SCROLLER LINK WORD BEQ 10$ ;NONE, JUST START THE DISPLAY CMP (R0),#DISSRT ;ONE, ARE WE ALREADY LINKED TO IT? PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS BEQ 10$ ;WE'RE IN THE LOOP, JUST (RE-)START DPU MOV SCLCNT,SCMAX-SCLINK(R0) ;ELSE SHORTEN # LINES IN SCROLLER MOV #DISSRT,(R0) ; AND LINK THE BUFFER INTO THE SCROLLER PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS RETURN ; THEN EXIT 10$: MOV #DISINI,@DPCADR ;(RE-)START THE DPU PICREF .-4 ;**PIC** UPDATED TO CORRECT ADDRESS PICREF .-2,TOROOT ;**PIC** UPDATED TO CORRECT ADDRESS RETURN ; AND EXIT .SBTTL INSERT A 'DJMP' INTO THE DISPLAY BUFFER ;+ ; DJMPIN - INSERT A 'DJMP' INTO THE DISPLAY BUFFER. ; ; R4 -> INTO THE DISPLAY BUFFER ; ; CALL DJMPIN,R0,<'DJMP' TARGET> ; ; R4 -> 'DJMP' TARGET WORD +2 ;- DJMPIN: CLRB (R4)+ ;FORCE EVEN BIC #1,R4 ; BOUNDARY MOV #DJMP,(R4)+ ;INSERT 'DJMP' MOV (R0)+,(R4)+ ;INSERT WORD OF ADDRESS RETURN R0 ; AND EXIT .SBTTL LOAD THE DISPLAY BUFFER ;+ ; LODBUF - LOAD THE DISPLAY BUFFER. ; ; R1 -> TEXT TO DO (RELATIVE) ; R4 -> INTO DISPLAY BUFFER ; OLDTXT -> JUST BEYOND TEXT TO DO (RELATIVE) ; LINNUM = MAXIMUM NUMBER OF LINES TO DISPLAY ; ; CALL LODBUF ; ; R0 = UNDEFINED ; R1 -> JUST BEYOND TEXT JUST DONE (ABSOLUTE) ; R2 = ENDING COLUMN NUMBER ; R3 -> JUST BEYOND TEXT TO DO (ABSOLUTE) ; R4 -> WHERE WE LEFT OFF IN THE DISPLAY BUFFER ; OLDTXT -> TEXT JUST DONE (RELATIVE) ; OLDBUF -> START OF TEXT JUST DONE IN DISPLAY BUFFER ; LINNUM = MAXIMUM NUMBER OF LINES STILL POSSIBLE TO DO ; ; IF C=0 ('BCC') THEN ALL COMPLETED ; IF C=1 ('BCS') THEN STOPPED EARLY FOR ONE REASON OR ANOTHER ;- LODBUF: MOV OLDTXT,R3 ;GET POINTER TO WHERE WE SHOULD STOP ADD TXSTOR(R5),R3 ; AND MAKE IT ABSOLUTE MOV R1,OLDTXT ;SAVE THE STARTING POINT IN TEXT BUFFER MOV R4,OLDBUF ; AND THE STARTING POINT IN DISPLAY BUFFER ADD TXSTOR(R5),R1 ;MAKE THE TEXT BUFFER POINTER ABSOLUTE DEC R4 ;PRE-CORRECT FOR THE CORRECTION BELOW 10$: INC R4 ;INCLUDE THE IN THE DISPLAY BUFFER CLR R2 ; AND (RE-)START AT COLUMN 0 20$: CMP #72.,R2 ;ABOUT TO OVERFLOW A LINE? BHI 40$ ;BRANCH IF NOT CMP R1,R3 ;CAN WE LOOK AHEAD A CHARACTER? BHIS 40$ ;NOPE, SO NO OVERFLOW SEQUENCE MOV #OVRSEQ,R0 ;GET POINTER TO OVERFLOW SEQUENCE INFORMATION PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS CMPB (R1),(R0) ;AVOID OVERFLOW ON BEQ 40$ ;IT'S ... TST R2 ;ARE WE ALREADY INTO OVERFLOWS? BMI 40$ ;YEP, WE'VE EMITTED THE SEQUENCE, CONTINUE COM R2 ;NOPE, SAY INTO OVERFLOWS BIT #ET$TRU,ETYPE(R5) ;WHAT KIND OF OVERFLOW PROCESSING? BNE 30$ ;TRUNCATED LINES (C=1 FROM 'COM') MOVB (R0),(R4)+ ;WRAPPED LINES, RESTORE THE CARRIAGE CALL 80$ ; AND GO INSERT A LINE FEED INTO BUFFER BLE 100$ ;OUT OF LINE TO DISPLAY, GO EXIT C=1 CLR R2 ;RESET COLUMN NUMBER TO ZERO TST (R2)+ ; THEN ADVANCE TO COLUMN #2 (C=0 FROM 'TST') 30$: MOVB -(R0),(R4)+ ;MOVE IN MOVB -(R0),(R4)+ ; THE OVERFLOW MOVB -(R0),(R4)+ ; SEQUENCE BCS 40$ ;WE'RE TRUNCATING LINES, ALL SET MOVB -(R0),(R4)+ ;ELSE ADD A SPACE, THEN CONTINUE 40$: CMP CURSR,R1 ;ARE WE AT THE CURSOR? BNE 60$ ;NO CALL DJMPIN,R0,UPCUR ;INSERT A 'DJMP' TO UP CURSOR ROUTINE PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS CMP R1,R3 ;IS THERE A NEXT CHARACTER TO LOOK AT? BHIS 50$ ;NO CMPB (R1),#LF ;ARE WE BEFORE A LINE FEED? BNE 50$ ;NO MOV #DWNCUR,-2(R4) ;YES, CHANGE TO A DOWN CURSOR PICREF .-4 ;**PIC** UPDATED TO CORRECT ADDRESS 50$: MOV R4,CURETN ;SET THE CURSOR ROUTINE RETURN LINK 60$: CMP R1,R3 ;ARE WE OUT OF TEXT TO DO? BHIS 110$ ;BRANCH IF DONE, EXIT C-BIT=0 (FROM 'BHIS') CMP CHICKN,R4 ;ARE WE TOO CLOSE FOR COMFORT? BLO 110$ ;YES, QUIT NOW, EXIT C-BIT=1 (FROM 'BLO') MOVB (R1)+,(R4) ;GET A BYTE OF TEXT BICB #^C<177>,(R4) ; AND TRIM TO 7-BIT ASCII CMPB (R4),#CR ;IS IT CARRIAGE RETURN? BEQ 10$ ;YEP, OVERFLOWS ALWAYS TURNED OFF BY TST R2 ;NOPE, ARE WE INTO OVERFLOWS? BMI 40$ ;WE'RE IN OVERFLOWS, IGNORE THE CHARACTER INC R2 ;ELSE COUNT FOR S CMPB (R4),#DEL ;IS IT DELETE? BEQ 150$ ;BRANCH IF DELETE, TREAT AS CTRL CHAR CMPB #SPACE,(R4)+ ;IS IT SPECIAL? BLOS 20$ ;BRANCH IF NOT CMPB #TAB,-(R4) ;IS IT A ? BEQ 130$ ;BRANCH IF IT IS BHI 150$ ;BRANCH IF LOWER THAN , REGULAR CTRL CHAR CMPB #CR,(R4)+ ;IS IT HIGHER THAN ? BLO 140$ ;BRANCH IF HIGHER THAN , MAY BE ESCAPE DEC R2 ;IT'S , , OR , CORRECT COLUMN # MOV #90$,-(SP) ; AND SET A FINAL RETURN ADDRESS PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS CMPB -(R4),#VT ;IS IT , , OR ? BLO 80$ ;IT'S , SINGLE SPACE W/ 1 LINE FEED BEQ 70$ ;IT'S , DOUBLE SPACE W/ 2 LINE FEEDS MOV PC,-(SP) ;IT'S , QUADRUPLE SPACE W/ 4 LINES FEEDS 70$: MOV PC,-(SP) ;DO THE BELOW TWICE 80$: MOVB #LF,(R4)+ ;INSERT A LINE FEED INTO DISPLAY BUFFER DEC LINNUM ; AND SAY WE'RE GOING TO THE NEXT LINE RETURN ;EXIT WITH CC'S SET AS TO # LINES REMAINING 90$: BGT 20$ ;LINE REMAIN, CONTINUE 100$: SEC ;OUT OF LINE TO DISPLAY, SET C=1 FOR EXIT 110$: RETURN ;EXIT, C=0 => ALL DONE, C=1 => QUIT EARLY 120$: INC R2 ;BUMP COLUMN COUNTER 130$: MOVB #SPACE,(R4)+ ;PUT OUT A BLANK BIT #7,R2 ;ARE WE DONE? BNE 120$ ;NO, KEEP GOING BR 20$ ;YEP, CONTINUE 140$: CMPB #ESC,-(R4) ;IS IT AN ESCAPE? BNE 150$ ;NOPE, REGULAR CTRL CHAR MOVB #'$,(R4)+ ;PRINT ESCAPE AS A DOLLAR SIGN BR 20$ ; THEN CONTINUE THE LOOP 150$: MOVB (R4),R0 ;GET THE CTRL CHAR MOVB #'^,(R4)+ ;PREFIX IT WITH AN UPARROW ADD #100,R0 ;RE-FORMAT CTRL CHAR BIC #^C<177>,R0 ; AS A NORMAL GRAPHIC MOVB R0,(R4)+ ; THEN RE-STORE IT INC R2 ;COUNT THE PREFIX CHARACTER BR 20$ ; AND CONTINUE .SBTTL DATA THAT IS ALWAYS RESIDENT (BOTH READ AND WRITE...) CFACTR = 40. ;CHICKEN FACTOR XSZ = 7. ;X SIZE OF CURSOR YSZ = 12. ;Y SIZE OF CURSOR GSTOPF: .WORD 0 ;STOP FLAG, 0=>STOP GHALTD: .WORD 0 ;DPU HALTED INDICATOR, 0=>HALTED SCROLP: .WORD 0 ;SAVED POINTER TO SCROLL LOOP (0=>NONE) LCTSAV: .BLKW ;SAVED LINE COUNT FROM SCROLLER SCLCNT: .BLKW ;OUR SCROLL COUNT LINMAX: .BLKW ;MAXIMUM WINDOW SIZE DSPBUF: .BLKW ;START OF THE DISPLAY BUFFER CHICKN: .WORD -CFACTR ;CHICKEN FACTOR LINNUM: .BLKW ;MAXIMUM NUMBER OF LINES TO DISPLAY CURSR: .BLKW ;CHARACTER POSITION OF CURSOR OLDTXT: .BLKW ;LAST STARTING POINT IN TEXT BUFFER OLDBUF: .BLKW ;LAST STARTING POINT IN DISPLAY BUFFER DISEND: .WORD DSTOP ;STOP & INTERRUPT DISINI: .WORD POINT!INT4!LPOFF!BLKOFF!LINE0 ;INIT SCOPE .WORD 0 SCRTOP: .BLKW ;MAXY FOR SCROLLER .WORD DJMP ;LINK TO SCROLLER IF PRESENT LINK: .WORD DISSRT ;ELSE LINK TO OURSELF PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS DISSRT: .WORD POINT!INT4!LPOFF!BLKOFF!LINE0 ;INIT SCOPE .WORD 0 YPOS: .WORD 1350 ;Y POSITION FOR 12" SCREEN .WORD CHAR ;CHARACTER MODE .WORD DJMP ;LINK TO DISLNK: .BLKW ; OUR DATA BUFFER .ENABL LSB UPCUR: ;NORMAL CURSOR ROUTINE .WORD SHORTV!BLKON ;SHORT VECTORS, BLINK ON .WORD YSZ!INTX ;Y SIZE OF CURSOR, INTENSIFY .WORD YSZ!MISVY ;Y SIZE OF CURSOR, SHORT NEGATIVE Y 10$: .WORD XSZ*200!INTX ;X SIZE OF CURSOR, INTENSIFY .WORD XSZ*2*200!MISVX ;X SIZE OF CURSOR, SHORT NEGATIVE X .WORD XSZ*200!INTX ;X SIZE OF CURSOR, INTENSIFY .WORD CHAR!BLKOFF ;CHARACTER MODE, BLOCK OFF .WORD DJMP ;LINK TO CURETN: .BLKW ; REST OF DATA BUFFER DWNCUR: ;CURSOR ROUTINE FOR BETWEEN & .WORD SHORTV!BLKON ;SHORT VECTORS, BLINK ON .WORD YSZ!MISVY ;Y SIZE OF CURSOR, SHORT NEGATIVE Y .WORD YSZ!INTX ;Y SIZE OF CURSOR, INTENSIFY .WORD DJMP ;LINK TO .WORD 10$ ; REST OF CURSOR ROUTINE PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS .DSABL LSB .BYTE SPACE ;SPACE .BYTE 17 ;SHIFT-IN .BYTE 'W-100 ;CONTROL/W (RIGHT ARROW) .BYTE 16 ;SHIFT-OUT OVRSEQ: .BYTE CR ;SPECIAL SEQUENCE FOR LONG LINES .EVEN .SBTTL INITIAL REFRESH SCOPE SET UP ;+ ; SCPLOD - INITIAL REFRESH SCOPE SET UP. ; ; R1 = "SCROLL" OFFSET VALUE FROM RMON ; R5 -> START OF AVAILABLE MEMORY (FOR THE DISPLAY BUFFER) ; ; CALL SCPLOD ; ; R0 = UNDEFINED ; R1 = ENTRY POINT FOR REFRESH SCOPE "WATCH" COMMANDS ; R2 = UNDEFINED ; R3 = DEFAULT "NWATCH" VALUE ; R4 = SIZE OF THE DISPLAY BUFFER (0 => NO SCOPE SUPPORT ENABLED) ; R5 -> (NEW) START OF AVAILABLE MEMORY (AFTER THE DISPLAY BUFFER) ;- SCPLOD::MOV PC,R0 ;GET OUR REAL ABSOLUTE POSITION SUB #.,R0 ; THEN MAKE IT OUR POSITION CHANGE MOV #PICREF,R2 ;GET LIST OF ADDRESS REFERENCES TO CHANGE ADD R0,R2 ; MAKING IT CORRECT 10$: MOV (R2)+,R3 ;GET NEXT CHANGE LOCATION FROM LIST BEQ 30$ ;NO MORE, DONE ADD R0,R3 ;ELSE FIND THE REAL ADDRESS TO CHANGE BIT R3,#1 ;IS THIS A REFERENCE TO THE ROOT? BNE 20$ ;YES ADD R0,(R3) ;NO, DO A NORMAL ADDRESS RELOCATION BR 10$ ; THEN LOOP FOR MORE... 20$: BIC #1,R3 ;REMOVE THE "TO ROOT" INDICATION SUB R0,(R3) ;DO A "TO ROOT" (BACKWARDS) ADDRESS RELOCATION BR 10$ ; THEN LOOP FOR MORE... 30$: MOV DPCADR,R3 ;GET THE DISPLAY PC REGISTER POINTER PICREF .-2,TOROOT ;**PIC** UPDATED TO CORRECT ADDRESS CLR R2 ;USED FOR SCREEN SIZE & SCROLLER SET UP MOV R1,R0 ;COPY POINTER TO SCROLLER, IF ANY BEQ 40$ ;NO SCROLLER, REMEMBER THAT TST (R2)+ ;ELSE INDICATE SCROLLER ADD #SCLINK,R0 ;POINT TO LINK WORD IN SCROLLER MOV R0,SCROLP ; AND REMEMBER IT MOV (R0),LINK ;LINK OUR BUFFER TO THE SCROLLER MOV SCMAX-SCLINK(R0),LCTSAV ;PRESERVE ITS COUNT MOV #SCRSZR,(R0) ;CAUSE SCROLLER TO RUN SCREEN TEST PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS ADD #DPS-DPC,R3 ;POINT TO THE DPU STATUS BR 50$ ; AND GO WAIT FOR COMPLETION 40$: MOV #SCRSZR,(R3)+ ;START SCREEN TEST PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS .ASSUME DPS EQ DPC+2 50$: MOV (R3),R0 ;WAIT FOR DONE BPL 50$ ; IN A SMALL LOOP... BIT R0,#EDGEFL ;IS EDGE FLAG SET? BNE 60$ ;BRANCH IF 12" SCREEN INC R2 ;INDICATE 17" SCREEN MOV #1750,YPOS ; AND CORRECT MY Y POSITION 60$: ASL R2 ;FORM ASL R2 ; FOR ASL R2 ; INDEX INTO 4 WORD ENTRY TABLES ADD #DPARMS,R2 ;MAKE ABSOLUTE POINTER PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS MOV (R2)+,R3 ;SET CORRECT DEFAULT "NWATCH" VALUE MOV R3,LINMAX ; WHICH IS MAXIMUM LINE WINDOW MOV (R2)+,SCRTOP ;SET MAXY FOR SCROLLER MOV (R2)+,SCLCNT ;SET SCROLLER COUNT MOV (R2),R4 ;GET SIZE OF BUFFER CMP R5,#SCPLOD ;DOES AVAILABLE MEMORY START AFTER OUR CODE? PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS BHIS 70$ ;YEP MOV #SCPLOD,R5 ;NOPE, UPDATE TO REAL AVAILABLE MEMORY PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS 70$: MOV R5,DSPBUF ;SET START OF THE DISPLAY BUFFER ADD R4,R5 ; THEN GO JUST BEYOND IT ADD R5,CHICKN ;SET UP "NEAR END" POINTER MOV #SCOPE,R1 ;SET OUR ENTRY POINT ADDRESS PICREF .-2 ;**PIC** UPDATED TO CORRECT ADDRESS CMP R5,@#USRADR ;DOES THAT CROSS INTO USR? BLOS 80$ ;NO, IT'S USABLE BY US THEN CLR R4 ;YES, NO SUPPORT POSSIBLE, ZERO BUFFER SIZE 80$: CALLR RELINK ;RE-LINK SCROLLER IF NEEDED & EXIT .SBTTL PIC REFERENCE RELOCATION LIST PICREF: ;PIC CODE RELOCATION LIST $$$$$$ = 0 .REPT PICNUM .IRP NUM,<\$$$$$$> .WORD $PIC'NUM .ENDM $$$$$$ = $$$$$$+1 .ENDR .WORD 0 ;END OF LIST .SBTTL DATA FOR INITIALIZATION SCRSZR: ;SIZE THE SCREEN ROUTINE .WORD POINT ;POINT MODE .WORD 0 ; .WORD 1500 ; .WORD DSTOPN ;STOP! DPARMS: .WORD 31./2 ;12" SCREEN (31. LINES BY 72. ROWS) .WORD 1350 ;Y START .WORD 0 ;NO SCROLLER .WORD 31.-5*74.+100. ;BUFFER SIZE .WORD 40./2 ;17" SCREEN (40. LINES BY 80. ROWS) .WORD 1750 ;Y START .WORD 0 ;NO SCROLLER .WORD 40.-5*74.+100. ;BUFFER SIZE .WORD 31.-1-5/2 ;12" SCREEN (31. LINES W/ 5 SCROLLED) .WORD 24.*5 ;Y START .WORD 5 ;NUMBER OF LINES TO SCROLL .WORD 31.-1-5-5*74.+100. ;BUFFER SIZE .WORD 40.-1-6/2 ;17" SCREEN (40. LINES W/ 6 SCROLLED) .WORD 24.*6 ;Y START .WORD 6 ;NUMBER OF LINES TO SCROLL .WORD 40.-1-6-5*74.+100. ;BUFFER SIZE .END