[abc80] ABC firmware & disk images
H. Peter Anvin
hpa at zytor.com
Sön Mars 19 10:09:33 PST 2006
exon at lysator.liu.se wrote:
> Hej igen!
>
> Det visade sig efter lite experimenterande, att det är samma firmware för
> 800M och C. Bildminnet i 800C saknar dock udda adresser, vilket används
> för att avgöra om skärmbredden blir 40 eller 80 tecken. Listigt!
>
Eh? Såvitt jag vet hade ABC800C samma bildminnesstruktur som ABC80.
800C hade ingen 6845 utan använde ett par chips from Philips som normalt
användes till Text-TV. Däremot 802:an och 806:an betedde sig som du
beskriver.
ABC800C hade ingen (officiell) 80-teckensoption.
> Nu är den stora frågan hur videoenheten egentligen hanterar alla
> styrkommandon typ RED NWBG FLSH DBLE GGRN etc, samt hur text, blockgrafik
> och högupplösningsgrafik egentligen samverkar... tips, någon?
Jag kan beskriva det för 800C; 806:an hade ett helt annorlunda system.
I vilket fall som helst...
Först, det är värt att påpeka att WHT == CHR¤(135), och GWHT ==
CHR¤(151), d.v.s samma koder som rekommenderades för användning I ABC80.
De tappar översta bitten när de läggs i bildminnet, men den bitten
undviker att 135-128 = 7 blir pip, etc.
Det fanns många fler som fungerade, men dessa var framåtkompatibla.
Här är attributmotorn i min ABC80-FPGA, som har så vitt jag vet en
ABC800C-kompatibel grafikenhet:
if ( thischar[6:5] == 2'b00 )
begin
// Control character
casex ( thischar[4:0] )
5'bx0xxx:
begin
curfg <= thischar[2:0];
isgraph <= thischar[4];
end
5'b0110x:
isdble <= thischar[0];
5'b11000:
ishide <= 1'b1;
5'b1111x:
isgrel <= thischar[0];
5'b0100x:
isflsh <= ~thischar[0];
5'b11001:
isgsep <= 1'b0;
5'b11010:
isgsep <= 1'b1;
5'b11100: // BLBG
begin
curbg <= 3'b000;
curfg <= curbg;
end
5'b11101: // NWBG
begin
curbg <= curfg;
curfg <= 3'b000;
end
endcase // casex( thischar[4:0] )
end // if ( thischar[6:5] == 2'b00 )
Två saker att påpeka:
1. min motor tillåter tecken 0 som BLK och 16 som GBLK, de fanns inte i
800C (däremot fanns de i 806.) Den riktiga 800C ignorerade koder 0 och 16.
2. Efter DBLE tog ett tecken dubbelt så stor plats; i 800C visades
*alltid* den övre raden oavsett vad som fanns i bildminnet för den undre
raden. Om alla rader hade DBLE text visades följaktligen varannan rad!
Vad gäller högupplösningsgrafik (återigen, vad gäller 800C):
Det fanns 128 paletter för som man kan välja mellan (4 av 8 färger);
normalt ansågs höggrafiken som "bakom" texten, men om man satte bit 7 i
palettkommandot var höggrafiken "framför" texten.
Jag är lite osäker på precis hur blandingen fungerade; jag är rätt säker
att var gäller textskärmen ansågs svart vara "genomskinlig"; det är
troligt det gällde grafiken med.
Upplösningen var 240x240 i rader om 64 bytes (256 pixlar) med början på
adress 0; HR-minnet var ett speciellt minne som "blev synligt" om man
exekverade kod på adresserna 0x7800..0x7fff. På adress 0x7ffd fanns
subrutinen "LDIR ; RET".
Observera att då textmatrisen var 6x10 gånger 40x25 var alltså
grafikupplösningen på 240x240 samma som textupplösningen.
----
800M hade samma höggrafiksystem som 800C, utom att alla färger som inte
var svarta blev den monokroma färgen. 800M:s textsystem var
6845-baserat och hade inget stöd för låggrafik. Bildminnet var linjärt
i minnet från adress 7800h framåt.
802:an var samma som 800M, men med stöd för låggrafik och för att välja
mellan 40 och 80 tecken. I 40-teckensmod hoppar den över varannan
adress. Dessutom användes bit 7 i 802:an för invers video (liknande
80:ans blink.)
802:an hade 64K minne; 32K av detta var tillgängligt som ramdisk (MEM:)
men hade ingen grafisk funktion. Däremot betydde det att det gick att
köra CP/M på 802:an utan extra hårdvara.
806:an hade ett system liknande 802:an, men med ett extra attributminne
för varje tecken; detta attributminne var I/O-mappat. 806:ans textdel
var den enda i ABC-serien som kunde sätta färger och andra attribut utan
att ta upp utrymme i form av blanktecken. Dessutom var det den enda som
stödde att blanda 40- och 80-teckenstext på samma skärm; det kallades
"EL" (elongated) och kunde kombineras med DBLE (vad jag inte är säker på
är om DBLE implicerade EL). Detta lagrades i attributminnet, och till
skillnad från 800C krävde 806:an att alla rutor som togs över av ett
"stort" tecken hade samma information -- annars blev en del av tecknet
överskrivet.
806:an hade också ett mer avancerat höggrafiksystem som antingen kunde
göra 512x240 med 4 färger eller 256x240 med "16" färger; dessa kunde
vara frivilliga kombinationer av de 8 färger som fanns både "bakom" och
"framför" texten; representerad i BASIC med en sträng av vanliga
färgkoder och grafiska färgkoder, respektive. 806:an kunde förses med
upp till 128K grafikminne, vilket stödde 4 sidor och/eller fungerade som
ramdisk (RAM:).
> TeleDisk-formatet tycks vara ytters "proprietärt" och finns inte beskrivet
> någonstans, vad jag kan se. Däremot finns det folk på nätet som med
> varierande framgång försökt reverse-engineera det.
:(
More information about the ABC80
mailing list