Difference between revisions of "Graduate Software"
From CPCWiki - THE Amstrad CPC encyclopedia!
								
												
				|  (→Notes) |  (→Notes) | ||
| Line 67: | Line 67: | ||
|   ;; HL = address of directory entry |   ;; HL = address of directory entry | ||
|   ;; A = rom number |   ;; 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 |   ;; 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 |   ;; HL = address to read from ROM | ||
|   ;; C = rom number |   ;; C = rom number | ||
|   ;; BC' = 7F80 port 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? | ;; used? | ||
| ;; BC = 7F8x with bit 3 clear. bits 1,0 are mode. | ;; BC = 7F8x with bit 3 clear. bits 1,0 are mode. | ||
| ;; HL = address to read from ROM | ;; 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     | |
| 3. Up to 16 files can be defined. Each file takes 1 entry. Unused entries are filled with &FF. | 3. Up to 16 files can be defined. Each file takes 1 entry. Unused entries are filled with &FF. | ||
Revision as of 12:03, 28 April 2018
Graduate software provided a version of CP/M+ on ROM.
Additional 'utility' roms contained CP/M programs installed on a ROM.
Structure of a utility ROM
Each ROM is 16KB and has the following structure:
| Offset (Hex) | Count | Description | 
| 0 | 48 | Description of ROM (note 1) | 
| &30 | 208 | Loading code (note 2) | 
| &100 | 256 | Directory (note 3) | 
| &200 | &3e00 | Data area for files. | 
Each directory entry has the following structure:
| Offset (Hex) | Count | Description | 
| 0 | 8 | Filename (note 4) | 
| 8 | 1 | ? (unknown &20) | 
| 9 | 2 | address in ROM for start of data for file (note 3) | 
| 11 | 2 | length in bytes of file | 
| 14 | 2 | (unknown) &feff | 
Notes
1. Utility ROM 1 has this description: "Graduate (C)1988 CP/M Accessory Rom 1\r\n$VER 2.30 "
2. Code is copied from &c000-&c100 to &3f00-&4000 in RAM.
;; 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
3. Up to 16 files can be defined. Each file takes 1 entry. Unused entries are filled with &FF.
4. Filename is in upper case, 8 characters long, padded with spaces. '.COM' extension is assumed when accessed.
5. ROM starts at &c000. Therefore &c200 is the start of the first file.
