________._______________ ________ .------------------.
/ _____/| ____/\ _ \ \_____ \ |.----------------.|
/ __ \ |____ \ / /_\ \ / ____/ || >*bbs beebs.ddn||
\ |__\ \/ \\ \_/ \/ \ || s.net:6502 -t ||
\_____ /______ / \_____ /\_______ \ || BBC -b 19200 ||
\/ \/ \/ \/ || ||
6502 Assembly Projext #1 || ||
A simple BBS dialer for your BBC Micro ||________________||
|-[CUB]---------[]-|
'------------------'
____ ____ ____ ____ ____
||I |||n |||t |||r |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|
A few weeks ago I started creating some pretty small but useful
(to me) tools, to make comms on the BBC Micro easier. It all
started with the menuing system I had created for my Beeb. I
wanted to be able to load a telnet/dial up connection by issuing
the host I wanted as a parameter. Unfortunately to my knowledge
there is no such comms package available for the BBC Micro.
____ ____ ____ ____ ____ ____ ____ ____
||S |||o |||l |||u |||t |||i |||o |||n ||
||__|||__|||__|||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|
I created a small program in 6502 assembly which I compiled with
the wonderful BeebASM (
https://github.com/stardot/beebasm/) to
take the parameters entered after the loader and append this to
ATDT, sending down the serial port to my TcpSer modem running at
the other end.
I.e.:
*bbs beebs.ddns.net:6502 ----> ATDT beebs.ddns.net:80
From here the program loads up the BBC Micro's (well Master 128's)
built in OS Terminal rom and you carry on from there. The built in
terminal it quite expansive (although little is documented about
its various options). This has allowed me to add additional
parameters for example:
*bbs beebs.ddns.net:6502 -t BBC
Loads up terminal in Mode 7 (teletext graphics mode for BBS
that support Teletext Mode 7 control codes.
*bbs beebs.ddns.net:6502 -t VT100
Loads up terminal in 80 column VT100 mode
*bbs beebs.ddns.net:6502 -t 40
Loads up terminal in 40 column ASCII mode
The -b (baud rate) parameter has also been added.
Needless to say coupled with my menuing system I can now select
the Comms menu, then choose the BBS I'd like to dial into without
needing to load up Commstar, setup the baud and parity, and then
type ATDT blah.blah.blah
------------------. \ .------------------.
|.----------------.| \ |.----------------.|
|| ----[COMMS]----|| \ || WELCOME TO ||
|| 1. BeeBS || \ || BeeBS ||
|| 2. NightOwl || \ || ||
|| 3. Level29 || / || ........ ||
|| 4. SDF.org || / || ....... ||
||________________|| / ||________________||
|-[CUB]---------[]-| / |-[CUB]---------[]-|
'------------------' / '------------------'
____ ____ ____ ____ ____
||N |||o |||t |||e |||s ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|
Cannot get this program to work with Econet file system, I assume
something to do with the OSARGS call, but haven't spent much time
trying to solve the problem.
This version does access the serial port via &FE09 directly, no
checking to see if it is clear, however I've not encountered any
issues with this, it may be worth replacing this with the correct
OS call to write to the serial port. OSByte 138, X set as 2
Serial out, and the character to send in Y. To send 'A' for
example:
LDA #138
LDX #2
LDY #65
JSR osbyte
____ ____ ____ ____ ____ ____ ____
||L |||i |||s |||t |||i |||n |||g ||
||__|||__|||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|/__\|/__\|
Currently MIA, I have the compiled version, but not the source, on
my to-do list to find.
-EDIT- Found a version in a backup...might work?!
osasci = &ffe3
addr = &70
cmdline = &5000
osargs = &ffda
osword = &fff1
ORG &2000
start ;get any arguments that follow *mcterm
lda #1
ldy #0
ldx #addr
jsr osargs
rdcmdlp
tya
pha
LDX #addr
LDY #0
LDA #5
JSR osword ;read byte from i/o memory
PLA
TAY
LDA addr+4
STA cmdline,Y
INY ;copy byte of commandline to buffer
INC addr
BNE rdcmdnxt
INC addr+1 ;increment command line address
rdcmdnxt
CMP #13
BNE rdcmdlp ;Loop until cr
init
ldx #2 ;set serial port to listening
lda #&02
jsr &fff4
LDY #0
parameters
LDA cmdline, Y
CMP #45 ;check for -
BNE main_loop
INY
LDA cmdline, Y
CMP #68 ;check for d
BEQ dial
JSR main_loop
dial
lda #65
sta &fe09
lda #84
sta &fe09
lda #13
sta &fe09
lda #65
sta &fe09
lda #84
sta &fe09
lda #68
sta &fe09
lda #84
sta &fe09
INY
LDA cmdline, Y
CMP #32
BNE dial_address
INY
dial_address
LDA cmdline, Y
sta &fe09
INY
cmp #32
BEQ parameters
CMP #13
BNE dial_address
JSR main_loop
main_loop
jsr check_serial
main_loop_key
jsr check_key
jmp main_loop
check_serial
ldx #1
lda #145
jsr &fff4
bcs main_loop_key ;if nothing on buffer check keyboard
tya
jsr get_char ;otherwise get character from serial
rts
check_key
ldx #0 ;check keyboard input buffer
lda #145
jsr &fff4
tya
bcs main_loop ;If nothing in buffer return to main loop
cmp #136
beq cur_left
cmp #137
beq cur_right
cmp #138
beq cur_down
cmp #139
beq cur_up
jsr get_char
print_serial
sta &fe09
jmp main_loop
cur_left
lda #29
sta &fe09
jsr display_char
jmp main_loop
cur_right
lda #6
sta &fe09
jsr display_char
jmp main_loop
cur_up
lda #30
sta &fe09
jsr display_char
jmp main_loop
cur_down
lda #10
sta &fe09
jsr display_char
jmp main_loop
get_char
crlf
cmp #10 ;check for ASCII 10
bne skip_change
lda #0 ;Skip ASCII 10
skip_change
cpx #0
beq print_serial
jsr display_char
rts
get_ansi ;get data from serial
ldx #1
lda #145
jsr &fff4
rts
display_char:
jsr osasci ;put the character on the screen
rts
end