P8000/UDOS/WEGA/K.PROM.S

276 lines
4.5 KiB
ArmAsm

!******************************************************************************
*******************************************************************************
U D O S - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1989
pburn Modul: K.PROM.S
Bearbeiter: P. Hoge, R. Kuehle
Datum: 18.4.1989
Version: 2.1
*******************************************************************************
******************************************************************************!
PROM module
constant
rd := 1
wt := 2
false := 0
external
intppb procedure (byte byte)
bcoff procedure !turns off programmer!
rbyte procedure (word) returns (byte)
wbyte procedure (word byte)
p2708 procedure (word)
lchar procedure returns (byte)
schar procedure (byte)
ueb16 procedure
sdlc procedure (byte byte byte) returns (byte byte)
BUF array [%4000 byte]
old byte !0 - board 2
ungleich 0 - board 1!
global
errflg byte
Vpp byte !programmierspannung 1 - 25 V
2 - 21 V
3 - 12.5 V
4 - free V!
PM byte !program mode 0 - high speed
1 - normal speed!
internal
ptype byte
begadr word
nbytes word
promadr word
char, read_write byte
k byte
i, len word
d, e byte
internal
readprom procedure
entry
intppb(rd ptype)
if errflg<>false then return fi
i := 0
do
ueb16
BUF[i] := rbyte(promadr)
if errflg<>false then exit fi
len := len-1
if len=0 then exit fi
promadr := promadr+1
i := i+1
od
bcoff
end readprom
writeprom procedure
entry
intppb(wt ptype)
if errflg<>false then return fi
promadr:=begadr
len:=nbytes
if ptype=0 then p2708(nbytes)
else
i := 0
do
wbyte(promadr,BUF[i])
if errflg=3 then schar (3)
char:=lchar
if char='n' then exit
else errflg:=0
fi
fi
if errflg<>false then exit fi
len := len-1
if len=0 then exit fi
promadr := promadr+1
i := i+1
od
fi
bcoff
end writeprom
! anpassung schnittstelle 16-bit/8-bit p8000 fuer burn (wega)
*********************************************************** !
global
prom procedure
entry
errflg:=false
! read, write, erase, crc !
read_write:=lchar
! type prom !
ptype:=lchar
! beginn adresse prom !
char:=lchar
begadr:=word char !high!
begadr:=begadr * 256
char:=lchar
begadr:=begadr or word char !low!
promadr:=begadr
! laenge prom !
char:=lchar
nbytes:=word char !high!
nbytes:=nbytes * 256
char:=lchar
nbytes:=nbytes or word char !low!
len:=nbytes
!programmierspannung Vpp!
Vpp:=lchar
!program mode!
PM:=lchar
schar('q') !acknowledge!
! initialisierung EPROM-Programmer Board Abfrage !
if read_write=5 then intppb (0 0) fi
i:=0
! write prom
********* !
if read_write=2 then
do
k:=64
do
BUF[i]:=lchar
i:=i+1
k:=k-1
len:=len-1
if len=0 then exit fi
if k=0 then exit fi
od
schar('q')
if len=0 then exit fi
od
writeprom
if errflg<>3 then schar (errflg) fi
! ruecklesen prom; feststellen programmierfehler;
uebergabe an wega bei Standard Speed Program Mode !
if errflg=false then if PM=1 then
promadr:=begadr
len:=nbytes
i:=0
intppb(rd ptype)
do
ueb16
char:=rbyte(promadr)
if errflg<>false then exit fi
if char<>BUF[i] then errflg:=3 exit fi
len := len-1
if len=0 then exit fi
promadr:=promadr+1
i:=i+1
od
bcoff
schar(errflg)
fi
fi
fi
! read prom
********* !
if read_write=1 then
readprom
schar(errflg)
if errflg=false then
i := 0
len:=nbytes
do
k:=64
do
schar(BUF[i])
i:=i+1
k:=k-1
len:=len-1
if len=0 then exit fi
if k=0 then exit fi
od
char:=lchar
if len=0 then exit fi
od
fi
fi
! erase prom
********** !
if read_write=3 then
intppb(rd ptype)
do
ueb16
char:=rbyte(promadr)
if errflg<>false then exit fi
if char<>%FF then errflg:=3 exit fi
len:=len-1
if len=0 then exit fi
promadr:=promadr+1
od
bcoff
schar(errflg)
fi
! crc prom
******** !
if read_write=4 then
d:=%ff
e:=%ff
k:=0
intppb(rd ptype)
do
ueb16
char:=rbyte(promadr)
if errflg<>false then k:=errflg exit fi
if char<>%FF then k:=3 fi
d,e:=sdlc(char,d,e)
len:=len-1
if len=0 then exit fi
promadr:=promadr+1
od
bcoff
schar(k)
if errflg=false then
schar(d)
schar(e)
fi
fi
!prom programmer board
*********************!
if read_write=5 then
if old=0 then schar('2')
else schar('1')
fi
fi
end prom
end PROM