第 5 部 7 章ではカートリッジ ROM 内に収めるソフトウェアの作成法を説明しましたが、実際にカートリッジを制作する場合には、ここに示したハードウェア仕様を参考にしてください。
;============================================================ ; List A.1 MSX ROM Cartridge Header to start by H.STKE ; (this program must link List 5.13) ;============================================================ ; ; Switch SNSDEL EQU 1 ;Sense DEL key not to start ; ; BIOS ; SNSMAT EQU 141H ;Sense key in real time ; ; System work area ; H.STKE EQU 0FEDAH ;Hook for auto start ; ; External symbol ; EXTRN START ;Address to start EXTRN GTSL1@ ;Get my slot address ; ; Header ; ASEG ORG 4000H DB 41H, 42H DW INIT DW 0 ;No STATEMENT DW 0 ;No DEVICE DW 0 ;No TEXT DW 0 DW 0 DW 0 ; ; INIT : set H.STKE and return ; INIT: IF SNSDEL LD A,8 ;Read 8th row CALL SNSMAT ;Read key BIT 3,A ;DEL key RET Z ;Return if DEL pressed ENDIF ;IF SNSDEL ; LD HL,H.STKE ;Hook for auto start LD A, 0F7H ;"RST 30H" instruction DI ;For fale safe LD (HL), A CALL GRSL1@ ;[A] = my slot address INC HL LD (HL), A LD DE, START ;Set start address INC HL LD (HL), E INC HL LD (HL), D EI RET END
;================================================================ ; List A.2 MSX ROM Cartridge Header to get work area from HIMEM ;================================================================ .SFCOND .XALL .RADIX 10 ; ; Switch ; SNSDEL EQU 1 ;Sense DEL key not to start ; ; Constant ; MYWORK EQU 1024 ;Length of my work area to request ; ; BIOS ; RSLREG EQU 138H ;Get primary slot register SNSMAT EQU 141H ;Sense key in real time CALBAS EQU 159H ;Call BASIC interpreter ; ; System work area ; MEMSIZ EQU 0F672H VARTAB EQU 0F6C2H STKTOP EQU 0F674H TEMP EQU 0F6A7H ;To save text pointer MAXFIL EQU 0F85FH FILTAB EQU 0F860H NULBUF EQU 0F862H BOTTOM EQU 0FC48H HIMEM EQU 0FC4AH EXPTBL EQU 0FCC1H SLTWRK EQU 0FD09H H.CLEA EQU 0FED0H ;Hook to get work area ; ; MACROS ; COMPAR MACRO RST 20H ;Compares HL with DE ENDM ; BIOS MACRO ADDRESS CALL ADDRESS ;Will be change for DOS version ENDM ; ; Header ; CSEG ; ASEG ; ORG 4000H DB 41H, 42H DW INIT DW 0 ;No STATEMENT DW 0 ;No DEVICE DW 0 ;No TEXT DW 0 DW 0 DW 0 ; ; INIT : set H.CLEA and return ; INIT: IF SNSDEL LD A,8 ;Read 8th row CALL SNSMAT ;Read key BIT 3,A ;DEL key RET Z ;Return if DEL pressed ENDIF ;IF SNSDEL ; LD HL, H.CLEA ;Hook to get work area LD A, 0F7H ;"RST 30th" instruction DI ;For fale safe LD (HL), A CALL GTSL1@ ;[A] = my slot address INC HL LD (HL), A LD DE, START ;Set start address INC HL LD (HL), E INC HL LD (HL), D EI RET ; ; Called by H.CLEA ; START: LD (TEMP),HL ;Save [HL] DI ;For fail safe LD B,5 LD HL,H.CLEA LD A,0C9H ;RET instruction CLHOOK: LD (HL),A ;Clear H.CLEA INC HL DJNZ CLHOOK EI ; LD HL,MYWORK ;How many memory to request CALL WORKH@ ;Change HIMEM ; ; [HL] = (HIMEM) = start address of my work area ; [HL] = 0 if out of memory ; CALL DEFILE ; ; Note that DEFILE changes stack pointer ; LD IX,7D20H JP CALBAS ; ; Note that H.CLEA will be called again. ; Make sure that H.CLEA is cleared by 'RET' ;----------------------------------------------------------- ; BOTTOM became greater than 0DFFFH, there is ; no RAM left to be allocated. ; NORMOOM: LD HL,0 CALL WSLW1@ ;Clear slot work JR WORKBEND ;Return 0 in [HL] ENDIF ;IF USEWORKB OR USEWORKH IF USEWORKH ; ; WORKH allocate work area from HIMEM ; (my slot work) <- (new HIMEM) ; Entry HL required memory size ; Return HL start address of my work area = new HIMEM ; 0 if cal not allocate ; Modify None ; Note This routine shoud be called by H.STKE not by INIT. ; LIMHIM EQU 0C400H ; PUBLIC WORKH@ WORKH@: PUSH DE PUSH BC PUSH AF ; EX DE,HL ;[DE} = size LD HL,(HIMEM) ;Get current RAM top XOR A ;Clear carry SBC HL, DE ;[HL] = new HIMEME JR C, NOROOM ;HIMEM < 0 EX DE, HL ;[DE] = new HIMEME LD HL, LIMHIM ;Lower limit of HIMEM XOR A ;Clear carry SBC HL, DE JR NC, NOROOM ;HIMEM < LIMHIM EX DE, HL ;[HL] = new HIMEM CALL WSLW1@ ;Save HIMEM to slot work LD (HIMEM), HL ;Update HIMEM JR WORKBEND ENDIF ;If USEWORKH ; ; DEFILE : re-build file structure ; Original program is in INIT.MAC ; Changed to set workarea at H.CLEA ; MAXFIL = 1 ; String space = 200 ; by nao-i on 3. Feb., 1986 ; ; Entry (HIMEM) New HIMEM ; (STKTOP) To know string space if not STR200 ; (MEMSIZ) To know string space if not STR200 ; (VARTAB) To check free space if CHKOME ; [A] New MAXFIL if not FILMAX1 ; ; Return (MAXFIL) ; (FILTAB) ; (MEMSIZ) ; (STKTOP) ; (NULBUF) ; ; Modify AF, BC, DE, HL, SP ; ; Note This routine changes stack pointer ; ; Constant ; NUMLEV EQU 60 FILLEN EQU 265 FL.BUF EQU 9 ; ; Switch ; MAXFIL1 EQU 1 ;MAXFILE = 1 STR200 EQU 1 ;String space is 200 Byte CHKOME EQU 0 ;Check "Out of memory" ; IF CHKOME EXTRN OMERR ;Entry of "Out of memory" ENDIF ; DEFILE: IFE MAXFIL1 PUSH AF ;Save new MAXFIL ENDIF ;IFE MAXFIL1 LD HL,(HIMEM) IF MSXFIL1 LD DE,65536-FILLEN*2-4 ADD HL,DE ELSE LD DE,65536-FILLEN-2 DEFIL1: ADD HL,DE ;[HL] = (HIMEM) - FILLEN -2 DEC A JP P,DEFIL1 ENDIF ;IF MAXFIL1 EX DE,HL ;DE:=FILTAB IF STR200 ;String space is fixed LD HL,200 ELSE LD BC,(STKTOP) ;Get current string space in BC LD HL,(MEMSIZ) XOR A ;Clear carry SBC HL,BC ;[HL] = (MEMSIZ) - (STKTOP) ENDIF ;IF STR200 IFE MAXFIL1 POP AF ;Restore new MAXFIL ENDIF ;IFE MAXFIL1 PUSH HL ;Save current string space IFE MAXFIL1 PUSH AF ;Save new MSXFIL ENDIF ;IFE MAXFIL IF CHKOME LD BC,2*NUMLEV+20 ADD HL,BC LD B,H LD C,L LD HL,(VARTAB) ;Get end of program ADD HL,BC COMPAR ;Enough breathing room? JP NC,OMERR ;No ENDIF ;IF CHKOME IF MAXFIL1 LD A, 1 ;Make sure MAXFIL = 1 ELSE POP AF ;Restore new MAXFIL ENDIF ;IF MSXFIL1 LD (MAXFIL),A LD L,E LD H,D ;[HL] = [DL] = (HIMEM) - FILLEN -2 LD (FILTAB),HL ;Pointer to first FCB DEC HL DEC HL ;[HL] = (HIMEM) - FILLEN - 4 LD (MEMSIZ),HL POP BC ;Restore current string space XOR A ;Clear carry SBC HL, BC LD (STKTOP),HL ;[HL] = (HIMEM) - FILLEN -4 - <string size> DEC HL DEC HL POP BC ;Get return address LD SP,HL ;Set new temporary stack PUSH BC IF MSXFIL1 LD A, 1 ;[A] = MAXFIL LD HL, 4 ;[HL] = MAXFIL * 2 + 2 ELSE LD A,(MSXFIL) LD L,AINC L LD H,0 ADD HL,HL ;[HL] = (MSXFIL) * 2 + 2 ENDIF ;IF MAXFIL1 ADD HL,DE ;Add FILTAB to get start of FCB's EX DE,HL ;DE=Adress of first FCB PUSH DE ;Address of first FCB (#0) LD BC,FILLEN DSKFLL: LD (HL),E INC HL LD (HL),D INC HL EX DE,HL LD (HL),0 ;Make it look closed ADD HL,BC EX DE,HL DEC A JP P,DSKFLL POP HL ;Restore address of first FCB LD BC,FL,BUF ADD HL,BC ;Get address of buffer for file #0 LD (NULBUF),HL RET END
●カートリッジバス信号線表
ピンNo. | 名 称 | I/O* | ピンNo. | 名 称 | I/O* |
1 | _ CS1 | O | 2 | _ CS2 | O |
3 | __ CS12 | O | 4 | ___ SLTSL | O |
5 | 予備 *1 | - | 6 | ___ RFSH | O |
7 | __ WAIT *2 | I | 8 | __ INT *2 | I |
9 | _ M1 | O | 10 | ___ BUSDIR | I |
11 | __ IORQ | O | 12 | __ MERQ | O |
13 | _ WR | O | 14 | _ RD | O |
15 | ___ RESET | O | 16 | 予備 *1 | - |
17 | A9 | O | 18 | A15 | O |
19 | A11 | O | 20 | A10 | O |
21 | A7 | O | 22 | A6 | O |
23 | A12 | O | 24 | A8 | O |
25 | A14 | O | 26 | A13 | O |
27 | A1 | O | 28 | A0 | O |
29 | A3 | O | 30 | A2 | O |
31 | A5 | O | 32 | A4 | O |
33 | D1 | I/O | 34 | D0 | I/O |
35 | D3 | I/O | 36 | D2 | I/O |
37 | D5 | I/O | 38 | D4 | I/O |
39 | D7 | I/O | 40 | D6 | I/O |
41 | GND | - | 42 | CLOCK | O |
43 | GND | - | 44 | SW1 | - |
45 | +5V | - | 46 | SW2 | - |
47 | +5V | - | 48 | +12V | - |
49 | SUNDIN | I | 50 | -12V | - |
注) 本体を基準にした入出力の区別 *1 予備は使用禁止端子 *2 OPEN COLLECTER 出力
●スロットのタイミングチャート
M1 サイクル 基本スロット |
M1 サイクル 拡張スロット |
メモリサイクル 基本スロット |
メモリサイクル 拡張スロット |
I/O サイクル 基本スロット |
I/O サイクル 拡張スロット |
●拡張スロットセレクト信号作成回路例
●カートリッジ寸法
●コネクター寸法例
修正 |