📄 bios.asm
字号:
SetFixMode:
sta <Mode ;; Set mode register。
jsr Inia5 ;; Inital register。
jmp SetMode5
;;======================================================
;; Exit help mode.
;;======================================================
ExitHelp:
lKeyTone ;; Key tone out.
rmb3 <EFlag ;; Clear key down event.
lda <SaveHelp
stz <SaveHelp
sta <Mode
;;======================================================
;; Recall last state.
;;======================================================
RecallLastState:
ldx #8 ;; Return from help event.
jmp Main4
;;======================================================
;; Entry power off process.
;;======================================================
EntPowOff:
jsr clear_device
jsr bios_call_ext
dw ds0_EntPowOff_process
EntPowOff_x:
lSoundOff
lSetTimer 0 ;; Stop timer .
;; Random generation off.
lRandomOff
;; Stop scanf
LExitScanF ;;
;; Sound off.
sei ;; Disable all interrupt.
lda #0ffh
sta event_kill
rmb6 <SysF ;; Clear power off event flag.
lda <EFlag ;; Remain HSEC , SEC , Minute event flag.
and #00000111b ;;
sta <EFlag ;;
smb7 <SysF ;; Set Power off flag.
;; rmb7 <SysOpt ;; Set Power off flag.
lda #00110000b ;; Interrupt enable flag.
sta <IENAB
sta <IENA ;; (5) Enable Base timer interrupt.
;; (4) Enable Port-A interrupt.
;; (3) Disable Timer 1 interrupt.
;; (2) Disable Timer 0 interrupt.
;; (1) Disable DAC reload interrupt.
;; (0) Disable INTX interrupt.
smb7 <KeyNo ;; PreSet key off state.
jsr setio
EntPowOff_xx:
; lda #0ffh
; sta <pb ;; 只有地线有效
stz <PB
jsr delay_xxx
lda <PA ;; Reload last I/O states.
lda #80h
sta <lctr
; lda #00011110b
lda #00010110b
sta <SYS ;;OSC作主频
;;使能OSC
;;使能OSCX
;;OSCX heavy
;;256 warm-up cycles
;;wai后进入wai-1模式
;;irr 使能
;;低电压检测不使能.
cli ;; Enable all interrupt.
jmp Main0
;;======================================================
;; Power off process.
;;======================================================
PowerOffPrc:
lda AlarmFlag2
and #00100000b
beq ?popc1 ;; Branch if alarm sound off.
lda #<-Minu1 ;; Set one minute auto power off for alarm sound.
sta PowerT
lda #>-Minu1
sta PowerT+1
bra ?2popc3
?popc1:
lda #>DS0Bank ;; Select data bank #2
sta <DRRh
lda #<DS0Bank ;; Select data bank #2
sta <DRRl
ldx #5
lda <KeyNo
cmp FunKTab,x
; cmp #PowerKey ;; It's power on/off key ?
bne pwoend ;; No!
?2popc3:
sei
jsr clear_lcd_all
lda #00000010b
sta <SYS ;;OSC作主频
;;使能OSC
;;使能OSCX
;;OSCX heavy
;;256 warm-up cycles
;;wai后进入wai-0模式
;;irr 使能
nop ;;低电压检测不使能.
nop
nop
nop
lda #0
?1: inc
nop
nop
bne ?1
lda #00010010b
sta <SYS ;;OSC作主频
cli
jsr bios_call_ext
dw ds0_EntPowon_process
STZ <LCTR
;; lkeytone
;; bbs4 <soundflag,$
popc3:
jsr InitIO ;; Initial I/O states.
popc3x:
rmb7 <SysF ;; Clear power off states flag.
lda <PA ;; Reload last state of port A.
rmb3 <EFlag ;; Clear Key down event flag.
EntryPowerOn:
lda #CataMode ;; PreSet Clock mode.
bbr5 <SF0,pop7 ;;sf0.5=1 alarm ok
rmb5 <SF0
lda #alarmmode
pop7: sta <Mode
stz <ExtraMode ;; Clear extra mode.
jsr InitAll ;; Initial all register.
bbs0 <SF0,pop8 ;; Branch if Hourly alarm.
lda AlarmFlag2
and #00100000b ;; Branch if Alarm or Schedule alarm.
bne pop8
lkeytone
pop8:
jmp SetMode5 ;;
pwoend:
jmp Main0
;;======================================================
;; Entry show "Low battery" mode.
;;======================================================
EntLowBat:
lda #ShowBatLowMode
jmp SetFixModeSave ;; Entry fix mode and save last mode.
;;======================================================
;; Base timer interrupt service roution.
;; 1. Real timer clock increment.
;;======================================================
JBTInt:
_2Hz_int:
pha
phx
phy
smb0 <EFlag ;; 设定半秒钟事件处理旗号。
;; jsr NxKSeed ;; Seed of random increment.
inc <Seed
lda <SysF
eor #00000001b
sta <SysF ;; Invert 0.5 SEC. flag.
smb2 <sf1
bti2:
bbr0 <SysF,btiend ;; Branch if 前半秒.
smb1 <EFlag ;; 设定一秒钟事件处理旗号.
bbs7 <SysF,bti3 ;; Branch if power off mode.
bbs2 <sysF,bti3 ;;if is in transfering,not check powertime
inc PowerT
bne bti3
inc PowerT+1
bne bti3
bti3xx:
lda AlarmFlag2
and #00100000b ;; Alarm sound ?
beq bti25 ;; No !
lda #0ffh
sta PowerT
sta PowerT+1
bra bti3 ;; Skip set power off event flag if on alarm sound state.
bti25: smb6 <SysF ;; Set power off event flag.
bti3: ldx #<Sec ;; Index to Sec.
jsr Adc60 ;; Second++
bne btiend
smb2 <EFlag ;; 设定一分钟事件处理旗号.
smb6 <sf1 ;; 可检测提醒等
;; jsr NxSeed ;; Seed of random increment.
jsr Adc60 ;; Minute++
bne btiend
jsr Adc24 ;; Hour++
bne AClock4
smb4 <sf1 ;; 日期加一事件
jsr IncDate ;; Day += 1.
bne AClock3 ;; Skip if day <= days.
inc <Day ;; Day = 1st.
jsr IncMonth ;; Month += 1.
bne AClock2 ;; Skip if month <= 12.
inc <Month ;; Month = "January".
sec ;; Set carry flag.
jsr NxAdc1 ;; Year += 1.
AClock1:
jsr CheckLeapYear ;; Check leap year.
AClock2:
jsr GetDays ;; Get days of month.
AClock3:
AClock4:
rmb1 <SF0
lda <Hour
cmp #12h
bcc btiend
smb1 <SF0
btiend:
;; lda AlarmFlag4 ;
;; and #00100000b ;
;; bne ?1 ;
;; lda AlarmFlag2 ;
;; and #00100000b ;
;; beq ?2 ;
lda AlarmFlag4 ;
ora AlarmFlag2
and #00100000b ;
beq ?2 ;
?1:
jsr SysHSec ;; 闹铃(Timer)半秒钟处理副程式。
?2:
LDA #80H
STA <BTSR
rmb5 <ireql
IntRt: ply
plx
pla
rti
ScanKeyTal:
db 0ffh
db 11111110b
db 11111101b
db 11111011b
db 11110111b
db 11101111b
db 11011111b
db 10111111b
db 01111111b
;;======================================================
porta_int:
JPAInt:
pha
phx
phy
cld
jsr scan_keyboard ;; It's power key on mode.
ldy <keyno
bmi painte
jsr scan_keyboard ;; It's power key on mode.
cpy <keyno
bne painte
; bbr7 <SysF,paint6 ;; It's not power off mode.
;;=======================================================
;;是否开关键 在关机状态:
; lda #PowerKey
; cmp <KeyNo ;; Set to null key.
; bne painte
;;=======================================================
;paint6:
lda AlarmFlag2
and #00100000b ;; Alarm sound ?
beq paint7 ;; No !
lda AlarmFlag2
and #11011111b ;; Stop Alarm sound.
sta AlarmFlag2
stz ToneCounter
rmb4 <soundflag
LSoundOff
rmb3 <EFlag ;; Clear Key down 事件。
bra painte
paint7: ldx #0 ;; Reload auto power off time counter.
bbr4 <SysOpt,paint8 ;; Branch if auto power timer is 3 minuts.
ldx #2 ;; Index to 5 minuts table.
paint8: lda ATPTab,x
sta PowerT
lda ATPTab+1,x
sta PowerT+1
jsr NxSeed
painte: lda <PA ;; Reload last states。
jmp IntRt
;;=================================================
;; Timer 1 interrupt service roution.
;;======================================================
JT1Int:
pha
phx
phy
smb5 <EFlag ;; 设定 Timer 事件处理旗号。
jmp IntRt
;;======================================================
;; Timer 0 interrupt service roution.
;;
;;======================================================
JT0Int:
timer0_int:
pha
phx
phy
cld
jsr PlaySound
jmp IntRt
;;======================================================
;; DAC interrupt service roution.
;;======================================================
JDACInt:
pha
phx
phy
lda <DRRh
pha
lda <DRRl
pha
cld
jsr play_voice_in_interrupt
pla
sta <DRRl
pla
sta <DRRh
jmp IntRt
;;===================================================
;; Warm initial.
;;===================================================
WarmInit:
rmb6 <SysF ;; Clear power off event.
rmb7 <SysF ;; Clear power off mode.
;; Set Power time counter.
lda ATPTab
sta PowerT
lda ATPTab+1
sta PowerT+1
;; Set Null help index.
lda #NullHelp-HelpTable
sta <HelpOffset
rts
;;===================================================
;; Initial All I/O state.
;;===================================================
InitIO:
jsr SetIO
lda #00110000b ;; Interrupt enable flag.
sta <IENAB
sta <IENA ;; (5) Enable Base timer interrupt.
;; (4) Enable Port-A interrupt.
;; (3) Timer 1 interrupt.
;; (2) Timer 0 interrupt.
;; (1) DAC reload interrupt.
;; (0) INTX interrupt.
lda #00011000b ;; Set timer 1 timer base is OSCX/256 = 128 Hz(7.8125uS)
sta <T1M ;; and set to auto reload.
jsr set_to_ds0bank
stz <DMRh ;; Set DMA bank register.
stz <DMR ;; Set DMA bank register.
lda <PA ;; Load last state.
smb7 <KeyNo ;; PreSet key off state.
stz <IREQ ;; PreClear all
RTS
;;===================================================
;;
;;===================================================
SetIO:
LDA #11011000B ;;intx 下降沿有效;工作模式3
STA <PMCR
lda #0ffh
STA <PSC ;;CMOS 输入输出
lda #00000001b
sta <PFC ;;PRC1~7都默认成一般输出I/O,prc.0作INTx
lda #00111111b
sta <PFD ;;PRD0~5作片选,prd6~7:作输出,输出低
stz <PCA ;;都作按输入口
lda #0ffh
STA <PCB ;;都作输出口
STA <PCD ;;都默认成输出,通信时需StartSio
STA <PCE ;;都作输出口,PE0~PE2默认不允许输出时钟信号
STA <PCL ;;都用于LCD控制
sta <PA ;;porta接上上拉电阻!
lda #0
sta <PB ;;
sta <PD ;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -