Compare commits

..

20 Commits

Author SHA1 Message Date
5761d5c513 Added long_mul function 2024-07-14 23:43:05 +02:00
71a551d028 Fix dec for next arg 2024-07-03 07:37:44 +02:00
ffeea2dfaf New functions 2024-07-03 07:37:01 +02:00
6153bb3fb4 long_add function 2024-07-03 07:06:33 +02:00
6c2e631e56 New long_* functions 2024-07-03 06:54:47 +02:00
11db18ee92 bcd_tolong function added. 2024-07-01 22:31:49 +02:00
b24da848ac long operations 2024-07-01 20:48:49 +02:00
92144104ec inital commit 2024-07-01 20:48:39 +02:00
f1853c097c bcd_ files 2024-06-13 22:07:56 +02:00
20f8a58db0 Added bcd files 2024-06-13 22:07:19 +02:00
9a906c35ad longx_tobcd added 2024-06-06 02:07:14 +02:00
5930cdc0b5 New function: long_xcpy 2024-06-05 08:43:04 +02:00
ea36658f5e Added some comment 2024-06-05 08:36:33 +02:00
46444987c3 GOTO defs added 2024-06-05 08:21:58 +02:00
253d1af028 New long* functions 2024-06-05 08:20:36 +02:00
6eefbcfedb REgisters added 2024-06-05 08:20:17 +02:00
4eae6e7023 Initial commit 2024-06-05 08:19:50 +02:00
89613a8bec lcd.h added 2024-05-30 19:24:40 +02:00
31066f37f0 Initial commit 2024-05-30 19:24:15 +02:00
e7b50704d0 Includes a def.mak file if exists 2024-05-26 15:47:42 +02:00
38 changed files with 1316 additions and 7 deletions

View File

@ -1,3 +1,6 @@
-include defs.mak
SDCC ?= sdcc
SDAR ?= sdar
STCCODESIZE ?= 8192
@ -17,7 +20,20 @@ LIBSRC = uart_init_.c uart_send_chr.c uart_send_str.c \
rotary_encoder_stat.c \
sevenseg_dec.c sevenseg_dec_inv.c \
int_to_bcd.c getbutton.c \
getpin.c setpin_lo.c setpin_hi.c setpin.c getport.c
getpin.c setpin_lo.c setpin_hi.c setpin.c getport.c \
long_xadd.c long_xsub.c long_xset.c long_xrlc.c long_xdiv.c long_xcpy.c long_xtobcd.c \
multest.c \
bcd_add.c bcd_getsig.c bcd_invert.c bcd_9cpl.c bcd_addbyte.c bcd_shr.c \
long_rrc__.c long_rlc__.c \
long_tobcd__.c long_tobcd.c \
bcd_tolong__.c bcd_tolong.c \
long_addbyte__.c long_addbyte.c \
long_add__.c long_add.c \
long_1cpl__.c long_invert__.c long_invert.c \
long_sub__.c \
long_div__.c long_div.c \
long_fill__.c long_mul__.c long_mul.c
LIBOBJ =$(patsubst %.c,%.rel, $(LIBSRC))
LIBNAME=mc8051fun.lib

16
bcd.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef BCD_H_
#define BCD_H
#include <stdint.h>
uint8_t bcd_add(__idata uint8_t *v1, __idata uint8_t *v2,uint8_t len) __reentrant;
void bcd_9cpl(__idata uint8_t *v1, uint8_t len) __reentrant;
void bcd_shr(__idata uint8_t *v, uint8_t len, uint8_t d) __reentrant;
void bcd_invert(__idata uint8_t *v1, uint8_t len);
void bcd_addbyte(__idata uint8_t *v1, uint8_t len, uint8_t b) __reentrant;
uint8_t bcd_getsig(__idata uint8_t*v, uint8_t len);
void long_tobcd(__idata uint8_t *binval, __idata uint8_t *bcdval, uint8_t binlen, uint8_t bcdlen) __reentrant;
#endif

26
bcd_9cpl.c Normal file
View File

@ -0,0 +1,26 @@
#include "bcd.h"
void bcd_9cpl(__idata uint8_t *v1, uint8_t len) __reentrant
{
__asm
mov a,_bp
add a,#0xfd
mov sp,a
mov r0,dpl
pop ar7
clr c
001$:
mov a,#0x99
subb a,@r0
mov @r0,a
inc r0
djnz r7,001$
mov sp,_bp
__endasm;
}

34
bcd_add.c Normal file
View File

@ -0,0 +1,34 @@
#include "mc8051fun.h"
#include "bcd.h"
#pragma disable_warning 59 // Disable "must return a value" warning
uint8_t bcd_add(__idata uint8_t *v1, __idata uint8_t *v2,uint8_t len) __reentrant
{
(void)v1; (void)v2; (void)len;
__asm
mov a,_bp
add a,#0xfd
mov sp,a
pop ar1
pop ar7
mov ar0,dpl
clr c
001$:
mov a,@r0
addc a,@r1
da a
mov @r0,a
inc r0
inc r1
djnz r7,001$
mov dpl,#0x00
jnc $002
inc dpl
$002:
mov sp,_bp
__endasm;
}

43
bcd_addbyte.c Normal file
View File

@ -0,0 +1,43 @@
#include "bcd.h"
#pragma disable_warning 59 // Disable "must return a value" warning
void bcd_addbyte(__idata uint8_t *v1, uint8_t len, uint8_t ab) __reentrant
{
(void)v1; (void)len; (void)ab;
__asm
mov a,_bp
add a,#0xfd
mov sp,a
mov r0,dpl
pop ar7
pop ACC
mov r6,a
add a,#0xb0 ; carry will be set if a>=5
jc 001$
mov b,#0x00
ajmp 004$
001$:
mov b,#0x99
004$:
mov a,@r0
add a,r6
da a
mov @r0,a
sjmp 002$
000$:
inc r0
mov a,@r0
addc a,#0x00
da a
mov @r0,a
002$:
djnz r7,000$
mov sp,_bp
__endasm;
}

10
bcd_getsig.c Normal file
View File

@ -0,0 +1,10 @@
#include "bcd.h"
#pragma opt_code_size
uint8_t bcd_getsig(__idata uint8_t*v, uint8_t len)
{
return v[len-1]>=0x50;
}

11
bcd_invert.c Normal file
View File

@ -0,0 +1,11 @@
#include "bcd.h"
void bcd_invert(__idata uint8_t *v1, uint8_t len)
{
bcd_9cpl(v1,len);
bcd_addbyte(v1,len,1);
}

38
bcd_shr.c Normal file
View File

@ -0,0 +1,38 @@
#include "bcd.h"
#pragma disable_warning 59 // Disable "must return a value" warning
void bcd_shr(__idata uint8_t *v, uint8_t len, uint8_t d) __reentrant
{
(void)v; (void)len, (void)d;
__asm
mov a,_bp
add a,#0xfd
mov sp,a
pop ar7 ; r7 = len
pop B ;
mov a,dpl
add a,r7
mov r0,a
001$:
dec r0
mov a,@r0
swap a
mov r6,a
anl a,#0x0f
orl a,b
mov @r0,a
mov a,r6
anl a,#0xf0
mov b,a
djnz r7,001$
mov sp,_bp
__endasm;
}

33
bcd_tolong.c Normal file
View File

@ -0,0 +1,33 @@
#include "mc8051fun.h"
/*
* C-Wrapper for bcd_tolong
*/
void bcd_tolong(__idata uint8_t *bcdval, __idata uint8_t *binval, uint8_t bcdlen, uint8_t binlen) __reentrant
{
(void)binval;
(void)bcdval;
(void)binlen;
(void)bcdlen;
__asm
mov a,_bp
add a,#0xfd
mov r0,a
mov a,@r0 ; binval
mov r1,a
dec r0
mov a,@r0 ; bcdlen
mov r7,a
dec r0
mov a,@r0 ; binlen
mov r6,a
mov r0,dpl ; bcdval
lcall bcd_tolong
__endasm;
}

67
bcd_tolong__.c Normal file
View File

@ -0,0 +1,67 @@
#include "usebank0.h"
/*
r0 = bcd
r1 = bin
r7 = len of bcd
r6 = len of bin
reverse double dabble
*/
static void bcd_tolong__() __naked
{
__asm
.globl bcd_tolong
bcd_tolong:
mov a,AR6 ; use r4 as counter
mov b,#0x08
mul ab
mov r4,a
000$:
push AR0
push AR7
clr c
lcall long_rrc
mov r0,AR1
mov r7,AR6
lcall long_rrc
pop AR7
pop AR0
push AR0
push AR7
001$:
mov a,@r0
acall 003$
acall 003$
mov @r0,a
inc r0
djnz r7,001$
pop AR7
pop AR0
djnz r4,000$
ret
003$:
swap a
clr c
subb a,#0x80
jc 002$
subb a,#0x30
002$:
add a,#0x80
ret
__endasm;
}

