home *** CD-ROM | disk | FTP | other *** search
-
- PROGRAM MEMXXX;
- { MEMORY- KONFIGURATION DES 286- NEAT- CHIPSATZES ANZEIGEN & EINSTELLEN }
-
-
- {
- FÜR DIE ANZEIGE DER EMS PAGEFRAME WIRD TURBO PROFESSIONAL BENUTZT
- OHNE TURBO PROFESSIONAL BITTE '.$DEFINE TPROF' ODER '$UNDEF TPROF' EINTRAGEN
- }
- {$DEFINE TPROF}
-
-
- USES
- {$IFDEF TPROF}
- TPCRT,TPSTRING,TPEMS,
- {$ELSE}
- CRT,TPERSATZ,
- {$ENDIF}
- NEATUNIT;
- {
- TPSTRING WIRD GEBRAUCHT FÜR :
- FUNCTION HEXW(WERT:WORD):STRING; WANDELT EINE WORD- VARIABLE IN HEX- STRING
- FUNCTION HEXB(WERT:BYTE):STRING; WANDELT EINE BYTE- VARIABLE IN HEX- STRING
- DIESE FUNCTIONS SIND IN TPERSATZ NACHGEBILDET
- }
-
-
- TYPE SOF = RECORD O,S : WORD; END;
-
-
- VAR I,J,K : INTEGER;
- W : WORD;
- P : ARRAY[1..10] OF STRING;
- PP : BYTE;
- QUIET,NNMI : BOOLEAN;
- PFBP : POINTER;
- BUFFER : ARRAY[0..32767] OF BYTE;
-
-
- FUNCTION RAMTEST(SEGM:WORD):BOOLEAN;
- VAR B1,B2 : BYTE;
- BEGIN
- NMI(OFF);
- RAMTEST := FALSE;
-
- B1 := MEM[SEGM:0];
- MEM[SEGM:0] := B1 XOR $FF;
- B2 := MEM[SEGM:0];
- MEM[SEGM:0] := B1;
-
- IF NOT QUIET THEN BEGIN
- (*
- W := MEMW[SEGM:0];
- IF (W = $55AA) OR (W = $AA55) THEN TEXTCOLOR(9);
- *)
- WRITE(HEXW(SEGM),':');
- (*
- TEXTCOLOR(7);
- WRITE(HEXB(B1),' ',HEXB(B2),' ');
- *)
- WRITE(HEXB(B1),' ');
-
- IF (B1 <> (B2 XOR $FF)) AND (B1 <> B2) THEN BEGIN
- WRITE('????????');
- END ELSE BEGIN
- W := MEMW[SEGM:0];
- IF (W = $55AA) OR (W = $AA55) THEN BEGIN
- WRITE('BIOS ');
- END ELSE BEGIN
- {$IFDEF TPROF}
- IF EMSINSTALLED THEN BEGIN
- PFBP := EMSPAGEFRAMEPTR;
- IF (SEGM >= SOF(PFBP).S) AND (SEGM < (SOF(PFBP).S+$1000)) THEN BEGIN
- WRITE(' EMS ');
- END ELSE BEGIN
- WRITE('.... ');
- END;
- END ELSE WRITE('.... ');
- {$ELSE}
- WRITE('.... ');
- {$ENDIF}
- END;
- IF B1 <> (B2 XOR $FF) THEN WRITE('...')
- ELSE BEGIN
- TEXTCOLOR(15);
- WRITE('RAM');
- END;
- END;
- TEXTCOLOR(7);
- WRITE(' ');
- END;
-
- IF B1 = (B2 XOR $FF) THEN RAMTEST := TRUE;
- IF NOT NNMI THEN NMI(ON);
- END; { RAMTEST }
-
-
- PROCEDURE SHADOWDISP;
- VAR I,J : WORD;
- BEGIN
- FOR I := $0A TO $0F DO BEGIN
- FOR J := 0 TO 3 DO IF RAMTEST((I SHL 12) + (J SHL 10)) THEN {};
- WRITELN;
- END; { NEXT I }
- END; { SHADOWDISP }
-
-
- PROCEDURE SHADOWCHECK;
- VAR I,J,K : WORD;
- IL : INTEGER;
- REG65 : BYTE;
- REG68 : BYTE;
- RAM,ROM : ARRAY[0..4095] OF BYTE;
- ERRCNT : WORD;
- OK,LEER,VSHAD : BOOLEAN;
- CH1 : CHAR;
- BEGIN
- WRITELN;
- WRITELN(' Vergleich des BIOS- Shadow- RAM mit dem BIOS- EPROM');;
- WRITELN;
- IF NOT ISAT OR NOT ISNEAT THEN BEGIN
- WRITELN;
- WRITELN(' Dies Programm funktioniert nur mit NEAT- Computern');
- HALT;
- END;
-
- { BIOS 0F800 TESTEN }
- IF GETBIT(NEAT,$65,0) = '0' THEN BEGIN
- WRITELN(' Im Segment 0F000 befindet sich ROM');
- END ELSE BEGIN
- WRITELN(' Im Segment 0F000 befindet sich Shadow RAM');
- IF GETBIT(NEAT,$65,4) = '0' THEN BEGIN
- WRITELN(' Shadow RAM im Segment 0F000 ist nicht schreibgeschützt !');
- END ELSE BEGIN
- WRITELN(' Shadow RAM im Segment 0F000 ist schreibgeschützt');
- END;
- ERRCNT := 0;
- OK := TRUE;
- REG65 := GETPORT(NEAT,$65);
- I := GETPORT(NEAT,$69);
- IF (I AND $C0) <> $C0 THEN BEGIN
- WRITELN(' ? keine 32k Bytes RAM in 0F000:0800 eingeschaltet ?');
- END;
- FOR I := 0 TO 7 DO BEGIN
- CLI; { WICHTIG ! }
- RESBIT(NEAT,$65,0); { ROM ENABLE SEGMENT F000 }
- MOVE(MEM[$F800:I*4096],ROM,4096);
- SETBIT(NEAT,$65,0); { RAM ENABLE SEGMENT F000 }
- MOVE(MEM[$F800:I*4096],RAM,4096);
- SETPORT(NEAT,$65,REG65);
- STI;
- FOR J := 0 TO 4095 DO BEGIN
- IF RAM[J] <> ROM[J] THEN BEGIN
- IF ERRCNT < 16 THEN BEGIN
- WRITELN('F000:',HEXW($8000+I*4096+J),' ROM = ',HEXB(ROM[J]),' RAM = ',HEXB(RAM[J]));
- OK := FALSE;
- END;
- INC(ERRCNT);
- END;
- END; { NEXT J }
- END; { NEXT I }
- IF OK THEN BEGIN
- WRITELN(' BIOS- Shadow- RAM ok');
- END ELSE BEGIN
- WRITE(ERRCNT:5,' Differenzen gefunden ');
- WRITE(' Shadow- RAM- Inhalt wiederherstellen ? ');
- CH1 := UPCASE(READKEY);
- IF CH1 = #0 THEN BEGIN CH1 := READKEY; CH1 := #0; END;
- IF (CH1 = 'J') OR (CH1 = 'Y') THEN BEGIN
- FOR I := 0 TO 7 DO BEGIN
- CLI; { WICHTIG ! }
- RESBIT(NEAT,$65,0); { ROM ENABLE SEGMENT F000 }
- MOVE(MEM[$F800:I*4096],ROM,4096);
- SETBIT(NEAT,$65,0); { RAM ENABLE SEGMENT F000 }
- RESBIT(NEAT,$65,4); { WRITE ENABLE SEGMENT F000 }
- MOVE(ROM,MEM[$F800:I*4096],4096);
- SETPORT(NEAT,$65,REG65);
- STI;
- END; { NEXT I }
- END;
- END;
- END;
-
- WRITELN;
- { BIOS 0C000 TESTEN }
- IF GETBIT(NEAT,$65,3) = '0' THEN BEGIN
- WRITELN(' Im Segment 0C000 befindet sich ROM (???)');
- END ELSE BEGIN
- REG65 := GETPORT(NEAT,$65);
- REG68 := GETPORT(NEAT,$68);
- CASE (REG68 AND 3) OF
- 0,2 : BEGIN
- WRITELN(' Kein Shadow- RAM FÜR Video- BIOS AUF 0C000:0');
- K := 0;
- END;
- 1 : BEGIN
- WRITELN(' 16k Bytes Shadow- RAM für Video- BIOS AUF 0C000:0');
- K := 3;
- END;
- 3 : BEGIN
- WRITELN(' 32k Bytes Shadow- RAM für Video- BIOS AUF 0C000:0');
- K := 7;
- END;
- END; { CASE }
- IF K > 0 THEN BEGIN
- IF GETBIT(NEAT,$65,7) = '0' THEN BEGIN
- WRITELN(' Shadow RAM im Segment 0C000 ist nicht schreibgeschützt !');
- END ELSE BEGIN
- WRITELN(' Shadow RAM im Segment 0C000 ist schreibgeschützt');
- END;
- END;
-
- VSHAD := K <> 0;
- { ERMITTELN, WIE GROß DAS EGA/VGA- EPROM IST }
- LEER := TRUE;
- IF K > 0 THEN I := K ELSE I := 7;
- REPEAT
- CLI; { WICHTIG ! }
- ANDPORT(NEAT,$68,$FC); { RAM DISABLE SEGMENT C000, 32K }
- MOVE(MEM[$C000:I*4096],ROM,4096);
- SETPORT(NEAT,$68,REG68);
- STI;
- IL := 4095;
- WHILE (IL >= 0) AND LEER DO BEGIN
- IF ROM[IL] <> $FF THEN LEER := FALSE;
- DEC(IL);
- END; { WHILE }
- IF LEER THEN DEC(I);
- UNTIL (I = 0) OR NOT LEER;
- K := I;
- WRITELN(' Größe des EGA/VGA- BIOS = ',SUCC(K) SHL 2,'k Bytes');
-
- IF VSHAD THEN BEGIN
- ERRCNT := 0;
- OK := TRUE;
- FOR I := 0 TO K DO BEGIN
- CLI; { WICHTIG ! }
- ANDPORT(NEAT,$68,$FC); { RAM DISABLE SEGMENT C000, 32K }
- MOVE(MEM[$C000:I*4096],ROM,4096);
- ORPORT(NEAT,$68,3); { RAM ENABLE SEGMENT C000, 32K }
- MOVE(MEM[$C000:I*4096],RAM,4096);
- SETPORT(NEAT,$68,REG68);
- STI;
- FOR J := 0 TO 4095 DO BEGIN
- IF RAM[J] <> ROM[J] THEN BEGIN
- IF ERRCNT < 16 THEN BEGIN
- WRITELN('C000:',HEXW(I*4096+J),' ROM = ',HEXB(ROM[J]),' RAM = ',HEXB(RAM[J]));
- OK := FALSE;
- END;
- INC(ERRCNT);
- END;
- END; { NEXT J }
- END; { NEXT I }
- IF OK THEN BEGIN
- WRITELN(' Video- BIOS- Shadow- RAM ok');
- END ELSE BEGIN
- WRITE(ERRCNT:5,' Differenzen gefunden ');
- WRITE(' Shadow- RAM- Inhalt wiederherstellen ? ');
- CH1 := UPCASE(READKEY);
- IF CH1 = #0 THEN BEGIN CH1 := READKEY; CH1 := #0; END;
- IF (CH1 = 'J') OR (CH1 = 'Y') THEN BEGIN
- FOR I := 0 TO K DO BEGIN
- CLI; { WICHTIG ! }
- ANDPORT(NEAT,$68,$FC); { RAM DISABLE SEGMENT C000, 32K }
- MOVE(MEM[$C000:I*4096],ROM,4096);
- ORPORT(NEAT,$68,3); { RAM ENABLE SEGMENT C000, 32K }
- RESBIT(NEAT,$65,7); { WRITE ENABLE SEGMENT C000 }
- MOVE(ROM,MEM[$C000:I*4096],4096);
- SETPORT(NEAT,$65,REG65);
- SETPORT(NEAT,$68,REG68);
- STI;
- END; { NEXT I }
- END;
- END;
- END; { IF VSHAD }
- END;
- END; { SHADOWCHECK }
-
-
- PROCEDURE HILFE;
- BEGIN
- WRITELN;
- WRITELN('MEM - Programm zur Speicherkonfiguration fÜr NEAT 286');
- WRITELN(' Optionen :');
- WRITELN(' W0 - 0 wait einschalten');
- WRITELN(' W1 - 1 wait einschalten');
- WRITELN(' UNPROTECT - Shadow- RAM write enable ( C000 und F000 )');
- WRITELN(' PROTECT - Shadow- RAM writeprotect ( C000 und F000 )');
- WRITELN(' HDC - HDC- EPROM von C800..CFFF ins shadow- RAM kopieren)');
- WRITELN(' NMIOFF - NMI (Parity- Prüfung) ausschalten');
- WRITELN(' NMION - NMI (Parity- Prüfung) einschalten');
- WRITELN(' Q - Quiet = keine Video- Ausgabe');
- WRITELN;
- WRITELN(' ENB-A .. ENB-F - RAM auf Segment A000 .. F000 einschalten');
- WRITELN(' INI-A .. INI-F - RAM auf Segment A000 .. F000 initialisieren');
- WRITELN(' DSB-A .. DSB-F - RAM auf Segment A000 .. F000 ausschalten');
- WRITELN(' HAT-A .. HAT-F - RAM Anwesenheitsprüfung für BATCH');
- WRITELN(' PROT-C - RAM auf Segment C000 writeprotect ( nur C000 ! )');
- WRITELN;
- WRITELN(' SPEED1 - normale Geschwindigkeit (TURBO Taste wirkt)');
- WRITELN(' SPEED2 - halbe Geschwindigkeit (TURBO Taste wirkt)');
- WRITELN(' SPEED3 - minimale Geschwindigkeit (TURBO Taste wirkt nicht)');
- WRITELN;
- WRITELN(' CHECK - Prüfung des Shadow- RAM auf Gleichheit mit EPROMs');
- HALT(0);
- END;
-
-
- BEGIN { MAIN }
- TEXTATTR := $07;
- QUIET := FALSE;
- NNMI := FALSE;
- PP := PARAMCOUNT;
- FOR I := 1 TO PP DO BEGIN
- P[I] := PARAMSTR(I);
- IF P[I][1] = '/' THEN DELETE(P[I],1,1);
- IF P[I][1] = '-' THEN DELETE(P[I],1,1);
- FOR J := 1 TO LENGTH(P[I]) DO P[I][J] := UPCASE(P[I][J]);
- IF P[I] = 'Q' THEN QUIET := TRUE;
- IF P[I] = '?' THEN HILFE;
- END; { NEXT I }
-
- IF NOT ISNEAT THEN BEGIN
- WRITELN;
- WRITELN(' NEAT-286 Memory-Utility Erklärung mit MEM ?');
- WRITELN;
- WRITELN(' Kein NEAT- Chipsatz gefunden');
- WRITELN;
- SHADOWDISP;
- HALT(0);
- END;
-
- IF NOT QUIET THEN BEGIN
- WRITELN;
- WRITELN(' NEAT-286 Memory-Utility Erklärung mit MEM ?');
- WRITELN;
- WRITE('Memory- Wait : ',GETBIT(NEAT,$6B,5),' Wait erkannt');
- END;
-
- FOR I := 1 TO PP DO BEGIN
- IF P[I] = 'HDC' THEN BEGIN
- { GGF. EPROM VOM HDC INS SHADOW- RAM KOPIEREN }
- IF GETBIT(NEAT,$68,2) = '0' THEN BEGIN
- FOR W := 0 TO 32767 DO BUFFER[W] := MEM[$C800:W];
- ORPORT(NEAT,$68,$0C); { ENABLE RAM C800..CFFF }
- ANDPORT(NEAT,$65,$7F); { WRITE ENABLE C000..CFFF }
- FOR W := 0 TO 32767 DO MEM[$C800:W] := BUFFER[W];
- ORPORT(NEAT,$65,$80); { WRITE DISABLE C000..CFFF }
- END ELSE WRITE(#7); { IF (W AND 4) = 0 }
- END;
- END; { NEXT I }
-
- { ZUERST GGF. WAIT EINSTELLEN }
- FOR I := 1 TO PP DO BEGIN
- IF P[I] = 'W0' THEN BEGIN
- IF GETBIT(NEAT,$6B,5) = '1' THEN BEGIN
- ANDPORT(NEAT,$6B,$DF);
- IF NOT QUIET THEN
- WRITE(', ',GETBIT(NEAT,$6B,5),' Wait eingestellt');
- END;
- END;
- IF P[I] = 'W1' THEN BEGIN
- IF GETBIT(NEAT,$6B,5) = '0' THEN BEGIN
- ORPORT(NEAT,$6B,$20);
- IF NOT QUIET THEN
- WRITE(', ',GETBIT(NEAT,$6B,5),' Wait eingestellt');
- END;
- END;
- END; { NEXT I }
- IF NOT QUIET THEN WRITELN;
-
- { GGF. RAM ENABLE/DISABLE/INIT/ANWESENHEITSPRÜFUNG }
- FOR I := 1 TO PP DO BEGIN
- { GGF. PROTECT / UNPROTECT FÜR SHADOW- RAM (C000..CFFF & F000..FFFF) }
- IF P[I] = 'UNPROTECT' THEN ANDPORT(NEAT,$65,$6F);
- IF P[I] = 'PROTECT' THEN ORPORT(NEAT,$65,$90);
- IF P[I] = 'PROT-C' THEN ORPORT(NEAT,$65,$80);
- { GGF. NMI EIN/AUSSCHALTEN }
- IF P[I] = 'NMIOFF' THEN BEGIN
- NMI(OFF);
- NNMI := TRUE;
- END;
- IF P[I] = 'NMION' THEN BEGIN
- NMI(ON);
- NNMI := FALSE;
- END;
- IF P[I] = 'CHECK' THEN BEGIN
- SHADOWCHECK;
- QUIET := TRUE;
- END;
- { RAM ENABLE }
- IF P[I] = 'ENB-F' THEN ORPORT(NEAT,$69,$F0);
- IF P[I] = 'ENB-E' THEN ORPORT(NEAT,$69,$0F);
- IF P[I] = 'ENB-D' THEN ORPORT(NEAT,$68,$F0);
- IF P[I] = 'ENB-C' THEN ORPORT(NEAT,$68,$0F);
- IF P[I] = 'ENB-B' THEN ORPORT(NEAT,$67,$0F);
- IF P[I] = 'ENB-B0' THEN ORPORT(NEAT,$67,$03);
- IF P[I] = 'ENB-A' THEN ORPORT(NEAT,$67,$F0);
- { RAM DISABLE }
- IF P[I] = 'DSB-F' THEN ANDPORT(NEAT,$69,$0F);
- IF P[I] = 'DSB-E' THEN ANDPORT(NEAT,$69,$F0);
- IF P[I] = 'DSB-D' THEN ANDPORT(NEAT,$68,$0F);
- IF P[I] = 'DSB-C' THEN ANDPORT(NEAT,$68,$F0);
- IF P[I] = 'DSB-B' THEN ANDPORT(NEAT,$67,$F0);
- IF P[I] = 'DSB-A' THEN ANDPORT(NEAT,$67,$0F);
- { RAM ENABLE & INIT }
- IF P[I] = 'INI-F' THEN BEGIN
- ORPORT(NEAT,$69,$F0);
- FILLCHAR(MEM[$F000:0],$FFFF,0);
- MEM[$F000:$FFFF] := 0;
- END;
- IF P[I] = 'INI-E' THEN BEGIN
- ORPORT(NEAT,$69,$0F);
- FILLCHAR(MEM[$E000:0],$FFFF,0);
- MEM[$E000:$FFFF] := 0;
- END;
- IF P[I] = 'INI-D' THEN BEGIN
- ORPORT(NEAT,$68,$F0);
- FILLCHAR(MEM[$D000:0],$FFFF,0);
- MEM[$D000:$FFFF] := 0;
- END;
- IF P[I] = 'INI-C' THEN BEGIN
- ORPORT(NEAT,$68,$0F);
- FILLCHAR(MEM[$C000:0],$FFFF,0);
- MEM[$C000:$FFFF] := 0;
- END;
- IF P[I] = 'INI-B' THEN BEGIN
- ORPORT(NEAT,$67,$0F);
- FILLCHAR(MEM[$B000:0],$FFFF,0);
- MEM[$B000:$FFFF] := 0;
- END;
- IF P[I] = 'INI-B0' THEN BEGIN
- ORPORT(NEAT,$67,$03);
- FILLCHAR(MEM[$B000:0],$8000,0);
- END;
- IF P[I] = 'INI-A' THEN BEGIN
- ORPORT(NEAT,$67,$F0);
- FILLCHAR(MEM[$A000:0],$FFFF,0);
- MEM[$A000:$FFFF] := 0;
- END;
- { RAM ANWESENHEITSPRÜFUNG }
- IF P[I] = 'HAT-F' THEN BEGIN
- QUIET := TRUE;
- IF NOT RAMTEST($F000) THEN HALT(1);
- END;
- IF P[I] = 'HAT-E' THEN BEGIN
- QUIET := TRUE;
- IF NOT RAMTEST($E000) THEN HALT(1);
- END;
- IF P[I] = 'HAT-D' THEN BEGIN
- QUIET := TRUE;
- IF NOT RAMTEST($D000) THEN HALT(1);
- END;
- IF P[I] = 'HAT-C' THEN BEGIN
- QUIET := TRUE;
- IF NOT RAMTEST($C000) THEN HALT(1);
- END;
- IF P[I] = 'HAT-B' THEN BEGIN
- QUIET := TRUE;
- IF NOT RAMTEST($B000) THEN HALT(1);
- END;
- IF P[I] = 'HAT-A' THEN BEGIN
- QUIET := TRUE;
- IF NOT RAMTEST($A000) THEN HALT(1);
- END;
-
- IF P[I] = 'SPEED1' THEN BEGIN
- ANDPORT(NEAT,$60,$EF);
- ANDPORT(NEAT,$62,$FC);
- END;
- IF P[I] = 'SPEED2' THEN BEGIN
- ANDPORT(NEAT,$60,$EF);
- ANDPORT(NEAT,$62,$FC);
- ORPORT (NEAT,$60,$10);
- END;
- IF P[I] = 'SPEED3' THEN BEGIN
- ANDPORT(NEAT,$60,$EF);
- ANDPORT(NEAT,$62,$FC);
- ORPORT (NEAT,$62,$02);
- ORPORT (NEAT,$60,$10);
- END;
- END; { NEXT I }
-
- IF NOT QUIET THEN BEGIN
- WRITELN;
- SHADOWDISP;
- END;
-
- END.
-