?? fax.asm
字號:
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 + -