120
lcd.h Normal file
View File

@ -0,0 +1,120 @@
#ifndef MC8051FUN_LCD_H_
#define MC8051FUN_LCD_H
#ifndef LCD_E
#define LCD_E P3_4
#endif
#ifndef LCD_RS
#define LCD_RS P3_5
#endif
#ifndef LCD_RW
#define LCD_RW P3_6
#endif
#ifndef LCD_DATA
#define LCD_DATA P0
#endif
#ifndef LCD_READY
#define LCD_READY P0_7
#endif
// Clear Display -------------- 0b00000001
#define LCD_CLEAR_DISPLAY 0x01
// Cursor Home ---------------- 0b0000001x
#define LCD_CURSOR_HOME 0x02
// Set Entry Mode ------------- 0b000001xx
#define LCD_SET_ENTRY 0x04
#define LCD_ENTRY_DECREASE 0x00
#define LCD_ENTRY_INCREASE 0x02
#define LCD_ENTRY_NOSHIFT 0x00
#define LCD_ENTRY_SHIFT 0x01
// Set Display ---------------- 0b00001xxx
#define LCD_SET_DISPLAY 0x08
#define LCD_DISPLAY_OFF 0x00
#define LCD_DISPLAY_ON 0x04
#define LCD_CURSOR_OFF 0x00
#define LCD_CURSOR_ON 0x02
#define LCD_BLINKING_OFF 0x00
#define LCD_BLINKING_ON 0x01
// Set Shift ------------------ 0b0001xxxx
#define LCD_SET_SHIFT 0x10
#define LCD_CURSOR_MOVE 0x00
#define LCD_DISPLAY_SHIFT 0x08
#define LCD_SHIFT_LEFT 0x00
#define LCD_SHIFT_RIGHT 0x04
// Set Function --------------- 0b001xxxxx
#define LCD_SET_FUNCTION 0x20
#define LCD_FUNCTION_4BIT 0x00
#define LCD_FUNCTION_8BIT 0x10
#define LCD_FUNCTION_1LINE 0x00
#define LCD_FUNCTION_2LINE 0x08
#define LCD_FUNCTION_5X7 0x00
#define LCD_FUNCTION_5X10 0x04
#define LCD_SOFT_RESET 0x30
// Set CG RAM Address --------- 0b01xxxxxx (Character Generator RAM)
#define LCD_SET_CGADR 0x40
#define LCD_GC_CHAR0 0
#define LCD_GC_CHAR1 1
#define LCD_GC_CHAR2 2
#define LCD_GC_CHAR3 3
#define LCD_GC_CHAR4 4
#define LCD_GC_CHAR5 5
#define LCD_GC_CHAR6 6
#define LCD_GC_CHAR7 7
// Set DD RAM Address --------- 0b1xxxxxxx (Display Data RAM)
#define LCD_SET_DDADR 0x80
#define LCD_GOTO_HOME LCD_SET_DDADR
#define LCD_GOTO_LINE1 LCD_GOTO_HOME
#define LCD_GOTO_LINE2 LCD_SET_DDADR+0x40
#define lcd_wait_ready()\
LCD_E=1; \
LCD_RS=0; \
LCD_RW=1; \
LCD_DATA=0x80; \
while((LCD_DATA & 0x80)) \
{ \
LCD_E=0; \
LCD_E=1; \
} \
LCD_E=1; \
LCD_RW=0;
#define lcd_cmd(c) \
lcd_wait_ready(); \
LCD_RS=0; \
LCD_DATA=c; \
LCD_E=0
#define lcd_chr(c) \
lcd_wait_ready(); \
LCD_RS=1; \
LCD_DATA=c; \
LCD_E=0
#endif

22
long_1cpl__.c Normal file
View File

@ -0,0 +1,22 @@
#include "mc8051fun.h"
static void long_1cpl__() __naked
{
__asm
.globl long_1cpl
long_1cpl:
clr c
001$:
mov a,#0xff
subb a,@r0
mov @r0,a
inc r0
djnz r7,001$
ret
__endasm;
}

28
long_add.c Normal file
View File

@ -0,0 +1,28 @@
#include "mc8051fun.h"
#include "bcd.h"
#pragma disable_warning 59 // Disable "must return a value" warning
uint8_t long_add(__idata uint8_t *v1, __idata uint8_t *v2,uint8_t len) __reentrant
{
(void)v1; (void)v2; (void)len;
__asm
mov a,_bp
add a,#0xfd
mov r0,a
mov a,@r0 ; *v2
dec r0
mov r1,a
mov a,@r0 ; len
mov r7,a
mov r0,dpl
lcall long_invert
mov dpl,#0x00
jnc $002
inc dpl
$002:
__endasm;
}

27
long_add__.c Normal file
View File

@ -0,0 +1,27 @@
/*
* @r0 = @r0+@r1
* r7=len
*/
static void long_add__() __naked
{
__asm
.globl long_add
.globl long_addc
long_add:
clr c
long_addc:
001$:
mov a,@r0
addc a,@r1
mov @r0,a
inc r0
inc r1
djnz r7,001$
ret
__endasm;
}

26
long_addbyte.c Normal file
View File

@ -0,0 +1,26 @@
#include "mc8051fun.h"
/**
* C wrapper for long_addbyte
*/
static void long_addbyte(__idata uint8_t * val, uint8_t len, uint8_t b) __reentrant
{
(void)val;
(void)b;
__asm
mov a,_bp
add a,#0xfd
mov r0,a
mov a,@r0 ; len
mov r7,a
dec r0
mov a,@r0 ; b
mov r0,dpl
lcall long_addbyte
__endasm;
}

23
long_addbyte__.c Normal file
View File

@ -0,0 +1,23 @@
/*
* a = byte to add
* @r0 = long val
* r7 = length
*
*/
static void long_addbyte__() __naked
{
__asm
.globl long_addbyte
long_addbyte:
clr c
ajmp 002$
001$:
mov a,#0x00
002$:
addc a,@r0
mov @r0,a
inc r0
djnz r7,001$
ret
__endasm;
}

34
long_div.c Normal file
View File

@ -0,0 +1,34 @@
#include "mc8051fun.h"
#include "bcd.h"
#pragma disable_warning 59 // Disable "must return a value" warning
void long_div(__idata uint8_t *v1, __idata uint8_t *v2,
__idata uint8_t *result, __idata uint8_t *rest, uint8_t len) __reentrant
{
(void)v1; (void)v2; (void)len;
(void)result; (void)rest;
__asm
mov a,_bp
add a,#0xfd
mov r0,a
mov a,@r0 ; *v2
dec r0
mov r1,a
mov a,@r0 ; *result
dec r0
mov r2,a
mov a,@r0 ; *rest
dec r0
mov r3,a
mov a,@r0 ; len
mov r7,a
mov r0,dpl ; *v1
lcall long_div
__endasm;
}

67
long_div__.c Normal file
View File

@ -0,0 +1,67 @@
#include "mc8051fun.h"
/*
* r0 = numerator
* r1 = denominator
* r2 = quotient (result)
* r3 = rest
* r7 = length in bytes
*/
static void long_div__() __naked
{
__asm
.globl long_div
long_div:
mov r5,AR7 ;#0x01
push AR0
mov r0,AR3
; lcall long_xset_zero
pop AR0
mov r4,AR1
mov a,r0
add a,r5 ;#DIGITS-1
mov r0,a
003$:
mov a,@r0
mov r6,#8
002$:
rlc a
push ACC
push AR0
mov r0,AR3 ;#_rest
mov r7,AR5 ;#DIGITS
lcall long_rlc
mov r0,AR3 ;#_rest
mov r7,AR5 ;#DIGITS
push AR1
lcall long_sub
pop AR1
jnc 001$
mov r0,AR3 ;#_rest
mov r7,AR5 ;#DIGITS
push AR1
lcall long_add
pop AR1
setb c
001$:
cpl c
mov r0,AR2 ; #_result
mov r7,AR5 ;#DIGITS
lcall long_rlc
pop AR0
pop ACC
djnz r6,002$
djnz r0,003$
ret
__endasm;
}

19
long_fill__.c Normal file
View File

@ -0,0 +1,19 @@
void long_fill() __naked
{
__asm
.globl long_fill_zero
.globl long_fill
long_fill_zero:
mov a,#0x00
long_fill:
mov @r0,a
inc r0
djnz r7,long_fill
ret
__endasm;
}

21
long_invert.c Normal file
View File

@ -0,0 +1,21 @@
#include "mc8051fun.h"
void long_invert(__idata uint8_t *val, uint8_t len) __reentrant
{
(void)val;
(void)len;
__asm
mov a,_bp
add a,#0xfd
mov r0,a
mov a,@r0 ; len
mov r7,a
mov r0,dpl
lcall long_invert
__endasm;
}

22
long_invert__.c Normal file
View File

@ -0,0 +1,22 @@
#include "mc8051fun.h"
static void long_invert__() __naked
{
__asm
.globl long_invert
long_invert:
push AR0
push AR7
lcall long_1cpl
pop AR7
pop AR0
mov a,#0x01
lcall long_addbyte
ret
__endasm;
}

28
long_mul.c Normal file
View File

@ -0,0 +1,28 @@
#include "mc8051fun.h"
uint8_t long_mul(__idata uint8_t *v1, __idata uint8_t *v2,uint8_t len, __idata uint8_t *result) __reentrant
{
(void)v1; (void)v2; (void)len,(void)result;
__asm
mov a,_bp
add a,#0xfd
mov r0,a
mov a,@r0 ; *v2
dec r0
mov r1,a
mov a,@r0 ; len
mov r7,a
dec r0
mov a,@r0 ; result
mov r2,a
mov r0,dpl
lcall long_mul
mov dpl,#0x00
jnc $002
inc dpl
$002:
__endasm;
}

55
long_mul__.c Normal file
View File

@ -0,0 +1,55 @@
#include "mc8051fun.h"
/*
* val0,val1 = r0,r1
* r2 = result
* r7 = len of val0,val1
*/
void long_mul__() __naked
{
__asm
.globl long_mul
long_mul:
push AR0
push AR7
mov r0,AR2
lcall long_fill_zero
pop AR7
pop AR0
mov r6,#8
mov a,@r1
000$:
rrc a
jnc 001$
push ACC
push AR0
push AR1
push AR7
mov r1,AR0
mov r0,AR2
lcall long_add
pop AR7
pop AR1
pop AR0
pop ACC
001$:
push ACC
push AR7
push AR0
clr c
lcall long_rlc
pop AR0
pop AR7
pop ACC
djnz r6,000$
ret
__endasm;
}

24
long_rlc__.c Normal file
View File

@ -0,0 +1,24 @@
/*
* @r0 = number
* r7 = len
*
* modyfies: r0,r7,a
*/
static void long_rlc__() __naked
{
__asm
.globl long_rlc
long_rlc:
mov a,@r0
rlc a
mov @r0,a
inc r0
djnz r7,long_rlc
ret
__endasm;
}

29
long_rrc__.c Normal file
View File

@ -0,0 +1,29 @@
/*
* @r0 = number
* r7 = len
*
* modyfies: r0,r7,a
*/
static void long_rrc__() __naked
{
__asm
.globl long_rrc
long_rrc:
push PSW
mov a,r0
add a,r7
mov r0,a
pop PSW
001$:
dec r0
mov a,@r0
rrc a
mov @r0,a
djnz r7,001$
ret
__endasm;
}

25
long_sub__.c Normal file
View File

@ -0,0 +1,25 @@
/**
* @r0=@r0-@r1
* r7=len
*/
static void long_sub() __naked
{
__asm
.globl long_sub
.globl long_subb
long_sub:
clr c
long_subb:
mov a,@r0
subb a,@r1
mov @r0,a
inc r0
inc r1
djnz r7,long_xsubb
ret
__endasm;
}

33
long_tobcd.c Normal file
View File

@ -0,0 +1,33 @@
#include "mc8051fun.h"
/*
* C-Wrapper for long_tobcd
*/
void long_tobcd(__idata uint8_t *binval, __idata uint8_t *bcdval, uint8_t binlen, uint8_t bcdlen) __reentrant
{
(void)binval;
(void)bcdval;
(void)binlen;
(void)bcdlen;
__asm
mov a,_bp
add a,#0xfd
mov r0,a
mov a,@r0
mov r1,a
dec r0
mov a,@r0
mov r7,a
dec r0
mov a,@r0
mov r6,a
mov r0,dpl
lcall long_tobcd
__endasm;
}

92
long_tobcd__.c Normal file
View File

