📄 hc08sci.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; Main Program Loop ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN: sta COPCTL ; Kick the dog.
lda CHAR ; Check for flag (CHAR) indicating
cmp #$55 ; -received string delimiter found.
bne END ; Loop to END if not found.
jsr SCITRANS_SUB ; Echo input.
mov #$00,COUNT ; Clear COUNT for next input.
END: brset 0,PORTB,MAIN ; Look for button = 0 (PTB0)
TEST1: jsr DELAY ; -(button pressed).
brset 0,PORTB,MAIN ; Check again for debounce.
bsr SEND ; If button pressed send message.
bra MAIN
MSG: fcb $4D ; Message string; "MC68HC708XL36 :"
fcb $43
fcb $36
fcb $38
fcb $48
fcb $43
fcb $37
fcb $30
fcb $38
fcb $58
fcb $4C
fcb $33
fcb $36
fcb $20
fcb $3A
fcb $0D
fcb $00
fcb $00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; Subroutine Body Includes Section ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;; SEND SUBROUTINE
SEND: ldhx #MSG ; Go to start of message.
CONT: jsr CHKTDRE ; Check if transmitter ready.
TEST2: mov X+,SCDR ; Send first character.
lda ,X
cmp #$0D ; Check if character is 'ENTER KEY'($0D)
beq EXIT ; -and end transmission if equal.
jmp CONT ; Loop to next character.
EXIT: jsr CHKTDRE ; Check if transmitter ready.
mov #$0D,SCDR ; Send Carriage Return to dumb terminal.
rts
;;;;;;;;;;;;;;;;;;;;;; END TRANSMIT SUB
;;;;;;;;;;;;;;;;; SUBROUTINE CHECK SCS1 TDRE BIT
CHKTDRE: brclr SCTE,SCS1,CHKTDRE ; Wait for SCTE to be set.
rts ; Return.
;;;;;;;;;;;;;;;;;;;;;;;; END SUBROUTINE ;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;; SCI_TRANS SUBROUTINE
SCITRANS_SUB: ldhx #REC ; Go to start of received message.
OUT: jsr CHKTDRE ; Check SCTE flag.
TEST4: mov X+,SCDR ; Send first character.
lda ,X ; Load ACCA
cmp #$0D ; Check if character is 'Enter Key' ($0D)
beq FIN ; End transmission if equal.
jmp OUT ; Send next character.
FIN: mov #$00,CHAR ; Reset variable CHAR.
jsr CHKTDRE ; Check if transmitter ready.
mov #$0D,SCDR ; Send carriage return to dumb terminal.
rts
;;;;;;;;;;;;;;;;;;;;;; END TRANSMIT SUB
;;;;;;;;;;;;;;;;;;;;;;; DELAY SUBROUTINE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;; Begin delay loop for debouncing.
DELAY: ldhx #$37CD ; 3 cycles 14285 iterations.
OUTER: sta COPCTL ; 3 cycles Kick the dog.
aix #-1 ; 2 cycles
cphx #0 ; 3 cycles
bne OUTER ; 3 cycles
rts ; Total cycles/loop = 14
; Time per cycle, @ 2MHz internal,
; equals 500nS.
; Loop iterations = 14285.
; Delay time = 14285 ; 14 ; 500nS
; equals 100mS.
;;;;;;;;;;;;;;;;;;;;;;;;;; END DELAY SUBROUTINE ;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; Interrupt Service Routines for Main Routine ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;; RECEIVE SERVICE ROUTINE ;;;;;;;;;;;;;;;
; RDRF (RECEIVE DATA REGISTER FULL) GENERATES AN INTERRUPT WHEN
; DATA IN SHIFT REGISTER IS TRANSFERED TO SCD
SCIRec_SVR: pshh ; Save H register.
TEST3: clrh
ldx COUNT ; Get variable COUNT.
lda SCS1 ; Clear SCRF bit by reading SCS1.
lda SCDR ; Load ACCA w/ SCDR.
sta REC,X ; Write to RAM receive area.
inc COUNT ; Increment variable COUNT.
cmp #$0D ; Check if character is 'ENTER KEY'
bne LAST ; -and exit ISR if equal.
mov #$55,CHAR ; Set CHAR at reception of (CR).
LAST: pulh ; Retrieve H register.
rti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; Interrupt and Reset Vectors for Main Routine ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org SCIRec_INT
fdb SCIRec_SVR
org $FFFE
fdb START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -