From ac15ee428ed2d97e90b5ae479fbff6fb8ac67876 Mon Sep 17 00:00:00 2001 From: burniouf Date: Fri, 16 Feb 2024 18:51:17 +0100 Subject: [PATCH] FSE source code --- FSE/FSE.S.1.txt | 220 ++++++++++++++++++ FSE/FSE.S.2.txt | 522 ++++++++++++++++++++++++++++++++++++++++++ FSE/FSE.S.3.txt | 533 +++++++++++++++++++++++++++++++++++++++++++ FSE/FSE.S.A2.txt | 112 +++++++++ FSE/FSE.S.A2E.txt | 240 +++++++++++++++++++ FSE/FSE.S.LINE.txt | 479 ++++++++++++++++++++++++++++++++++++++ FSE/FSE.S.STB80.txt | 151 ++++++++++++ FSE/FSE.S.SUBMIT.txt | 234 +++++++++++++++++++ FSE/FSE.S.VIDEX.txt | 220 ++++++++++++++++++ FSE/FSE.S.txt | 138 +++++++++++ 10 files changed, 2849 insertions(+) create mode 100644 FSE/FSE.S.1.txt create mode 100644 FSE/FSE.S.2.txt create mode 100644 FSE/FSE.S.3.txt create mode 100644 FSE/FSE.S.A2.txt create mode 100644 FSE/FSE.S.A2E.txt create mode 100644 FSE/FSE.S.LINE.txt create mode 100644 FSE/FSE.S.STB80.txt create mode 100644 FSE/FSE.S.SUBMIT.txt create mode 100644 FSE/FSE.S.VIDEX.txt create mode 100644 FSE/FSE.S.txt diff --git a/FSE/FSE.S.1.txt b/FSE/FSE.S.1.txt new file mode 100644 index 00000000..0cad9d36 --- /dev/null +++ b/FSE/FSE.S.1.txt @@ -0,0 +1,220 @@ +NEW + AUTO 3,1 +*-------------------------------- +* BEWARE ZP USE!!! +*-------------------------------- +CH .EQ $24 MONITOR HORIZ POSN +CV .EQ $25 MONITOR VERT POSN +BASEL .EQ $28 MONITOR BASE ADRS +A2L .EQ $3E +A2H .EQ $3F +A4L .EQ $42 +A4H .EQ $43 +*-------------------------------- +SP.BEG .EQ $52,53 Changed! PROG CODE STACK BEGIN +SP.END .EQ $54,55 PROG CODE STACK END+1 +PP.BEG .EQ $56,57 PROG CODE BEGIN +PP.END .EQ $58,59 Changed! PROG CODE END+1 +*-------------------------------- + .DUMMY + .OR $C0 +LEFT.MARGIN .BS 1 INIT TO 6 +RIGHT.MARGIN .BS 1 INIT TO SCR.SIZE-1 +RM.ADJUST .BS 1 INIT TO 6 +POSH .BS 1 INIT TO 6 +POSV .BS 1 INIT TO 0 +ED.PTR .BS 1 EDIT LINE CHAR PTR +ED.KEY .BS 1 FIND CHAR KEY CODE +CTR .BS 1 GENERAL CTR FOR SCROLL ROUTINES +MAXV .BS 1 MAX POSV OF SCREEN SCROLL +LN.FLAG .BS 1 INIT TO 0 +FILL.TO .BS 1 COLUMN TO BLANK FILL TO +FIRST.LINE .BS 1 FIRST LINE OF SCRN (INIT 0) +LAST.LINE .BS 1 LAST LINE OF SCRN (INIT 23) +BLKSIZ .BS 1 +RPTCNT .BS 1 +RPTCHR .BS 1 +PTR1 .BS 2 +PTR2 .BS 2 +CUR.KEY .BS 1 CURRENT KEY +LNO .BS 2 LINE NUMBER FOR PRNT ROUTINE +SAV.CTR .BS 1 CTR FOR EDIT LINE +SAV.PTR1 .BS 2 PTR1 FOR EDIT LINE +SAV.LNO .BS 2 LNO FOR EDIT LINE +CV.DIGFLG .BS 1 FIRST NON-ZERO DIGIT FLG +NO.SHOW.FLAG .BS 1 SET TO PREVENT SHOW SCRN +SRCP .BS 2 + .ED +*-------------------------------- +WBUF .EQ $200 +M.RESET .EQ $3F2 THRU 3F4 +*-------------------------------- +M.BASCALC .EQ $FBC1 CALC BASE ADRS +M.BELL .EQ $FBDD RING BELL +M.COUT .EQ $FDED APPLE CHAR OUTPUT +*-------------------------------- +HARD JMP HINIT INIT SCREEN EDITOR +*-------------------------------- +START.COL .EQ 6 START OF LINE DATA IN BUFFER +*-------------------------------- +* +* STANDARD PARAMETER AREA +* +* THESE PARAMETERS ALLOW CUSTOMIZATION +* OF THE SCREEN EDITOR TO SUIT INDIVIDUAL TASTE. +*-------------------------------- +SCREEN.WIDTH .DA #SCR.SIZE WIDTH OF SCREEN +ROLL.VALUE .DA #24 (20 4 WM) SCREEN ROLL UP/DOWN VALUE +ROLL.VALUE2 .DA #100 BIG ROLL UP/DOWN VALUE +HORT.PAGE .DA #40 HORIZONTAL PAGE +RPT.CHAR .DA #'-' REPEAT CHAR FOR COMMENT LINE +RPT.LENG .DA #32 REPEAT LENGTH FOR COMMENT LINE +SKMOD.FLG .DA #$00 ($FF 4 WM) SHIFT KEY MOD FLAG +AUTO.REN .DA #$FF AUTO RENUMBER FLAG +AUTO.BASE .DA 1000 AUTO REN START LINE NUM +AUTO.INC .DA 10 AUTO REN INCREMENT LINE NUM +RT.FENCEL .DA #248-SCR.SIZE+START.COL RIGHTMOST HORTZ PAGE LIMIT +RT.FENCER .DA #248+START.COL-1 RIGHTMOST COLUMN ALLOWED +L.MARGIN .DA #START.COL LEFT MARGIN FOR CAR RETN POSN +* TAB TABLE 21 ENTRIES ZERO ON UNUSED ENTRIES +TAB.TBL .DA #1,#8,#12,#21,#26,#35,#50,#0,#0,#0 ENTRIES 1-10 + .DA #0,#0,#0,#0,#0,#0,#0,#0,#0,#0 ENTRIES 11-20 + .DA #0 END OF TABLE +SZ.TAB.TBL .EQ *-TAB.TBL +*-------------------------------- +* VARIABLE AREA BELOW $3D0 +* +* NOTE THAT WE SUBTRACT THE NEEDED SPACE +* FROM THE PREVIOUS DEFINED SYMBOL. I.E. +* 'LN.CNT' IS 32 BYTES BEFORE $3D0. +*-------------------------------- +VAR.END .EQ $3D0 +LN.CNT .EQ VAR.END-32 BACKWARD SCROLL LENGTH TABLE +INDEX .EQ LN.CNT-1 INDEX TO LN.CNT +COMPOSE.FLG .EQ INDEX-1 INIT TO 0 +SPECIAL.FLG .EQ COMPOSE.FLG-1 INIT TO 0 +MDIST .EQ SPECIAL.FLG-2 MOVE DISTANCE +ESC.FLAG .EQ MDIST-1 EDIT/SCROLL MODE FLG +ONCE.FLG .EQ ESC.FLAG-1 SPECIAL ESCAPE FLAG +CHANGE.FLG .EQ ONCE.FLG-1 EDIT LINE CHANGED / MUST SUBMIT +FORM.FLG .EQ CHANGE.FLG-1 SHOW FORM GUIDE (INIT 0) +ALPHA.FLG .EQ FORM.FLG-1 ALPHA SHIFT LOCK FLAG (INIT 0) +SAVE.RSTV .EQ ALPHA.FLG-2 SAVE RESET VECTOR +SAVE.3D1 .EQ SAVE.RSTV-2 SAVE OS SOFT VECTOR +SAVE.3D4 .EQ SAVE.3D1-2 SAVE OS HARD VECTOR +SAVE.36 .EQ SAVE.3D4-2 SAVE OUTPUT HOOK +SAVE.38 .EQ SAVE.36-2 SAVE INPUT HOOK +VAR.BEG .EQ save.38 + .DO VAR.BEG<$300 + *** ERROR VAR.BEG < $300 + .FIN +*-------------------------------- +* +* FUNCTION TABLE FOR SCROLL MODE +* KEYBOARD FUNCTIONS. +* +* BECAUSE OF KEYBOARD VARIATIONS BETWEEN APPLE II PLUS +* AND APPLE II E AND FRANKLIN KEYBOARDS SOME KEYS ARE +* DEFINED AS DUPLICATE FUNCTIONS TO IMPROVE THE HUMAN +* FACTORS OF KEY PLACEMENT. +* +* THE SHIFT 2 KEY ON AP2+ IS '"' BUT ON OTHER KEYBOARDS +* AN '@' IS THE SHIFT 2 KEY CODE. '"' AND '@' PERFORM +* THE SAME FUNCTION. +* +* THE HORIZONTAL SCROLL KEYS ':' AND '-' ON THE AP2+ KEYBOARD +* ARE NOT IN EASY REACH ON OTHER KEYBOARDS SO THE KEYS +* ',' AND '.' PERFORM THE SAME FUNCTION AND HAVE THE +* NICE SUGGESTIVE PROMPT OF THEIR SHIFT CODES '<' AND '>' +* TO POINT CORRECT SCROLL DIRECTION. +*-------------------------------- +FTBL .DA #'1,ROLL.UP-1 ROLL UP 24 LINES + .DA #'2,ROLL.DN-1 ROLL DOWN 24 LINES + .DA #'3,LN.TOGL-1 LINE NUMBER TOGGLE + .DA #'4,COMPOSE-1 COMPOSE MODE TOGGLE + .DA #'5,FORM.GUIDE-1 FORM GUIDE MODE TOGGLE + .DA #'W-$40,SET.LMARGIN-1 SET LEFT MARGIN + .DA #'/,GOTO.LINE-1 GOTO LINE# + .DA #'Q-$40,EXIT-1 QUIT FROM EDITOR + .DA #'B,SHOW.BEGIN-1 BEGINNING OF FILE + .DA #'E,SHOW.END-1 END OF FILE + .DA #'!,ROLL.U100-1 ROLL UP 100 LINES + .DA #'",ROLL.D100-1 AP2+ ROLL DOWN 100 LINES + .DA #'@,ROLL.D100-1 AP2E ROLL DOWN 100 LINES + .DA #':,LEFT.PAGE-1 AP2+ HORIZONTAL SCROLL LEFT + .DA #',,LEFT.PAGE-1 AP2E HORIZONTAL SCROLL LEFT + .DA #'-,RIGHT.PAGE-1 AP2+ HORIZONTAL SCROLL RIGHT + .DA #'.,RIGHT.PAGE-1 AP2E HORIZONTAL SCROLL RIGHT + .DA #'I,MOVE.UP-1 MOVE CRSR UP 1 LINE + .DA #'K-$40,MOVE.UP-1 MOVE CRSR UP 1 LINE + .DA #'M,MOVE.DN-1 MOVE CRSR DOWN 1 LINE + .DA #'J-$40,MOVE.DN-1 MOVE CRSR DOWN 1 LINE + .DA #'J,MOVE.LF-1 MOVE CRSR LEFT 1 CHAR + .DA #'H-$40,MOVE.LF-1 MOVE CRSR LEFT 1 CHAR + .DA #'K,MOVE.RT-1 MOVE CRSR RIGHT 1 CHAR + .DA #'U-$40,MOVE.RT-1 MOVE CRSR RIGHT 1 CHAR + .DA #'L-$40,INSERT-1 INSERT LINE + .DA #'Z-$40,DELETE-1 DELETE LINE + .DA #$1B,ESCAPE-1 ENTER EDIT MODE + .DA #'M-$40,RETURN-1 RETURN TO NEXT LINE + .DA #'P-$40,DINSERT-1 INSERT DASHED LINE COMMENT +**** SPECIAL EDIT MODE FORCING KEYS +**** THERE MUST BE NO CONFLICT WITH THE ABOVE +**** SCROLL MODE FUNCTION KEY CODES. + .DA #'@-$40,SPECIAL-1 CLEAR TO EOL + .DA #'A-$40,SPECIAL-1 TOGGLE ALPHA SHIFT LOCK + .DA #'B-$40,SPECIAL-1 BEGINING OF LINE + .DA #'C-$40,SPECIAL-1 COPY TO TAB + .DA #'D-$40,SPECIAL-1 DELETE CHAR + .DA #'F-$40,SPECIAL-1 FIND CHAR + .DA #'I-$40,SPECIAL-1 INSERT CHAR + .DA #'N-$40,SPECIAL-1 END OF LINE + .DA #'O-$40,SPECIAL-1 INSERT CNTRL CHAR + .DA #'S-$40,SPECIAL-1 SET/CLEAR TAB + .DA #'T-$40,SPECIAL-1 TAB +FTBL.Z .EQ *-FTBL + .DO FTBL.Z>256 + !!! SCROLL MODE FUNCTION TABLE TOO LARGE + .FIN +*-------------------------------- +* +* FUNCTION TABLE FOR EDIT MODE +* KEYBOARD FUNCTIONS. +* +*-------------------------------- +E.TBL + .DA #'@-$40,E.ZAP-1 CLEAR TO EOL + .DA #'A-$40,E.SHIFT-1 TOGGLE ALPHA SHIFT LOCK + .DA #'B-$40,E.BEG-1 BEGINNING + .DA #'C-$40,E.COPY-1 COPY TO TAB + .DA #'D-$40,E.DEL-1 DELETE CHAR + .DA #'F-$40,E.FIND-1 FIND CHAR + .DA #'H-$40,E.BKSP-1 BACKSPACE + .DA #'I-$40,E.INS-1 INSERT CHAR + .DA #'N-$40,E.END-1 END OF LINE + .DA #'O-$40,E.OVR-1 INSERT CONTROL CHAR + .DA #'R-$40,E.RESTORE-1 RESTORE LINE + .DA #'S-$40,E.SET.TAB-1 SET/CLEAR TAB + .DA #'T-$40,E.TAB-1 TAB TO NEXT POSN + .DA #'U-$40,E.RIT-1 RIGHT ARROW + .DA #$1B,E.ESC-1 ESCAPE FROM EDIT MODE +**** SCROLL MODE FUNCTIONS **** +**** THESE KEY CODES MUST NOT CONFLICT +**** WITH THE EDIT KEY CODES. + .DA #'J-$40,E.CTRL-1 MOVE DOWN + .DA #'K-$40,E.CTRL-1 MOVE UP + .DA #'L-$40,E.CTRL-1 INSERT LINE + .DA #'M-$40,E.CTRL-1 RETURN + .DA #'P-$40,E.CTRL-1 INSERT COMMENT LINE + .DA #'Q-$40,E.CTRL-1 QUIT + .DA #'W-$40,E.CTRL-1 SET LEFT MARGIN + .DA #'Z-$40,E.CTRL-1 DELETE LINE +E.TBLSZ .EQ *-E.TBL + .DO E.TBLSZ>256 + !!! EDIT MODE FUNCTION TABLE TOO LARGE + .FIN +*-------------------------------- +MAN +SAVE usr/src/fse/fse.s.1 +LOAD usr/src/fse/fse.s +ASM diff --git a/FSE/FSE.S.2.txt b/FSE/FSE.S.2.txt new file mode 100644 index 00000000..5f9cb77a --- /dev/null +++ b/FSE/FSE.S.2.txt @@ -0,0 +1,522 @@ +NEW + AUTO 3,1 +*-------------------------------- +HINIT LDA SP.BEG KILL SYMBOL TABLE + STA SP.END EDIT USES IT FOR + LDA SP.BEG+1 SCROLL LINE STACK + STA SP.END+1 + LDY #VAR.BEG ZERO DATA AREA + LDA #0 +.1 STA $300,Y + INY + CPY #VAR.END + BCC .1 + LDA #START.COL START IN THIS COLUMN + STA LEFT.MARGIN + STA POSH CURSOR IN COLUMN 1 + CLC + ADC SCREEN.WIDTH + STA RIGHT.MARGIN + LDA #23 + STA LAST.LINE OF SCROLL + LDX #0 + STX NO.SHOW.FLAG + STX RM.ADJUST NO LINE NUMBERS + STX LN.FLAG + STX FIRST.LINE OF SCROLL + STX POSV CURSOR ON LINE 0 + INX X=1 +.2 LDA M.RESET,X SAVE RESET VECTOR + STA SAVE.RSTV,X + LDA $3D1,X SAVE 3D1.3D2 + STA SAVE.3D1,X + LDA $3D4,X SAVE 3D4.3D5 + STA SAVE.3D4,X + LDA $36,X SAVE 36.37 + STA SAVE.36,X + LDA $38,X SAVE 38.39 + STA SAVE.38,X + LDA MY.VECTOR,X + STA M.RESET,X RESET TO ME + STA $3D1,X 3D0G TO ME + STA $3D4,X 3D3G TO ME + DEX + BPL .2 + TXS + JSR FIXRST FIX POWER UP BYTE + BCC DO.GOTO.LINE BA, BUT WATCH IT!!! $#* +*-------------------------------- +GOTO.LINE LDX #1 +.1 STX LNO + JSR READ.KEY.CODE + LDX LNO + STA WBUF,X + INX + CMP #'0' + BCC DO.GOTO.LINE + CMP #'9'+1 + BCC .1 + +DO.GOTO.LINE + + LDA #0 + STA LNO + STA LNO+1 + LDY #1 +.10 LDA WBUF,Y GET NEXT CHAR + INY + EOR #'0' MASK ASCII DIGIT + CMP #9+1 IS IT GOOD DIGIT + BCS .11 NO, USE LNO AS LINE TO GOTO + PHA SAVE DIGIT + LDA LNO MDIST=LNO + STA MDIST LNO=DIGIT + PLA + STA LNO + LDA LNO+1 + STA MDIST+1 + LDA #0 + STA LNO+1 + LDX #10 +.12 LDA LNO ADD MDIST TO LNO 10 TIMES + CLC + ADC MDIST + STA LNO + LDA LNO+1 + ADC MDIST+1 + STA LNO+1 + DEX + BNE .12 + BEQ .10 ...ALWAYS +.11 JSR SHOW.BEGIN +.1 JSR P1.INIT START LINE # SEARCH + LDA PTR1 + CMP PP.END + BNE .20 + LDA PTR1+1 + CMP PP.END+1 + BEQ .4 STOP AT EOF +.20 LDA LNO + LDY #1 + SEC + SBC (PTR1),Y COMPARE LINE LO + STA ED.KEY + LDA LNO+1 + INY + SBC (PTR1),Y COMPARE LINE HI + BCC .4 IF LNO START.COL + BCS .30 YES SO SET NEW MARGIN +.20 LDA #START.COL START.COL IS GOOD MARGIN +.30 CMP LEFT.MARGIN SEE IF ALREADY THERE + BEQ .1 YES + CMP RT.FENCEL MARGIN NOT PAST FENCE + BCC .0 + CMP RT.FENCER + BEQ .0 + BCC .0 + LDA RT.FENCEL +.0 JSR SET.MARGIN + JSR .4 +.1 LDA POSV + CMP MAXV WAS *EOF* HIT? + BCS .3 YES + CMP LAST.LINE WAS HE ON LAST LINE? + BCC .2 NO + JSR POP.LINE YES, MOVE SCREEN DOWN 1 LINE + JSR .4 MAKE SURE WE SHOW SCREEN + .HS 2C BIT abs opcode skips 2 .3 +.2 INC POSV +.3 LDA COMPOSE.FLG IF COMPOSE TOGGLE ON + BEQ .5 NO + JSR INSERT YES, INSERT NEW LINE +.4 LDA #0 MAKE SURE WE SHOW + STA NO.SHOW.FLAG SCREEN IF NEW LINE ADDED +.5 RTS +*-------------------------------- +SET.MARGIN STA LEFT.MARGIN + CLC + ADC SCREEN.WIDTH + SEC + SBC RM.ADJUST + STA RIGHT.MARGIN + RTS +*-------------------------------- +* RESET VECTOR IS SAVED SO WE CAN INTERCEPT IT. +* 3D0G AND 3D3G VECTORS SAVED FOR SOME PEOPLE +* WITH OLD NON AUTO-START ROMS THEY GO TO MONITOR +* AND WE CANT STOP IT. BUT WE CAN MODIFY DOS +* HARD AND SOFT RESTART VECTORS TO CATCH HIS RETURN. +* IN AND OUT HOOKS SAVED BECAUSE RESET CLOBERS +* THEM AND VIDEX, STB80 PATCHES SET THEM UP +* IT IS CRITICAL TO CATCH RESET BECAUSE THE PROGRAM MAY BE +* SPLIT UP IF USER IS NOT AT BEGINING OF FILE AND SCROLLED +* OFF SECTION CANT BE RECOVERED IF ASSEMBLER RESTARTS ON +* US WITHOUT OUR KNOWLEDGE. +*-------------------------------- + +MY.VECTOR .DA EXIT ADRS OF EDIT RESET HANDLER + +*-------------------------------- +EXIT LDX #1 +.1 LDA SAVE.RSTV,X RESORE RESET VECTOR + STA M.RESET,X + LDA SAVE.3D1,X 3D1.3D2 ALSO + STA $3D1,X + LDA SAVE.3D4,X 3D4.3D5 ALSO + STA $3D4,X + LDA SAVE.36,X 36.37 ALSO + STA $36,X + LDA SAVE.38,X 38.39 ALSO + STA $38,X + DEX + BPL .1 + TXS save dem bytes! + JSR FIXRST FIX POWER UP BYTE + +* only clear $130 - $16F!!! + + LDX #$130 + LDA #0 thanxs Bill + +.2 STA $100,X CLEAR HASH TABLE FOR + INX ASSEMBLER SYMBOL TABLE + CPX #$170 + BNE .2 + +*-------------------------------- +EXIT2 JSR SHOW.BEGIN GO TO BEGINING OF FILE + LDA #23 + JSR MY.VTAB BOTTOM LINE + INC CH MAKE SURE ASM DOES CRLF + JSR P1.INIT + LDA AUTO.REN CK FOR AUTO RENUMBER + BEQ .1 NONE WANTED + LDA AUTO.BASE RENUMBER THE PROGRAM + STA PTR2 + LDA AUTO.BASE+1 + STA PTR2+1 +.0 JSR P1.ENDCK + BEQ EXIT3 END OF PROGRAM + LDA PTR2 + LDY #1 + STA (PTR1),Y + INY + LDA PTR2+1 + STA (PTR1),Y + LDA PTR2 + CLC + ADC AUTO.INC + STA PTR2 + LDA PTR2+1 + ADC AUTO.INC+1 + STA PTR2+1 + BCS .3 ERROR IF OVERFLOW + JSR P1.ADD + JMP .0 +.1 JSR P1.ENDCK CK PROG LINE NUM=0 + BEQ EXIT3 END OF PROGRAM + LDY #1 + LDA (PTR1),Y + BNE .2 + INY + LDA (PTR1),Y + BEQ .3 YES MUST RENUMBER +.2 JSR P1.ADD + JMP .1 +.3 LDY #0 GIVE RENUMBER WARNING +.4 LDA MESG,Y + BEQ EXIT3 + JSR M.COUT + INY + BNE .4 + +EXIT3 JMP $3D0 NON LANG CARD EXIT + +*-------------------------------- + +MESG .HS 8D8D8D87 + .AS -/*** PLEASE RENUMBER!/ + .HS 8D8700 +*-------------------------------- +FORM.GUIDE LDA FORM.FLG TOGGLE FORM GUIDE + EOR #1 + STA FORM.FLG + BEQ .1 OFF NOW + +* suspect that something is wrong here... +* Mike's comment adds 2, +* but code adds 1 + + LDA POSV ON NOW SO ADD 2 TO POSV + CLC MAKE SURE POSV + ADC #1 STAYS ON SCREEN + STA POSV + + LDA #1 + LDY #22 + BNE .2 +.1 LDA POSV + SEC + SBC #1 + STA POSV + LDA #0 + LDY #23 +.2 STA FIRST.LINE + STY LAST.LINE + CPY POSV + BCS .3 + STY POSV +.3 CMP POSV + BCC .4 + STA POSV +.4 RTS +*-------------------------------- +SHOW.BEGIN JSR FIND.LAST.PAGE GET LAST 32 LINES + LDA #32 + STA CTR +.1 JSR GET.LINE GET THEM BACK FROM + JSR CK.SPEND SCROLL LINE STACK + BNE .2 GO GET MORE + LDA LEFT.MARGIN RESET POSH, POSV + STA POSH + LDA FIRST.LINE + STA POSV + RTS +.2 DEC CTR MORE LINES IN LN.TBL + BNE .1 YES + BEQ SHOW.BEGIN NO, FIND 32 MORE LINES +*-------------------------------- +CK.SPEND LDA SP.BEG SEE IF END OF SCROLL + CMP SP.END LINE STACK + BNE .1 + LDA SP.BEG+1 + CMP SP.END+1 +.1 RTS +*-------------------------------- +SHOW.END JSR POP.LINE POP ALL LINES OFF + LDA PP.BEG FROM PROG AREA ONTO + CMP PP.END SCROLL LINE STACK + BNE SHOW.END + LDA PP.BEG+1 + CMP PP.END+1 + BNE SHOW.END +* AT *EOF* NOW, BACK UP LAST.LINE-FIRST.LINE LINES + JSR FIND.LAST.PAGE + LDA LAST.LINE + STA POSV INSURE THAT POSV IS ON *EOF* + SEC + SBC FIRST.LINE + STA CTR NUM LINES TO BACK UP +.1 JSR GET.LINE BACK UP SO *EOF* IS ON + JSR CK.SPEND BOTTOM OF PAGE + BEQ .2 EXIT IF END SCROLL LINE STACK + DEC CTR COUNT LINE PULLED + BNE .1 GO PULL MORE LINES +.2 JSR SHOW.SCREEN DISPLAY SCREEN + INC NO.SHOW.FLAG PREVENT ANOTHER DISPLAY + RTS +*-------------------------------- +DELETE JSR LSTRIP STRIP OFF LINES TO CUR LINE + LDA PP.BEG AT END OF PROG? + CMP PP.END + BNE .1 + LDA PP.BEG+1 + CMP PP.END+1 + BNE .1 + INC NO.SHOW.FLAG YES DONT SHOW SCRN + BNE .2 ...ALWAYS +.1 LDY #0 DEL CUR LINE + LDA (PP.BEG),Y + CLC + ADC PP.BEG + STA PP.BEG + BCC .2 + INC PP.BEG+1 +.2 JMP LGRAB GRAB BACK PREV LINES +*-------------------------------- + +; added $81 (1 space) to blank line for EDITing + +INS.TBL + +* better blank line + +BL .DA #BLEN + .DA $0000 + .DA #$81 (see...) + .HS 00 + +BLEN .EQ *-BL + +* DASHED COMMENT LINE +* used RPT symbols! (for assembling) + +DCL .DA #DCLEN + .DA $0000 + .AS ';' $#* + .DA #$C0,#RPT.LENG,#RPT.CHAR + .HS 00 + +DCLEN .EQ *-DCL + +*-------------------------------- + +DINSERT LDY #DCL-INS.TBL DASHED commment LINE INSERT + .HS 2C BIT abs opcode skips 2 DINS.1 + +INSERT LDY #BL-INS.TBL BLANK LINE INSERT + +DINS.1 LDA INS.TBL,Y GET LINE BYTE COUNT + STA WBUF + LDX #1 +.1 CPX WBUF + BEQ .2 + INY + LDA INS.TBL,Y COPY INTO WBUF + STA WBUF,X + INX + BNE .1 +.2 LDA PP.BEG CK FOR ENOUGH SPACE + SEC + SBC SP.END + STA PTR1 + LDA PP.BEG+1 + SBC SP.END+1 + BNE .3 + LDA PTR1 + CMP WBUF + BCS .3 + JMP M.BELL NOT ENOUGH FREE MEMORY +.3 JSR LSTRIP GET DOWN TO CUR LINE + LDA PP.BEG + SEC + SBC WBUF ALLOCATE BYTES BEFORE + STA PP.BEG CUR LINE + LDA PP.BEG+1 + SBC #0 + STA PP.BEG+1 + LDA RPT.CHAR SET REPEAT CHAR + STA WBUF+6 + LDA RPT.LENG AND LENGTH + STA WBUF+5 + LDY #0 + LDX WBUF BYTE COUNT +.4 LDA WBUF,Y + STA (PP.BEG),Y PUT IN LINE DATA + INY + DEX + BNE .4 +**** FALL INTO LGRAB **** +*-------------------------------- +LGRAB LDA POSV GET BACK POSV-FIRST.LINE LINES + SEC + SBC FIRST.LINE + BEQ .1 + STA CTR + JSR FIND.LAST.PAGE +.0 JSR GET.LINE + DEC CTR + BNE .0 +.1 RTS +*-------------------------------- +LSTRIP LDA POSV POP DOWN TO POSV-FIRST.LINE LINES + SEC + SBC FIRST.LINE + BEQ .1 + STA CTR +.0 JSR POP.LINE + DEC CTR + BNE .0 +.1 RTS +*-------------------------------- +MAN +SAVE usr/src/fse/fse.s.2 +LOAD usr/src/fse/fse.s +ASM diff --git a/FSE/FSE.S.3.txt b/FSE/FSE.S.3.txt new file mode 100644 index 00000000..a2a91a81 --- /dev/null +++ b/FSE/FSE.S.3.txt @@ -0,0 +1,533 @@ +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 diff --git a/FSE/FSE.S.A2.txt b/FSE/FSE.S.A2.txt new file mode 100644 index 00000000..e699b45d --- /dev/null +++ b/FSE/FSE.S.A2.txt @@ -0,0 +1,112 @@ +NEW + AUTO 3,1 +*-------------------------------- +A.YSAVE .EQ VAR.BEG-1 +A.CHR.UNDER.CURS .EQ A.YSAVE-1 +*-------------------------------- +* STANDARD VIDEO JUMP VECTORS +* 1. READ KEYBOARD KEY CODE +* TURNS ON CURSOR +* GETS KEY CODE +* TURNS OFF CURSOR +* REG-A HAS KEY CODE SIGN BIT ON. +* 2. HORIZONTAL TAB +* REG-A HAS TAB 0-39 +* 3. VERTICAL TAB +* REG-A HAS TAB 0-23 +* 4. CLEAR TO END OF LINE +* 5. CLEAR TO END OF SCREEN +* 6. CHARACTER OUTPUT ROUTINE +* REG-A HAS CHAR TO OUTPUT. +* MUST NOT SCROLL SCREEN OR +* GO TO NEXT LINE WHEN LAST +* CHARACTER IS PRINTED ON A LINE. +*-------------------------------- + JMP A.RD.KBD + JMP A.MY.HTAB + JMP A.MY.VTAB + JMP A.MY.CLREOL + JMP A.MY.CLREOP + JMP A.MY.COUT +*-------------------------------- +A.MY.CLP LDA CTR + JSR A.MY.VTAB +A.MY.CLREOP JSR A.MY.CLREOL ZAP REST OF LINE + LDA #0 + JSR A.MY.HTAB NEXT LINE ZAPPED FROM COL 0 + INC CTR BUMP COUNT TO NEXT LINE + LDA CTR + CMP LAST.LINE END OF PAGE? + BCC A.MY.CLP < END + BEQ A.MY.CLP = END + RTS > END +*-------------------------------- +A.MY.HTAB STA CH SET TAB VALUE + RTS +*-------------------------------- +A.MY.VTAB STA CV SET TAB VALUE + JMP M.BASCALC COMPUTE NEW COUT BASE ADRS +*-------------------------------- +A.MY.COUT STY A.YSAVE + LDY CH + CMP #$A0 + BCS .1 NOT CONTROL CHAR + AND #$7F ELSE MAKE CHAR INVERSE +.1 STA (BASEL),Y PUT CHAR ON SCREEN + INY NEXT COLUMN + STY CH + LDY A.YSAVE + RTS +*-------------------------------- +A.MY.CLREOL LDY CH +.1 LDA #$A0 A-REG = BLANK + CPY SCREEN.WIDTH + BCS .2 + JSR A.MY.COUT OUTPUT BLANKS UNTIL SCREEN WIDTH + LDY CH + BNE .1 ...ALWAYS +.2 RTS +*-------------------------------- +A.RD.KBD JSR A.CURSOR.ON TURN ON CURSOR +.1 LDA $C000 WAIT FOR KEY + BPL .1 + BIT $C010 KILL FLAG BY STROBE + PHA + JSR A.CURSOR.OFF TURN OFF CURSOR + PLA RETURN REG-A WITH CHAR + RTS +*-------------------------------- +A.CURSOR.ON LDA POSV + JSR A.MY.VTAB POSITION VERTICALLY + LDA POSH + SEC + SBC LEFT.MARGIN + CLC + ADC RM.ADJUST + JSR A.MY.HTAB POSITION HORIZONTALLY + LDY CH + LDA (BASEL),Y GET CHAR + STA A.CHR.UNDER.CURS + LDA ESC.FLAG + BNE .1 + LDA #'+ PLUS CURSOR FOR CURSOR MODE + BNE .2 +.1 LDA (BASEL),Y + AND #$7F + CMP #$60 IS CHAR ON SCREEN LOWER CASE + BCC .2 NO + AND #$DF FORCE LOWER CASE TO UPPER CASE +.2 AND #$3F MAKE FLASHING CHAR + ORA #$40 + STA (BASEL),Y + RTS +*-------------------------------- +A.CURSOR.OFF LDY CH + LDA A.CHR.UNDER.CURS + STA (BASEL),Y RESTORE SCREEN CHAR + RTS +*-------------------------------- +MAN +SAVE usr/src/fse/fse.s.a2 +LOAD usr/src/fse/fse.s +ASM diff --git a/FSE/FSE.S.A2E.txt b/FSE/FSE.S.A2E.txt new file mode 100644 index 00000000..18c4c52b --- /dev/null +++ b/FSE/FSE.S.A2E.txt @@ -0,0 +1,240 @@ +NEW + AUTO 3,1 +*-------------------------------- + +D.YSAVE .EQ VAR.BEG-1 +D.CHR.UNDER.CURS .EQ D.YSAVE-1 + +*-------------------------------- +* APPLE IIE VIDEO JUMP VECTORS +* 1. READ KEYBOARD KEY CODE +* TURNS ON CURSOR +* GETS KEY CODE +* TURNS OFF CURSOR +* REG-A HAS KEY CODE SIGN BIT ON. +* 2. HORIZONTAL TAB +* REG-A HAS TAB 0-79 +* 3. VERTICAL TAB +* REG-A HAS TAB 0-23 +* 4. CLEAR TO END OF LINE +* 5. CLEAR TO END OF SCREEN +* 6. CHARACTER OUTPUT ROUTINE +* REG-A HAS CHAR TO OUTPUT. +* MUST NOT SCROLL SCREEN OR +* GO TO NEXT LINE WHEN LAST +* CHARACTER IS PRINTED ON A LINE. +*-------------------------------- + + JMP D.RD.KBD +* JMP D.MY.HTAB +D.MY.HTAB + + STA CH set tab value + RTS + + JMP D.MY.VTAB + JMP D.MY.CLREOL + JMP D.MY.CLREOP +* JMP D.MY.COUT + +*-------------------------------- + +D.MY.COUT + + STY D.YSAVE + PHA SAVE ORIG CHAR + CMP #$A0 CONVERT CNTRL CHARS TO INVERSE ALPHA + BCS .1 REG CHAR + AND #$7F CNTRL CHAR +* dcj *ORA #$40 makes mousetext!!! + +.1 PHA store in-line to speed it up some + STA D.SET80COL + STA D.SET80VID + STA D.SETALTCHR + LDA CH + LSR + TAY + PLA + PHP + SEI + BIT D.TXTPAGE2 + BCC .2 + BIT D.TXTPAGE1 + +.2 STA (BASEL),Y + BIT D.TXTPAGE1 + PLP + INC CH + PLA RESTORE ORIG CHAR + LDY D.YSAVE + +D.SEV RTS + +*-------------------------------- + +D.MY.CLP + + LDA CTR + JSR D.MY.VTAB + +D.MY.CLREOP + + JSR D.MY.CLREOL ZAP REST OF LINE + LDA #0 + JSR D.MY.HTAB NEXT LINE ZAPPED FROM COL 0 + INC CTR BUMP COUNT TO NEXT LINE + LDA CTR + CMP LAST.LINE END OF PAGE? + BCC D.MY.CLP < END + BEQ D.MY.CLP = END + RTS > END + +*-------------------------------- + +D.MY.VTAB STA CV SET TAB VALUE + JMP M.BASCALC COMPUTE NEW COUT BASE ADRS + +*-------------------------------- + +D.RD80VID .EQ $C01F +D.TXTPAGE2 .EQ $C055 +D.TXTPAGE1 .EQ $C054 +D.SET80COL .EQ $C001 +D.SET80VID .EQ $C00D +D.SETALTCHR .EQ $C00F + +D.PICK CLV + +D.SCREENIT + + PHA + STA D.SET80COL ENABLE 80 COL STORE + STA D.SET80VID ENABLE 80 COL DISPLAY + STA D.SETALTCHR ENABLE LOWER CASE + LDA CH + LSR CH MOD 2 FOR PAGE SELECT + TAY CH/2 FOR INDEX + BVS .20 GO STORE +* 80 COL PICK + PHP + SEI + LDA D.TXTPAGE2 + BCC .10 + LDA D.TXTPAGE1 + +.10 LDA (BASEL),Y GET 80 COL CHAR + TAY + LDA D.TXTPAGE1 + PLP + PLA + TYA + PHA + BVC .30 EXIT ALWAYS +* 80 COL STORE + +.20 PLA + PHA + PHP + SEI + PHA + LDA D.TXTPAGE2 + BCC .21 + LDA D.TXTPAGE1 + +.21 PLA + STA (BASEL),Y PUT 80 COL CHAR + LDA D.TXTPAGE1 + PLP + +* COMMON EXIT + +.30 PLA + RTS + +*-------------------------------- + +D.MY.CLREOL + + LDY CH + +.1 LDA #$A0 A-REG = BLANK + CPY SCREEN.WIDTH + BCS .2 + JSR D.MY.COUT OUTPUT BLANKS UNTIL SCREEN WIDTH + LDY CH + BNE .1 ...ALWAYS + +.2 RTS + +*-------------------------------- + +D.RD.KBD + + JSR D.POSN SETUP CURSOR POSN + LDA ESC.FLAG SEE IF EDIT MODE + BNE .20 YES IT IS +* CURSOR MODE - CURSOR IS INVERSE "+" + JSR D.PICK + STA D.CHR.UNDER.CURS + AND #$80 SAVE INV BIT + EOR #$80+'+ FLIP IT FOR + CURSOR + BIT D.SEV + JSR D.SCREENIT + +.10 LDA $C000 + BPL .10 + +.11 BIT $C010 + PHA + LDA D.CHR.UNDER.CURS + BIT D.SEV + JSR D.SCREENIT + PLA + RTS + +* EDIT MODE - CURSOR IS BLINKING CURRENT CHAR +* BLINKED WITH SOFTWARE TIMING LOOP. + +.20 JSR D.PICK + STA D.CHR.UNDER.CURS + +.21 JSR D.PICK TOGGLE INV FLAG + EOR #$80 + cmp #$40 + bcc .99 + cmp #$60 + bcs .99 + and #$1F + +.99 BIT D.SEV + JSR D.SCREENIT + LDY #200 LOOP 200 TIMES BEFORE FLIPPING CHAR + +.22 LDA $C000 + BMI .11 + LDA #00 + +.23 SEC COUNT 7*256 MICRO SECS + SBC #1 + BNE .23 + DEY + BEQ .21 END LOOP - FLIP CHAR + BNE .22 BA CK KEY AGAIN + +*-------------------------------- + +D.POSN LDA POSV + JSR D.MY.VTAB POSITION VERTICALLY + LDA POSH + SEC + SBC LEFT.MARGIN + CLC + ADC RM.ADJUST + JMP D.MY.HTAB POSITION HORIZONTALLY + +*-------------------------------- +MAN +SAVE usr/src/fse/fse.s.a2e +LOAD usr/src/fse/fse.s +ASM diff --git a/FSE/FSE.S.LINE.txt b/FSE/FSE.S.LINE.txt new file mode 100644 index 00000000..7e3f0c1b --- /dev/null +++ b/FSE/FSE.S.LINE.txt @@ -0,0 +1,479 @@ +NEW + AUTO 3,1 +*-------------------------------- +GET.KEY JSR READ.KEY.CODE +COMP.PTR + LDX POSH + STX ED.PTR + RTS +*-------------------------------- +EDIT.LINE LDA ESC.FLAG IS HE IN EDIT MODE + BNE EDIT.ONE.LINE YES, GO EDIT + LDA SPECIAL.FLG IS HE POPING INTO EDIT MODE? + BEQ .1 NO + STA ESC.FLAG YES SET EDIT MODE NOW + BNE EDIT.ONE.LINE GO EDIT +.1 LDA ONCE.FLG ONE TIME SCROLL FUNCTION + STA ESC.FLAG + BEQ GET.KEY NO, JUST RETURN KEY +EDIT.ONE.LINE + LDA #0 + STA ONCE.FLG CLEAR ONE TIME SCROLL FUNCTION + LDA FIRST.LINE COMPUTE + STA CTR INIT CTR + JSR P1.INIT INIT PTR1 FOR EDIT LINE SEARCH +.1 JSR P1.ENDCK END OF PROG? + BNE .2 NO + JSR E.ESC ERROR CANT EDIT *EOF* + LDA #0 CLEAR SPECIAL FLAG + STA SPECIAL.FLG + BEQ GET.KEY GO GET KEY FOR SCROLL MODE +.2 LDA CTR SEE IF FOUND EDIT LINE + CMP POSV POSV IS THE EDIT LINE WANTED + BEQ E.FOUND FOUND LINE TO EDIT + JSR P1.ADD BUMP FORWARD TO THE EDIT LINE + INC CTR BUMP POSN CTR + BNE .1 ...ALWAYS +E.FOUND LDA CTR + STA SAV.CTR SAVE EDIT LINE POSN + LDA PTR1 + STA SAV.PTR1 SAVE PTR TO IT + LDA PTR1+1 + STA SAV.PTR1+1 + LDY #1 SAVE LINE NUMBER + LDA (PTR1),Y + STA SAV.LNO + INY + LDA (PTR1),Y + STA SAV.LNO+1 + JSR E.GETLN GET THE LINE INTO WBUF +* PTR1 IS PTR TO SOURCE LINE +* WBUF HAS LINE EXPANDED +.1 JSR E.PROCESS.KEY READ AND PROCESS A KEY + BCC .1 NON-EXIT TYPE KEY + LDA CHANGE.FLG DID LINE CHANGE + BEQ .2 NO + LDA #0 YES, CLEAR CHANGE FLAG + STA CHANGE.FLG + JSR E.SUBMIT.LINE SUBMIT THE LINE +.2 LDA ESC.FLAG STILL IN EDIT MODE + BEQ EDIT.LINE NO GO GET A KEY FOR SCROLL MODE + JSR E.ESC CLEAR EDIT FLAG + INC ONCE.FLG SET FLAG TO SAY WE ARE DOING + LDA CUR.KEY 1 SCROLL MODE FUNCTION + RTS RETURN WITH A REG = FUNCTION CODE +*-------------------------------- + +; if skmod not installed, don't change case + +E.SHIFT BIT SKMOD.FLG + BPL .1 + LDA ALPHA.FLG + EOR #$80 FLIP ALPHA LOCK FLAG + STA ALPHA.FLG +.1 CLC + RTS +*-------------------------------- +READ.KEY.CODE + JSR MY.RD.KBD GET KEYBOARD CHAR + AND #$7F DROP SIGN BIT + PHA + LDA ESC.FLAG IS HE IN EDIT MODE? + BNE .50 YES, SO ALLOW CASE CHANGE + PLA NO, SKIP CASE CHANGE + bpl .60 BA +.50 PLA + BIT ALPHA.FLG LOWER CASE + BPL .60 NO, UPPER CASE + BIT SKMOD.FLG SHFT KEY MOD? + BPL .54 NO, SO DONT LOOK AT IT + BIT $C063 IS SHIFT KEY DOWN? + BMI .54 NO, FORCE LOWER CASE +* FIX PROBLEM SHIFT CHARACTERS THAT MUST BE UPPER CASE + CMP #'^ ^ -> N + BNE .51 + LDA #'N +.51 CMP #'@ @ -> P + BNE .52 + LDA #'P +.52 CMP #'] ] -> M + BNE .53 + LDA #'M +.53 BNE .60 OTHERWISE USE UPERCASE VALUE +* CK AND CHANGE CASE +.54 CMP #'A CHANGE UPPER CASE + BCC .60 ALPHA CHARS TO LOWER + CMP #'Z+1 CASE. + BCS .60 + ORA #$20 +* PROCESS OTHER SHIFT KEYS +.60 BIT SKMOD.FLG + BPL .2 NOT ALLOWED + BIT $C063 IS SW ON + BMI .2 NOPE + CMP #'H-$40 CHANGE <- TO ^"K" + BNE .10 + LDA #'K-$40 +.10 CMP #'U-$40 CHANGE -> TO ^"J" + BNE .11 + LDA #'J-$40 +.11 PHA + LDA ESC.FLAG IF NOT IN EDIT MODE + BNE .1 EDIT MODE, NO CAN DO! + PLA + CMP #'I CHANGE SHIFT I TO "2" + BNE .12 + LDA #'2 +.12 CMP #'] CHANGE SHIFT M TO "1" + BNE .2 + LDA #'1 + PHA +.1 PLA +.2 STA CUR.KEY + RTS +*-------------------------------- +P1.INIT LDA PP.BEG SET PTR1 TO PROG START + STA PTR1 + LDA PP.BEG+1 + STA PTR1+1 + RTS +*-------------------------------- +P1.ENDCK LDA PTR1 CK FOR PTR1=END OF PROG + CMP PP.END + BNE .1 + LDA PTR1+1 + CMP PP.END+1 +.1 RTS +*-------------------------------- +P1.ADD LDY #0 BUMP UP TO NEXT PROG LINE + LDA (PTR1),Y + CLC + ADC PTR1 + STA PTR1 + BCC .1 + INC PTR1+1 +.1 RTS +*-------------------------------- + +E.SET.TAB + + TXA + SEC + SBC #START.COL-1 CONVERT POSH TO TAB VALUES + TAX + LDY #0 +.1 CMP TAB.TBL,Y SEARCH TAB TABLE + BEQ .10 MATCH EXACTLY MEANS DELETE + BCC .20 IF POSH=POSH END +*-------------------------------- +C.MY.HTAB STA C.STB.COL SET HORIZ. POSN + LSR + STA CH CH = POSN/2 + RTS +*-------------------------------- +C.MY.VTAB STA CV SET VERT POSN + RTS +*-------------------------------- +C.MY.COUT STY C.TMP1 SAVE Y REG + AND #$7F MASK OFF HIGH BIT + PHA + LDA CV GET VERT POSN + CLC + ADC C.STB.TOPADR + LDY #18 + STY C.CRTC CRTC = REG 18 + STA C.CRTC+1 SET LINE POSN + LDA C.STB.COL + INY + STY C.CRTC CRTC = REG 19 + STA C.CRTC+1 SET COL POSN + LDA C.STB.TOPADR + LDY #12 + STY C.CRTC CRTC = REG 12 + STA C.CRTC+1 SET SCROLL POSN + LDY #$1F + STY C.CRTC POINT TO DUMMY REG + PLA + CMP #$20 + BCS .1 NON CONTROL CHAR + ORA #$C0 SET INV BIT, MAKE LETR +.1 BIT C.CRTC WAIT FOR RIGHT TIME + BPL .1 + STA C.CRTC+3 PUT CHAR IN LATCH + INC C.STB.COL NEXT COLUMN + LDY C.TMP1 RESTORE Y REG + RTS +*-------------------------------- +C.MY.CLREOL STY C.TMP3 SAVE Y REG + STX C.TMP4 SAVE X REG +.1 LDY C.STB.COL GET COL POSN + CPY SCREEN.WIDTH END OF LINE + BCS .2 YES + LDA #$A0 A REG = BLANK + JSR C.MY.COUT PRINT IT + JMP .1 NEXT COLUMN +.2 LDY C.TMP3 RESTORE Y REG + LDX C.TMP4 RESTORE X REG + RTS +*-------------------------------- +* STB80 IO ROUTINES +*-------------------------------- +C.CRTC .EQ $C0B0 CRT CONTROLLER CHIP +C.STB.TOPADR .EQ $57B SCROLL LINE START +C.STB.COL .EQ $5FB COLUMN POSN +*-------------------------------- +C.RD.KBD JSR C.CURSOR.ON TURN ON CURSOR +.1 LDA $C000 WAIT FOR KEY + BPL .1 + BIT $C010 STROBE KBD TO KILL FLAG BIT + PHA SAVE CHAR + JSR C.CURSOR.OFF TURN OFF CURSOR + PLA RESTORE CHAR + RTS +*-------------------------------- +C.CURSOR.ON LDA POSV POSITION VERTICALLY + JSR C.MY.VTAB + LDA POSH + SEC + SBC LEFT.MARGIN + CLC + ADC RM.ADJUST + JSR C.MY.HTAB POSITION HORIZONTALLY + LDA ESC.FLAG TEST ESC MODE + BEQ .1 IT IS IN SCROLL MODE + LDA #$67 EDIT MODE GETS LITTLE CURSOR + BNE .2 ...ALWAYS +.1 LDA #$C0 SCROLL MODE GETS NORMAL CURSOR +.2 PHA + LDA #$0A + STA C.CRTC CTRC = REG 10 + PLA + STA C.CRTC+1 SET CURSOR START DATA +C.WRIT LDA #$0F + STA C.CRTC CTRC = REG 15 + LDA C.STB.COL + STA C.CRTC+1 SET CURSOR COLUMN POSN + LDA #$0E + STA C.CRTC CRTC = REG 14 + LDA CV + CLC + ADC C.STB.TOPADR + STA C.CRTC+1 SET CURSOR LINE POSN + RTS +*-------------------------------- +C.CURSOR.OFF LDA #24 LINE 24 IS NON DISPLAYABLE + JSR C.MY.VTAB TAB TO THERE + JMP C.WRIT AND POSN CURSOR THERE +*-------------------------------- +MAN +SAVE usr/src/fse/fse.s.stb80 +LOAD usr/src/fse/fse.s +ASM diff --git a/FSE/FSE.S.SUBMIT.txt b/FSE/FSE.S.SUBMIT.txt new file mode 100644 index 00000000..032ba9af --- /dev/null +++ b/FSE/FSE.S.SUBMIT.txt @@ -0,0 +1,234 @@ +NEW + AUTO 3,1 +*-------------------------------- +E.SUBMIT.LINE JSR TRUNCATE TRUNCATE BLANKS FROM END + JSR PACK.LINE PACK INTO SC FORMAT + JMP INSERT.LINE PUT INTO SOURCE PROG +*-------------------------------- +TRUNCATE LDY #254 +.1 LDA WBUF,Y KILL ANY TRAILING BLANKS + CMP #$20 + BNE .2 + LDA #0 + STA WBUF,Y + DEY + CPY #4 + BNE .1 +.2 RTS +*-------------------------------- +PACK.LINE LDA #0 + STA RPTCNT + STA RPTCHR + TAX + LDY #START.COL START LOOKING AT LINE HERE +.1 LDA WBUF,Y GET A CHAR + AND #$7F MASK HIGH BIT OFF + BEQ .4 END OF LINE CODE + CMP RPTCHR SEE IF=REPEAT CHAR + BNE .3 NO +.2 INC RPTCNT BUMP REPEAT COUNT + INY NEXT CHAR + BNE .1 ...ALWAYS +.3 JSR PROCESS.REPEAT.COUNT + LDA WBUF,Y + AND #$7F + STA RPTCHR + BNE .2 ...ALWAYS +.4 JSR PROCESS.REPEAT.COUNT + LDA #0 + STA WBUF,X + INX + TXA + TAY +.41 LDA WBUF-1,Y + STA WBUF+2,Y + DEY + BNE .41 + INX + INX + INX +.5 STX WBUF + LDA SAV.LNO + STA WBUF+1 + LDA SAV.LNO+1 + STA WBUF+2 + RTS +*-------------------------------- +PROCESS.REPEAT.COUNT + LDA RPTCNT ANY REPEAT CHARS + BEQ .2 NO + LDA RPTCHR GET REPEAT CHAR + CMP #$20 WAS IT BLANK? + BEQ .4 YES, BLANK IS SPECIAL + STA WBUF+2,X NO, STORE CHAR + LDA RPTCNT GET COUNT + CMP #4 MUST BE 4 OR MORE + BCC .3 NOT ENOUGH + STA WBUF+1,X STORE COUNT + LDA #$C0 STORE REPEAT TOKEN + STA WBUF,X + INX + INX COUNT 3 BYTES +.1 LDA #0 ZERO REPEAT COUNT + STA RPTCNT + INX +.2 RTS +.3 LDA RPTCHR + STA WBUF,X + INX + DEC RPTCNT + BNE .3 + RTS +.4 LDA RPTCNT TAKE BLANK COUNT + CMP #$40 CK < 64 + BCC .5 YES + SBC #$3F DECREMENT MAX COUNT + STA RPTCNT + LDA #$BF OUTPUT MAX COUNT + STA WBUF,X IN WBUF + INX THEN GO BACK FOR MORE + BNE .4 ...ALWAYS +.5 ORA #$80 SET HIGH BIT + STA WBUF,X STORE BLANK COUNT + BNE .1 ...ALWAYS +*-------------------------------- +INSERT.LINE LDA SAV.PTR1 + STA PTR1 + STA PTR2 + LDA SAV.PTR1+1 + STA PTR1+1 + STA PTR2+1 + JSR P1.ADD P1=NEXT, P2=CUR + LDA PTR1 + SEC + SBC PTR2 + SEC + SBC WBUF + BEQ .11 SAME SIZE + STA MDIST + LDA #0 + SBC #0 + STA MDIST+1 + BCC .6 LINE IS BIGGER +*-------------------------------- +* LINE IS SMALLER +*-------------------------------- + CLC + LDA PTR2 + ADC MDIST + STA A4L + LDA PTR2+1 + ADC MDIST+1 + STA A4H + JSR MOVE.TEXT.UP + JMP .11 +*-------------------------------- +* LINE IS BIGGER +*-------------------------------- +.6 CLC + LDA PP.BEG + ADC MDIST + STA A4L + LDA PP.BEG+1 + ADC MDIST+1 + STA A4H + LDA A4L + CMP SP.END + LDA A4H + SBC SP.END+1 + BCC .30 ERROR NO ROOM + JSR MOVE.TEXT.DOWN +*-------------------------------- +* MOVE LINE INTO HOLE +*-------------------------------- +.11 LDX WBUF + LDY #0 +.12 LDA PTR1 + BNE .13 + DEC PTR1+1 +.13 DEC PTR1 + DEX + LDA WBUF,X + STA (PTR1),Y + TXA + BNE .12 +.14 RTS +*-------------------------------- +.30 JMP M.BELL NO ROOM +*-------------------------------- +MOVE.TEXT.UP JSR COMPUTE.BLOCK.SIZE + CLC + LDA PP.BEG + ADC MDIST + STA PP.BEG + LDA PP.BEG+1 + ADC MDIST+1 + STA PP.BEG+1 + LDY #0 + BEQ .3 ...ALWAYS +* MOVE WHOLE BLOCK +.1 LDA (PTR2),Y + STA (A4L),Y +.2 DEY + BNE .1 + LDA (PTR2),Y + STA (A4L),Y +.3 DEC PTR2+1 + DEC A4H + DEX ANY MORE BLOCKS + BNE .2 YES +* MOVE SHORT BLOCK IF ANY + LDX BLKSIZ PARTIAL BLOCK SIZE + BEQ .5 NONE LEFT +.4 DEY + LDA (PTR2),Y + STA (A4L),Y + DEX + BNE .4 +.5 RTS +*-------------------------------- +COMPUTE.BLOCK.SIZE + SEC + LDA PTR2 + SBC PP.BEG + STA BLKSIZ + LDA PTR2+1 + SBC PP.BEG+1 + TAX # PAGES + INX + RTS +*-------------------------------- +MOVE.TEXT.DOWN + JSR COMPUTE.BLOCK.SIZE + LDA PP.BEG + STA A2L + LDA PP.BEG+1 + STA A2H + LDA A4L + STA PP.BEG + LDA A4H + STA PP.BEG+1 + LDY #0 + BEQ .2 ...ALWAYS +.1 LDA (A2L),Y YES, MOVE 256 BYTE + STA (A4L),Y + INY + BNE .1 + INC A2H NEXT BLOCK + INC A4H +.2 DEX ANY MORE BLOCKS + BNE .1 +* MOVE PARTIAL BLOCK + LDX BLKSIZ + BEQ .4 NO PARTIAL BLOCK +.3 LDA (A2L),Y + STA (A4L),Y + INY + DEX + BNE .3 +.4 RTS +*-------------------------------- +MAN +SAVE usr/src/fse/fse.s.submit +LOAD usr/src/fse/fse.s +ASM diff --git a/FSE/FSE.S.VIDEX.txt b/FSE/FSE.S.VIDEX.txt new file mode 100644 index 00000000..b87290e3 --- /dev/null +++ b/FSE/FSE.S.VIDEX.txt @@ -0,0 +1,220 @@ +NEW + AUTO 3,1 +*-------------------------------- +B.TMP1 .EQ VAR.BEG-1 +B.TMP2 .EQ B.TMP1-1 +B.TMP3 .EQ B.TMP2-1 +B.TMP4 .EQ B.TMP3-1 + .DO B.TMP4<$300 + *** VARS<$300 + .FIN +*-------------------------------- +* STANDARD VIDEO JUMP VECTORS +* 1. READ KEYBOARD KEY CODE +* TURNS ON CURSOR +* GETS KEY CODE +* TURNS OFF CURSOR +* REG-A HAS KEY CODE SIGN BIT ON. +* 2. HORIZONTAL TAB +* REG-A HAS TAB 0-79 +* 3. VERTICAL TAB +* REG-A HAS TAB 0-23 +* 4. CLEAR TO END OF LINE +* 5. CLEAR TO END OF SCREEN +* 6. CHARACTER OUTPUT ROUTINE +* REG-A HAS CHAR TO OUTPUT. +* MUST NOT SCROLL SCREEN OR +* GO TO NEXT LINE WHEN LAST +* CHARACTER IS PRINTED ON A LINE. +*-------------------------------- + JMP B.RD.KBD + JMP B.MY.HTAB + JMP B.MY.VTAB + JMP B.MY.CLREOL + JMP B.MY.CLREOP + JMP B.MY.COUT +*-------------------------------- +B.CN .DA #$C3 SLOT + $C0 OF 80 COL BOARD +B.N0 .EQ $30 SLOT * 16 OF 80 COL BOARD +*-------------------------------- +B.MY.CLP LDA CTR + JSR B.MY.VTAB +B.MY.CLREOP JSR B.MY.CLREOL CLEAR TO END OF LINE + LDA #0 + JSR B.MY.HTAB NEXT LINE BEGINS WITH COL 0 + INC CTR BUMP CTR TO NEXT LINE + LDA CTR + CMP LAST.LINE IS IT > LANT LINE + BCC B.MY.CLP < END + BEQ B.MY.CLP = END + RTS > END +*-------------------------------- +B.MY.HTAB STX B.TMP1 SAVE X REG + LDX B.CN + STA B.CHORZ,X SAVE HORIZONTAL POSN + LDX B.TMP1 RESTORE X REG + RTS +*-------------------------------- +B.MY.VTAB STY B.TMP1 SAVE Y REG + STX B.TMP2 SAVE X REG + LDX B.CN + STA CV SET NEW VERT POSN + STA B.CVERT,X SAVE FOR VIDEX TOO + JSR B.VTABZ DO CALCULATION + LDY B.TMP1 RESTORE Y REG + LDX B.TMP2 RESTORE X REG + RTS +*-------------------------------- +B.MY.COUT STY B.TMP1 SAVE Y REG + STX B.TMP2 SAVE X REG + LDX B.CN + LDY B.CHORZ,X GET COLUMN POSN + JSR B.CHRPUT PUT CHAR ON SCREEN + INC B.CHORZ,X NEXT COLUMN + LDY B.TMP1 RESTORE Y REG + LDX B.TMP2 RESTORE X REG + RTS +*-------------------------------- +B.MY.CLREOL STY B.TMP3 SAVE Y REG + STX B.TMP4 SAVE X REG + LDX B.CN + LDY B.CHORZ,X GET COL POSN +.1 LDA #$A0 A REG = BLANK + CPY SCREEN.WIDTH END OF LINE YET? + BCS .2 YES + JSR B.MY.COUT NO, PRINT A BLANK + LDY B.CHORZ,X GET COL POSN + BNE .1 ...ALWAYS +.2 LDY B.TMP3 RESTORE Y REG + LDX B.TMP4 RESTORE X REG + RTS +*-------------------------------- +* VIDEX IO ROUTINES +*-------------------------------- +B.YSAVE .EQ $35 SAVE Y REG +* +B.ASAV1 .EQ $4F8 SAVE A REG +B.XSAV1 .EQ $578 SAVE X REG +B.MSLOT .EQ $7F8 SAVE SLOT NUMBER +*-------------------------------- +B.BASEL .EQ $478-$C0 COMPUTED BASE ADRS LOW +B.BASEH .EQ $4F8-$C0 COMPUTED BASE ADRS HIGH +B.CHORZ .EQ $578-$C0 TRUE HORIZONTAL POSN +B.CVERT .EQ $5F8-$C0 TRUE VERTICAL POSN +B.START .EQ $6F8-$C0 SCROLL LINE START +*-------------------------------- +B.FLAGS .EQ $7F8-$C0 FLAG BITS FOR VIDEX +*-------------------------------- +B.DEV0 .EQ $C080 REGISTER SELECT +B.DEV1 .EQ $C081 REGISTER DATA +B.DISP0 .EQ $CC00 1ST PAGE OF BANK +B.DISP1 .EQ $CD00 2ND PAGE OF BANK +*-------------------------------- +B.VTABZ STA B.ASAV1 COMPUTE VIDEX BASE ADRS + ASL + ASL + CLC + ADC B.ASAV1 A*5 + START + ADC B.START,X + PHA + LSR * $10 + LSR + LSR + LSR + STA B.BASEH,X + PLA + ASL + ASL + ASL + ASL + STA B.BASEL,X + RTS +*-------------------------------- +B.PSNCALC STX B.MSLOT POSITION CALCULATION + TYA + CLC + ADC B.BASEL,X + STA B.XSAV1 + LDA #0 + ADC B.BASEH,X + LSR BIT 0 TO CARRY + PHP SAVE CARRY BIT + AND #3 BIT 1,2 SPECIFY WHICH BANK + ASL + ASL + ORA #B.N0 + STY B.YSAVE + TAY + LDA B.DEV0,Y FLIP IN RIGHT 512 BANK + LDY B.YSAVE + PLP CARRY SAYS WHICH 256 BYTE PAGE + LDX B.XSAV1 TO USE + RTS +*-------------------------------- +B.CHRPUT ASL KILL SIGN BIT + PHA SAVE CHAR + LDA B.FLAGS,X GET CHAR SET FLAG + LSR IN CARRY BIT + PLA RECOVER CHAR + ROR INSERT CHAR SET BIT + PHA SAVE CHAR + JSR B.PSNCALC COMPUTE POSN + PLA GET CHAR + BCS .1 HIGH PAGE + STA B.DISP0,X LOW PAGE STORE CHAR + BCC .2 +.1 STA B.DISP1,X HIGH PAGE STORE CHAR +.2 LDX B.MSLOT + RTS +*-------------------------------- +B.RD.KBD JSR B.CURSOR.ON TURN ON CURSOR +.1 LDA $C000 GET CHAR + BPL .1 + BIT $C010 STROBE KBD TO KILL FLAG BIT + PHA SAVE CHAR + JSR B.CURSOR.OFF TURN OFF CURSOR + PLA CHAR IN A REG + RTS +*-------------------------------- +B.CURSOR.ON LDA POSV POSITION VERTICVALLY + JSR B.MY.VTAB + LDA POSH + SEC + SBC LEFT.MARGIN + CLC + ADC RM.ADJUST + JSR B.MY.HTAB POSITION HORIZONTALLY + LDY #B.N0 + LDA ESC.FLAG CHK FOR EDIT OR SCROLL MODE + BEQ .1 MUST BE SCROLL MODE. + LDA #$67 EDIT MODE GETS LITTLE CURSOR + BNE .2 +.1 LDA #$C0 SCROLL MODE GETS NORMAL CURSOR +.2 PHA + LDA #$0A + STA B.DEV0,Y SET CTRC = REG 10 + PLA + STA B.DEV1,Y SET CURSOR START DATA +B.WRIT LDX B.CN + LDY #B.N0 + LDA #$0F + STA B.DEV0,Y CTRC = REG 15 + LDA B.CHORZ,X + CLC + ADC B.BASEL,X + STA B.DEV1,Y SET CURSOR HOIZONTAL POSN + LDA #$0E + STA B.DEV0,Y CTRC = REG 14 + LDA #0 + ADC B.BASEH,X + STA B.DEV1,Y SET CURSOR VERTICAL POSN + RTS +*-------------------------------- +B.CURSOR.OFF LDA #24 GO TO LINE 24 (DOES NOT EXIST) + JSR B.MY.VTAB + JMP B.WRIT PUT CURSOR THERE +*-------------------------------- +MAN +SAVE usr/src/fse/fse.s.videx +LOAD usr/src/fse/fse.s +ASM diff --git a/FSE/FSE.S.txt b/FSE/FSE.S.txt new file mode 100644 index 00000000..0f4509f6 --- /dev/null +++ b/FSE/FSE.S.txt @@ -0,0 +1,138 @@ +NEW + AUTO 3,1 + .LIST OFF + .OR $6480 + .TF FSE +*-------------------------------- +* S-C MACRO ASSEMBLER SCREEN EDITOR +* +* BY MIKE LAUMER +* LAUMER RESEARCH +* 1832 SCHOOL RD. +* CARROLLTON, TEXAS 75006 +* +* (214) 245-3927 +* +* modified 7/10/85 by: +* David C. Johnson of +* Applied Engineering +* 3216 Beltline Rd, Suite 610 +* Dallas, TX 75234 +* (214) 241-6060 +* +* changes include: +* operates under SCASM 2.0 - ProDOS +* fixing blank lines entered w/^L (see INS.TBL), +* changing E.SHIFT to test SKMOD.FLG, +* allowing lowercase escape mode characters, +* eliminating MouseText characters, and +* speeding up the //e driver some. +* many small changes too... +*-------------------------------- +* DRIVER SELECTION PARAMETER +* +* DRVR = 0 .... STANDARD 40 COLUMN +* = 1 .... VIDEX 80-COLUMN +* = 2 .... STB80 80-COLUMN +* = 3 .... //e or //c 80-COLUMN + +DRVR .EQ 3 + + .DO DRVR +SCR.SIZE .EQ 80 SCREEN WIDTH + .EL +SCR.SIZE .EQ 40 make screen width 40 automatically + .FI +*-------------------------------- + .OR $6480 + .TF FSE +*-------------------------------- +FSE.VECTOR .EQ $8028 +ESC.U.VECTOR .EQ $800C + +INSTALLER + + LDA #$4C JMP opcode + STA FSE.VECTOR + STA ESC.U.VECTOR + LDA #HARD + STA FSE.VECTOR+1 + LDA /HARD + STA FSE.VECTOR+2 + STA $BEFB Global Page HIMEM + LDA #REMOVER + STA ESC.U.VECTOR+1 + LDA /REMOVER + STA ESC.U.VECTOR+2 + JMP $8000 coldstart assembler + .BS $6500-* +*-------------------------------- + + .INB usr/src/fse/fse.s.1 + .INB usr/src/fse/fse.s.2 + .INB usr/src/fse/fse.s.3 + .INB usr/src/fse/fse.s.line + .INB usr/src/fse/fse.s.submit + +*-------------------------------- +* EACH DRIVER MODULE LOADS HERE. +* DRIVER LINKAGE IS VIA A JUMP TABLE +* TO STANDARDIZE THEIR ENTRY POINTS. +*-------------------------------- +* +OVERLAY.AREA +* +MY.RD.KBD .EQ OVERLAY.AREA KEYBOARD READ +MY.HTAB .EQ OVERLAY.AREA+3 HOTIZONTAL TAB +MY.VTAB .EQ OVERLAY.AREA+6 VERTICAL TAB +MY.CLREOL .EQ OVERLAY.AREA+9 CLEAR TO END OF LINE +MY.CLREOP .EQ OVERLAY.AREA+12 CLEAR TO END OF SCREEN +MY.COUT .EQ OVERLAY.AREA+15 CHARACTER OUTPUT + + .DO DRVR=0 +*-------------------------------- +* STANDARD 40 COLUMN APPLE VIDEO DRIVER +*-------------------------------- + .INB usr/src/fse/fse.s.a2 + .FIN + + .DO DRVR=1 +*-------------------------------- +* VIDEX 80 COLUMN VIDEO DRIVER +*-------------------------------- + .INB usr/src/fse/fse.s.videx + .FIN + + .DO DRVR=2 +*-------------------------------- +* STB80 80 COLUMN VIDEO DRIVER +*-------------------------------- + .INB usr/src/fse/fse.s.stb80 + .FIN + + .DO DRVR=3 +*-------------------------------- +* APPLE IIE 80 COLUMN VIDEO DRIVER +*-------------------------------- + .INB usr/src/fse/fse.s.a2e + .FIN + +REMOVER + + LDA #$60 RTS opcode + STA FSE.VECTOR + LDA #M.BELL + STA ESC.U.VECTOR+1 + LDA /M.BELL + STA ESC.U.VECTOR+2 + LDA /$7400 + STA $BEFB Global Page HIMEM + JMP $8000 coldstart assembler +*-------------------------------- +ZZ.END .DO *>$73FF OR EDITOR WILL BE TOO LARGE + !!! EXCEEDS $73FF + .FIN +*-------------------------------- +MAN +SAVE usr/src/fse/fse.s +ASM