Skip to content

Commit 2d461c2

Browse files
committed
Improved handling of internal CCP
1 parent 523a1d0 commit 2d461c2

File tree

5 files changed

+70
-86
lines changed

5 files changed

+70
-86
lines changed

Release/RunCPM.exe

5 KB
Binary file not shown.

RunCPM/RunCPM.ino

+55-62
Original file line numberDiff line numberDiff line change
@@ -72,83 +72,76 @@ int lst_open = FALSE;
7272
#endif
7373

7474
void setup(void) {
75-
pinMode(LED, OUTPUT);
76-
digitalWrite(LED, LOW);
77-
Serial.begin(SERIALSPD);
78-
while (!Serial) { // Wait until serial is connected
79-
digitalWrite(LED, HIGH^LEDinv);
80-
delay(sDELAY);
81-
digitalWrite(LED, LOW^LEDinv);
82-
delay(sDELAY);
83-
}
75+
pinMode(LED, OUTPUT);
76+
digitalWrite(LED, LOW);
77+
Serial.begin(SERIALSPD);
78+
while (!Serial) { // Wait until serial is connected
79+
digitalWrite(LED, HIGH^LEDinv);
80+
delay(sDELAY);
81+
digitalWrite(LED, LOW^LEDinv);
82+
delay(sDELAY);
83+
}
8484

8585
#ifdef DEBUGLOG
86-
_sys_deletefile((uint8 *)LogName);
86+
_sys_deletefile((uint8 *)LogName);
8787
#endif
8888

89-
_clrscr();
90-
_puts("CP/M 2.2 Emulator v" VERSION " by Marcelo Dantas\r\n");
91-
_puts("Arduino read/write support by Krzysztof Klis\r\n");
92-
_puts(" Build " __DATE__ " - " __TIME__ "\r\n");
93-
_puts("--------------------------------------------\r\n");
94-
_puts("CCP: " CCPname " CCP Address: 0x");
95-
_puthex16(CCPaddr);
96-
_puts("\r\nBOARD: ");
89+
_clrscr();
90+
_puts("CP/M 2.2 Emulator v" VERSION " by Marcelo Dantas\r\n");
91+
_puts("Arduino read/write support by Krzysztof Klis\r\n");
92+
_puts(" Build " __DATE__ " - " __TIME__ "\r\n");
93+
_puts("--------------------------------------------\r\n");
94+
_puts("CCP: " CCPname " CCP Address: 0x");
95+
_puthex16(CCPaddr);
96+
_puts("\r\nBOARD: ");
9797
_puts(BOARD);
9898
_puts("\r\n");
9999

100100
_puts("Initializing SD card.\r\n");
101101
if (SD.begin(SDINIT)) {
102-
#ifdef CCP_INTERNAL
103-
while(true)
104-
{
105-
_PatchCPM();
106-
Status = 0;
107-
_ccp();
108-
if (Status == 1)
109-
break;
110-
}
102+
if (VersionCCP >= 0x10 || SD.exists(CCPname)) {
103+
while (true) {
104+
_puts(CCPHEAD);
105+
_PatchCPM();
106+
Status = 0;
107+
#ifndef CCP_INTERNAL
108+
if (!_RamLoad((char *)CCPname, CCPaddr)) {
109+
_puts("Unable to load the CCP.\r\nCPU halted.\r\n");
110+
break;
111+
}
112+
Z80reset();
113+
SET_LOW_REGISTER(BC, _RamRead(0x0004));
114+
PC = CCPaddr;
115+
Z80run();
111116
#else
112-
if (SD.exists(CCPname)) {
113-
while (true) {
114-
_puts(CCPHEAD);
115-
if (_RamLoad((char *)CCPname, CCPaddr)) {
116-
_PatchCPM();
117-
Z80reset();
118-
SET_LOW_REGISTER(BC, _RamRead(0x0004));
119-
PC = CCPaddr;
120-
Z80run();
121-
if (Status == 1)
122-
break;
123-
} else {
124-
_puts("Unable to load the CCP. CPU halted.\r\n");
125-
break;
126-
}
117+
_ccp();
118+
#endif
119+
if (Status == 1)
120+
break;
127121
#ifdef USE_PUN
128-
if (pun_dev)
129-
_sys_fflush(pun_dev);
122+
if (pun_dev)
123+
_sys_fflush(pun_dev);
130124
#endif
131125
#ifdef USE_LST
132-
if (lst_dev)
133-
_sys_fflush(lst_dev);
134-
#endif
135-
}
136-
} else {
137-
_puts("Unable to load CP/M CCP. CPU halted.\r\n");
138-
}
126+
if (lst_dev)
127+
_sys_fflush(lst_dev);
139128
#endif
140-
} else {
141-
_puts("Unable to initialize SD card. CPU halted.\r\n");
142-
}
129+
}
130+
} else {
131+
_puts("Unable to load CP/M CCP.\r\nCPU halted.\r\n");
132+
}
133+
} else {
134+
_puts("Unable to initialize SD card.\r\nCPU halted.\r\n");
135+
}
143136
}
144137

145138
void loop(void) {
146-
digitalWrite(LED, HIGH^LEDinv);
147-
delay(DELAY);
148-
digitalWrite(LED, LOW^LEDinv);
149-
delay(DELAY);
150-
digitalWrite(LED, HIGH^LEDinv);
151-
delay(DELAY);
152-
digitalWrite(LED, LOW^LEDinv);
153-
delay(DELAY * 4);
139+
digitalWrite(LED, HIGH^LEDinv);
140+
delay(DELAY);
141+
digitalWrite(LED, LOW^LEDinv);
142+
delay(DELAY);
143+
digitalWrite(LED, HIGH^LEDinv);
144+
delay(DELAY);
145+
digitalWrite(LED, LOW^LEDinv);
146+
delay(DELAY * 4);
154147
}

RunCPM/ccp.h

-2
Original file line numberDiff line numberDiff line change
@@ -528,8 +528,6 @@ void _ccp(void) {
528528

529529
uint8 i;
530530

531-
_puts(CCPHEAD);
532-
533531
sFlag = (uint8)_ccp_bdos(DRV_ALLRESET, 0x0000);
534532
_ccp_bdos(DRV_SET, curDrive);
535533

RunCPM/globals.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
//
3737
#ifdef CCP_INTERNAL
3838
#define CCPname "INTERNAL v1.5" // Will use the CCP from ccp.h
39-
#define VersionCCP 0x15
39+
#define VersionCCP 0x15 // 0x10 and above reserved for Internal CCP
4040
#define BatchFCB (tmpFCB + 36)
4141
#define CCPaddr (BDOSjmppage-0x0800)
4242
#endif

RunCPM/main.c

+14-21
Original file line numberDiff line numberDiff line change
@@ -75,39 +75,32 @@ int main(int argc, char *argv[]) {
7575
_puts("\r\n");
7676

7777
while (TRUE) {
78-
#ifdef CCP_INTERNAL
79-
_PatchCPM();
78+
_puts(CCPHEAD);
79+
_PatchCPM(); // Patches the CP/M entry points and other things in
8080
Status = 0;
81-
_ccp();
82-
if (Status == 1) // This is set by a call to BIOS 0 - ends CP/M
83-
break;
84-
#else
85-
if(! _sys_exists((uint8*)CCPname)) {
86-
_puts("\r\nCan't open CCP!\r\n");
87-
break;
88-
} else {
89-
//********** Boot code **********//
90-
_puts(CCPHEAD);
81+
if(VersionCCP >= 0x10 || _sys_exists((uint8*)CCPname)) {
82+
#ifndef CCP_INTERNAL
9183
_RamLoad((uint8*)CCPname, CCPaddr); // Loads the CCP binary file into memory
92-
_PatchCPM(); // Patches the CP/M entry points and other things in
93-
94-
9584
Z80reset(); // Resets the Z80 CPU
9685
SET_LOW_REGISTER(BC, _RamRead(0x0004)); // Sets C to the current drive/user
9786
PC = CCPaddr; // Sets CP/M application jump point
9887
Z80run(); // Starts simulation
88+
#else
89+
_ccp();
90+
#endif
9991
if (Status == 1) // This is set by a call to BIOS 0 - ends CP/M
10092
break;
101-
}
102-
#endif
10393
#ifdef USE_PUN
104-
if (pun_dev)
105-
_sys_fflush(pun_dev);
94+
if (pun_dev)
95+
_sys_fflush(pun_dev);
10696
#endif
10797
#ifdef USE_LST
108-
if (lst_dev)
109-
_sys_fflush(lst_dev);
98+
if (lst_dev)
99+
_sys_fflush(lst_dev);
110100
#endif
101+
} else {
102+
_puts("Unable to load CP/M CCP.\r\nCPU halted.\r\n");
103+
}
111104
}
112105

113106
_console_reset();

0 commit comments

Comments
 (0)