Difference between revisions of "Graduate Software"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
(Notes)
m (fix table formatting)
 
(33 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Graduate software provided a version of CP/M+ on ROM.
+
Graduate Software was a company founded in Bristol by three people including Roger Bamkin and Simon Champion.
  
Additional 'utility' roms contained CP/M programs installed on a ROM.
+
They provided a version of CP/M+ on 2 16KB ROMs. These were standard CPC firmware compatible ROMs.  
  
* [[CPM_Accessory_ROM_1]]
+
These ROMs were available in their own ROM board expansion.
 +
 
 +
To get their CPM you were required to send them your system discs and essentially they provided a transfer service so they didn't infringe on Digital Research's copyright or distribution policy.
 +
 
 +
The ROM they provided had your address and serial number encoded on the ROM. A script has been written to update these details which can be downloaded from [https://github.com/cormacj/AmstradCPCRomHacks here].
 +
 
 +
== RSX/ROM Commands ==
 +
 
 +
{| class="wikitable"
 +
|-
 +
! scope="col" width="100" | RSX
 +
! Details
 +
|-
 +
| <nowiki>|EMS</nowiki>
 +
| rowspan="2" |  Starts CP/M Plus from ROM and shows the CP/M Plus expansion ROMs with their names. CP/M Plus is configured for two drives and the RAM drive C: with 444 KB RAM.
 +
|-
 +
| <nowiki>|O</nowiki>
 +
|-
 +
| <nowiki>|PASSWORD</nowiki>
 +
| This command asks you for a password. If you enter it three times wrong then CP/M Plus will be started from ROM. The default password in the available 2.34 ROM is <code>SPLINTER</code>
 +
|-
 +
| <nowiki>|PW</nowiki>
 +
| If the password was entered correctly using <nowiki>|PASSWORD</nowiki> then <nowiki>|PW</nowiki> will do nothing. If the password was not entered, or entered incorrectly then it will start CP/M, just like <nowiki>|EMS</nowiki>
 +
|-
 +
| <nowiki>|OP</nowiki>
 +
| This RSX command activates a menu system, which allows you to launch a .COM or .SUB file in an automatic way. An error message will be displayed if there is no .COM or .SUB file on disc. You can choose the file of choice with SPACE and start it with RETURN. CP/M PLUS with the RAM Disc will be started and the selected file will be launched. <p>Note: Some print routine are incompatible, for example this is the case for X-DDOS. Switch off if you find problems.
 +
|-
 +
| <nowiki>|VER</nowiki>
 +
| rowspan="2" | These commands are both identical. They show the Copyright message for CP/M PLUS and the CPM ROMs. Additionally, the serial number and the name of the user is also printed.
 +
|-
 +
| <nowiki>|CPMVER</nowiki>
 +
|
 +
|-
 +
| <nowiki>|MYNAME</nowiki>
 +
| Displays the name of the user/buyer of this set of CP/M Plus ROMs on screen.
 +
|-
 +
| <nowiki>|OHELP</nowiki>
 +
| rowspan="2" |  These commands are both identical. They list any CP/M Plus expansion ROMs containing programs (if installed). showing their name and position (ROM number). Using <nowiki>|OHELP</nowiki>,number or <nowiki>|EMSHELP</nowiki>,number will display the applications contained in CP/M Plus expansion ROM #number, for example <nowiki>|OHELP,6</nowiki>
 +
|-
 +
| <nowiki>|EMSHELP</nowiki>
 +
|
 +
|-
 +
| <nowiki>|NOCPM</nowiki>
 +
| This RSX command will switch OFF the CP/M Plus expansion ROMs. All other ROMs will be initialiized again.
 +
|-
 +
|}
 +
 
 +
== Technical ==
 +
 
 +
* CPM+ is stored in ROM 2 and is copied into RAM. It appears to copy the equivalent of the EMS file but with patches.
 +
* AMSDOS ROM is required for the final part of the boot process.
 +
 
 +
== Accessory/Utility ROM ==
 +
 
 +
Graduate's ROM based CPM allows CPM software to be installed in special Accessory ROMs.
 +
 
 +
They produced one [[CPM_Accessory_ROM_1]] but you could buy more from them with the programs you wanted to be installed.
 +
 
 +
A utility ROM can exist in any ROM slot from 1 to 15 - these are the slots checked by the ROM.
 +
 
 +
[[TFM]] has written ROMManager which can create these accessory ROMs and he provides downloads on his website for some that he has made himself.
 +
 
 +
[[User:Cormacj|CormacJ]] has written a python script to create accessory ROMS and also extract .COM files from ROMS. You can view this at his [https://github.com/cormacj/AmstradCPCRomHacks?tab=readme-ov-file#make_accessory_rompy AmstradCPCRomHacks] repository
 +
 
 +
Some emulators don't support the accessory ROMs because of the non-standard format. Arnold and Caprice32 supports these.
  
 
=== Structure of a utility ROM ===
 
=== Structure of a utility ROM ===
Line 15: Line 79:
 
| ''Description''
 
| ''Description''
 
|-
 
|-
| 0
+
| &00
| 48
+
| 16
| Description of ROM (note 1)
+
| ROM identification (note 1)
 +
|-
 +
| &10
 +
| 22
 +
| Extension ROM name (note 2)
 
|-
 
|-
 
| &30
 
| &30
| 208
+
| 8
| Loading code (note 2)
+
| ?
 +
|-
 +
| &38
 +
| 56
 +
| startup code (?) (extension ROM has &c9). This is executed.
 +
|-
 +
| &70
 +
| 144
 +
| Common code to load files from ROM (note 3)
 
|-
 
|-
 
| &100
 
| &100
 
| 256
 
| 256
| Directory (note 3)
+
| Directory (note 4)
 
|-
 
|-
 
| &200
 
| &200
 
| &3e00
 
| &3e00
| Data area for files.
+
| Data area for files. (note 5)
 
|}
 
|}
  
Line 41: Line 117:
 
| 0
 
| 0
 
| 8
 
| 8
| Filename (note 4)
+
| Filename (note 6)
 
|-
 
|-
 
| 8
 
| 8
Line 49: Line 125:
 
| 9
 
| 9
 
| 2
 
| 2
| address in ROM for start of data for file (note 3)
+
| address in ROM for start of data for file (note 7)
 
|-
 
|-
 
| 11
 
| 11
 
| 2
 
| 2
 
| length in bytes of file
 
| length in bytes of file
 +
|-
 +
| 13
 +
| 1
 +
| length of filename in chars (excluding padding)
 
|-
 
|-
 
| 14
 
| 14
Line 61: Line 141:
  
 
=== Notes ===
 
=== Notes ===
1. Utility ROM 1 has this description: "Graduate (C)1988 CP/M Accessory Rom 1\r\n$VER 2.30 "
+
1. Identification: "Graduate (C)1988". Only the first char 'G' is checked.
  
2.
+
2. Accessory ROM name is ASCII string terminated with '$'. Graduate's Accessory ROM 1 is called "CP/M Accessory Rom 1\r\n$". You need to provide a description. At a minimum '$' on it's own is ok. The code displays the string and doesn't check if it goes past the space allocated in the ROM. Some documentation notes that this can be 32 characters long, but the Graduate Software roms will only display up to 22 characters.  
  
0070 32be3f    ld      (3fbeh),a
+
3. Loading code is required. A dissassembly is shown below. The CP/M ROM executes it. Code is copied from &c070 (length &200) to &3f70 in RAM therefore copying both the loading code and the directory.
0073 e5        push    hl
+
0074 dde1      pop    ix
+
0076 2afefb    ld      hl,(0fbfeh)
+
0079 113400    ld      de,0034h
+
007c 19        add    hl,de
+
007d 118c3f    ld      de,3f8ch
+
0080 73        ld      (hl),e
+
0081 23        inc    hl
+
0082 72        ld      (hl),d
+
0083 2afefb    ld      hl,(0fbfeh)
+
0086 111000    ld      de,0010h
+
0089 0e3b      ld      c,3bh
+
008b e9        jp      (hl)
+
  
  008c dd6e00   ld      l,(ix+00h)
+
  ;; HL = address of directory entry
  008f dd6601   ld     h,(ix+01h)
+
;; A = rom number
  0092 dd4e02   ld      c,(ix+02h)
+
3f70 32be3f   ld      (3fbeh),a ;; ROM number store to RAM
  0095 dd4603   ld      b,(ix+03h)
+
  3f73 e5        push   hl
  0098 110001   ld      de,0100h
+
3f74 dde1     pop    ix
009b cdbf3f    call   3fbfh
+
  3f76 2afefb   ld      hl,(0fbfeh)  
  009e 12       ld      (de),a
+
  3f79 113400   ld      de,0034h
  009f 13        inc    de
+
  3f7c 19        add    hl,de
00a0 23        inc    hl
+
3f7d 118c3f   ld      de,3f8ch ;; address to call to load file from ROM
  00a1 0b       dec    bc
+
  3f80 73       ld      (hl),e
  00a2 79        ld      a,c
+
  3f81 23        inc    hl
  00a3 b0        or     b
+
  3f82 72       ld      (hl),d
  00a4 20f5     jr     nz,009bh
+
  3f83 2afefb    ld      hl,(0fbfeh)
 +
  3f86 111000    ld     de,0010h
 +
  3f89 0e3b     ld     c,3bh
 +
3f8b e9        jp      (hl)
  
  00a6 1eff      ld      e,0ffh
+
  ;; load file from ROM into RAM
  00a8 0e2d      ld      c,2dh
+
3f8c dd6e00    ld      l,(ix+00h) ;; load address
00aa cd0500    call    0005h
+
  3f8f dd6601    ld      h,(ix+01h)
  00ad 3aaffb   ld      a,(0fbafh)
+
  3f92 dd4e02   ld      c,(ix+02h) ;; length
  00b0 5f        ld      e,a
+
  3f95 dd4603    ld      b,(ix+03h)
  00b1 0e0e      ld      c,0eh
+
  3f98 110001    ld      de,0100h  ;; load address for .COM file
  00b3 cd0500   call    0005h
+
  3f9b cdbf3f   call    3fbfh     ;; read byte from rom
00b6 1e00     ld      e,00h
+
  3f9e 12        ld      (de),a    ;; write to memory
  00b8 0e2d      ld      c,2dh
+
  3f9f 13       inc     de
  00ba cd0500    call    0005h
+
  3fa0 23       inc     hl
00bd c9       ret      
+
  3fa1 0b       dec    bc
   
+
  3fa2 79        ld      a,c
00be 00       nop      
+
  3fa3 b0       or     b
  00bf c5       push    bc
+
  3fa4 20f5      jr      nz,009bh
  00c0 3abe3f    ld      a,(3fbeh)
+
  00c3 4f       ld     c,a
+
  00c4 cdc93f    call    3fc9h
+
00c7 c1        pop    bc
+
00c8 c9        ret     
+
  
  00c9 f3        di      
+
  3fa6 1eff     ld     e,0ffh ;; error code in H
00ca c5        push    bc
+
  3fa8 0e2d      ld     c,2dh  ;; F_ERRMODE - set action on hardware error
00cb d9        exx   
+
  3faa cd0500    call    0005h  ;; call BDOS
00cc cb99     res    3,c
+
  3fad 3aaffb    ld      a,(0fbafh)
  00ce ed49     out    (c),c
+
  3fb0 5f        ld     e,a
  00d0 d9        exx   
+
  3fb1 0e0e      ld      c,0eh ;; select disc
  00d1 06df      ld      b,0dfh
+
  3fb3 cd0500    call    0005h  ;; call BDOS
  00d3 ed49     out    (c),c
+
  3fb6 1e00     ld      e,00h
  00d5 7e        ld      a,(hl)
+
  3fb8 0e2d      ld     c,2dh ;; F_ERRMODE - set action on hardware error
  00d6 d9        exx   
+
  3fba cd0500    call    0005h ;; call BDOS
  00d7 cbd9     set    3,c
+
  3fbd c9        ret     
  00d9 ed49     out    (c),c
+
  00db d9        exx   
+
00dc fb        ei     
+
00dd c1        pop    bc
+
  00de c9        ret     
+
 
   
 
   
  00df ed49      out    (c),c
+
  3fbe 00        nop    ;; storage for ROM number
  00e1 d9        exx     
+
 
  00e2 06df      ld      b,0dfh
+
;; read byte from ROM
  00e4 ed49      out    (c),c
+
3fbf c5        push    bc
  00e6 7e        ld      a,(hl)
+
3fc0 3abe3f    ld      a,(3fbeh)
  00e7 d9        exx     
+
3fc3 4f        ld      c,a
  00e8 cbd9      set    3,c
+
3fc4 cdc93f    call    3fc9h
  00ea ed49      out    (c),c
+
3fc7 c1        pop    bc
  00ec d9        exx     
+
3fc8 c9        ret     
  00ed fb        ei       
+
 
  00ee c1        pop    bc
+
;; HL = address to read from ROM
  00ef c9        ret   
+
;; C = rom number
 +
;; BC' = 7F80 port number
 +
3fc9 f3        di     
 +
3fca c5        push    bc
 +
3fcb d9        exx   
 +
3fcc cb99      res    3,c  ;; enable upper rom
 +
3fce ed49      out    (c),c
 +
  3fd0 d9        exx     
 +
  3fd1 06df      ld      b,0dfh ;; select ROM
 +
  3fd3 ed49      out    (c),c
 +
  3fd5 7e        ld      a,(hl) ;; read byte from ROM
 +
  3fd6 d9        exx     
 +
  3fd7 cbd9      set    3,c   ;; disable upper rom
 +
  3fd9 ed49      out    (c),c
 +
  3fdb d9        exx     
 +
  3fdc fb        ei       
 +
  3fdd c1        pop    bc
 +
  3fde c9        ret   
 +
 
 +
;; used?
 +
;; BC = 7F8x with bit 3 clear. bits 1,0 are mode.
 +
;; HL = address to read from ROM
 +
3fdf ed49      out    (c),c ;; must enable ROM
 +
3fe1 d9        exx   
 +
3fe2 06df      ld      b,0dfh ;; select ROM
 +
3fe4 ed49      out    (c),c
 +
3fe6 7e        ld      a,(hl) ;; read from rom
 +
3fe7 d9        exx   
 +
3fe8 cbd9      set    3,c  ;; disable ROM again
 +
3fea ed49      out    (c),c
 +
3fec d9        exx   
 +
3fed fb        ei     
 +
3fee c1        pop    bc
 +
3fef c9        ret   
 +
 
 +
4. Up to 16 files can be defined. Each file takes 1 entry. Unused entries are filled with &FF.
 +
 
 +
5. The accessory ROM boot program can be replaced and if needed exended by re-using some of the data area for code. In this case allocate your programs to account for this.
 +
 
 +
6. Filename is in upper case, 8 characters long, padded with spaces. '.COM' extension is assumed.
 +
 
 +
7. ROM starts at &c000. Therefore &c200 is the start of the first file.
 +
 
 +
== Registered user ==
  
3. Up to 16 files can be defined. Each file takes 1 entry. Unused entries are filled with &FF.
+
The name, address and serial number of the registered user is stored in ROM 1 at offset &3f00. It uses a simple encryption by XORing bytes with &4E.
  
4. Filename is in upper case, 8 characters long, padded with spaces. '.COM' extension is assumed when accessed.
+
== Password ==
 +
The password for |PASSWORD is ''SPLINTER''
 +
This is stored in ROM 1 at offset &3f88. It uses a simple encryption by XORing bytes with &AA.
  
5. ROM starts at &c000. Therefore &c200 is the start of the first file.
+
== Links ==
  
[[Category:Operating System]][[Category:CP/M]]
+
* [[http://futureos.cpc-live.com/ Future OS website, home of ROM Manager and TFM's Accessory ROMs]]
 +
* [https://github.com/cormacj/AmstradCPCRomHacks Python scripts to build your own accessory roms and to patch the CPM rom to update user, address, serial and password message]
 +
[[Category:Operating System]][[Category:Expansion ROM]][[Category:CP/M]]

Latest revision as of 13:44, 23 July 2024

Graduate Software was a company founded in Bristol by three people including Roger Bamkin and Simon Champion.

They provided a version of CP/M+ on 2 16KB ROMs. These were standard CPC firmware compatible ROMs.

These ROMs were available in their own ROM board expansion.

To get their CPM you were required to send them your system discs and essentially they provided a transfer service so they didn't infringe on Digital Research's copyright or distribution policy.

The ROM they provided had your address and serial number encoded on the ROM. A script has been written to update these details which can be downloaded from here.

RSX/ROM Commands

RSX Details
|EMS Starts CP/M Plus from ROM and shows the CP/M Plus expansion ROMs with their names. CP/M Plus is configured for two drives and the RAM drive C: with 444 KB RAM.
|O
|PASSWORD This command asks you for a password. If you enter it three times wrong then CP/M Plus will be started from ROM. The default password in the available 2.34 ROM is SPLINTER
|PW If the password was entered correctly using |PASSWORD then |PW will do nothing. If the password was not entered, or entered incorrectly then it will start CP/M, just like |EMS
|OP This RSX command activates a menu system, which allows you to launch a .COM or .SUB file in an automatic way. An error message will be displayed if there is no .COM or .SUB file on disc. You can choose the file of choice with SPACE and start it with RETURN. CP/M PLUS with the RAM Disc will be started and the selected file will be launched.

Note: Some print routine are incompatible, for example this is the case for X-DDOS. Switch off if you find problems.

|VER These commands are both identical. They show the Copyright message for CP/M PLUS and the CPM ROMs. Additionally, the serial number and the name of the user is also printed.
|CPMVER
|MYNAME Displays the name of the user/buyer of this set of CP/M Plus ROMs on screen.
|OHELP These commands are both identical. They list any CP/M Plus expansion ROMs containing programs (if installed). showing their name and position (ROM number). Using |OHELP,number or |EMSHELP,number will display the applications contained in CP/M Plus expansion ROM #number, for example |OHELP,6
|EMSHELP
|NOCPM This RSX command will switch OFF the CP/M Plus expansion ROMs. All other ROMs will be initialiized again.

Technical

  • CPM+ is stored in ROM 2 and is copied into RAM. It appears to copy the equivalent of the EMS file but with patches.
  • AMSDOS ROM is required for the final part of the boot process.

Accessory/Utility ROM

Graduate's ROM based CPM allows CPM software to be installed in special Accessory ROMs.

They produced one CPM_Accessory_ROM_1 but you could buy more from them with the programs you wanted to be installed.

A utility ROM can exist in any ROM slot from 1 to 15 - these are the slots checked by the ROM.

TFM has written ROMManager which can create these accessory ROMs and he provides downloads on his website for some that he has made himself.

CormacJ has written a python script to create accessory ROMS and also extract .COM files from ROMS. You can view this at his AmstradCPCRomHacks repository

Some emulators don't support the accessory ROMs because of the non-standard format. Arnold and Caprice32 supports these.

Structure of a utility ROM

Each ROM is 16KB and has the following structure:

Offset (Hex) Count Description
&00 16 ROM identification (note 1)
&10 22 Extension ROM name (note 2)
&30 8  ?
&38 56 startup code (?) (extension ROM has &c9). This is executed.
&70 144 Common code to load files from ROM (note 3)
&100 256 Directory (note 4)
&200 &3e00 Data area for files. (note 5)

Each directory entry has the following structure:

Offset (Hex) Count Description
0 8 Filename (note 6)
8 1  ? (unknown &20)
9 2 address in ROM for start of data for file (note 7)
11 2 length in bytes of file
13 1 length of filename in chars (excluding padding)
14 2 (unknown) &feff

Notes

1. Identification: "Graduate (C)1988". Only the first char 'G' is checked.

2. Accessory ROM name is ASCII string terminated with '$'. Graduate's Accessory ROM 1 is called "CP/M Accessory Rom 1\r\n$". You need to provide a description. At a minimum '$' on it's own is ok. The code displays the string and doesn't check if it goes past the space allocated in the ROM. Some documentation notes that this can be 32 characters long, but the Graduate Software roms will only display up to 22 characters.

3. Loading code is required. A dissassembly is shown below. The CP/M ROM executes it. Code is copied from &c070 (length &200) to &3f70 in RAM therefore copying both the loading code and the directory.

;; HL = address of directory entry
;; A = rom number
3f70 32be3f    ld      (3fbeh),a ;; ROM number store to RAM
3f73 e5        push    hl
3f74 dde1      pop     ix
3f76 2afefb    ld      hl,(0fbfeh) 
3f79 113400    ld      de,0034h
3f7c 19        add     hl,de
3f7d 118c3f    ld      de,3f8ch ;; address to call to load file from ROM
3f80 73        ld      (hl),e
3f81 23        inc     hl
3f82 72        ld      (hl),d
3f83 2afefb    ld      hl,(0fbfeh) 
3f86 111000    ld      de,0010h
3f89 0e3b      ld      c,3bh
3f8b e9        jp      (hl)
;; load file from ROM into RAM
3f8c dd6e00    ld      l,(ix+00h) ;; load address
3f8f dd6601    ld      h,(ix+01h)
3f92 dd4e02    ld      c,(ix+02h) ;; length
3f95 dd4603    ld      b,(ix+03h)
3f98 110001    ld      de,0100h   ;; load address for .COM file
3f9b cdbf3f    call    3fbfh      ;; read byte from rom
3f9e 12        ld      (de),a     ;; write to memory
3f9f 13        inc     de
3fa0 23        inc     hl
3fa1 0b        dec     bc
3fa2 79        ld      a,c
3fa3 b0        or      b
3fa4 20f5      jr      nz,009bh
3fa6 1eff      ld      e,0ffh ;; error code in H
3fa8 0e2d      ld      c,2dh  ;; F_ERRMODE - set action on hardware error
3faa cd0500    call    0005h  ;; call BDOS
3fad 3aaffb    ld      a,(0fbafh)
3fb0 5f        ld      e,a
3fb1 0e0e      ld      c,0eh ;; select disc
3fb3 cd0500    call    0005h  ;; call BDOS
3fb6 1e00      ld      e,00h
3fb8 0e2d      ld      c,2dh ;; F_ERRMODE - set action on hardware error
3fba cd0500    call    0005h ;; call BDOS
3fbd c9        ret     

3fbe 00        nop     ;; storage for ROM number
;; read byte from ROM
3fbf c5        push    bc
3fc0 3abe3f    ld      a,(3fbeh)
3fc3 4f        ld      c,a
3fc4 cdc93f    call    3fc9h
3fc7 c1        pop     bc
3fc8 c9        ret       
;; HL = address to read from ROM
;; C = rom number
;; BC' = 7F80 port number
3fc9 f3        di      
3fca c5        push    bc
3fcb d9        exx     
3fcc cb99      res     3,c   ;; enable upper rom
3fce ed49      out     (c),c
3fd0 d9        exx     
3fd1 06df      ld      b,0dfh ;; select ROM
3fd3 ed49      out     (c),c
3fd5 7e        ld      a,(hl) ;; read byte from ROM
3fd6 d9        exx     
3fd7 cbd9      set     3,c    ;; disable upper rom
3fd9 ed49      out     (c),c
3fdb d9        exx     
3fdc fb        ei      
3fdd c1        pop     bc
3fde c9        ret     
;; used?
;; BC = 7F8x with bit 3 clear. bits 1,0 are mode.
;; HL = address to read from ROM
3fdf ed49      out     (c),c ;; must enable ROM
3fe1 d9        exx     
3fe2 06df      ld      b,0dfh ;; select ROM
3fe4 ed49      out     (c),c
3fe6 7e        ld      a,(hl) ;; read from rom
3fe7 d9        exx     
3fe8 cbd9      set     3,c  ;; disable ROM again
3fea ed49      out     (c),c
3fec d9        exx     
3fed fb        ei      
3fee c1        pop     bc
3fef c9        ret   

4. Up to 16 files can be defined. Each file takes 1 entry. Unused entries are filled with &FF.

5. The accessory ROM boot program can be replaced and if needed exended by re-using some of the data area for code. In this case allocate your programs to account for this.

6. Filename is in upper case, 8 characters long, padded with spaces. '.COM' extension is assumed.

7. ROM starts at &c000. Therefore &c200 is the start of the first file.

Registered user

The name, address and serial number of the registered user is stored in ROM 1 at offset &3f00. It uses a simple encryption by XORing bytes with &4E.

Password

The password for |PASSWORD is SPLINTER This is stored in ROM 1 at offset &3f88. It uses a simple encryption by XORing bytes with &AA.

Links