📄 9851_asm.asm
字号:
.include hardware.inc
.define _9851_PORT P_IOA_Data
.ram
.var FQ_UD,W_CLK,_9851_RESET,INDATA;
.var FQ_UD1,W_CLK1,_9851_RESET1,INDATA1;
.var FQ_UD2,W_CLK2,_9851_RESET2,INDATA2;
.code
.public _Reset9851
_Reset9851:.proc
push r2,r3 to [sp];
//_9851_RESET_UP
r2=[_9851_PORT];
r2|=[_9851_RESET];
[_9851_PORT]=r2;
//_9851_RESET_UP
//_9851_RESET_DOWN
r2=[_9851_PORT];
r3=[_9851_RESET];
r3^=0xffff;
r2&=r3;
[_9851_PORT]=r2;
//_9851_RESET_DOWN
pop r2,r3 from [sp];
retf;
.endp
.public _Reset9851_Dual
_Reset9851_Dual:.proc
push r2,r4 to [sp];
//_9851_RESET_UP
r2=[_9851_PORT];
r2|=[_9851_RESET1];
r2|=[_9851_RESET2];
[_9851_PORT]=r2;
//_9851_RESET_UP
//_9851_RESET_DOWN
r2=[_9851_PORT];
r3=[_9851_RESET1];
r4=[_9851_RESET2];
r3^=0xffff;
r4^=0xffff;
r2&=r3;
r2&=r4;
[_9851_PORT]=r2;
pop r2,r4 from [sp];
//_9851_RESET_DOWN
.endp
.public _ini_AD9851_Serial
_ini_AD9851_Serial:.proc
push r1,r5 to [sp];
bp=sp+1;
r1=[bp+7];
r2=[bp+8];
r3=[bp+9];
r4=[bp+10];
[_9851_RESET]=r1;
[W_CLK]=r2;
[FQ_UD]=r3;
[INDATA]=r4;
call _Reset9851;
pop r1,r5 from [sp];
retf;
.endp
.public _ini_AD9851_Serial_Dual
_ini_AD9851_Serial_Dual:.proc
push r1,r5 to [sp];
bp=sp+1;
r1=[bp+7];
r2=[bp+8];
r3=[bp+9];
r4=[bp+10];
[_9851_RESET1]=r1;
[W_CLK1]=r2;
[FQ_UD1]=r3;
[INDATA1]=r4;
r1=[bp+11];
r2=[bp+12];
r3=[bp+13];
r4=[bp+14];
[_9851_RESET2]=r1;
[W_CLK2]=r2;
[FQ_UD2]=r3;
[INDATA2]=r4;
call _Reset9851_Dual;
pop r1,r5 from [sp];
retf;
.endp
.public _ini_AD9851_Parallel
_ini_AD9851_Parallel:.proc
push r1,r5 to [sp];
bp=sp+1;
r1=[bp+7];
r2=[bp+8];
r3=[bp+9];
r4=[bp+10];
[_9851_RESET]=r1;
[W_CLK]=r2;
[FQ_UD]=r3;
[INDATA]=r4;
call _Reset9851
pop r1,r5 from [sp];
retf;
.endp
.public _AD9851_ParallelSend
_AD9851_ParallelSend:.proc
push r1,r5 to [sp];
bp=sp+1;
r1=[bp+7];
//FQ_UD_DOWN
r2=[_9851_PORT];
r3=[FQ_UD];
r3^=0xffff;
r2&=r3;
[_9851_PORT]=r2;
r4=0;
//FQ_UD_DOWN
send_data_loop:
//W_CLK_DOWN
r2=[_9851_PORT];
r3=[W_CLK];
r3^=0xffff;
r2&=r3;
[_9851_PORT]=r2;
//W_CLK_DOWN
//senddata
r2=[_9851_PORT];
r2&=0xff00;
r2|=[r1];
[_9851_PORT]=r2;
//senddata
//W_CLK_UP
r2=[_9851_PORT];
r2|=[W_CLK];
[_9851_PORT]=r2;
//W_CLK_UP
r4+=1;
r1+=1;
cmp r4,5;
jne send_data_loop
//FQ_UD_UP
r2=[_9851_PORT];
r2|=[FQ_UD];
[_9851_PORT]=r2;
//FQ_UD_UP
pop r1,r5 from [sp];
retf;
.endp
.public _AD9851_SerialSenddata
_AD9851_SerialSenddata:.proc
push r1,r5 to [sp];
bp=sp+1;
r1=[bp+7];
r2=r1;
r1+=5;
call FQ_UD_DOWN;
Serial_senddata_loop1:
//send_data
r4=0x0001;
cmp r1,r2;
je Serial_senddata_end;
r1-=1;
r3=[r1];
Serial_senddata_loop2:
test r3,r4;
jz send_0;
send_1:
call W_CLK_DOWN;
call INDATA_UP;
call W_CLK_UP;
jmp one_bit_send_end;
send_0:
call W_CLK_DOWN;
call INDATA_DOWN;
call W_CLK_UP;
one_bit_send_end:
r4=r4 lsl 1;
cmp r4,0x0100;
je Serial_senddata_loop1;
jmp Serial_senddata_loop2;
//send_data_end
Serial_senddata_end:
call FQ_UD_UP;
pop r1,r5 from [sp];
retf;
.endp
.public _AD9851_SerialSenddata_Dual
_AD9851_SerialSenddata_Dual:.proc
push r1,r5 to [sp];
bp=sp+1;
r1=[bp+7];
r2=r1;
r2+=2;
r1+=6;
call FQ_UD_DOWN_DUAL;
Serial_senddata_loop1_DUAL:
//send_data
r4=0x0001;
cmp r1,r2;
je Serial_senddata_end_DUAL;
r1-=1;
r3=[r1];
Serial_senddata_loop2_DUAL:
test r3,r4;
jz send_0_DUAL;
send_1_DUAL:
call W_CLK_DOWN_DUAL;
call INDATA_UP_DUAL;
call W_CLK_UP_DUAL;
jmp one_bit_send_end_DUAL;
send_0_DUAL:
call W_CLK_DOWN_DUAL;
call INDATA_DOWN_DUAL;
call W_CLK_UP_DUAL;
one_bit_send_end_DUAL:
r4=r4 lsl 1;
cmp r4,0x0100;
je Serial_senddata_loop1_DUAL;
jmp Serial_senddata_loop2_DUAL;
//send_data_end
Serial_senddata_end_DUAL:
r3=[bp+7];
r4=r3+1;
r1=[r3];
r2=[r4];
r4=0x0001;
Serial_senddata_loop3_DUAL:
call W_CLK_DOWN_DUAL;
r3=[_9851_PORT];
test r1,r4;
jz firstis0
firstis1:
r3|=[INDATA1];
test r2,r4;
jz secendis0;
r3|=[INDATA2];
jmp Serial_senddata_loop3_DUAL_end;
firstis0:
r5=[INDATA1];
r5^=0xffff;
r3&=r5;
test r2,r4;
jz secendis0;
r3|=[INDATA2];
jmp Serial_senddata_loop3_DUAL_end;
secendis0:
r5=[INDATA2];
r5^=0xffff;
r3&=r5;
Serial_senddata_loop3_DUAL_end:
[_9851_PORT]=r3;
nop;
call W_CLK_UP_DUAL;
r4=r4 lsl 1;
cmp r4,0x0100;
jne Serial_senddata_loop3_DUAL;
call FQ_UD_UP_DUAL;
pop r1,r5 from [sp];
retf;
.endp
.PUBLIC _SetToSerialMode
_SetToSerialMode:.proc
call W_CLK_DOWN;
call W_CLK_UP;
nop;
call FQ_UD_DOWN;
call FQ_UD_UP;
retf;
.endp
.PUBLIC _SetToSerialMode_Dual
_SetToSerialMode_Dual:.proc
call _Reset9851_Dual;
call W_CLK_DOWN_DUAL;
call W_CLK_UP_DUAL;
nop;
call FQ_UD_DOWN_DUAL;
call FQ_UD_UP_DUAL;
retf;
.endp
.public _add_array
_add_array:.proc
push r1,r5 to [sp];
bp=sp+1;
r1=[bp+7];
r2=[bp+8];
bp=r1;
r3=[bp+2];
r3=r3 lsl 4;
r3=r3 lsl 4;
r3+=[bp+3];
r4=[bp];
r4=r4 lsl 4;
r4=r4 lsl 4;
r4+=[bp+1];
r3+=r2;
r4+=0,carry;
r1=r3;
r1&=0x00ff;
[bp+3]=r1;
r3=r3 lsr 4;
r3=r3 lsr 4;
[bp+2]=r3;
r1=r4;
r1&=0x00ff;
[bp+1]=r1;
r4=r4 lsr 4;
r4=r4 lsr 4;
[bp]=r4;
pop r1,r5 from [sp];
retf;
.endp
.public _ini_system
_ini_system:.proc
push r1,r5 to [sp];
r1=0xffff;
[P_IOA_Dir]=r1;
[P_IOA_Attrib]=r1;
r1=0x00ff;
[P_IOA_Data]=r1;
// r1=0xe0;
// [P_SystemClock]=r1;
pop r1,r5 from [sp];
retf;
.endp
.public FQ_UD_DOWN
FQ_UD_DOWN:.proc
push r2,r3 to [sp];
//FQ_UD_DOWN
r2=[_9851_PORT];
r3=[FQ_UD];
r3^=0xffff;
r2&=r3;
[_9851_PORT]=r2;
//FQ_UD_DOWN
pop r2,r3 from [sp];
retf;
.endp
.public FQ_UD_UP
FQ_UD_UP:.proc
push r2 to [sp];
//FQ_UD_UP
r2=[_9851_PORT];
r2|=[FQ_UD];
[_9851_PORT]=r2;
//FQ_UD_UP
pop r2 from [sp];
retf;
.endp
.public W_CLK_DOWN
W_CLK_DOWN:
push r2,r3 to [sp];
//W_CLK_DOWN
r2=[_9851_PORT];
r3=[W_CLK];
r3^=0xffff;
r2&=r3;
[_9851_PORT]=r2;
//W_CLK_DOWN
pop r2,r3 from [sp];
retf;
.endp
.public W_CLK_UP
W_CLK_UP:
push r2 to [sp];
//W_CLK_UP
r2=[_9851_PORT];
r2|=[W_CLK];
[_9851_PORT]=r2;
//W_CLK_UP
pop r2 from [sp];
retf;
.endp
.public INDATA_DOWN
INDATA_DOWN:
push r2,r3 to [sp];
//INDATA_DOWN
r2=[_9851_PORT];
r3=[INDATA];
r3^=0xffff;
r2&=r3;
[_9851_PORT]=r2;
//INDATA_DOWN
pop r2,r3 from [sp];
retf;
.endp
.public INDATA_UP
INDATA_UP:
push r2 to [sp];
//INDATA_UP
r2=[_9851_PORT];
r2|=[INDATA];
[_9851_PORT]=r2;
//INDATA_UP
pop r2 from [sp];
retf;
.endp
.public FQ_UD_DOWN_DUAL
FQ_UD_DOWN_DUAL:.proc
push r2,r4 to [sp];
//FQ_UD_DOWN
r2=[_9851_PORT];
r3=[FQ_UD1];
r4=[FQ_UD2];
r3^=0xffff;
r4^=0xffff;
r2&=r3;
r2&=r4;
[_9851_PORT]=r2;
//FQ_UD_DOWN
pop r2,r4 from [sp];
retf;
.endp
.public FQ_UD_UP_DUAL
FQ_UD_UP_DUAL:.proc
push r2 to [sp];
//FQ_UD_UP
r2=[_9851_PORT];
r2|=[FQ_UD1];
r2|=[FQ_UD2];
[_9851_PORT]=r2;
//FQ_UD_UP
pop r2 from [sp];
retf;
.endp
.public W_CLK_DOWN_DUAL
W_CLK_DOWN_DUAL:
push r2,r4 to [sp];
//W_CLK_DOWN
r2=[_9851_PORT];
r3=[W_CLK1];
r4=[W_CLK2];
r3^=0xffff;
r4^=0xffff;
r2&=r3;
r2&=r4;
[_9851_PORT]=r2;
//W_CLK_DOWN
pop r2,r4 from [sp];
retf;
.endp
.public W_CLK_UP_DUAL
W_CLK_UP_DUAL:
push r2 to [sp];
//W_CLK_UP
r2=[_9851_PORT];
r2|=[W_CLK1];
r2|=[W_CLK2]
[_9851_PORT]=r2;
//W_CLK_UP
pop r2 from [sp];
retf;
.endp
.public INDATA_DOWN_DUAL
INDATA_DOWN_DUAL:
push r2,r4 to [sp];
//INDATA_DOWN
r2=[_9851_PORT];
r3=[INDATA1];
r4=[INDATA2];
r3^=0xffff;
r4^=0xffff;
r2&=r3;
r2&=r4;
[_9851_PORT]=r2;
//INDATA_DOWN
pop r2,r4 from [sp];
retf;
.endp
.public INDATA_UP_DUAL
INDATA_UP_DUAL:
push r2 to [sp];
//INDATA_UP
r2=[_9851_PORT];
r2|=[INDATA1];
r2|=[INDATA2];
[_9851_PORT]=r2;
//INDATA_UP
pop r2 from [sp];
retf;
.endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -