*******************************
*            PRIME            *
*    Bulletin Board System    *
*                             *
*       (C)opyright 1989      *
*       By Daniel Haynes      *
*                             *
*******************************

*         05 Feb 90

*******************************
*           AMPER             *
*     Common Routines #2      *
*******************************


SETOFFT LDY #>OFSTR
 LDA #OFSTR
 STY PTR+1
 STA PTR
 RTS

CANDO DFB 0

SHLOAD JSR LDMSG
:LOOP LDA #$00
 LDY #$00
:LOOP1 STA (PTR),Y
 INY
 BNE :LOOP1
 INC PTR+1
 LDA #$70
 CMP PTR+1
 BNE :LOOP
 RTS

PUSH STA TBUFF
PUSH1 LDX #39
 LDY #01
:LOOP LDA SCRN,Y
 STA SCRN-1,Y
 INY
 DEX
 BNE :LOOP
 LDA TBUFF
 BIT LOWCAS
 BPL :CNTRL?
 JSR CASE
:CNTRL? CMP #' '
 BLT :STUFF
 ORA #$80
:STUFF STA SCRN+39
 RTS

CNTWRP1 LDX XREG
 JMP INPBELL
WRAPON JSR CMPSPC
 BEQ FINH
 INX
 LDA #$00
 STA $0200,X
 STX WRPPOS
WRAP1 DEX
 BMI CNTWRP1
 JSR CMPSPC
 BNE WRAP1
 LDA #$00
 STA $0200,X
 STX XREG
 LDY #$00
WRAP3 INX
 LDA $0200,X
 STA $0280,Y
 BEQ CLRLFT
 INY
 BNE WRAP3
CLRLFT TYA
 TAX
 STY DIFF
CLRLFT1 INX
 DEX
 BEQ CLRLFT3
 JSR BCKSPC
 DEX
 BNE CLRLFT1
CLRLFT3 LDX DIFF
CLRLFT2 INX
 DEX
 BEQ CLRLFT4
 LDA #' '
 JSR BCKSPC1
 DEX
 BNE CLRLFT2
CLRLFT4 JSR BCKSPC
 JSR FINCOM
 JMP ADDINP

FINH JSR FINCOM
 JMP ADDINP2A

FINCOM JSR $FC42
 LDX XREG
 LDA #$0D
 RTS

DOWRAP LDY #$00
DWRAP1 LDA $0280,Y
 STA $0200,Y
 BEQ DWRAP2
 INY
 BNE DWRAP1
DWRAP2 LDX #$00
DWRAP3 LDA $0200,X
 BEQ DWRAP4
 JSR POUT
 LDA TBUFF
 BEQ DWRAPZ
 PHA
 LDA #$00
 STA TBUFF
 PLA
 CMP #' '
 BLT DWRAPZ
 STA $0200,Y
 INY
 LDA #$00
 STA $0200,Y
DWRAPZ INX
 BNE DWRAP3
DWRAP4 JMP NXTCHAR


BCKSPC LDA #$08
BCKSPC1 JSR POUT
ISMORE LDA TBUFF
 BEQ ISMORE1
 PHA
 LDA #$00
 STA TBUFF
 PLA
 CMP #' '
 BLT ISMORE1
 STA $0280,Y
 INY
 LDA #$00
 STA $0280,Y
ISMORE1 RTS

WRAP LDA WRPFLG
 BNE WRAPON1
CNTWRP LDX XREG
 JMP INPBELL
WRAPON1 JMP WRAPON

CLRBUF LDA #$00
 LDY #$00
CLRBUF1 STA $0200,Y
 INY
 CPY #$80
 BNE CLRBUF1
 RTS

CLRWRP LDY #$80
 LDA #$00
 JMP CLRBUF1

EDTINP LDA #$FF
 STA GETFLG
 JSR CLRBUF
 JSR STRCOM
 LDY #$00
 LDA (FORPNT),Y
 TAX
 INY
 JSR MOVFOR
 LDY #$00
 INX
EDT1 DEX
 BEQ EDT2
 LDA (PTR),Y
 STA $0200,Y
 INY
 BNE EDT1
EDT2 LDA #$00
 STA $0200,Y
 JMP MINPT1

WRPINP LDA #$FF
 STA WRPFLG
 BNE GTINP

MINPUT JSR CLRWRP
GTINP LDA #$FF
 STA GETFLG
 JSR CLRBUF
MINPUT1 JSR PTRGET
 JSR CHKSTR
 LDA GETFLG
 CMP #$FF
 BEQ MINPT1
 CMP #$00
 BEQ MINPUT2
 JSR TSTMDM
 BCC NOCHAR
 JSR PULL
 JMP MINPT3
NOCHAR LDX #$00
 JMP MINPT2
MINPT3 STA $0200
 LDX #$01
 JMP MINPT2
MINPUT2 JSR RDCHAR
 STA $0200
 LDA #' '
 JSR POUT
 LDA #8
 JSR POUT
 LDX #$01
 JMP MINPT2
MINPT1 JSR GETLN
MINPT2 LDA #$00
 STA $0200,X
 JMP DLOAD1

RSTOR JSR PRMCOM
 JSR STRCOM
 LDA TXTPTR
 STA $87
 LDA TXTPTR+1
 STA $87+1

 LDX #$00
RSTOR1 LDA HBUFF,X
 BEQ RSTOR2
 STA $0200,X
 INX
 BNE RSTOR1
RSTOR2 JMP MINPT2

IS80ON LDA COLUMN
 BEQ :END
 LDA $C018
 BPL :END
 LDA #$FF
 RTS
:END LDA #$00
 RTS

MSTRNG JSR GETBYT
 STX LENGTH
 JSR CHRGOT
 CMP #','
 BNE MSTRG2
 JSR CHRGET
 JSR FRMEVL
 JSR CHKSTR
 JSR FREFAC
 TAX
 LDY #$00
 INX
MSTRG1 DEX
 BEQ MSTRG2
 LDA (INDEX),Y
 STA MINUM,Y
 INY
 CPY #$03
 BNE MSTRG1
MSTRG2 RTS

MSTORE JSR FRMEVL
 JSR CHKSTR
 JSR FREFAC
 TAX
 LDY #$00
 INX

MSTOR1 DEX
 BEQ MSTOR2
 LDA (INDEX),Y
 STA HBUFF,Y
 INY
 BNE MSTOR1
 JMP SYNERR
MSTOR2 LDA #$00
 STA HBUFF,Y
 BEQ PRMCOM

OURCH = $0578+3

PRMCOM1 RTS
PRMCOM LDA HBUFF
 BEQ PRMCOM1
 LDA HBUFF+81
 AND #$7F
 SEC
 SBC #'0'
 TAY
 LDA CWIDTH,Y
 STA PWIDTH
 STY COLMNS
 LDA HBUFF+79
 STA SECLVL
 LDA #40
 STA TABWDTH
 LDA #17
 STA TOPCTR
 JSR PUSHCH
 LDA #$00
 STA $22
 JSR IS80ON
 BEQ :CLR4
 LDA #$02
 BNE :CLR
:CLR4 LDA #$04
:CLR STA $23
 LDA #$01
 JSR TABV
 JSR HOME
 LDA #24
 STA $23
PRTOP JSR TITLE
 JSR PRTLIN
 DEC TOPCTR
 BPL PRTOP
 JSR IS80ON
 BEQ :SET40
 LDA #$03
 STA $22
 LDA #21
 BNE :FIN
:SET40 LDA #$05
 STA $22
 LDA #20
:FIN STA $23
 JSR IS80ON
 BEQ :DSH4
 LDA #$02
 BNE :DODSH
:DSH4 LDA #$04
:DODSH JSR DODSH
 JSR PRTBLCK
 LDA #$00
 STA CH
 JSR TABBOT
 DEC CV
 LDA CV
 JSR DODSH
 JMP PULLCH

CLCSPOS PHA
 JSR SETSEC
 PLA
 TAX
 CLC
 ADC CH
 STA CH
 RTS

PRTBLCK JSR SETSEC
 LDY #$00 ;CLEAR INVERSED BIT LOCKS
:LOOP LDA HBUFF+100,Y
 ORA #$80
 JSR SCOUT2
 INY
 CPY #20
 BNE :LOOP
 RTS

SETSEC LDA #22
 JSR TABV
 JSR IS80ON
 BEQ :SEC40
 LDA #49
 BNE :SCH
:SEC40 LDA #9
:SCH STA CH
 LDY #$00
 RTS

PULLCH LDA LCH
 STA CH
 LDA LOURCH
 STA OURCH
 LDA LCV
 STA CV
 JMP TABV

PUSHCH LDA CH
 STA LCH
 LDA CV
 STA LCV
 LDA OURCH
 STA LOURCH
 RTS

LCH DFB 0
LCV DFB 0
LOURCH DFB 0

LSTCMD DFB 0
SECVAL DFB 0

INSET LDY #$00
 JSR CASE
 STA CHAR
 JSR PUSHCH
 LDA CHAR
 CMP #' '
 BEQ INSET2
INSET1 CPY COMMAND
 BEQ INSET2
 LDA CHAR
 CMP CMD,Y
 BEQ INSET3
 INY
 BNE INSET1
INSET2 LDY #$FE
INSET4 LDA #$00
SAVSEC INY
 STY LSTCMD
 STA SECLVL
 JSR TABBOT
 LDA #36
 STA CH
 LDA SECLVL
 CLC
 ADC #"0"
 JSR SCOUT2
 JMP PULLCH
INSET3 STY LSTCMD
 JSR PRTBLCK
 LDY LSTCMD ;FIND REAL BIT LOCK INDEX
 LDA BITCD,Y
 JSR CLCSPOS
 LDA HBUFF+100,X
 STA SECLVL
 SEC
 SBC #'@'
 JSR SCOUT2 ;INVERT IT IN THE SCREEN
 JSR TABBOT
 LDA #39
 STA CH
 LDA SECLVL
 SEC
 SBC #'A'
 STA SECVAL
 LDY LSTCMD
 LDA HBITCD,Y
 ORA #$80
 JSR SCOUT2
 DEC CH
 DEC CH
 LDA ACCESS,Y
 ORA #$80
 JSR SCOUT2
 DEC CH
 DEC CH
 LDA OFF,Y
 ORA #$80
 JSR SCOUT2
 LDA SECLVL
 CMP HBITCD,Y
 BLT :SOFT
 LDA #$03 ;HARD ENTRY
 BNE :END
:SOFT CMP ACCESS,Y
 BLT :NONE
 LDA #$02 ;SOFT ENTRY
 BNE :END
:NONE CMP OFF,Y
 BGE :END1 ;WRONG COMMAND!
 JMP INSET4
:END1 LDA #$01 ;NO ENTRY
:END JMP SAVSEC

DODSH PHA
 JSR POSCUR
 PLA
 JSR TABV
 JSR IS80ON
 BEQ DSHL
 JSR DSHLOP1
DSHL JSR DSHLOP1
 JMP POSCUR

DSHLOP1 LDY #40
DSHLOP LDA CHTCHR
 JSR SCOUT2
 DEY
 BNE DSHLOP
 RTS

POSCUR LDA #12
 JSR TABV
 LDA #$8D
 JMP COUT

SCHR DFB 0

SCOUT STA SCHR
 LDA PRVFLG
 BEQ :COUT1
 LDA SCRNMSK
 ORA #$80
 STA SCHR
:COUT1 LDA SCHR
SCOUT2 STY SYREG
 PHA
 LDY CH
 JSR IS80ON
 BEQ :NO80
 LDA CH
 LSR
 TAY
 BCC :SETSCR1
 STA $C054
 JMP :NO80
:SETSCR1 STA $C055
:NO80 PLA
 STA (BAS),Y
 INC CH
 LDY SYREG
 JSR IS80ON
 BEQ :END
 STA $C054
:END RTS

SYREG DFB 0

PRTLIN LDY TOPCTR
 CPY #$09
 BEQ :PRTLIN3
 LDA LENLIN,Y
 TAX
 LDA POSLIN,Y
 TAY
 DEY
 INX
:PRTLIN1 DEX
 BEQ :PRTLIN2
 LDA HBUFF,Y
 ORA #$80
 JSR SCOUT
 INY
 BNE :PRTLIN1
:PRTLIN2 RTS
:PRTLIN3 LDA HBUFF+79
 SEC
 SBC #'@'
 JSR FLOAT
 JSR FOUT
 STA PTR
 STY PTR+1
 LDY #$00
:LOOP LDA (PTR),Y
 BEQ :ELOOP
 ORA #$80
 JSR SCOUT
 INY
 BNE :LOOP
:ELOOP RTS

TITLE JSR POSCUR

 LDY TOPCTR
 JSR IS80ON
 BEQ :NO80

 LDA VERT80,Y
 JSR TABV
 LDY TOPCTR
 LDA HORZ80,Y
 JMP :PRINT

:NO80 LDA VERT,Y
 JSR TABV
 LDY TOPCTR
 LDA HORZ,Y
:PRINT STA CH
 TYA
 ASL
 TAY
 LDA V0,Y
 JSR SCOUT
 LDA V0+1,Y
 JSR SCOUT
 LDA #":"
 JMP SCOUT

TOPCTR DFB 0

VERT80 DFB 0,0,0
 DFB 0,0,0
 DFB 1,1,1,1,1
 DFB 1,1,1,1,1,1,1
HORZ80 DFB 0,24,35
 DFB 41,49,74
 DFB 0,16,22,29,35
 DFB 40,45,51,56,66,71,76

VERT DFB 0,0,0
 DFB 1,1,1
 DFB 2,2,2,2,2
 DFB 3,3,3,3,3,3,3
HORZ DFB 0,24,35
 DFB 0,8,34
 DFB 0,16,22,29,36
 DFB 0,5,11,16,26,31,36

V0 ASC "NMPWST"
 ASC "BXALTC"
 ASC "PHCCMPXCCL"
 ASC "TLSWTYLCTXMCCT"

POSLIN DFB 2,56,54
 DFB 66,22,76
 DFB 42,1,87,80,63
 DFB 86,84,64,70,92,82,79

LENLIN DFB 20,7,2
 DFB 4,20,3
 DFB 12,1,3,1,1
 DFB 1,2,1,6,1,1,1

CWIDTH DFB 39,39,79,79,79,99,119,139,159,179

GETFLG DFB 0

SETTIM LDA #$FF
 STA DELREG
 STA DELREG+1
 LDA RREG
 STA DELREG+2
 LDA RREG+2
 STA DELREG+3
CPUSET LDA CPU
 STA CPUCNT
 RTS

CPUCNT DFB 0
DIVTIM DFB 0


TIMER DEC DELREG
 BEQ TIME0
 RTS
TIME0 DEC CPUCNT
 BEQ TIME1
 RTS
TIME1 JSR ISTIM
TIME1A DEC DELREG+1
 BNE CPUSET
TIME2 DEC DELREG+2
 BNE CPUSET
TIME3 LDA #$07
 JSR POUT0
 DEC DELREG+3
 BEQ TIPOUT
 LDA RREG+1
 STA DELREG+2
 JMP CPUSET
TIPOUT LDY #$00
 STY YREG

TIME4 LDA OH
 BEQ :END
 LDA #$FF
 STA PAUSE?
 LDA #11
 JSR TABPRNT
 JMP TOOLONG
:END RTS

RDCHAR STY YREGR
 STX XREGR
 LDA #$FF
 STA PAUSE?
 JSR FLASH
 JSR SETTIM
:LOOP JSR TSTMDM
 BCS :END
 JSR TIMER
 JMP :LOOP
:END LDA TBUFF
 CMP #19 ;IGNORE ^S
 BNE :FIN
 JSR PULL
 JMP :LOOP
:FIN JSR NOFLASH
 LDA #$00
 STA PAUSE?
 JSR PULL
 LDY YREGR
 LDX XREGR
 RTS

PAUSE? DFB 0
XREGR DFB 0
YREGR DFB 0
WRPFLG DFB 0
WRPPOS DFB 0
DIFF DFB 0

GETLN LDA WRPFLG
 BNE :DOWRAP
 JMP GETLNA
:DOWRAP JMP DOWRAP

NOTCR STX XREG
 JSR CMPSPC
 CMP EXPTION
 BEQ NOTCRR3
 CMP MINUM
 BLT INPBELL
 CMP MAXUM
 BEQ NOTCRR3
 BGE INPBELL
NOTCRR3 CPX LENGTH
 BCC NOTCR1
 JMP WRAP
INPBELL LDA #$07
 JSR POUT
 LDX XREG

