📄 onoff.asm
字号:
; ***************************************************************************
; * Project : Electronic Dictionary *
; * Date : 2003.9 *
; * File Name : ONOFF.ASM *
; ***************************************************************************
pw 128
case off
externs on
include st2202.def
include Data.def
include Bios.h
include Graphics.h
include Graph.def
include KeyDef.def
include DataBank.def
public new_melody_test
public Melody_test
public EntPowOff_bug
public setio_bug
public initio_bug
;===========================
ps0a .section
bankno equ onoff_bank
Minu1 equ 60 ;; Auto. power off time for alarm sound.
EntPowOff_bug:
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.
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.
LSetIO_bug
stz <drrh
stz <drrl
stz <pb
lda #80h
sta <lctr
; ldx #2
;?1:
; jsr ljsr
; dw biosbank
; dw delay_xxx-1
; bbr5 <pa,?1
; dex
; bpl ?1
;;==============================================
lda #00010110b
sta <SYS ;;OSC作主频
;;使能OSC
;;使能OSCX
;;OSCX heavy
;;256 warm-up cycles
;;wai后进入wai-1模式
;;irr 使能
;;低电压检测不使能.
cli ;; Enable all interrupt.
jsr copy_power_off_prg_to_ram2
jsr copy_my_need_prg_to_ram1
jmp 700h
;;==============================================
copy_my_need_prg_to_ram1:
ldx #shut_off_program_end-shut_off_program_start-1
?copy_next:
lda shut_off_program_start,x
sta 700h,x
dex
bpl ?copy_next
rts
shut_off_program_start:
;; lda #0ffh
;; sta <pb
jmp 800h
shut_off_program_end:
;;==============================================
copy_power_off_prg_to_ram2:
ldx #PowerOffPrc_bug_end-PowerOffPrc_bug_start-1
?copy_next:
lda PowerOffPrc_bug_start,x
sta 800h,x
dex
bne ?copy_next
lda PowerOffPrc_bug_start,x
sta 800h,x
rts
;;======================================================
;; Power off process.
;;======================================================
PowerOffPrc_bug_start:
stz <prrh
stz <prrl
nop
nop
nop
rmb3 <eflag
Main0_bug:
; lda #0ffh
; sta <pb
wai ;; CPU sleeping now.
nop
nop
nop
nop
nop
nop
bbr4 <sf1,?1
rmb4 <sf1 ;; 星期与日期同步
jsr bios_call_ext
dw ds0_GetWeek
?1:
bbr6 <sf1,?2
rmb6 <sf1
jsr SysMin ;;每分钟检测alarm 及提醒
?2:
cld ;; Clear decimal mode.
sei ;; Disable interrupt.
ldx #0ffh ;; Reset stack pointer.
txs ;;
cli ;; Enable all interrupt.
;;======================================================
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 <KeyNo
cmp #PowerKey ;; It's power on/off key ?
bne Main0_bug ;; No!
lda power_flag
ora #01h
sta power_flag
?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
?1x: inc
nop
nop
bne ?1x
lda #00010010b
sta <SYS ;;OSC作主频
CLI
jsr InitIO ;; Initial I/O states.
rmb7 <SysF ;; Clear power off states flag.
smb7 <pd
STZ <LCTR
lda <PA ;; Reload last state of port A.
rmb3 <EFlag ;; Clear Key down event flag.
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
jsr keytone
?pop8:
lda #>SetMode5_bug-1
pha
lda #<SetMode5_bug-1
pha
lda #>updatesc_bank
pha
lda #<updatesc_bank
jmp longgo ; J.A.
PowerOffPrc_bug_end:
new_melody_test:
lda <drrh
pha
lda <drrl
pha
lda <melody_drrh
and #f8h
ora #>ps1_AtBank0Bank
sta <melody_drrh
lda #<ps1_AtBank0Bank
sta <melody_drrl
jsr Melody_test
pla
sta <drrl
pla
sta <drrh
rts
Melody_test:
lsoundoff
bbr6 <SysOpt,AMelody ;;Sound off/on
rts
AMelody:
stz <dac
lda #00000010b ;;psg初始化作Tone发生器,两通道都使能
sta <PSGC ;;psgck = sysck/2
jsr ljsr
dw biosbank
dw new_melody_bug-1
rts
; ***************************************************************************
; * Initial All I/O state. *
; ***************************************************************************
InitIO_Bug:
jsr SetIO_bug
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_bug:
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 + -