Graduate software provided Software was a version of CP/M+ on ROMcompany founded in Bristol by three people including Roger Bamkin and Simon Champion.
Additional 'utility' roms contained They provided a version of CP/M programs installed + on a ROM2 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 [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>|MYNAME</nowiki> by itself just prints the ROM owner name. <nowiki>|MYNAME,1</nowiki> prints owner and serial number. <nowiki>|MYNAME,2</nowiki> prints owner, serial and address.|-| <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.|-|} == BUILTIN commands == The ROM provides a set of additional commands by default. These can be listed using the command "BUILTIN". These commands are: {| class="wikitable"! Command! Description|-| 24LINE || ensures the scrolling error messages at bottom of screen|-| 25LINE || turns off that status line and puts any error message on screen under the bad command|-| AMSDOS || the 1K disc utility which ensures a clean exit from CP/M|-| BUILTIN || tells you all commands in your ROM|-| BORDER || changes the colour as in Locomotive BASIC|-| CAT || exists for those who resist DIR, again giving you an alphabetical sort and free space|-| CLS || clears the screen just as in BASIC, homes the cursor but does not affect screen mode|-| DATE || is supposed to display the system date and time.|-| DETAILS || inform you about the system set-up|-| EXPAND || assigns a character string to a lone keystroke|-| HOME || sends the cursor to the top left-hand corner of the screen without clearing the screen|-| INK || works as in BASIC|-| INVERSE || gives paper-on-ink colours, or reversed display, until the NORMAL command is given|-| KDS || controls the optional 8-bit port, if you have one|-| LANGUAGE || accesses the various character sets available|-| LPRINT || dumps a file to your printer|-| MODE || for columns on screen, as in AMSDOS|-| PALETTE || changes screen colours easily|-| PAPER and INK || do what normally happens in BASIC|-| ROMCAT || tells you what's on-board other accessory ROMs|-| SETLST || initialises the printer|-| SET24X80 || a single command combining MODE 2 and 24LINE functions, so existing PROFILE.SUB files need not be modified|-| CKEY || allocates an ASCII code to a Control+key combination|-| NKEY || for normal key assignment|-| SKEY || uses shift+key for ASCII assignment|-| SIGNON || lists accessory ROMs available for use under CP/M|-| WAIT || prompts user for keypress|} == 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 ===
| ''Description''
|-
| 0&00| 4816| Description of ROM identification (note 1)|-| &10| 22| Extension ROM name (note 2)
|-
| &30
| 2088| Loading ?|-| &38| 56| startup code (?) (extension ROM has &c9). This is executed.|-| &70| 144| Common code to load files from ROM (note 23)
|-
| &100
| 256
| Directory (note 34)
|-
| &200
| &3e00
| Data area for files.(note 5)
|}
| 0
| 8
| Filename (note 46)
|-
| 8
| 9
| 2
| address in ROM for start of data for file (note 37)
|-
| 11
| 2
| length in bytes of file
|-
| 13
| 1
| length of filename in chars (excluding padding)
|-
| 14
=== Notes ===
1. Utility ROM 1 has this descriptionIdentification: "Graduate (C)1988 CP/M Accessory Rom 1\r\n$VER 2.30 ". 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.
 0070 32be3f    ld      3. Loading code is required. A dissassembly is shown below. The CP/M ROM executes it. Code is copied from &c070 (3fbeh),a 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      (hllength &200)to &3f70 in RAM therefore copying both the loading code and the directory.
 008c dd6e00 ;; HL = address of directory entry ;; A = rom number 3f70 32be3f    ld      l,(ix+00h3fbeh),a ;; ROM number store to RAM 008f dd6601 3f73 e5        push    ld hl 3f74 dde1      h,(pop     ix+01h) 0092 dd4e02 3f76 2afefb    ld      chl,(ix+02h0fbfeh) 0095 dd4603 3f79 113400    ld      bde,(ix+03h)0034h 0098 110001 3f7c 19        add     hl,de 3f7d 118c3f    ld      de,0100h 009b cdbf3f    3f8ch ;; address to call    3fbfhto load file from ROM 009e 12 3f80 73        ld      (dehl),ae 009f 13        inc     de 00a0 3f81 23        inc     hl 00a1 0b 3f82 72        dec     bcld      (hl),d 00a2 79        3f83 2afefb    ld      ahl,c(0fbfeh)  00a3 b0        or 3f86 111000    ld      bde,0010h 00a4 20f5 3f89 0e3b      jr ld      nzc,009bh3bh 3f8b e9        jp      (hl)
 00a6 1eff      ;; load file from ROM into RAM 3f8c dd6e00    ld      el,0ffh(ix+00h) ;; load address 00a8 0e2d      3f8f dd6601    ld      ch,2dh 00aa cd0500    call    0005h(ix+01h) 00ad 3aaffb 3f92 dd4e02    ld      ac,(0fbafhix+02h);; length 00b0 5f        3f95 dd4603    ld      eb,a(ix+03h) 00b1 0e0e      3f98 110001    ld      cde,0eh0100h   ;; load address for .COM file 00b3 cd0500 3f9b cdbf3f    call    0005h 00b6 1e00 3fbfh      ld      e,00h;; read byte from rom 00b8 0e2d      3f9e 12        ld      c(de),2dha     ;; write to memory 00ba cd0500    call    0005h 00bd c9 3f9f 13        ret inc     de  00be 00 3fa0 23        nop inc     hl 00bf c5 3fa1 0b        push    dec     bc 00c0 3abe3f    3fa2 79        ld      a,(3fbeh)c 00c3 4f 3fa3 b0        ld or      c,ab 00c4 cdc93f    call    3fc9h 00c7 c1        pop     bc 00c8 c9        ret       3fa4 20f5      jr      nz,009bh
 00c9 f3        di 3fa6 1eff       00ca c5        push    bc 00cb d9        exx      00cc cb99 ld      res     3e,c0ffh ;; error code in H 00ce ed49 3fa8 0e2d      ld      out     (c),c2dh  ;; F_ERRMODE - set action on hardware error 00d0 d9        exx     3faa cd0500    call    0005h  ;; call BDOS 00d1 06df      3fad 3aaffb    ld      ba,0dfh(0fbafh) 00d3 ed49 3fb0 5f        ld      out     (c)e,ca 00d5 7e        3fb1 0e0e      ld      ac,(hl)0eh ;; select disc 00d6 d9        exx     3fb3 cd0500    call    0005h  ;; call BDOS 00d7 cbd9 3fb6 1e00      set     3ld      e,c00h 00d9 ed49 3fb8 0e2d      ld      out     (c),c2dh ;; F_ERRMODE - set action on hardware error 00db d9        exx      00dc fb        ei       00dd c1        pop     bc3fba cd0500    call    0005h ;; call BDOS 00de 3fbd c9        ret     
 
 00df 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 00e1 3fd0 d9        exx      00e2 3fd1 06df      ld      b,0dfh;; select ROM 00e4 3fd3 ed49      out     (c),c 00e6 3fd5 7e        ld      a,(hl);; read byte from ROM 00e7 3fd6 d9        exx      00e8 3fd7 cbd9      set     3,c   ;; disable upper rom 00ea 3fd9 ed49      out     (c),c 00ec 3fdb d9        exx      00ed 3fdc fb        ei       00ee 3fdd c1        pop     bc 00ef 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.
3. Up to 16 files can be defined. Each file takes == Password ==The password for |PASSWORD is ''SPLINTER''This is  stored in ROM 1 entryat offset &3f88. Unused entries are filled It uses a simple encryption by XORing bytes with &FFAA.
4. Filename is in upper case, 8 characters long, padded with spaces. '.COM' extension is assumed when accessed.== Links ==
5* [http://futureos. cpc-live.com/ Future OS website, home of ROM starts at &c000Manager and TFM's Accessory ROMs]* [https://github. Therefore &c200 is com/cormacj/AmstradCPCRomHacks Python scripts to build your own accessory roms and to patch the start of the first file.CPM rom to update user, address, serial and password message]
[[Category:Operating System]][[Category:Expansion ROM]][[Category:CP/M]]