********************************
*  Fix for Control-E troubles  *
********************************

 LDA #$0 ;Clear the A to prevent too
 STA $200,X ;many chars from showing

 JMP NXTCHAR
NOTCR1 JSR POUT
 LDX XREG
 INX
 BNE NXTCHAR
GETLNZ LDA #$07
 JSR POUT
GETLNA LDX #$01
 TXA
 BEQ GETLNZ
 DEX
NXTCHAR STX XREG
:NOINP JSR RDCHAR
 CMP #$0A ;LINE FEED
 BEQ :NOINP
 JMP CONTRL

ADDINP STA $0200,X
 CMP #$0D
 BNE ADDINP1
 LDA #$00
 STA GETFLG
 STA WRPFLG
 JMP CROUT
ADDINP1 JMP NOTCR
ADDINP2A LDA WRPFLG
 BEQ ADD1
 LDA #$00
 STA $0280
ADD1 LDA #$0D
 JMP ADDINP

NOFWD JMP INPBELL
HKADD JMP ADDINP
SAVCCHR STA $0200,X
 JMP NOTCRR3

CGETLNZ JMP GETLNZ
CONTRL PHA
 LDA GRNTLV1
 CMP #$03
 BLT :NEXT
 PLA
 CMP #$0E ;CONTROL N
 BEQ SAVCCHR
 CMP #$17 ;CONTROL W
 BEQ SAVCCHR
 CMP #$16 ;CONTROL V
 BEQ SAVCCHR
 CMP #20 ;CONTROL T
 BEQ SAVCCHR
 BNE :NEXT1
:NEXT PLA
:NEXT1 CMP #$0D
 BEQ ADDINP2A
 CMP #' '
 BGE ADDINP
 STX XREG
 CMP #$08 ;BACK SPACE
 BNE CONTRL1
 TXA
 BEQ CGETLNZ
 JSR BACK
 LDX XREG
 DEX
 JMP NXTCHAR
CONTRL1 CMP #21 ;FORWARD SPACE
 BEQ CONTRL2A
 CMP #9
 BNE CONTRL2
CONTRL2A LDA $0200,X
NOFWD1 BEQ NOFWD
 BNE HKADD ;ADDINP
CONTRL2 CMP #$05 ;PRINT TO END OF LINE
 BNE CONTRL3
 JSR CNTLE
 JMP NXTCHAR
CONTRL3 CMP #$02 ;BEGINNING OF LINE
 BNE CONTRL4
 TXA
 BEQ NOFWD1
CNTRLB JSR BACK
 DEX
 BNE CNTRLB
 JMP NXTCHAR
CONTRL4 CMP #$01 ;INSERT?
 BNE CONTRL5
 LDX #$FF
CNTLI LDA $0200-1,X
 STA $0200,X
 DEX
 CPX XREG
 BNE CNTLI
 LDX XREG
 LDA #' '
 STA $0200,X
 JSR CNTLE
 JSR BRNGBK
 JMP NXTCHAR
CONTRL5 CMP #$04 ;DELETE
 BNE CONTRL6
CNTLD LDA $0200+1,X
 STA $0200,X
 INX
 CMP #$00 ;At the end of the buffer yet?
 BEQ CNTLD1 ;Yes, that's enough
 CPX #$FE
 BNE CNTLD
CNTLD1 LDA #$20 ;Load the space char
 STA $01FF,X ; and save as last char
 LDX XREG
 JSR CNTLE
 LDA #$00 ;Clear the accumulator
 STA $01FF,X ; and save as buffer end
 JSR BRNGBK
 JMP NXTCHAR
CONTRL6 CMP #6
 BNE CONTRL7
 JMP ADVANCE
CONTRL7 CMP #18
 BNE CNT8
 INX
CNTLR DEX
 BEQ IDONE
 LDA $0200,X
 BEQ CNTLRA
 CMP #' '
 BEQ CNTLR1
 JSR BACK
 JMP CNTLR
CNTLRA JSR BACK
 DEX
 BEQ IDONE
 JSR CMPSPC
 BEQ CNTLR1
 BNE CNTLR3
CNTLR1 INX
CNTLR2 DEX
 BEQ IDONE
 JSR CMPSPC
 BNE CNTLR3
 JSR BACK
 JMP CNTLR2
CNTLR3 INX
CNTLR4 DEX
 BEQ IDONE
 JSR CMPSPC
 BEQ HK1
 JSR BACK
 JMP CNTLR4
CNT8 JMP NOFWD
HK1 JMP ADDINP
IDONE JSR CMPSPC
 BNE IDONE1
 JMP ADDINP
IDONE1 JMP NXTCHAR

CMPSPC LDA $0200,X
 CMP #' '
 RTS

ADVANCE LDA $0200,X
 BEQ LSTMOV
 CPX LENGTH
 BCS LSTMOV
 CMP #' '
 BEQ CNTF1
 JSR POUT
 INX
 JMP ADVANCE
CNTF1 LDA $0200,X
 BEQ LSTMOV
 CPX LENGTH
 BCS LSTMOV
 CMP #' '
 BNE LSTMOV
 JSR POUT
 INX
 JMP CNTF1
LSTMOV JMP NXTCHAR

CNTLE LDA $0200,X
 BEQ CNTLE1
 JSR POUT
 INX
 CPX LENGTH
 BCC CNTLE
CNTLE1
 TXA
 PHA
 JSR $FC42
 PLA
 TAX
 RTS

BRNGBK CPX XREG
 BEQ BRNGBK1
 JSR BACK
 DEX
 JMP BRNGBK
BRNGBK1 RTS

MGET LDA #$00
 STA GETFLG

 JMP MINPUT1

