------------------------------------------------------------------
 Commodore C128 (PAL)
------------------------------------------------------------------


Tillv. år: 1986

Intr. år:  1985

Processor: 8502, 0,98Mhz eller 2,02MHz (0,76MIPS)
           + Z80 4MHz (omkring 0,5MIPS enl. uppgift på internet).

Minne:     128K + 16K grafikminne till VDC-chippet.

Grafik:    VIC-II + VDC
           Maximal grafisk upplösning:
           VIC-II: 320x200
           VDC: 640x400
           Antal färger: 16

Ljud:      SID
           3 programmerbara synth-stämmor samt möjlighet
           att samtidigt spela en sampling.

OS:        CBM Basic V7 + CMB Basic V2
           Samt CP/M 3.0+ (verkar väldigt slött)

Övrigt:    Jag har två stycken. Den ena är helt felfri, den andra har lite
           fel på grafiken.
           
           
Commodore 128 är en vidareutveckling av C64 och är Commodores absolut sista 8-bitarsdator (med undantag för C128D med inbyggd diskdrive). Commodore släppte två datorer mellan 64an och 128an (C16 och Plus4), men de blev ingen succe. 128an kan köras i tre olika lägen: 1 - Som en C128, 2 - som en C64 eller 3 - som en CP/M dator. (CP/M var föregångaren till MS-DOS). Z80-processorn används bara i CP/M-läget. Inte nog med alla dessa lägen, i 128-läget kan den kan dessutom köras i både 1 och 2 megaherts samt på två olika grafikchip: VIC-II ger samma grafik som en C64 (40 teckens skärmbredd), samt VDC som ger en högre upplösning (80 tecken), men då måste man ha en monitor inkopplad på RGB-I porten. (Min Philips 8833-2 monitor klarar båda lägena.) Inte nog med det - Man kan koppla in en monitor till varje grafikchip och alltså använda två monitorer samtidigt. För att hoppa över med markören till den andra monitorn trycker man bara Esc x. Ganska lustigt måste jag säga. Som jag sa tidigare, så kan datorn köras både på 1 och 2 megaherts. Man ställer om den med FAST och SLOW-kommandona. Men om man kör på dubbla hastigheten så kan man inte se VIC-grafiken samtidigt, så det är mest användbart när man kör VDC-grafiken, men också om man kör 40-teckensläget och gör något tidskrävande som inte behöver synas samtidigt.

Basicen är otroligt utökad jämfört med C64 och VIC20. En VIC20/C64 har ca 70 kommandon. En C128 har hela 171 stycken. En massa kommandon för att rita grafik, köra runt med spritar, spela ljud etc... Man kan programmera en C128 utan ett enda POKE eller PEEK.

En finess på den svenska modellen är en caps-lock knapp för svenska tecken. Med den nedtryckt får du ÅÄÖ och med den uppe får du []&. Tecknena på skärmen ändras samtidigt som du trycker på knappen. Fungerar både i C128- och C64-läget. 128an har en massa trevliga finesser, som auto insert, auto radnummer, maskinkodsmonitor, spriteeditor, directory och andra diskkommandon. En massa trevligt faktiskt. Den har det mesta som man stör sig på att 64an saknar. 128an är på det hela taget en mycket lyckad hobbydator. Samtidigt är den ett ganska underligt hopkok av olika processorer och operativsystem. Man kan undra hur de fick ihop det egentligen. På tiden det begav sig använde de flesta 128-ägare enbart TV-grafiken (VIC-II) och aldrig CP/M. Man köpte alltså en dator på vilken man aldrig använde ett grafikchip samt en processor. Så man använde i princip bara halva datorkraften, eller snarare en fjärdedel eftersom man körde processorn på 1MHz. Lite löjligt, men faktiskt också det som gör 128an kul på något sätt.

Om du kikar på hur denna dator ser ut (som ju kom 1985) så ser du många gemensamma drag med både Amiga500 och C64-C. Vid samma tid så såg 64an ut som en VIC20. C128an var alltså datorn som satte standarden för hemdatorers utseende får många år frammåt.

