/*pragma LESS_PEDANTIC*/
-#define UL_PTR_DATA 0
-#define UL_PTR_XDATA 1
-#define UL_PTR_CODE 2
+#define SDCC_PTR_DATA 0x40
+#define SDCC_PTR_XDATA 0x00
+#define SDCC_PTR_CODE 0x80
+
+#define KEIL_PTR_DATA 0x00
+#define KEIL_PTR_XDATA 0x01
+#define KEIL_PTR_CODE 0x02
#ifdef SDCC
#ifndef SDCC_MODEL_LARGE
#ifdef SDCC
#ifndef SDCC_MODEL_LARGE
/* ul_read function for small model */
-ul_ssize_t __ul_read(void UL_ARGPTRTYPE *buffer, ul_size_t size) UL_FNC_NAKED
+ul_ssize_t __ul_read(void *buffer, ul_size_t size) UL_FNC_NAKED
{
ul_c2a_len=size;
_asm
mov r4,_ul_c2a_len
mov r5,_ul_c2a_len+1
clr f0
+ jb b.6,00001$ /*SDCC_PTR_DATA*/
lcall ul_rd
- jb f0,00002$
+ sjmp 00002$
+00001$: lcall ul_rdi
+00002$: jb f0,00004$
mov dpl,_ul_c2a_len
mov dph,_ul_c2a_len+1
-00001$:
+00003$:
#ifdef UL_WITH_NAKED
ret
#else /*UL_WITH_NAKED*/
- sjmp 00003$
+ sjmp 00005$
#endif /*UL_WITH_NAKED*/
-00002$:
+00004$:
clr c
mov a,_ul_c2a_len
subb a,r4
mov a,_ul_c2a_len+1
subb a,r5
mov dph,a
+ #if 0
orl a,dpl
- jnz 00001$
+ jnz 00003$
mov dptr,#0xffff
+ #endif
#ifdef UL_WITH_NAKED
ret
#endif /*UL_WITH_NAKED*/
-00003$:
+00005$:
_endasm;
}
#else /* SDCC_MODEL_LARGE */
* size Allocated to stack - offset -4 (the push _bp taken into account)
* buffer Allocated to registers
*/
-ul_ssize_t __ul_read(void UL_ARGPTRTYPE *buffer, ul_size_t size) reentrant UL_FNC_NAKED
+ul_ssize_t __ul_read(void *buffer, ul_size_t size) reentrant UL_FNC_NAKED
{
_asm
.globl ul_rd
mov a,@r0
mov r5,a
mov r7,a
+ jb b.6,00001$ /*SDCC_PTR_DATA*/
lcall ul_rd
- jb f0,00002$
+ sjmp 00002$
+00001$: lcall ul_rdi
+00002$: jb f0,00004$
mov dpl,r6
mov dph,r7
-00001$:
+00003$:
#ifdef UL_WITH_NAKED
ret
#else /*UL_WITH_NAKED*/
- sjmp 00003$
+ sjmp 00005$
#endif /*UL_WITH_NAKED*/
-00002$:
+00004$:
clr c
mov a,r6
subb a,r4
mov a,r7
subb a,r5
mov dph,a
+ #if 0
orl a,dpl
- jnz 00001$
+ jnz 00003$
mov dptr,#0xffff
+ #endif
#ifdef UL_WITH_NAKED
ret
#endif /*UL_WITH_NAKED*/
-00003$:
+00005$:
_endasm;
}
#endif /* SDCC_MODEL_LARGE */
#else /* SDCC */
#pragma asm
-;ul_ssize_t __ul_read(void UL_ARGPTRTYPE *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT
+;ul_ssize_t __ul_read(void *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT
;{
extrn code(UL_RD)
public ___ul_read
___ul_read:
- mov dpl,r7 ; buffer address into DPTR
- mov dph,r6
- mov a,r4 ; number of bytes to read
+ mov dpl,r1 ; buffer address into DPTR
+ mov dph,r2
+ mov a,r4 ; number of bytes to write
mov r6,a
xch a,r5 ; into R45 little endian
mov r4,a
mov r7,a
- clr f0 ; call read => R45 number of remaining
- call UL_RD ; bytes, DPTR moved after read data
- jnb f0,__ul_read_l1
+ clr f0
+ mov a,R3
+ cjne A,#KEIL_PTR_XDATA,__ul_write_l1
+ call UL_RD ; call read => R45 number of remaining
+ sjmp __ul_read_l2 ; bytes, DPTR moved after read data
+__ul_read_l1:
+ call UL_RDi
+__ul_read_l2:
+ jnb f0,__ul_read_l3
clr c
mov a,r7
subb a,r4
mov a,r6 ; compute number of read bytes => R76
subb a,r5
mov r6,a
+ #if 0
orl a,r7
- jnz __ul_read_l1
+ jnz __ul_read_l3
dec r6 ; return -1 if no byte read
dec r7
-__ul_read_l1:
+ #endif
+__ul_read_l3:
ret
;}
#pragma endasm
#ifdef SDCC
#ifndef SDCC_MODEL_LARGE
/* ul_write function for small model */
-ul_ssize_t __ul_write(const void UL_ARGPTRTYPE *buffer, ul_size_t size) UL_FNC_NAKED
+ul_ssize_t __ul_write(const void *buffer, ul_size_t size) UL_FNC_NAKED
{
ul_c2a_len=size;
_asm
.globl ul_wr
+ .globl ul_wrc
+ .globl ul_wri
mov r4,_ul_c2a_len
mov r5,_ul_c2a_len+1
clr f0
+ jnb b.6,00001$ /*SDCC_PTR_DATA*/
+ lcall ul_wri
+ sjmp 00003$
+00001$:
+ jnb b.7,00002$ /*SDCC_PTR_CODE*/
+ lcall ul_wrc
+ sjmp 00003$
+00002$:
lcall ul_wr
- jb f0,00002$
+00003$:
+ jb f0,00004$
mov dpl,_ul_c2a_len
mov dph,_ul_c2a_len+1
#ifdef UL_WITH_NAKED
ret
#else /*UL_WITH_NAKED*/
- sjmp 00003$
+ sjmp 00005$
#endif /*UL_WITH_NAKED*/
-00002$:
+00004$:
mov dptr,#0xffff
#ifdef UL_WITH_NAKED
ret
#endif /*UL_WITH_NAKED*/
-00003$:
+00005$:
_endasm;
}
#else /* SDCC_MODEL_LARGE */
/* For large model
* size Allocated to stack - offset -4 (the push _bp taken into account)
- * buffer Allocated to registers
+ * buffer Allocated to registers
*/
-ul_ssize_t __ul_write(const void UL_ARGPTRTYPE *buffer, ul_size_t size) reentrant UL_FNC_NAKED
+ul_ssize_t __ul_write(const void *buffer, ul_size_t size) reentrant UL_FNC_NAKED
{
_asm
.globl ul_wr
+ .globl ul_wrc
+ .globl ul_wri
mov a,sp
clr f0
mov a,sp
mov a,@r0
mov r5,a
mov r7,a
+ jnb b.6,00001$ /*SDCC_PTR_DATA*/
+ lcall ul_wri
+ sjmp 00003$
+00001$:
+ jnb b.7,00002$ /*SDCC_PTR_CODE*/
+ lcall ul_wrc
+ sjmp 00003$
+00002$:
lcall ul_wr
- jb f0,00002$
+00003$:
+ jb f0,00004$
mov dpl,r6
mov dph,r7
#ifdef UL_WITH_NAKED
ret
#else /*UL_WITH_NAKED*/
- sjmp 00003$
+ sjmp 00005$
#endif /*UL_WITH_NAKED*/
-00002$:
+00004$:
mov dptr,#0xffff
#ifdef UL_WITH_NAKED
ret
#endif /*UL_WITH_NAKED*/
-00003$:
+00005$:
_endasm;
}
#endif /* SDCC_MODEL_LARGE */
#else /* SDCC */
#pragma asm
-;ul_ssize_t __ul_write(const void UL_ARGPTRTYPE *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT
+;ul_ssize_t __ul_write(const void *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT
;{
- extrn code(UL_WR)
+ extrn code(UL_WR,UL_WRC,UL_WRI)
public ___ul_write
___ul_write:
- mov dpl,r7 ; buffer address into DPTR
- mov dph,r6
+ mov dpl,r1 ; buffer address into DPTR
+ mov dph,r2
mov a,r4 ; number of bytes to write
mov r6,a
xch a,r5 ; into R45 little endian
mov r4,a
mov r7,a
clr f0 ; call read => R45 number of remaining
+ mov a,R3
+ cjne A,#KEIL_PTR_XDATA,__ul_write_l3
call UL_WR ; bytes, DPTR moved after read data
+ sjmp __ul_write_l2
+__ul_write_l3:
+ cjne A,#KEIL_PTR_CODE,__ul_write_l4
+ call UL_WRC
+ sjmp __ul_write_l2
+__ul_write_l4
+ cjne A,#KEIL_PTR_DATA,__ul_write_l2
+ call UL_WRI
+__ul_write_l2:
jnb f0,__ul_write_l1
mov r6,#0ffh ; return -1 if there was problem
mov r7,#0ffh
#ifndef UL_WITHOUT_HANDLE
-ul_ssize_t ul_read(ul_fd_t ul_fd,void UL_ARGPTRTYPE *buffer, ul_size_t size)
+ul_ssize_t ul_read(ul_fd_t ul_fd,void *buffer, ul_size_t size)
{
return __ul_read(buffer, size);
}
-ul_ssize_t ul_write(ul_fd_t ul_fd,const void UL_ARGPTRTYPE *buffer, ul_size_t size)
+ul_ssize_t ul_write(ul_fd_t ul_fd,const void *buffer, ul_size_t size)
{
return __ul_write(buffer, size);
}
; EXTRN CODE(uL_R_BU,uL_R_CO)
)FI
-EXTRN CODE(uL_IDB,uL_IDE) ; Jmeno modulu
+EXTRN CODE(_uL_IDSTR) ; Jmeno modulu
PUBLIC uL_IB_L,uL_OB_L
PUBLIC uL_FNC,_uL_FNCC,uL_INIT
PUBLIC uL_FLG,uL_FLH
PUBLIC S_INT,SER_STACK_B
-PUBLIC uL_O_OP,uL_O_NEW,uL_WR,uL_O_CL,uL_WRB,uL_WRB0,uL_O_LN,uL_WRc,uL_O_ABRT
-PUBLIC uL_I_OP,uL_RD,uL_I_CL,uL_RDB,uL_I_LN,uL_I_L,uL_I_NE
+PUBLIC uL_O_OP,uL_O_NEW,uL_WR,uL_WRc,uL_WRi,uL_O_CL,uL_WRB,uL_WRB0,uL_O_LN,uL_O_ABRT
+PUBLIC uL_I_OP,uL_RD,uL_RDi,uL_I_CL,uL_RDB,uL_I_LN,uL_I_L,uL_I_NE
%IF (%DY_ADDR) THEN (
PUBLIC uL_FLD,uLD_RQA,UD_DYSA,UD_STAD,UD_STLN,SER_NUM
uL_ICOM:DS 1 ; Command zpracovavaneho bloku
uL_IST: DS 1 ; Status zpracovavaneho bloku
uL_ISTA:DS 1 ; Stamp - jedinecne cislo zpravy
+uL_TMPB:DS 1 ; Pomocny buffer pro uL_WRi a uL_RDi
PROC_BUF:DS 17 ; Buffer prikazu proceed
PROC_BUFE:
RSEG SER_STACK
SER_STACK_B:
- DS 8
+ DS 8+SER_STACK_EXT
XSEG AT END_RAM-256*LENG_IB-256*LENG_OB
; Vysle svoji identifikaci
CALL ACK_CMD
CALL SND_BEB
- MOV R2,#LOW uL_IDB; ; Vysle svoji identifikaci
- MOV R3,#HIGH uL_IDB
- MOV R6,#LOW uL_IDE
- MOV R7,#HIGH uL_IDE
+ MOV DPTR,#_uL_IDSTR
+ CLR A
+ MOVC A,@A+DPTR
+ MOV R2,A
+ MOV A,#1
+ MOVC A,@A+DPTR
+ MOV R3,A
+ MOV A,#3
+ MOVC A,@A+DPTR
+ ADD A,R2
+ MOV R6,A
+ CLR A
+ ADDC A,R3
+ MOV R7,A
PR_CM12:MOV R5,AR4
CALL SND_Bc ; SND_Bx
PR_CM19:CALL SND_END ; Vysli zakonceni uL_END
JNZ REC_CME
CALL REC_END
%IF(%TGT_T89C51RD2)THEN(
+ CLR EA
+ MOV FCON,#050H ; zapisovaci sequence
+ MOV FCON,#0A0H ; zapisovaci sequence
S_WRM31:
MOV A,FCON ; cekej na dozapsani
ANL A,#01H
JNZ S_WRM31
- MOV FCON,#050H ; zapisovaci sequence
- MOV FCON,#0A0H ; zapisovaci sequence
+ SETB EA
)FI
JMP S_WAITD
S_WRM4: JNZ REC_CME
JMP uL_O_L1
S_FNC15:CJNE R0,#15h,S_FNC16
-%IF (%VECTOR_FL) THEN (
+%IF (%CX_MERGED_FL) THEN (
uL_WRc: JMP uL_WR
)ELSE(
uL_WRc: JB F0,uL_WRcR ; Zapise R45 bytu z CODE @DP
PUSH DPH
JMP uL_O_ABRT1
-S_FNC17:
S_FNC23:CJNE R0,#23h,S_FNC20
uL_RDB: MOV R0,DPL ; Nacte byte na @DP - Rusi R0123
uL_RDB2:MOV DPTR,#P_AID
JMP uL_WRB4
+S_FNC17:CJNE R0,#17h,S_FNC23
+uL_WRi: JB F0,uL_WRiR ; Zapise R45 bytu z IDATA dle DPL
+ MOV A,R4 ; Rusi R012345
+ MOV R5,DPL
+ JZ uL_WRiR
+ MOV DPTR,#uL_TMPB ; Toto je nutne, aby uL_WRB0 necetlo
+uL_WRi1:MOV A,R5 ; na konci z nahodne adresy
+ MOV R0,A
+ MOV A,@R0
+ CALL uL_WRB0
+ JB F0,uL_WRiR
+ INC R5
+ DJNZ R4,uL_WRi1
+uL_WRiR:MOV DPL,R5
+ MOV R5,#0
+ RET
+
S_FNC20:CJNE R0,#20h,S_FNC21
uL_I_OP:PUSH DPL ; Otevre vstupni zpravu : vyplni
PUSH DPH ; uL_ISAD,uL_IDAD,uL_ICOM,uL_IST,uL_ISTA
SETB CY
RET
-S_FNC27:
+S_FNC27:CJNE R0,#17h,S_FNC28
+uL_RDi: JB F0,uL_RDiR ; Cte R45 bytu z IDATA dle DPL
+ MOV A,R4 ; Rusi R012345
+ MOV R5,DPL
+ JZ uL_RDiR
+ MOV DPTR,#uL_TMPB ; Toto je nutne, aby uL_RDB0 nezapsalo
+uL_RDi1:CALL uL_RDB0 ; data na nahodnou adresu
+ JB F0,uL_RDiR
+ MOV R0,A
+ MOV A,R5
+ XCH A,R0
+ MOV @R0,A
+ INC R5
+ DJNZ R4,uL_RDi1
+uL_RDiR:MOV DPL,R5
+ MOV R5,#0
+ RET
+
+S_FNC28:
RET
; Nacte od R2 pres DP R1 registru
typedef unsigned int ul_size_t;
typedef int ul_fd_t;
+typedef struct ul_idstr_t {
+ char *name;
+ char len;
+} ul_idstr_t;
+
#ifndef UL_WITH_HANDLE
#define UL_WITHOUT_HANDLE
#endif /*UL_WITH_HANDLE*/
/* uLan standard IO functions */
ul_fd_t ul_open(const char *dev_name, const char *options);
int ul_close(ul_fd_t ul_fd);
-ul_ssize_t ul_read(ul_fd_t ul_fd,void UL_ARGPTRTYPE *buffer, ul_size_t size);
-ul_ssize_t ul_write(ul_fd_t ul_fd,const void UL_ARGPTRTYPE *buffer, ul_size_t size);
+ul_ssize_t ul_read(ul_fd_t ul_fd,void *buffer, ul_size_t size);
+ul_ssize_t ul_write(ul_fd_t ul_fd,const void *buffer, ul_size_t size);
int ul_newmsg(ul_fd_t ul_fd,const ul_msginfo UL_ARGPTRTYPE *msginfo);
int ul_tailmsg(ul_fd_t ul_fd,const ul_msginfo UL_ARGPTRTYPE *msginfo);
int ul_freemsg(ul_fd_t ul_fd);
#ifdef UL_WITHOUT_HANDLE
ul_ssize_t __ul_read_avail(void) UL_FNC_NAKED;
-ul_ssize_t __ul_read(void UL_ARGPTRTYPE *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT;
-ul_ssize_t __ul_write(const void UL_ARGPTRTYPE *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT;
+ul_ssize_t __ul_read(void *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT;
+ul_ssize_t __ul_write(const void *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT;
int __ul_newmsg(const ul_msginfo UL_ARGPTRTYPE *msginfo) UL_FNC_NAKED;
int __ul_tailmsg(const ul_msginfo UL_ARGPTRTYPE *msginfo) UL_FNC_NAKED;
int __ul_freemsg() UL_FNC_NAKED;