📄 serialr.asm
字号:
;* PSI St醔l Robrt */
;* */
;* SerialR (Funkce pro komunikaci po SCI) 23.06.1998 */
;************************************************************************/
; Revize 5.3.1999
serialR_seg SEGMENT CODE
serialData_seg SEGMENT DATA
VelBafr equ 8
RSEG serialData_seg
RxBafr: ds VelBafr ; bafr vstupnich vzorku
RxPoint: ds 1 ; Pozice posledniho cteneho znaku
RxPointG: ds 1 ; Pozice znaku pro f-ci get
RxCount: ds 1 ; Pocet znaku v bafru
LinkFlg: ds 1 ; Fleg volne linty (1 volno)
RxBafrMax equ RxBafr+8 ; Max hodnota bafru
RxBafrMin equ RxBafr ; Min hodnota begru
;CSEG
; ORG 0023h
; push psw
; ljmp serial_int
RSEG serialR_seg
PUBLIC serial_int ; interrupt handler
PUBLIC getkeyR ; Vycteni 1B z prijmaciho bafru
PUBLIC getCharR ; Vycte 1B (neni-li v bafru tak ceka)
PUBLIC getWordR ; Vycte 2B (neni-li...) cte Lo Hi
PUBLIC _putkeyR ; Poslani 1B na seriak
PUBLIC _putWordR ; Poslani 2B na seriak (Lo Hi)
PUBLIC in_Rx ; Pocet B v prijmacim bafru
PUBLIC init_Bafr ; Inicializace prijm. bafru
PUBLIC LinkFlg ; Priznak vysilaci linka volna
PUBLIC RxCount ; Pocet znaku v prijmacim bafru
PUBLIC Tim_out_Int ; Funkce pro obsluhu time out
; ********************************************************************
_putkeyR:
mov a,LinkFlg
jz _putkeyR
push 00h ; r0
mov a,r7
setb ti
mov sbuf,a
clr ti
mov LinkFlg,#0
pop 00h ; r0
ret
; ********************************************************************
init_Bafr: mov RxPoint,#RxBafr
mov RxPointG,#RxBafr
mov RxCount,#0
ret
; ********************************************************************
serial_int:
jnb ti,testri
mov LinkFlg,#1
clr ti
testri: jbc ri,got_ri ; check for character in buffer
ret ; reti
got_ri:
push 00h ; r0 to stack
mov a,RxCount ; V bafru je volne misto
inc a
cjne a,#VelBafr,dal
mov a,sbuf
sjmp keyexit ; Bafr je plny, konec
dal:
mov RxCount,a
mov a,RxPoint ; Rotace bafru
inc a ;
cjne a,#RxBafrMax,keyptok
mov a,#RxBafrMin ; rotace bafru preteceni
;
keyptok: mov r0,a ; load the Buffer pointer
mov a,sbuf ; get the character waiting
mov @r0,a ; save the character
mov RxPoint,r0 ; save Point
keyexit: pop 00h
ret ; reti
; ************************************************************************
getkeyR: clr ES
push acc ;save acc
push 00h ;save r0
mov a,RxCount ;Test Count
cjne a,#0,pokr
ajmp kbfrd_ok ;Neni co precist
pokr:
dec a
mov RxCount,a ;
mov a,RxPointG
inc a
cjne a,#RxBafrMax,pokr2
mov a,#RxBafrMin
pokr2:
mov RxPointG,a
mov r0,a
mov a,@r0
mov r7,a
kbfrd_ok: pop 00h ; get the character back
pop acc
clr c ; clear the carry flag
setb ES
ret ; return
; ***********************************************************************
in_Rx: mov r7,RxCount
ret
; ***********************************************************************
getCharR:
mov A,RxCount
jz getCharR ; Cekani na prijmuti B
lcall getkeyR
ret
; ***********************************************************************
getWordR:
lcall getcharR ; Cteni Lo B
mov B,R7
lcall getcharR ; Cteni Hi B
mov A,R7
mov R6,A
mov R7,B
ret ; R6-Hi R7-Lo
; ***********************************************************************
_putWordR: ; R6-Hi R7-Lo
lcall _putkeyR ; Poslani Lo B
mov A,R6
mov R7,A
lcall _putkeyR ; Poslani Hi B
ret
; ***********************************************************************
Tim_out_Int:
push 00h ; r0 to stack
mov a,RxCount ; V bafru je volne misto
inc a
cjne a,#VelBafr,Tdal
sjmp Tkeyexit ; Bafr je plny, konec
Tdal:
mov RxCount,a
mov a,RxPoint ; Rotace bafru
inc a ;
cjne a,#RxBafrMax,Tkeyptok
mov a,#RxBafrMin ; rotace bafru preteceni
;
Tkeyptok: mov r0,a ; load the Buffer pointer
mov a,#0 ; get the character waiting
mov @r0,a ; save the character
mov RxPoint,r0 ; save Point
Tkeyexit: pop 00h
ret ; reti
; ***********************************************************************
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -