goto isn't working and is commented out.
exit() gives a screwy warning
return(0) isn't working
I've never seen these problems in a C compiler before. Any thoughts?
Code: Select all
/* FORMAT.C */
/* Written by Brian E. Reifsnyder */
/* Usage: FORMAT <drive letter> */
/*
Use Z88dk to compile.
Compile with: zcc +cpm format.c -create-app -mz80
Output file as A.OUT
*/
#include <cpm.h>
//#include <stdio.h>
#define BIOS 0xFA00
#define CONOUT 0xFA0C
#define SELDSK 0xFA1B
#define SETTRK 0xFA1E
#define SETSEC 0xFA21
#define SETDMA 0xFA24
#define WRITE 0xFA2A
#define IOSTRUCTUREADDR 0xFF80
#define SVTMAXDISKADDR 0xFFA0
unsigned char *io = (unsigned char *)IOSTRUCTUREADDR;
unsigned char *io_disk = (unsigned char *)IOSTRUCTUREADDR+0x03;
unsigned char *io_track = (unsigned char *)IOSTRUCTUREADDR+0x04;
unsigned char *io_sector = (unsigned char *)IOSTRUCTUREADDR+0x06;
unsigned char *io_dma = (unsigned char *)IOSTRUCTUREADDR+0x08;
unsigned char *svt_max_disk = (unsigned char *)SVTMAXDISKADDR;
void printb_asm(unsigned char byte)
{
#asm
ld hl,2
add hl,sp ; skip over return address on stack
ld c,(hl) ; c = byte
call CONOUT
#endasm
}
// Print via CP/M BIOS
// strOutput must end with \n or the length will default to 80 characters.
// \r is carriage return for a new line
unsigned int printb(const char * StrOutput)
{
//unsigned char CharOutput[1];
// Print the string
unsigned int i = 0;
while(i < 80)
{
if(StrOutput[i] == "\n") break;
printb_asm(StrOutput[i]);
i++;
}
return(0);
}
// Write to disk
unsigned int writeb(unsigned char drive[1], unsigned char track[2], unsigned char sector[2], unsigned char * write_sector_buffer)
{
unsigned int i;
io_disk[0]=drive[0];
io_track[0]=track[0];
io_track[1]=track[1];
io_sector[0]=sector[0];
io_sector[1]=sector[1];
io_dma = &write_sector_buffer[0];
#asm
call WRITE
#endasm
return(0);
}
int main(int argc, char *argv[])
{
unsigned char bPreviousDrive[1];
unsigned char sector_buffer[128];
// Ensure valid input
if(argc !=2)
{
// Exit if number of arguments is wrong.
printb("Usage: format <drive letter>\r\r");
return (1);
//exit(1);
//goto end_program;
}
if(argv[1][0] >= 0x61) argv[1] [0] = argv[1] [0] - 0x20; // Assuming lower case characters, convert lower case to upper case
argv[1][0] = argv[1][0] - 0x61; // convert to zero-based number
if(argv[1][0] > svt_max_disk[0])
{
// Exit if disk number is invalid.
printb("Invalid drive letter.\r\r");
return(1);
//goto end_program;
//exit(1);
}
// DEBUG CODE
printb("DEBUG AB\r\n");
return(0);
//printb("DEBUG END 123\r");
//goto end_program;
//exit(2);
// Store previous drive letter
bPreviousDrive[0] = io_disk[0];
// Set drive + 128 to instruct AtarioIO to format this disk.
argv[1][0] = argv[1][0] + 128; // Add bit 7 to the disk number
// Format the disk
printb("Formatting disk\r");
writeb(argv[1][0],0,0,sector_buffer[0]); // Note: sector_buffer is undefined....but not used to format.
// Load sector buffer with 0xe5
argv[1][0] = argv[1][0] - 128; // Remove bit 7 from the disk number
unsigned int i = 0;
while(i < 128)
{
sector_buffer[i] = 0xe5;
i++;
}
// Write directory sectors with 0xe5
// Directory sectors are located at Track/Sector 3/1 - 3/16
printb("Writing directory\r\n");
i=1;
while(i<=16)
{
writeb(argv[1][0],3,i,sector_buffer[0]);
i++;
}
// Restore previous drive letter
io_disk[0] = bPreviousDrive[0];
printb("Format Complete\r\r");
//end_program:
//return(0);
//exit(0);
}