@ -0,0 +1,92 @@
/*
r0 = bin
r1 = bcd
r7 = len of bin
r6 = len of bcd
*/
#include "mc8051fun.h"
#include "usebank0.h"
// double dabble
void long_tobcd__() __naked
{
__asm
.globl long_tobcd
long_tobcd:
; fill dst with zeroes
mov r3,AR1 ; save r1 in r3
mov r4,AR6 ; use r4 as counter
; mov a,#0x00
000$:
mov @r1,#0x0
inc r1
djnz r4,000$
mov a,r0
add a,r7
dec a
mov r0,a ; r0 points to last byte of bin
mov r2,AR0 ; save r0 in r2
006$:
mov a,@r0
mov r5,#0x08
005$:
mov r4,AR6 ; use r4 as counter
mov r1,AR3
push ACC
004$:
mov a,@r1
acall 003$
acall 003$
mov @r1,a
inc r1
djnz r4,004$
pop ACC
rlc a
push ACC
push AR0
push AR7
mov r7,AR6
mov r0,AR3
lcall long_rlc
pop AR7
pop AR0
pop ACC
djnz r5,005$
dec r0
djnz r7,006$
ret
003$:
swap a
clr c
subb a,#0x50
jc 002$
add a,#0x30
002$:
add a,#0x50
ret
__endasm;
}

32
long_xadd.c Normal file
View File

@ -0,0 +1,32 @@
/**
* Add two longs in xmem zero page
*
* r0 = ptr to firts arg
* r1 = ptr to second arg
* r7 = length
*
* result is in r0*
*/
void long_xadd() __naked
{
__asm
.globl long_xadd
.globl long_xaddc
long_xadd:
clr c
long_xaddc:
movx a,@r1
mov b,a
movx a,@r0
addc a,b
movx @r0,a
inc r0
inc r1
djnz r7,long_xaddc
ret
__endasm;
}

18
long_xcpy.c Normal file
View File

@ -0,0 +1,18 @@
void long_xcpy() __naked
{
__asm
.globl long_xcpy
long_xcpy:
movx a,@r1
movx @r0,a
inc r0
inc r1
djnz r7,long_xcpy
ret
__endasm;
}

69
long_xdiv.c Normal file
View File

@ -0,0 +1,69 @@
#include "mc8051fun.h"
/*
* r0 = numerator
* r1 = denominator
* r2 = quotient (result)
* r3 = rest
* r7 = length in bytes
*/
void long_xdiv() __naked
{
__asm
.globl long_xdiv
long_xdiv:
mov r5,AR7 ;#0x01
push AR0
mov r0,AR3
lcall long_xset_zero
pop AR0
mov r4,AR1
clr c
mov a,r0
addc a,r5 ;#DIGITS-1
mov r0,a
003$:
movx a,@r0
mov r6,#8
002$:
rlc a
push ACC
push AR0
mov r0,AR3 ;#_rest
mov r7,AR5 ;#DIGITS
lcall long_xrlc
mov r0,AR3 ;#_rest
; mov r1,#_val1
mov r7,AR5 ;#DIGITS
push AR1
lcall long_xsub
pop AR1
jnc 001$
mov r0,AR3 ;#_rest
; mov r1,#_val1
mov r7,AR5 ;#DIGITS
push AR1
lcall long_xadd
pop AR1
setb c
001$:
cpl c
mov r0,AR2 ; #_result
mov r7,AR5 ;#DIGITS
lcall long_xrlc
pop AR0
pop ACC
djnz r6,002$
djnz r0,003$
ret
__endasm;
}

21
long_xrlc.c Normal file
View File

@ -0,0 +1,21 @@
/*
*
*/
void long_xrlc() __naked
{
__asm
.globl long_xrlc
long_xrlc:
movx a,@r0
rlc a
movx @r0,a
inc r0
djnz r7,long_xrlc
ret
__endasm;
}

17
long_xset.c Normal file
View File

@ -0,0 +1,17 @@
void long_xset() __naked
{
__asm
.globl long_xset_zero
.globl long_xset
long_xset_zero:
mov a,#0x00
long_xset:
movx @r0,a
djnz r7,long_xset
__endasm;
}

28
long_xsub.c Normal file
View File

@ -0,0 +1,28 @@
/**
* @r0=@r0-@r1
* r7=len
*/
void long_xsub() __naked
{
__asm
.globl long_xsub
.globl long_xsubb
long_xsub:
clr c
long_xsubb:
movx a,@r1
mov b,a
movx a,@r0
subb a,b
movx @r0,a
inc r0
inc r1
djnz r7,long_xsubb
ret
__endasm;
}

88
long_xtobcd.c Normal file
View File

@ -0,0 +1,88 @@
/*
r0 = bin
r1 = bcd
r7 = len of bin
r6 = len of bcd
*/
#include "mc8051fun.h"
// double dabble
void long_xtobcd() __naked
{
__asm
.globl long_xtobcd
long_xtobcd:
; fill dst with zeroes
mov r3,AR1 ; save r1 in r3
mov r4,AR6 ; use r4 as counter
mov a,#0x00
000$:
movx @r1,a
inc r1
djnz r4,000$
mov a,r0
add a,r7
dec a
mov r0,a
mov r2,AR0 ; save r0 in r2
006$:
movx a,@r0
mov r5,#0x08
005$:
mov r4,AR6 ; use r4 as counter
mov r1,AR3
push ACC
004$:
movx a,@r1
acall 003$
acall 003$
movx @r1,a
inc r1
djnz r4,004$
pop ACC
rlc a
push ACC
push AR0
push AR7
mov r7,AR6
mov r0,AR3
lcall long_xrlc
pop AR7
pop AR0
pop ACC
djnz r5,005$
dec r0
djnz r7,006$
ret
003$:
swap a
clr c
subb a,#0x50
jc 002$
add a,#0x30
002$:
add a,#0x50
ret
__endasm;
}

View File

@ -4,6 +4,9 @@
#include <stdint.h>
#include <8052.h>
#define STC15XX 1 // STC15xx family
#define AT89XX 2 // AT89XX family
#define AT89XX_6T 3 // AT89C89C52 in 6T mode
void uart_send_chr(char tx_data);
@ -11,9 +14,16 @@ void uart_send_str(const char *str);
void uart_init_(uint8_t timer_init,uint8_t x2);
#define uart_init(baud,x2) \
#define uart_init_8051(baud,x2) \
uart_init_(256L-FOSC/12L/(baud*32L/(1<<x2)),x2)
#define uart_init_at89xx_6t_(baud,x2) \
uart_init_(256L-FOSC/12L/(baud*16L/(1<<x2)),x2)
#if MCU==AT89XX_6T
#define uart_init(baud,x2) uart_init_at89xx_6t_(baud,x2)
#else
#define uart_init(baud,x2) uart_init_8051(baud,x2)
#endif
#define setbits(var,bits) (var|=bits)
#define unsetbits(var,bits) (var&=(bits^0xff))
@ -35,9 +45,6 @@ extern uint8_t sevenseg_dec_inv[10];
#define at89xx_6t_timer8_init_val(freq) ((256L)-FOSC/6L/freq)
#define STC15XX 1 // STC15xx family
#define AT89XX 2 // AT89XX family
#define AT89XX_6T 3 // AT89C89C52 in 6T mode
#if MCU==AT89XX_6T
#define timer8_init_val(freq) at89xx_6t_timer8_init_val(freq)
@ -68,12 +75,23 @@ int getpin(i8051pin_T *pin);
void setpin(i8051pin_T *pin, uint8_t val);
uint8_t getport(int n);
#define AR0 0x00
#define AR1 0x01
#define AR2 0x02
#define AR3 0x03
#define AR4 0x04
#define AR5 0x05
#define AR6 0x06
#define AR7 0x07
uint8_t multest(uint8_t a, uint8_t b);
void bcd_tolong(__idata uint8_t *bcdval, __idata uint8_t *binval, uint8_t bcdlen, uint8_t binlen) __reentrant;
void long_invert(__idata uint8_t *val, uint8_t len) __reentrant;
uint8_t long_add(__idata uint8_t *v1, __idata uint8_t *v2,uint8_t len) __reentrant;
uint8_t long_mul(__idata uint8_t *v1, __idata uint8_t *v2,uint8_t len, __idata uint8_t *result) __reentrant;
#endif

8
multest.c Normal file
View File

@ -0,0 +1,8 @@
#include "mc8051fun.h"
uint8_t multest(uint8_t a, uint8_t b)
{
return a*b;
}

21
usebank0.h Normal file
View File

@ -0,0 +1,21 @@
#undef AR0
#undef AR1
#undef AR2
#undef AR3
#undef AR4
#undef AR5
#undef AR6
#undef AR7
#define AR0 0x00
#define AR1 0x01
#define AR2 0x02
#define AR3 0x03
#define AR4 0x04
#define AR5 0x05
#define AR6 0x06
#define AR7 0x07