⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cid.asm

📁 cid file. the prgram is used to get caller id
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        R1 = [P_Seg12];
        R1 |= B_Com3;
        [P_Seg12] = R1;
        RETF;

StartParseFsk:
        R1 = 0;
        bp = SW_CidBuf                  //clear CID buffer
?L_ClrCidBufLoop:
        [bp++] = r1
        cmp     bp,SW_CidBuf+CW_LenOfCidBuf
        jb      ?L_ClrCidBufLoop

        bp = FskCidBuf
        r1 = [bp++]
        r2 = r1 lsr 4
        r2 = r2 lsr 4
        r1 &= 0x00ff                    //Get CID type byte

        CMP     R1,0x0090;
        JZ      ?JapanFsk;
        [RW_FskTotalByteCnt] = r2       //Get whole CID byte length

        cmp     r1,0x0004
        jz      ?FSKIsSingle            //It is single format FSK CID
        cmp     r1,0x0006
        jz      ?FSKIsSingle            //It also is single format FSK CID

        CMP     R1,0x0080;
        JNZ     ?ParseFSKOver;
        call    F_ParseMultiFsk;         //Call function of parse multiple
        RETF;

?JapanFsk:
        R1 = 5;
        [RPtr_FskByteIndex] = R1;

        CALL    F_GetOneByte;
        CMP     R1,0x00C0;
        JNZ     ?ParseFSKOver;

        CALL    F_GetOneByte;
//        CMP     R1,0x0090;       //'DLE'
//        JNZ     ?JapanFsk_10;
//        CALL    F_GetOneByte;
//?JapanFsk_10:
        R1 &= 0x007F;
        [RW_FskTotalByteCnt] = R1;
        [RW_FskByteCnt] = R1;

        GoTo    F_ParseJapanFsk;

?FSKIsSingle:
        GoTo    F_ParseSingleFSK;

?ParseFSKOver:
        retf

//-----------------------------------------------------------------------
F_ParseJapanFsk:
        R2 = [RPtr_FskByteIndex];
        CMP     R2,[RW_FskTotalByteCnt];
        JB      ParseJapanFsk_10;
        RETF;

ParseJapanFsk_10:
        CALL    F_GetOneByte;
        R4 = R1;

        CALL    F_GetOneByte;
//        CMP     R1,0x0090;        //'DLE'
//        JNZ     ParseJapanFsk_20;
//        CALL    F_GetOneByte;
//
//        R3 = [RPtr_FskByteIndex];
//        R3 += 1;
//        [RPtr_FskByteIndex] = R3;
//
//ParseJapanFsk_20:
        R3 = R1 AND 0x007F;
        R1 = R4;

        CMP     R1,0x0082;      //number field
        JNZ     F_ParseJapanFsk;
        CALL    F_ParseJapanFskNumber;
        JMP     F_ParseJapanFsk;

ParseJapanFsk_99:
        RETF;

//----------------------------------------------------------------------------*/
// Input  : R3 - loop counter
//----------------------------------------------------------------------------*/
F_ParseJapanFskNumber:
        R1 = 0;
        CMP     R3,14;
        JAE     ParseJapanFskNumber_05;
        R1 = 14;
        R1 -= R3;
ParseJapanFskNumber_05:
        [RPtr_LcdDigit] = R1;

        PUSH    R3,R3 TO [SP];

        CMP     R3,0;
        JZ      ParseJapanFskNumber_99;  // loop counter = 0
ParseJapanFskNumber_10:
        CALL    F_GetOneByte;
        R1 &= 0x007F;
        CMP     R1,' ';
        JZ      ParseJapanFskNumber_35;
//        CMP     R1,'-';
//        JZ      ParseJapanFskNumber_35;

        CMP     R1,0x0039;
        JA      ParseJapanFskNumber_35;  //illegal
        CMP     R1,0x0030;
        JB      ParseJapanFskNumber_35;  //legal

        R1 &= 0x000F;
        JNZ     ParseJapanFskNumber_20;
        R1 = 0x000A;
ParseJapanFskNumber_20:
        BP = [RPtr_LcdDigit];
        R4 = BP;
        BP = BP LSL 4;
        BP -= R4;
        BP += Digit0;
        PUSH    R3 TO [SP];
        CALL    F_ShowDigit;
        POP     R3 FROM [SP];

        BP = [RPtr_LcdDigit];
        BP += 1;
        [RPtr_LcdDigit] = BP;
        CMP     BP,14;
        JAE     ParseJapanFskNumber_99;

ParseJapanFskNumber_35:
        R3 -= 1;
        JNZ     ParseJapanFskNumber_10;
ParseJapanFskNumber_99:

        POP     R3,R3 FROM [SP];
        R2 = [RPtr_FskByteIndex];
        [RPtr_FskByteIndex] = R2 + R3;
        RETF;

//-----------------------------------------------------------------------
F_ParseMultiFsk:
        BP = FskCidBuf;
        R1 = [BP++];
        R1 = R1 LSR 4;
        R1 = R1 LSR 4;
        [RW_FskByteCnt] = R1;

        R1 = 0x0002;
        [RPtr_FskByteIndex] = R1;
