Serial Port Monitor/Tester Assembly Language Program
Posted: Tue Jan 16, 2024 7:46 pm
I've been doing some tidying of the program I use when testing my USB adapters and thought I'd post the ode here as an example and maybe a useful tool.
The assembly source is this:
I assemble this with my Psion assembler, which outputs (among other output files) this OPl file:
At first this code was TRAPing, but it turned out I had exceeded the relative branch limit on some BRA instructions, so I added an error check in the assembler, which is up on github. Once the OPL is run, the program shows the state of DTR and RTS and allows you to set the level of the CTS line.
I use 'statserial' on Linux to look at the other end of the USB.
Andrew
The assembly source is this:
Code: Select all
.INCLUDE MSWI.INC
.INCLUDE MOSHEAD.INC
.INCLUDE MOSVARS.INC
.INCLUDE COMMS.INC
cts .equ 1
ncts .equ 254
dsr .equ 2
rts .equ 4
;; --------------------------------------------------
;; Check for comms link. If present then proceed
;; otherwise just exit
;;
;; --------------------------------------------------
bsr check_present
bcs not_present
;; bra not_present ;
bra is_present
check_present:
bsr 1$ ; PC relative
.ascic "XFEOF" ; leading count byte string
1$: pulx ; PC = address of "XFEOF"
os dv$lkup ; if XFEOF not there, no COMMS LINK
rts ; see tech. ref. manual
;; --------------------------------------------------------------------------------
;;
;; Not present so display a message
;;
not_present:
bsr nocoms
.ascic "No Comms Link"
nocoms: pulx
ldab 0,x
inx
os dp$prnt
os kb$getk
rts
;; --------------------------------------------------------------------------------
;; Comms Link present so sit in loop
;; If X pressed then exit
;; C toggles CTS
;; Status of other lines displayed
is_present:
clrb ; Open for reading and writing
RS rs_open
bcs error ; Deal with error
; Now free to access the port
bra statloop
error:
rts
statloop:
;; Stop kb$test from turning packs off, that would stop us getting
;; access to the port hardware.
ldaa #0
staa kbb_pkof
;; Check the keyboard
os kb$test
cmpb #0
beq nokey
;; Key pressed, but kb$test has put it in the unget buffer
;; where it will get stuck. Use kb$getk to actually get the key
os kb$getk
;; Key pressed, handle it
cmpb #^A'X'
beq doex
;; CTS control
cmpb #^A'S'
beq cts0a
cmpb #^A'T'
beq cts1a
nokey:
;; Display status
;; of serial port handshake lines
ldaa #0 ;Cursor to top left
ldab #0
os dp$stat
ldaa #14
os dp$emit
bsr 1$
.ascic "RTS="
1$: pulx
ldab 0,x
inx
os dp$prnt
;; Get RTS state
ldaa POB_PORT2
anda #4
asra
asra
adda #^A'0'
os dp$emit
bsr tdtr
.ascic " DTR="
; trampolines
statloop1: bra statloop
tdtr: pulx
ldab 0,x
inx
os dp$prnt
;; Get DTR state
ldaa POB_PORT2
anda #2
asra
adda #^A'0'
os dp$emit
bsr 2$
.ascic " CTS="
2$: pulx
ldab 0,x
inx
os dp$prnt
;; Get CTS state
ldab #0
bsr ctsvar
adda #^A'0'
os dp$emit
ldaa #^A' '
os dp$emit
ldaa #10
os dp$emit
ldaa #13
os dp$emit
bsr sub3
.ascic "CTS:S,T Exit:X"
nokey1: bra nokey
cts0a: bra cts0
cts1a: bra cts1
doex: bra doexit
sub3: pulx
ldab 0,x
inx
os dp$prnt
;; Loop back
bra statloop1
;; --------------------------------------------------------------------------------
;;
doexit:
;; Now close the comms link
ldab #0
RS rs_close
;; Allow packs to be turned off again by kb$test
ldaa #255
staa kbb_pkof
rts
;; --------------------------------------------------------------------------------
;; Set CTS to zero
;;
cts0:
aim #ncts, POB_PORT2
ldaa #0
ldab #1
bsr ctsvar
bra nokey1
;; Set CTS to 1
cts1:
oim #cts, POB_PORT2
ldaa #1
ldab #1
bsr ctsvar
bra nokey1
;; --------------------------------------------------------------------------------
;;
;; We have to use a position independent varaible to hold the
;; CTS state as we cn't read the state of the output
ctsvar:
bsr 4$
.byte 0
4$: pulx
;; Set or read the var?
cmpb #0
beq readvar
;; Write variable
staa 0,x
rts
readvar:
ldaa 0,x
rts
;; --------------------------------------------------------------------------------
Code: Select all
statser:
LOCAL MC$(247)
MC$=CHR$($8d)
MC$=MC$+CHR$($04)
MC$=MC$+CHR$($25)
MC$=MC$+CHR$($0e)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($25)
MC$=MC$+CHR$($8d)
MC$=MC$+CHR$($06)
MC$=MC$+CHR$($05)
MC$=MC$+CHR$($58)
MC$=MC$+CHR$($46)
MC$=MC$+CHR$($45)
MC$=MC$+CHR$($4f)
MC$=MC$+CHR$($46)
MC$=MC$+CHR$($38)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($19)
MC$=MC$+CHR$($39)
MC$=MC$+CHR$($8d)
MC$=MC$+CHR$($0e)
MC$=MC$+CHR$($0d)
MC$=MC$+CHR$($4e)
MC$=MC$+CHR$($6f)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($43)
MC$=MC$+CHR$($6f)
MC$=MC$+CHR$($6d)
MC$=MC$+CHR$($6d)
MC$=MC$+CHR$($73)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($4c)
MC$=MC$+CHR$($69)
MC$=MC$+CHR$($6e)
MC$=MC$+CHR$($6b)
MC$=MC$+CHR$($38)
MC$=MC$+CHR$($e6)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($08)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($11)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($48)
MC$=MC$+CHR$($39)
MC$=MC$+CHR$($5f)
MC$=MC$+CHR$($bd)
MC$=MC$+CHR$($21)
MC$=MC$+CHR$($74)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($25)
MC$=MC$+CHR$($02)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($01)
MC$=MC$+CHR$($39)
MC$=MC$+CHR$($86)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($b7)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($c1)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($4b)
MC$=MC$+CHR$($c1)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($27)
MC$=MC$+CHR$($0e)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($48)
MC$=MC$+CHR$($c1)
MC$=MC$+CHR$($58)
MC$=MC$+CHR$($27)
MC$=MC$+CHR$($81)
MC$=MC$+CHR$($c1)
MC$=MC$+CHR$($53)
MC$=MC$+CHR$($27)
MC$=MC$+CHR$($71)
MC$=MC$+CHR$($c1)
MC$=MC$+CHR$($54)
MC$=MC$+CHR$($27)
MC$=MC$+CHR$($6f)
MC$=MC$+CHR$($86)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($c6)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($14)
MC$=MC$+CHR$($86)
MC$=MC$+CHR$($0e)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($10)
MC$=MC$+CHR$($8d)
MC$=MC$+CHR$($05)
MC$=MC$+CHR$($04)
MC$=MC$+CHR$($52)
MC$=MC$+CHR$($54)
MC$=MC$+CHR$($53)
MC$=MC$+CHR$($3d)
MC$=MC$+CHR$($38)
MC$=MC$+CHR$($e6)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($08)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($11)
MC$=MC$+CHR$($96)
MC$=MC$+CHR$($03)
MC$=MC$+CHR$($84)
MC$=MC$+CHR$($04)
MC$=MC$+CHR$($47)
MC$=MC$+CHR$($47)
MC$=MC$+CHR$($8b)
MC$=MC$+CHR$($30)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($10)
MC$=MC$+CHR$($8d)
MC$=MC$+CHR$($08)
MC$=MC$+CHR$($05)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($44)
MC$=MC$+CHR$($54)
MC$=MC$+CHR$($52)
MC$=MC$+CHR$($3d)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($bc)
MC$=MC$+CHR$($38)
MC$=MC$+CHR$($e6)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($08)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($11)
MC$=MC$+CHR$($96)
MC$=MC$+CHR$($03)
MC$=MC$+CHR$($84)
MC$=MC$+CHR$($02)
MC$=MC$+CHR$($47)
MC$=MC$+CHR$($8b)
MC$=MC$+CHR$($30)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($10)
MC$=MC$+CHR$($8d)
MC$=MC$+CHR$($06)
MC$=MC$+CHR$($05)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($43)
MC$=MC$+CHR$($54)
MC$=MC$+CHR$($53)
MC$=MC$+CHR$($3d)
MC$=MC$+CHR$($38)
MC$=MC$+CHR$($e6)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($08)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($11)
MC$=MC$+CHR$($c6)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($8d)
MC$=MC$+CHR$($4f)
MC$=MC$+CHR$($8b)
MC$=MC$+CHR$($30)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($10)
MC$=MC$+CHR$($86)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($10)
MC$=MC$+CHR$($86)
MC$=MC$+CHR$($0a)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($10)
MC$=MC$+CHR$($86)
MC$=MC$+CHR$($0d)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($10)
MC$=MC$+CHR$($8d)
MC$=MC$+CHR$($13)
MC$=MC$+CHR$($0e)
MC$=MC$+CHR$($43)
MC$=MC$+CHR$($54)
MC$=MC$+CHR$($53)
MC$=MC$+CHR$($3a)
MC$=MC$+CHR$($53)
MC$=MC$+CHR$($2c)
MC$=MC$+CHR$($54)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($45)
MC$=MC$+CHR$($78)
MC$=MC$+CHR$($69)
MC$=MC$+CHR$($74)
MC$=MC$+CHR$($3a)
MC$=MC$+CHR$($58)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($16)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($1f)
MC$=MC$+CHR$($38)
MC$=MC$+CHR$($e6)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($08)
MC$=MC$+CHR$($3f)
MC$=MC$+CHR$($11)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($b0)
MC$=MC$+CHR$($c6)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($bd)
MC$=MC$+CHR$($21)
MC$=MC$+CHR$($74)
MC$=MC$+CHR$($01)
MC$=MC$+CHR$($86)
MC$=MC$+CHR$($ff)
MC$=MC$+CHR$($b7)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($c1)
MC$=MC$+CHR$($39)
MC$=MC$+CHR$($71)
MC$=MC$+CHR$($fe)
MC$=MC$+CHR$($03)
MC$=MC$+CHR$($86)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($c6)
MC$=MC$+CHR$($01)
MC$=MC$+CHR$($8d)
MC$=MC$+CHR$($0d)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($70)
MC$=MC$+CHR$($72)
MC$=MC$+CHR$($01)
MC$=MC$+CHR$($03)
MC$=MC$+CHR$($86)
MC$=MC$+CHR$($01)
MC$=MC$+CHR$($c6)
MC$=MC$+CHR$($01)
MC$=MC$+CHR$($8d)
MC$=MC$+CHR$($02)
MC$=MC$+CHR$($20)
MC$=MC$+CHR$($65)
MC$=MC$+CHR$($8d)
MC$=MC$+CHR$($01)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($38)
MC$=MC$+CHR$($c1)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($27)
MC$=MC$+CHR$($03)
MC$=MC$+CHR$($a7)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($39)
MC$=MC$+CHR$($a6)
MC$=MC$+CHR$($00)
MC$=MC$+CHR$($39)
RETURN USR(ADDR(MC$)+1,0)
I use 'statserial' on Linux to look at the other end of the USB.
Andrew