Serial Port Monitor/Tester Assembly Language Program

Use this section to showcase your programming examples. Or to ask members for programming suggestions
Post Reply
amenjet
Posts: 200
Joined: Tue Jan 03, 2023 7:54 pm

Serial Port Monitor/Tester Assembly Language Program

Post by amenjet »

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:

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

	;; --------------------------------------------------------------------------------

I assemble this with my Psion assembler, which outputs (among other output files) this OPl file:

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)
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
Post Reply