MTEST LDA #$80
 STA GETFLG
 JMP MINPUT1


MLEN JSR INCPTR
 SEC
 LDA PTR
 SBC LPTR
 PHA
 LDA PTR+1
 SBC LPTR+1
 TAY
 PLA
 JMP SAVNUM


AREGC DFB 0
XREGC DFB 0
YREGC DFB 0

FLASH LDA GETFLG
 CMP #$FF
 BNE NOTINP
 LDX XREG
 LDA $0200,X
 BEQ NOTINP
 PHA
 JSR INVERSE
 PLA
 ORA #$80
 JMP DOIT
NOTINP LDA #' '
DOIT JSR COUT
 JSR NORMAL
 LDA #$88
 JMP COUT

NOFLASH PHA
 LDA GETFLG
 CMP #$FF
 BNE NOFLSH1
 LDX XREG
 LDA $0200,X
 BEQ NOFLSH1
 ORA #$80
 JMP NOFLSH2
NOFLSH1 LDA #" "
NOFLSH2 JSR DOIT
 PLA
 RTS

DINPUT LDX OUTWDTH
 DEX
 STX LENGTH
 LDA #' '
 STA MINUM
 LDA #$7F
 STA MAXUM
 STA EXPTION
 LDA #"_"
 STA CHTCHR
CHATHOOK LDA #9
 JSR TABPRNT
 LDA #$FF
 STA CHTREG
 STA CHTFLG
 JSR CLRWRP
 JSR PRMCOM
 JSR CROUT
 LDA #$00
 STA OUTMASK
 STA TIMOOF
 STA SYSOP
DIN5 LDA #$FF
 STA GETFLG
 STA WRPFLG
 JSR CLRBUF
 JSR GETLN
 JMP DIN5

CHAR DFB 0
LENGTH DFB 40
MINUM DFB 32
MAXUM DFB 90
EXPTION DFB 32

GOTO JSR FRMNUM
 JSR GETADR
 JMP $D941

ZGOSUB
 JSR FRMNUM
 JSR GETADR
 LDX STKPTR
 SEI
 BIT $C083
 BIT $C083
 LDA TXTPTR
 STA STACK,X
 INX
 LDA TXTPTR+1
 STA STACK,X
 INX
 LDA CURLIN
 STA STACK,X
 INX
 LDA CURLIN+1
 STA STACK,X
 BIT $C08A
 JSR EXIT
 INX
 STX STKPTR
 JMP $D941

ZRETURN LDX STKPTR
 DEX
 SEI
 BIT $C083
 LDA STACK,X
 STA CURLIN+1
 DEX
 LDA STACK,X
 STA CURLIN
 DEX
 LDA STACK,X
 STA TXTPTR+1
 DEX
 LDA STACK,X
 STA TXTPTR
 STX STKPTR
 BIT $C08A
 JMP EXIT

TEMP1 DA 0
DELREG DFB 0,0,0,0,0,0
STKPTR DFB 0

SAVNUM1 LDY #$00
SAVNUM STY TEMP1
 STA TEMP1+1
SAVNUM3 JSR $EFAE ;RANDOM NUMBER GENERATER
 LDA TEMP1 ;FLOAT HIGH BYTE
 STA FAC+1
 LDA TEMP1+1
 STA FAC+2
 LDX #$90
 SEC
 JSR $EBA0 ;FLO2
SAVVAL JSR NUMCOM
 LDA VALTYP+1
 PHA
 LDA VALTYP
 PHA
 JMP LET1

CSREG DFB 0
CHTREG DFB 0

CHTCOM LDA #$00
 STA CHTFLG
 STA GETFLG
 STA WRPFLG
 STA CHTREG
 JMP NOFLASH

ISPRV JSR SAVREG
 LDA PRVFLG
 BEQ ISPRV1
 LDA #$00
 BEQ ISPRV2
ISPRV1 LDA #$FF
ISPRV2 STA PRVFLG
 JSR PRMCOM
 JMP RESTORE

ISCHAT LDA CHTFLG
 BNE ENDCHT
 JMP DINPUT
ENDCHT LDA CHTREG
 BEQ MAKERR2
ENDCHT1 JSR CHTCOM
 LDX SREG
 TXS
 LDA #$FF
 STA TIMOOF
 LDA CURLIN
 STA LINNUM
 LDA CURLIN+1
 STA LINNUM+1
 JMP $D941

MAKERR LDA CHTFLG
 BNE MAKERR1
 LDX #$FF
 JMP ERROR
MAKERR1 LDA CHTREG
 BNE ENDCHT1
MAKERR2 JSR CHTCOM
 LDX SREG
 TXS
 JMP SAVNUM1

TSTKBD LDA KEY
 BPL :END
 STA KEY+$10
 AND #$7F
 CMP #' '
 BGE :PUSH
 CMP #$03 ;CONTROL C
 BNE :L0
 JMP MAKERR
:L0 CMP #27 ;ESCAPE
 BNE :L1
 JMP ISCHAT
:L1 CMP #16 ;CONTROL P
 BNE :L2
 JMP ISPRV
:L2 CMP #15 ;CONTROL O
 BNE :L3
 JMP LEAVE
:L3 CMP #25 ;CONTROL Y
 BNE :L4
 JMP SIGNOFF
:L4 CMP #26 ;CONTROL Z
 BNE :L5
 JMP PRNTTGG
:L5 CMP #12 ;CONTROL L
 BNE :PUSH
 JMP FLPCASE
:PUSH BIT CASTYP
 BPL :PUSH1
 JSR DLCASE
:PUSH1 JMP PUSHBYT
:END RTS

FLPCASE LDA CASTYP
 BEQ :L0
 LDA #$00
 BEQ :L1
:L0 LDA #$FF
:L1 STA CASTYP
 RTS

CASTYP DFB 0

IOHOOKS = $BE30
IOPAGE = $BE10

PRNTTGG PHA
 STX XSAVE
 JSR RDCHAR
 AND #$7F
 CMP #'0'
 BLT :END
 CMP #'8'
 BGE :END
 SEC
 SBC #'0'
 ASL
 TAX
 LDA IOPAGE+1,X
 BEQ :END
 STA IOHOOKS+1
 LDA IOPAGE,X
 STA IOHOOKS
:END PLA
 LDX XSAVE
 JMP PUSHBYT

XSAVE DFB 0

LEAVE JMP TOOLONG
SIGNOFF JMP IST3

TSTMDM JSR TSTKBD
 LDA SLOT
 BEQ TSTBUF
 LDA OH
 BEQ TSTBUF
 LDA MODEMON
 BEQ TSTBUF
 JSR MINP
TSTBUF LDA TBUFF
 BEQ :NOINP
 SEC
 RTS
:NOINP CLC
 RTS

PUSHBYT JMP PUSH

PULL LDX #$00
 LDA TBUFF
 STX TBUFF
 CMP #''
 BEQ MKBCK
 RTS
MKBCK LDA #$08
 RTS


TOOLONG JSR MSLOT
 LDA #$04
 STA SYSMOD
 LDX #253
 JMP ERROR

OLDTIM LDX #$03
OLDTIM1 LDA ATIME,X
 STA TIME,X
 DEX
 BPL OLDTIM1
 JMP CALCTM

POS JSR GETBYT
 STX CLKMOD
 CPX #$02
 BGE OLDTIM
 LDA WOFFST,X
 STA TIMOFF
 JSR MLI
 DFB $82
 DA 0
 LDY TIMOFF
 LDX #$03
:MOVTIM LDA $BF90,X
 STA TIME,X
 STA ATIME,Y
 DEY
 DEX
 BPL :MOVTIM
 INY
CALCTM JSR CHRGET
 LDA #$00
 JSR FLOAT
 JSR DISCTIM
 LDA YEAR
 JSR ADDNUM
 LDA MONTH
 JSR ADDNUM
 LDA DAY
 JSR ADDNUM
 JSR SAVVAL
 JSR CHRGET
 LDA #$00
 JSR FLOAT
 LDA HOUR
 JSR ADDNUM
 LDA MINUTE
 JSR ADDNUM
 JSR SAVVAL
LOADTIM JSR CHRGET
 LDA CLOCK
 BNE :GOTCLK
 LDA TIMREM
 JMP SAVNUM1
:GOTCLK LDA CURMIN
 LDY CURMIN+1
 JMP SAVNUM

MRKTIM JSR MRKTIM1
 JMP LOADTIM
MRKTIM1 LDA #30
 STA DOTIME
 LDA #$01
 STA CLKMOD
 LDA CLOCK
 BNE :GOTCLK
 JMP WRTTIM
:GOTCLK JSR MLI
 DFB $82 ;TIME READ
 DA 0
 LDX #$03
:MOVTIM LDA $BF90,X
 STA TIME,X
 DEX
 BPL :MOVTIM
DISCTIM LDA TIME+1
 ROR
 AND #$7F
 STA YEAR
 LDA TIME+1
 ROR
 LDA TIME
 ROL
 ROL
 ROL
 ROL
 AND #$0F
 STA MONTH
 LDA TIME
 AND #$1F
 STA DAY
 LDA TIME+3
 STA HOUR
 STA HOUR1
 LDA TIME+2
 STA MINUTE
 STA CURMIN
 LDA CLOCK
 BNE :GOTCLK
 RTS
:GOTCLK LDA CLKMOD
 BEQ :SET
 CMP #$02
 BGE :END
 LDA #$00
 STA CURMIN+1
 LDA DAY
 CMP DAY1
 BEQ :CALC
 LDA #24
 CLC
 ADC HOUR1
 STA HOUR1
 JMP :CALC1
:CALC LDA HOUR
 STA HOUR1
:CALC1 JSR CNVMIN
 LDA CURMIN
 SEC
 SBC LOGMIN
 STA CURMIN
 LDA CURMIN+1
 SBC LOGMIN+1
 STA CURMIN+1
 LDA TIMREM
 SEC
 SBC CURMIN
 STA CURMIN
 LDA #$00
 SBC CURMIN+1
 STA CURMIN+1
 BCC :OUT
 JMP WRTTIM
:OUT LDA #$00
 STA CURMIN
 STA CURMIN+1
 LDA TIMOOF
 BEQ WRTTIM
 JSR WRTTIM
 JMP BYEBYE
:SET LDA DAY
 STA DAY1
 JSR CNVMIN
 LDA CURMIN
 STA LOGMIN
 LDA CURMIN+1
 STA LOGMIN+1
:END RTS

WRTTIM LDA CLOCK
 BNE :WRTTIM1
 LDA TIMREM
 JMP :WRTTIM2

:WRTTIM1 LDA CURMIN
:WRTTIM2 STA WRTREG
 JSR PUSHCH
 JSR TABBOT
 LDA #$01
 STA CH
 LDY #100
 JSR CNVRT
 JSR SCOUT2
 LDY #10
 JSR CNVRT
 JSR SCOUT2
 LDA WRTREG
 JSR CNVRT1
 JSR SCOUT2
 LDA CLOCK
 BEQ :WRTTIM3
 LDA #"M"
 JMP :WRTTIM4
:WRTTIM3 LDA #"K"
:WRTTIM4 JSR SCOUT2
 JMP PULLCH

CNVRT STY SUBREG
 LDX #$00
 LDA WRTREG
:L0 SEC
 SBC SUBREG
 BCC :O10
 STA WRTREG
 INX
 BNE :L0
:O10 TXA
CNVRT1 CLC
 ADC #"0"
 RTS

SUBREG DFB 0
WRTREG DFB 0
DOTIME DFB $FF

CNVMIN LDA HOUR1
 BEQ :END
:LOOP LDA CURMIN
 CLC
 ADC #60
 STA CURMIN
 LDA CURMIN+1
 ADC #$00
 STA CURMIN+1
 DEC HOUR1
 BNE :LOOP
:END RTS

CURMIN DA 0
LOGMIN DA 0
CLKMOD DFB 0
YEAR DFB 0
MONTH DFB 0
DAY DFB 0
HOUR DFB 0
MINUTE DFB 0

DAY1 DFB 0
HOUR1 DFB 0

ADDNUM PHA
 JSR MUL10
 JSR MUL10
 LDY #>FACTMP
 LDX #FACTMP
 JSR MOVMF
 PLA
 JSR FLOAT
 LDY #>FACTMP
 LDA #FACTMP
 JMP FADD

FACTMP HEX 0000000000
TIME DA 0,0
TIMOFF DFB 0
WOFFST DFB 3,7

PWIDTH DFB 0
TABWDTH DFB 0


NEWSTR LDY #$00
 STY YREG
NEWSTR1 JSR CHRGET
 JSR STRCOM
 LDY YREG
 LDA FORPNT
 STA LSTSTR,Y
 INY
 LDA FORPNT+1
 STA LSTSTR,Y
 INY
 STY YREG
 DEC STRCNT
 BNE NEWSTR1
 RTS

PUTSTT PHA
 JSR IS80ON
 BEQ :NO80
 STA $C055
 PLA
 STA $0750
 STA $C054
 RTS
:NO80 PLA
 STA $06D0
 RTS

ISTIM LDA TIMOOF ;Is the timer on to count down?
 BNE :NEXT ;Yes, continue decrementing it
 LDA TIMPRO ;Is protect on post enabled?
 BNE :NEXT ;Yes, so don't count down
 LDA #"#" ;Load the protect symbol
 BNE COUNTON1 ;Protected, back to the program
:NEXT LDA CLKCRD ;Is there a clock card installed?
 BEQ NOCLOCK ;Nope, use byte counter
 JSR SIGNS ;Find out which sign to use
COUNTON1 JMP PUTSTT ;Back to the main program
NOCLOCK JSR SIGNS ;Find out which sign to use
 JSR PUTSTT ;Main Routine again

SIGNS LDA OH ;Is the modem off the hook?
 BEQ LOCALUSE ;No, go get the "+" sign
 LDA #"-" ;Yes, use the "-" sign
 RTS ;Back to the routine
LOCALUSE LDA #"+" ;Load the "+" sign
 RTS ;Back to the routine



 INC TMR1
 BEQ IST1
 RTS
IST1 DEC TMR1+1
 LDA TMR1+1
 BEQ IST2
 CMP #$05
 BGE ISTA
 RTS
IST2 DEC TIMREM
 BEQ IST3
 JSR WRTTIM
ISTA JMP SETTMR
IST3 LDA TIMOOF
 BNE BYEBYE
 LDA #$01
 STA TIMREM
 LDA #$04
 STA TMR1+1
 LDA #$01
 STA TMR1
 RTS
BYEBYE LDA #$00
 STA TIMOOF
 STA PABRT
 LDA #12
 JSR TABPRNT
 JMP TOOLONG

STRCNT DFB 0
LSTSTR DA 0,0

SREG DFB 0

MAKTTL JSR PUSHCH
 JSR TABBOT
 LDA #$05
 STA CH
 LDY #30
:LOOP LDA #" "
 JSR SCOUT2
 DEY
 BPL :LOOP
 JSR PULLCH
 JSR WRTTIM
 JSR PUSHCH
 JSR TABBOT
 LDX STRLEN
 TXA
 LSR
 STA STRLEN
 LDA #19
 SEC
 SBC STRLEN
 STX STRLEN
 STA CH
 LDY #$00
 INX
:LOOP1 DEX
 BEQ :END
 LDA (PTR),Y
 JSR CASE
 ORA #$80
 JSR SCOUT2
 INY
 BNE :LOOP1
:END JMP PULLCH

TABBOT LDA #21
 STA CV
 JSR IS80ON
 BEQ :NOINC
 INC CV
:NOINC LDA CV
 JMP TABV


DOCR LDA CHP
 BNE DOCR1
 RTS
DOCR1 LDA COLMNS
 STA COLM
 JMP CROUT

OLDSTR LDA LSTSTR,Y
 STA FORPNT
 INY
 LDA LSTSTR,Y
 STA FORPNT+1
STRPRM LDY #$02
:LOOP LDA (FORPNT),Y
 STA STRLEN,Y
 DEY
 BPL :LOOP
 RTS

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


RCHAR DFB 0
COLMNS DFB 0
COLM DFB 0
COMMAND DFB 0
CMDLVL DFB 0
SECLVL DFB 0
TEMP DA 0

NULLS1 DFB 0

DONULLS JSR POUT0
DONUL1 LDA NULLS
 STA NULLS1
 BEQ DNULL2
DNULL1 LDA #$00
 JSR POUT0
 DEC NULLS1
 BNE DNULL1
DNULL2 LDA #$00
 STA CHP
 JMP POUT3

CROUT LDA #13 ;^13
 BNE POUT
BACK LDA #$08
POUT STY YREGC
 STX XREGC
 STA AREGC
POUT0 AND #$7F

 BIT SPECIAL+1
 BPL :NOTNAM1
 CMP #14 ;^N
 BNE :NOTFRST
 JMP DONAME
:NOTFRST CMP #22 ;^V
 BNE :NOTLST
 JMP DOLAST
:NOTLST CMP #23 ;^W
 BNE :NOTNAME
 JMP DOALAIS
:NOTNAME CMP #20 ;^T
 BNE :NOTNAM1
 JMP MAKPAU


:NOTNAM1 CMP #' '
 BLT NOMASK
 BIT OUTMASK
 BEQ NOMASK
 LDA MSKCHR
NOMASK STA LASTCHR
 BIT SCRNON
 BPL POUT1
 ORA #$80
 CMP #$8A
 BEQ POUT1
 CMP #$87
 BEQ NBELL
 CMP #$91
 BEQ :NOSEND
 CMP #$95
 BEQ :NOSEND
 BIT LOWCAS
 BPL :WCOUT
 JSR CASE
 ORA #$80
:WCOUT JSR COUT
:NOSEND JSR ISTIM
POUT1 LDY SLOTN
 BEQ POUT1A
 LDA MODEMON
 BEQ POUT1A
 LDA OH
 BEQ POUT1A
 LDA LASTCHR
 BIT MDMCASE
 BPL POUT1B
 JSR CASE
POUT1B JSR MOUT
 JMP POUT1C
POUT1A JSR TSTMDM
POUT1C LDA LASTCHR
 CMP #$0D
 BEQ POUT2
 CMP #$00
 BEQ POUT3
 CMP #$08
 BNE :NEXT
 DEC CHP
 DEC CHP
:NEXT INC CHP
 LDA TBUFF
 BEQ POUT3
 CMP #19 ;^S
 BNE POUT3
POUTLP1 JSR PULL
 LDA PAUSE?
 BNE POUT3
 JSR RDCHAR
POUT3 LDY YREGC
 LDX XREGC
 LDA AREGC
 RTS
POUT2 BIT LINFD
 BPL SNDNUL
 LDA #$0A
 JMP DONULLS
SNDNUL JMP DONUL1
NBELL LDA SPEAKER
 LDA #4
 STA SCTR
NBELL1 LDA #$80
 STA SCTR+1
NBELL2 JSR TSTMDM
 DEC SCTR+1
 BNE NBELL2
 LDA SPEAKER
 DEC SCTR
 BNE NBELL1
 JMP POUT1

TABPRNT SEI
 ASL
 TAX
 BIT $C083
 LDA $D200,X
 STA INDEX
 LDA $D201,X
 STA INDEX+1
 BIT $C08A
 LDY #$00
:LOOP BIT $C083
 LDA (INDEX),Y
 PHA
 BIT $C08A
 PLA
 BEQ :END
 PHA
 JSR POUT
 PLA
 BMI :END
 JSR DOABRT
 INY
 BNE :LOOP
:END JMP EXIT

CHP DFB 0
SCTR DA 0
NYREG DFB 0
NADDER DA 0
NADDER1 DA 0

XPREG DFB 0
YPREG DFB 0
LSTCHP DFB 0


MAKPAU STY YPREG
 STX XPREG
 LDA CHP
 STA LSTCHP
 LDA INDEX
 STA NADDER1
 LDA INDEX+1
 STA NADDER1+1
 LDA #3
 JSR TABPRNT
 JSR RDCHAR
 LDY CHP
:LOOP CPY LSTCHP
 BEQ :END
 LDA #$88
 JSR POUT
 DEY
 BNE :LOOP
:END LDA NADDER1
 STA INDEX
 LDA NADDER1+1
 STA INDEX+1
 LDY YPREG
 LDX XPREG
 RTS

DOALAIS LDY #21
 STY NYREG
 JSR DOSPC0
:LOOP LDY NYREG
 CPY #21+20
 BGE :END
 LDA HBUFF,Y
 CMP #' '
 BEQ :DONE?
:SEND JSR POUT0
 INC NYREG
 BNE :LOOP
 RTS
:DONE? LDY NYREG
 INY
 LDA HBUFF,Y
 CMP #' '
 BEQ :END
 LDA #' '
 JMP :SEND
:END JMP POUT3

DOLAST LDY #$02
:LOOP LDA HBUFF,Y
 CMP #' '
 BEQ :END
 INY
 CPY #21
 BLT :LOOP
:END INY
 JMP SNDOUT

DOSPC0 LDA #' '
 JMP POUT0

DONAME LDY #$01
SNDOUT STY NYREG
 LDA #$00
 STA NADDER
 JSR DOSPC0
:LOOP LDY NYREG
 CPY #20
 BEQ :END
 LDA HBUFF,Y
 AND #$7F
 CMP #' '
 BEQ :END
 JSR CASE
 BIT NADDER
 BPL :SEND
 JSR DLCASE
:SEND JSR POUT0
 LDA #$FF
 STA NADDER
 INC NYREG
 BNE :LOOP
:END JMP POUT3

TONERR JSR DOCLOSE
 PLA
 TAY
 PLA
 LDX #$DF
 TXS
 PHA
 TYA
 PHA
 LDA #$00
 STA ERRFLG
 JSR CHRGOT
 CMP #EQUAL
 BEQ TONERR2
 RTS
TONERR2 JSR CHRGET
 LDA ERRNUM
 JSR SAVNUM1
 JSR CHRGOT
 CMP #','
 BNE TONERR1
 JSR CHRGET
 LDY ERRLIN+1
 LDA ERRLIN
 JMP SAVNUM
TONERR1 RTS
