]> rtime.felk.cvut.cz Git - sysless.git/commitdiff
uLan updates to support reads into IDATA and writes from CODE and IDATA too.
authorppisa <ppisa>
Mon, 3 Oct 2005 12:30:16 +0000 (12:30 +0000)
committerppisa <ppisa>
Mon, 3 Oct 2005 12:30:16 +0000 (12:30 +0000)
arch/mcs51/generic/libs/ulan/ul_l_c2a.c
arch/mcs51/generic/libs/ulan/ulan.asm
arch/mcs51/generic/libs/ulan/ulan.h

index 8c51ac88461c71bebc83f710951b4429c219146b..7b7f88bbedb391da937b57c2b86ee58d1c341d10 100644 (file)
 
 /*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
@@ -93,7 +97,7 @@ ul_ssize_t __ul_read_avail(void) UL_FNC_NAKED
 #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
@@ -101,17 +105,20 @@ ul_ssize_t __ul_read(void UL_ARGPTRTYPE *buffer, ul_size_t size) UL_FNC_NAKED
        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
@@ -119,13 +126,15 @@ ul_ssize_t __ul_read(void UL_ARGPTRTYPE *buffer, ul_size_t size) UL_FNC_NAKED
        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 */
@@ -133,7 +142,7 @@ ul_ssize_t __ul_read(void UL_ARGPTRTYPE *buffer, ul_size_t size) UL_FNC_NAKED
  * 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
@@ -153,17 +162,20 @@ ul_ssize_t __ul_read(void UL_ARGPTRTYPE *buffer, ul_size_t size) reentrant UL_FN
        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
@@ -171,34 +183,42 @@ ul_ssize_t __ul_read(void UL_ARGPTRTYPE *buffer, ul_size_t size) reentrant UL_FN
        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
@@ -206,11 +226,13 @@ ___ul_read:
        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
@@ -219,40 +241,53 @@ __ul_read_l1:
 #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
@@ -269,41 +304,61 @@ ul_ssize_t __ul_write(const void UL_ARGPTRTYPE *buffer, ul_size_t size) reentran
        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
@@ -799,12 +854,12 @@ _ul_drv_set_bdiv:
 
 #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);
 }
index 4e645eace08af9eb7eeb6b2159649e6cd8a92a40..26e13eb0d25b3b9c53da1c98a40992de96b44eb1 100644 (file)
@@ -85,7 +85,7 @@ SINT  CODE  00023H          ; SDCC nema hodnotu definovanu
 ;  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
@@ -93,8 +93,8 @@ PUBLIC  _uL_STR,uL_STR,uL_ERR,uLF_ERR,uLF_INE,uLF_KMP,uLF_TRP
 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
@@ -185,6 +185,7 @@ uL_IDAD:DS    1  ;    DA zpracovavaneho bloku
 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:
@@ -221,7 +222,7 @@ uLD_SCIP BIT  uL_FLD.4      ; Status is changed
 
 RSEG    SER_STACK
 SER_STACK_B:
-        DS    8
+        DS    8+SER_STACK_EXT
 
 XSEG AT END_RAM-256*LENG_IB-256*LENG_OB
 
@@ -1003,10 +1004,20 @@ uL_EADD:XCH   A,R0
 ; 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
@@ -1098,12 +1109,14 @@ S_WRM3: CJNE  R4,#5,S_WRM4    ; zapis do code 89c51rd2?
         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
@@ -2199,7 +2212,7 @@ uL_O_LN:MOV   R0,DPL
         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
@@ -2222,7 +2235,6 @@ uL_O_ABRT:PUSH DPL
         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
@@ -2262,6 +2274,23 @@ uL_RDB1:MOV   DPL,R2
 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
@@ -2436,7 +2465,25 @@ uL_I_N2:MOV   DPTR,#P_NPD
        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
index 6288774b4d83817532b796491ee7fc67e828c9e5..5e67e322577bb1974f9038b3a6071b879559ac85 100644 (file)
@@ -13,6 +13,11 @@ typedef int ul_ssize_t;
 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*/
@@ -97,8 +102,8 @@ void ul_str(void);
 /* 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);
@@ -112,8 +117,8 @@ int ul_fd_wait(ul_fd_t ul_fd, int wait_sec);
 
 #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;