CoBra - Sistem de operare CP/M cu 80 caractere pe linie afişate simultan
|
|
|
![]() |
![]() |
CP/M Loader - codul dezasamblat |
Boot Sector - codul dezasamblat |
> wine SAMdisk.exe view UTILS1.TD0 -c0 > UTILS1_systrk_hexdump.txt > wine SAMdisk.exe view UTILS1.TD0 -c1 >> UTILS1_systrk_hexdump.txt > wine SAMdisk.exe view UTILS2.TD0 -c0 > UTILS2_systrk_hexdump.txt > wine SAMdisk.exe view UTILS2.TD0 -c1 >> UTILS2_systrk_hexdump.txt > wine SAMdisk.exe view UTILS3.TD0 -c0 > UTILS3_systrk_hexdump.txt > wine SAMdisk.exe view UTILS3.TD0 -c1 >> UTILS3_systrk_hexdump.txt > wine SAMdisk.exe view UTILS4.TD0 -c0 > UTILS4_systrk_hexdump.txt > wine SAMdisk.exe view UTILS4.TD0 -c1 >> UTILS4_systrk_hexdump.txt > wine SAMdisk.exe view UTILS5.TD0 -c0 > UTILS5_systrk_hexdump.txt > wine SAMdisk.exe view UTILS5.TD0 -c1 >> UTILS5_systrk_hexdump.txt |
845e8f608cd9c609cc5ad8164c5a203a UTILS1_systrk_hexdump.txt 6d46d60edf4e075ce11d67faa4e1d664 UTILS2_systrk_hexdump.txt 845e8f608cd9c609cc5ad8164c5a203a UTILS3_systrk_hexdump.txt 845e8f608cd9c609cc5ad8164c5a203a UTILS4_systrk_hexdump.txt 845e8f608cd9c609cc5ad8164c5a203a UTILS5_systrk_hexdump.txt |
> wine SAMdisk.exe scan UTILS2.TD0 [UTILS2.TD0] 80 Cyls, 2 Heads: 250Kbps MFM, 6 sectors, 512 bytes/sector: 0.0 1[r] 1[r] 6 7 8 9 250Kbps MFM, 9 sectors, 512 bytes/sector: 1.0 1 2 3 4 5 6 7 8 9 2.0 1 2 3 4 5 6 7 8 9 3.0 1 2 3 4 5 6 7 8 9 . . . 79.0 1 2 3 4 5 6 7 8 9 250Kbps MFM, 9 sectors, 512 bytes/sector: 0.1 1 2 3 4 5 6 7 8 9 1.1 1 2 3 4 5 6 7 8 9 2.1 1 2 3 4 5 6 7 8 9 3.1 1 2 3 4 5 6 7 8 9 . . . 79.1 1 2 3 4 5 6 7 8 9 |
UTILS1_systrk_hexdump.txt | snapshot 0100-FFFF.hexdump |
0000: C3 03 DF 80 00 C3 06 D1 00 00 00 00 00 00 00 00 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0050: 00 00 00 00 00 00 00 00 00 00 00 00 01 3F 3F 3F 0060: 3F 3F 3F 3F 3F 3F 3F 3F 00 00 00 74 00 20 20 20 0070: 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 0080: E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 0090: E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 00A0: E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 00B0: E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 00C0: E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 00D0: E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 00E0: E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 00F0: E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 |
Poziţia initială | Poziţia finală | Poziţia în pistele sistem | Mărime | |
BOOT SECTOR | 0000-01FF | - - - | cyl00_side0_sec1 | 1sec x 200h = 200h (0.5K) |
CCP | 0200-09FF | C900-D0FF | cyl00_side0_sec2-5 | 4sec x 200h = 800h (2K) |
BDOS | 0A00-17FF | D100-DEFF | cyl00_side0_sec6-9 plus cyl00_side1_sec1-3 | 7sec x 200h = E00h (3.5K) |
BIOS-1 | 1800-24FF | DF00-EBFF | cyl00_side1_sec4-9 plus cyl01_side0_1/2 sec1 | 6.5sec x 200h = D00h (3.25K) (ultimii 170h octeţi sînt de fapt "00", nefolosiţi) |
BIOS-2 | 2500-36FF | EC00-FDFF | cyl01_side0_2/2 sec1 pînă la cyl01_side1_1/2 sec1 | 9sec x 200h = 1200h zonă goală, cu excepţia ultimului sect şi jumătate care conţine zona DPH + 3 şiruri de date |
BLOCK#1 | 3700-3B75 | 5B00-5F75(VRAM) | cyl01_side1_100 sec1 pina la cyl01_side1_175 sec3 | 476h |
BLOCK#2 | 3B76-4074 | 7B00-7FFE(VRAM) | cyl01_side1_176 sec3 pina la cyl01_side1_074 sec6 | 4FFh |
UNKNOWN | 3FF9-47FF | 3FF9-47FF | cyl01_side1_sec6-9 | 4sec x 200h = 800h (2K) |
CCP (C900-D0FF) - codul dezasamblat |
BDOS (D100-DEFF) - codul dezasamblat |
BIOS (DF00-FDFF) - codul dezasamblat |
Boot Sector modificat pentru lansare din ROM |
; ######### CP/M ROM LOADING #########
CPM0 LD A,$00 ; default drive 0
JR CPM
CPM1 LD A,$01 ; default drive 1
JR CPM
CPM2 LD A,$02 ; default drive 2
JR CPM
CPM3 LD A,$03 ; default drive 3
CPM LD HL,$4000
LD DE,$8000
LD BC,$3200
LDIR
LD HL,$8004 ; DSK Byte, location used as mailbox from BOOT to CP/M for user choice of default drive
LD (HL),A ; set default CP/M logical drive
LD HL,$0000 ; jump address in upcoming CP/M config
LD A,$40
OUT ($FE),A ; set O6=1 for CP/M config
XOR A
LD R,A
JP (HL)
|
![]() |
![]() |
POWER.COM 3.03 - cod dezasamblat şi (parţial) comentat |
dd if=/dev/zero bs=1k count=720 | tr '\000' '\345' > TEST_KRYS80.img
![]() |
|
|
head -c 18K TEST_KRYS80.img > KRYS80_SYS_Tracks_full.bin
CP/M Loader versiunea originală a acestui sistem, CBOT.SYS - codul dezasamblat |
CP/M Loader personalizat (cu logo) - listing în Assembler | ![]() |
CP/M Loader versiunea originală CoBra, LK.SYS - codul dezasamblat |
Aceasta e versiunea originală a CP/M Loader-ului folosit cu prima versiune de CP/M CoBra. Este proiectat să funcționeze cu piste sistem formatate cu cîte un singur sector pe o față de pistă, cu 4096 octeți/sector. Imediat după acest listing prezint un tabel cu modificări care adaptează acest CP/M Loader pentru lucrul cu piste sistem cu format standard. Aplicînd aceste modificări direct fișierului binar LK.SYS (cu un editor hexa) se obține foarte elegant un CP/M Loader pentru versiunea CP/M de față (cu 80 coloane text vizibile). NOTĂ:
|
MODIFICARE LK.SYS PENTRU A FUNCȚIONA CU 9 SECTOARE PE PISTĂ, 512 OCTEȚI/SECTOR |
Locația | Modificare | Comentariu |
---|---|---|
$0097 | $20 -> $24 | $24 x $100 = $2400 = 9 KB = 1 pistă ambele fețe |
$0098 | $FF -> $00 | adresa de start pentru salvare va fi $0000 |
$0099 | $3F -> $00 | |
$00AD | $00 -> $01 | comanda MT Read Data să înceapă la sectorul 1 |
$00AE | $00 -> $02 | 512 octeți/sector |
$00AF | $00 -> $09 | EOT, ultimul nr. de sector de pe o pistă |
$00B0 | $00 -> $50 | valoarea GAP3 pentru 9 sect/pistă, 512 octeți/sector |
$01AD | $04 -> $01 | un singur octet de copiat cu LDIR, anume nr. pistă |
$01B1 | $2B -> $06 | înlocuire DEC HL și LD B,(HL) cu LD B,$02 pentru a specifica 512 octeți/sector |
$01B2 | $46 -> $02 | |
$01B3 | $2B -> $3E | înlocuire DEC HL și LD A,(HL) cu LD A,$01 pentru a specifica sector nr. 1 |
$01B4 | $7E -> $01 | |
$01B5 | $12 -> $00 | ștergere instrucțiune LD (DE),A |
$01C2 | $CB -> $00 | ștergere instrucțiune care schimba opcode pt. INI cu opcode pt. IND |
$01C3 | $DE -> $00 | |
$01FC | $23 -> $21 | înlocuire instrucțiuni INC HL și RET cu LD HL,$0000 și RET pentru ca JP (HL) să sară la $0000 după ce ambele piste sistem sînt citite |
$01FD | $C9 -> $00 | |
$01FE | $00 -> $00 | |
$01FF | $00 -> $C9 |
octetul 0: | $00 (User Number) |
octeții 1-8: | $4C $4B $20 $20 $20 $20 $20 $20 (Nume fișier, 'LK ') |
octeții 9-11: | $53 $59 $53 (Extensia numelui, 'SYS') |
octetul 12: | $00 (Xl, Nr. extensiei logice de 16KB, octetul inferior al valorii pe 16 biți) |
octetul 13: | $00 (Byte Count, nr. octeți folosiți în ultima înregistrare de 128 octeți. CP/M 2.2 nu suportă acest octet, care este lăsat pe 0) |
octetul 14: | $00 (Xh, Nr. extensiei logice de 16KB, octetul superior al valorii pe 16 biți) |
octetul 15: | $04 (Record Count, nr înregistrări de 128 octeți folosiți de ultima extensie) |
octețul 16: | $02 (octetul inferior al numărului (2) primului bloc alocat pe disc - blocurile 0 și 1 sînt ocupate de directorul CP/M) |
octetul 17: | $00 (octetul superior al numărului primului bloc alocat pe disc) |
octeții 18-31: | $00 (LK.SYS ocupă un singur bloc de 2KB, deci restul de 7 blocuri adresabile de această intrare de director vor avea valoarea $0000) |
dd if=/dev/zero bs=1 count=3552 | tr '\000' '\345' > E5dirfill_1.bin
dd if=/dev/zero bs=512 count=1396 | tr '\000' '\345' > E5dirfill_2.bin
cat KRYS80_SYS_Tracks_full_modified.bin LK_direntry.bin E5dirfill_1.bin CPM_KRYSS_Loader.bin E5dirfill_2.bin > KRYS80_KR_SYSDISK.img
cat KRYS80_SYS_Tracks_full_modified.bin LK_direntry.bin E5dirfill_1.bin CPM_80c_Loader.bin E5dirfill_2.bin > KRYS80_CL_SYSDISK.img
cat KRYS80_SYS_Tracks_full_modified.bin LK_direntry.bin E5dirfill_1.bin LK_modified.bin E5dirfill_2.bin > KRYS80_LK_SYSDISK.img
![]() |
PRECIZARE IMPORTANTĂ:Pentru lansarea sistemului CP/M de pe imaginile de dischetă de mai jos NU ESTE NECESAR „Boot-ul CoBra Unificat” scris de mine și prezentat aici la secțiunea „Software / BOOT ROM”. Aceste imagini de dischetă pot fi foarte bine lansate cu un cod de BOOT original de 2KB (ca pe vremuri). Dealtfel, și dacă se folosește „Boot-ul CoBra Unificat”, pentru lansarea oricărui sistem de pe dischetă, din meniul lui va trebui intrat mai întîi într-unul din codurile BOOT vechi, și apoi din acel BOOT, cu tasta D se încarcă sistem CP/M de pe dischetă. |
IMAGINI DISCHETE SISTEM BOOTABILE - CP/M cu 80 coloane text vizibile simultan (cu piste sistem formatate normal, 9 sect/pistă) cu sistem încărcabil de pe orice unitate fizică (0, 1, 2 sau 3) |
Tip CP/M Loader | Format RAW | Format HFE | Screenshot |
LK.SYS modificat | KRYS80_LK_SYSDISK.img | KRYS80_LK_SYSDISK.hfe | ![]() |
CP/M 80 coloane | KRYS80_KR_SYSDISK.img | KRYS80_KR_SYSDISK.hfe | ![]() |
Personalizat (logo) | KRYS80_CL_SYSDISK.img | KRYS80_CL_SYSDISK.hfe | ![]() |