;****************************************************************************** ;****************************************************************************** ; ; U D O S - Quelle (C) ZFT/KEAW Abt. Baisisoftware - 1987 ; ; burn Modul: K.P8000.S ; ; ; Bearbeiter: P. Hoge ; Change: R. Kuehle ; ; Datum: 27.03.1988 ; Version: 1.1 ; ;****************************************************************************** ;****************************************************************************** ;P8000 EPROM-Programmer (alter und neuer Programmer) EXTERNAL WAIT ;label EXTERNAL LODNET ;procedure EXTERNAL SNDNET ;procedure EXTERNAL prom ;procedure EXTERNAL errflg ;byte EXTERNAL UEB16 ;procedure EXTERNAL Vpp ;byte programmierspannung EXTERNAL PM ;byte program mode EXTERNAL BUF ;array [%4000 byte] GLOBAL PROM ;procedure(entry burn - prom programmer wega) GLOBAL intppb ;procedure(req byte, type byte) GLOBAL rbyte ;procedure(promadr word) ;returns(data byte) GLOBAL wbyte ;procedure(promadr word,data byte) GLOBAL p2708 ;procedure(nbytes word) GLOBAL bcoff ;procedure GLOBAL schar ;procedure(byte) GLOBAL lchar ;procedure returns(byte) GLOBAL ueb16 ;procedure GLOBAL sdlc ;procedure GLOBAL old ;byte prom programmer board ;INTERNAL l2val: defb -1 ;Steuerbits von Latch 2 l3prog: defb -1 ;latch 3 beim Programmieren l3chg: defb -1 ;latch 3 Umschalten Prog auf Verify l3ver: defb -1 ;latch 3 bei Verify old: defb -1 nmax: defb 1 time: defb 0 count: defw 100 ;loop counter 2708 ;CONSTANT ctc: equ 08h pio1ad: equ 18h pio1ac: equ 19h pio1bd: equ 1ah pio1bc: equ 1bh ;PROM - entry burn - prom programmer (wega) PROM: res 3,(hl) call prom jp WAIT ;intppb - Initialiesieren Programmer fuer ; req=0 Anfangsinitialisierung ; req=1 read ; req=2 write ireq equ 6 ityp equ 4 intppb: push ix ;save callers ix ld ix,0 add ix,sp ;point to in parameters ld a,(ix+ireq) ;get request type and a jr nz,rinit ;not initial request ld hl,isrctc ;isr adr ctc 0 kanal 3 ld (0f04h),hl ld b,inilen ld hl,initab iloop1: ld c,(hl) ;io address inc hl outi ;data byte jr nz,iloop1 in a,(pio1ad) ;alter Programmer = FF ;neuer Programmer = 00 ld (old),a or a ld b,ninilen ;Initialisierung neuer Programmer jr z,iloop2 ld b,oinilen ;Initialisierung alter Programmer iloop2: ld c,(hl) ;io address inc hl outi ;data byte jr nz,iloop2 jp initret ;return to caller ;Anfangsinitialisierung Programmer initab: defb pio1ac ;port a input defb 0cfh defb pio1ac defb 0ffh defb pio1bc ;port b defb 0 defb pio1bd defb 0fch ;daten defb pio1bc ;port b bit mode defb 0cfh defb pio1bc defb 40h ;bit 6 input inilen: equ ($-initab)/2 itab1: defb pio1bd defb 0ffh defb pio1ac ;port a output defb 0fh ninilen: equ ($-itab1)/2 defb pio1bd defb 11h defb pio1bd defb 9dh ;strobe latch 1; reset kurzschluss defb pio1bd defb 11h oinilen: equ ($-itab1)/2 ;Initialiesierung Read/Write fuer alten Programmer rinit: cp 1 ;initialize for read? jr nz,winit ;no ld e,(ix+ityp) ;prom typ call typ jr nz,initret ;invalid prom typ ld a,(old) or a jr z,ri1 ;neue Programmer-Karte ld hl,ritab jr rwinit ri1: call nrinit jr initret winit: cp 2 ;initialize for write? jr nz,initret ;no just return ld e,(ix+ityp) call typ jr nz,initret ;invalid prom typ ld a,(old) or a jr nz,wi1 call nwinit ;neuer Programmer jr initret wi1: ld hl,witab rwinit: ld e,(ix+ityp) ld d,0 add hl,de ;entry in table add hl,de add hl,de ;* 3 ex de,hl ld a,(de) ;latch 2 ld (l2val),a ;control bits latch 2 ld h,a call latch2 ;latch 2 init inc de ld a,0ffh call latch3 ;latch 3 inaktiv ld a,(de) ;prg inaktiv inc de or 81h ;+5V eprom out (pio1bd),a call wait50 and 7fh out (pio1bd),a ;reset Kurzschluss ld a,(de) ;latch 3 init or 10h ;prog spannung aus call latch3 call wait1 ld a,(de) ;prog spannung 1 ms spaeter anlegen call latch3 ;latch 3 init call nz,ks ;Kurzschluss initret: pop ix ;restore callers ix pop hl ;return address pop de pop de ;deallocate in parameters jp (hl) ritab: defb 0ch ;2708 (typ 0) latch 2 defb 00h ;prg bit 5 defb 57h ;latch 3 defb 0d8h ;2716 (typ 1) defb 00h defb 5eh defs 5*3 ;(typ 2-6) defb 0d0h ;2732 (typ 7) defb 00h defb 5fh defb 0d0h ;2732A (typ 8) defb 00h defb 5fh defb 80h ;2764 (typ 9) defb 20h defb 5fh witab: defb 0fch ;2708 latch 2 defb 00h ;prg bit 5 defb 07h ;latch 3 defb 0d8h ;2716 defb 00h defb 8eh defs 5*3 defb 0d0h ;2732 defb 20h defb 8dh defb 0d0h ;2732A defb 20h defb 2dh defb 80h ;2764 defb 20h defb 2fh ;Kurzschluss EPROM ks: ld a,2 ld (errflg),a ;Grundzustand alter Programmer bcoff: ld a,(old) or a jr z,nbcoff ;neue Programmer-Karte ld a,0ffh ;latch 3 inaktiv call latch3 call wait4 ld a,11h ;+5V off out (pio1bd),a ret ;Grundzustand neuer Programmer nbcoff: ld a,0ffh out (pio1bd),a ret ;Initialiesierung Read/Write fuer neuen Programmer nrinit: ld hl,nritab ld a,4 jr nrwinit nwinit: ld hl,nwitab ld a,7 nrwinit: ld e,(ix+ityp) ld d,0 nrw1: add hl,de ;entry in table dec a jr nz,nrw1 ex de,hl ld l,0 ;low adressen low call nlch1 ld a,(de) ;latch 2 inc de ld (l2val),a ld h,a call nlch2 ld a,(de) inc de ld (l3prog),a set 2,a ;Programierspannung abgeschaltet lassen call nlch3 ld a,(de) inc de bit 5,a jr z,nrw4 ;read bei 5V and 11100011B ;Vpp 25V, UB 6V ld c,a ld a,(PM) or a jr z, nrw2 ;intelligent Programmieren set 7,c res 5,c ;5V nrw2: ld a,(Vpp) ;Programmierspannung einstellen cp 1 jr z,nrw3 ;25V set 2,c cp 2 jr z,nrw3 ;21V res 2,c ;sonst 12,5V set 3,c set 4,c nrw3: ld a,c nrw4: call nlch4 ld a,(de) inc de out (pio1bd),a ;latchs output enable ld a,(de) inc de ld (l3chg),a ld a,(de) inc de ld (l3ver),a ld a,(PM) ;Programmier-Mode 0: intelligent or a ; 1: normal ld a,1 jr nz,nrw5 ld a,(de) nrw5: ld (nmax),a call wait200 ld a,(l3prog) call nlch3 ;Programmierspannung bei Write anlegen in a,(pio1bd) bit 6,a call nz,nks ;Kurzschluss ret ;ok nritab: defs 4 ;Typ 0 nicht vorhanden defb 11111000B ;2716 (typ 1) latch 2 defb 00101110B ;latch 3 defb 10000000B ;latch 4 defb 11101101B ;pio b defs 5*4 ;(typ 2-6) defb 11110000B ;2732 (typ 7) defb 00111110B defb 10000000B defb 11101101B defb 11110000B ;2732A (typ 8) defb 00111110B defb 10000100B defb 11101101B defb 11100000B ;2764 (typ 9) defb 00011110B defb 11000100B defb 01101101B defb 11100000B ;2764A (typ 10) defb 00011110B defb 11011000B defb 01101101B defb 11000000B ;27128 (typ 11) defb 00011110B defb 11000100B defb 01101101B defb 11000000B ;27128A (typ 12) defb 00011110B defb 11011000B defb 01101101B defb 10000000B ;27256 (typ 13) defb 00011110B defb 11011000B defb 11101101B defs 4 ;(typ 14) defb 00000000B ;27512 (typ 15) defb 00111110B defb 11011000B defb 11101101B nwitab: defs 7 ;Typ 0 nicht vorhanden defb 11111000B ;2716, 25V Upp (typ 1) latch 2 defb 11101011B ;latch 3 defb 00100000B ;latch 4 defb 11101111B ;pio defb 10101011B ;latch 3 change defb 10101011B ;latch 3 verify defb 15 ;max. Anzahl der 1ms Prog. Impulse, 1 = 50ms defs 5*7 ;(typ 2-6) defb 11110000B ;2732, 25V Upp (typ 7) defb 11110011B defb 00100000B defb 01101111B defb 11111011B defb 00111010B defb 15 defb 11110000B ;2732A, 21V Upp (typ 8) defb 11110011B defb 00100100B defb 01101111B defb 11111011B defb 00111010B defb 15 defb 11100000B ;2764, 21V Upp (typ 9) defb 01011011B defb 01100100B defb 01101111B defb 00011011B defb 00011011B defb 15 defb 11100000B ;2764A, 12,5V Upp (typ 10) defb 01011011B defb 01111000B defb 01101111B defb 00011011B defb 00011011B defb 25 defb 11000000B ;27128, 21V Upp (typ 11) defb 01011011B defb 01100100B defb 01101111B defb 00011010B defb 00011010B defb 15 defb 11000000B ;27128A, 12,5V Upp (typ 12) defb 01011011B defb 01111000B defb 01101111B defb 00011010B defb 00011010B defb 25 defb 10000000B ;27256, 12,5V Upp (typ 13) defb 11011010B defb 01111000B defb 01101111B defb 10011010B defb 10011010B defb 25 defs 7 ;(typ 14) defb 00000000B ;27512, 12,5V Upp (typ 15) defb 11110010B defb 01111000B defb 01101111B defb 11111010B defb 00111110B defb 25 ;rbyte procedure - Read 1 Byte (alter Programmer) radr equ 4 rdata equ 6 rbyte: push ix ;save callers ix ld ix,0 add ix,sp ;point to in parameters ld l,(ix+radr) ;prom address ld h,(ix+radr+1) ld a,(old) or a jr z,rd2 ;neue Programmer-Karte call latch1 ;output low address call latch2 ;output high address jr z,rd1 call ks ;Kurzschluss jr rdret rd1: ld a,0cfh ;port a input out (pio1ac),a ld a,0ffh out (pio1ac),a in a,(pio1bd) and 0f0h ;OE aktiv out (pio1bd),a ld c,pio1ad in l,(c) ;read data byte from prom ld (ix+rdata),l ;store in out parameters or 01h ;oe inaktiv out (pio1bd),a ld a,0fh ;port a output out (pio1ac),a jr rdret rd2: call nrbyte rdret: pop ix ;restore callers ix pop hl ;return address pop de ;deallocate in parameter jp (hl) ;wbyte procedure - write 1 Byte (alter Programmer) wadr equ 6 wdata equ 4 wbyte: push ix ;save callers ix ld ix,0 add ix,sp ;point to in parameters ld l,(ix+wadr) ;prom address ld h,(ix+wadr+1) ld a,(old) or a jr z,wr2 ;neuer Programmer call latch1 call latch2 jr z,wr1 call ks ;Kurzschluss jr wrret wr1: ld a,(ix+wdata) ;get data byte cp 0ffh ;is data = FF ? jr z,wrret out (pio1ad),a in a,(pio1bd) and 0f0h or 02h ;OE aktiv, PRG inaktiv out (pio1bd),a ld b,50 ;50 ms call prog or 03h ;OE inaktiv out (pio1bd),a jr wrret wr2: call nwbyte wrret: pop ix ;restore callers ix pop hl ;return address pop de ;deallocate in parameters pop de jp (hl) ;Programmierung 2708 (nur alter Programmer) nbyt equ 4 p2708: call wait50 push ix ;save callers ix ld ix,0 add ix,sp ;point to in parameters ld iy,count ld (iy),100 ;loop thru prom 100 times p2708a: ld c,(ix+nbyt) ld b,(ix+nbyt+1) ld hl,0000h ;prom address ld de,BUF ;buffer - external p2708b: push bc call latch1 ;output low address call latch2 ;output high address pop bc jr nz,pks ld a,(de) ;data byte out (pio1ad),a ld a,02h ;OE aktiv, PRG inaktiv out (pio1bd),a push hl push bc ld b,1 ;1ms call prog or 03h ;OE inaktiv out (pio1bd),a pop bc pop hl inc hl ;inc prom address inc de ;inc buffer address dec bc ;dec byte count ld a,b or c jr nz,p2708b ;next byte dec (iy) jr nz,p2708a ;next loop pret pop ix ;restore callers ix pop hl ;return address pop de ;deallocate parameter jp (hl) ;return pks: call ks ;Kurzschluss jr pret ;Read 1 Byte (neuer Programmer) nrbyte: call nlch1 ;Anlegen der Adresse call nlch2 ld a,0cfh ;port a input out (pio1ac),a ld a,0ffh out (pio1ac),a call nz,nks ;Kurzschluss in a,(pio1bd) and 0feh ;OE bidirekt. Treiber aktiv out (pio1bd),a ld c,pio1ad in l,(c) ;read data byte from prom ld (ix+rdata),l ;store in out parameters or 01h ;OE inaktiv out (pio1bd),a ld a,0fh ;port a output out (pio1ac),a ret ;Write 1 Byte (neuer Programmer) nwbyte: call nlch1 call nlch2 call nz,nks ;Kurzschluss ld a,(ix+wdata) ;get data byte cp 0ffh ;is data = FF ? ret z out (pio1ad),a ld d,a ld a,(nmax) cp 1 jr nz,nwr1 ;intelligente Programmierung ;unintelligente Programmierung in a,(pio1bd) and 0feh ;OE bidirekt. Treiber aktiv, PRG inaktiv out (pio1bd),a ld b,50 ;50ms call nprog or 01h ;OE inaktiv out (pio1bd),a ret ;intelligente Programmierung nwr1: ld e,0 nwr2: in a,(pio1bd) and 0feh ;OE bidirekt. Treiber aktiv, PRG inaktiv out (pio1bd),a ld b,1 ;1ms call nprog or 01h ;OE inaktiv out (pio1bd),a ld a,(l3chg) ld hl,l3ver cp (hl) jr z,t1 call nlch3 t1: ld a,(l3ver) ;Byte verify call nlch3 ;verify einstellen call nz,nks ;Kurzschluss ld a,0cfh ;port a input out (pio1ac),a ld a,0ffh out (pio1ac),a in a,(pio1bd) and 0fdh ;Richtung lesen, OE bid. Treiber aktiv out (pio1bd),a and 0fch out (pio1bd),a ld c,pio1ad in l,(c) ;read data byte from prom or 01h ;Richtung schreiben, OE inaktiv out (pio1bd),a or 03h out (pio1bd),a ld a,0fh ;port a output out (pio1ac),a push hl ld a,(l3chg) ld hl,l3ver cp (hl) jr z,t2 call nlch3 t2: pop hl ld a,(l3prog) ;wieder auf Programmieren einstellen call nlch3 ld a,d out (pio1ad),a ;Daten wieder anlegen call nz,nks ;Kurzschluss inc e ld a,l ;rueckgelesenes Byte vergleichen cp d jr z,nwr3 ;Ueberprogrammieren ld a,(nmax) ;max Anzahl Impulse erreicht ? dec a cp e jr nc,nwr2 ;naechster Prog. impuls ld a,3 ld (errflg),a ret ;Fehler nwr3: ld b,4 ;4n Ueberprogrammieren ld a,(nmax) cp 16 jr c,nwr4 ld b,3 ;3n Ueberprogrammieren nwr4: xor a nwr5: add a,e djnz nwr5 ld b,a in a,(pio1bd) and 0feh ;OE bidirekt. Treiber aktiv, PRG inaktiv out (pio1bd),a call nprog ;in b Anzahl der ms or 01h ;OE inaktiv out (pio1bd),a ret ;Kurzschluss neue Programmer-Karte nks: call ks ;Kurzschluss pop hl ;Ausgleich fuer call nks ret ;Ueberpruefung EPROM-Typ alte Programmer-Karte typ: ld a,(old) or a ld a,e ;prom typ jr z,ntyp cp 0 ;2708 ? ret z cp 1 ;2716 ? ret z cp 7 ;2732, 32A, 64 ? jr c,typerr cp 10 jr nc,typerr xor a ;ok ret ;Ueberpruefung EPROM-Typ neue Programmer-Karte ntyp: cp 1 ;2716 ret z cp 7 ;2732, 32A, 64, 64, 128, 128, 256, 512 ? jr c,typerr cp 14 jr z,typerr cp 16 jr nc,typerr xor a ;ok ret typerr: xor a inc a ld (errflg),a ret ;Output to latch's (alte Programmer-Karte) latch1: ld c,0dh ;l = low address ld a,l jr l0 latch2: ld a,(l2val) ;control bits PRG or h ;high address ld c,09h jr l0 latch3: ld c,05h ;l = control bits l0: out (pio1ad),a in a,(pio1bd) and 0f0h or c out (pio1bd),a ;strobe and 0f0h or 01h out (pio1bd),a bit 6,a ;Kurzschluss ? ret ;Output to latch's (neue Programmer-Karte) L1STROBE: equ 00h L2STROBE: equ 04h L3STROBE: equ 08h L4STROBE: equ 0ch LNOSTROBE: equ 20h LMASK: equ 0d3h nlch1: ld a,l ;l = low address ld c,L1STROBE jr nl0 nlch2: ld a,(l2val) ;control bits or h ;high address ld c,L2STROBE jr nl0 nlch3: ld c,L3STROBE jr nl0 nlch4: ld c,L4STROBE nl0: out (pio1ad),a in a,(pio1bd) and LMASK or c out (pio1bd),a ;strobe or LNOSTROBE out (pio1bd),a bit 6,a ;Kurzschluss ? ret ;wait routines wait200: ld b,200 jr wait wait50: ld b,50 jr wait wait4: ld b,4 jr wait wait1: ld b,1 wait: ld c,0 jr w1 prog: ld c,20h ;prog bit alter Programmer jr w1 nprog: ld c,80h ;prog bit neuer Programmer w1: push af ld a,b ld (time),a ld a,0a5h out (ctc+2),a ld a,15 out (ctc+2),a in a,(pio1bd) xor c ;Prog. impuls ein, wenn progbit gesetzt out (pio1bd),a xor c push af wloop: call ueb16 ld a,(time) or a jr nz,wloop pop af out (pio1bd),a ;Prog. impuls aus, falls vorher ein pop af ret isrctc: push af ld a,(time) dec a ld (time),a jr nz,isrc1 ld a,03h ;ctc aus out (ctc+2),a isrc1: pop af ei reti ; lchar - procedure ; lesen von "dev/ud" (16-bit/8-bit p8000) zchar equ 4 lchar: push ix ld ix,0 add ix,sp push ix kzei: call LODNET jr z,kzei pop ix ld (ix+zchar),a pop ix pop hl jp (hl) ; schar - procedure ; schreiben nach "dev/ud" (8-bit/16-bit p8000) schar: push ix ld ix,0 add ix,sp ld a,(ix+zchar) call SNDNET pop ix pop hl pop de jp (hl) ueb16: push ix call UEB16 pop ix ret ; BERECHNUNG DES CRC VOM PROM NACH DEM SDLC POLYNOM GLOBAL sdlc sdlc: push ix ; plz ix retten ld ix,0 ; parameter uebernahme add ix,sp ld a,(ix+8) ;char ld d,(ix+6) ;crc ld e,(ix+4) xor d ld d,a rrca rrca rrca rrca and 0fh xor d ld d,a rrca rrca rrca push af and 1fh xor e ld e,a pop af push af rrca and 0f0h xor e ld e,a pop af and 0e0h xor d ld d,e ld e,a ld (ix+12),e ; out parameter uebergeben ld (ix+10),d pop ix ; restore plz ix pop hl ; ret adr pop de ; dealocate inparameter pop de pop de jp (hl) ; ret to plz