Il MOS VDC (acronimo di Video Display Controller, anche MOS 8563) è un processore prodotto da MOS Technology ed utilizzato come chip video nel computer Commodore 128.

Era capace di gestire una modalità ad 80 colonne (640x200 pixel) in formato RGBI (RGB plus Intensity), il cui segnale è compatibile con lo standard CGA. I modelli D/DCR del C128 usano invece il più avanzato 8568 [D]VDC. È stato il chip più difficile da produrre rispetto a tutti gli altri chip di MOS, ha avuto anche problemi tecnici legati a difetti di timing che portavano al suo malfunzionamento[1].

 
Il VDC fu progettato per l'utilizzo con programmi da ufficio. Qui si vede lo SpeedScript 128, un word processor per il C128.

Originariamente previsto per l'uso in un computer da ufficio basato su Unix che non fu mai realmente costruito, la Commodore ripensò il VDC per l'uso su diversi prodotti: di questi solo il C128 vide la produzione.

Poco dopo il rilascio del C128, la modalità bitmap del VDC fu descritta in dettaglio in un libro pubblicato inizialmente dalla casa editrice tedesca Data Becker, dove un listato in linguaggio Assembly proposto dagli autori permetteva di accendere o spegnere qualunque pixel video o, utilizzando il BASIC per effettuare i necessari calcoli, generare figure geometriche in bitmap sullo schermo ad 80 colonne. Nel febbraio del 1986 la rivista informatica americana RUN pubblicava Ultra Hi-Res Graphics, un articolo in cui descriveva la modalità bitmap del VDC ed includeva un listato in Assembly che estendeva il BASIC 7.0 per supportare la modalità grafica a 640x200 offerta dall'8563[2]. Gli autori Lou Wallace e David Darus convertirono il programma Ultra Hi-Res in un pacchetto commerciale denominato BASIC 8.0, che divenne uno dei più popolari programmi di utilità per il C128. Successivamente Commodore offrì la documentazione completa del VDC nel Commodore 128 Programmer's Reference Guide e le modalità bitmap del chip furono intensamente utilizzate nella versione per C128 del sistema operativo GEOS.

Caratteristiche e descrizione

modifica

Ufficialmente il VDC era un chip nato per sole modalità testuali, anche se un'attenta lettura dei documenti tecnici che gli ingegneri MOS fornirono con il chip, permise di capire agli sviluppatori del C128 che sarebbe stato possibile utilizzare il chip in una modalità grafica ad alta risoluzione (640x200 pixel) di tipo bitmap, anche se il BASIC 7.0 del Commodore 128 supportava modalità grafiche solo nei modi a 40 colonne (320x200 pixel) attraverso il vecchio chip VIC-II. A differenza dei precedenti chip video MOS quali il VIC-II, il VDC aveva una RAM video dedicata di 16 KB (espandibili a 64) nel C128 originale e di 64 KB nel Commododore 128D (la versione con tastiera separata dal computer). Questa RAM non era direttamente utilizzabile dal microprocessore.

Il VDC non supportava inoltre gli sprite e ciò limitava il suo uso nei giochi. Era però capace di supportare il blitting, vale a dire poteva effettuare copie di blocchi della sua memoria video: questa funzionalità fu usata dall'editor video in ROM per pulire o scorrere rapidamente sezioni video.

Specifiche tecniche

modifica
  • Uscita RGBI (RGB plus Intensity) compatibile con lo standard video CGA di IBM.
  • 16 o 64 kilobyte di memoria dedicata (separata dalla memoria di sistema).
  • Risoluzione di 640x200 pixel (640×400 in modalità interlacciata).
  • Risoluzione di 720x700 pixel (risoluzione massima con 64 KB di memoria video) [1]
  • Modalità testuali ad 80x25, 80x50 e 40x25 caratteri.
  • 8 colori con 2 intensità.

Programmazione

modifica

L'indirizzamento dei registri interni e della memoria video dedicata del VDC deve essere fatto in maniera indiretta. Prima di tutto bisogna dire al VDC quale dei suoi 37 registri interni deve essere usato, poi il programma deve attendere finché il VDC non è pronto all'accesso ed infine si può accedere in lettura o scrittura. Il seguente codice Assembly è per un'operazione di lettura:

        ldx #regnum       ;VDC register to access
        stx $d600         ;write to control register
loop    bit $d600         ;check bit 7 of status register
        bpl loop          ;VDC not ready
        lda $d601         ;read from VDC register
        ...

Mentre il seguente codice è per una tipica operazione di scrittura:

        ldx #regnum       ;VDC register to write to
        stx $d600         ;write to control register
loop    bit $d600         ;check bit 7 of status register
        bpl loop          ;VDC not ready
        sta $d601         ;write to VDC register
        ...

L'accesso ai registri del VDC è possibile anche attraverso il BASIC, chiamando alcune routine del KERNAL :

Il codice seguente permette la lettura di uno dei registri del VDC, dove register è un numero tra 0 e 36 (vedi tabella):

BANK15
...
SYS DEC("CDDA"),, register : RREG VDC
REM $ccda aka 52698 in decimal
PRINT VDC
         ...

Il codice seguente invece implementa la scrittura di uno dei registri del VDC, dove register è un numero tra 0 e 36 (vedi tabella), e value è un numero tra 0 to 255

BANK15
...
SYS DEC("CDCC"), value, register
REM $ccdc aka 52684 in decimal
         ...

