// DispProms.bcpl last modified by:
// Pier November 10, 1983 2:15 PM: Added Empty to Disp PROM
// Taft June 9, 1983 6:17 PM: LF and Alto waveforms for white borders; remove IDISProms
// Taft September 11, 1982 2:36 PM: new LF waveforms
// Gene January 20, 1982: eliminate duplicate prom production
// PIER July 14, 1981: added DispM proms for LF and Alto displays
external DisplayProms
get "DoradoProms.defs"
//proms for Ken's real display controller
let DisplayProms(mem) be
[
let buff = vec 512
if (StEq(mem,"DISPY") % StEq(mem,"DISPL") % (StEq(mem,"DisPromA"))) & ICtype eq MC10149 then
[
MakeDisProm(buff)
Header("DisPromA",4,buff,256,0)
PromCommand("DisPromA-i15")
]
if (StEq(mem,"DISPY") % StEq(mem,"DISPL") % (StEq(mem,"DisPromB"))) & ICtype eq MC10149 then
[
MakeDisProm(buff)
Header("DisPromB",4,buff,256,0)
PromCommand("DisPromB-l15")
]
if StEq(mem,"DISPM") then mem!0 = DoAll
if StEq(mem,"Disp-LF") & ICtype eq MC10149 then // define the Prom
[
MakeHRomLF(buff)
Header("LFProm-Low",4,buff,256,12)
PromCommand("LFProm-b20","0","0") // low 256 words
Header("LFProm-High",4,buff+256,256,12)
PromCommand("LFProm-a16","0","0") // high 256 words
]
if StEq(mem,"Disp-Alto") & ICtype eq MC10149 then // define the Prom
[
MakeHRomAlto(buff)
Header("AltoProm",4,buff,256,12)
PromCommand("AltoProm-b20","0","0") //only need low 256 words
]
]
// This PROM generates the following waveform:
// 336 bits of sync
// 20 bits of blanked left border
// 1072 bits visible
// 12 bits of blanked right border
// ----
// 1440 bits total
// Also it generates 360 bits of HalfLine starting 1440/2 = 720 bits after the
// start of sync.
and MakeHRomLF(buff) be
[
manifest [ notSync = #10; HSync = 4; HBlank = 2; HalfLine = 1 ]
Zero(buff,512)
for addr = 0 to 511 do
[
// The HRom clock ticks once for every four pixels.
// Additionally, HSync starts during the LAST HRom clock of a scan line
// instead of the first one; this accounts for the +1 below:
let pixelsSinceSync = 4*((addr+1) rem 512)
let Contents = pixelsSinceSync ls 336 % pixelsSinceSync ge 1440? HSync, notSync
if pixelsSinceSync ls 336+20 % pixelsSinceSync ge 336+20+1072 then
Contents = Contents % HBlank
if pixelsSinceSync ge 1440/2 & pixelsSinceSync ls 1440/2+336 then
Contents = Contents % HalfLine
buff!addr = Contents
]
]
// This PROM generates the following waveform:
// 68 bits of sync
// 20 bits of blanked left border
// 656 bits visible
// 16 bits of blanked right border
// ----
// 760 bits total
// Also it generates 68 bits of HalfLine starting 760/2 = 380 bits after the
// start of sync.
// *** Note: this has been changed since last tested ***
and MakeHRomAlto(buff) be
[
manifest [ notSync = #10; HSync = 4; HBlank = 2; HalfLine = 1 ]
Zero(buff,256)
for addr = 0 to 255 do
[
// The HRom clock ticks once for every four pixels.
// Additionally, HSync starts during the LAST HRom clock of a scan line
// instead of the first one; this accounts for the +1 below:
let pixelsSinceSync = 4*((addr+1) rem 256)
let Contents = pixelsSinceSync ls 68 % pixelsSinceSync ge 760? HSync, notSync
if pixelsSinceSync ls 68+20 % pixelsSinceSync ge 68+20+656 then
Contents = Contents % HBlank
if pixelsSinceSync ge 760/2 & pixelsSinceSync ls 760/2+68 then
Contents = Contents % HalfLine
buff!addr = Contents
]
]
and MakeDisProm(buff) be
[
manifest [ Full = #10; WriteEn = 4; ReadEn = 2; Empty = 1 ]
Zero(buff,256)
for adr = 0 to 255 do
[
let contents = 0
let RP = adr rshift 4
let SP = adr & #17
let Delta = (RP-SP)
if Delta eq 1 then
[ contents<<MCM149.Pin15 = 1; contents<<MCM149.Pin14 = 1 ]
if Delta eq 0 then
[ contents<<MCM149.Pin12 = 1 ]
buff!adr = contents
]
]