NEW AUTO 3,1 *-------------------------------- MOVE.LF LDA POSV CMP MAXV IS HE ON *EOF* BCS .2 YES, DONT CHANGE POSH LDY POSH CPY #START.COL IF ALREADY ON BEGINNING BEQ .2 DON'T MOVE LEFT CPY LEFT.MARGIN IF NOT ON CURRENT MARGIN BNE .1 GO MOVE LEFT JSR LEFT.PAGE OTHERWISE PAGE LEFT DEC POSH THEN MOVE LEFT RTS SHOW SCREEN SINCE HORIZONTAL PAGE .1 DEC POSH MOVE LEFT .2 INC NO.SHOW.FLAG DON'T SHOW SCREEN RTS UNLESS A HORIZONTAL PAGE DONE *-------------------------------- MOVE.RT LDA POSV CMP MAXV IS HE ON *EOF* BCS INC.FLG YES, DONT CHANGE POSH LDA RT.FENCER DON'T MOVE RIGHT IF CMP POSH HE IS ON LAST COLUMN BEQ INC.FLG LDY RIGHT.MARGIN GET RIGHT MARGIN DEY CPY POSH IS HE IS NOT ON IT BNE .1 THEN MOVE RIGHT JSR RIGHT.PAGE ELSE HORIZONTAL PAGE LDY RIGHT.MARGIN DEY CPY POSH SEE IF HE IS BEQ .3 STILL ON RIGHT MARGIN INC POSH MOVE RIGHT IF NOT .3 RTS .1 INC POSH MOVE RIGHT INC.FLG INC NO.SHOW.FLAG DON'T SHOW SCREEN UNLESS RTS HORIZONTAL PAGE DONE *-------------------------------- RIGHT.PAGE LDA LEFT.MARGIN HORIZONTAL PAGE RIGHT CLC ADC HORT.PAGE CMP RT.FENCEL UNLESS PAST RIGHTMOST LIMIT BCS .1 YES, PAST LIMIT CMP POSH SEE IF POSH STILL ON SCREEN BCC .2 YES STA POSH NO, MAKE IT FIT ON LEFT MARGIN BCS .2 ...ALWAYS .1 LDA LEFT.MARGIN CMP RT.FENCEL WAS HE ALREADY ON RIGHTMOST LIMIT BEQ INC.FLG YES, LET HIM HANG THERE LDA POSH COMPUTE NEW POSH SEC REMOVE LEFT MARGIN BIAS SBC LEFT.MARGIN CLC ADC RT.FENCEL ADD RIGHTMOST MARGIN LIMIT BIAS STA POSH LDA RT.FENCEL SET NEW LEFT MARGIN .2 JMP SET.MARGIN *-------------------------------- LEFT.PAGE LDA #START.COL SEE IF DOING A LEFT PAGE CLC MAKES LEFT MARGIN BEFORE THE ADC HORT.PAGE FIRST COLUMN CMP LEFT.MARGIN BEQ .1 DO THE LEFT PAGE BCC .1 DO THE LEFT PAGE LDA #START.COL SET LEFT MARGIN TO COL 1 CMP LEFT.MARGIN UNLESS IT IS ALREADY THERE BNE LIMITM NOT COL 1, SO USE COL 1 BEQ INC.FLG YES COL 1, SO STAY THERE .1 LDA LEFT.MARGIN LEFT.MARGIN - HORT.PAGE SEC IS NEW LEFT MARGIN SBC HORT.PAGE LIMITM JSR SET.MARGIN SET NEW LEFT MARGIN **** RIGHT.MARGIN IS IN A REG LIMITR CMP POSH IF RIGHT.MARGIN <= POSH BEQ .1 THEN SET NEW POSH BCS .2 ELSE EXIT .1 SEC SET NEW POSH = RM-1 SBC #1 TO KEEP THE CURSOR STA POSH STILL ON SCREEN .2 RTS *-------------------------------- LN.TOGL LDA #START.COL TOGGLE LINE NUMBERS ON/OFF EOR LN.FLAG BY EOR WITH COL 1 POSN STA LN.FLAG TOGGLES BETWEEN 0 AND 6 STA RM.ADJUST TOGGLES BETWEEN 0 AND 6 LDA LEFT.MARGIN SET NEW LEFT MARGIN BNE LIMITM AND LIMIT POSH INSIDE WINDOW *-------------------------------- MOVE.UP LDA POSV ARE WE ON TOP LINE CMP FIRST.LINE BNE .1 NO JSR FIND.LAST.PAGE GET LAST 32 LINES LENGTHS JMP GET.LINE AND PULL 1 LINE OFF SCROLL STACK .1 DEC POSV MOVE POSV UP INC NO.SHOW.FLAG RTS *-------------------------------- MOVE.DN LDA POSV CMP MAXV ARE WE ON *EOF* BCS .2 YES, STAY THERE! CMP LAST.LINE ARE WE ON BOTTOM LINE BCC .1 NO SO MOVE DOWN JMP POP.LINE ELSE PUT LINE ON SCROLL STACK .1 INC POSV MOVE DOWN LDA POSV CMP MAXV IF MOVED DOWN TO *EOF* BNE .2 NO LDA LEFT.MARGIN YES, CURSOR TO LEFT STA POSH DONT LET IT DANGLE PAST *EOF* .2 INC NO.SHOW.FLAG DONT SHOW NEW SCREEN RTS *-------------------------------- ROLL.U100 LDA ROLL.VALUE2 GET LONG SCROLL VALUE BNE ROLL.U ROLL.UP JSR GET.ROLL.VALUE GET SHORT SCROLL VALUE ROLL.U STA CTR PUT IN COUNTER .1 JSR POP.LINE PUT LINES ON SCROLL STACK DEC CTR UNTIL CTR GOES ZERO BNE .1 RTS *-------------------------------- ROLL.D100 LDA ROLL.VALUE2 GET LONG SCROLL VALUE BNE ROLL.D ROLL.DN JSR GET.ROLL.VALUE GET SHORT SCROLL VALUE ROLL.D SEC SBC #32 IS THERE AT LEAST 32 LINES BCC .1 NO PHA YES, DO BLOCKS OF 32 LINES LDA #32 UNTIL LESS THAN 32 TO DO JSR .90 ROLL DOWN 32 LINES PLA JMP ROLL.D GO TRY FOR NEXT 32 LINES .1 ADC #32 ADD BACK OFFSET BEQ .99 EXIT IF EXACTLY 32 LINES .90 STA CTR ROLL DOWN LINES JSR FIND.LAST.PAGE FIND LAST 32 LINE LENGTHS .91 JSR GET.LINE GET THEM FROM SCROLL STACK DEC CTR BNE .91 .99 RTS *-------------------------------- GET.ROLL.VALUE LDA LAST.LINE IF L-F+1 < ROLL SEC THEN USE L-F+1 SBC FIRST.LINE ELSE USE ROLL CLC ADC #1 CMP ROLL.VALUE BCC RTS2 LDA ROLL.VALUE RTS2 RTS *-------------------------------- POP.LINE LDA PP.BEG STA PTR1 PTR1=PP.BEG CMP PP.END PP.BEG0 USE REPEAT CHAR LDA (SRCP),Y ELSE GET SOURCE CHAR BPL GNBI BUMP PTR IF NORMAL ASCII AND #$7F MASK HIGH BIT OF TOKEN OFF CMP #$40 $00-$3F IS BLANK COMPRESSION BCC .1 YES BLANK COMPRESSION JSR GNBI POSN TO NEXT BYTE JSR GNB GET BYTE STA RPTCNT USE AS REP COUNT LDA (SRCP),Y NEXT BYTE BNE .2 .1 AND #$3F MASK COUNT STA RPTCNT SAVE REP COUNT LDA #$20 BLANK IS REP CHAR .2 STA RPTCHR SET REP CHAR JSR GNBI BUMP TO NEXT BYTE .3 DEC RPTCNT COUNT DOWN REP CHAR LDA RPTCHR RETURN REP CHAR RTS *-------------------------------- GNB LDY #0 GET SOURCE BYTE LDA (SRCP),Y GNBI INC SRCP ADD 1 TO SRCP BNE .1 INC SRCP+1 .1 RTS *-------------------------------- MAN SAVE usr/src/fse/fse.s.3 LOAD usr/src/fse/fse.s ASM