ParseMultiFsk_05:
        R1 = [RPtr_FskByteIndex];
        R1 -= 2;
        CMP     R1,[RW_FskTotalByteCnt];
        JAE     ParseMultiFsk_99;

        CALL    F_GetOneByte;
        CMP     R1,0x0001;
        JNZ     ParseMultiFsk_10;
        CALL    F_GetOneByte;
        CMP     R1,8;
        JNZ     SkipThisField_10;

        CALL    F_GetFourBytes;
        [RW_Date] = R4;
        CALL    F_GetFourBytes;
        [RW_Time] = R4;

        CALL    F_ShowMonthDay;

        R1 = [P_ColonSeg];
        R1 |= B_ColonCom;
        [P_ColonSeg] = R1;

        CALL    F_ShowDate;
        CALL    F_ShowTime;
        JMP     ParseMultiFsk_05;

ParseMultiFsk_10:
        CMP     R1,0x0002;
        JNZ     SkipThisField;
        CALL    F_GetOneByte;
        R3 = R1;
        CALL    F_ParseFSKNumber;
        JMP     ParseMultiFsk_05;

SkipThisField:
        CALL    F_GetOneByte;
SkipThisField_10:
        R1 += [RPtr_FskByteIndex];
        [RPtr_FskByteIndex] = R1;
        JMP     ParseMultiFsk_05;

ParseMultiFsk_99:
        RETF;

//-----------------------------------------------------------------------
F_ParseSingleFSK:
        bp =    FskCidBuf
        r1 =    [bp++]
        cmp     r1,0x0306
        jnz     ?NotMessageInformation
        r1 =    [bp++]
        r1&=    0x7f7f
        r2 =    [BP]
        r2&=    0x007f
        cmp     r1,0x4242               //'BB'
        jnz     ?NotMessageWaiting
        cmp     R2,0x0042               //'B'
        jnz     ?L_NoInformation
        call    F_ShowMessageFlag       //message waiting
        jmp     ?L_NoInformation

?NotMessageWaiting:
        cmp     r1,0x6F6F               //'oo'
        jnz     ?L_NoInformation
        cmp     r2,0x006F               //'o'
        jnz     ?L_NoInformation
        call    F_ClrMessageFlag        //message off
?L_NoInformation:
        jmp     ?L_ParseSingOver

//--------------------------------------------------------------
?NotMessageInformation:
        bp =    FskCidBuf
        r1 =    [bp++]                  //Get first word of CID data
        r1 =    r1 lsr 4
        r1 =    r1 lsr 4                //Shift it to get length byte
        cmp     r1,0x0008               //Check if length of CID less
                                        //than 8 bytes
        jl      ?L_ParseSingOver        //Yes, it's without reason,
                                        //not parse it
        [RW_FskByteCnt] = r1            //More than 8 bytes, save length
        r1 =    0x0002
        [RPtr_FskByteIndex]= r1         //Data pointer point to third byte

        r3 =    0x0000
        call    F_GetFourBytes          //Get 4 bytes from CID data buffer,
                                        //translate them into BCD code
                                        //and save then into r4.
        [RW_Date] = r4                  //Those 4 number is date
        call    F_GetFourBytes          //Get 4 bytes
        [RW_Time] = r4                  //Those 4 number is time
        call    F_ShowMonthDay          //Show month flag and day flag on LCD
        r1 =    [P_ColonSeg]
        r1|=    B_ColonCom
        [P_ColonSeg] = r1               //Show ":" between hour and minute on LCD
        call    F_ShowDate              //Show month and day on LCD
        call    F_ShowTime              //Show hour and minute on LCD

        r3 =    [RW_FskByteCnt]
        r3-=    8                       //Is there any byte afer time bytes?
        jz      ?L_SingleOut            //No, Out of area
        r1 =    [FskCidBuf+5]           //Check if this CID out of area or private
        r1&=    0x007f
        cmp     r1,0x0070               //private, 'p'
        jz      ?L_SinglePirvate
        cmp     r1,0x0050               //private, 'P'
        jz      ?L_SinglePirvate
        cmp     r1,0x006F               //out of area, 'o'
        jz      ?L_SingleOut
        cmp     r1,0x004f               //out of area, 'O'
        jnz     ?L_SingleHaveNumber     //either out of area nor private
?L_SingleOut:
        call    F_ShowOutOfAreaFlag     //Out of area, show correspond flag
        jmp     ?L_ParseSingOver

?L_SinglePirvate:
        call    F_ShowPrivateFlag       //Private, show correspond flag
        jmp     ?L_ParseSingOver

?L_SingleHaveNumber:
        call    F_ParseFSKNumber
?L_ParseSingOver:
        retf

//----------------------------------------------------------------------
F_ParseFSKNumber:
        r1 =    0x0000                  //Initial CID display position
        cmp     r3,14                   //Compare CID number's length
                                        //with LCD display number's
        jae     ?L_CIDBufPtrOk          //Above or equal, display from segment 0
        r1 =    14                      //Below, calculate display position
        r1-=    r3
