FSE source code

This commit is contained in:
burniouf 2024-02-16 18:51:17 +01:00
parent 9190fc0a94
commit ac15ee428e
10 changed files with 2849 additions and 0 deletions

220
FSE/FSE.S.1.txt Normal file
View File

@ -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

522
FSE/FSE.S.2.txt Normal file
View File

@ -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<LINE THEN FOUND
BEQ .3 IF EQUAL CK LO
.2 JSR POP.LINE POP OFF LINE
JMP .1 CK THIS LINE
.3 LDA ED.KEY WAS LO LINE EQUAL?
BNE .2 NO
.4
*--------------------------------
SOFT LDX #$FF INIT STACK PTR
TXS
LDA NO.SHOW.FLAG DO WE NEED TO SHOW SCRN
BNE .1 NO
JSR SHOW.SCREEN PLOP UP THE SCRN
.1 LDA #0 ZERO FLAG
STA NO.SHOW.FLAG
.2 JSR EDIT.LINE GET A KEY OR EDIT THE LINE
LDY #0 KEY IN A REG
* allow lowercase too!!!
CMP #$60
BCC .3
SBC #$20
.3 CMP FTBL,Y HUNT FOR KEY CODE
BEQ .4 FOUND IT
INY NEXT ENTRY
INY
INY
CPY #FTBL.Z
BCC .3
JSR M.BELL BAD KEY CODE
JMP .2
.4 JSR TOSUB PROCESS KEY
JMP SOFT
TOSUB LDA FTBL+2,Y
PHA
LDA FTBL+1,Y
PHA
RTS
*--------------------------------
FIXRST LDA M.RESET+1
EOR #$A5 MAKE SURE WE DONE
STA M.RESET+2 BOOT DISK UP
RTS
*--------------------------------
ESCAPE LDA #$FF
STA ESC.FLAG PUT INTO EDIT MODE
BNE SET.NS DONT SHOW SCRN
*--------------------------------
COMPOSE LDA COMPOSE.FLG TOGGLE COMPOSE MODE FLAG
EOR #1
STA COMPOSE.FLG
SET.NS LDA #1 DONT SHOW SCRN
STA NO.SHOW.FLAG
RTS ON RETURN TO MAIN LOOP
*--------------------------------
SPECIAL LDA #1
STA SPECIAL.FLG SPECIAL KEY JUST FOR EDIT
BNE SET.NS DONT SHOW SCRN
*--------------------------------
SET.LMARGIN LDA POSH CUR POSH IS LEFT MARGIN
PHA
LDA RT.FENCEL
CLC
ADC SCREEN.WIDTH
SEC
SBC #START.COL
STA ED.KEY
PLA
CMP ED.KEY POSH< (RT.FENCEL+SCREEN.WIDTH-START.COL)
BCS .1 NO, SO CANT SET MARGIN
STA L.MARGIN
.1 JMP SET.NS
*--------------------------------
RETURN JSR SET.NS ASSUME WE DO NOT SHOW SCREEN
LDA L.MARGIN BEGINNING OF LINE
STA POSH NEW COLUMN POSN
PHA
LDA SCREEN.WIDTH
LSR
STA ED.KEY SAVE SW/2
PLA
SEC
SBC ED.KEY LM-(SW/2)
BCC .20 TOO FAR
CMP #START.COL MUST BE > 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

533
FSE/FSE.S.3.txt Normal file
View File

