You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CubeSatSim/libs/libmf/source/dbglink.c

964 lines
15 KiB

#include "ax8052.h"
#include "libmfdbglink.h"
static volatile uint8_t __data dbglink_fiforxwr;
static volatile uint8_t __data dbglink_fiforxrd;
static volatile uint8_t __data dbglink_fifotxwr;
static volatile uint8_t __data dbglink_fifotxrd;
extern uint8_t __xdata dbglink_rxbuffer[];
extern uint8_t __xdata dbglink_txbuffer[];
#if !defined(SDCC)
extern const uint8_t __code dbglink_rxbuffer_size[];
extern const uint8_t __code dbglink_txbuffer_size[];
#endif
#if defined(SDCC)
static void dummy0(void) __naked
{
__asm;
.area HOME (CODE)
.area DBGLINK0 (CODE)
.area DBGLINK1 (CODE)
.area DBGLINK2 (CODE)
.area DBGLINK3 (CODE)
.area DBGLINK4 (CODE)
.area DBGLINK5 (CODE)
.area HOME (CODE)
__endasm;
}
static __reentrantb void dbglink_iocore(void) __reentrant __naked;
void dbglink_irq(void) __interrupt(21) __naked
{
__asm;
push acc
push psw
push _DPS
push dpl
push dph
push b
mov _DPS,#0
mov psw,#0
lcall _dbglink_iocore
pop b
pop dph
pop dpl
pop _DPS
pop psw
pop acc
reti
__endasm;
}
uint8_t dbglink_poll(void) __reentrant __naked
{
__asm;
mov a,#0x80
anl a,_IE
rl a
mov b,a
clr _EA
lcall _dbglink_iocore
mov a,b
clr c
rrc a
mov _EA,c
mov dpl,a
ret
.area HOME (CODE)
.area DBGLINK0 (CODE)
.area DBGLINK1 (CODE)
.area DBGLINK2 (CODE)
.area DBGLINK3 (CODE)
.area DBGLINK4 (CODE)
.area DBGLINK5 (CODE)
.area DBGLINK0 (CODE)
__endasm;
}
static __reentrantb void dbglink_iocore(void) __reentrant __naked
{
__asm;
ar2=0x02
ar3=0x03
ar4=0x04
ar5=0x05
ar6=0x06
ar7=0x07
ar0=0x00
ar1=0x01
mov a,_DBGLNKSTAT
jnb acc.0,iocnorx
mov dptr,#_dbglink_rxbuffer
mov a,_dbglink_fiforxwr
add a,dpl
mov dpl,a
clr a
addc a,dph
mov dph,a
mov a,#_dbglink_buffer_negsize+3-00010$
movc a,@a+pc
00010$: add a,_dbglink_fiforxwr
jc 00001$
mov a,_dbglink_fiforxwr
inc a
00001$: cjne a,_dbglink_fiforxrd,00000$
anl _DBGLNKSTAT,#~0x40
sjmp iocnorx
00000$: mov _dbglink_fiforxwr,a
mov a,_DBGLNKBUF
movx @dptr,a
orl _DBGLNKSTAT,#0x40
setb _B_1
iocnorx:
mov a,_DBGLNKSTAT
jnb acc.2,iocnotx
mov a,_dbglink_fifotxrd
cjne a,_dbglink_fifotxwr,00000$
anl _DBGLNKSTAT,#~0x80
sjmp iocnotx
00000$: mov dptr,#_dbglink_txbuffer
add a,dpl
mov dpl,a
clr a
addc a,dph
mov dph,a
movx a,@dptr
mov _DBGLNKBUF,a
mov a,#_dbglink_buffer_negsize+1-00010$
movc a,@a+pc
00010$: add a,_dbglink_fifotxrd
jc 00001$
mov a,_dbglink_fifotxrd
inc a
00001$: mov _dbglink_fifotxrd,a
orl _DBGLNKSTAT,#0x80
setb _B_2
iocnotx:
ret
__endasm;
}
void dbglink_rxadvance(uint8_t idx) __reentrant __naked
{
idx;
__asm;
mov a,#_dbglink_buffer_negsize+2-00003$
movc a,@a+pc
00003$: xch a,dpl
jz 00000$
add a,_dbglink_fiforxrd
jnc 00002$
add a,dpl
sjmp 00001$
00002$: xch a,dpl
add a,dpl
jc 00001$
mov a,dpl
00001$: mov _dbglink_fiforxrd,a
orl _DBGLNKSTAT,#0x40
00000$: ret
__endasm;
}
void dbglink_txadvance(uint8_t idx) __reentrant __naked
{
idx;
__asm;
mov a,#_dbglink_buffer_negsize-00003$
movc a,@a+pc
00003$: xch a,dpl
jz 00000$
add a,_dbglink_fifotxwr
jnc 00002$
add a,dpl
sjmp 00001$
00002$: xch a,dpl
add a,dpl
jc 00001$
mov a,dpl
00001$: mov _dbglink_fifotxwr,a
orl _DBGLNKSTAT,#0x80
00000$: ret
__endasm;
}
__reentrantb const uint8_t __xdata *dbglink_rxbufptr(uint8_t idx) __reentrant __naked
{
idx;
__asm;
mov a,#_dbglink_buffer_negsize+2-00003$
movc a,@a+pc
00003$: xch a,dpl
add a,_dbglink_fiforxrd
jnc 00002$
add a,dpl
sjmp 00001$
00002$: xch a,dpl
add a,dpl
jc 00001$
mov a,dpl
00001$: mov dptr,#_dbglink_rxbuffer
add a,dpl
mov dpl,a
clr a
addc a,dph
mov dph,a
ret
__endasm;
}
__reentrantb uint8_t __xdata *dbglink_txbufptr(uint8_t idx) __reentrant __naked
{
idx;
__asm;
mov a,#_dbglink_buffer_negsize-00003$
movc a,@a+pc
00003$: xch a,dpl
add a,_dbglink_fifotxwr
jnc 00002$
add a,dpl
sjmp 00001$
00002$: xch a,dpl
add a,dpl
jc 00001$
mov a,dpl
00001$: mov dptr,#_dbglink_txbuffer
add a,dpl
mov dpl,a
clr a
addc a,dph
mov dph,a
ret
_dbglink_buffer_negsize:
.area DBGLINK3 (CODE)
__endasm;
}
uint8_t dbglink_txfreelinear(void) __reentrant __naked
{
__asm;
mov a,_dbglink_fifotxrd
setb c
subb a,_dbglink_fifotxwr
jnc 00000$
mov a,_dbglink_fifotxrd
add a,#0xff
cpl c
mov a,#_dbglink_buffer_size-00001$
movc a,@a+pc
00001$: subb a,_dbglink_fifotxwr
00000$: mov dpl,a
ret
__endasm;
}
uint8_t dbglink_txfree(void) __reentrant __naked
{
__asm;
mov a,_dbglink_fifotxrd
setb c
subb a,_dbglink_fifotxwr
mov dpl,a
jnc 00000$
mov a,#_dbglink_buffer_size-00001$
movc a,@a+pc
00001$: add a,dpl
mov dpl,a
00000$: ret
__endasm;
}
uint8_t dbglink_rxcountlinear(void) __reentrant __naked
{
__asm;
mov a,_dbglink_fiforxwr
clr c
subb a,_dbglink_fiforxrd
jnc 00000$
mov a,#_dbglink_buffer_size+1-00001$
movc a,@a+pc
00001$: clr c
subb a,_dbglink_fiforxrd
00000$: mov dpl,a
ret
__endasm;
}
uint8_t dbglink_rxcount(void) __reentrant __naked
{
__asm;
mov a,_dbglink_fiforxwr
clr c
subb a,_dbglink_fiforxrd
mov dpl,a
jnc 00000$
mov a,#_dbglink_buffer_size+1-00001$
movc a,@a+pc
00001$: add a,dpl
mov dpl,a
00000$: ret
__endasm;
}
uint8_t dbglink_txbuffersize(void) __reentrant __naked
{
__asm;
mov a,#_dbglink_buffer_size-00000$
movc a,@a+pc
00000$: dec a
mov dpl,a
ret
__endasm;
}
uint8_t dbglink_rxbuffersize(void) __reentrant __naked
{
__asm;
mov a,#_dbglink_buffer_size+1-00000$
movc a,@a+pc
00000$: dec a
mov dpl,a
ret
_dbglink_buffer_size:
.area CSEG (CODE)
__endasm;
}
uint8_t dbglink_rxpeek(uint8_t idx) __reentrant __naked
{
idx;
__asm;
lcall _dbglink_rxbufptr
movx a,@dptr
mov dpl,a
ret
__endasm;
}
void dbglink_txpoke(uint8_t idx, uint8_t ch) __reentrant __naked
{
idx;
ch;
__asm;
push ar0
mov a,sp
add a,#-3
mov r0,a
_dbglink_txpoke_hexentry:
lcall _dbglink_txbufptr
mov a,@r0
movx @dptr,a
pop ar0
ret
__endasm;
}
void dbglink_txpokehex(uint8_t idx, uint8_t ch) __reentrant __naked
{
idx;
ch;
__asm;
push ar0
mov a,sp
add a,#-3
mov r0,a
mov a,@r0
anl a,#0x0F
add a,#256-10
jnc 00000$
add a,#'A-'9-1
00000$: add a,#10+'0 ; '
mov @r0,a
ljmp _dbglink_txpoke_hexentry
__endasm;
}
uint8_t dbglink_txidle(void) __reentrant __naked
{
__asm;
mov a,_DBGLNKSTAT
anl a,#0x84
cjne a,#0x04,00000$
mov dpl,#1
ret
00000$:
mov dpl,#0
ret
__endasm;
}
static void wtimer_cansleep_dummy(void) __naked
{
__asm
.area HOME (CODE)
.area WTCANSLP0 (CODE)
.area WTCANSLP1 (CODE)
.area WTCANSLP2 (CODE)
.area WTCANSLP1 (CODE)
lcall _dbglink_txidle
mov a,dpl
jnz 00000$
ret
00000$:
.area CSEG (CODE)
__endasm;
}
#elif defined __CX51__ || defined __C51__
static __reentrantb void dbglink_iocore(void) __reentrant __naked;
void dbglink_irq(void) interrupt 21
{
#pragma asm
push acc
push psw
push DPS
push dpl
push dph
push b
mov DPS,#0
mov psw,#0
lcall _dbglink_iocore
pop b
pop dph
pop dpl
pop DPS
pop psw
pop acc
#pragma endasm
}
uint8_t dbglink_poll(void) __reentrant
{
#pragma asm
mov a,#0x80
anl a,IE
rl a
mov b,a
clr EA
lcall _dbglink_iocore
mov a,b
clr c
rrc a
mov EA,c
mov r7,a
#pragma endasm
}
static __reentrantb void dbglink_iocore(void) __reentrant __naked
{
dbglink_rxbuffer[0];
dbglink_rxbuffer_size[0];
dbglink_txbuffer[0];
dbglink_txbuffer_size[0];
#pragma asm
;ar2 equ 0x02
;ar3 equ 0x03
;ar4 equ 0x04
;ar5 equ 0x05
;ar6 equ 0x06
;ar7 equ 0x07
;ar0 equ 0x00
;ar1 equ 0x01
_dbglink_iocore:
mov a,DBGLNKSTAT
jnb acc.0,iocnorx
clr a
mov dptr,#dbglink_rxbuffer_size+2
movc a,@a+dptr
push acc
mov dptr,#dbglink_rxbuffer
mov a,dbglink_fiforxwr
add a,dpl
mov dpl,a
clr a
addc a,dph
mov dph,a
pop acc
add a,dbglink_fiforxwr
jc ioc1
mov a,dbglink_fiforxwr
inc a
ioc1: cjne a,dbglink_fiforxrd,ioc0
anl DBGLNKSTAT,#~0x40
sjmp iocnorx
ioc0: mov dbglink_fiforxwr,a
mov a,DBGLNKBUF
movx @dptr,a
orl DBGLNKSTAT,#0x40
setb B_1
iocnorx:
mov a,DBGLNKSTAT
jnb acc.2,iocnotx
mov a,dbglink_fifotxrd
cjne a,dbglink_fifotxwr,ioc2
anl DBGLNKSTAT,#~0x80
sjmp iocnotx
ioc2: mov dptr,#dbglink_txbuffer
add a,dpl
mov dpl,a
clr a
addc a,dph
mov dph,a
movx a,@dptr
mov DBGLNKBUF,a
clr a
mov dptr,#dbglink_txbuffer_size+2
movc a,@a+dptr
add a,dbglink_fifotxrd
jc ioc3
mov a,dbglink_fifotxrd
inc a
ioc3: mov dbglink_fifotxrd,a
orl DBGLNKSTAT,#0x80
setb B_2
iocnotx:
#pragma endasm
}
__reentrantb void dbglink_rxadvance(uint8_t idx) __reentrant
{
idx;
#pragma asm
clr a
mov dptr,#dbglink_rxbuffer_size+1
movc a,@a+dptr
xch a,r7
jz rxad0
add a,dbglink_fiforxrd
jnc rxad2
add a,r7
sjmp rxad1
rxad2: xch a,r7
add a,r7
jc rxad1
mov a,r7
rxad1: mov dbglink_fiforxrd,a
orl DBGLNKSTAT,#0x40
rxad0:
#pragma endasm
}
__reentrantb void dbglink_txadvance(uint8_t idx) __reentrant
{
idx;
#pragma asm
clr a
mov dptr,#dbglink_txbuffer_size+1
movc a,@a+dptr
xch a,r7
jz txad0
add a,dbglink_fifotxwr
jnc txad2
add a,r7
sjmp txad1
txad2: xch a,r7
add a,r7
jc txad1
mov a,r7
txad1: mov dbglink_fifotxwr,a
orl DBGLNKSTAT,#0x80
txad0:
#pragma endasm
}
__reentrantb const uint8_t __xdata *dbglink_rxbufptr(uint8_t idx) __reentrant
{
idx;
#pragma asm
_dbglink_rxbufptr:
clr a
mov dptr,#dbglink_rxbuffer_size+1
movc a,@a+dptr
xch a,r7
add a,dbglink_fiforxrd
jnc rxp2
add a,r7
sjmp rxp1
rxp2: xch a,r7
add a,r7
jc rxp1
mov a,r7
rxp1: mov dptr,#dbglink_rxbuffer
add a,dpl
mov r7,a
clr a
addc a,dph
mov r6,a
#pragma endasm
}
__reentrantb uint8_t __xdata *dbglink_txbufptr(uint8_t idx) __reentrant
{
idx;
#pragma asm
_dbglink_txbufptr:
clr a
mov dptr,#dbglink_txbuffer_size+1
movc a,@a+dptr
xch a,r7
add a,dbglink_fifotxwr
jnc txp2
add a,r7
sjmp txp1
txp2: xch a,r7
add a,r7
jc txp1
mov a,r7
txp1: mov dptr,#dbglink_txbuffer
add a,dpl
mov r7,a
clr a
addc a,dph
mov r6,a
#pragma endasm
}
__reentrantb uint8_t dbglink_txfreelinear(void) __reentrant
{
#pragma asm
mov a,dbglink_fifotxrd
setb c
subb a,dbglink_fifotxwr
jnc txfrl0
mov a,dbglink_fifotxrd
add a,#0xff
cpl c
clr a
mov dptr,#dbglink_txbuffer_size
movc a,@a+dptr
subb a,dbglink_fifotxwr
txfrl0: mov r7,a
#pragma endasm
}
__reentrantb uint8_t dbglink_txfree(void) __reentrant
{
#pragma asm
mov a,dbglink_fifotxrd
setb c
subb a,dbglink_fifotxwr
mov r7,a
jnc txfr0
clr a
mov dptr,#dbglink_txbuffer_size
movc a,@a+dptr
add a,r7
mov r7,a
txfr0:
#pragma endasm
}
__reentrantb uint8_t dbglink_rxcountlinear(void) __reentrant
{
#pragma asm
mov a,dbglink_fiforxwr
clr c
subb a,dbglink_fiforxrd
mov r7,a
jnc rxcl0
clr a
mov dptr,#dbglink_rxbuffer_size
movc a,@a+dptr
add a,r7
rxcl0: mov r7,a
#pragma endasm
}
__reentrantb uint8_t dbglink_rxcount(void) __reentrant
{
#pragma asm
mov a,dbglink_fiforxwr
clr c
subb a,dbglink_fiforxrd
mov r7,a
jnc rxc0
clr a
mov dptr,#dbglink_rxbuffer_size
movc a,@a+dptr
add a,r7
mov r7,a
rxc0:
#pragma endasm
}
__reentrantb uint8_t dbglink_txbuffersize(void) __reentrant
{
return dbglink_txbuffer_size[0]-1;
}
__reentrantb uint8_t dbglink_rxbuffersize(void) __reentrant
{
return dbglink_rxbuffer_size[0]-1;
}
__reentrantb uint8_t dbglink_rxpeek(uint8_t idx) __reentrant
{
idx;
#pragma asm
lcall _dbglink_rxbufptr
mov dpl,r7
mov dph,r6
movx a,@dptr
mov r7,a
#pragma endasm
}
__reentrantb void dbglink_txpoke(uint8_t idx, uint8_t ch) __reentrant
{
idx;
ch;
#pragma asm
_dbglink_txpokehex_entry:
lcall _dbglink_txbufptr
mov dpl,r7
mov dph,r6
mov a,r5
movx @dptr,a
#pragma endasm
}
__reentrantb void dbglink_txpokehex(uint8_t idx, uint8_t ch) __reentrant
{
idx;
ch;
#pragma asm
mov a,r5
anl a,#0x0F
add a,#256-10
jnc txph0
add a,#'A'-'9'-1
txph0: add a,#10+'0'
mov r5,a
ljmp _dbglink_txpokehex_entry
#pragma endasm
}
__reentrantb uint8_t dbglink_txidle(void) __reentrant
{
#pragma asm
mov a,DBGLNKSTAT
anl a,#0x84
mov r7,#0
cjne a,#0x04,txnotidle
mov r7,#1
txnotidle:
#pragma endasm
}
#elif defined __ICC8051__
static __reentrantb uint8_t dbglink_iocore(void) __reentrant;
#pragma vector=0xab
__interrupt void dbglink_irq(void)
{
uint8_t __autodata dpssave = DPS;
DPS = 0;
dbglink_iocore();
DPS = dpssave;
}
__reentrantb uint8_t dbglink_poll(void) __reentrant
{
uint8_t flg;
uint8_t irq = IE & 0x80;
EA = 0;
flg = dbglink_iocore();
IE |= irq;
return flg;
}
static __reentrantb uint8_t dbglink_iocore(void) __reentrant
{
uint8_t flg = 0;
if (DBGLNKSTAT & 0x01) {
uint8_t wp = dbglink_fiforxwr + 1;
uint8_t sz = dbglink_rxbuffer_size[0];
if (wp >= sz)
wp -= sz;
if (wp != dbglink_fiforxrd) {
dbglink_rxbuffer[dbglink_fiforxwr] = DBGLNKBUF;
dbglink_fiforxwr = wp;
DBGLNKSTAT |= 0x40;
flg |= 1;
} else {
DBGLNKSTAT &= (uint8_t)~0x40;
}
}
if (DBGLNKSTAT & 0x04) {
if (dbglink_fifotxrd != dbglink_fifotxwr) {
uint8_t rp = dbglink_fifotxrd + 1;
uint8_t sz = dbglink_txbuffer_size[0];
DBGLNKBUF = dbglink_txbuffer[dbglink_fifotxrd];
if (rp >= sz)
rp -= sz;
dbglink_fifotxrd = rp;
DBGLNKSTAT |= 0x80;
flg |= 2;
} else {
DBGLNKSTAT &= (uint8_t)~0x80;
}
}
return flg;
}
__reentrantb void dbglink_rxadvance(uint8_t idx) __reentrant
{
uint8_t rd;
uint8_t sz;
if (!idx)
return;
rd = dbglink_fiforxrd;
idx += rd;
sz = dbglink_rxbuffer_size[0];
if (idx < rd || idx >= sz)
idx -= sz;
dbglink_fiforxrd = idx;
DBGLNKSTAT |= 0x40;
}
__reentrantb void dbglink_txadvance(uint8_t idx) __reentrant
{
uint8_t wr;
uint8_t sz;
if (!idx)
return;
wr = dbglink_fifotxwr;
idx += wr;
sz = dbglink_txbuffer_size[0];
if (idx < wr || idx >= sz)
idx -= sz;
dbglink_fifotxwr = idx;
DBGLNKSTAT |= 0x80;
}
__reentrantb const uint8_t __xdata *dbglink_rxbufptr(uint8_t idx) __reentrant
{
uint8_t rd = dbglink_fiforxrd;
uint8_t sz = dbglink_rxbuffer_size[0];
idx += rd;
if (idx < rd || idx >= sz)
idx -= sz;
return &dbglink_rxbuffer[idx];
}
__reentrantb uint8_t __xdata *dbglink_txbufptr(uint8_t idx) __reentrant
{
uint8_t wr = dbglink_fifotxwr;
uint8_t sz = dbglink_txbuffer_size[0];
idx += wr;
if (idx < wr || idx >= sz)
idx -= sz;
return &dbglink_txbuffer[idx];
}
__reentrantb uint8_t dbglink_txfreelinear(void) __reentrant
{
uint8_t rd = dbglink_fifotxrd;
uint8_t wr = dbglink_fifotxwr;
if (rd <= wr) {
uint8_t r = dbglink_txbuffer_size[0] - wr;
if (!rd)
--r;
return r;
}
return rd - wr - 1;
}
__reentrantb uint8_t dbglink_txfree(void) __reentrant
{
uint8_t rd = dbglink_fifotxrd;
uint8_t wr = dbglink_fifotxwr;
uint8_t r = rd - wr;
if (rd <= wr)
r += dbglink_txbuffer_size[0];
--r;
return r;
}
__reentrantb uint8_t dbglink_rxcountlinear(void) __reentrant
{
uint8_t rd = dbglink_fiforxrd;
uint8_t wr = dbglink_fiforxwr;
if (wr < rd)
return dbglink_rxbuffer_size[0] - rd;
return wr - rd;
}
__reentrantb uint8_t dbglink_rxcount(void) __reentrant
{
uint8_t rd = dbglink_fiforxrd;
uint8_t wr = dbglink_fiforxwr;
uint8_t r = wr - rd;
if (wr < rd)
r += dbglink_rxbuffer_size[0];
return r;
}
__reentrantb uint8_t dbglink_txbuffersize(void) __reentrant
{
return dbglink_txbuffer_size[0]-1;
}
__reentrantb uint8_t dbglink_rxbuffersize(void) __reentrant
{
return dbglink_rxbuffer_size[0]-1;
}
__reentrantb uint8_t dbglink_rxpeek(uint8_t idx) __reentrant
{
const uint8_t __xdata *bp = dbglink_rxbufptr(idx);
return *bp;
}
__reentrantb void dbglink_txpoke(uint8_t idx, uint8_t ch) __reentrant
{
uint8_t __xdata *bp = dbglink_txbufptr(idx);
*bp = ch;
}
__reentrantb void dbglink_txpokehex(uint8_t idx, uint8_t ch) __reentrant
{
ch &= 0x0F;
if (ch >= 10)
ch += 'A' - '9' - 1;
ch += '0';
dbglink_txpoke(idx, ch);
}
__reentrantb uint8_t dbglink_txidle(void) __reentrant
{
if ((DBGLNKSTAT & 0x84) == 0x04)
return 1;
return 0;
}
#else
#error "Compiler unsupported"
#endif
__reentrantb void dbglink_init(void) __reentrant
{
dbglink_fiforxwr = dbglink_fiforxrd = dbglink_fifotxwr = dbglink_fifotxrd = 0;
DBGLNKSTAT = 0x40;
E2IE |= 0x40;
}

Powered by TurnKey Linux.