Asembler procesora 68000     Kalendarz na 200 lat      Kompilacja


NAZWA
OPIS
ARGUMENTY
WEJŚCIOWE
WYJŚCIE
DANYCH
CalGenerowanie ciągu ASCIIZ z angielską nazwą dnia tygodnia na podstawie daty D1.l, D2.b, D3.l textbuf
CalsGenerowanie ciągu ASCIIZ z angielską nazwą dnia tygodnia na podstawie daty
(weryfikacja)
D1.l, D2.b, D3.ltextbuf

Objaśnienia:
D1, D2, D3 - rejestr danych
Dx.b - najmłodszy bajt rejestru danych (8-bitów)
Dx.l - cały rejestr danych (32-bity)
textbuf - pamięć dla danych wyjściowych (RAM)

Tłumaczenia angielskich nazw dni tygodnia:
Monday - Poniedziałek, Tuesday - Wtorek, Wednesday - Środa,
Thursday - Czwartek, Friday - Piątek, Saturday - Sobota, Sunday - Niedziela.


 Cal: moveq    #$01,D1      ;numer dnia (1-31)
      moveq    #$01,D2      ;numer miesiąca (1-12)
      move.l   #$076D,D3    ;numer roku (1901-2099)
      lea      textbuf,A0   ;adres wyjścia danych
      lea      Cal6(pc),A1
      move.b   #$1C,$01(A1) ;luty=28 dni
      move.l   D3,D4
      ror.l    #2,D4
      add.l    D1,D3
      move.w   D4,D1
      add.l    D1,D3
      swap     D4
      tst.w    D4
      bne.s    Cal0
      subq.l   #1,D3
      addq.b   #1,$01(A1)   ;luty=29 dni
Cal0: moveq    #$00,D4
Cal1: move.b   (A1)+,D4
      add.l    D4,D3
      subq.b   #1,D2
      bne.s    Cal1
      sub.l    D4,D3
      divu     #$07,D3
      clr.w    D3
      swap     D3
      rol.b    #2,D3
      lea      Cal5(pc),A1
      add.l    D3,A1
Cal2: tst.b    (A1)+
      bne.s    Cal2
      bsr.s    Cal3
      lea      Cal4(pc),A1
Cal3: move.b   (A1)+,(A0)+
      tst.b    (A1)
      bne.s    Cal3
      clr.b    (A0)
      rts
Cal4: dc.b     "day"
Cal5: dc.b     0,"Fri",0,"Satur",0,"Sun",0,"Mon",0,"Tues",0,"Wednes",0,"Thurs",0
Cal6: dc.b     31,0,31,30,31,30,31,31,30,31,30,31

;Rozmiar: 148 B, linii kodu: 40
Procedura generuje ciąg ASCIIZ z angielską nazwą dnia tygodnia na podstawie daty, zapisanej
w postaci binarnej, w następujących rejestrach: D1 - numer dnia (1-31), D2 - numer miesiąca (1-12),
D3 - numer roku (1901-2099). Podanie niewłaściwego numeru dnia, miesiąca lub roku, spowoduje
wygenerowanie błędnej nazwy dnia tygodnia.

 Cals: moveq    #$01,D1      ;numer dnia (1-31)
       moveq    #$01,D2      ;numer miesiąca (1-12)
       move.l   #$076D,D3    ;numer roku (1901-2099)
       lea      textbuf,A0   ;adres wyjścia danych
       moveq    #$30,D5
       tst.l    D1
       beq.s    Cals4        ;D1=0
       moveq    #$1F,D4
       cmp.l    D4,D1
       bhi.s    Cals4        ;D1>31
       moveq    #$31,D5
       tst.b    D2
       beq.s    Cals4        ;D2=0
       cmp.b    #$0C,D2
       bhi.s    Cals4        ;D2>12
       moveq    #$32,D5
       cmp.l    #$076D,D3
       bcs.s    Cals4        ;D3<1901
       cmp.l    #$0833,D3
       bhi.s    Cals4        ;D3>2099
       lea      Cals7(pc),A1
       move.b   #$1C,$01(A1) ;luty=28 dni
       move.l   D3,D4
       ror.l    #2,D4
       add.l    D1,D3
       move.w   D4,D5
       add.l    D5,D3
       swap     D4
       tst.w    D4
       bne.s    Cals0
       subq.l   #1,D3
       addq.b   #1,$01(A1)   ;luty=29 dni
Cals0: moveq    #$00,D4
Cals1: move.b   (A1)+,D4
       add.l    D4,D3
       subq.b   #1,D2
       bne.s    Cals1
       moveq    #$33,D5
       cmp.b    D4,D1
       bhi.s    Cals4        ;D1>liczby dni w danym miesiącu
       sub.l    D4,D3
       divu     #$07,D3
       clr.w    D3
       swap     D3
       rol.b    #2,D3
       lea      Cals6(pc),A1
       add.l    D3,A1
Cals2: tst.b    (A1)+
       bne.s    Cals2
       bsr.s    Cals3
       lea      Cals5(pc),A1
Cals3: move.b   (A1)+,(A0)+
       tst.b    (A1)
       bne.s    Cals3
       clr.b    (A0)
       rts
Cals4: move.b   #$52,(A0)+
       move.b   D5,(A0)+
       clr.b    (A0)
       rts
Cals5: dc.b     "day"
Cals6: dc.b     0,"Fri",0,"Satur",0,"Sun",0,"Mon",0,"Tues",0,"Wednes",0,"Thurs",0
Cals7: dc.b     31,0,31,30,31,30,31,31,30,31,30,31

;Rozmiar: 206 B, linii kodu: 63
Procedura działa podobnie jak wcześniejsza, ale weryfikuje poprawność podanej daty.
Podanie niewłaściwego numeru dnia, miesiąca lub roku, spowoduje wygenerowanie
odpowiedniego ciągu ASCIIZ, który informuje o błędzie:
"R0" - numer dnia =0 lub >31
"R1" - numer miesiąca =0 lub >12
"R2" - numer roku <1901 lub >2099
"R3" - numer dnia jest większy od liczby dni, jaką posiada dany miesiąc
          (np. 31 kwietnia dowolnego roku, 29 lutego w latach nieprzestępnych).