(Nem annyira) Clean Code Commodore 64-en

Ma este összeállítottam a The C64-es gépemet.

Ezután írtam egy BASIC programot, ami első ránézésre nem feltétlenül érthető – bár aki annak idején sokat programozott a C64-en, annak egyértelmű lehet a program célja:

Itt látható a futás eredménye:

Ezután beillesztettem a programba néhány REM utasítást, így már jobban követhető, hogy mit is csinál a program:

Elnézést a képek minőségéért, ui. csak a telefonommal tudtam lefotózni a képernyőt, és az eredmény sajnos hagy maga után némi kívánnivalót 🙂 Ha valaki esetleg tudja, hogy hogyan lehet a The C64-en screenshotot készíteni, akkor kérem, szóljon!

Billentyűledek kapcsolgatása

Egy régóta nem frissített oldalon találtam rá egy őskori Turbo Pascal nyelvű programomra, ami a billentyűzeten található ledeket kapcsolgatta. Közzéteszem ezt az írást is, hogy mindenki bölcs legyen tőle 🙂

Az alábbiakban – rövid magyarázattal együtt – közlök egy Pascal nyelvű programot, mellyel a billentyűzeten található ledek kapcsolgatása válik lehetővé. (Megj.: a program már a Windows XP alatt sem nagyon akart működni…)

A program a billentyűzet státuszbytejait állítgatja át, ezzel éri el a ledek ki-be kapcsolását. Ezek a státuszbyteok a hexa 417 és 418 memóriacímeken találhatók. A két memóriacím egyes bitjei használatosak a billentyűzet különböző állapotainak jelzésére. A program szempontjából a hexa 417 cím alábbi bitjei érdekesek (a legelső bit a 0. sorszámú, az utolsó a 7.):

  • 4. bit: a Scroll Lock állapota
  • 5. bit: a Num Lock állapota
  • 6. bit: a Caps Lock állapota

Ha az adott bit 1, akkor a led aktív, ha 0, akkor pedig nem aktív.

A billentyűzet – és egyéb hardverelemek – programozásáról az alábbi könyvekben lehet bővebb infót találni:

Peter Norton: Az IBM PC programozása, Műszaki Könyvkiadó, Budapest, 1990
Abonyi Zsolt: PC hardver kézikönyv, ComputerBooks, Budapest, 1995

 

program Ledek_vezerlese;

 uses Crt;

 const CapsLock   = 64;
       NumLock    = 32;
       ScrollLock = 16;

       Esc        = #27;

 var b  : char;
     ki : boolean;
     bl : byte absolute $0:$417;

 begin
  ClrScr;

  ki:=false;

  while (not ki) do

   begin
    b:=ReadKey;

    case b of

     (* Caps Lock bekapcsolasa *)
     'c','C': bl:=bl or CapsLock;

     (* Caps Lock kikapcsolasa *)
     'v','V': bl:=bl and (255-CapsLock);

     (* Num Lock bekapcsolasa *)
     'n','N': bl:=bl or NumLock;

     (* Num Lock kikapcsolasa *)
     'm','M': bl:=bl and (255-NumLock);

     (* Scroll Lock bekapcsolasa *)
     's','S': bl:=bl or ScrollLock;

     (* Scroll Lock kikapcsolasa *)
     'd','D': bl:=bl and (255-ScrollLock);

     (* Kilepes *)
     Esc: ki:=true;
    end;
   end;
 end.