Mer om VDC-grafiken

VDC-grafik-chippet är inte mappat mot det normala minnet som VIC-chippet utan all kommunikation med grafiken sker genom två bytes i minnet. Lite förenklat kan man säga att den ena minnespositionen ($D600) bestämmer vilket av VDC's register som ligger på den andra minnsepositionen ($D601). Från Basicen är detta faktiskt ganska enkelt:
För att skriva till ett VDC-register: SYS52684,värde,registernummer
För att läsa ett register: SYS52698, ,registernummer:RREG A
(så har man sedan värdet i variabeln A.)

Det finns en hög olika register i VDC-chippet. En mycket bra artickel om detta hittade jag här. Men jag kan ju ta upp hur man skriver och läser till VDC-chippets egna minne. Minnet är uppdelat enligt följande:

0000-07FF Skärm
0800-0FFF Attribut (färg m.m.)
1000-1FFF Inte använt normalt sett
2000-2FFF Typsnitt data stora bokstäver
3000-3FFF Typsnitt data små bokstäver

Man kan även köra hela minnet som en stor bitmappsbild, men denna lista gäller den normala tecken-skärmen. För att läsa och skriva till minnet kan man använda följande register i VDC: 18 = Address hög byte, 19 = Address låg byte, 31 = innehåll på adressen. Här kommer nu ett enkelt exempel i basic som använder detta.

10 FAST:V=52684
20 A%=1000 : REM ADRESS ATT SKRIVA TILL.
30 BANK1:H=PEEK(POINTER(A%)):L=PEEK(POINTER(A%)+1):BANK15 : REM GÖR OM TILL BYTES
40 SYS V,H,18 : SYS V,L,19 : REM SÄTT ADRESS I VDC'S MINNE
50 SYS V,81,31 : REM SKRIV 81 (BOLL) TILL ADRESSEN SAMT RÄKNA UPP DEN MED 1
60 SYS V,65,31 : REM SKRIV 65 (SPADER) OCH RÄKNA UPP MED 1 IGEN
100 REM FÖLJANDE SÄTTER FÄRG OCH ATTRIBUT FÖR NYSS UTRITADE BOLL OCH SPADER
110 A%=DEC("0800")+1000 : REM SAMMA POS I FÄRGMINNET
120 BANK1:H=PEEK(POINTER(A%)):L=PEEK(POINTER(A%)+1):BANK15 : REM GÖR OM TILL BYTES
130 SYS V,H,18 : SYS V,L,19 : REM SÄTT ADRESS I VDC'S MINNE
140 SYS V,13+16,31 : REM GUL BLINKANDE
150 SYS V,4+16+64,31 : REM GRÖN BLINKANDE REVERSERAD


Programmet sätter ut en gul blinkande boll och en grön blinkande reverserad spader på mitten på skärmen. På samma sätt kan man enkelt göra egna tecken. Det är bara att skriva i typsnitt-minnet. VDC läser alltid typsnittet från RAM nämligen. Det kopieras in dit när datorn startas, samt om du trycker på knappen för svenska tecken. Om du ändrar på tecknena så återställs de inte ens om du gör en RUNSTOP-RESTORE...

Det kan ju vara intressant att veta hur snabbt det går att använda dessa VDC-register från basic, så jag gjorde två testprogram. Det första skriver bara in 600 tecken i följd i skärm-minnet. Både för VDC och för VIC-II. När VDC används så ställer jag om datorn till FAST och tvärt om:

10 fast : s=52684
20 o=timer
30 syss,0,18:syss,0,19:fort=1to600:syss,65,31:next
40 l=timer:print(l-o)/60
60 graphic0:slow
70 o=timer
80 fort=1024to1623:poket,65:next
90 l=timer
100 graphic5:print(l-o)/60



Resultatet: VDC 2,7 sekunder, VIC-II 3.8 sekunder. VDC var 40,7% snabbare.

