/* os.c Revision 2.0 1/1/93 */ /* This software was written by NCR Microelectronics to develop and test new * products. NCR assumes no liability for its use. This software is released * to the public domain to illustrate certain programming techniques for the * 53c700 and 53c800 family. */ #include #include #include "types.h" #include "os.h" #include "commands.h" #include "tools.h" #include "siop.h" /* prototypes */ void init_system(void); void DOS_format(int drive); unsigned char buffer[10 * 512]; /* scratch buffer to read and write from */ unsigned char read_reg(); void write_reg(); extern unsigned int seg, off; extern unsigned int C7XX_SEG; /************************************************************** Starts up the menu that calls each individual routine. **************************************************************/ void os_start() { int i; int j; int drive; int error; int page; uquad block; uword number; char yn; init_system(); while (1) { puts("\ Pick the function you want to call:\n\ \n\ 0 -- Quit\n\ 1 -- Drive_info\n\ 2 -- Read\n\ 3 -- Write\n\ 4 -- Mode sense\n\ 5 -- Request sense\n\ 6 -- Sync neg\n\ 7 -- Format unit\n\ 8 -- Put pattern in buffer\n\ 9 -- Prepare drive for DOS\n\ 10 -- Display all registers\n\ 11 -- Debug test\n\ Enter Choice ->"); if (scanf("%d", &i) == 0) { fflush(stdin); i = -1; } putchar('\n'); switch (i) { case -1: break; case 0: return; case 1: /* drive_info */ puts("Drive #? : "); scanf("%d", &drive); putchar('\n'); error = drive_info(drive, buffer); if (error == 0) { print_buffer(buffer, 36); } else { if (error == 7) { printf("That drive is not connected to the system\n"); } else { printf("Some error occured, # %d\n", error); } } break; case 2: /* read */ printf("Input drive, block, number: "); scanf("%d,%U,%u", &drive, &block, &number); error = d_rw(1, drive, block, number, buffer); if (error == 0) print_buffer(buffer, 512 * number); else printf("error = %d\n", error); break; case 3: /* write */ printf("Input drive, block, number: "); scanf("%d,%U,%u", &drive, &block, &number); error = d_rw(0, drive, block, number, buffer); printf("error = %d\n", error); break; case 4: /* Mode sense */ printf("Input drive, page code, length: "); scanf("%d,%d,%d", &drive, &page, &number); error = d_mode_sense(drive, page, number, buffer); if (error == 0) print_buffer(buffer, number); else printf("error = %d\n", error); break; case 5: /* request sense */ puts("Drive #? : "); scanf("%d", &drive); putchar('\n'); error = request_sense(drive, buffer); print_buffer(buffer, 7); break; case 6: /* sync_neg */ puts("Drive #? : "); scanf("%d", &drive); putchar('\n'); error = sync_neg(drive); printf("error = %d\n", error); break; case 7: /* format */ puts("Drive #? : "); scanf("%d", &drive); putchar('\n'); printf("Are you sure you want to format the drive?\n"); fflush(stdin); yn = getchar(); if (toupper(yn) == 'Y') { printf("format drive #%d\n", drive); error = format_unit(drive); printf("error = %d\n", error); } break; case 8: /* Put pattern in buffer */ for (j = 0; j < 0x100; j++) { buffer[j] = 0xff - j; } break; case 9: /* Prepare drive for DOS */ puts("Drive #? : "); scanf("%d", &drive); putchar('\n'); printf("Are you sure you want to format the drive?\n"); fflush(stdin); yn = getchar(); if (toupper(yn) == 'Y') { DOS_format(drive); } break; case 10: /* Display all registers */ printf("\n Register Display:\n\n"); for (i=0;i<6;i++) { printf("0x%02x: ", i*16); for (j=0;j<4;j++) printf("%02x ", read_reg(16*i+j)); printf(" "); for (j=4;j<8;j++) printf("%02x ", read_reg(16*i+j)); printf(" "); for (j=8;j<12;j++) printf("%02x ", read_reg(16*i+j)); printf(" "); for (j=12;j<16;j++) printf("%02x ", read_reg(16*i+j)); printf("\n"); }; printf("\nHit any key to continue.\n"); getch(); break; case 11: /* Just a debug test */ printf("Testing...\n"); printf("Segment = %04x\n", seg); printf("Offset = %04x\n", off); printf("C7XX_SEG = %04x\n", C7XX_SEG); printf("SCRATCHA0 = %02x\n", read_reg(SCRATCHA)); printf("Writing 5A to ScratchA0\n"); write_reg(SCRATCHA, 0x5A); printf("SCRATCHA0 = %02x\n", read_reg(SCRATCHA)); write_reg(SCRATCHA, 0x00); } } } ubyte boot_area[] = { 0x00, 0x00, 0x00, /* Jump Code */ 'N', 'C', 'R', ' ', 'c', '8', 'X', 'X', 0x00, 0x02, /* 512 bytes per sector */ 0x04, /* 4 sectors per cluster */ 0x01, 0x00, /* 1 reserved sector */ 0x01, /* 1 FAT on disk */ 0x00, 0x02, /* 512 directory entrys */ 0xff, 0xff, /* Total sectors on disk */ 0xf8, /* media descriptor */ 64, /* 64 sectors per FAT */ 0x00, 0x00, /* 0 sectors/track */ 0x00, 0x00, /* 0 heads */ 0x00, 0x00 /* 0 hidden sectors */ }; ubyte Volname[] = { 'D', 'O', 'S', 'R', 'E', 'F', '_', 'D', 'I', 'S', 'K', 0x08 }; /***************************************************************** Do a DOS format command. *****************************************************************/ void DOS_format(int drive) { int i; for (i = 0; i < sizeof(boot_area); i++) { buffer[i] = boot_area[i]; } while (i < 512) { buffer[i++] = 0; } d_rw(0, drive, 0, 1, buffer); buffer[0] = 0xf8; buffer[1] = 0xff; buffer[2] = 0xf8; buffer[3] = 0xff; for (i = 4; i < sizeof(boot_area); i++) { buffer[i] = 0; } d_rw(0, drive, 1, 1, buffer); buffer[0] = buffer[1] = buffer[2] = buffer[3] = 0; for (i = 2; i < 65; i++) { d_rw(0, drive, i, 1, buffer); } for (i = 0; i < sizeof(Volname); i++) { buffer[i] = Volname[i]; } d_rw(0, drive, 65, 1, buffer); for (i = 0; i < sizeof(Volname); i++) { buffer[i] = 0; } for (i = 66; i < 200; i++) { d_rw(0, drive, i, 1, buffer); } }