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

📄 bios.asm

📁 辞典 dict3.asm.grammar.asm,newword.asm 学习 learn.asm 名片 userinf.asm 备忘 userinf.asm 提醒 userinf
💻 ASM
📖 第 1 页 / 共 3 页
字号:

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 + -