// IFUProms.bcpl
external [ JunkIOProms; IFUProms ]
get "DoradoProms.defs"
structure Mouse[
blank bit 8
MX1 bit
MX2 bit
MY1 bit
MY2 bit
MX1dly bit
MX2dly bit
MY1dly bit
MY2dly bit
]
//The Mouse Prom places a number to indicate X and Y mouse motion as follows:
// Prom=0: Y=0, X=0
// Prom=1: Y=0, X=X+1
// Prom=2: Y=0, X=X-1
// Prom=3: Y=Y+1, X=0
// Prom=4: Y=Y+1, X=X+1
// Prom=5: Y=Y+1, X=X-1
// Prom=6: Y=Y-1, X=0
// Prom=7: Y=Y-1, X=X+1
// Prom=8: Y=Y-1, X=X-1
let IFUProms(mem) be
[
let buff = vec 300
if StEq(mem,"IFU") then mem!0 = DoAll
if StEq(mem,"DSel") & ICtype eq MC10139 then//define the Data Select Prom
[
MakeDataSelect(buff)
Header("Data-Select",8,buff,32,8)
PromCommand("IFU-a06")
]
]
and JunkIOProms(mem) be
[
let buff = vec 300
if StEq(mem,"JunkIO") then mem!0 = DoAll
if StEq(mem,"IFU") then mem!0 = DoAll
if StEq(mem,"Mouse-Motion") & ICtype eq MC10149 then//define the MouseMotion Prom
[
MakeMouseMotion(buff)
Header("Mouse-Motion",4,buff,256,12)
PromCommand("IFU-i03")
]
if StEq(mem,"Keyboard-Map") & ICtype eq I3601 then//define the KeyboardMap Prom
[
MakeKeyboardMap(buff)
Header("Keyboard-Map",8,buff,128,8)
PromCommand("IFU-k05")
PromCommand("IFU-l05","4") //command for right nibble
]
]
and MakeMouseMotion(buff) be
[
Zero(buff,256)
let Ydir,Xdir = nil,nil
for addr = 0 to 255 do
[
Xdir = 0
if addr<<Mouse.MX1 ne addr<<Mouse.MX1dly then
Xdir = (addr<<Mouse.MX1 xor addr<<Mouse.MX2) + 1 //+1 or +2
if addr<<Mouse.MX2 ne addr<<Mouse.MX2dly then
Xdir = (addr<<Mouse.MX1 xor addr<<Mouse.MX2 xor 1) + 1 //+2 or +1
Ydir = 0
if addr<<Mouse.MY1 ne addr<<Mouse.MY1dly then
Ydir = (addr<<Mouse.MY1 xor addr<<Mouse.MY2) + 1 //+1 or +2
if addr<<Mouse.MY2 ne addr<<Mouse.MY2dly then
Ydir = (addr<<Mouse.MY1 xor addr<<Mouse.MY2 xor 1) + 1 //+2 or +1
buff!addr = 3*Ydir + Xdir
]
]
and MakeKeyboardMap(buff) be
[
let Map = table
[
08; 00; 16; 29; 36; 30; 37; 11 //addr=00
52; 46; 60; 53; 63; 49; 05; 61 //addr=08
28; 20; 21; 25; 22; 26; 56; 45 //addr=16
31; 57; 58; 59; 62; 41; 51; 33 //addr=24
24; 12; 13; 02; 14; 03; 38; 19 //addr=32
23; 27; 55; 54; 34; 50; 04; 06 //addr=40
01; 09; 10; 17; 18; 44; 39; 47 //addr=48
15; 43; 40; 32; 35; 48; 07; 42 //addr=56
]
Zero(buff,256)
for val = 0 to 63 do
for addr = 0 to 63 do if Map!addr eq val then buff!val = addr
for val = 64 to 127 do
buff!val = (val-64) xor #60
for val = 0 to 127 do
buff!val = buff!val xor #77
]
and MakeDataSelect(buff) =valof //define data select control for instructions types
[
let TableDef = table
[
#377; #377; #377; #377; #377; #367; #263; #221
#377; #377; #377; #377; #377; #377; #225; #204
#377; #377; #377; #377; #377; #377; #167; #063
#377; #377; #377; #377; #377; #377; #073; #031
]
MoveBlock(buff,TableDef,32)
]