?L_CIDBufPtrOk:
        [RPtr_LcdDigit] = r1            //Save position for display later

?L_ParseByteLoop:
        call    F_GetOneByte            //Get one byte from CID data buffer
        r1&=    0x007f                  //Elimate bit 7
        cmp     r1,0x39                 //Check if it is a valid number
        jg      ?L_FSKNumberOver
        cmp     r1,0x30
        jL      ?L_FSKNumberOver
        r1 &=   0x000f
        jnz     ?L_FSKNotZero
        r1 =    0x000a                  //It is 0, chang to 0xa so that
                                        //it can be display as "0",not " "
?L_FSKNotZero:
        Push    r2,bp to [sp]
        r2 =    [RPtr_LcdDigit] //Get LCD digital position
        bp =    r2 lsl 4                //Calculate digital position information
        bp-=    r2                      //offset
        bp+=    Digit0                  //Calculate absolute address
        call    F_ShowDigit             //Display digit
        r2 =    [RPtr_LcdDigit]
        r2+=    0x0001                  //LCD digital position increase
        [RPtr_LcdDigit] = r2
        pop             r2,bp from [sp]
        //call  F_StoreCIDBuf
        r3-=    0x0001                  //Check if display over
        jnz             ?L_ParseByteLoop//No, display next number
?L_FSKNumberOver:
        r2 =    0x0000                  //Yes, reset display position
        [RPtr_LcdDigit] = r2
        retf

//----------------------------------------------------------------------
F_GetFourBytes:
        call    F_GetOneByte
        r4 =    r1 lsl 4
        r4 =    r4 lsl 4
        r4 =    r4 lsl 4
        call    F_GetOneByte
        r1&=    0x000f
        r1 =    r1 lsl 4
        r1 =    r1 lsl 4
        r4|=    r1
        call    F_GetOneByte
        r1&=    0x000f
        r1 =    r1 lsl 4
        r4|=    r1
        call    F_GetOneByte
        r1 =    r1&0xf
        r4|=    r1
        retf

//----------------------------------------------------------------------
F_GetOneByte:
        r2 =    [RPtr_FskByteIndex]
        bp =    FskCidBuf
        bp+=    r2 lsr 1
        r1 =    [bp]
        test    r2,1
        jz      getonebyte
        r1 =    r1 lsr 4
        r1 =    r1 lsr 4
getonebyte:
        r1&=    0x00ff
        r2+=    1
        [RPtr_FskByteIndex] = r2
        retf

//----------------------------------------------------------------------
//Interrupt Routine
.TEXT
_FIQ:
        push    r1,bp to [sp]
        r1 =    B_Ioc1Int;
        [P_IntClr] = r1         
        pop     r1,bp from [sp]
        reti 
//-----------------------------------------------------------------------
_IRQ0:  
        push    r1,bp to [sp] 
        r1 =    B_Ioc0Int+B_RiInt+B_LineInt;
        [P_IntClr] = r1
        pop     r1,bp from [sp]
        reti
//-----------------------------------------------------------------------
_IRQ1:  
        push    r1,bp to [sp]
        r1 =    B_IoaInt
        [P_IntClr] = r1
        pop     r1,bp from [sp]
        reti 
//-----------------------------------------------------------------------
_IRQ2:  
        push    r1,bp to [sp]
        r1 =    B_TmrAInt
        [P_IntClr] = r1
        pop     r1,bp from [sp]
        reti 
//-----------------------------------------------------------------------
_IRQ3:
        push    r1,bp to [sp]
        r1  =   B_TmrBInt
        [P_IntClr] = r1
        POP     R1,BP from [SP]
        reti 
//-----------------------------------------------------------------------
//_IRQ4:
//      push    r1,bp to [sp]
//      r1 =    B_T32KHzInt
//      [P_IntClr] = r1
//      pop     r1,bp from [sp]
//      reti
//-----------------------------------------------------------------------
_IRQ5:
        push    r1,bp to [sp] 

        R1 = [RW_512HzTmr];
        JZ      TimerIsOver;
        R1 -= 1;
        [RW_512HzTmr] = R1;

TimerIsOver:
        r1 =    B_T2KHzInt 
        [P_IntClr] = r1
        pop     r1,bp from [sp] 
        reti 

//-----------------------------------------------------------------------
_IRQ6:
        push    r1,bp to [sp] 
        r1 =    B_T128HzInt 
        [P_IntClr] = r1
        pop     r1,bp from [sp] 
        reti 
//-----------------------------------------------------------------------
_IRQ7:
        push    r1,bp to [sp]
        r1=     B_T8HzInt
        [P_IntClr] = r1
//      r1 =    [RW_TwoHzTmr]
//      jz      ?L_TwoHzTmrOver
//      r1-=    0x0001
//      [RW_TwoHzTmr] = r1
//?L_TwoHzTmrOver:
        pop     r1,bp from [sp] 
        reti 
//-----------------------------------------------------------------------
_BREAK:
        reti
//-----------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -