📄 main.s
字号:
.dbfile ./table.h
.dbfile ./main.c
.dbsym s accum _accum l
_dphase:
.blkb 4
.area idata
.word 65,35160
.area data(ram, con, rel)
.dbfile ./main.c
.dbsym s dphase _dphase l
_adr:
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile ./main.c
.dbsym s adr _adr i
.area text(rom, con, rel)
.dbfile ./main.c
.dbfunc e main _main fV
_main::
.dbline -1
push X
mov X,SP
add SP,6
.dbline 32
; #include "ddsapi.h"
; #include "table.h"
; #include "exchange.h"
; #include <stdlib.h>
;
;
; #define SB(var, num) *(((BYTE*)&var)+num)
; #define SIGN_BIT 0x08
; #define QUATER_BIT 0x04
; #define TABLE_MASK 0x03FF
;
; #define FREQ_MULT 4295
; #define INIT_FREQ 1000
; #define MAX_FREQ 30000
;
; extern volatile BOOL ready;
; extern char rx_buffer[];
;
; static DWORD accum = 0, dphase = INIT_FREQ*FREQ_MULT;
; static WORD adr = 0;
; static BYTE msb, lsb;
;
; #pragma ioport DAC_MSB_CR0: 0x080
; BYTE DAC_MSB_CR0;
;
; #pragma ioport DAC_LSB_CR0: 0x090
; BYTE DAC_LSB_CR0;
; //you must change these values accordingly to your DAC9 placement,
; //alternatively you can use the fixed version of the DAC_WriteStall2B()
;
; void main()
; {
.dbline 33
; DAC_Start(DAC_FULLPOWER);
push X
mov A,3
xcall _DAC_Start
.dbline 34
; PGA_FIL1_Start(PGA_FIL1_HIGHPOWER);
mov A,3
xcall _PGA_FIL1_Start
.dbline 35
; PGA_FIL2_Start(PGA_FIL2_HIGHPOWER);
mov A,3
xcall _PGA_FIL2_Start
.dbline 36
; PGA_OUT_Start(PGA_OUT_HIGHPOWER);
mov A,3
xcall _PGA_OUT_Start
.dbline 37
; SPIS_Start(SPIS_LSB_FIRST);
mov A,-128
xcall _SPIS_Start
pop X
.dbline 39
;
; PGA_FIL2_GAIN_CR1 |= 0x40;
or REG[122],64
.dbline 40
; PGA_FIL2_GAIN_CR2 &= ~0x40;
and REG[123],-65
.dbline 44
; //enable comparator bus and disable the output latch
; // but comparator bus is column clock synchronized still
;
; OpenExchange();
xcall _OpenExchange
.dbline 45
; M8C_EnableGInt;
or F, 01h
.dbline 47
;
; ExchangeSend("The DDS generator is ready.\n\r");
mov A,>L2
push A
mov A,<L2
push A
xcall _ExchangeSend
add SP,-2
xjmp L4
L3:
.dbline 50
;
; while(1)
; {
.dbline 51
; msb = strlen(rx_buffer)-2;
mov A,>_rx_buffer
push A
mov A,<_rx_buffer
push A
xcall _strlen
add SP,-2
sub [__r1],2
sbb [__r0],0
mov [_msb],[__r1]
.dbline 52
; switch (rx_buffer[msb])
mov [__r1],[_msb]
mov [__r0],0
add [__r1],<_rx_buffer
adc [__r0],>_rx_buffer
mvi A,[__r1]
mov [X+1],A
mov [X+0],0
cmp [X+0],0
jnz X2
cmp [X+1],70
jz L9
X2:
cmp [X+0],0
jnz X3
cmp [X+1],71
jz L14
X3:
mov A,[X+0]
xor A,-128
mov [__rY],A
mov A,0
xor A,-128
mov [__rZ],A
mov [__rX],0
mov A,[X+1]
sub A,70
or [__rX],A
mov A,[__rY]
sbb A,[__rZ]
or [__rX],A
jc L7
X4:
L18:
cmp [X+0],0
jnz X5
cmp [X+1],102
jz L9
X5:
cmp [X+0],0
jnz X6
cmp [X+1],103
jz L14
X6:
xjmp L7
X0:
.dbline 53
; {
L9:
.dbline 56
; case 'f':
; case 'F':
; rx_buffer[msb] = 0;
mov [__r1],[_msb]
mov [__r0],0
add [__r1],<_rx_buffer
adc [__r0],>_rx_buffer
mov A,0
mvi [__r1],A
.dbline 57
; dphase = FREQ_MULT*atof(rx_buffer);
mov A,>_rx_buffer
push A
mov A,<_rx_buffer
push A
xcall _atof
add SP,-2
mov A,[__r0]
push A
mov A,[__r1]
push A
mov A,[__r2]
push A
mov A,[__r3]
push A
mov A,69
push A
mov A,-122
push A
mov A,56
push A
mov A,0
push A
xcall __fpmul
pop A
mov [__r3],A
pop A
mov [__r2],A
pop A
mov [__r1],A
pop A
mov [__r0],A
add SP,-4
mov A,79
push A
mov A,0
push A
push A
push A
mov A,[__r0]
push A
mov A,[__r1]
push A
mov A,[__r2]
push A
mov A,[__r3]
push A
xcall __fpcmp
add SP,-8
cmp A,-1
jz L11
mov A,79
push A
mov A,0
push A
push A
push A
mov A,[__r0]
push A
mov A,[__r1]
push A
mov A,[__r2]
push A
mov A,[__r3]
push A
xcall __fpsub
pop A
mov [__r7],A
pop A
mov [__r6],A
pop A
mov [__r5],A
pop A
add SP,-4
push A
mov A,[__r5]
push A
mov A,[__r6]
push A
mov A,[__r7]
push A
xcall __fp2long
pop A
mov [__r7],A
pop A
mov [__r6],A
pop A
mov [__r5],A
pop A
mov [__r4],A
mov A,[__r7]
mov [X+5],A
mov A,[__r6]
adc A,0
mov [X+4],A
mov A,[__r5]
adc A,0
mov [X+3],A
mov A,[__r4]
adc A,-128
mov [X+2],A
xjmp L12
L11:
mov A,[__r0]
push A
mov A,[__r1]
push A
mov A,[__r2]
push A
mov A,[__r3]
push A
xcall __fp2long
pop A
mov [__r3],A
pop A
mov [__r2],A
pop A
mov [__r1],A
pop A
mov [X+2],A
mov A,[__r1]
mov [X+3],A
mov A,[__r2]
mov [X+4],A
mov A,[__r3]
mov [X+5],A
L12:
mov A,[X+2]
mov [_dphase],A
mov A,[X+3]
mov [_dphase+1],A
mov A,[X+4]
mov [_dphase+2],A
mov A,[X+5]
mov [_dphase+3],A
.dbline 58
; ExchangeSend("The frequency was set well.\n\r");
mov A,>L13
push A
mov A,<L13
push A
xcall _ExchangeSend
add SP,-2
.dbline 59
; break;
xjmp L7
L14:
.dbline 63
;
; case 'g':
; case 'G':
; rx_buffer[msb] = 0;
mov [__r1],[_msb]
mov [__r0],0
add [__r1],<_rx_buffer
adc [__r0],>_rx_buffer
mov A,0
mvi [__r1],A
.dbline 64
; lsb = atoi(rx_buffer);
mov A,>_rx_buffer
push A
mov A,<_rx_buffer
push A
xcall _atoi
add SP,-2
mov [_lsb],[__r1]
.dbline 65
; if (lsb < GAIN_LEVELS)
cmp [_lsb],22
jnc L7
X8:
.dbline 66
; {
.dbline 67
; PGA_OUT_SetGain(gain_table[lsb]);
mov [__r1],[_lsb]
mov [__r0],0
asl [__r1]
rlc [__r0]
add [__r1],<_gain_table
adc [__r0],>_gain_table
mov A,[__r0]
push X
push A
mov X,[__r1]
romx
pop A
inc X
adc A,0
romx
xcall _PGA_OUT_SetGain
pop X
.dbline 68
; ExchangeSend("The gain was set well.\n\r");
mov A,>L17
push A
mov A,<L17
push A
xcall _ExchangeSend
add SP,-2
.dbline 69
; }
.dbline 70
; break;
.dbline 73
;
; default:
; break;
L7:
.dbline 76
; }
;
; ready = TRUE;
mov [_ready],1
xjmp L20
L19:
.dbline 79
;
; while(ready)
; {
.dbline 80
; accum += dphase;
mov A,[_dphase+3]
add [_accum+3],A
mov A,[_dphase+2]
adc [_accum+2],A
mov A,[_dphase+1]
adc [_accum+1],A
mov A,[_dphase]
adc [_accum],A
.dbline 81
; SB(adr,0) = SB(accum,0);
mov [_adr],[_accum]
.dbline 82
; SB(adr,1) = SB(accum,1);
mov [_adr+1],[_accum+1]
.dbline 83
; if (SB(accum,0) & QUATER_BIT) adr ^= 0xFFFF;
tst [_accum],4
jz L24
.dbline 83
xor [_adr+1],-1
xor [_adr],-1
L24:
.dbline 84
; adr &= TABLE_MASK;
and [_adr+1],-1
and [_adr],3
.dbline 86
;
; msb = lsb = sin_table[adr];
mov A,[_adr+1]
add A,<_sin_table
mov [__r1],A
mov A,[_adr]
adc A,>_sin_table
push X
mov X,[__r1]
romx
pop X
mov [__r0],A
mov [_lsb],A
mov [_msb],[_lsb]
.dbline 88
;
; msb >>= 3;
mov A,[_msb]
asr A
asr A
asr A
and A,31
mov [_msb],A
.dbline 89
; msb |= 0x80;
or [_msb],-128
.dbline 91
;
; lsb &= 0x07;
and [_lsb],7
.dbline 92
; lsb <<= 2;
asl [_lsb]
asl [_lsb]
.dbline 93
; lsb |= 0x80;
or [_lsb],-128
.dbline 95
;
; if (SB(accum,0) & SIGN_BIT)
tst [_accum],8
jz L26
.dbline 96
; msb |= 0x20;
or [_msb],32
mov A,[_msb]
xjmp L27
L26:
.dbline 98
; else
; lsb |= 0x20;
or [_lsb],32
mov A,[_lsb]
L27:
.dbline 100
or reg[65h], 01h
.dbline 101
mov A,[_msb]
mov REG[-128],A
.dbline 102
and reg[65h], FEh
.dbline 103
mov A,[_lsb]
mov REG[-112],A
.dbline 106
L20:
.dbline 78
cmp [_ready],0
jnz L19
.dbline 108
L4:
.dbline 49
xjmp L3
X1:
.dbline -2
.dbline 109
;
; M8C_Stall;
; DAC_MSB_CR0 = msb;
; M8C_Unstall;
; DAC_LSB_CR0 = lsb;
; //instead it, the fixed version DAC_WriteStall2B(lsb, msb) can be used
; //but you have less time reserve
; }
;
; }
; }
L1:
add SP,-6
pop X
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile ./main.c
_lsb:
.blkb 1
.dbsym s lsb _lsb c
_msb:
.blkb 1
.dbsym s msb _msb c
.area lit(rom, con, rel)
L17:
.byte 'T,'h,'e,32,'g,'a,'i,'n,32,'w,'a,'s,32,'s,'e,'t
.byte 32,'w,'e,'l,'l,46,10,13,0
L13:
.byte 'T,'h,'e,32,'f,'r,'e,'q,'u,'e,'n,'c,'y,32,'w,'a
.byte 's,32,'s,'e,'t,32,'w,'e,'l,'l,46,10,13,0
L2:
.byte 'T,'h,'e,32,'D,'D,'S,32,'g,'e,'n,'e,'r,'a,'t,'o
.byte 'r,32,'i,'s,32,'r,'e,'a,'d,'y,46,10,13,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -