MODULE flash2; (* 2. Stufe des Bootstraploaders fuer das HBG1, soll im XRAM laufen. Laedt ein Segment in den Flash AM29F040B mit 8-Bit-Bus ab Segment 0 startend und mit gekreuztem Datenbus. Version 2, ohne Assembler. *) (* Rueckgabe: 1: ok, 0: failed *) PROCEDURE* EraseSector(sect: WORD): WORD; VAR i, tmp, val :WORD; fertig: BOOLEAN; BEGIN fertig := FALSE; (* 1. Cycle, $55 ist $AAgekreuzt *) PUTB($0555, 0, $55); (* 2. Cycle, $AA ist $55 gekreuzt *) PUTB($02AA, 0, $AA); (* 3. Cycle, $01 ist $80 gekreuzt *) PUTB($0555, 0, $01); (* 4. Cycle wie 1. Cycle *) PUTB($0555, 0, $55); (* 5. Cycle, wie 2. Cycle *) PUTB($02AA, 0, $AA); (* 6. Cycle, $0C ist $30 gekreuzt *) PUTB(0, sect, $0C); REPEAT val := GETB(0, sect); tmp := val; IF tmp ANDB 1 = 1 THEN (* B7 <-> B0 = 1 *) i := 1; fertig := TRUE; ELSE (* B7 = 0 *) tmp := val; IF tmp ANDB 4 # 0 THEN (* B5 <-> B2 = 1 *) fertig := TRUE; val := GETB(0, sect); i := val ANDB 1; END; END; UNTIL fertig; RETURN i; END EraseSector; PROCEDURE* WriteByte(segm, adr, data: WORD); VAR tmp, val: WORD; BEGIN (* 1. Cycle, $55 ist $AA gekreuzt *) PUTB($0555, 0, $55); (* 2. Cycle, $AA ist $55 gekreuzt *) PUTB($02AA, 0, $AA); (* 3. Cycle, $05 ist $A0 gekreuzt *) PUTB($0555, 0, $05); (* 4. Cycle, Data unveraendert *) PUTB(adr, segm, data); data := data ANDB 1; tmp := data; tmp := tmp XORB 1; (*WHILE tmp # data DO tmp := GETB(adr, segm); tmp := tmp ANDB 1; END; *) END WriteByte; PROCEDURE* ReadByte(segm, adr: WORD): WORD; VAR i: WORD; BEGIN i := GETB(adr,segm); RETURN i; END ReadByte; PROCEDURE* DoIt; VAR seg, adr, eadr, i: WORD; BEGIN READ(seg); seg := seg ANDB $00FF; i := seg; i := EraseSector(i); IF i = 1 THEN WRITE("D") ELSE WRITE("F"); END; READ(i); eadr := i; eadr := eadr * 256; READ(i); i := i ANDB $00FF; eadr := eadr + i; adr := 0; REPEAT READ(i); WriteByte(seg, adr, i); adr := adr + 1; UNTIL adr > eadr; END DoIt; BEGIN S0TBUF := 82; (* Melde "R" *) (* Flash am 8-Bit-Bus ab Adr. 0 mit 15 WS enablen: *) BUSCON0 := $0400; SYSCON := $0004; (* enable XRAM *) DUMMIJMP; DPP0 := 0; DPP1 := 1; DPP2 := 2; DPP3 := 3; (* Datapointer initialisert *) (* Stack auf 1 kB Laenge, damit er verschoben werden kann *) STKUN := $FE00; (* Stackunderflowregister *) STKOV := $FA00; (* Stackoverflowregister *) SP := $FE00; (* Ende des IRAMs *) CP := $F600; (* Start des IRAMs *) EINIT; DoIt; SRST; END flash2.