'===========================================================================
' Subject: VB-DOS CALENDAR                    Date: 10-27-95 (07:20)       
'  Author: Frans Hersbach                     Code: VBDOS                  
'  Origin: FidoNet QUIK_BAS Echo            Packet: VB.ABC
'===========================================================================
'FH_CLNDR.BAS  * VB-DOS required !!! *
'============  -----------------------

 TYPE VideoType
   Mode    AS INTEGER 
   Rows    AS INTEGER
   Cols    AS INTEGER
   Page    AS INTEGER
   Offs    AS INTEGER
   Segment AS INTEGER
   CRT     AS INTEGER
   Colour  AS INTEGER
   Scherm  AS INTEGER
   BlnkBit AS INTEGER
   FntBlk  AS INTEGER
 END TYPE

 TYPE RegType
   AX    AS INTEGER
   BX    AS INTEGER
   CX    AS INTEGER
   DX    AS INTEGER
   BP    AS INTEGER
   SI    AS INTEGER
   DI    AS INTEGER
   FLAGS AS INTEGER
 END TYPE

'-------------------------------------------------------

 DECLARE FUNCTION Schrikkel% (Jaar%)

 DECLARE SUB StartKalender ()
 DECLARE SUB EindeKalender ()
 DECLARE SUB DisplayScherm ()
 DECLARE SUB DisplayDagen ()

 DECLARE SUB Interrupt (IntNum AS INTEGER, InReg AS RegType, OutReg AS RegType)

 DECLARE SUB Display (Col%, Row%, Tekst$, Fore%, Back%)
 DECLARE SUB DisplayVertical (Col%, Row%, Tekst$, TxtLenStap%, Richting%, Fore%, Back%)
 DECLARE SUB Video80x30 ()
 DECLARE SUB VideoCenter (Text$, Row%, Fore%, Back%)
 DECLARE SUB VideoCLS (Kleur%)
 DECLARE SUB VideoSettings ()
 DECLARE SUB VideoScrnFill (StartRow%, StartCol%, BoxHg%, BoxBrd%, ASCIIchar%, Kleur%, Page%)

'-------------------------------------------------------

 CONST True = -1, False = 0
 CONST DagNaam = "SuMoTuWeThFrSa"
 CONST MndDagen = "31 28 31 30 31 30 31 31 30 31 30 31"

 CONST Zwart = 0, Blauw = 1, Groen = 2, Cyaan = 3, Rood = 4, Paars = 5
 CONST Bruin = 6, Grijs = 7, DonkerGrijs = 8, LichtBlauw = 9
 CONST LichtGroen = 10, LichtCyaan = 11, LichtRood = 12, LichtPaars = 13
 CONST Geel = 14, Wit = 15

 CONST ForeKleur = Geel
 CONST BackKleur = Rood
 CONST DagKleur = LichtCyaan
 CONST MndKleur = LichtGroen
 CONST WknKleur = Geel
 CONST CfrKleur = Wit

'-------------------------------------------------------

 DIM SHARED Video AS VideoType
 DIM SHARED SelectJaar AS INTEGER

'-------------------------------------------------------

 DEFINT A-Z

 StartKalender

SUB Display (Col%, Row%, Tekst$, Fore%, Back%)

 SELECT CASE Video.Scherm

   CASE 15

         Location = ((Row - 1) * (Video.Cols * 2)) + ((Col - 1) * 2)
           Colour = (Fore AND 15) + (Back AND 7) * 16 + (Fore AND 16) * 8
         DEF SEG = &HB800 ' Assume VGAcolor
         FOR Char = 1 TO LEN(Tekst$)
           POKE Location + 0, ASC(MID$(Tekst$, Char, 1))
           POKE Location + 1, Colour
           Location = Location + 2
         NEXT Char
         DEF SEG

 END SELECT

END SUB

SUB DisplayDagen ()

   WeekNr = 1
 HoriOfst = 4

   CrntDag = DAY(NOW)
 CrntMaand = MONTH(NOW)
  CrntJaar = YEAR(NOW)

 FOR Maand = 1 TO 12

  DagAantal = VAL(MID$(MndDagen, (Maand - 1) * 3 + 1, 2))
  IF Maand = 2 AND Schrikkel%(SelectJaar) = True THEN
    DagAantal = DagAantal + 1
  END IF

  DagTeller = 1
  TellerOfst = WEEKDAY(DATEVALUE("1-" + FORMAT$(Maand) + "-" + FORMAT$(SelectJaar)))
  Teller = TellerOfst

  SELECT CASE Maand
    CASE 1, 5, 9: WeekTeller = 1
  END SELECT

  FOR Dag = 1 TO DagAantal

  SELECT CASE Maand
       CASE 1 TO 4: Ofst = HoriOfst + ((WeekTeller - 1) * 3) + ((Maand - 1) * 6 + 1)
                    VertOfst = 3
       CASE 5 TO 8: Ofst = HoriOfst + ((WeekTeller - 1) * 3) + ((Maand - 1) * 6 + 1) - 104
                    VertOfst = 14
      CASE 9 TO 12: Ofst = HoriOfst + ((WeekTeller - 1) * 3) + ((Maand - 1) * 6 + 1) - 208
                    VertOfst = 25
    END SELECT
    
    Display Ofst, VertOfst, RIGHT$(" " + STR$(WeekNr), 2), WknKleur, Zwart
    Display Ofst, VertOfst + Teller, RIGHT$(" " + STR$(DagTeller), 2), CfrKleur, Zwart

    IF CrntDag = Dag AND CrntMaand = Maand AND CrntJaar = SelectJaar THEN
      Display Ofst, VertOfst + Teller, RIGHT$(" " + STR$(DagTeller), 2), CfrKleur + 16, Zwart
    END IF

    Display Ofst + 2, VertOfst + Teller, "³", Grijs, Zwart

    DagTeller = DagTeller + 1
    Teller = Teller + 1
    IF Teller > 7 THEN
     Teller = 1
     WeekNr = WeekNr + 1
     WeekTeller = WeekTeller + 1
    END IF
          
  NEXT Dag

 NEXT Maand
   
END SUB

SUB DisplayScherm ()

 CLS

 Video.Scherm = 15
 Video80x30
 VideoSettings
 
 Display 1, 1, SPACE$(Video.Cols), ForeKleur, BackKleur
 VideoCenter "Kalenderjaar: " + FORMAT$(SelectJaar), 1, ForeKleur, BackKleur

  Display 10, 2, "Jan                Feb                 Mrt                Apr", MndKleur, Zwart
 Display 10, 12, "Mei                Jun                 Jul                Aug", MndKleur, Zwart
 Display 10, 22, "Sep                Okt                 Nov                Dec", MndKleur, Zwart

 DisplayVertical 1, 4, DagNaam, 2, 1, DagKleur, Zwart
 DisplayVertical 1, 14, DagNaam, 2, 1, DagKleur, Zwart
 DisplayVertical 1, 24, DagNaam, 2, 1, DagKleur, Zwart

 Display 1, 11, STRING$(80, 196), DonkerGrijs, Zwart
 Display 1, 21, STRING$(80, 196), DonkerGrijs, Zwart

END SUB

SUB DisplayVertical (Col%, Row%, Tekst$, TxtLenStap%, Richting%, Fore%, Back%)

 Aantal = LEN(Tekst$) \ TxtLenStap

 SELECT CASE Richting
   CASE IS < 0: FOR Stukje = 0 TO Aantal - 1
                  Display Col, Row + Stukje, MID$(Tekst$, (Aantal - Stukje - 1) * TxtLenStap + 1, TxtLenStap), Fore, Back
                NEXT Stukje

   CASE IS > 0: FOR Stukje = 0 TO Aantal - 1
                  Display Col, Row + Stukje, MID$(Tekst$, Stukje * TxtLenStap + 1, TxtLenStap), Fore, Back
                NEXT Stukje
 END SELECT

 
END SUB

SUB EindeKalender ()

 VideoCLS 0
 SCREEN 0, 0, 0, 0
 COLOR 7, 0
 WHILE INKEY$ <> "": WEND
 END

END SUB

FUNCTION Schrikkel% (Jaar%)

 IF Jaar \ 4 = Jaar / 4 THEN
   Schrikkel = True
 ELSE
   Schrikkel = False
 END IF

END FUNCTION

