summaryrefslogtreecommitdiff
path: root/software/idm/idm.asm
diff options
context:
space:
mode:
Diffstat (limited to 'software/idm/idm.asm')
-rw-r--r--software/idm/idm.asm147
1 files changed, 82 insertions, 65 deletions
diff --git a/software/idm/idm.asm b/software/idm/idm.asm
index fb7b893..f1cd094 100644
--- a/software/idm/idm.asm
+++ b/software/idm/idm.asm
@@ -64,7 +64,7 @@ BUF_ENDL EQU H'00BF'
;; variables
;; all Pages
-TMP EQU H'0070'
+CMD EQU H'0070'
FLAGS EQU H'007F'
@@ -72,6 +72,7 @@ FLAGS EQU H'007F'
;; FLAGS
#define UNDERRUN FLAGS,0
#define OVERRUN FLAGS,1
+#define CMD_READ FLAGS,7
;; -------------------------------------
;; Macros
@@ -118,31 +119,51 @@ inc_fsr_end
goto int_spi
retfie
+ ;; void timer2Interrupt()
+ ;; {
+ ;; static char value = 0;
+ ;; if (!overrun) {
+ ;; *writePtr = ++value;
+ ;; wbuf_next();
+ ;; }
+ ;; }
int_tmr2
bcf PIR1,TMR2IF
- bsf DBG0
- movlb b'00000001'
- bsf ADCON0,GO
- call wbuf_next
btfsc OVERRUN
goto int_end
+ movlb b'00000001'
+ bsf ADCON0,GO
int_tmr2_adcon
btfsc ADCON0,GO
goto int_tmr2_adcon
movf ADRESH,w
movwf INDFW
+ call wbuf_next
goto int_end
+ ;; void sspInterrupt()
+ ;; {
+ ;; if (cmd_read && spiData == 0) {
+ ;; *readPtr = 0;
+ ;; rbuf_next();
+ ;; spiData = underrun ? -1 : *readPtr;
+ ;; } else if (spiData == 'r') {
+ ;; cmd_read = TRUE;
+ ;; spiData = underrun ? -1 : *readPtr;
+ ;; } else {
+ ;; cmd_read = FALSE;
+ ;; printf("%s\n", "I don't like you!");
+ ;; }
+ ;; }
int_spi
bcf PIR1,SSP1IF
movlb b'00000100'
movf SSP1BUF,w
- incf TMP,f
- movf TMP,w
- movwf SSP1BUF
- movlb b'00000000'
+ movwf CMD
+ movwf SSP1BUF
+
int_end
movlb .31
movf FSR0H,w
@@ -157,96 +178,93 @@ int_end
;; -------------------------------------
;; SUBROUTINES
-wbuf_reset
+ ;; void buf_init()
+ ;; {
+ ;; writePtr = bufferStart;
+ ;; readPtr = bufferStart;
+ ;; overrun = FALSE;
+ ;; underrun = TRUE;
+ ;; cmd_read = FALSE;
+ ;; }
+buf_init
movlw BUF_STARTH
movwf FSRWH
movlw BUF_STARTL
movwf FSRWL
+ movlw BUF_STARTH
+ movwf FSRRH
+ movlw BUF_STARTL
+ movwf FSRRL
bcf OVERRUN
+ bsf UNDERRUN
+ bcf CMD_READ
+
movf BSR,w
clrf BSR
+ bsf INT
+ bsf DBG1
bcf DBG2
movwf BSR
return
;; -------------------
+ ;; void wbuf_next()
+ ;; {
+ ;; if (!overrun) {
+ ;; writePtr++;
+ ;; writePtr = writePtr > bufferEnd ? bufferStart : writePtr;
+ ;; underrun = FALSE;
+ ;; if(writePtr == readPtr) {
+ ;; overrun = TRUE;
+ ;; }
+ ;; }
+ ;; }
wbuf_next
- btfsc UNDERRUN
- goto wbuf_move_ptr
btfsc OVERRUN
return
-
+
+ inc_fsr FSRW,FSRWH,FSRWL
+ bcf UNDERRUN
+
movf FSRRH,w
xorwf FSRWH,w
btfss STATUS,Z
- goto wbuf_move_ptr
+ return
movf FSRRL,w
xorwf FSRWL,w
btfss STATUS,Z
- goto wbuf_move_ptr
- bsf OVERRUN
- movf BSR,w
- clrf BSR
- bsf DBG2
- movwf BSR
return
-
-wbuf_move_ptr
- movf BSR,w
- clrf BSR
- bcf INT
- bcf DBG1
- movwf BSR
- bcf UNDERRUN
- inc_fsr FSRW,FSRWH,FSRWL
- return
-
-
- ;; -------------------
-rbuf_reset
- movlw BUF_STARTH
- movwf FSRRH
- movlw BUF_STARTL
- movwf FSRRL
- bsf UNDERRUN
- movf BSR,w
- clrf BSR
- bsf INT
- bsf DBG1
- movwf BSR
+ bsf OVERRUN
return
;; -------------------
+ ;; void rbuf_next()
+ ;; {
+ ;; if(!underrun) {
+ ;; readPtr++;
+ ;; readPtr = readPtr > bufferEnd ? bufferStart : readPtr;
+ ;; overrun = FALSE;
+ ;; if(readPtr == writePtr) {
+ ;; underrun = TRUE;
+ ;; }
+ ;; }
+ ;; }
rbuf_next
- btfsc OVERRUN
- goto rbuf_move_ptr
btfsc UNDERRUN
return
+ inc_fsr FSRR,FSRRH,FSRRL
+ bcf OVERRUN
+
movf FSRWH,w
xorwf FSRRH,w
btfss STATUS,Z
- goto rbuf_move_ptr
+ return
movf FSRWL,w
xorwf FSRRL,w
btfss STATUS,Z
- goto rbuf_move_ptr
-
- bsf UNDERRUN
- movf BSR,w
- clrf BSR
- bsf INT
- bsf DBG1
- movwf BSR
return
-
-rbuf_move_ptr
- movf BSR,w
- clrf BSR
- bcf DBG2
- movwf BSR
- bcf OVERRUN
- inc_fsr FSRR,FSRRH,FSRRL
+ bsf UNDERRUN
return
;; -------------------------------------
@@ -298,8 +316,7 @@ init
bcf FILTER_EN
bsf INT
- call wbuf_reset
- call rbuf_reset
+ call buf_init
bsf T2CON,TMR2ON
bsf INTCON,GIE