ADCD3001 A.III memory base 128 driver

解析しました.
(2020年1月28日更新: コードの読み間違いが原因のactivation * 3 とその後の不明の 3 bits を削除)

;ADCD3001 A.III memory base 128 driver
;bits |send data   |meaning
;10   |0001_0101_01|activation
;1    |p           |set operation read or write
;10   |aaaa_aaaa_aa|memory address bit 16:7; address bit6:0 = 7'h00
;20   |l *20       |memory data bit length
;lengt|x *length   |(read) memory read data
;lengt|d *length   |(write) memory write data
;(legend)  0:low, 1:high, x:don't care, p:operation, a:address, l:length, d:write data
;---- main routine ----
;initialize -> send read command -> check memory signature
ed7ff:
	jsr	ld789 ;rts only (?)
	jsr	ld7b8 ;get activation code (A=0:ng, A=1:ok)
	cmp	#$00
	bne	ld81d
	lda	#$01
	jsr	ld885 ;send R/W(=A.1, 1:read, 0:write), address (10 bits), length (20 bits)
ld80e:
	jsr	ld863 ;read data
	lda	$36e5
	sta	($21)
	jsr	ld6f9
	bcc	ld80e
	cla
	clc
ld81d:
	jsr	ld78a
	jsr	ld901
	rts

;address 0x1ff000 assignments for memory base 128
;w0 serial write data
;w1 serial clock
;r3 always 0
;r2 memory base detection serial data
;r1 always 0
;r0 memory data

;I'm not sure how to reset serial clock count???
ld7b8:
	clx
ld7b9:
;   old -> new
;sd 0001_0101_01
;sr xxxx_xxxx_01
;sd:serial data (when serial clock sets 0->1, mb128 latch 0x1ff000.w0)
;sr:r2 = detection data, bit3, 1 and 0 must be 0
	lda	#$A8 ;serial data lsb->msb
	ldy	#$08 ;bitcount
	jsr	ld8d4
	cla
	jsr	ld8b7 ;send 1bit (A.0)
	lda	$1000 ;get activation reply
	and	#$0F
	tay
	lda	#$01
	jsr	ld8b7
	lda	$1000
	and	#$0F
	cmp	#$04
	bne	ld7e1
	tya
	cmp	#$00
	bne	ld7e1
;activation ok
	clc
	cla
	bra	ld7ec
ld7e1: ;retry max 3 times
	inx
	cpx	#$03
	bne	ld7b9
;error!
	jsr	ld7ed
	sec
	lda	#$01
ld7ec:
	rts
ld7ed:
;sd 000
	cla
	ldy	#$03
	jsr	ld8d4
	jsr	ld901 ;wait some clocks
	lda	#$01
	sta	$1000 
	jsr	ld901
	rts

ld885:
	jsr	ld730 ;tai $D91D,$36E1,$0004; rts
	jsr	ld8b7 ;send 1 bit; data=A.0
	jsr	ld738
	lda	$36d9
	ldy	#$08
	jsr	ld8d4 ;send 8bits
	lda	$36da
	ldy	#$02
	jsr	ld8d4 ;send 2bits
	lda	$36dd
	ldy	#$08
	jsr	ld8d4 ;send 8bits
	lda	$36de
	ldy	#$08
	jsr	ld8d4 ;send 8bits
	lda	$36df
	ldy	#$04
	jsr	ld8d4 ;send 4bits
	rts