A2osX/SCMASM.30/SCMASM.S.RLINE.txt

412 lines
12 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
*--------------------------------------
.MA JTBL
.DA #$]1,]2-1
.EM
*--------------------------------
CHAR.TABLES
CHARS.FOR.COMMANDS .EQ *-CHAR.TABLES
>JTBL 22,ECHO.LINE "--ECHO REST OF LINE
>JTBL 2D,PASS.CMD.TO.PRODOS DASH COMMAND
>JTBL 2E,USER.CMD .--USER DOT COMMAND
>JTBL 2F,LINK.FSE /--LINK TO F.S.E.
>JTBL 3F,HELP ?--list commands
>JTBL 00,NML other, try numbered line
*--------------------------------
CHARS.FOR.READ.LINE.1 .EQ *-CHAR.TABLES
>JTBL 83,RDL.CATALOG ^C--MACRO FOR "CATALOG"
>JTBL 85,RDL.EDIT ^E--MACRO FOR "EDIT "
>JTBL 86,RDL.FIND ^F--MACRO FOR "FIND "
>JTBL 8C,RDL.LIST ^L--MACRO FOR "LIST "
>JTBL 90,RDL.PREFIX ^P--MACRO FOR "PREFIX"
CHARS.FOR.READ.LINE.2 .EQ *-CHAR.TABLES
>JTBL 88,RDL.BACKSPACE ^H--BACKSPACE
>JTBL 8A,RDL.DOWN ^J--DOWN ARROW KEY
>JTBL 8B,RDL.UP ^K--UP ARROW KEY
>JTBL 8D,RDL.EOL ^M--CARRIAGE RETURN
>JTBL 8F,RDL.OVERRIDE ^O--OVERRIDE
>JTBL 93,RDL.TOGGLE ^S--TOGGLE CASE FLAG
>JTBL 95,RDL.RITARR ^U--RIGHT ARROW
>JTBL 98,RDL.RUBOUT ^X--RUBOUT LINE
>JTBL 9B,RDL.ESCAPE ESC--ESCAPE MODE
>JTBL 00,RDL.ERR
*--------------------------------
CHARS.FOR.ESCAPE .EQ *-CHAR.TABLES
>JTBL C0,IO.HOME @--CLEAR SCREEN AND HOME
>JTBL C1,IO.RIGHT A--MOVE CURSOR RIGHT
>JTBL C2,IO.LEFT B--MOVE CURSOR LEFT
>JTBL C3,IO.DOWN C--MOVE CURSOR DOWN
>JTBL C4,IO.UP D--MOVE CURSOR UP
>JTBL C5,IO.CLREOL E--CLEAR TO END OF LINE
>JTBL C6,IO.CLREOP F--CLEAR TO END OF SCREEN
>JTBL C9,IO.UP I--MOVE CURSOR UP
>JTBL CA,IO.LEFT J--MOVE CURSOR LEFT
>JTBL CB,IO.RIGHT K--MOVE CURSOR RIGHT
>JTBL CC,ESCAPE.L L--"LOAD ..." OR "*---..."
>JTBL CD,IO.DOWN M--MOVE CURSOR DOWN
>JTBL D3,ESCAPE.S S--AUTO-SAVE LINE
>JTBL D5,USER.ESC.U U--USER COMMAND
>JTBL AE,ESCAPE.DOT .--LIS., COMMAND
>JTBL 88,IO.LEFT ^H--LEFT ARROW KEY
>JTBL 95,IO.RIGHT ^U--RIGHT ARROW KEY
>JTBL 8A,IO.DOWN ^J--DOWN ARROW KEY
>JTBL 8B,IO.UP ^K--UP ARROW KEY
>JTBL 00,RDL.ESC.END END ESCAPE MODE
*--------------------------------
CHARS.FOR.EDIT .EQ *-CHAR.TABLES
>JTBL 80,E.ZAP ^@ -- Clear to EOL
>JTBL 81,E.INS ^A -- Add (Insert)
>JTBL 82,E.BEG ^B
>JTBL 84,E.DEL ^D
>JTBL 86,E.FIND ^F
>JTBL 88,E.BKSP ^H
>JTBL 89,E.TABI ^I -- Clear to tab
>JTBL 8C,E.DOWN ^L
>JTBL 8D,E.RET ^M
>JTBL 8E,E.END ^N
>JTBL 8F,E.OVR ^O
>JTBL 91,E.RETQ ^Q -- Clear to EOL, Quit
>JTBL 92,E.RESTORE ^R -- Restore original line
>JTBL 93,E.TOGGLE ^S -- TOGGLE CASE FLAG
>JTBL 94,E.TAB ^T
>JTBL 95,E.RIT ^U
>JTBL 98,E.ABORT ^X
>JTBL 00,E.ILLCHAR
*--------------------------------
RDL.TOGGLE
JSR IO.CASE.TOGGLE
JMP RDL3
*--------------------------------
RDL.UP
JSR IO.UP
JMP RDL3
*--------------------------------
RDL.DOWN
JSR IO.DOWN
JMP RDL3
*--------------------------------
* HANDLE TABULATION
*--------------------------------
TAB TXA SEE IF IN COLUMN 1
BEQ .4 YES, AUTO-LINE-NUMBER
.3 JSR E.CHECK.TAB
BCS .5 ONE MORE SPACE
LDA #CHR.BLANK
JSR INSTALL.CHAR
BCC .3 MORE TO GO
JMP RDL.RUBOUT
*--------------------------------
.4 CLC ADD INCREMENT TO CURRENT LINE #
LDA CURLNO
ADC INCREMENT.VALUE
STA CURRENT.LINE.NUMBER
LDA CURLNO+1
ADC INCREMENT.VALUE+1
STA CURRENT.LINE.NUMBER+1
LDY #0
JSR CONVERT.LINE.NUMBER.BOTH STORE AND PRINT NUMBER
TYA
TAX
*--------------------------------
.5 LDA #CHR.BLANK
JMP RDL.ADD.CHAR
*--------------------------------
* READ LINE SUBROUTINE
*--------------------------------
READ.LINE
JSR GET.HORIZ.POSN
TAX TEST FOR POSITION=0
BEQ RDL1 DON'T OUTPUT CRLF
RDL0 JSR CRLF
RDL1 LDA PROMPT.FLAG
JSR CHO NULL, "I", OR "H"
LDA #':' COLON PROMPT
JSR CHO
LDX #0 START NEW LINE
STX WBUF CLEAR OUT "$" FROM COL. 1 (JUST IN CASE)
BIT AUTOLN.FLAG SEE IF IN "AUTO" MODE
BMI TAB ...YES
RDL3 JSR READ.KEY.WITH.CASE
BCS RDL.ESCAPE.2E
LDY WBUF SEE IF IN $ OR " MODE
CPY #$A2 "?
BEQ .2
CPY #$A4 $?
BEQ .2
CMP TAB.CHAR <<ALLOW TAB.CHAR TO BE NON-CTRL
BEQ TAB
LDY #CHARS.FOR.READ.LINE.1
.HS 2C
.2 LDY #CHARS.FOR.READ.LINE.2
CMP #CHR.BLANK SEE IF CONTROL CHAR
BCS RDL.ADD.CHAR NO
STA CURRENT.CHAR
JMP SEARCH.CHAR.TABLES
*--------------------------------
RDL.ERR
JSR MON.BELL ALARM IF NOT ONE OF THE ABOVE
JMP RDL3 AND IGNORE IT
*--------------------------------
RDL.OVERRIDE
JSR READ.KEY.WITH.CASE
JMP RDL.ADD.CHAR
*--------------------------------
RDL.RITARR
JSR GET.HORIZ.POSN
TAY
JSR IO.PICK.SCREEN
RDL.ADD.CHAR
JSR INSTALL.CHAR
BCC RDL3 STILL ROOM FOR MORE
RDL.RUBOUT
LDA #CHR.BSLASH
JSR MON.COUT
JMP READ.LINE
*--------------------------------
RDL.BACKSPACE
LDA #$88
JSR MON.COUT PRINT BACKSPACE
TXA SEE IF OVER PROMPT
BEQ RDL0 YES, START NEW LINE
DEX NO, BACK UP BUFFER POINTER
JMP RDL3
*--------------------------------
RDL.PREFIX LDY #QM.PREFIX-QM.
.HS 2C
RDL.CATALOG LDY #QM.CATALOG-QM.
.HS 2C
RDL.LIST LDY #QM.LIST-QM.
.HS 2C
RDL.FIND LDY #QM.FIND-QM.
.HS 2C
RDL.EDIT LDY #QM.EDIT-QM.
*
CPX #0 ^C & ^E ONLY EFFECTIVE IN COL. 1
BNE RDL.ERR ...ELSE ERRONEOUS
.1 LDA QM.,Y SPELL OUT "EDIT " OR "CATALOG"
PHP SAVE TERMINATION STATUS
JSR INSTALL.CHAR
INY
PLP GET TERMINATION STATUS
BPL .1 ...NOT FINISHED YET
JMP RDL3
*--------------------------------
* HANDLE ESCAPE EDITING
*--------------------------------
RDL.ESCAPE
JSR READ.KEY.WITH.CASE
RDL.ESCAPE.2E
JSR ELIMINATE.CASE
STA CURRENT.CHAR
LDY #CHARS.FOR.ESCAPE
JSR SEARCH.CHAR.TABLES
LDA CURRENT.CHAR
CMP #"L" STAR DASH LINE?
BEQ RDL.EOL ...YES, FINISH IT OFF
CMP #$A0 CHECK FOR ARROW KEYS (//E)
BCC RDL.ESCAPE ...YES, STAY IN ESCAPE MODE
CMP #$C9 IJKM?
BCC RDL4 ...NO, LEAVE ESCAPE MODE
CMP #$CE
BCC RDL.ESCAPE ...YES, STAY IN ESCAPE MODE
BCS RDL4 ...NO, LEAVE ESCAPE MODE
RDL.ESC.END
PLA
PLA
RDL4 JMP RDL3
*--------------------------------
RDL.EOL
JSR IO.CLREOL
LDA #CHR.RETURN
STA WBUF,X
JSR MY.COUT
LDY #0
STY MON.MODE
INY
LDA WBUF GET FIRST CHAR
CMP #CHR.DOLLAR
BEQ FAKE.MONITOR
JMP RDL.STRIP.LINE
*--------------------------------
* FAKE MONITOR
*--------------------------------
FMN1 CPX $FBC0 //C ID BYTE (X = 0 OR 1)
BCC .1 ...NOT //C (//C = 0, OTHERS > 1)
DEY
BMI FMN3 ...NOT VALID COMMAND
CPY #$13
BCS FMN2
.1 JSR MON.TOSUB
LDY MON.YSAV
FAKE.MONITOR
JSR FMN5 INDIRECT TO MON.GETNUM
STY MON.YSAV
CMP #$C6 $8D EOR $B0 PLUS $89
BEQ FMN4 ...<RETURN>
LDY #22 # CMDS - 1
FMN2 CMP MON.CHRTBL,Y
BEQ FMN1 ...FOUND CMD IN TABLE
DEY ...NEXT ENTRY
BPL FMN2 ...NEXT ENTRY
FMN3 JSR MON.BELL ...NOT IN TABLE
JMP READ.LINE
FMN4 LDA MON.MODE <RETURN> COMMAND
LDY #0
DEC MON.YSAV
JSR MON.BL1
JMP READ.LINE
FMN5 JMP ($FF74) MON.GETNUM CALL
*--------------------------------
* ESCAPE-L
* COLUMN 0: LOAD A FILE
* COL. 1-N: MAKE "*------" LINE
*--------------------------------
ESCAPE.L
TXA
BEQ .3 "LOAD ...."
*---GENERATE STAR-DASH LINE------
LDA #CHR.STAR
.1 JSR INSTALL.CHAR
LDA USER.COM.DELIM
CPX #38
BCC .1
.2 RTS
*---GENERATE LOAD COMMAND--------
.3 JSR IO.HTABX HTAB TO FIRST COLUMN
LDY #QBLOADB " LOAD "
JSR QT.OUT
LDX #22
JSR IO.HTABX
JSR GET.DOS.CMD.OFF.SCRN
PLA POP RETURN ADDRESS
PLA
JMP RDL.EOL SUBMIT COMMAND
*--------------------------------
* ESC-S AUTO SAVE LINE
*--------------------------------
ESCAPE.S
TXA
BNE .4 ...NOT IN COLUMN 1
JSR SETUP.TEXT.POINTERS
LDX #10 MUST APPEAR IN FIRST 10 LINES
.1 LDY #3 POINT TO FIRST TEXT CHAR OF LINE
LDA (SRCP),Y
JSR CHECK.COMMENT.CHAR
BEQ .5
.2 DEX PAST 10TH LINE?
BMI .4 ...YES, LOOK NO FURTHER
LDY #0 POINT TO LENGTH
LDA (SRCP),Y
CLC
ADC SRCP
STA SRCP
BCC .3
INC SRCP+1
.3 JSR CMP.SRCP.ENDP PAST END OF PROGRAM?
BCC .1 ...NO, KEEP LOOKING
.4 RTS
.5 INY
LDA (SRCP),Y
BEQ .2 ...END OF LINE
CMP #'S'
BNE .5
JSR LIST.CURRENT.LINE
*--------------------------------
GET.DOS.CMD.OFF.SCRN
JSR IO.CLREOL
LDY #0 NOW PICK 0...39 OFF SCREEN
LDX #0 BUT NO BLANKS
.1 JSR IO.PICK.SCREEN
STA WBUF,X STORE IN BUFFER
INY
CMP #" " ELIMINATE BLANKS
BEQ .2 ...BLANK
INX
.2 CPY #39
BCC .1
.3 DEY
JSR IO.PICK.SCREEN
CMP #" "
BEQ .3
INY
TYA
JMP IO.HTAB POSITION AFTER LAST NON-BLANK
*--------------------------------
* INSTALL CHARACTER IN INPUT BUFFER
*--------------------------------
INSTALL.CHAR
ORA #$80 ASSURE SIGN BIT ON
STA WBUF,X STORE IN INPUT BUFFER
CMP #$A0 CONTROL CHAR?
BCS .1 ...NO
AND #$3F ...YES, DISPLAY AS INVERSE
.1 JSR IO.COUT ECHO ON SCREEN
CPX #WBUF.MAX SEE IF END OF BUFFER
BCS .2 ...YES
INX
RTS
.2 JSR MON.BELL
SEC
RTS
*--------------------------------
* STRIP SIGN BITS OFF ALL BYTES
* AND CHANGE <CR> TO <EOL>
*--------------------------------
RDL.STRIP.LINE
LDY #$FF LOOP TO CLEAR HIGH BITS
.1 INY
LDA WBUF,Y
AND #$7F STRIP OFF BIT
CMP #$0D WAS IT THE END?
BNE .2 NOT YET
LDA #0 YES, SUBSTITUTE <EOL> FOR <CR>
.2 STA WBUF,Y
BNE .1 UNTIL <EOL>
TAX CLEAR X-REG
RTS
*--------------------------------
ESCAPE.DOT
TXA
BNE .5 NOT IN COLUMN 1, IGNORE IT
JSR GET.HORIZ.POSN FIND CURSOR POSITION
TAY
.1 JSR IO.PICK.SCREEN
AND #$7F
JSR CHECK.DIGIT
BCC .2 NOT A DIGIT
STA WBUF+4,X
INX
INY
BNE .1 ...ALWAYS
.2 TXA
BEQ .3 ...NO DIGITS
LDA #4
STA CHAR.PNTR
STA WBUF+4,X
LDX #CURLNO-A0L
JSR SCAN.1.DECIMAL.NUMBER
.3 LDY #4
LDX #0
.4 LDA LDC,Y
JSR INSTALL.CHAR
DEY
BPL .4
STA CURRENT.CHAR at end, current.char = comma
JSR IO.CLREOP
.5 RTS
*--------------------------------
LDC .AS /,.SIL/
*--------------------------------
QM.
QM.EDIT .AT /EDIT /
QM.CATALOG .AT /CATALOG/
QM.PREFIX .AT /PREFIX/
QM.LIST .AT /LIST /
QM.FIND .AT /FIND /
*--------------------------------------
MAN
SAVE usr/src/scmasm.30/scmasm.s.rline
LOAD usr/src/scmasm.30/scmasm.s
ASM