mirror of https://github.com/wwarthen/RomWBW.git
8 changed files with 729 additions and 15 deletions
@ -0,0 +1,14 @@ |
|||
@echo off |
|||
setlocal |
|||
|
|||
set TOOLS=../../../Tools |
|||
set PATH=%TOOLS%\tasm32;%PATH% |
|||
set TASMTABS=%TOOLS%\tasm32 |
|||
|
|||
tasm -t180 -g3 -fFF i2cscan.asm i2cscan.com i2cscan.lst |
|||
tasm -t180 -g3 -fFF rtcds7.asm rtcds7.com rtcds7.lst |
|||
|
|||
if errorlevel 1 goto :eof |
|||
|
|||
copy /Y i2cscan*.com ..\..\..\Binary\Apps\ |
|||
copy /Y rtcds7*.com ..\..\..\Binary\Apps\ |
|||
@ -0,0 +1,5 @@ |
|||
@echo off |
|||
setlocal |
|||
|
|||
if exist *.com del *.com |
|||
if exist *.lst del *.lst |
|||
@ -0,0 +1,527 @@ |
|||
|
|||
.ECHO "I2CSCAN"/N |
|||
|
|||
; I2C BUS SCANNER |
|||
; |
|||
_io .equ 0A0h |
|||
_sda .equ 0 |
|||
_scl .equ 1 |
|||
_idle .equ 00000011B |
|||
|
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
; |
|||
PCF_BASE .EQU 0F0H |
|||
PCF_ID .EQU 0AAH |
|||
CPU_CLK .EQU 12 |
|||
; |
|||
PCF_RS0 .EQU PCF_BASE |
|||
PCF_RS1 .EQU PCF_RS0+1 |
|||
PCF_OWN .EQU (PCF_ID >> 1) ; PCF'S ADDRESS IN SLAVE MODE |
|||
|
|||
.org 100h |
|||
|
|||
ld sp,stack |
|||
|
|||
ld hl,signon |
|||
call _strout |
|||
|
|||
ld c,' ' |
|||
call _cout |
|||
call _cout |
|||
call _cout |
|||
|
|||
|
|||
|
|||
; display x axis header 00-0F |
|||
|
|||
xor a |
|||
ld (x),a |
|||
ld b, 16 |
|||
lp1: ld c,' ' |
|||
call _cout |
|||
ld a,(x) |
|||
ld c,a |
|||
inc a |
|||
ld (x),a |
|||
call _hexout |
|||
djnz lp1 |
|||
call _eolout |
|||
|
|||
; start of line loop 00-07 |
|||
|
|||
xor a ; display |
|||
ld (y),a ; y-axis |
|||
ld (addr),a ; prefix |
|||
ld d,8 |
|||
lp3b: ld a,(y) |
|||
ld c,a |
|||
add a,10h |
|||
ld (y),a |
|||
call _hexout |
|||
ld c,':' |
|||
call _cout |
|||
|
|||
; set up x axis loop |
|||
|
|||
xor a |
|||
ld (x),a |
|||
ld e,16 |
|||
lp2b: push de |
|||
|
|||
ld c,' ' |
|||
call _cout |
|||
|
|||
; i2c challenge |
|||
; . issue device start command |
|||
; . write address to device |
|||
; . issue device stop command. |
|||
; . delay |
|||
; . display response |
|||
|
|||
; call _i2c_start |
|||
; ld a,(addr) |
|||
; ld c,a |
|||
; call _i2c_write |
|||
; ld (rc),a |
|||
; call _i2c_stop |
|||
|
|||
CALL PCF_WAIT_FOR_BB |
|||
JP NZ,PCF_BBERR |
|||
; |
|||
LD A,(addr) |
|||
OUT (PCF_RS0),A |
|||
CALL PCF_START ; GENERATE START CONDITION |
|||
; |
|||
ld bc,100 ; delay |
|||
lp6: nop |
|||
dec bc |
|||
ld a,c |
|||
or b |
|||
jr nz,lp6 |
|||
|
|||
CALL PCF_WAIT_FOR_ACK; AND ISSUE THE SLAVE ADDRESS |
|||
or a |
|||
jp nz,lp4f |
|||
|
|||
ld c,'-' ; display no |
|||
call _cout ; response |
|||
call _cout |
|||
jp lp5f |
|||
|
|||
lp4f: ld a,(addr) ; adjust address |
|||
ld c,a ; and display it |
|||
srl c |
|||
call _hexout |
|||
|
|||
lp5f: ld a,(addr) ; next address |
|||
add a,2 ; adjust for |
|||
ld (addr),a ; 7-bit |
|||
|
|||
CALL PCF_STOP |
|||
|
|||
pop de ; check if |
|||
dec e ; reached end |
|||
jp nz,lp2b ; of line |
|||
call _eolout |
|||
|
|||
dec d ; loop until |
|||
jp nz,lp3b ; all done |
|||
|
|||
jp 0 |
|||
|
|||
signon: .db "I2C Bus Scanner" |
|||
.db 13, 10, 13, 10, 0, "$" |
|||
|
|||
_strout: |
|||
st1: ld a,(hl) ; display |
|||
CP '$' ; zero |
|||
ret z ; terminated |
|||
ld c,a ; string |
|||
call _cout |
|||
inc hl |
|||
jp st1 |
|||
|
|||
_hexout: ; display |
|||
ld a,c ; A in hex |
|||
srl a |
|||
srl a |
|||
srl a |
|||
srl a |
|||
add a,30h |
|||
cp 3Ah |
|||
jp c,h1 |
|||
add a,7 |
|||
h1: ld h,a |
|||
ld a,c |
|||
and 0Fh |
|||
add a,30h |
|||
cp 3Ah |
|||
jp c,h2 |
|||
add a,7 |
|||
h2: ld l,a |
|||
ld c,h |
|||
call _cout |
|||
ld c,l |
|||
call _cout |
|||
ret |
|||
|
|||
_eolout: ; newline |
|||
ld c,13 |
|||
call _cout |
|||
ld c,10 |
|||
call _cout |
|||
ret |
|||
|
|||
_cout: ; character |
|||
push af ; output |
|||
push bc |
|||
push de |
|||
push hl |
|||
ld e,c |
|||
ld c,02h |
|||
call 5 |
|||
pop hl |
|||
pop de |
|||
pop bc |
|||
pop af |
|||
ret |
|||
|
|||
;----------------------------------------------------------------------------- |
|||
_i2c_start: |
|||
PCF_START: |
|||
LD A,PCF_START_ |
|||
OUT (PCF_RS1),A |
|||
RET |
|||
; |
|||
;_i2c_start: |
|||
ld a,_idle ; issue |
|||
out (_io),a ; start |
|||
; command |
|||
res _sda,a |
|||
out (_io),a |
|||
nop |
|||
nop |
|||
res _scl,a |
|||
out (_io),a |
|||
|
|||
ld (oprval),a |
|||
ret |
|||
|
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
; |
|||
; CONTROL REGISTER BITS |
|||
; |
|||
PCF_PIN .EQU 10000000B |
|||
PCF_ES0 .EQU 01000000B |
|||
PCF_ES1 .EQU 00100000B |
|||
PCF_ES2 .EQU 00010000B |
|||
PCF_EN1 .EQU 00001000B |
|||
PCF_STA .EQU 00000100B |
|||
PCF_STO .EQU 00000010B |
|||
PCF_ACK .EQU 00000001B |
|||
; |
|||
; STATUS REGISTER BITS |
|||
; |
|||
;PCF_PIN .EQU 10000000B |
|||
PCF_INI .EQU 01000000B ; 1 if not initialized |
|||
PCF_STS .EQU 00100000B |
|||
PCF_BER .EQU 00010000B |
|||
PCF_AD0 .EQU 00001000B |
|||
PCF_LRB .EQU 00001000B |
|||
PCF_AAS .EQU 00000100B |
|||
PCF_LAB .EQU 00000010B |
|||
PCF_BB .EQU 00000001B |
|||
; |
|||
PCF_START_ .EQU (PCF_PIN | PCF_ES0 | PCF_STA | PCF_ACK) |
|||
PCF_STOP_ .EQU (PCF_PIN | PCF_ES0 | PCF_STO | PCF_ACK) |
|||
; |
|||
; TIMEOUT AND DELAY VALUES (ARBITRARY) |
|||
; |
|||
PCF_PINTO .EQU 65000 |
|||
PCF_ACKTO .EQU 65000 |
|||
PCF_BBTO .EQU 65000 |
|||
PCF_LABDLY .EQU 65000 |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
; |
|||
; RETURN A=00/Z IF SUCCESSFULL |
|||
; RETURN A=FF/NZ IF TIMEOUT |
|||
; RETURN A=01/NZ IF LOST ARBITRATION |
|||
; PCF_STATUS HOLDS LAST PCF STATUS |
|||
; |
|||
PCF_WAIT_FOR_PIN: |
|||
PUSH HL |
|||
LD HL,PCF_PINTO ; SET TIMEOUT VALUE |
|||
|
|||
PCF_WFP0: |
|||
IN A,(PCF_RS1) ; GET BUS |
|||
LD (PCF_STATUS),A ; STATUS |
|||
LD B,A |
|||
|
|||
DEC HL ; HAVE WE |
|||
LD A,H ; TIMED OUT |
|||
OR L |
|||
JR Z,PCF_WFP1 ; YES WE HAVE, GO ACTION IT |
|||
|
|||
LD A,B ; |
|||
AND PCF_PIN ; IS TRANSMISSION COMPLETE? |
|||
JR NZ,PCF_WFP0 ; KEEP ASKING IF NOT OR |
|||
POP HL ; YES COMPLETE (PIN=0) RETURN WITH ZERO |
|||
RET |
|||
PCF_WFP1: |
|||
LD A,B ; DID WE LOSE ARBITRATION? |
|||
AND PCF_LAB ; IF A=0 THEN NO |
|||
CPL |
|||
JR NZ,PCF_WFP2 ; NO |
|||
CALL PCF_HANDLE_LAB ; YES GO HANDLE IT |
|||
LD (PCF_STATUS),A |
|||
XOR A ; RETURN NZ, A=01H |
|||
INC A |
|||
PCF_WFP2: |
|||
POP HL ; RET NZ, A=FF IF TIMEOUT |
|||
RET |
|||
; |
|||
PCF_STATUS .DB 00H |
|||
|
|||
;-------------------------------------------------------------------------------- |
|||
; |
|||
; RETURN NZ/FF IF TIMEOUT ERROR |
|||
; RETURN NZ/01 IF FAILED TO RECEIVE ACKNOWLEDGE |
|||
; RETURN Z/00 IF RECEIVED ACKNOWLEDGE |
|||
; |
|||
PCF_WAIT_FOR_ACK: |
|||
PUSH HL |
|||
LD HL,PCF_ACKTO |
|||
; |
|||
PCF_WFA0: |
|||
IN A,(PCF_RS1) ; READ PIN |
|||
LD (PCF_STATUS),A ; STATUS |
|||
LD B,A |
|||
; |
|||
DEC HL ; SEE IF WE HAVE TIMED |
|||
LD A,H ; OUT WAITING FOR PIN |
|||
OR L ; EXIT IF |
|||
JR Z,PCF_WFA1 ; WE HAVE |
|||
; |
|||
LD A,B ; OTHERWISE KEEP LOOPING |
|||
AND PCF_PIN ; UNTIL WE GET PIN |
|||
JR NZ,PCF_WFA0 ; OR TIMEOUT |
|||
; |
|||
LD A,B ; WE GOT PIN SO NOW |
|||
AND PCF_LRB ; CHECK WE HAVE |
|||
LD A,1 |
|||
JR Z,PCF_WFA2 ; RECEIVED ACKNOWLEDGE |
|||
XOR A |
|||
JR PCF_WFA2 |
|||
PCF_WFA1: |
|||
CPL ; TIMOUT ERROR |
|||
PCF_WFA2: |
|||
POP HL ; EXIT WITH NZ = FF |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
; |
|||
; POLL THE BUS BUSY BIT TO DETERMINE IF BUS IS FREE. |
|||
; RETURN WITH A=00H/Z STATUS IF BUS IS FREE |
|||
; RETURN WITH A=FFH/NZ STATUS IF BUS |
|||
; |
|||
; AFTER RESET THE BUS BUSY BIT WILL BE SET TO 1 I.E. NOT BUSY |
|||
; |
|||
PCF_WAIT_FOR_BB: |
|||
LD HL,PCF_BBTO |
|||
PCF_WFBB0: |
|||
IN A,(PCF_RS1) |
|||
AND PCF_BB |
|||
RET Z ; BUS IS FREE RETURN ZERO |
|||
DEC HL |
|||
LD A,H |
|||
OR L |
|||
JR NZ,PCF_WFBB0 ; REPEAT IF NOT TIMED OUT |
|||
CPL ; RET NZ IF TIMEOUT |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
PCF_HANDLE_LAB: |
|||
; |
|||
LD A,PCF_PIN |
|||
OUT (PCF_RS1),A |
|||
LD A,PCF_ES0 |
|||
OUT (PCF_RS1),A |
|||
; |
|||
LD HL,PCF_LABDLY |
|||
PCF_LABLP: |
|||
LD A,H |
|||
OR L |
|||
DEC HL |
|||
JR NZ,PCF_LABLP |
|||
; |
|||
IN A,(PCF_RS1) |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
; DISPLAY ERROR MESSAGES |
|||
; |
|||
PCF_RDERR: |
|||
PUSH HL |
|||
LD HL,PCF_RDFAIL |
|||
JR PCF_PRTERR |
|||
; |
|||
PCF_INIERR: |
|||
PUSH HL |
|||
LD HL,PCF_NOPCF |
|||
JR PCF_PRTERR |
|||
; |
|||
PCF_SETERR: |
|||
PUSH HL |
|||
LD HL,PCF_WRTFAIL |
|||
JR PCF_PRTERR |
|||
; |
|||
PCF_REGERR: |
|||
PUSH HL |
|||
LD HL,PCF_REGFAIL |
|||
JR PCF_PRTERR |
|||
; |
|||
PCF_CLKERR: |
|||
PUSH HL |
|||
LD HL,PCF_CLKFAIL |
|||
JR PCF_PRTERR |
|||
; |
|||
PCF_IDLERR: |
|||
PUSH HL |
|||
LD HL,PCF_IDLFAIL |
|||
JR PCF_PRTERR |
|||
; |
|||
PCF_ACKERR: |
|||
PUSH HL |
|||
LD HL,PCF_ACKFAIL |
|||
JR PCF_PRTERR |
|||
; |
|||
PCF_RDBERR: |
|||
PUSH HL |
|||
LD HL,PCF_RDBFAIL |
|||
JR PCF_PRTERR |
|||
; |
|||
PCF_TOERR: |
|||
PUSH HL |
|||
LD HL,PCF_TOFAIL |
|||
JR PCF_PRTERR |
|||
; |
|||
PCF_ARBERR: |
|||
PUSH HL |
|||
LD HL,PCF_ARBFAIL |
|||
JR PCF_PRTERR |
|||
; |
|||
PCF_PINERR: |
|||
PUSH HL |
|||
LD HL,PCF_PINFAIL |
|||
JR PCF_PRTERR |
|||
; |
|||
PCF_BBERR: |
|||
PUSH HL |
|||
LD HL,PCF_BBFAIL |
|||
JR PCF_PRTERR |
|||
; |
|||
PCF_PRTERR: |
|||
CALL _strout |
|||
CALL _eolout |
|||
POP HL |
|||
RET |
|||
; |
|||
; |
|||
PCF_NOPCF .DB "NO DEVICE FOUND$" |
|||
PCF_WRTFAIL .DB "SETTING DEVICE ID FAILED$" |
|||
PCF_REGFAIL .DB "CLOCK REGISTER SELECT ERROR$" |
|||
PCF_CLKFAIL .DB "CLOCK SET FAIL$" |
|||
PCF_IDLFAIL .DB "BUS IDLE FAILED$" |
|||
PCF_ACKFAIL .DB "FAILED TO RECEIVE ACKNOWLEDGE$" |
|||
PCF_RDFAIL .DB "READ FAILED$" |
|||
PCF_RDBFAIL .DB "READBYTES FAILED$" |
|||
PCF_TOFAIL .DB "TIMEOUT ERROR$" |
|||
PCF_ARBFAIL .DB "LOST ARBITRATION$" |
|||
PCF_PINFAIL .DB "PIN FAIL$" |
|||
PCF_BBFAIL .DB "BUS BUSY$" |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
_i2c_stop: |
|||
PCF_STOP: |
|||
LD A,PCF_STOP_ ; issue |
|||
OUT (PCF_RS1),A ; stop |
|||
RET ; command |
|||
|
|||
;_i2c_stop: |
|||
ld a,(oprval) |
|||
res _scl,a |
|||
res _sda,a |
|||
out (_io),a |
|||
|
|||
set _scl,a |
|||
out (_io),a |
|||
nop |
|||
nop |
|||
set _sda,a |
|||
out (_io),a |
|||
|
|||
ld (oprval),a |
|||
ret |
|||
|
|||
_i2c_write: ; write |
|||
ld a,(oprval) ; to i2c |
|||
; bus |
|||
ld b,8 |
|||
i2c1: res _sda,a |
|||
rl c |
|||
jr nc,i2c2 |
|||
set _sda,a |
|||
i2c2: out (_io),a |
|||
set _scl,a |
|||
out (_io),a |
|||
|
|||
; COND SC126=0 |
|||
; ld d,a |
|||
;i2c3: in a,(_io) |
|||
; bit _scl,a |
|||
; jr z,i2c3 |
|||
; ld a,d |
|||
; ENDC |
|||
|
|||
res _scl,a |
|||
out (_io),a |
|||
djnz i2c1 |
|||
|
|||
set _sda,a |
|||
out (_io),a |
|||
set _scl,a |
|||
out (_io),a |
|||
|
|||
ld d,a |
|||
i2c4: in a,(_io) |
|||
; COND SC126=0 |
|||
; bit _scl,a |
|||
; jr z,4b |
|||
; ENDC |
|||
ld c,a |
|||
ld a,d |
|||
|
|||
res _scl,a |
|||
out (_io),a |
|||
ld (oprval),a |
|||
|
|||
xor a |
|||
bit _sda,c |
|||
ret z |
|||
inc a |
|||
|
|||
ret |
|||
|
|||
|
|||
oprval: .db 0 |
|||
x: .db 0 |
|||
y: .db 0 |
|||
addr: .db 0 |
|||
rc: .db 0 |
|||
|
|||
.fill 128 |
|||
stack: |
|||
.end |
|||
@ -0,0 +1,12 @@ |
|||
OBJECTS = I2CSCAN.COM |
|||
DEST = ../../../Binary/Apps |
|||
TOOLS = ../../../Tools |
|||
|
|||
include $(TOOLS)/Makefile.inc |
|||
|
|||
DEPS := I2CSCAN.ASM $(shell find . -name '*.inc') |
|||
|
|||
I2CSCAN.COM: $(DEPS) |
|||
$(TASM) -dWBW I2CSCAN.ASM I2CSCAN.COM I2CSCAN.LST |
|||
|
|||
|
|||
Loading…
Reference in new issue