-
Notifications
You must be signed in to change notification settings - Fork 6
/
MSXDISK.ASM
112 lines (100 loc) · 2.01 KB
/
MSXDISK.ASM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
; LSX-Dodgers DISK
; MSX
; ROM DISK DRIVER
; 1セクタ可変(256/512/1024)
FDRD:
LD (DRDSP),SP
LD A,(DRDSPH) ;スタックがカートリッジと被っていないかチェック
CP 07FH
JR C,FDRD1
CP 0C1H
JR NC,FDRD1
LD A,0 ;BDOS0+13Hが外部から書き換えされても動くようにする
LD SP,SPBUF
FDRD1:
PUSH BC
PUSH DE
PUSH HL
EX DE,HL
LD B,(IX+DPB_BPS)
EADR1:
RR B
JR C,EADR2
ADD HL,HL
JR EADR1
EADR2:
PUSH HL ;あとでDEで受け取る
ADD HL,HL ;64KB→32KB
ADD HL,HL ;32KB→16KB
ASCII16K1:
ADD HL,HL ;16KB→8KB ;ASCII-16Kの場合はここがNOPに置き換えられる
LD A,(IX+DPB_MAXCYL) ;16KB単位でカートリッジ内のディスクが存在する位置を指定
ASCII16K2:
ADD A,A ;ASCII-16Kの場合はここがNOPに置き換えられる
ADD A,H
LD E,A
LD A,(ROM_SLT)
LD HL,BANK2_SEL
ROM8000H EQU $-2
CALL _WRSLT
LD A,(ROM_SLT) ;カートリッジROMに切り替える
CALL ENASLT_80H
POP DE
POP HL ;HLは読み出し先のメモリアドレス
LD A,E
AND 01FH ;セグメントのサイズでフィルタする(8K:1F/16K:3F)
ASCII16K3 EQU $-1
LD E,0 ;DEはROMディスクから読み出すアドレス
ADD A,080H
LD D,A
DB 03EH
AND A
LD (DRD_SWC3),A
LD A,H ;読み出し先がカートリッジと被っていないかチェック
CP 07BH
JR C,DRD2
CP 0C1H
JR NC,DRD2
LD (DRD_SWC1),HL ;被っている場合はデータバッファをフラッシュして一時的に使う
LD HL,(_DTBUF)
DB 03EH
SCF
LD (DRD_SWC3),A
CALL FFLUSHBUF
DRD2:
LD A,(IX+DPB_BPS) ;BCは読み出すセクタサイズ
AND 7
LD B,A
LD C,E ;E=0
EX DE,HL
LDIR
PUSH DE
LD A,(RAMAD2)
CALL ENASLT_80H
DRD_SWC3:
AND A ;自己書き換え)被っている場合はSCFになる
JR NC,DRD3
LD HL,(_DTBUF)
LD DE,0
DRD_SWC1 EQU $-2
LD A,(IX+DPB_BPS) ;BCは読み出すセクタサイズ
AND 7
LD B,A
LD C,0
LDIR
POP HL
PUSH DE
DRD3:
POP HL
POP DE
INC DE
POP BC
DJNZ FDRD1
XOR A
LD SP,0
DRDSP EQU $-2
DRDSPH EQU $-1
EI
RET
FDD_BDOS_JP EQU $-3
FDD_BDOS_ADR EQU $-2