⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 onoff.asm

📁 辞典 dict3.asm.grammar.asm,newword.asm 学习 learn.asm 名片 userinf.asm 备忘 userinf.asm 提醒 userinf
💻 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 + -