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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
#include "methods.h"
// Global variables.
int speed_2 = 2;
// Defenitions.
// This is the turbo loader in MZF format.
byte program[300] = {
0x01, // Program type.
0x0d, 0x0d, 0x0d, 0x0d, 0x0d, // Room for the
0x0d, 0x0d, 0x0d, 0x0d, 0x0d, // image name.
0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
0x5a, 0x00, // File size.
0x00, 0xd4, // Load adress.
0x00, 0xd4, // Execution adress.
'[', 't', 'u', 'r', 'b', 'o', ']', // The first 7 bytes.
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Room for comment.
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // minus 7 bytes.
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0xcd, 0x00, // End Header.
// Begin Program.
0x3e, 0x08, // D400: LD A, 08h
0xd3, 0xce, // D402: OUT (0ceh), A ; Set video mode?
0xe5, // D404: PUSH HL
0x21, 0x00, 0x00, // D405: LD HL, 0000h
0xd3, 0xe4, // D408: OUT (0e4h), A ; Bank switch to ROM?
0x7e, // D40A: LD A, (HL)
0xd3, 0xe0, // D40B: OUT (0e0h), A ; Bank switch to RAM?
0x77, // D40D: LD (HL), A
0x23, // D40E: INC HL
0x7c, // D40F: LD A, H
0xfe, 0x10, // D410: CP 10h
0x20, 0xf4, // D412: JR NZ, f4h ; Jump 0xf4 forward if A != 0x10
0x3a, 0x4b, 0xd4, // D414: LD A, (d44bh)
0x32, 0x4b, 0x0a, // D417: LD (0a4bh), A ; (0x0a4b) = (0xd44b)
0x3a, 0x4c, 0xd4, // D41A: LD A, (d44ch)
0x32, 0x12, 0x05, // D41D: LD (0512h), A ; (0xd44c) = (0x0512)
0x21, 0x4d, 0xd4, // D420: LD HL, d44dh
0x11, 0x02, 0x11, // D423: LD DE, 1102h
0x01, 0x0d, 0x00, // D426: LD BC, 000dh
0xed, 0xb0, // D429: LDIR ; Copy 0x0d bytes from (HL) to (DE)
0xe1, // D42B: POP HL
0x7c, // D42C: LD A, H
0xfe, 0xd4, // D42D: CP d4h
0x28, 0x12, // D42F: JR Z, 12h ; Jump to label #1 if A == 0xd4
0x2a, 0x04, 0x11, // D431: LD HL, (1104h)
0xd9, // D434: EXX ; BC/DE/HL <-> BC'/DE'/HL'
0x21, 0x00, 0x12, // D435: LD HL, 1200h
0x22, 0x04, 0x11, // D438: LD (1104h), HL
0xcd, 0x2a, 0x00, // D43B: CALL 002ah ; Read data subroutine.
0xd3, 0xe4, // D43E: OUT (0e4h), A ; Bank switch to ROM?
0xc3, 0x9a, 0xe9, // D440: JP e99ah ; Jump to 0xe99a
0xcd, 0x2a, 0x00, // D443: CALL (002ah) ; Label #1 (read data sub).
0xd3, 0xe4, // D446: OUT (0e4h), A ; Bank switch to ROM?
0xc3, 0x24, 0x01, // D448: JP (0124h)
// End program.
0x15, 0x01, // D44B:
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Room for the address information
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // + the first 7 bytes of comment.
};
// Public functions.
// Transfer file the fast way.
void trans(byte *image) {
word cs = 0x0,
fs = getfilesize(image),
i = 0x0;
gap(4000); // Longish gap.
tapemark(40); // Long tapemark.
for (i = 0x0; i < 0x80; i++) // The mzf header.
cs += writebyte(image[i]);
writecs(cs); // The checksum of the mzf header.
gap(5000); // Shortish gap.
tapemark(20); // Short tapemark.
cs = 0x0;
fs += 0x80;
for (i = 0x80; i < fs; i++) // The mzf body.
cs += writebyte(image[i]);
writecs(cs); // The checksum of the mzf body.
}//trans
// Transfer the file the conventional way.
void conv(byte *image) {
word cs = 0x0,
fs = getfilesize(image),
i = 0x0;
gap(22000); // Long gap.
tapemark(40); // Long tapemark.
for (i = 0x0; i < 0x80; i++) // The mzf header.
cs += writebyte(image[i]);
writecs(cs); // The checksum of the mzf header.
gap(256); // 256 short pulses.
for (i = 0x0; i < 0x80; i++) // The copy of the mzf header.
writebyte(image[i]);
writecs(cs); // The copy of the checksum of the mzf header.
gap(11000); // Short gap.
tapemark(20); // Short tapemark.
cs = 0x0;
fs += 0x80;
for (i = 0x80; i < fs; i++) // The mzf body.
cs += writebyte(image[i]);
writecs(cs); // The checksum of the body.
gap(256); // 256 short pulses.
for (i = 0x80; i < fs; i++) // The copy of the mzf body.
writebyte(image[i]);
writecs(cs); // The copy of checksum of the body.
}//conv
// First write a turbo loader, then write the image at high speed.
void turbo(byte *image) {
int j = 0;
for (j = 0x1; j < 0x12; j++) // Copy the name.
program[j] = image[j];
for (j = 0x1f; j < 0x80; j++) // Copy the comment.
program[j] = image[j];
for (j = 0x12; j < 0x1f; j++) // Copy the info.
program[j + 0x3b + 0x80] = image[j];
trans(program);
setspeed(speed_2);
trans(image);
}//turbo
|