
********************************
*            PRIME             *
*     Bulletin Board System    *
*                              *
*      (C)opyright 1989        *
*      By Daniel Haynes        *
*                              *
*  AMPER COMMON SUB-ROUTINES   *
*                              *
********************************

 ORG $7200
BEGIN DA TSTMDM
 DA POUT
 DA MOUT
 DA MOUT1
 DA MINP
 DA PUSH
 DA CASE ;Convert to Upper case
 DA RDCHAR ;Read one key inputs
 DA DHOME ;Clear Screens
 DA SYNERR
 DA SYNERR
 DA SYNERR

JMPTBL DA RING
 DA ANSWER
 DA CRDET
 DA DINPUT
 DA HANGUP
 DA HANGUP
 DA CYCLE

********************************
*
* DSR = %0100 0000 $40 64
* CD  = %0010 0000 $20 32
*
********************************

CRMASK DFB $40

CNTDEL DFB 5 ;CONNECT DELAY
IENABLE DFB $00 ;INTERUPT ENABLE
DOHILOW DFB $00
DOMANUAL DFB $00
DOTRING DFB $00
DOTBAUD DFB $00
DO1200 DFB $00
DO2400 DFB $00
DOSETUP DFB $00
DOATA DFB $00
DOOK DFB $00
DOTCAR DFB $00
DORTN DFB $00
MDMSPD DFB $35
NRMSPD DFB $00
DRIVER DFB $00
CABLE DFB $00

********************************
*
* MANUAL SYNC SET UP STRINGS
*
* PROMETHUIS 1200A   'ATS0=1S7=10S2=255',0D,00
* U.S. ROBOTICS 2400 'ATS2=255S0=1V1X1E0Q0S7=15M0',0D,00
* NOVATION PRO 2400
*        DFB  13
*        ASC 'AT X3Q0V1E0S0=0S2=255S7=10&C1&D3&A0&W',0D,00
*
********************************

SETUP DFB 13
 ASC '                                     ',0D,00
 ASC '            '
 DFB 0

*===============================

PRFXTBL DFB 1
DSKPRF DA $0280

FNDMSG JSR LDMSG
 JMP SAVNUM

INPPRFX JSR LOCPRF
 LDX $0280
 TXA
 PHA
 LDY #$00
 INX
INPPF1 DEX
 BEQ INPF2
 LDA $0281,Y
 STA $0200,Y
 INY
 BNE INPPF1
INPF2
 JSR STRCOM
 LDA TXTPTR
 STA $87
 LDA TXTPTR+1
 STA $87+1
 PLA
 TAX
 JMP MINPT2

LOCPRF JSR GTBYTCM1
 ASL
 TAX
 SEI
 BIT $C083
 LDA $D000,X
 STA PTR
 LDA $D001,X
 STA PTR+1
 LDY #$00
 LDA (PTR),Y
 STA $0280
 TAX
 INX
 INY
:LOOP DEX
 BEQ :END
 LDA (PTR),Y
 STA $0280,Y
 PHP
 AND #$7F
 PLP
 BMI :END
 INY
 BNE :LOOP
:END BIT $C08A
 JSR EXIT
 JMP CHRGET

PREFIX JSR LOCPRF
 JSR MLI
 DFB $C6
 DA PRFXTBL
 BCS :DKERR
 LDA #$00
:DKERR JMP SAVNUM1

MFLAG DA 0

MOVFOR LDA (FORPNT),Y
 STA PTR
 INY
 LDA (FORPNT),Y
 STA PTR+1
 RTS

MOVIDX LDA INDEX
 STA PTR
 LDA INDEX+1
 STA PTR+1
 RTS

STRCOM JSR PTRGET
 STY FORPNT+1
 STA FORPNT
 JMP CHKSTR

NUMCOM JSR PTRGET
 STA FORPNT
 STY FORPNT+1
 JMP CHKNUM

LDMSG LDY #>MSGBUF
 LDA #MSGBUF
 STA PTR
 STY PTR+1
 RTS

CMPREG DFB $4C

AMPHK JMP ($035E)

FIND1 TSX
 STX SREG
 LDY #$00
 LDA (TXTPTR),Y
 AND #$7F
 ASL
 TAX
 LDA ADRTBL+1,X
 PHA
 LDA ADRTBL,X
 PHA
 JMP CHRGET

DHOME LDA OH
 BEQ :END
 LDA #12
 JSR MOUT
:END JMP HOME

PRTTTL LDA #$01
 STA STRCNT
 JSR NEWSTR
 LDY #$00
 JSR OLDSTR
 JMP MAKTTL

RDBUFF JSR CHRGOT
 CMP #EQUAL
 BNE RDBF1
NUMPTR JSR CHRGET
NUMPTR1 JSR FRMNUM
 JSR GETADR
NUMPTR2 LDA LINNUM
 STA PTR
 LDY LINNUM+1
 STY PTR+1
 RTS
RDBF1 JSR STRCOM
 LDA TXTPTR
 STA $87
 LDA TXTPTR+1
 STA $87+1
 LDY #$00
 LDX #$00
RDBF2 LDA (PTR),Y
 STA $0200,X
 BEQ RDBF4
 BMI :END
 BIT INTRP
 BMI :NEXT
 CMP #$0D
 BEQ RDBF3
:NEXT INY
 INX
 BNE RDBF2
 BEQ RDBF3
:END INX
 LDA #$00
 STA $0200,X
 BEQ RDBF5
RDBF3 INY
 TYA
 CLC
 ADC PTR
 STA PTR
 LDA PTR+1
 ADC #$00
 STA PTR+1
RDBF5 DEX
RDBF4 INX
 JMP MINPT2

INSTR JSR FRMEVL
 JSR FREFAC
 STA LENGTH
 JSR CHKSTR
 JSR MOVIDX
 JSR CHRGET
 JSR FRMEVL
 JSR FREFAC
 PHA
 JSR CHKSTR
 LDY #$00
 LDA (INDEX),Y
 LDX LENGTH
 JSR CASE
 STA CMPREG
 JSR CHRGET
 LDY #$00
 LDX LENGTH
 BEQ NOTINS
 PLA
 BEQ NOTINS
 INX
INSTR1 DEX
 BEQ NOTINS
 LDA (PTR),Y
 JSR CASE
 CMP CMPREG
 BEQ ISINS
 INY
 BNE INSTR1
NOTINS LDA #$00
 JMP SAVNUM1
ISINS INY
 TYA
 JMP SAVNUM1


INMID JSR FRMEVL
 JSR FREFAC
 STA LENGTH
 JSR CHKSTR
 JSR MOVIDX
 JSR CHRGET
 JSR STRCOM
 LDA FORPNT
 PHA
 LDA FORPNT+1
 PHA
 JSR GTBYTCM
 STX MIDPOS
 JSR GTBYTCM
 STX MIDLEN
 PLA
 STA FORPNT+1
 PLA
 STA FORPNT
 LDA LENGTH
 BNE MID0
MID RTS
MID0 LDY #$00
 LDA (FORPNT),Y
 STA ACTLEN
 BEQ MID
 INY
 LDA (FORPNT),Y
 TAX
 INY
 LDA (FORPNT),Y
 STA FORPNT+1
 STX FORPNT
 CLC
 LDY MIDLEN
 DEY
 TYA
 CLC
 ADC MIDPOS
 CMP ACTLEN
 BLT MID2
 BEQ MID2
 RTS
MID2 LDX MIDPOS
 DEX
 TXA
 CLC
 ADC FORPNT
 STA FORPNT
 LDA FORPNT+1
 ADC #$00
 STA FORPNT+1
 LDY MIDLEN
 DEY
 TYA
 CLC
 ADC MIDPOS
 CMP LENGTH
 BGE MIDD
 LDA MIDLEN
 STA LENGTH
MIDD LDX MIDLEN
 LDY #$00
 INX
MID3 DEX
 BEQ MID4
 LDA #' '
 STA (FORPNT),Y
 INY
 BNE MID3
MID4 LDY #$00
 LDX LENGTH
 INX
MID5 DEX
 BEQ MID6
 LDA (PTR),Y
 STA (FORPNT),Y
 INY
 BNE MID5
MID6 RTS

ACTLEN DFB 0
MIDPOS DFB 0
MIDLEN DFB 0

GETYN JSR RDCHAR
 JSR CASE
 CMP #'Y'
 BEQ GETYN1
 CMP #13
 BEQ GETYN1
 CMP #'N'
 BEQ GETYN2
 CMP #' '
 BEQ GETYN2
 LDA #$87
 JSR POUT
 JMP GETYN
GETYN1 LDA #'Y'
 LDY #$01
 BNE SENGET
GETYN2 LDA #'N'
 LDY #$02
SENGET PHA
 TYA
 JSR SAVNUM1
 PLA
 JSR POUT
 JMP CROUT

GETNUM1 JSR FRMNUM
 JSR CHRGET
 JMP GETADR

PEEK JSR GETNUM1
 LDY #$00
 LDA (LINNUM),Y
 PHA
 INY
 LDA (LINNUM),Y
 TAY
 PLA
 JMP SAVNUM

POKE JSR GETNUM1
 JSR NUMPTR2
 JSR FRMNUM
 JSR GETADR
 LDY #$00
 LDA LINNUM,Y
 STA (PTR),Y
 INY
 LDA LINNUM,Y
 STA (PTR),Y
 RTS

FRE LDA $BF30
 STA UNITNUM
 LDY #$00
 LDA #$02
 JSR DOREAD
 LDA MSGBUF+$2A
 LSR
 LSR
 LSR
 LSR
 STA PTR-1
 INC PTR-1
 LDA MSGBUF+$27
 LDY MSGBUF+$28
 JSR DOREAD
FRE1 LDY #$00
 STY TEMP1
 STY TEMP1+1
FREA JSR LDMSG
 JSR FREE
 INC PTR+1
 JSR FREE
 DEC PTR-1
 BEQ :END
 INC BLKNUM
 BNE :FRE0
 INC BLKNUM+1
:FRE0 JSR DOREAD1
 JMP FREA
:END JMP SAVNUM3

DOREAD STY BLKNUM+1
 STA BLKNUM
DOREAD1 JSR MLI
 DFB $80
 DA BLKPRM
 BCC :END
 LDX #$06
 JMP ERROR
:END RTS

FREE LDY #$00
 CLD
FRE2 LDX #$08
 LDA (PTR),Y
FRE3 ROL
 BCC FRE4
 INC TEMP1+1
 BNE FRE4
 INC TEMP1
FRE4 DEX
 BNE FRE3
 INY
 BNE FRE2
 RTS

BLKPRM DFB $03
UNITNUM DFB 0
 DA MSGBUF
BLKNUM DA $0006

RTN9 RTS
POP JSR GETBYT
 INX
 STX ARYCNT
 JSR GTBYTCM
 STX ADDVAR
 JSR CHRGET
 JSR STRCOM
POP1 DEC ARYCNT
 BEQ RTN9
 LDA FORPNT
 STA PTR
 LDA FORPNT+1
 STA PTR+1
 LDA ADDVAR
 BEQ POP0
 LDA FORPNT
 SEC
 SBC #$03
 STA FORPNT
 LDA FORPNT+1
 SBC #$00
 STA FORPNT+1
 JMP POP2
POP0 LDA FORPNT
 STA PTR
 CLC
 ADC #$03
 STA FORPNT
 LDA FORPNT+1
 STA PTR+1
 ADC #$00
 STA FORPNT+1
POP2 LDY #$02
POP3 LDA (FORPNT),Y
 STA (PTR),Y
 DEY
 BPL POP3
 JMP POP1

ADDVAR DFB 0
ARYCNT DFB 0

MOVPTR LDY #$01
 JMP MOVFOR

TXTSTAT DFB 0

END LDA TXTSTAT
 JMP SAVNUM1

MDMFN JSR GTBYTCM1
 ASL
 TAX
 LDA JMPTBL,X
 STA MHOOK+1
 LDA JMPTBL+1,X
 STA MHOOK+2
 JSR CHRGET
 LDA #$00
 STA SYSOP
 STA PAUSE?
MHOOK JSR MHOOK
 JMP SAVNUM1


SETTMR LDA #$00
 STA TMR1
 LDA #$04
 STA TMR1+1
 RTS

TMR1 DA 0

SETOPTR LDA #$02
 STA PTR+1
 LDA #00
 STA PTR
 RTS

GTBYTCM JSR CHRGET
GTBYTCM1 JSR GETBYT
 TXA
 RTS

DOTAB JSR GTBYTCM
 SEC
 SBC CHP
 STA XREG
 BCC SPC1
 CMP #$00
 BEQ SPC1
 CMP #80
 BLT SPC2
 JMP SPC1
SPACE JSR GTBYTCM
 CPX #$00
 BEQ SPC1
 STX XREG
SPC2 LDA #" "
 JSR POUT
 DEC XREG
 BNE SPC2
SPC1 JSR CHRGET
SPC3 JMP MORPRT

MTEXTQ
 JSR CHRGET
 JSR FRMEVL
 BIT VALTYP
 BMI MTEXTQ2
 JSR FOUT
 JSR STRLIT
MTEXTQ2 JSR FREFAC
 TAY
 DEY
 BEQ MTEXTQ6
MTEXTQ4 LDA (INDEX),Y
 ORA #$80
 CMP #" "
 BNE MTEXTQ5
 DEY
 BNE MTEXTQ4
MTEXTQ5 INY
 TYA
MTEXTQ6 TAX
 JMP MPRNTW

QSPACE JMP SPACE

PABRT DFB 0

HIPRNT JSR GTBYTCM
 JSR TABPRNT
:END JMP MORPRT

MPRINT DEC DOTIME
 BNE :NOPE
 JSR MRKTIM1
:NOPE LDA #$00
 STA TXTSTAT
 STA PABRT
MPRINT1 JSR FREND1
 JSR CHRGOT
 BEQ MORPRT
 CMP #34 ;QUOTE (")
 BEQ MPRNTF
 CMP #195 ;TOKEN - SPC(
 BEQ QSPACE
 CMP #'@'
 BEQ MTEXTQ
 CMP #EQUAL
 BEQ TEXT
 CMP #','
 BEQ CRPRT
 CMP #'!'
 BEQ SETABRT
 CMP #'#'
 BEQ HIPRNT
 CMP #$C0 ;TAB
 BNE MPRNTF
 JMP DOTAB
MPRNTF JSR FRMEVL
 BIT VALTYP
 BMI MPRNT1
 JSR FOUT
 JSR STRLIT
MPRNT1 JSR FREFAC
MPRNTW TAX
 LDY #$00
 INX
:LOOP DEX
 BEQ MORPRT
 LDA (INDEX),Y
 JSR FROUT
 INY
 BNE :LOOP
MORPRT JSR FORMAT
 JSR CHRGOT
 CMP #';'
 BEQ RET5
 CMP #','
 BEQ CRPRT
 CMP #':'
 BEQ ENDCR
 CMP #'!'
 BEQ SETABRT
 CMP #$00
 BEQ ENDCR
 BNE RET6
ENDCR JSR FCROUT
 JMP RET6
CRPRT JSR FCROUT
RET5 JSR CHRGET
 BEQ RET6
 CMP #':'
 BEQ RET6
 JMP MPRINT1
RET6 LDA #$00
 STA PABRT
 RTS
SETABRT LDA #$FF
 STA PABRT
 JSR CHRGET
 JMP MORPRT

LPTR DA 0

TEXT JSR NUMPTR
TEXT1 LDA #$00
 STA TXTSTAT
 LDA #$FF
 STA PABRT
:LOOP LDY #$00
 LDA (PTR),Y
 BEQ :DONE
 CMP #$01
 BEQ :LOOP1
 CMP #26
 BEQ :LOOP1
 JSR FROUT
:LOOP1 JSR INCPTR
 LDA PTR+1
 CMP #$70
 BNE :LOOP
 CLC
 RTS
:DONE SEC
 RTS

ABRTXRG DFB 0
CMPABRT DFB 0
ABRTCH DS 20

SAVABRT JSR STRPULL
:LOOP DEX
 BEQ :FIN
 LDA (INDEX),Y
 STA ABRTCH,Y
 INY
 CPY #20
 BLT :LOOP
:FIN LDA #$00
 STA ABRTCH,Y
 RTS

DOABRT LDA PABRT
 BNE DOABRT1
NOABRT RTS
DOABRT1 LDA TBUFF
 BEQ NOABRT
 JSR CASE
 STX ABRTXRG
 STA CMPABRT
 LDX #$00
:LOOP LDA ABRTCH,X
 BEQ :NONE
 CMP CMPABRT
 BEQ TXTABT
 INX
 BNE :LOOP
:NONE LDX ABRTXRG
 RTS
TXTABT INX
 STX TXTSTAT
 JSR FNDEOL
 JSR PULL
 JSR DOCR
 LDA #$00
 STA PABRT
 JSR DOCLOSE
 LDX SREG
 TXS
 RTS

FNDEOL JSR CHRGOT
:FNDEOL1 CMP #$00
 BEQ :FNDEND
 CMP #':'
 BEQ :FNDEND
 JSR CHRGET
 BNE :FNDEOL1
:FNDEND RTS

XREG1 DFB 0
YREG1 DFB 0

FYREG DFB 0
FXREG DFB 0
FAREG DFB 0

LYREG DFB 0
FLENG DFB 0
FRYREG DFB 0
MXWDTH DFB 0

FCROUT LDA #13
FROUT STY FYREG ;FORMAT PRINT OUTPUT
 STX FXREG
 STA FAREG
 LDY OUTWDTH
 DEY
 STY MXWDTH
 LDY LYREG
 AND #$7F
 STA $0200,Y
 CPY MXWDTH
 BGE FORMAT1
 CMP #13 ;C/R
 BEQ FORMAT1
 INC LYREG
FREND LDY FYREG ;FORMAT PRINT OUTPUT
 LDX FXREG
 LDA FAREG
 RTS
FORMAT1 INC LYREG
FORMAT LDY LYREG
 LDA #$00
:L0 STA $0200,Y ;TERMINATE THE LINE
FRCALC LDA MXWDTH ;CALC MAX THAT CAN BE PRINTED
 SEC
 SBC CHP
 TAY
:L1 LDA $0200,Y
 AND #$7F
 BEQ OUTPUT
 CMP #13
 BEQ OUTPUT
 CMP #' '
 BEQ :INSERT
 DEY
 BNE :L1
 JMP OUTPUT
:INSERT LDA #13
 STA $0200,Y
OUTPUT LDY FRYREG
:PLOOP LDA $0200,Y
 BEQ FREND1
 JSR POUT
 JSR DOABRT
 LDA CHP
 CMP OUTWDTH
 BLT :NEXT
 JSR DOCR
:NEXT INC FRYREG
 BNE OUTPUT
FREND1 LDA #$00
 TAY
 STA FRYREG
 STA FLENG
 STA LYREG
:CLOOP STA $0200,Y
 INY
 BNE :CLOOP
 JMP FREND

PACK JSR CHRGOT
 CMP #EQUAL
 BNE DOPACK
 JSR CHRGET
 JSR FRMNUM
 JSR GETADR
LINLPTR JSR NUMPTR2
 STA LPTR
 STY LPTR+1
 RTS
DOPACK JSR CHRGOT
 JSR FRMEVL
 JSR CHKSTR
 JSR FREFAC
 TAX
 LDY #$00
 INX
TMOVE1 DEX
 BEQ TMOVE2
 LDA (INDEX),Y
 STA (PTR),Y
 INY
 BNE TMOVE1
 JMP SYNERR
TMOVE2 LDA #$0D
 STA (PTR),Y
 INY
 LDA #$00
 STA (PTR),Y
 TYA
 CLC
 ADC PTR
 STA PTR
 LDA PTR+1
 ADC #$00
 STA PTR+1
 RTS

INCPTR INC PTR
 BNE INCPTR1
 INC PTR+1
INCPTR1 RTS


BRDPRM = $BED5
BDSKBUF = BRDPRM+2
BREQLEN = BRDPRM+4
BACTLEN = BRDPRM+6

TMPDSK1 DA $0200
 DA $00FF
EOFMRKR DFB 0
EOL DFB 13

ISEOF LDA EOFMRKR
 JMP SAVNUM1

SETEOL JSR GETBYT
 STX EOL
 RTS

INPANY LDA #$00
 STA EOFMRKR
 LDA EOL
 STA NEWLINE+3
 LDA #$C9 ;SET EOL
 JSR GOSYS
 LDY #$03
:LOOP1 LDA TMPDSK1,Y
 STA BDSKBUF,Y
 DEY
 BPL :LOOP1
 LDA #$CA ;READ
 JSR GOSYS
 BCS :SAVE0
:SAVE LDA $0200
 CMP #$00
 BEQ :SAVE0
 CMP #26
 BNE :SAVE1
:SAVE0 LDA #13
 STA EOL
 STA NEWLINE+3
 LDA #$C9 ;SET EOL
 JSR GOSYS
 LDA #$01
 STA EOFMRKR
:SAVE1 LDX BACTLEN
 DEX
 LDA $0200,X
 CMP EOL
 BEQ :NOINX
 INX
:NOINX LDA #$00
 STA $0200,X
 TXA
 PHA
 JSR PTRGET
 PLA
 TAX
DLOAD1 STX $FD
 JSR $D539
 LDA $FD
 JSR $E452
 LDX #0
 LDY #2
 JSR $E5E2
 LDA $FD
 LDY #$00
 STA (VARPNT),Y
 INY
 LDA FRETOP
 STA (VARPNT),Y
 INY
 LDA FRETOP+1
 STA (VARPNT),Y
 RTS

ERASE JSR GETARYPT
 LDY #$02
 CLC
 LDA LOWTR
 STA A4L
 ADC (LOWTR),Y
 STA A1L
 LDA LOWTR+1
 STA A4L+1
 INY
 ADC (LOWTR),Y
 STA A1L+1
 SEC
 LDA STREND
 STA A2L
 DEY
 SBC (LOWTR),Y
 STA STREND
 LDA STREND+1
 STA A2L+1
 INY
 SBC (LOWTR),Y
 STA STREND+1
 LDY #$00
 JSR MOVE
 JSR CHRGOT
 CMP #','
 BNE :END
 JSR CHRGET
 JMP ERASE
:END RTS

VARPTR JSR PTRGET
 STY PTR+1
 STA PTR
 JSR CHKCOM
 LDY #$02
 BIT VARNAM
 BMI :NMBR ;INTEGER
 BIT VARNAM+1
 BMI :STRNG ;STRING
:NMBR LDY PTR+1 ;REAL
 LDA PTR
 JMP SAVNUM
:STRNG LDY #$02
 LDA (PTR),Y
 STA CNTR
 DEY
 LDA (PTR),Y
 LDY CNTR
 JMP SAVNUM


SWAP JSR PTRGET
 STA FORPNT
 STY FORPNT+1
 LDA VARNAM
 PHA
 LDA VARNAM+1
 PHA
 JSR CHKCOM
 JSR PTRGET
 PLA
 EOR VARNAM+1
 BMI ERR2
 PLA
 EOR VARNAM
 BMI ERR2
 LDY #$02
 BIT VARNAM
 BMI SWP2
 BIT VARNAM+1
 BMI SWP1
 LDY #$04
SWP1 LDA (FORPNT),Y
 PHA
 LDA (VARPNT),Y
 STA (FORPNT),Y
 PLA
 STA (VARPNT),Y
SWP2 DEY
 BPL SWP1
 RTS
ERR2 JMP MISMTCH

USING LDA #$00
 STA TXTSTAT
 LDA #$FF
 STA PABRT
 JSR FRMEVL
 JSR CHKSTR
 >>> ADDR,SDSC;FORPNT
 JSR SAVD
 LDA #';'
:L0 JSR SYNCHR
 >>> ADDR,SDSC;DPTR
 LDA #EDSC
 STA FORPNT
 STY FORPNT+1
 JSR SAVSTR
 LDX #$00
 LDY EDTL
 BEQ :L4
:L1 DEY
 LDA (EDIT),Y
 CMP #'0'
 BEQ :L2
 CMP #' '
 BEQ :L2
 CMP #'$'
 BEQ :L2
 CMP #'.'
 BEQ :L4
 CMP #'*'
 BNE :L3
:L2 INX
:L3 TYA
 BNE :L1
 TAX
:L4 STX DPLC
 JSR FRMNUM
 LDA DPLC
 BEQ :L6
:L5 JSR MUL10
 DEC DPLC
 BNE :L5
:L6 JSR RNDB
 LDA SIGN
 PHA
 JSR ABS
 JSR FADDH
 JSR INT
 PLA
 BPL :L7
 JSR NEGOP
:L7 JSR FOUT
 CLV
 LDX #$FF
:L8 INX
 LDA NMBR+1,X
 BNE :L8
 LDY EDTL
 BEQ :L15
:L9 TYA
 BEQ :OVFL
 DEY
 LDA NMBR,X
 CMP #'E'
 BEQ :OVFL
 CMP #'-'
 BNE :L10
 LDA (EDIT),Y
 CMP #','
 BEQ :L11
 CMP #'0'
 BNE :L10
 TYA
 BNE :L9
:L10 LDA (EDIT),Y
 CMP #'0'
 BEQ :L11
 CMP #' '
 BEQ :L11
 CMP #'*'
 BEQ :L11
 CMP #'$'
 BNE :L9
 BIT SETV
:L11 LDA NMBR,X
 STA (EDIT),Y
 DEX
 BPL :L9
:L12 TYA
 BEQ :L15
 DEY
 LDA (EDIT),Y
 BVC :L13
 LDA #'$'
 CLV
:L13 CMP #','
 BNE :L14
 INY
 LDA (SFLD),Y
 DEY
:L14 STA (EDIT),Y
 SEC
 BCS :L12
:OVFL LDA #'#'
 LDY EDTL
:OVF1 DEY
 STA (EDIT),Y
 BNE :OVF1
:L15 >>> ADDR,EDSC;DPTR
 JSR STRPRT
 LDA EDTL
 JSR FTED
 JSR CHRGOT
 CMP #','
 BNE :L16
 JMP :L0
:L16 CMP #';'
 BEQ :L17
 JMP DOCR
:L17 JMP CHRGET

LCASE JSR TRIMCOM
:LOOP DEX
 BEQ :END
 LDA (FAC+1),Y
 JSR DLCASE
 STA (FAC+1),Y
 INY
 BNE :LOOP
 JMP SYNERR
:END JSR SAVTRIM
 BNE :END1
 JSR CHRGET
 JMP LCASE
:END1 RTS

DLCASE CMP #'A'
 BLT :END
 CMP #'Z'+1
 BGE :END
 CLC
 ADC #$20
:END RTS

FRMCHR DFB 0
TOCHR DFB 0


CHANGE JSR TRIMCOM
 INY
:L0 LDA (FAC+1),Y
 STA FRMCHR,Y
 DEY
 BPL :L0
 JSR CHRGET
 JSR TRIMCOM
:LOOP DEX
 BEQ :END
 LDA (FAC+1),Y
 CMP FRMCHR
 BNE :MORE
 LDA TOCHR
 STA (FAC+1),Y
:MORE INY
 BNE :LOOP
 JMP SYNERR
:END JSR SAVTRIM
 BNE :END1
 JSR CHRGET
 JMP UCASE
:END1 RTS

UCASE JSR TRIMCOM
:LOOP DEX
 BEQ :END
 LDA (FAC+1),Y
 JSR CASE
 STA (FAC+1),Y
:MORE INY
 BNE :LOOP
 JMP SYNERR
:END JSR SAVTRIM
 BNE :END1
 JSR CHRGET
 JMP UCASE
:END1 RTS

RTRIM JSR TRIMCOM
 JSR TRIMRT
 JSR SAVTRIM
 JSR CHRGOT
 CMP #','
 BNE :END
 JSR CHRGET
 JMP RTRIM
:END RTS

LTRIM JSR TRIMCOM
 JSR TRIMFT
 JSR SAVTRIM
 JSR CHRGOT
 CMP #','
 BNE :END
 JSR CHRGET
 JMP LTRIM
:END RTS

TRIM JSR TRIMCOM
 JSR TRIMRT
 JSR TRIMFT
 JSR SAVTRIM
 BNE :END
 JSR CHRGET
 JMP TRIM
:END RTS

TRIMCOM JSR PTRGET
 STY FORPNT+1
 STA FORPNT
 JSR CHKSTR
 LDY #$02
:LOOP LDA (FORPNT),Y
 STA FAC,Y
 DEY
 BPL :LOOP
 LDX FAC
 INX
 LDY #$00
 RTS

SAVTRIM LDY #$02
:LOOP LDA FAC,Y
 STA (FORPNT),Y
 DEY
 BPL :LOOP
 JSR CHRGOT
 CMP #','
 RTS

TRIMRT LDA FAC
 TAX
 TAY
 DEY
 INX  ;TRIM END SIDE OF STRING
:LOOP DEX
 BEQ :END1
 LDA (FAC+1),Y
 CMP #' '+1
 BGE :END1
 DEY
 BNE :LOOP
 LDA (FAC+1),Y
 CMP #' '+1
 BGE :END2
 LDX #$00
 BEQ :END1
:END2 LDX #$00
:END1 STX FAC
 RTS

TRIMFT LDX FAC
 INX  ;TRIM FRONT SIDE OF STRING
 LDY #$00
:LOOP DEX
 BEQ :ENDFT
 LDA (FAC+1),Y
 CMP #' '+1
 BGE :ENDFT
 INC FAC+1
 BNE :LOOP
 INC FAC+2
 BNE :LOOP
 JMP SYNERR
:ENDFT STX FAC
 RTS

PRSCOM STA :HOOK+2
 JSR FRMEVL ;Process concat., etc.
 JSR CHKCOM
 JSR CHKSTR ;Make sure it is a string
 JSR FREFAC
 PHA
 TAX
 LDY #$00
 INX
:LOOP DEX
 BEQ :MORE
 LDA (INDEX),Y
 JSR CASE
:HOOK STA MSGBUF,Y
 INY
 BNE :LOOP
:MORE PLA
 RTS

PARSE JSR PRSCLR
 LDA #>REFSTR
 JSR PRSCOM
 STA PTR
 LDA #>CMPSTR
 JSR PRSCOM
 CMP #$00
 BEQ :NOTINS
 LDA PTR
 BEQ :NOTINS
 JSR RESET
 STA CMPSTR1
:FIND JSR COMP ;LOOK FOR A MATCH
 BCS :ISINS
 JSR ADVCTR
 LDY CMPSTR1
 LDA CMPSTR,Y
 BNE :FIND ;AT END OF CMPSTR?
:NOTINS LDA #$FF
 STA CNTR
:ISINS INC CNTR
 LDX SREG
 TXS
 LDA CNTR
 JMP SAVNUM1

ADVCTR INC CNTR
 LDY REFSTR1 ;GET NEXT REFERANCE WORD
 DEY
:LOOP INY
 LDA REFSTR,Y
 BEQ :ENDREF ;IS IT THE END OF REFERANCE STRING?
 CMP #','
 BNE :LOOP
 INY  ;FOUND NEXT REFERANCE WORD
 STY REFSTR1
 LDA REFSTR,Y
 BEQ :ENDREF
 RTS
:ENDREF INC CMPSTR1 ;SET FOR NEXT CMPSTR CHAR
RESET LDA #$00 ;RESET REFSTR
 STA REFSTR1
 STA CNTR
 RTS

PRSCLR LDA #$00
 TAY
:LOOP STA $7000,Y
 STA $7100,Y
 INY
 BNE :LOOP
 RTS

COMP LDY REFSTR1
 LDX CMPSTR1
:LOOP LDA REFSTR,Y ;GET COMPARISION CHAR
 BEQ :FOUND ;FOUND A MATCH
 CMP #',' ;IS IT A COMMA?
 BEQ :FOUND ;FOUND A MATCH
 LDA CMPSTR,X ;COMPARE IT
 BEQ :NOMATCH ;YES, NO MATCH
 CMP REFSTR,Y ;GET COMPARISION CHAR
 BNE :NOMATCH
 INY  ;OK GOT ONE
 INX
 BNE :LOOP ;LOOP UNTIL COMMA OR END OF STRING
:NOMATCH CLC ;NO MATCH FOUND
 RTS
:FOUND SEC
 RTS

CASE AND #$7F
 CMP #'a'
 BLT CASE1
 CMP #'z'+1
 BGE CASE1
 SEC
 SBC #$20
CASE1 RTS

STRPRT JSR FREFAC
 TAX
 LDY #$00
 INX
:LOOP DEX
 BEQ :END
 LDA (INDEX),Y
 JSR POUT
 JSR DOABRT
 INY
 BNE :LOOP
:END RTS

EXTRACT JSR GETBYT
 STX CNTR
 JSR CHKCOM
 JSR FRMEVL
 JSR CHKSTR
 JSR FREFAC
 STA PTR
:L0 JSR ADVWORD
 BCS :NOWORD
 DEC CNTR
 BEQ :DONE
 JSR ADVSPACE
 BCC :L0
:NOWORD JSR CHKCOM
 JSR PTRGET
 LDX #$00
 STX $0200
 JMP DLOAD1

:DONE LDX PTR ;MOVE WORD
 LDY #$00
 INX
:LOOP DEX
 STX PTR
 BEQ :END
 LDA (INDEX),Y
 JSR ISEXTRT
 BCS :END
 STA $0200,Y
 INY
 BNE :LOOP
:END STY CNTR
 JSR CHKCOM
 JSR PTRGET
 LDX CNTR
 LDA #$00
 STA $0200,X
 JMP DLOAD1

ADVWORD LDX PTR ;ADVANCE TO FIRST WORD
 LDY #$00
 INX
:LOOP DEX
 STX PTR
 BEQ :NOWORD
 LDA (INDEX),Y
 JSR ISEXTRT
 BCC :END
 INC INDEX
 BNE :LOOP
 INC INDEX+1
 BNE :LOOP
:END CLC
 RTS
:NOWORD SEC
 RTS

ADVSPACE LDX PTR ;ADVANCE TO FIRST WORD
 LDY #$00
 INX
:LOOP DEX
 STX PTR
 BEQ :NOWORD
 LDA (INDEX),Y
 JSR ISEXTRT
 BCS :END
 INC INDEX
 BNE :LOOP
 INC INDEX+1
 BNE :LOOP
:END CLC
 RTS
:NOWORD SEC
 RTS

ISEXTRT CMP #'0'
 BLT :NOPE
 CMP #39 ;'
 BEQ :YES
 CMP #'9'+1
 BLT :YES
 CMP #'A'
 BLT :NOPE
 CMP #'Z'+1
 BLT :YES
 CMP #'a'
 BLT :NOPE
 CMP #'z'+1
 BLT :YES
:NOPE SEC
 RTS
:YES CLC
 RTS

WORDS LDA #$00
 STA CNTR
 JSR FRMEVL
 JSR CHKSTR
 JSR FREFAC
 STA PTR
:L0 LDA PTR
 BEQ :DONE
 JSR ADVWORD
 BCS :DONE
 INC CNTR
 JSR ADVSPACE
 BCC :L0
:DONE JSR CHKCOM
 LDA CNTR
 JMP SAVNUM1

goto = 171
gosub = 176

ONCASE LDA #$00
 STA CNTR
:LOOP INC CNTR
 JSR FRMEVL
 LDA FAC
 BNE :FOUND
 JSR CHRGOT
 CMP #','
 BNE :NOMTCH
 JSR CHRGET
 JMP :LOOP
:NOMTCH LDY #$00
:LOOP0 LDA (TXTPTR),Y
 BEQ :DONE
 CMP #':'
 BEQ :DONE
 INY
 BNE :LOOP0
:DONE JMP ADDON
:FOUND LDA CNTR
 STA FAC+4
 LDY #$00
:LOOP2 LDA (TXTPTR),Y
 BEQ :ERROR
 CMP #goto
 BEQ :FND
 CMP #gosub
 BEQ :FND
 INY
 BNE :LOOP2
:ERROR JMP SYNERR
:FND JSR ADDON
 PHA
 CMP #gosub
 BEQ ONCNT
 CMP #goto
 BNE :ERROR
ONCNT DEC FAC+4 ;Counted to right one yet?
 BNE :NXN ;No, keep looking
 JSR CHRGET
 PLA ;Yes, retrieve cmd
 CMP #gosub
 BNE :GOTO
 JMP ZGOSUB
:GOTO JMP GOTO
:NXN JSR CHRGET
 JSR LINGET
 CMP #','
 BEQ ONCNT
 PLA ;Not found, so ignore
RET9 RTS

ADDON TYA
 CLC
 ADC TXTPTR
 STA TXTPTR
 BCC :NEXT
 INC TXTPTR+1
:NEXT JSR CHRGOT
 RTS

STRPULL JSR FRMEVL
 JSR CHKSTR
 JSR FREFAC
 TAX
 LDY #$00
 INX
 RTS

LIST JSR GETBYT
 STX STATUS
 LDA #$00
 STA GETFLG
 LDA #$FF
 STA CANDO
 LDA #$02
 STA STRCNT
 JSR CROUT
 JSR NEWSTR
 LDY #$00
 JSR OLDSTR
 JSR GETCMD
 LDY #$02
 JSR OLDSTR
 JSR MAKTTL
 LDY #$00
 JSR OLDSTR
 LDA STATUS
 BEQ LL1
 CMP #$05
 BEQ MNUPRT
 BNE LL1
MNUPRT JSR LDMSG
:LOOP LDY #$00
 LDA (PTR),Y
 BEQ :ENDLOP
 JSR CHROUT
 JSR INCPTR
 JMP :LOOP
:ENDLOP LDA #$00
 STA STATUS
 JMP LL3
LL1 LDA #$00
 STA COLM
 LDA STATUS
 BNE LL3
 LDY #$00
 JSR OLDSTR ;FIND COMMAND STRINGS
 LDA #$00
 STA CMDLVL
 JSR PRTCMD ;COMMANDS
LL3 LDA STATUS ;DO 1ST COMMAND LINE
 CMP #$02
 BGE LL4
 LDA #$00
 JSR TABPRNT
 JSR DOCMD
 JSR CROUT
LL4 LDY #$02 ;PRINT PROMPT
 JSR OLDSTR
 JSR PRTSTR
 LDA STATUS
 CMP #$03
 BNE LL4A
 LDA #"-"
 JSR CHROUT
 LDA #">"
 JSR CHROUT
 JMP LL4B
LL4A JSR CROUT ;PRINT "COMMAND?"
 LDA #$01
 JSR TABPRNT
LL4B JSR RDCHAR
 STA CHAR
 JSR CASE
 JSR INSET
RTNCMD JSR CHRGET
 LDA CHAR
 CMP #' '
 BLT RTNCMD1
 JSR POUT
RTNCMD1 JSR CROUT
 LDA SECVAL
 JSR SAVNUM1
 JSR LISTCOM
 LDA SECLVL
 JSR SAVNUM1
 JSR LISTCOM
 LDA TYPE,Y
 JSR SAVNUM2
 JSR LISTCOM
 LDA WHERE,Y
 JSR SAVNUM2
 JSR LISTCOM
 LDA NAME,Y
 JSR SAVNUM2
 JSR LISTCOM
 LDA PASS,Y
 JSR SAVNUM2
 JMP MRKTIM

SAVNUM2 SEC
 SBC #'@'
 JMP SAVNUM1

LISTCOM JSR CHRGET
 LDY LSTCMD
 DEY
 RTS

DOCMD LDY #$00
 STY CMDLVL ;CHECK VIEW LEVEL
DOCMD1 CPY COMMAND
 BEQ DOCMD2
 LDA CMD,Y
 CMP #' '
 BEQ DOCMD3
 JSR CMPOFF
 BLT DOCMD3
 LDA CMD,Y
 JSR CHROUT
DOCMD3 INY
 STY CMDLVL
 BNE DOCMD1
DOCMD2 RTS

PRTEND JMP DOCR
PRTCMD LDA STRLEN
 BEQ PRTEND
 LDA COLM
 BNE PRTCD
 LDA COLMNS
 STA COLM
PRTCD JSR CMPOFF ;CHECK VIEW LEVEL
 BLT PRTCMD1
 LDA CMD,Y
 CMP #' '
 BNE :NEXT
 JMP BRDR
:NEXT JSR OUTLIN
 DEC COLM
 BEQ NXTSTR
 LDA STRLEN
 SEC
 SBC #$09
 STA AREG
 LDA TABWDTH
 SEC
 SBC AREG
 TAY
 JSR SNDSPC
PRTCMD1 JSR ADD3
 JSR STRPRM
 INC CMDLVL
 JMP PRTCMD
NXTSTR JSR DOCR
 JMP PRTCMD1

CMPOFF LDY CMDLVL ;CHECK VIEW LEVEL
 LDA BITCD,Y
 TAX
 LDA HBUFF+100,X ;GET USER BIT LOCK
 CMP OFF,Y ;COMPARE CURRENT LEVEL
 RTS

BRDR JSR DOCR
 LDA TYPE,Y
 CMP #'@'
 BNE NREPT
 JSR REPEAT
 JMP BRDR1B
NREPT CMP #'A'
 BEQ CENTR
 CMP #'B'
 BEQ LITERAL
 JSR CROUT
 JMP BRDR1B
LITERAL JSR SUBCOM
 JMP BRDR1B
CENTR LDA STRLEN
 SEC
 SBC #$09
 CMP PWIDTH
 BGE BRDR1C
 SEC
 STA AREG
 LDA PWIDTH
 SBC AREG
 LSR
 BEQ BRDR1C
 TAY
BRDR1D LDA #" "
 JSR CHROUT
 DEY
 BNE BRDR1D
BRDR1C JSR SUBCOM
BRDR1B JSR DOCR
 JMP PRTCMD1

SUBCOM LDA STRLEN
 SEC
 SBC #$09
 TAX
 LDY #$09
 INX
 JMP STROUT1

GETCMD LDA FORPNT
 STA TEMP
 LDA FORPNT+1
 STA TEMP+1
 LDX #$00
 STX COMMAND
GETC2 JSR STRPRM
 LDA STRLEN
 BEQ GETC2Z
 INC COMMAND
 LDA #$09 ;READ THE 9 COMMAND VALUES IN
 STA A1L
 STX A1L+1
 LDY #$00
 LDA #CMD
 STA :HOOK+1
 LDA #>CMD
 STA :HOOK+2
:LOOP LDA (PTR),Y
:HOOK STA CMD,X
 INY
 LDA :HOOK+1 ;CALC NEXT BUFFER SET
 CLC
 ADC #MSGSIZ
 STA :HOOK+1
 LDA :HOOK+2
 ADC #$00
 STA :HOOK+2
 DEC A1L
 BNE :LOOP ;KEEP GOING UNTIL 9 ARE LOADED
 LDA BITCD,X
 SEC
 SBC #'@'
 STA BITCD,X
 JSR ADD3
 INX
 BNE GETC2
GETC2Z LDA TEMP
 STA FORPNT
 LDA TEMP+1
 STA FORPNT+1
 JMP STRPRM

REPEAT LDY #$09
 LDA STRLEN
 SEC
 SBC #$09
 TAX
 INX
:LOOP DEX
 BEQ REPEAT
 LDA CHP
 CMP PWIDTH
 BGE :END
 LDA (PTR),Y
 JSR CHROUT
 INY
 BNE :LOOP
:END RTS

ADD3 LDA FORPNT
 CLC
 ADC #$03
 STA FORPNT
 LDA FORPNT+1
 ADC #$00
 STA FORPNT+1
 RTS

OUTLIN LDA #$00
 JSR CHROUT
 LDA STRLEN
 SEC
 SBC #$09
 TAX
 LDY #$09
 INX
 JMP STROUT1

PRTSTR LDX STRLEN
STROUT INX
 LDY #$00
STROUT1 DEX
 BEQ STROUT2
 LDA (PTR),Y
 JSR CHROUT
 INY
 BNE STROUT1
STROUT2 RTS

CHROUT JSR POUT
 LDA TBUFF
 BNE CHROUT1
 CLC
 RTS
CHROUT1 STY YREG1
 STX XREG1
 JSR CASE
 CMP #'X' ;ABORT THE MENU
 BEQ :ABORT
 JSR INSET
 LDA SECLVL
 CMP #$02
 BGE :GOODCMD
 LDY YREG1
 LDX XREG1
 CLC
 RTS
:GOODCMD JSR PULL
 STA CHAR
 JSR CROUT
 LDX SREG
 TXS
 JMP RTNCMD
:ABORT JSR PULL
 STA CHAR
 JSR CROUT
 LDX SREG
 TXS
 JMP LL3

SNDSPC LDA #" "
 JSR CHROUT
 DEY
 BNE SNDSPC
 RTS

********************************
*                              *
*  EVALUATE THE STRING FOR A   *
*         COMMAND              *
*                              *
********************************

STOP JSR STRCOM
 JSR CHRGET
 LDY #$00
 LDA (FORPNT),Y
 BEQ ISCR2
 CMP #$02
 BGE ISDOT
NOTEXT LDA #$01
 JMP SAVNUM1
ISCR2 LDA FORPNT
 SEC
 SBC #$03
 STA FORPNT
 LDA FORPNT+1
 SBC #$00
 STA FORPNT+1
 LDY #$00
 LDA (FORPNT),Y
 BNE NOTEXT
ISEXT LDA #$02
 JMP SAVNUM1

ISDOT INY
 JSR MOVFOR
 LDY #$00
 LDA (FORPNT),Y
 CMP #$01
 BEQ :CHKDT1
 LDY #$00
 LDA (PTR),Y
 CMP #'.'
 BEQ :CHKDOT
 CMP #'*'
 BEQ :CHKDOT
 CMP #'/'
 BEQ :CHKDOT
 JMP NOTEXT
:CHKDT1 LDY #$FF
:CHKDOT INY
 LDA (PTR),Y
 JSR CASE
 LDX #$0C
:CHKDOT1 CMP STRSTP,X
 BEQ :GOTDOT
 DEX
 BPL :CHKDOT1
 JMP NOTEXT
:GOTDOT LDY #$00
 LDA (FORPNT),Y
 CMP #$02
 BNE :HIDOT
 LDA STPNUM,X
 JMP SAVNUM1
:HIDOT LDY #$02
 LDA (PTR),Y
 CMP #','
 BEQ :GETHI
 JMP NOTEXT
:GETHI LDA DOTMOD,X
 JMP SAVNUM1

*               0123456789ABCDEF
STRSTP ASC 'XOSNAEIDLPF?T'
*              X O S N A E I D L P  F  ?  T
STPNUM DFB 2,3,3,4,5,6,7,8,9,10,11,12,13
*              X O S N A E  I  D  L  P F ? T
DOTMOD DFB 1,1,1,1,1,14,15,16,17,1,1,1,18

********************************

HIMEM JSR $BEF8
 LDA #$99-$72
 JMP $BEF5

LOWMEM JSR $BEF8
 LDA #$99-$64
 JMP $BEF5

********************************

amper = 175
then = 196

IF JSR FRMEVL
 LDA FAC
 BEQ :ELSE
 JMP CHRGET
:ELSE LDY #$00
:LOOP2 JSR GETTHEN
 CMP #amper
 BEQ :FND
:LOOP3 INY
 BNE :LOOP2
:ERROR JMP SYNERR
:FND INY
 JSR GETTHEN
 CMP #then
 BNE :LOOP3
:ONCNT JSR ADDON
 JMP CHRGET

GETTHEN LDA (TXTPTR),Y
 BEQ :NONE
 RTS
:NONE PLA
 PLA
 JSR ADDON
 RTS

THEN LDY #$00
:LOOP LDA (TXTPTR),YT
 BEQ :END
 INY
 BNE :LOOP
:END JSR ADDON
 JMP CHRGOT