A causa di questo curioso modo di controllo del VDC il frame rate massimo in modalità bitmap è in genere troppo basso per un qualunque gioco in stile "arcade" dove invece la manipolazione intensiva dei bit è una caratteristica fondamentale.

Elenco dei registri

modifica

Questo elenco è stato estrapolato dalla guida Commodore 128 Programmer's Reference Guide[3]

Registro $Hex Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Descrizione
0
$00
HT7
HT6
HT5
HT4
HT3
HT2
HT1
HT0
Horizontal Total
1
$01
HD7
HD6
HD5
HD4
HD3
HD2
HD1
HD0
Horizontal Displayed
2
$02
HP7
HP6
HP5
HP4
HP3
HP2
HP1
HP0
Horizontal Sync Position
3
$03
VW3
VW2
VW1
VW0
HW3
HW2
HW1
HW0
Vertical/Horizontal Sync Width
4
$04
VT7
VT6
VT5
VT4
VT3
VT2
VT1
VT0
Vertical Total
5
$05
--
--
--
VA4
VA3
VA2
VA1
VA0
Vertical Adjust
6
$06
VD7
VD6
VD5
VD4
VD3
VD2
VD1
VD0
Vertical Displayed
7
$07
VP7
VP6
VP5
VP4
VP3
VP2
VP1
VP0
Vertical Sync Position
8
$08
--
--
--
--
--
--
IM1
IM0
Interlace Mode
9
$09
--
--
--
--
CTV4
CTV3
CTV2
CTV1
Character Total Vertical
10
$0A
--
CM1
CM0
CS4
CS3
CS2
CS1
CS0
Cursor Mode, Start Scan
11
$0B
--
--
--
CE4
CE3
CE2
CE1
CE0
Cursor End Scan Line
12
$0C
DS15
DS14
DS13
DS12
DS11
DS10
DS9
DS8
Display Start Address High Byte
13
$0D
DS7
DS6
DS5
DS4
DS3
DS2
DS1
DS0
Display Start Address Low Byte
14
$0E
CP15
CP14
CP13
CP12
CP11
CP10
CP9
CP8
Cursor Position High Byte
15
$0F
CP7
CP6
CP5
CP4
CP3
CP2
CP1
CP0
Cursor Position Low Byte
16
$10
LPV7
LPV6
LPV5
LPV4
LPV3
LPV2
LPV1
LPV0
Light Pen Vertical Position
17
$11
LPH7
LPH6
LPH5
LPH4
LPH3
LPH2
LPH1
LPH0
Light Pen Horizontal Position
18
$12
UA15
UA14
UA13
UA12
UA11
UA10
UA9
UA8
Update Address High Byte
19
$13
UA7
UA6
UA5
UA4
UA3
UA2
UA1
UA0
Update Address Low Byte
20
$14
AA15
AA14
AA13
AA12
AA11
AA10
AA9
AA8
Attribute Start Address High Byte
21
$15
AA7
AA6
AA5
AA4
AA3
AA2
AA1
AA0
Attribute Start Address Low Byte
22
$16
CTH3
CTH2
CTH1
CTH0
CDH3
CDH2
CDH1
CDH0
Character Total Horizontal, Character Display Horizontal
23
$17
--
--
--
CDV4
CDV3
CDV2
CDV1
CDV0
Character Display Vertical
24
$18
COPY
RVS
CBRATE
VSS4
VSS3
VSS2
VSS1
VSS0
Vertical Smooth Scrolling
25
$19
TEXT
ATR
SEMI
DBL
HSS3
HSS2
HSS1
HSS0
Horizontal Smooth Scrolling
26
$1A
FG3
FG2
FG1
FG0
BG3
BG2
BG1
BG0
Foreground/Background color
27
$1B
AI7
AI6
AI5
AI4
AI3
AI2
AI1
AI0
Address Increment per Row
28
$1C
CB15
CB14
CB13
RAM
--
--
--
--
Character Base Address
29
$1D
--
--
--
UL4
UL3
UL2
UL1
UL0
Underline Scan Line
30
$1E
WC7
WC6
WC5
WC4
WC3
WC2
WC1
WC0
Word Count
31
$1F
DA7
DA6
DA5
DA4
DA3
DA2
DA1
DA0
Data Register
32
$20
BA15
BA14
BA13
BA12
BA11
BA10
BA9
BA8
Block Start Address High Byte
33
$21
BA7
BA6
BA5
BA4
BA3
BA2
BA1
BA0
Block Start Address Low Byte
34
$22
DEB7
DEB6
DEB5
DEB4
DEB3
DEB2
DEB1
DEB0
Display Enable Begin
35
$23
DEE7
DEE6
DEE5
DEE4
DEE3
DEE2
DEE1
DEE0
Display Enable End
36
$24
--
--
--
--
DRR3
DRR2
DRR1
DRR0
DRAM Refresh Rate
  1. ^ (EN) Commodore 128 - The Most Versatile 8-Bit Computer Ever Made, su commodore.ca.
  2. ^ (EN) Ultra Hi-Res Graphics - A Breakthrough On Your C-128 (JPG), in RUN, n. 26, Peterborough (USA), CW Communications, febbraio 1986, p. 34, ISSN 0741-4285 (WC · ACNP). Trascrizione del testo, su cbmfiles.com.
  3. ^ Commodore Capital, Inc., (1986). Commodore 128 programmer's reference guide. New York, NY: Bantam Books, Inc.

Collegamenti esterni

modifica
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica