032
27.03.2026, 17:29 Uhr
Ordoban
|
Ich habe mir angesehen, warum das SCP nicht mit den vollen 1MB zurechtkommt. Die Ursache liegt in den Methoden wie die Speichergröße ermittelt und angezeigt wird.
| Quellcode: | PUSH DS XOR BX,BX XOR CX,CX LL1: ADD CX,2000H MOV DS,CX MOV DX,[BX] ;SAVE MEMORY VALUE MOV AX,5555H ;TEST VALUE MOV [BX],AX ;WRITE VALUE CMP [BX],AX ;LOCATION READEBLE ? JNE LL6 ;IF NE NO MOV [BX],DX ;RESTORE MEMORY VALUE JMPS LL1 LL6: POP DS MOV MEM_LENGTH,CX ;STORE MEMORY LENGTH
|
Diese Routine testet in Abständen von 2000h Segmenten (=128KB), ob man im Speicher einen Wert speichern kann - und wenn nicht, dann wird das als Speichergrenze genommen. Wenn die 1MB voll verfügbar sind, dann findet der keine Stelle, an der kein Wert gespeichert werden kann. Das ACT-ROM wird durch die großen 128KB-Schritte übersprungen, der Speicherzeiger hat einen Übertrag, und schon haben wir hier eine Endlosschleife. Die Lösung hier ist einfach: wir reduzieren den Testabstand auf 800h Segmente (=32KB). Dadurch wird auch der Speicherbereich des ROM's getestet, und da dort kein Wert gespeichert werden kann, wird das als Speichergröße genommen.
| Quellcode: | ... XOR CX,CX LL1: ADD CX,0800H MOV DS,CX ...
|
Es funktioniert aber trotzdem noch nicht. Schuld ist die Ausgabe der Speichergröße beim Systemstart.
| Quellcode: | SIGNON DB 1BH,'[?4;7h' DB 'SCP1700 DL 3.0 (A7100/A7150) ',CR,LF,LF DB 'SYSTEM GENERATED 03-NOV-87' DB CR,LF,'MEMORY SIZE :',0 SIGNON1 DB '128',0 DB '256',0 DB '384',0 DB '512',0 DB '640',0 DB '768',0 DB '896',0 SIGNON2 DB ' K BYTES',CR,LF,0 .... MOV BX,OFFSET SIGNON1-4 XOR AX,AX LL2: ADD BX,4 ADD AX,2000H CMP AX,MEM_LENGTH JNE LL2 CALL PMSG MOV BX,OFFSET SIGNON2 CALL PMSG
|
Die erwartet, dass die Speichergröße genau an einer 128KB-Grenze liegt. Auch hier wieder: Endlosschleife. Diese ziemlich ungeschickte Art der Ausgabe lässt sich nicht so einfach berichtigen (zumindest wenn man die Speichergröße korrekt angezeigt haben will). Ich habe die deshalb neu geschrieben:
| Quellcode: | SIGNON DB 1BH,'[?4;7h' DB 'SCP1700 DL 3.0a (A7100/A7150) ',CR,LF,LF DB 'SYSTEM GENERATED 27-MAR-26' DB CR,LF,'MEMORY SIZE :',0 SIGNON1 DB ' K BYTES',CR,LF,0 ..... MOV DI,OFFSET SIGNON1+3 MOV CL, 6 MOV AX, MEM_LENGTH SHR AX,CL MOV BX,10 LL2: XOR DX,DX DIV BX ADD DL,'0' DEC DI MOV [DI],DL TEST AX,AX JNZ LL2 MOV BX,DI CALL PMSG
|
Diese etwas größere Änderung lässt sich nicht mehr mit dem Hexeditor in der Originaldatei patchen, sondern das SCP-BIOS muss neu assembliert werden. Der Quelltext und der Assembler sind auf der Systemdisk enthalten, und in der SCP-Dokumentation ist beschrieben wie der Vorgang funktioniert. Als erstes muss eine Datei mit den Laufwerkskonfigurationen erstellt werden (DPB.DEF und DPB.LIB). Dann:
| Quellcode: | asm86 bios pip scp.h86=scpx.h86,bios.h86 gencmd scp 8080 code[a104] ren scp.sys=scp.cmd
|
Fehlt noch der Bootloader für die Systemspur. Für den ist der Vorgang ähnlich in der SCP-Doku beschrieben. Das funktioniert allerdings nicht. Die dabei entstehende Datei weicht stark von der Originaldatei ab, und das System crasht beim booten. Ich habe deshalb die Änderung an der LDSCP.CMD mit dem Hexeditor in der Originaldatei gemacht.
Zur Installation auf die Bootdiskette wird einfach die SCP.SYS per "PIP" draufkopiert, und mittels "LDCOPY LDSCP.CMD" der Bootloader in die Systemspur. Für die Installation auf die Festplatte kann danach "HDSYSTEM" benutzt werden.
Und siehe da:

Hier die Dateien: https://imoriath.com/downloads/privat/cm1910/SCP1700_OPS_1MB_Patch.zip -- Gruß Stefan |