@ -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.BEG<PP.END?
LDA PP.BEG+1
STA PTR1+1
SBC PP.END+1
BCS RTS2 NOT LESS
LDA SP.END PTR2=SP.END
STA PTR2 SP.END=SP.END+SIZE
LDY #0
CLC
ADC (PTR1),Y
STA SP.END
LDA SP.END+1
STA PTR2+1
ADC #0
STA SP.END+1
CLC PP.BEG=PP.BEG+SIZE
LDA (PTR1),Y
ADC PP.BEG
STA PP.BEG
LDA #0
ADC PP.BEG+1
STA PP.BEG+1
JMP MOVE12 MOVE LINE (PTR1) TO (PTR2)
*--------------------------------
GET.LINE LDY INDEX GET LN.CNT INDEX
DEY POSITION TO PREV LINE ENTRY
TYA
AND #$1F MASK TO MAKE INDEX CIRCULAR
TAY
STY INDEX
LDA LN.CNT,Y GET LENGTH OF LINE
STA PTR2
BEQ RTS2 NO MORE LINES
LDA SP.END PTR1=SP.END-SIZE
SEC SP.END=PTR1
SBC PTR2
STA SP.END
STA PTR1
LDA SP.END+1
SBC #0
STA SP.END+1
STA PTR1+1
LDA PP.BEG PTR2=PP.BEG-SIZE
SEC PP.BEG=PTR2
SBC PTR2
STA PP.BEG
STA PTR2
LDA PP.BEG+1
SBC #0
STA PP.BEG+1
STA PTR2+1
*** FALL INTO MOVE12
*--------------------------------
MOVE12 LDY #0 GET # BYTES IN LINE
LDA (PTR1),Y
STA (PTR2),Y MOVE FIRST BYTE
TAY
DEY -1 FOR INDEXING
.1 LDA (PTR1),Y MOVE A BYTE (PTR1) TO (PTR2)
STA (PTR2),Y
DEY NEXT BYTE
BNE .1
RTS
*--------------------------------
FIND.LAST.PAGE
LDY #31 INIT INDEX
LDA #0
STA INDEX
.1 STA LN.CNT,Y ZERO LN.CNT TABLE ENTRIES
DEY
BPL .1
LDA SP.BEG SET PTR1=SP.BEG
STA PTR1
CMP SP.END SEE IF END OF SCROLL STACK
BNE .2 NOT END
LDA SP.BEG+1
CMP SP.END+1
BNE .3 NOT END
RTS YES, END OF STACK
.2 LDA SP.BEG+1
.3 STA PTR1+1
.4 LDY #0 GET LINE LENGTH
LDA (PTR1),Y
PHA SAVE IT
LDY INDEX
STA LN.CNT,Y PUT IT IN TABLE
INY NEXT TABLE ENTRY
TYA
AND #$1F WRAP ARROUND
STA INDEX SAVE INDEX
PLA RESTORE LENGTH
CLC
ADC PTR1 PTR1=PTR1+LENGTH
STA PTR1
LDA #0
ADC PTR1+1
STA PTR1+1
LDA PTR1 IF PTR1=SP.END
CMP SP.END THEN END OF SEARCH
BNE .4 AND TABLE HAS LAST
LDA PTR1+1 32 LINE LENGTHS
CMP SP.END+1
BNE .4 SEARCH FOR MORE
RTS END OF SEARCH
*--------------------------------
FIX.POSV CMP POSV
BEQ .1 IF CURSOR POSV<=LAST LINE SHOWN
BCS .2 NO, ITS OK
.1 STA POSV SET NEW CURSOR POSN
LDA LEFT.MARGIN TO *EOF* LINE
STA POSH
LDA POSV
.2 RTS
*--------------------------------
SHOW.EOF LDA CTR POSITION VERTICALLY
JSR MY.VTAB
LDA #0 COLUMN 0
JSR MY.HTAB
LDA LN.FLAG SEE IF LINE NUMBERS ON SCREEN
BEQ .2 NO
.0 LDY #0
.1 LDA #$A0 OUTPUT BLANKS FOR LINE NUMBER
JSR MY.COUT
INY
CPY RM.ADJUST
BCC .1
.2 LDY #0
.3 LDA Q.EOF,Y PRINT "*EOF*
JSR MY.COUT
INY
CPY #5
BCC .3
JMP MY.CLREOP CLEAR TO END OF PAGE
*
Q.EOF .AS -/*EOF*/
*--------------------------------
SHOW.SCREEN
LDA LEFT.MARGIN
STA FILL.TO SET BLANK FILL LIMIT
JSR P1.INIT
LDY #0 SHOW BANNER ON LINE 0
JSR BANNER
LDA FIRST.LINE INIT FIRST DISPLAY LINE
STA CTR
.1 JSR P1.ENDCK
BEQ .99 END OF PROG LINES
.2 LDA ESC.FLAG ARE WE IN EDIT MODE?
BEQ .4 NO
LDA CTR
CMP POSV IS THIS THE EDIT LINE
BNE .4 NO
JSR REST.WBUF YES SHOW THE SAVED WBUF
JMP .5
.4 JSR GET.LINE.IN.WBUF GET SOURCE CODE INTO WBUF
.5 JSR SHOW.LINE.IN.WBUF SHOW WBUF
JSR P1.ADD BUMP TO NEXT LINE
INC CTR
LDA CTR
CMP LAST.LINE END OF SCREEN
BCC .1 NO
BEQ .1
CLC
ADC #1
STA MAXV SET MAX = LINE 25
BNE .7 ...ALWAYS
.99 LDA CTR
STA MAXV MAX IS WHERE WE ARE
CMP LAST.LINE
BEQ .6
BCS .7
.6 JSR FIX.POSV ADJUST POSV AND POSH
JSR SHOW.EOF PUT *EOF* ON SCREEN
.7 LDY #23 PUT BANNER ON LINE 23
*** FALL INTO BANNER
*--------------------------------
BANNER LDA FORM.FLG IF FORM FLAG NOT ON
BNE .1
RTS JUST RETURN
.1 STY CTR ELSE SAVE LINE
LDA #0 PUT EOL AT WBUF END
STA WBUF+255
LDY #254 FILL WBUF WITH
LDA #'. "."
.2 STA WBUF,Y
DEY
CPY #START.COL-1
BNE .2
LDA #'+
STA WBUF+START.COL+5-1
LDA #9 INIT N=10-1
.3 PHA SAVE N
CLC
ADC #1 LNO=N+1
STA LNO SET NEW LINE NUM
LDA #0
STA LNO+1
JSR CVRT.LNX CVRT TO ASCII DECIMAL
PLA GET BACK N
TAY
LDA #'+
STA WBUF+START.COL,Y MARK OFF +00
CPY #254-START.COL-5
BCS .4
STA WBUF+START.COL+5,Y AND +05
.4 LDA WBUF+2 MOVE 1ST DIGIT
STA WBUF+START.COL+1,Y
LDA WBUF+3 MOVE 2ND DIGIT
STA WBUF+START.COL+2,Y
LDA WBUF+4 MOVE 3RD DIGIT
STA WBUF+START.COL+3,Y
TYA
ADC #10 N=N+10
CMP #254-START.COL-5 SEE IF ALL DONE
BCC .3 NO, BUILD MORE
.5 LDY #START.COL-1 FILL START WITH BLANKS
* dcj *BNE FILL.BACK AND SHOW WBUF
*--------------------------------
FILL.BACK JSR FILL.WBUF BACK FILL WBUF WITH BLANKS
BEQ SHOW.LINE.IN.WBUF BA THEN SHOW WBUF
*--------------------------------
E.SHOW.LINE LDA POSV
STA CTR
*--------------------------------
SHOW.LINE.IN.WBUF
LDA CTR SET VERT POSN
JSR MY.VTAB
LDA #0
JSR MY.HTAB START COL 0 ON SCREEN
LDA LN.FLAG TEST LINE NUM FLAG
BEQ .2 NO LINE NUMBERS
LDY #0
.1 LDA WBUF,Y SHOW COL 0 THRU START.COL-1
BEQ .99 AS LINE NUM
ORA #$80
JSR MY.COUT
INY
CPY #START.COL
BCC .1
*** TYA
*** JSR MY.HTAB
.2 LDY LEFT.MARGIN START AT LEFT MARGIN
.3 LDA WBUF,Y IN WBUF AND PRINT ON SCREEN
BEQ .99 END OF WBUF
ORA #$80
JSR MY.COUT
INY
CPY RIGHT.MARGIN GO TO RIGHT MARGIN
BCC .3
.99 JMP MY.CLREOL ZAP TO EOL
*--------------------------------
FILL.WBUF LDA #$20 SET A BLANK
.1 STA WBUF,Y FILL WBUF
DEY UNTIL Y GOES 0
BNE .1
STA WBUF (DOESN'T AFFECT STATUS)
RTS RETURN EQ STATUS
*--------------------------------
GET.LINE.IN.WBUF
LDA PTR1 SRCP=PTR1
STA SRCP
LDA PTR1+1
STA SRCP+1
LDA #0
STA RPTCNT INIT REPEAT COUNT
STA RPTCHR
JSR GNBI SRCP=SRCP+1
JSR GNB GET A BYTE
STA LNO SAVE LNO
JSR GNB
STA LNO+1
LDA LN.FLAG TEST FOR LINE NUM SHOW
BEQ .1 NO
LDA LNO
ORA LNO+1
BEQ .1 BLANK LINE NUM IF=0
JSR CVRT.LNO ELSE CONVERT IT TO ASCII
LDX #START.COL
BNE .3
.1 LDX #0 NO LINE NUM
.2 LDA #$20 SHOW BLANKS INSTEAD
STA WBUF,X
INX
CPX #START.COL
BCC .2
.3 JSR NTKN GET A SOURCE LINE CHAR
STA WBUF,X PUT IT IN WBUF
INX NEXT POSN
TAY TEST FOR END CHAR
BNE .3
LDA #$20 MAKE SURE WBUF IS FILLED
DEX TO LEFT MARGIN
.4 CPX FILL.TO WITH BLANKS
BCS .5
STA WBUF,X
INX
BNE .4 ...ALWAYS
.5 LDA #0 THEN PUT DOWN END CODE
STA WBUF,X
RTS
*--------------------------------
CVRT.LNX LDY #0
LDA #1
STA CV.DIGFLG NO ZERO SUPPRESS
BNE CVRT.L
CVRT.LNO LDY #0 ALLOW ZERO SUPPRESS
STY CV.DIGFLG
CVRT.L LDX #4 5 DIGITS
.1 LDA #$30
.2 PHA
SEC
LDA LNO
SBC DTBL,X
PHA
LDA LNO+1
SBC DTBH,X
BCC .3
STA LNO+1
PLA
STA LNO
PLA
ADC #0
BNE .2
.3 PLA
PLA
CPX #0
BEQ .6
CMP #$30
BNE .6 NON ZERO PREVENT ZERO SUPPRESS
LDA CV.DIGFLG TEST ZERO SUP
BNE .5 NONE
LDA #$20 SUP ZERO WITH BLANK
BNE .4
.5 LDA #$30 PRINT ZERO
.6 INC CV.DIGFLG PREVENT ZERO SUP
.4 STA WBUF,Y STUFF DIGIT IN WBUF
INY
DEX
BPL .1 GET NEXT DIGIT
LDA #$20 PUT BLANK AT END
STA WBUF,Y
RTS
DTBL .DA #1,#10,#100,#1000,#10000
DTBH .DA /1,/10,/100,/1000,/10000
*--------------------------------
NTKN LDY #0
LDA RPTCNT GET REPEAT COUNT
BNE .3 IF >0 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

112
FSE/FSE.S.A2.txt Normal file
View File

@ -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

240
FSE/FSE.S.A2E.txt Normal file
View File

@ -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

479
FSE/FSE.S.LINE.txt Normal file
View File

@ -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<TAB(I) INSERT BEFORE TAB(I)
INY
CPY #SZ.TAB.TBL-1
BCC .1
* APPEND TAB ON END
LDA TAB.TBL+SZ.TAB.TBL-1
BNE .99 FULL TABLE
.2 LDA TAB.TBL,Y LOOK BACKWARDS FOR NON-ZERO ENTRY
BNE .3 FOUND IT
DEY
BPL .2
TXA FIRST ENTRY IS ZERO
STA TAB.TBL PUT NEW TAB THERE
BNE .90
.3 TXA PUT INTO NEXT ENTRY
STA TAB.TBL+1,Y THAT WAS THE LAST ZERO ENTRY
BNE .90 ...ALWAYS
* DELETE TAB FROM TABLE
.10 LDA TAB.TBL+1,Y GET NEXT ENTRY
STA TAB.TBL,Y PUT INTO CUR ENTRY
INY
CPY #SZ.TAB.TBL-1 SEE IF END OF TABLE
BCC .10
LDA #0 ZAP LAST ENTRY IN TABLE
STA TAB.TBL+SZ.TAB.TBL-1
BEQ .90 ...ALWAYS
* INSERT TAB IN TABLE
.20 PHA SAVE TAB
LDA TAB.TBL,Y GET CUR ENTRY
TAX SAVE IT
PLA GET NEW TAB
STA TAB.TBL,Y PLUG IT IN
TXA RECOVER SAVED TAB
INY
CPY #SZ.TAB.TBL-1 DO ANOTHER INSERT
BCC .20 IF NOT END OF TABLE
BCS .90 ...ALWAYS
.99 JSR M.BELL
.90 CLC
RTS
*--------------------------------
E.PROCESS.KEY LDA SPECIAL.FLG CK FOR SPECIAL EDIT KEY
BEQ E.PK1 NOT SPECIAL
LDA #0 CLEAR SPECIAL
STA SPECIAL.FLG EDIT FLAG
JSR COMP.PTR copy POSH into ED.PTR using X-reg
LDA CUR.KEY GET EDIT KEY
JMP E.PK2 'JMP' SINCE ^@ = $00
E.PK1 JSR GET.KEY
E.PK2 CMP #$20 IS IT CONTROL CHAR
BCC E.CNTRL YES
STA CHANGE.FLG NO, SET CHANGE FLAG AND TYPE OVER
STA WBUF,X CURSOR CHAR
JSR E.SHOW.LINE DISPLAY LINE TO SHOW CHANGE
LDX ED.PTR GET POSITION
E.RIT CPX #254 END OF MAX LINE?
BCS E.RIT2 YES
JSR MOVE.RT NO, MOVE RIGHT 1 COLUMN
E.RIT1 JSR SHOW.ND SHOW SCREEN IF NECESSARY
E.RIT2 CLC
RTS
*--------------------------------
E.BKSP JSR MOVE.LF MOVE LEFT TO PROCESS A BACKSPACE
JMP E.RIT1 GO SHOW SCREEN IF NEEDED
*--------------------------------
E.CNTRL LDY #0 SEARCH EDIT MODE FUNCTION TABLE
.1 CMP E.TBL,Y COMPARE KEY TO TABLE
BEQ .2 FOUND KEY
INY
INY
INY
CPY #E.TBLSZ
BCC .1
JSR M.BELL NOT IN TABLE ERROR
JMP E.PK1
.2 LDA E.TBL+2,Y EXECUTE THE FUNCTION
PHA
LDA E.TBL+1,Y
PHA
RTS
*--------------------------------
E.END LDX #254 SEARCH FROM HERE
LDA #$20 BLANK CHAR
.1 CMP WBUF,X IS IT BLANK
BNE .2 NO FOUND END CHAR
DEX
CPX #START.COL-1 DONT PASS COLUMN 1
BNE .1
.2 CPX #254 IF FULL LINE DONT PASS EOL
BEQ .3 YES ON EOL
INX NEXT CHAR IS END
.3 TXA THIS IS POSITION, LOCATE IT IN A WINDOW
**** FALL INTO LOC.WNDW ****
*--------------------------------
LOC.WNDW STA POSH IF LM>=POSH<RM
CMP LEFT.MARGIN THEN STAY ON CURRENT WINDOW
BCC .0 OTHERWISE HUNT FOR WINDOW
CMP RIGHT.MARGIN
BCS .0
RTS STAY ON WINDOW, RTN CRY CLR
.0 LDA #START.COL
.1 JSR SET.MARGIN
LDA LEFT.MARGIN
CLC
ADC HORT.PAGE
CMP POSH
BCS .2 FOUND THE WINDOW
CMP RT.FENCEL
BCC .1 NOT TOO FAR YET
LDA RT.FENCEL THIS IS MAX LEFT MARGIN
CMP LEFT.MARGIN UNLESS IT WAS BEFORE
BNE .1 NO, TRY NEXT LEFT MARGIN
LDA RIGHT.MARGIN BACK POSH TO THE
JSR LIMITR RIGHT MARGIN
.2 JMP E.RIT1
*--------------------------------
E.TAB TXA
SEC
SBC #START.COL-1 CONVERT POSH TO TAB VALUES
LDY #0
.1 CMP TAB.TBL,Y SEARCH TAB TABLE
BCC .2 IF POSH<TAB(I) THEN POSITION TO TAB(I)
INY
CPY #SZ.TAB.TBL-1
BCC .1
LDA TAB.TBL USE FIRST TAB IF PAST LAST TAB
BNE E.TAB.BUMP WRAP ARROUND TABS!
CLC IF NO FIRST TAB, DO NOTHING
RTS
.2 LDA TAB.TBL,Y GET NEW POSH FROM TAB TABLE
E.TAB.BUMP CLC
ADC #START.COL-1 CONVERT TO REAL POSITION
BNE LOC.WNDW LOCATE IT IN A WINDOW
*--------------------------------
E.COPY1 LDA ED.PTR
SEC
SBC #START.COL-1 CONVERT POSH TO TAB VALUE
TAX
LDY #0
.1 CMP TAB.TBL,Y SEARCH TAB TABLE
BCC .2 AHA, FOUND POSITION TO COPY TO!
INY
CPY #SZ.TAB.TBL-1
BCC .1
LDA #248 COPY TO EOL IF PAST LAST TAB
BCS .3 ...ALWAYS
.2 LDA TAB.TBL,Y END POINT
.3 STA ED.KEY NEW CURSOR POSN
.4 LDA WBUF+START.COL-1,X COPY FROM WBUF
STA $F00+START.COL-1,X INTO SAVED WBUF
INX
CPX ED.KEY UNTIL WE REACH THE CURRENT
BCC .4 POSITION
TXA THIS IS NEW POSN
PHA SAVE POSN
JSR REST.WBUF RESTORE WBUF
JSR E.SHOW.LINE DISPLAY IT
PLA GET SAVED POSN
STA CHANGE.FLG SET CHANGE FLAG
BNE E.TAB.BUMP ...ALWAYS
*--------------------------------
E.COPY JSR SAVE.WBUF SAVE WBUF DATA
LDA POSV
SEC
SBC FIRST.LINE
BNE .1
LDY #255 IF ON FIRST LINE THEN PREV LINE=BLANKS
JSR FILL.WBUF
JMP E.COPY1
.1 STA CTR LOCATE AND GET PREV LINE IN WBUF
JSR P1.INIT
.2 DEC CTR
BEQ .3
JSR P1.ADD
JMP .2
.3 LDA #255 SET BLANK FILL POINT
STA FILL.TO
JSR GET.LINE.IN.WBUF
JMP E.COPY1
*--------------------------------
E.RESTORE
LDA SAV.PTR1 RESTORE LINE FROM PROG
STA PTR1 THROW AWAY EDIT CHANGES
LDA SAV.PTR1+1
STA PTR1+1
JSR E.GETLN GET CUR LINE
JSR E.SHOW.LINE DISPLAY NEW LINE
*** FALL INTO E.BEG ***
*--------------------------------
E.BEG LDA #START.COL SET POSN TO BEGINING OF LINE
STA POSH
CMP LEFT.MARGIN ARE WE ALREADY ON RIGHT WINDOW?
BEQ E.SL YES
JSR SET.MARGIN NO SET NEW MARGIN
JSR SHOW.ND AND SHOW IT
E.SL JSR E.SHOW.LINE SHOW CUR EDIT LINE
CLC
RTS
*--------------------------------
E.DEL LDX #1 SET CHANGE FLAG
STX CHANGE.FLG
LDX ED.PTR GET POSN
.1 LDA WBUF,X CK END OF LINE
BEQ E.SL YES END
LDA WBUF+1,X GET NEXT CHAR
BEQ .2 END OF LINE
STA WBUF,X PUT OVER PREV CHAR
INX NEXT COL SHIFT
BNE .1 ..ALWAYS
.2 LDA #$20 PUT BLANK AT LAST
STA WBUF,X CHAR POSN
BNE E.SL ...ALWAYS
*--------------------------------
E.ZAP LDA #$20 BLANK CHAR
STA CHANGE.FLG SET CHANGE FLAG
.1 STA WBUF,X BLANK OUT FROM CUR POSN
INX TO EOL
CPX #255
BNE .1 NEXT COLUMN
BEQ E.SL ...ALWAYS (GO SHOW LINE)
*--------------------------------
E.FIND JSR GET.KEY GET KEY TO FIND
STA ED.KEY SAVE IT
.1 INX NEXT COLUMN
CPX #255 END OF WBUF?
BEQ .2 YES
CMP WBUF,X CK FOR KEY
BNE .1 NOT THERE
TXA
JSR LOC.WNDW GET CORRECT WINDOW
JSR GET.KEY GET KEY TO FIND
CMP ED.KEY IS IT SAME
BEQ .1 NO, TREAT AS EDIT KEY
JMP E.PK2
.2 JSR M.BELL
CLC
RTS
*--------------------------------
E.OVR JSR GET.KEY GET KEY CODE
CMP #0 CANT INSERT A CNTRL @
BNE E.INS1 ...NOT CNTRL @
E.INS JSR GET.KEY GET A KEY
CMP #$20 EXIT INSRT ON ANY CONTROL CHAR
BCS E.INS1 NOT CONTROL
JMP E.CNTRL YES CONTROL
E.INS1 LDX #1
STX CHANGE.FLG SET CHANGE FLAG
LDX ED.PTR GET CUR POSN
.1 CPX #254 ARE WE ON EOL?
BCS .2 YES
PHA SAVE NEW KEY
LDA WBUF,X GET CUR CHAR
TAY SAVE IT
PLA RECOVER NEW KEY
STA WBUF,X PUT INTO CUR POSN
INX NEXT COLUMN
TYA NEW KEY = CUR KEY
BNE .1 AGAIN IF NOT EOL
.2 STA WBUF,X TYPE OVER IF ON EOL
LDA #0
STA WBUF+255 MAKE SURE EOL ON END
JSR E.SHOW.LINE SHOW LINE
JSR MOVE.RT MOVE RIGHT 1 COLUMN
JSR SHOW.ND SHOW SCREEN IF NECESSARY
JMP E.INS GO DO ANOTHER CHAR INSERT
*--------------------------------
E.ESC LDA #0 SET SCROLL MODE
STA ESC.FLAG
E.CTRL SEC
RTS
*--------------------------------
E.GETLN LDA LN.FLAG SAVE OLD LN.FLAG
PHA
LDA #0
STA CHANGE.FLG INIT TO FALSE
LDA #255
STA FILL.TO COL TO FILL TO
LDA #START.COL
STA LN.FLAG FORCE LINE NUM IN WBUF
JSR GET.LINE.IN.WBUF
PLA
STA LN.FLAG RESTORE LN.FLAG
RTS
*--------------------------------
SAVE.WBUF LDY #0 SAVE 256 BYTE WBUF
.1 LDA WBUF,Y
STA $F00,Y
INY
BNE .1
RTS
*--------------------------------
SHOW.ND LDY #0
LDA NO.SHOW.FLAG
BEQ .1
STY NO.SHOW.FLAG
RTS
.1 JSR SAVE.WBUF SAVE WBUF SINCE
* SHOW.SCREEN USES IT
JSR SHOW.SCREEN
REST.WBUF LDY #0
.1 LDA $F00,Y RECOVER SAVED WBUF
STA WBUF,Y
INY
BNE .1
RTS
*--------------------------------
MAN
SAVE usr/src/fse/fse.s.line
LOAD usr/src/fse/fse.s
ASM

151
FSE/FSE.S.STB80.txt Normal file
View File

@ -0,0 +1,151 @@
NEW
AUTO 3,1
*--------------------------------
C.TMP1 .EQ VAR.BEG-1
C.TMP2 .EQ C.TMP1-1
C.TMP3 .EQ C.TMP2-1
C.TMP4 .EQ C.TMP3-1
.DO C.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 C.RD.KBD
JMP C.MY.HTAB
JMP C.MY.VTAB
JMP C.MY.CLREOL
JMP C.MY.CLREOP
JMP C.MY.COUT
*--------------------------------
C.MY.CLP LDA CTR
JSR C.MY.VTAB
C.MY.CLREOP JSR C.MY.CLREOL CLEAR TO END OF LINE
LDA #0 START COL 0 FOR NEXT LINE
JSR C.MY.HTAB
INC CTR BUMP TO NEXT LINE
LDA CTR
CMP LAST.LINE CHK FOR END
BCC C.MY.CLP < END
BEQ C.MY.CLP = END
RTS > 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

234
FSE/FSE.S.SUBMIT.txt Normal file
View File

@ -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

220
FSE/FSE.S.VIDEX.txt Normal file
View File

@ -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

138
FSE/FSE.S.txt Normal file
View File

@ -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