home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource3
/
132_01
/
dload
< prev
next >
Wrap
Text File
|
1985-08-21
|
7KB
|
274 lines
;+
; Downline loader in assembly language for the Radio Shack
; Color Computer
;-
;+
; Ser6809 file must be appended for serial input function
;-
.=0x7A00
;+
; dload gets a line from the serial input port via serinp.
; Loading begins with an 'S' and terminates with an 'X'.
; Load format: (Intel hex)
; :<nn><00><aaaa><hh><hh>...<hh><ck>
; where <aaaa> is a four hex digit address
; <00> is two hex zeroes
; <nn> is a two digit hex count of the <hh> bytes
; <hh> is a two hex digit byte
; ':' is a starting colon
;-
dload:
.byte 0x34,0x36 ;PSHS a,b,x,y
bsr finds ;look for the starting 'S'
loop0:
bsr getline
bcs exit
bsr echo ;echo the line to the color screen
bsr parse ; decode the line and load memory
bcc loop0
exit:
.byte 0x35,0x36 ;PULS a,b,x,y
rts
;+
; getline gets an input line from the serial port
; A line is defined as a non-zero character string
; bounded by characters less than 0x20. The string is
; terminated by two nulls.
; Inputs: none
; Outputs: Characters to buffer buf.Carry clear if ok.
; Carry set if ending 'X' detected.
; Calls: serinp
;-
getline:
.byte 0x8E
.word buf ;LDX #buf
getsyn:
jsr serinp
cmp a,$0x20 ;test for control char
blo getsyn ; if <20, keep looping
getlup:
.byte 0xA7,0x80 ;sta ,x+
cmp a,$0x58 ;test for 'X'
beq getext
jsr serinp
cmp a,$0x20
bgt getlup
getext:
.byte 0x6F,0x80 ;clr 0,x+ tag string
.byte 0x6F,0x80 ;clr ,x+
cmp a,$0x58 ;Termination due to 'X'?
bne getexy
.byte 0x1A,01 ;ORCC #1, set carry
bra getexx
getexy:
.byte 0x1C,0xFE ;clear the carry
getexx:
rts
;+
; finds searches for the starting 'S'
;-
finds:
jsr serinp
cmp a,$0x53
bne finds
rts
;+
; parse decodes the string and loads the memory locations
; from the defined starting address.
; Inputs: No parameters passed on input
; Input line assumed stored in buffer buf
; Output: Loads memory with bytes
; Returns: carry set if error, clear if ok
; Calls: getadd,hexbin
;-
parse:
.byte 0x8E
.word buf ;ldx #buf
.byte 0x30,01 ;LEAX 1,x increment past starting colon
.byte 0xEC,0x81 ; LDD ,X++ get byte count
bsr hexbin ; get the byte count
bcs parsex
tst a
.byte 0x1a,01 ;set the carry bit to exit if need be
beq parsex ; end of file
mov a,bytcnt
bsr getadd ; get starting address in Y
bcs parsex ; if failure on address
.byte 0x30,02 ;LEax 2,x increment past null byte
parlup:
.byte 0xEC,0x81 ;ldd ,x++ get two hex digits
bsr hexbin ;convert to binary
bcs parsex1 ;if error in conversion,end of line
.byte 0xA7,0xA0 ;sta ,y+
dec bytcnt
bne parlup
parsex1:
;+
; This is where the diligent software engineer would check the
; checksum.
;-
clr a ; clear carry bit for end of line exit
parsex:
rts
bytcnt: .byte 0
;+
; echo outputs the received line to the color computer
; screen.
; Inputs: none. Line assumed stored in buf
; Outputs none.
; All regs used except B,U
; Calls: none.
;-
echo:
.byte 0x10,0x8E
.word 0x400 ;ldy #0x400
.byte 0x8E
.word buf ;Ldx #buf
echlup:
.byte 0xA6,0x80 ;lda ,x+, get a character
.byte 0xA7,0xA0 ;sta ,y+, store the character
bne echlup ; if not the null tag yet
rts
;+
; getadd decodes an address from the head of the line in buf.
; Inputs:X points to head of string to be decoded
; Returns: Carry set if bad address
; carry cleared and address in Y if ok
; X is advanced by four bytes
; Calls: hexbin
; Regs: a,b,x,y
;-
getadd:
.byte 0xEC,0x81 ;ldd ,x++ get two hex digits
bsr hexbin
bcs getadx ; if conversion error
.byte 0x34,02 ; PSHS A save top byte
.byte 0xEC,0x81 ;ldd ,x++ get two hex digits
bsr hexbin
.byte 0x1E,0x89 ;exg a,b, move converted low byte to b
.byte 0x35,02 ; PULS a
.byte 0x1E,0x02 ;exg D,Y, move address to Y
getadx:
rts ; exit, carry possibly set
;+
; hexbin converts two hex digits in a and b to a
; single byte left in a
; Inputs: two ascii encoded hex digits in a and b
; Returns: carry clear - byte in a
; carry set - conversion error
; Calls: hex1bin
; Regs: a,b,
;-
hexbin:
bsr hex1bin
bcs hexx ; if error
.byte 0x1E,0x89
; exg a and b
asl b
asl b
asl b ; move up nybble to top of byte
asl b
bsr hex1bin ; convert second ascii in a to hex in a
bcs hexx
.byte 0x34,4 ; PSHS b
.byte 0xAA,0xE0 ;ORAA ,S+ or in high byte
hexx:
rts
;+
;hex1bin is the actual ascii to binary (hex) converter.
; INPUT: ascii coded hex digit in a
; Output: carry clear, hex value in a
; carry set, converstion error , not hex
; Calls: none
; Regs: a only used
;-
hex1bin:
.byte 0x80,0x30 ;sub a , #'0
bcs hex1x ; a< '0'
cmp a,$0xa
bcs hexok ; 0 < a < 9
.byte 0x80,7 ;sub a ,#7
cmp a,$0xA ; test for result < 0xa
bcs hex1x ; a < 0xa if carry set
cmp a,$0x10
bcc hex1x ; a>= 0x10
hexok:
.byte 0x1c,0xFE ;andcc 0xfe, clear carry bit
bra hex2x
hex1x:
.byte 0x1A,0x01 ; orcc #1, set carry bit
hex2x:
rts
;+
; line buffer storage
;-
buf:
.blkb 64
.blkb 64
;+
; Serial Input routine for the 6809
; I/O port configured for Radio Shack color computer
;-
bitime = 20 ;Time constant for 4800 baud bit interval
halfbit = 5 ; 1/2 bit time for center bit sync
IPORT = 0xFF22 ; Color computer i/o port address
IMASK = 1 ; Bit position of input bit in port
;
;+
; input call to receive a character
;-
serinp:
.byte 0x1A,0x50 ;orcc 50, kill interrupts
bsr inwait ;get character
rts ;exit, character in a
;
;+
; inwait waits for an input character to start and
; receives it.
;-
inwait:
mov IPORT,a
and $IMASK,a ; Get the bit out
beq inwait ; wait on line = 0
;
serget:
.byte 0x34,0x34 ;PSHS X,Y,B
.byte 0x10,0x8E,0,8 ;LDY #8 = bitcounter
.byte 0x8E
.word halfbit ;LDX bitime /2
clr a ; clear receive register
;+
; sync up on the start bit transition
;-
sync:
mov IPORT,b ;get port value
and $IMASK,b ;Test bit value
bne sync ;wait on start bit = 1
start:
.byte 0x30,0x1F ;LEAX -1,X
beq assemble ;one half bit time has expired
mov IPORT,b
and $IMASK,b
beq start ;count down the start bit
mov $-1,a ; Glitch on start,return error
.byte 0x35,0x34 ;PULS X,Y,B
rts ;error exit
assemble:
.byte 0x8E
.word bitime ; set one bit time wait
assemb1:
.byte 0x30,0x1F ; LEAX -1,x ,dec bit timer
bne assemb1
mov IPORT,b
and $IMASK,b
beq assemb2
or $0x80,a ; or in the bit
assemb2:
.byte 0x31,0x3F ;LEAY -1,Y decr. bit count
beq seriox ; exit if done
lsr a ; move the bit down for the next pass
bra assemble
seriox:
.byte 0x35,0x34 ;PULS X,Y,B
rts ; character in A
Eç/BLOç%BLSç#BLTç-BMIç+BNEç&BPLç*BRAç BRNç!BSRçìBVCç(BVSç)CLRAüOCLRBü_CLRîCMPAïüCMPBï┴CMPDìâCMPSÄîCMPUÄ