S_ADDIZ  SMB 'S_ADDIZ'
INSTALL  SMB 'INSTALL'
U_GONOFF SMB 'U_GONOFF'
I_GETTD  SMB 'I_GETTD'
COMTAB   SMB 'COMTAB'

* Atari OS
RTCLOK   EQU $0012
FMSZPG   EQU $0043
LOMEM    EQU $0080
VVBLKD   EQU $0224
SDLSTL   EQU $0230
SDLSTH   EQU $0231
INVFLG   EQU $02B6
SHFLOK   EQU $02BE
PORTB    EQU $D301
SETVBLV  EQU $E45C
XITVBV   EQU $E462

* Adresy SDX
S_VER    EQU $0701
JEXTSW   EQU $07F7

         BLK SPARTA $580

         LDA S_VER     ;Ustalenie wersji SDX
         AND #$0F
         ORA #$30
         STA DSDXVER+2 ;revision
         LDA S_VER
         LSR @
         LSR @
         LSR @
         LSR @
         ORA #$30
         STA DSDXVER   ;ver no.

;         LDA PORTB
;         PHA
;         AND #$FE
;         STA PORTB     ;wylaczenie OSa

;         LDY #$05
;L05A1    LDA L05CC,Y   ;przepisanie 2 skokow
;         STA $FFC6,Y
;         DEY
;         BPL L05A1
;         PLA
;         STA PORTB

         LDA VTDMAIN
         LDX VTDMAIN+1
         JSR S_ADDIZ    ;dodanie po resecie

         LDX #$0A
         STX COUNTVBL
         LDA #$00
         STA CLKFAIL
         STA ST_ONOFF
         DEC INSTALL

         JMP PROCPARM

VTDMAIN  DTA V(TDMAIN)

;L05CC    JMP L05E4
;         JMP L0649

************************
         BLK RELOC MAIN   ; $5D2

TDMAIN   LDA #$00         ;przy resecie
         STA CLKFAIL
         LDY ST_ONOFF
         JMP CHKONOFF

PROCPARM JSR U_GONOFF     ;C=ON/OFF, U_FAIL
         LDA #$00
         ROL @            ;zlapanie C
         TAY
         STY ST_ONOFF

CHKONOFF CPY #$00
         BEQ TURNOFF

* Wlacz TD
         LDY PTDVBPRO
         LDX PTDVBPRO+1
         JSR CHGVBLK
         CLC
         RTS

* Wylacz TD
TURNOFF  LDY <XITVBV
         LDX >XITVBV
         JSR CHGVBLK

         LDA SDLSTL   ;Przywroc jesli
         CMP PNEWDL   ;te same adresy
         BNE XTURNOFF ;DL
         LDA SDLSTH
         CMP PNEWDL+1
         BNE XTURNOFF

         SEC          ;Przywrocenie
         LDA ADROLDDL ;starej DL
         SBC #$03
         STA SDLSTL
         STA FMSZPG
         LDA ADROLDDL+1
         SBC #$00
         STA SDLSTH
         STA FMSZPG+1

         LDY #$06
NEXTDLB  LDA (FMSZPG),Y
         INY            ;Szukamy
         CMP #$41       ;JMP+VBLK
         BNE NEXTDLB
         LDA SDLSTL     ;Przepisujemy
         STA (FMSZPG),Y ;z niego
         INY            ;adres
         LDA SDLSTH     ;poczatku DL
         STA (FMSZPG),Y
XTURNOFF CLC
         RTS

* Zmiana wektora VB
CHGVBLK  LDA #07       ;VVBLKD
         JMP SETVBLV

;         LDA RTCLOK+2
;WAITCLK  CMP RTCLOK+2
;         BEQ WAITCLK
;         STY VVBLKD
;         STX VVBLKD+1
;         RTS

PTDVBPRO DTA V(TDVBPROC)
PNEWDL   DTA V(NEWDL)

************************
PREPINFO BIT CLKFAIL
         BPL L0650
         SEC
         RTS

L0650    DEC CLKFAIL
         STX PUTCHAR+2  ;Zapamietanie adresu
         STY PUTCHAR+1  ;info
         JSR I_GETTD
         BCC TIMEDATE
         INC CLKFAIL    ;Gdy nie da sie odczytac zegara
         RTS

* Przygotowanie daty i czasu

TIMEDATE LDA COMTAB+$0F ;rok
         SEC
         SBC #84
         BCS SKIPY2K ;Y2K
         ADC #$64    ;Y2K
SKIPY2K  STA YEARIDX+1
         PHA         ;Y2K
         AND #$03    ;Y2K
         TAY         ;Y2K
         PLA         ;Y2K
         LSR @
         LSR @
         SEC         ;Y2K CLC
YEARIDX  ADC #$00
         ADC COMTAB+$0D ;dzien
         LDX COMTAB+$0E ;mies
         ADC MONTHOFS-1,X

         CPY #$00    ;Y2K
         BNE SKIPY2K1        ;Y2K
         CPX #$03    ;Y2K
SKIPY2K1 SBC #$07    ;Y2K
         BCS SKIPY2K1 ;Y2K
         ADC #$08    ;Y2K

         ;Y2K TAY
         ;Y2K LDA COMTAB+$0F
         ;Y2K AND #$03
         ;Y2K BNE L0685
         ;Y2K CPX #$03
         ;Y2K BCC L0686
;Y2K L0685    INY
;Y2K L0686    TYA
;Y2K L0687    CMP #$07
;Y2K          BCC L068F
;Y2K          SBC #$07
;Y2K          BCS L0687
;Y2K L068F    ADC #$02  ;i mamy w A numer dnia tygodnia
         PHA

         LDY #$00  ;Zaczynamy drukowanie od poz.0

         JSR PRNSEP
         LDA SHFLOK
         BEQ SMALL
         LDA #'A'
         DTA B($2C)
SMALL    LDA #'a'
         LDX INVFLG
         BEQ NORMAL
         ORA #$80     ;zrob inverse
NORMAL   JSR PUTCHAR
         JSR PRNSEP

         PLA       ;W A nr dnia tygodnia
         TAX
         LDA DAY1-1,X
         JSR PUTCHAR
         LDA DAY2-1,X
         JSR PUTCHAR
         LDA DAY3-1,X
         JSR PUTCHAR
         JSR PRNSPACE
         LDA COMTAB+$D ;dzien
         JSR L075C
         JSR PRNMINUS
         LDX COMTAB+$E ;mies
         LDA MONTH1-1,X
         JSR PUTCHAR
         LDA MONTH2-1,X
         JSR PUTCHAR
         LDA MONTH3-1,X
         JSR PUTCHAR
         JSR PRNMINUS
         LDA COMTAB+$F ;rok
         JSR L0759

         JSR PRNSEP
         LDA COMTAB+$10 ;hh
         JSR L075C
         JSR PRNCOLON
         LDA COMTAB+$11 ;mm
         JSR L0759
         JSR PRNCOLON
         LDA COMTAB+$12 ;ss
         JSR L0759

         CLC
         INC CLKFAIL
         RTS

MONTHOFS DTA B($00,$03,$03,$06,$01,$04)
         DTA B($06,$02,$05,$00,$03,$05)

* Polskie
;DAY1     DTA C'SNPWSCP'
;DAY2     DTA C'oiotrzi'
;DAY3     DTA C'benoowa'
;MONTH1   DTA C'SLMKMCLSWPLG'
;MONTH2   DTA C'tuawaziirair'
;MONTH3   DTA C'ytrijepezzsu'

* Angielskie
DAY1     DTA C'SSMTWTF'
DAY2     DTA C'auouehr'
DAY3     DTA C'ynnedui'
MONTH1   DTA C'JFMAMJJASOND'
MONTH2   DTA C'aeapauuuecoe'
MONTH3   DTA C'nbrrynlgptvc'

L0759    LDX #$FF
         DTA B($2C) ; Bit
L075C    LDX #$00
L075E    STX STORAGE+$29
         LDX #$FF
         SEC
L0764    INX
         SBC #$0A
         BCS L0764
         ADC #$0A
         PHA
         TXA
         BNE L0776
         BIT STORAGE+$29
         BMI L0776
         ORA #$10
L0776    JSR L077C
         PLA
         AND #$0F
L077C    EOR #$30
PUTCHAR  STA $FFFF,Y
         INY
         RTS

PRNSEP   LDA #'|'
         DTA B($2C)
PRNSPACE LDA #' '
         DTA B($2C)
PRNCOLON LDA #':'
         DTA B($2C)
PRNMINUS LDA #'-'
L078B    CLC
         BCC PUTCHAR

NEWDL    DTA B($70,$70)
         DTA B($30,$42)
         DTA V(STORAGE)
         DTA B($01)
ADROLDDL DTA V($0000)

TDLINE   DTA C'SpartaDOS X '
DSDXVER  DTA C'4.2'
TDLINFO  DTA B($00,$00,$00,$00)
         DTA B($00,$00,$00,$00)
         DTA B($00,$00,$00,$00)
         DTA B($00,$00,$00,$00)
         DTA B($00,$00,$00,$00)
         DTA B($00,$00,$00,$00)
         DTA B($00,$00)

PTDLINFO DTA V(TDLINFO)

* Co 30 VBLK
DOTDLINE LDA PORTB
         PHA
         LDA COMTAB-$16 ;Indeks banku pamieci EXT
         JSR JEXTSW     ;Przelaczenie na niego

         LDX PTDLINFO+1
         LDY PTDLINFO
         JSR PREPINFO

         LDX #$00
         LDA #$0F
         LDY #$00
         JSR MOV2STOR
         LDA #$19
         LDY #$0F
         JSR MOV2STOR
;         LDA #$80
;         STA STORAGE+$27
         PLA
         STA PORTB    ;Przywrocenie ustawienia pamieci
         RTS

CHKINV   CMP #$80
         BCC L07FD  ;mala!

TMPCHAR  DTA B(0)

* Przepisanie bajtow do STORAGE + zmiana kodow
MOV2STOR PHA
         LDA TDLINE,Y
         STA TMPCHAR
         AND #$7F
         CMP #$60
         BCS L07FD   ;mala litera?
L07F7    SBC #$1F
         BCS L07FD
         ADC #$60
L07FD    BIT TMPCHAR
         BMI CHSCREEN
         ORA #$80    ;ustaw inv.
CHSCREEN STA STORAGE,X
         INY
         INX
         PLA
         SEC
         SBC #$01
         BNE MOV2STOR
         RTS

TDVBPROC CLD
         DEC COUNTVBL
         BNE XTDVBPRO  ;Czy licznik sie wyzerowal

         LDA #25 ;30       ;Licznik od nowa
         STA COUNTVBL

         JSR DOTDLINE

         LDA SDLSTL    ;Czy zmieniono DL ?
         CMP PNEWDL
         BNE DLCHANGE
         LDA SDLSTH
         CMP PNEWDL+1
         BEQ XTDVBPRO

DLCHANGE LDA LOMEM     ;To gdy zmieniono DL
         PHA           ;Zapamietanie LOMEM
         LDA LOMEM+1   ;(bedzie uzywane jako TMP)
         PHA

         LDA SDLSTL    ;Przygotowanie DL
         STA LOMEM
         CLC
         ADC #$03
         STA ADROLDDL  ;Zmiana adresu skoku
         LDA SDLSTH    ;na nowa DL
         STA LOMEM+1
         ADC #$00
         STA ADROLDDL+1

         LDY #$06
NEWDLBYT LDA (LOMEM),Y
         INY           ;Szukamy
         CMP #$41      ;JMP+VBLK w Y
         BNE NEWDLBYT

         LDA PNEWDL    ;i przepisujemy adres naszej DL
         STA SDLSTL    ;do rejestru
         STA (LOMEM),Y ;i do skoku
         INY
         LDA PNEWDL+1
         STA SDLSTH
         STA (LOMEM),Y

         PLA           ;Przywracamy poprzednie MEMLO
         STA LOMEM+1
         PLA
         STA LOMEM
XTDVBPRO JMP XITVBV

************************

         BLK EMPTY $2C MAIN ; Num:2 Mem:$80
STORAGE  EQU *-$2C
CLKFAIL  EQU STORAGE+$28    ; licznik blednych odczytow zegara
COUNTVBL EQU STORAGE+$2A    ; licznik przerwan VBLK
ST_ONOFF EQU STORAGE+$2B    ; stan ON/OFF

         BLK UPDATE ADDRESS
         BLK UPDATE SYMBOLS
         BLK UPDATE NEW PROCPARM '@TD2'
         BLK UPDATE NEW PREPINFO 'I_FMTTD'

         END
