📄 sched.asm
字号:
Lda Setitemmaxtab,Y
Sta <Setitemmax
Lda Schetypetimeoff,Y
Tax
Ldy #25
?3: Lda Type1,X
Beq ?Copyfdatatoinputff
Iny
Sta Inputbuff,Y
Inx
Bra ?3
?Copyfdatatoinputff:
Ldx #0Ffh
?Loop5: Iny
Inx
Lda Fdata,X
Sta Inputbuff,Y
Bne ?Loop5
Rts
Setitemmaxtab: Db 2,3,3,4,5
;;Typeheadlentab:
;; Db 46,46,46,66,66
Schetypedataoff:
Db 0,11,22,33,44
Schetypedata:
Db '每日提醒 ',0
Db '每周提醒 ',0
Db '每月提醒 ',0
Db '每年提醒 ',0
Db '一次性提醒',0
Schetypetimeoff:
Db 0,15,30,45,80
Type1: Db '00时00分 ',0
Type2: Db '周日00时00分 ',0
Type3: Db '01日00时00分 ',0
Type4: Db '01月01日00时00'
Db '分 ',0
Type5: Db '02年01月01日00'
Db '时00分 ',0
;;[S]---------------------------------[S]
;;每当选中某一提醒类型时,同步更新Time值
;;Input:1.Schselectno 2.Inputbuff
;;Output:1.Inputbuff,2.相应Time值
;;[S]---------------------------------[S]
Settimevalue:
Ldy #0
?Cls: Lda Min,Y
Sta Scheminute,Y ;;当天的年月值为缺省年月提醒类型的年月值
Iny ;;仅仅为计算闰年
Cpy #5 ;;Note:Week Have No Init!!!!
Bcc ?Cls
Lda <Schselectno
Asl
Sta <Tempcount ;;Schsclectno*6
Asl
;;Clc
Adc <Tempcount
Sta <Tempcount
Ldx #0
?Loop: Ldy <Tempcount
Lda Typetimepos,Y
Cmp #0Ffh
Beq ?Nextitem
Tay
Jsr Inittimesche
Sta Scheminute,X
?Nextitem: Inc <Tempcount
Inx
Cpx #5
Bcc ?Loop
Ldy <Tempcount
Lda Typetimepos,Y
Cmp #0Ffh
Beq Setweekend ;;不必置0Ffh,存时会作校对
Tay
Lda #0Ffh
Sta Scheweek
Ldx #0Ffh
Setweekloop: Inc Scheweek
Inx
Lda Weekasciitab,X
Inx
Cmp Inputbuff,Y
Bne Setweekloop
Lda Weekasciitab,X
Cmp Inputbuff+1,Y
Bne Setweekloop
Setweekend: Rts
Weekasciitab:
;; 日 一 二 三 四 五 六
Db C8H,D5H,D2H,Bbh,B6H,Feh,C8H,Fdh,Cbh,C4H,Ceh,E5H,C1H,F9H
;;[S]--------------------------------------[S]
;; 存一笔提醒时,相应存时间入Schdata
;;Input:1.Screcordcounter
;; 2.Schetime(Min,Hour,Day,Mon,Year,Week)
;;Output:Schdata(Min,Hour,Day,Mon,Year,Week)
;;[S]--------------------------------------[S]
Puttoscdata:
Jsr Correctsetschetime
Lda Screcordcounter
Dec
Asl
Sta <Tempcount
Asl
;;Clc
Adc <Tempcount
Tay
Ldx #0
Puttoscdata_0:
Lda Scheminute,X
Sta Schdata,Y
Iny
Inx
Cpx #6
Bcc Puttoscdata_0
;;Bpl Puttoscdata_0
Rts
;;[S]--------------------------------------------[S]
;;存一笔提醒前,须把提醒时间置对(无某项时间时,应置0Ffh)
;;Input:1.Schselectno,2.Schetime(Min---Week)
;;Output:Schetime(Scheminute----Scheweek)
;;[S]--------------------------------------------[S]
Correctsetschetime:
Lda <Schselectno
Asl
Sta <Tempcount
Asl
;;Clc ;;投机取巧
Adc <Tempcount
Tay
Ldx #0
Loop00: Lda Haveyntimetab,Y
Bne Haveschetime
Lda #0Ffh
Sta Scheminute,X ;;This Type Is'nt The Item Schetime
Haveschetime:
Inx
Iny
Cpx #6
Bcc Loop00
Rts
Haveyntimetab:
Db 1,1,0,0,0,0
Db 1,1,0,0,0,1
Db 1,1,1,0,0,0
Db 1,1,1,1,0,0
Db 1,1,1,1,1,0
;;[S]----------------------------[S]
;;删除某一笔提醒时,相应把Schdata删除掉
;;Input:1.Curcardnoh&L,2.Curcardoff
;; 3.Schdata
;;Output:Schdata
;;[S]----------------------------[S]
Deletescdata:
Lda <Curcardnol ;;Max=17
Clc
Adc <Curcardoff
Asl
Sta <Tempcount
Asl
;;Clc
Adc <Tempcount
Tay
?Loop: Lda Schdata+6,Y
Sta Schdata,Y
Iny
Cpy #90
Bcc ?Loop
Lda #0Ffh
Sta Schdata+95
Sta Schdata+94
Sta Schdata+93
Sta Schdata+92
Sta Schdata+91
Sta Schdata+90
Rts
;;[S]----------------------------------[S]
;; 初始化Schdata为0Ffh
;;[S]----------------------------------[S]
Initschdataff:
Ldy #0
Lda #0Ffh
?1: Sta Schdata,Y
Iny
Cpy #96
Bcc ?1
Rts
;;[S]--------------------------------[S]
;; 当Ram紊乱时,须恢复Schdata区
;;Input:No
;;Output:1.Schdata,2.Screcordcounter
;;Note!!!重新研磨可以移动,否则会出错
;;[S]--------------------------------[S]
Chkscdata:
Jsr Initschdataff ;;In Sched.Asm(Alamr.Asm)
Stz Tp0
Lda #Diraddrh
Sta <Insh
Lda #Diraddrl
Sta <Insl
Lda #>Flashbank
Sta <Drrh
Lda #<Flashbank
Sta <Drrl
Chkscdata_00:
Lda (<Ins)
;;Bne Chkscdata_0
And #00000011B
Cmp #00000010B ;;02-4-19 14:38
Bne Chkscdata_0
Ldy #1
Lda (<Ins),Y
Cmp #5
Beq Chkscdata_1
Chkscdata_0:
Lda <Insl
Clc
Adc #8
Sta <Insl
Lda <Insh
Adc #0
Sta <Insh
Cmp #0B0H
Bcc Chkscdata_00
Lda Tp0
Sta Screcordcounter
Rts
Chkscdata_1:
Lda (<Insl)
And #00011100B
Sta <Relatitem
Lsr
Clc ;;A/4*(4+2)=A/4*4+A/4*2=A+A/2
;;Adc (<Insl)
Adc <Relatitem
Sta <Relatitem
Ldy #6
Lda (<Ins),Y
Sta <Sectorno
Ldy #7
Lda (<Ins),Y
Sta Sectoroff
Lda <Insl
Pha
Lda <Insh
Pha
Jsr Ljsr
Dw Remarkbank
Dw Tofinddatains-1
Lda Tp0
Asl
Sta <Tempcount
Asl
Clc
Adc <Tempcount
Tax
Stz <Tempcount ;;Temp Counter
Convertdata:
Ldy <Relatitem
Lda Typetimepos,Y
Cmp #0Ffh
Beq Nothisitemtime
Cpy #11 ;Is Week Item
Bne ?Unweekitem
;Tay
Jsr Dealwithweek
Bra Nothisitemtime
?Unweekitem:
Tay
Jsr Converttodig
Nothisitemtime:
Sta Schdata,X
Inx
Inc <Relatitem
Inc <Tempcount
Lda <Tempcount
Cmp #6
Bcc Convertdata
Pla
Sta <Insh
Pla
Sta <Insl
Lda #>Flashbank
Sta <Drrh
Lda #<Flashbank
Sta <Drrl
Inc Tp0
Jmp Chkscdata_0
Typetimepos:
;; 分 时 日 月 年 周
Db 30,26,0Ffh,0Ffh,0Ffh,0Ffh ;;Day
Db 34,30,0Ffh,0Ffh,0Ffh,28 ;;Week
Db 34,30,26,0Ffh,0Ffh,0Ffh ;;Month
Db 38,34,30,26,0Ffh,0Ffh ;;Year
Db 42,38,34,30,26,0Ffh ;;Once
;;[S]-----------------------------------[S]
;; Asccii---->Bcd
;;Input: 1.Y(Location Of Ins) 2.Insh&L
;;Output: A(Bcd)
;;[S]-----------------------------------[S]
Converttodig:
Lda (<Insl),Y ;同一笔记录不可能跨Bank
Sec
Sbc #30H
Asl
Asl
Asl
Asl
Sta Chkscminute
Iny
Lda (<Insl),Y
Sec
Sbc #30H
Ora Chkscminute
Rts
;[S]-----------------------[S]
; 转换星期数
;;Input:1.Insh&L
;Output:A(星期数)
;[S]-----------------------[S]
Dealwithweek:
Phx
Ldx #0Ffh
?Loop: Ldy #28
Inx
Lda (<Insl),Y ;同一笔记录不可能跨Bank
Cmp Weekasciitab,X
Beq ?Nextchar
Inx
Bra ?Loop
?Nextchar:
Iny
Inx
Lda (<Insl),Y ;同一笔记录不可能跨Bank
Cmp Weekasciitab,X
Bne ?Loop
Txa
Lsr
?End: Plx
Rts
;;[S]=======Temptest Subprogram=========[S]
;Sendflashdatatopc:
; Lsetscreen 14 ;
; Lda #'o'
; Sta Textbuffor+50
; jsr CALL_LUpdateScreen ;
;
; Jsr Ljsr
; Dw Biosbank
; Dw Startsio-1;
;
; Lda #>Flashbank
; Sta <Drrh
; Lda #<Flashbank
; Sta <Drrl
; Lda #80H
; Sta <Insh
; Stz <Insl
;
;?0:
; Lda (<Ins)
; Tax
; Jsr Ljsr
; Dw Biosbank
; Dw Sendbyte-1;
;
; Inc <Insl
; Bne ?0
; Inc <Insh
; Bne ?0
; Lda #80H
; Sta <Insh
; Inc <Drrl
; Lda <Drrl
; Cmp #90H ;(>Flashbank)+8
; Bcc ?0;
;
; Jsr Ljsr
; Dw Biosbank
; Dw Stopsio-1;
;
; ;Lcls
; Lda #'k'
; Sta Textbuffor+51
; jsr CALL_LUpdateScreen ;
; Rts
;[S]------------------------------[S]
; 检测图标
;[S]------------------------------[S]
Checkschedule:
;Rmb5 <Scanfstate
;Rmb5 <Sf0
Stz Tp0 ;; Initial Schedule Set Counter = 0.
Bra Checkschedule2
Checkschedule1: Inc Tp0 ;; Schedule Set Counter += 1.
Checkschedule2: Lda Tp0
Cmp Screcordcounter
Beq Checkschedule4 ;; Skip If Finish Check Schedule.
Lda Tp0
Asl
Sta Tp1 ;;Tempcount
Asl
;;Clc
Adc Tp1 ;;Tempcount
Tay
Ldx #4
?Cmpweek: Lda Schdata+5,Y
Cmp #0Ffh
Beq ?Cmpyear
Cmp <Realweek
Bne Checkschedule1
Ldx #2
Bra ?Cmphour
?Cmpyear: Lda Schdata+4,Y
Cmp #0Ffh
Beq ?Cmpmonth
Cmp <Min,X
Bne Checkschedule1
?Cmpmonth: Dex
Lda Schdata+3,Y
Cmp #0Ffh
Beq ?Cmpday
Cmp <Min,X
Bne Checkschedule1
?Cmpday: Dex
Lda Schdata+2,Y
Cmp #0Ffh
Beq ?Cmphour
Cmp <Min,X
Bne Checkschedule1
?Cmphour: Dex
Lda Schdata+1,Y
Cmp <Min,X
Bcc Checkschedule1 ;时间已过
Beq ?Cmpminute
Smb5 <Scanfstate
Bra Checkschedule1 ;时间未到
?Cmpminute: Dex
Lda Schdata,Y
Cmp <Min,X
Bcc Checkschedule1 ;时间已过
Smb5 <Scanfstate
;; Bne Checkschedule1 ;时间未到
;Lda #00100000B ;; Set To Multi-Alarm Go.
;Ora Alarmflag2
;Sta Alarmflag2
;Lda #3Ch ;; Tone Counter = 60.
;Sta Tonecounter
;Smb5 <Sf0
Checkschedule4:
Rts
CALL_LUPDATESCREEN:
LUPDATESCREEN
RTS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -