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

📄 fax.asm

📁 智能电话系统的全部C-51,ASM51源程序 59K
💻 ASM
📖 第 1 页 / 共 4 页
字号:
		push    dph
;
                setb    p1.4
		anl     psw, #0e7h      ;swapping to area 1
		orl     psw, #08h
;
		mov     dptr, #40h
		movx    a, @dptr
		push    acc
		jnb     acc.0, chkring1   ;
;
;       check interrupt type
		mov     dptr, #r3fa
		movx    a, @dptr
		anl     a, #07h
		jnb     acc.0, nochkring  ;
chkring1:       ljmp    chkring
;
nochkring:      cjne    a, #06h, recvfull
;       error processing
		push    acc
		mov     dptr, #r3fd
		movx    a, @dptr
		jb      acc.1, recverr
		jb      acc.2, recverr
		jb      acc.3, recverr
		jb      acc.4, recverr
recverr:        mov     dptr, #r3f8
		movx    a, @dptr
		pop     acc
;
recvfull:       cjne    a, #04h, holdempt
;       receiving a character from the fax
		push    acc
		mov     dptr, #r3f8
		movx    a, @dptr
		lcall   wrrecvqu
		pop     acc
;
;        push    p1
;        mov     p1, #hi_mem
;        mov     dptr, #faxr_rd     ;read pointer(lower byte)
;        movx    a, @dptr
;        mov     b, a
;        mov     dptr, #faxr_wr     ;write pointer(lower byte)
;        movx    a, @dptr
;        clr     c
;        subb    a, b
;        clr     c
;        subb    a, #0b0h    ;if more than 60h bytes in the vt100 queue
;        jc      czsl
;        mov     a, #xoff
;        setb    p1.4
;        mov     dptr, #r3f8
;        movx    @dptr, a
;czsl:   pop     p1
	ljmp    noint
;
holdempt:       cjne    a, #02h, msrchged
;       transfering a character to the fax
		push    acc
		lcall   rdtranqu
		jnc     nosend
		lcall   faxsend
nosend:         pop     acc
;
		ljmp    chkring
;
;       get function byte
msrchged:       lcall   getfunc
		cjne    a, #func_trnsprnt, readmdm
;
		mov     dptr, #r3fe
		movx    a, @dptr
		ljmp    chkring
;
readmdm:        mov     dptr, #r3fe
		movx    a, @dptr
		jnb     acc.3, chkring
		jb      acc.7, chkring
;
;       set the system status to command
		push    p1
		mov     p1, #hi_mem
		mov     a, #sys_command
		mov     dptr, #sysstate
		movx    @dptr, a
;
		mov     a, #can
		mov     dptr, #fcancel
		movx    @dptr, a
;
		mov     a, #op_none
		lcall   setop
		pop     p1
;
chkring:        pop     acc
		push    acc
		jnb     acc.1, chkbusy
;
;       function acknownledge
		lcall   getfunc
;
		cjne    a, #func_trnsprnt, chkbusy
;
chkbusy:        pop     acc
		push    acc
		jnb     acc.2, to_noint
;
;       get operation
		lcall   getop
		cjne    a, #op_record, to_noint
;
;
;       one busy tone detected
		push    p1
		mov     p1, #hi_mem
		mov     dptr, #timerintcnt
		movx    a, @dptr
;
;       last busy time 
		push    acc
		mov     dptr, #lastbusy
		movx    a, @dptr
		mov     b, a
		pop     acc
;
		movx    @dptr, a
		clr     c
		subb    a, b
		jnc     chkbusy_0
		cpl     a
		inc     a
chkbusy_0:      push    p1
		mov     p1, #lo_mem
		push    acc
;;;                add     a, #30h                 ; '0,1,..9,a,b,c'
;;;                lcall   wrcomtqu
;;;                setb    ti
;;;                pop     acc
;
		mov     dptr, #telebusy
		movx    a, @dptr
		mov     b, a
		pop     acc
		movx    @dptr, a
		clr     c
		subb    a, b
		jnc     chkbusy_1
		cpl     a
		inc     a
chkbusy_1:      pop     p1
;                
		mov     dptr, #busycounter
;;;                cjne    a, #014h, nobusy1
;;;                ljmp    nobusy2
;
;;;nobusy1:        cjne    a, #015h, nobusy3
;
		clr     c
		subb    a, #01h
		jnc     nobusy3
;
;       busy counter
;
nobusy2:        movx    a, @dptr
		inc     a
		movx    @dptr, a
		ljmp    nobusy4
;
to_noint:       ljmp    noint
;
nobusy3:        mov     a, #0h
		movx    @dptr, a
;       is sixth busy tone ?
nobusy4:        cjne    a, #08h, nobusy6     ; 1996,10,17
;
		mov     a, #00h
		movx    @dptr, a
		mov     p1, #lo_mem
		mov     dptr, #telebusy1
		movx    a, @dptr
		inc     a
		movx    @dptr, a
		mov     r2, #02h
		cjne    a, #03h, nobusy7
		pop     p1
		sjmp    nobusy5
;
nobusy7:        mov     r1, #0ffh
nobusy8:        mov     r0, #0ffh
nobusy9:        nop
		djnz    r0, nobusy9
		djnz    r1, nobusy8
		djnz    r2, nobusy7
;
nobusy6:        pop     p1
		sjmp    noint
;
;       recorder finish
nobusy5:        lcall   hukon
		lcall   tohand
;
;       return idle status
		push    p1
		mov     p1, #hi_mem
		mov     dptr, #busycounter
		mov     a, #0
		movx    @dptr, a
;
		mov     a, #sys_command
		mov     dptr, #sysstate
		movx    @dptr, a
;
		mov     a, #op_none
		lcall   setop
		pop     p1
;
noint:          pop     acc
;
;       clear ip flag
		mov     dptr, #intreg
		movx    @dptr, a
;
		pop     dph
		pop     dpl
		pop     acc
		pop     b
		pop     p1
		pop     psw
		reti
;
;############################################################################
;               entry:  wrrecvqu          ;added aug.2,1995
;               function:  write a byte to fax/modem receiving queue
;               input:  a
;############################################################################
;
wrrecvqu:       push    b
		push    p1
		push    dpl
		push    dph
                mov     p1,#lo_mem              ;;; #hi_mem
;
;       get the lower byte of the write pointer
		push    acc
		mov     dptr, #faxr_wr   ;lower byte
		movx    a, @dptr
		mov     b, a
		inc     a
		movx    @dptr, a
		pop     acc
;
;       compose the write pointer 
		mov     dph, #faxr_ptr   ;base address( high byte )
		mov     dpl, b
		movx    @dptr, a
;
		pop     dph
		pop     dpl
		pop     p1
		pop     b
		ret

;############################################################################
;               entry:  rdtranqu          ;added aug.2,1995
;               function:  read a byte from fax/modem transfering queue
;               return: jc, received in a
;                       jnc, nothing received
;############################################################################
;
rdtranqu:       push    b
		push    p1
		push    dpl
		push    dph
                mov     p1,#lo_mem              ;;; #hi_mem
;
;       check if the queue is empty
		mov     dptr, #faxt_rd   ;read pointer(lower byte)
		movx    a, @dptr
		mov     b, a
		mov     dptr, #faxt_wr   ;write pointer(lower byte)
		movx    a, @dptr
		clr     c
		subb    a, b
		jnz     faxtrcvd
;
;       disable interrupt for the empty request
                setb    p1.4
		mov     dptr, #r3f9
		movx    a, @dptr
		anl     a, #0fdh
		movx    @dptr, a
;
		clr     c
		pop     dph
		pop     dpl
		pop     p1
		pop     b
		ret
;       get the lower byte of the read pointer
faxtrcvd:       mov     dptr, #faxt_rd   ;read pointer( lower byte )
		movx    a, @dptr
		mov     b, a
		inc     a
		movx    @dptr, a
;
;       compose the read pointer
		mov     dph, #faxt_ptr   ;base address( high byte )
		mov     dpl, b
		movx    a, @dptr
;
		setb    c
		pop     dph
		pop     dpl
		pop     p1
		pop     b
		ret
;

;############################################################################
;       entry:          faxsend
;       function:       fax sending a character
;       input:          a character to be transmitted
;       used registers: a
;############################################################################
;
faxsend:        push    p1
                setb    p1.4
;
		push    dpl
		push    dph
;
		push    acc
;
;       reading line status register
busychk:        mov     dptr, #r3fd
		movx    a, @dptr
		jb      acc.0, echoback
		jb      acc.1, echoback
		jb      acc.2, echoback
		jb      acc.3, echoback
		jb      acc.4, echoback
		jnb     acc.5, busychk
		ljmp    sending
havingdata:     lcall   wrrecvqu
		sjmp    busychk
;
echoback:       mov     dptr, #r3f8
		movx    a, @dptr
		ljmp    busychk
;
sending:        pop     acc
;
;       sending a byte to data port
		mov     dptr, #r3f8
		movx    @dptr, a
;
		pop     dph
		pop     dpl
		pop     p1
;
		ret
;
;############################################################################
;       entry:          setop
;       function:       set opertion
;       input:          operation byte in acc
;############################################################################
;
setop:          push    p1
		push    dpl
		push    dph
		mov     p1, #hi_mem
		mov     dptr, #operateptr
		movx    @dptr, a
;
		cjne    a, #op_none, qsetop
		mov     a, #0h
		mov     dptr, #recordring
		movx    @dptr, a
;
qsetop:         pop     dph
		pop     dpl
		pop     p1
		ret
;
;############################################################################
;       entry:          getop
;       function:       get current opertion
;       return:         operation byte in acc
;############################################################################
;
getop:          push    p1
		push    dpl
		push    dph
		mov     p1, #hi_mem
		mov     dptr, #operateptr
		movx    a, @dptr
		pop     dph
		pop     dpl
		pop     p1
		ret

;*******************
;* revice a char  *
;*******************

s_rcvchar:      nop
                lcall  rdrecvqu
                jc     havedata
                mov     r6,#0ffh
                mov     r7,#0ffh
                ret
havedata:       mov     r6,#0h
                mov     r7,a
                ret

;############################################################################
;               entry:  rdrecvqu          ;added aug.2,1995
;               function:  read a byte from fax/modem receiving queue
;               return: jc, received in a
;                       jnc, nothing received
;############################################################################
;
rdrecvqu:       push    b
		push    p1
		push    dpl
		push    dph
                mov     p1, #lo_mem      ;;;  #hi_mem
;
;       check if the queue is empty
		mov     dptr, #faxr_rd   ;read pointer(lower byte)
		movx    a, @dptr
		mov     b, a
		mov     dptr, #faxr_wr   ;write pointer(lower byte)
		movx    a, @dptr
		clr     c
		subb    a, b
		jnz     faxrrcvd
		clr     c               ;the queue is empty
		pop     dph
		pop     dpl
		pop     p1
		pop     b
		ret
;
;       get the lower byte of read pointer
faxrrcvd:       mov     dptr, #faxr_rd
		movx    a, @dptr
		mov     b, a
		inc     a
		movx    @dptr, a
;
;       compose the read pointer
		mov     dph, #faxr_ptr   ;base address(high byte)
		mov     dpl, b
		movx    a, @dptr
;
		setb    c
		pop     dph
		pop     dpl
		pop     p1
		pop     b
		ret
;
; 82.   void sleep(int milliseconds)
; 83.	/*
; 84.	          功能          延时毫秒
; 85.	*/
; 86.	{}
sleep:
;
        MOV	A,R7
        mov     r0,a
        lcall   delay
;
        RET

;############################################################################
;       entry:          offline
;       function:       switch to voice
;############################################################################
;
offline:        push    p1
		push    dpl
		push    dph
;
		mov     r0, #02h
		lcall   delay
;
		mov     dptr, #escape           ;'+++'
		lcall   sendcmd
;
		mov     r0, #02h
		lcall   delay
;
		mov     dptr, #hookoff          ;'ath'
		lcall   sendcmd
;
		mov     r0, #02h
		lcall   delay
;
		pop     dph
		pop     dpl
		pop     p1
		ret
;

end

⌨️ 快捷键说明

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