I nästa test lägger jag in tecken på slumpvis valda positioner i skärm-minnet. Detta borde vara snabbare på VIC-II eftersom ett antal instruktioner behövs för varje tecken på VDC, men inte på VIC.

10 fast:d=52684:a=256:q=18:w=19:z=31:b=81:o=2000:s=1024:n=1000
20 e=timer
30 fort=1to300:s%=rnd(1)*o:h%=s%/a:sysd,h%,q:sysd,s%-h%*a,w:sysd,b,z:next
40 print (timer-e)/60
45 slow
50 e=timer
60 fort=1to300:pokernd(1)*n+s,b:next
70 print (timer-e)/60




Resultatet: VDC 6,0 sekunder, VIC-II 4,3 sekunder. VIC-II var 39,5% snabbare.

Så det blev typ oavgjort mellan chippen.

Men, varför inte använda lite maskinkod för att reducera de tre SYS-anropen för VDC-grafiken till bara ett?

MONITOR

A 01300 PHA
  01301 LDA #$12
  01303 STA $D600
  01306 BIT $D600
  01309 BPL $1306
  0130B STX $D601
  0130E LDA #$13
  01310 STA $D600
  01313 BIT $D600
  01316 BPL $1313
  01318 STY $D601
  0131B LDA #$1F
  0131D STA $D600
  01320 BIT $D600
  01323 BPL $1320
  01325 PLA
  01326 STA $D601
  01329 RTS
  
S "VDCWRITE",08,01300,0132A
X

NEW
  
5 BLOAD "VDCWRITE"
10 FAST:D=4864:A=256:B=81:X=2000
20 E=TI
30 FORT=1TO300:S%=RND(1)*X:H%=S%/A:SYSD,B,H%,S%-H%*A:NEXT
40 PRINT(TI-E)/60
  
RUN
  


Och resultatet? 4.4 sekunder... Alltså ungefär lika snabbt som VIC-II-chippet!
Jag kanske skall förklara hur du anropar maskinkoden ovan: SYS 4864,värde,adress hög byte, address låg byte. Allså i princip som att pokea in värdet men att du behöver dela upp adressen i två bytes först. Man kan ju göra detta som en subrutin om man vill göra det lite enkelt för sig:

5 BLOAD "VDCWRITE"
10 FAST:D=4864:N=256
15 REM
20 A=1000 : REM ADRESS ATT SKRIVA TILL, (MITT PÅ SKÄRMEN)
30 V=81 : REM VÄRDE, (BOLL)
40 GOSUB 500 : REM ANROPA SUBRUTINEN
50 END
60 REM
490 REM *** VDC-POKER SUBRUTIN ***
500 H%=A/N:SYSD,V,H%,A-H%*N:RETURN




(Obs otestad, men borde funka fint.)

CHAR!

...Eller varför inte låta basicen ta hand om alltihop. Jag hittade just ett kommando som gör precis vad jag håller på med, att placera ut text på skärmen vid en given position. Char heter kommandot...

10 FAST:A=79:B=24
20 E=TI
30 FORT=1TO300:CHAR,RND(1)*A,RND(1)*B,"O":NEXT
40 E=(TI-E)/60
50 CHAR0,0,24:PRINT:PRINT E



Och resultatet: 3.1 sekunder! Klart snabbast. Och mycket enklare att använda också... Samma program för 40-teckensdisplayen (byt ut första raden till 10 SLOW:A=39:B=24) gav 6.6 sekunder...

Förresten... Anledningen till att jag använt en massa variabler i exemplen, t.ex V=4864 och sedan använt SYSV istället för att överallt skriva SYS4864 beror på att det blir ganska mycket snabbare när man använder variabler. Och programmet blir även mindre.

Fler hastighetstester

128an prövas mot andra datorer i museet! Läs vidare här! Ta även en titt på Mina C128-program.

Tillbaka till
Anders Datormuseums index