SUB StartKalender ()
 
 IF INSTR(COMMAND$, "/?") THEN
   PRINT : PRINT "KALENDER.EXE jaartal  (tussen 1753 en 2078)": END
 END IF
 
 IF COMMAND$ <> "" THEN
   CmdJaar = VAL(COMMAND$)
   IF CmdJaar >= 1753 AND CmdJaar <= 2078 THEN
     SelectJaar = CmdJaar
   ELSE
     SelectJaar = VAL(RIGHT$(DATE$, 4))
   END IF
 ELSE
   SelectJaar = VAL(RIGHT$(DATE$, 4))
 END IF

 DisplayScherm
 DisplayDagen
 SLEEP
 EindeKalender

END SUB

SUB Video80x30 ()

 DIM CrtcData AS INTEGER, CrtcIndex AS INTEGER, CRTCreg(1 TO 16) AS INTEGER
 DIM InReg AS RegType, OutReg AS RegType, i AS INTEGER

 CRTCreg(1) = &H11:   CRTCreg(2) = &HC:   CRTCreg(3) = &H6:   CRTCreg(4) = &HD
 CRTCreg(5) = &H7:    CRTCreg(6) = &H3E:  CRTCreg(7) = &H10:  CRTCreg(8) = &HEA
 CRTCreg(9) = &H11:  CRTCreg(10) = &H8C: CRTCreg(11) = &H12: CRTCreg(12) = &HDF
 CRTCreg(13) = &H15: CRTCreg(14) = &HE7: CRTCreg(15) = &H16: CRTCreg(16) = &H6
 
 DEF SEG = &H40
 POKE &H4C, 0: POKE &H4D, &H20: POKE &H84, 29
 CrtcIndex = PEEK(&H63) + 256 * PEEK(&H64)
 CrtcData = CrtcIndex + 1
 Cli = &HCBFA: DEF SEG : CALL Absolute(VARPTR(Cli))
 FOR i = 1 TO 16 STEP 2
   OUT CrtcIndex, CRTCreg(i)
   OUT CrtcData, CRTCreg(i + 1)
 NEXT i
 OUT &H3C2, ((INP(&H3CC) AND &H33) OR &HC4)
 Sti = &HCBFB: DEF SEG : CALL Absolute(VARPTR(Sti))
 InReg.AX = &H1200
 InReg.BX = &H20
 Interrupt &H10, InReg, OutReg

END SUB

SUB VideoCenter (Text$, Row%, Fore%, Back%)

 Ofst = (Video.Cols \ 2) - LEN(Text$) \ 2
 Display Ofst, Row, Text$, Fore, Back

END SUB

SUB VideoCLS (Kleur%)

 SELECT CASE Video.Scherm
   CASE 0, 16, 17: COLOR Grijs, Kleur: CLS
        CASE ELSE: VideoScrnFill 1, 1, Video.Cols, Video.Rows, 32, Zwart, 0
 END SELECT

END SUB

SUB VideoScrnFill (StartRow, StartCol, BoxHg, BoxBrd, ASCIIchar, Kleur, Page)

 DIM InReg AS RegType, OutReg AS RegType

 LOCATE 1, 1
 InReg.AX = &H9 * 256 + ASCIIchar
 InReg.BX = Page * 256 + Kleur
 InReg.CX = BoxHg * BoxBrd
 Interrupt &H10, InReg, OutReg
 
END SUB

SUB VideoSettings ()

 DIM r AS RegType

 r.AX = &H1A00
 Interrupt &H10, r, r
 VideoSrt = VAL("&H" + RIGHT$(HEX$(r.BX), 2))
 IF VideoSrt = 0 OR VideoSrt = 255 THEN SOUND 1000, 1
 Video.CRT = VideoSrt

 r.AX = &HF00
 r.BX = 0
 r.DX = 0
 Interrupt &H10, r, r
 Video.Cols = (CLNG(r.AX) - (r.AX < 0) * 65536) \ 256

 r.AX = &H1130
 r.BX = 0
 r.DX = 0
 Interrupt &H10, r, r
 Video.Rows = r.DX + 1

 DEF SEG = 0: VidMode = PEEK(&H449): DEF SEG
 SELECT CASE VidMode
   CASE 0, 2, 7: Video.Colour = 0   'Black & White 40/80 column & monochrome
      CASE ELSE: Video.Colour = -1  'Everything else... assume color
 END SELECT

END SUB

