icl 'sdxequ.fas' portb equ $d301 rtc equ $d520 rtcctrl equ $d52f * Inicjalizacja blk sparta $0600 * Czy zainstalowano juz sterownik zegara? lda $0753 bne abort ; tak, wypad * Nie, ustawienie wektora nowego sterownika w tablicy urzadzen ldx #$01 lda venter,x sta $0752,x dex bpl *-7 * Ustawienie wektorow pod ROM-em lda portb pha and #$fe sta portb ldx #$05 lda jmptbl,x sta jgettd,x dex bpl *-7 pla sta portb * Powiadomienie systemu o nowej nakladce * uzywajacej pamiei rozszerzonej lda extended sta bank dec install abort rts * Tablica skokow do procedur sterownika jmptbl jmp i_gettd jmp i_settd venter dta v(enter) * Procedury rezydentne blk reloc main * Wejscie do procedury pobrania czasu poprzez symbol I_GETTD i_gettd ldy #$64 dta b($2c) ; BIT abs * Wejscie do procedury ustawienia czasu poprzez symbol I_SETTD i_settd ldy #$65 * Czesc wspolna dla obydwu procedur lda #$00 * Wejscie poprzez SIO SpartaDOS-u enter pha ; wlaczenie banku SpartaDOS-u lda #$00 bank equ *-1 jsr jext_on pla jsr main jmp jext_off * Glowna procedura zegara blk reloc extended main cpy #$64 beq gettd cpy #$65 beq settd lda #$84 ; nierozpoznana komenda sec ; dla urzadzenia rts * Odczyt czasu gettd pha ; A7 - dane do date i time ldx #$0b jsr _gettd jsr _gettd ldx #$05 ; sprawdzenie poprawniosci lda tdbuf,x ; pobranego czasu cmp tdaux,x beq *+7 ldx #$05 jsr _gettd ; bez przeskoku, bo X < 0 dex bpl *-14 lda tdbuf+2 ; korekta godziny cmp #24 ; w systemie 12-godzinnym bcc *+7 sbc #28 sta tdbuf+2 lda tdbuf+5 ; korekta roku cmp #22 bcc *+4 sbc #100 adc #78 sta tdbuf+5 ldx #$02 ; przepisanie daty do DATER lda tdbuf+3,x sta comtab+dater,x dex bpl *-7 ldy #$02 ; przepisanie godziny do TIMER inx lda tdbuf,x sta comtab+timer,y dey bpl *-8 pla beq exit ; przepisanie czasu ldx #$05 ; do DATE i TIME lda comtab+dater,x sta date,x dex bpl *-7 exit lda #$00 clc rts * Zapis czasu settd tax ; przeniesienie czasu beq _settd ; z DATE i TIME ldx #$05 ; do DATER i TIMER lda date,x ; (jesli porzeba) sta comtab+dater,x dex bpl *-7 _settd ldx #$02 ; przepisanie TIMER ldy #$00 ; do bufora czasu lda comtab+timer,x ; z jednoczesna konwersja jsr mkbcd ; na BCD sta tdbuf,y iny dex bpl *-11 ldx #$02 ; j.w. dla DATER lda comtab+dater,x jsr mkbcd sta tdbuf+3,x dex bpl *-10 php ; przesuniecie lat sed ; wzgledem 1978 roku sec lda tdbuf+5 sbc #$78 sta tdbuf+5 plp lda #$02 ; zatrzymanie sta rtcctrl ; zegara ldx #$05 ; zapis ldy #$0b ; czasu _save lda tdbuf,x ; do rejestrow pha lsr @ lsr @ lsr @ lsr @ sta rtc,y dey pla and #$0f sta rtc,y dey dex bpl _save lda #$01 ; reset sta rtcctrl ; i wznowienie lda #$04 ; pracy sta rtcctrl ; zegara bne exit * Pobranie czasu i daty do bufora _gettd ldy #$0a lda rtc+1,y and #$0f asl @ sta tdbuf,x asl @ asl @ adc tdbuf,x sta tdbuf,x lda rtc,y and #$0f adc tdbuf,x sta tdbuf,x dex dey dey bpl _gettd+2 rts * Konwersja bajtu na BCD mkbcd sta tdaux tya pha lda #$00 sta tdaux+1 ldy #$08 php sed asl tdaux adc tdaux+1 sta tdaux+1 dey bne *-10 plp pla tay lda tdaux+1 rts tdbuf equ * tdaux equ tdbuf+6 empend equ tdaux+6 blk empty empend-tdbuf extended blk update addresses blk update symbols blk update new i_settd 'i_settd' blk update new i_gettd 'i_gettd' end