|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24: /*
25: * fx - DiskObject-type Floppy exerciser
26: *
27: * Linked with FloppyDisk and FloppyController objects.
28: *
29: */
30:
31: #import <bsd/dev/FloppyDisk.h>
32: #import <driverkit/return.h>
33: #import <bsd/dev/FloppyTypes.h>
34: #import <bsd/dev/nrw/FloppyCnt.h>
35: #import <architecture/m88k/floppy_channel.h>
36: #import <bsd/sys/types.h>
37: #import <bsd/sys/param.h>
38: #import <bsd/dev/disk.h>
39: #import <bsd/dev/fd_extern.h>
40: #import <driverkit/align.h>
41: #import <driverkit/generalFuncs.h>
42: #import <bsd/libc.h>
43: #import <mach/mach.h>
44: #import "fd_lib.h"
45: #import "buflib.h"
46: #import <mach/mach_error.h>
47: #import <machdep/m88k/xpr.h>
48: #import <driverkit/volCheck.h>
49: #import <mach/cthreads.h>
50:
51: #undef FAKE_HARDWARE
52: #define FAKE_HARDWARE 1
53:
54: void usage(char **argv);
55:
56: #define MAX_IOSIZE 0x40
57:
58: struct menu_entry {
59: char menu_c;
60: char *name;
61: void (*men_fcn)();
62: };
63:
64:
65: void fx_read();
66: void fx_write();
67: void fx_slc();
68: void fx_sbyc();
69: void fx_sbn();
70: void fx_dump_rb();
71: void fx_zwb();
72: void fx_iwb();
73: void fx_compare();
74: void fx_readlp();
75: void print_menu();
76: void fx_eject();
77: void fx_motoroff();
78: void fx_quit();
79: void fx_seek();
80: void fx_readid();
81: void fx_strack();
82: void fx_recal();
83: void fx_setformat();
84: void fx_getformat();
85: void fx_format();
86: void fx_cwb();
87: void fx_sad();
88: void fx_dumpreg();
89: void fx_sboff();
90: int fx_setformatparms();
91: void fx_setretry();
92: void fx_getretry();
93: void fx_sblkccnt();
94:
95: struct menu_entry me_array[] = {
96:
97: {'r', "Read ", fx_read }, {'i', "wbuf = Incrementing", fx_iwb },
98: {'w', "Write ", fx_write }, {'z', "Zero Write Buffer ", fx_zwb },
99: {'L', "Read Loop ", fx_readlp }, {'1', "Set Data = sect # ", fx_sad },
100: {'c', "Set Loop Count ", fx_slc }, {'k', "Set Constant Data ", fx_cwb },
101: {'y', "Set Byte Count ", fx_sbyc }, {'d', "Dump Read Buffer ", fx_dump_rb },
102: {'b', "Set Block Number ", fx_sbn }, {'m', "Compare w/r Buffers", fx_compare },
103: {'t', "Set Track ", fx_strack }, {'S', "Set Format ", fx_setformat },
104: {'B', "Set Block Count ", fx_sblkccnt }, {'g', "Get Format ", fx_getformat },
105: {'C', "Recalibrate ", fx_recal }, {'F', "Format Track ", fx_format },
106: {'o', "Motor Off ", fx_motoroff }, {'R', "Read ID ", fx_readid },
107: {'e', "Eject Disk ", fx_eject }, {'D', "Dump Registers ", fx_dumpreg },
108: {'f', "Set Buffer Offset ", fx_sboff }, {'2', "Get Retry Counts ", fx_getretry },
109: {'s', "Seek ", fx_seek }, {'3', "Set Retry Counts ", fx_setretry },
110: {'x', "Exit Program ", fx_quit }, {'h', "Print This menu ", print_menu },
111: {0, NULL, NULL },
112:
113: }; /* me_array */
114:
115: #define SIZEOF_REGS 10
116:
117: #define SECTSIZE_DEF 512
118: #define BUFSIZE 0x8000
119:
120: id fd;
121: u_char *wbuffer;
122: u_char *rbuffer;
123: u_char *wbuf;
124: u_char *rbuf;
125: int rtn;
126: int loop_count=1;
127: int byte_count=SECTSIZE_DEF;
128: int block_count = 1;
129: int block_num=0;
130: int loop_count;
131: int track;
132: struct fd_format_info format_info;
133: boolean_t use_rawio=TRUE;
134: int lblocksize; /* logical block size */
135: u_int fmt_gap_length = -1;
136: port_name_t ownerPort;
137:
138: int main(int argc, char *argv[]) {
139:
140: char c[80];
141: struct menu_entry *mep;
142: char ok, ch;
143: int arg;
144: id cntrlId;
145: port_name_t dev_port;
146: kern_return_t krtn;
147:
148: for(arg=1; arg<argc; arg++) {
149: ch = argv[arg][0];
150: switch(ch) {
151: default:
152: ASSERT(0);
153: usage(argv);
154: }
155: }
156:
157: /*
158: * Init libraries.
159: */
160: #ifdef DDM_DEBUG
161: IOInitDDM(1000, "FloppyXpr");
162: /*
163: * Maybe pass this in in argv...
164: */
165: IOSetDDMMask(XPR_IODEVICE_INDEX,
166: XPR_FDD | XPR_FC | XPR_DEVICE | XPR_DISK | XPR_ERR |
167: XPR_VC | XPR_NDMA);
168: #endif DDM_DEBUG
169: IOInitGeneralFuncs();
170: volCheckInit();
171:
172: krtn = port_allocate(task_self(), &dev_port);
173: if(krtn) {
174: mach_error("port_allocate", krtn);
175: exit(1);
176: }
177: cntrlId = [FloppyController probe:0 deviceMaster:PORT_NULL];
178: if(cntrlId == nil) {
179: printf("FloppyController probe: returned nil; exiting\n");
180: exit(1);
181: }
182: fd = [FloppyDisk probe:cntrlId sender:nil];
183: if(cntrlId == nil) {
184: printf("FloppyDisk probe: returned nil; exiting\n");
185: exit(1);
186: }
187:
188: /*
189: * Set up for well-aligned transfers
190: */
191: wbuffer = malloc(BUFSIZE + 2 * FLOPPY_BUFSIZE);
192: rbuffer = malloc(BUFSIZE + 2 * FLOPPY_BUFSIZE);
193: wbuf = IOAlign(u_char *, wbuffer, FLOPPY_BUFSIZE);
194: rbuf = IOAlign(u_char *, rbuffer, FLOPPY_BUFSIZE);
195:
196: /*
197: * get the physical block size
198: */
199: fx_setformatparms();
200: print_menu();
201: while(1) {
202: printf("Enter Selection: ");
203: gets(c);
204: mep = me_array;
205: ok = 0;
206: while(mep->menu_c) {
207: if(mep->menu_c == c[0]) {
208: ok = 1;
209: (*mep->men_fcn)();
210: break;
211: }
212: else
213: mep++;
214: }
215: if(!ok)
216: printf("***Illegal Selection\n");
217: }
218:
219: } /* main() */
220:
221: void usage(char **argv) {
222: printf("usage: %s\n", argv[0]);
223: exit(1);
224: }
225:
226: void print_menu() {
227:
228: struct menu_entry *mep;
229:
230: printf("\n");
231: mep = me_array;
232: while(mep->menu_c) {
233: printf(" %c: %s ",mep->menu_c,mep->name);
234: mep++;
235: if(mep->menu_c) {
236: printf(" %c: %s\n",mep->menu_c,mep->name);
237: mep++;
238: }
239: else
240: printf("\n\n");
241: }
242:
243: } /* print_menu() */
244:
245:
246: void fx_read() {
247:
248: fd_rw(fd,
249: block_num,
250: byte_count / lblocksize,
251: rbuf,
252: TRUE, /* read */
253: lblocksize,
254: FALSE); /* io_trace */
255: }
256:
257: void fx_readlp() {
258:
259: /*
260: * read block block_num, length = 1 sector, for loop_count loops
261: */
262: int loop;
263:
264: for(loop=0; loop<loop_count; loop++) {
265: if(fd_rw(fd,
266: block_num,
267: byte_count / lblocksize,
268: rbuf,
269: TRUE, /* read */
270: lblocksize,
271: FALSE)) /* io_trace */
272: return;
273: }
274: return;
275: }
276:
277: void fx_write() {
278:
279: fd_rw(fd,
280: block_num,
281: byte_count / lblocksize,
282: wbuf,
283: FALSE, /* read */
284: lblocksize,
285: FALSE); /* io_trace */
286: }
287:
288:
289: void fx_seek() {
290: int rtn;
291: int density;
292:
293: if(format_info.density_info.density == FD_DENS_NONE)
294: density = FD_DENS_4;
295: else
296: density = format_info.density_info.density;
297: rtn = seek_com(fd, track, &format_info, TRUE, density);
298: if(rtn == FDR_SUCCESS)
299: printf("...OK\n");
300: return;
301: }
302:
303: void fx_readid() {
304: struct fd_ioreq ioreq;
305: struct fd_readid_cmd *cmdp = (struct fd_readid_cmd *)ioreq.cmd_blk;
306: struct fd_rw_stat *statp = (struct fd_rw_stat *)ioreq.stat_blk;
307: int density;
308:
309: if(format_info.density_info.density == FD_DENS_NONE)
310: density = FD_DENS_4;
311: else
312: density = format_info.density_info.density;
313:
314: bzero(&ioreq, sizeof(struct fd_ioreq));
315: cmdp->opcode = FCCMD_READID;
316: cmdp->mfm = 1;
317: cmdp->hds = track & 1; /* lsb of track */
318:
319: ioreq.timeout = 2000;
320: ioreq.density = density;
321: ioreq.command = FDCMD_CMD_XFR;
322: ioreq.num_cmd_bytes = sizeof(struct fd_readid_cmd);
323: ioreq.num_stat_bytes = SIZEOF_RW_STAT; /* expect a fd_rw_stat */
324: if(do_ioc(fd, &ioreq, TRUE))
325: return;
326: printf("\tcyl = %d(d)\n", statp->cylinder);
327: printf("\thead = %d(d)\n", statp->head);
328: printf("\tsector = %d(d)\n", statp->sector);
329: return;
330: }
331:
332: void fx_recal() {
333: struct fd_ioreq ioreq;
334: struct fd_seek_cmd *cmdp = (struct fd_seek_cmd *)ioreq.cmd_blk;
335: int rtn;
336: int density;
337:
338: if(format_info.density_info.density == FD_DENS_NONE)
339: density = FD_DENS_4;
340: else
341: density = format_info.density_info.density;
342: bzero(&ioreq, sizeof(struct fd_ioreq));
343: cmdp->opcode = FCCMD_RECAL;
344: ioreq.density = density;
345: ioreq.timeout = 2000;
346: ioreq.command = FDCMD_CMD_XFR;
347: ioreq.num_cmd_bytes = sizeof(struct fd_recal_cmd);
348: ioreq.addrs = 0;
349: ioreq.byte_count = 0;
350: ioreq.num_stat_bytes = sizeof(struct fd_int_stat);
351: rtn = do_ioc(fd, &ioreq, TRUE);
352: if(rtn == FDR_SUCCESS)
353: printf("...OK\n");
354: return;
355: }
356:
357:
358: void fx_slc() {
359:
360: while(1) {
361: printf("Enter loop count (CR = %d(d)): ", loop_count);
362: loop_count = get_num(loop_count, DEC);
363: if(loop_count < 1)
364: printf("Loop Count must be > 0\n");
365: else
366: return;
367: }
368: }
369:
370: void fx_sbyc() {
371:
372: int sectsize;
373:
374: printf("Enter byte count (CR = 0x%x): ",byte_count);
375: byte_count = get_num(byte_count, HEX);
376: sectsize = format_info.sectsize_info.sect_size;
377: if(sectsize == 0)
378: sectsize = 512;
379: block_count = byte_count / format_info.sectsize_info.sect_size;
380: }
381:
382: void fx_sbn() {
383:
384: printf("Enter block number (CR = %d(d)): ",block_num);
385: block_num = get_num(block_num, DEC);
386: }
387:
388: void fx_sblkccnt()
389: {
390: int sectsize;
391:
392: printf("Enter Block count (CR = 0x%x): ", block_count);
393: block_count = get_num(byte_count, HEX);
394: sectsize = format_info.sectsize_info.sect_size;
395: if(sectsize == 0)
396: sectsize = 512;
397: byte_count = sectsize * block_count;
398:
399: }
400:
401: void fx_sboff() {
402: char instr[80];
403: int offset;
404:
405: while(1) {
406: printf("Enter new offset (0..15): ");
407: gets(instr);
408: offset = atoi(instr);
409: if((offset < 0) || (offset > 15))
410: printf("try again.\n");
411: else
412: break;
413: }
414: rbuf = IOAlign(u_char *, rbuffer, FLOPPY_BUFSIZE) + offset;
415: wbuf = IOAlign(u_char *, wbuffer, FLOPPY_BUFSIZE) + offset;
416: printf("...rbuf = 0x%x wbuf = 0x%x\n", rbuf, wbuf);
417:
418: }
419: void fx_strack() {
420: printf("Enter track (CR = %d(d)): ",track);
421: track = get_num(track, DEC);
422: }
423:
424: void fx_setretry() {
425: int retry;
426: IOReturn rtn;
427:
428: retry = [fd innerRetry];
429: printf("Inner Retry Count: (CR=%d(d)): ", retry);
430: retry = get_num(retry, DEC);
431: rtn = [fd fdSetInnerRetry:retry];
432: if(rtn) {
433: pr_iortn_text(fd, "setInnerRetry", rtn);
434: return;
435: }
436:
437: retry = [fd outerRetry];
438: printf("Outer Retry Count: (CR=%d(d)): ", retry);
439: retry = get_num(retry, DEC);
440: rtn = [fd fdSetOuterRetry:retry];
441: if(rtn) {
442: pr_iortn_text(fd, "setOuterRetry", rtn);
443: return;
444: }
445: return;
446: }
447:
448: void fx_getretry() {
449: int retry;
450:
451: retry = [fd innerRetry];
452: printf("Inner Retry Count: %d\n", retry);
453: retry = [fd outerRetry];
454: printf("Outer Retry Count: %d\n", retry);
455: return;
456: }
457:
458: void dump_format_info(struct fd_format_info *fip)
459: {
460: printf("\tmedia_id %d\n", fip->disk_info.media_id);
461: printf("\tdensity %d\n", fip->density_info.density);
462: printf("\tformatted ");
463: if(fip->flags & FFI_FORMATTED)
464: printf("TRUE\n");
465: else
466: printf("FALSE\n");
467: printf("\tlabel valid ");
468: if(fip->flags & FFI_LABELVALID)
469: printf("TRUE\n");
470: else
471: printf("FALSE\n");
472: printf("\twrite protect ");
473: if(fip->flags & FFI_WRITEPROTECT)
474: printf("TRUE\n");
475: else
476: printf("FALSE\n");
477: printf("\tsect_size %xH\n", fip->sectsize_info.sect_size);
478: printf("\tsects_per_trk %d(d)\n", fip->sectsize_info.sects_per_trk);
479: printf("\ttracks_per_cyl %d(d)\n", fip->disk_info.tracks_per_cyl);
480: printf("\tnum_cylinders %d(d)\n", fip->disk_info.num_cylinders);
481: printf("\ttotal_sects %d(d)\n", fip->total_sects);
482: printf("\tmfm ");
483: if(fip->density_info.mfm)
484: printf("TRUE\n");
485: else
486: printf("FALSE\n");
487: printf("\trw gap length %d(d)\n",
488: fip->sectsize_info.rw_gap_length);
489: printf("\tfmt gap length %d(d)\n",
490: fip->sectsize_info.fmt_gap_length);
491: }
492:
493: void fx_getformat() {
494:
495: IOReturn rtn;
496:
497: rtn = [fd fdGetFormatInfo:&format_info];
498: if(rtn) {
499: pr_iortn_text(fd, "getFormatInfo", rtn);
500: return;
501: }
502: printf("\nFormat information:\n");
503: dump_format_info(&format_info);
504: printf("\n");
505: }
506:
507: void fx_setformat() {
508:
509: char instr[80];
510: struct fd_format_info *fip = &format_info;
511: struct fd_density_info *dip = &fip->density_info;
512: IOReturn rtn;
513:
514: /*
515: * allow user to set density, sector size, gap length. We assume
516: * that out format_info has been obtained from the driver.
517: */
518: printf("Enter density (CR = %d(d)): ", dip->density);
519: dip->density = get_num(dip->density, DEC);
520: printf("Enter sect_size (CR = %d(d)): ", fip->sectsize_info.sect_size);
521: fip->sectsize_info.sect_size =
522: get_num(fip->sectsize_info.sect_size, DEC);
523:
524: /*
525: * Since the gap default gap lengths are really a function
526: * of both the density and the sector size, it's impossible
527: * to print out what the default is until both the density
528: * and sector size have been set. So rather than print a
529: * value for the default, this just says "DEFAULT" and prints
530: * the new gap values after the density and sector size have
531: * been set.
532: */
533: printf("Enter rw gap3 length (CR = %d(d)): ",
534: fip->sectsize_info.rw_gap_length);
535: fip->sectsize_info.rw_gap_length =
536: get_num(fip->sectsize_info.rw_gap_length, DEC);
537: printf("Enter fmt gap3 length (CR = DEFAULT): ");
538: fmt_gap_length = get_num(fmt_gap_length, DEC);
539: printf("\n...Send To Driver (y/anything)? ");
540: gets(instr);
541: if(instr[0] != 'y') {
542: return;
543: }
544: rtn = [fd fdSetDensity:dip->density];
545: if(rtn) {
546: pr_iortn_text(fd, "fdSetDensity", rtn);
547: return;
548: }
549: rtn = [fd fdSetSectSize:fip->sectsize_info.sect_size];
550: if(rtn) {
551: pr_iortn_text(fd, "fdSetSectSize", rtn);
552: return;
553: }
554: rtn = [fd fdSetGapLength:fip->sectsize_info.rw_gap_length];
555: if(rtn) {
556: pr_iortn_text(fd, "fdSetGapLength", rtn);
557: return;
558: }
559:
560: /*
561: * Now get remainder of physical parameters from driver.
562: */
563: if(fx_setformatparms() == 0) {
564: printf("...Format Parameters Stored by Driver\n");
565: printf("Rw gap length = %d(d)\n",
566: format_info.sectsize_info.rw_gap_length);
567: printf("Fmt gap length = %d(d)\n", fmt_gap_length);
568: return;
569: }
570: }
571:
572: void fx_format() {
573: struct format_data *fdp, *fdp_align;
574: int sector;
575: struct fd_ioreq ioreq;
576: struct fd_format_cmd *cmdp = (struct fd_format_cmd *)ioreq.cmd_blk;
577: int data_size;
578: int rtn=0;
579: int fmt_cyl;
580: int fmt_head;
581:
582: data_size = sizeof(struct format_data) *
583: format_info.sectsize_info.sects_per_trk;
584: fdp = malloc(data_size + (2 * FLOPPY_BUFSIZE));
585: if(fdp == 0) {
586: printf("Couldn't malloc memory for format data\n");
587: return;
588: }
589: fdp_align = IOAlign(struct format_data *, fdp, FLOPPY_BUFSIZE);
590: fmt_cyl = track / format_info.disk_info.tracks_per_cyl;
591: fmt_head = track % format_info.disk_info.tracks_per_cyl;
592: for(sector = 1;
593: sector <= format_info.sectsize_info.sects_per_trk;
594: sector++) {
595: fdp_align->cylinder = fmt_cyl;
596: fdp_align->head = fmt_head;
597: fdp_align->sector = sector;
598: fdp_align->n = format_info.sectsize_info.n;
599: fdp_align++;
600: }
601: if(seek_com(fd, track, &format_info, TRUE,
602: format_info.density_info.density)) {
603: printf("Seek Failed\n");
604: free(fdp);
605: return;
606: }
607: usleep(20000); /* head settling time - 20 ms */
608:
609: /*
610: * Build a format command
611: */
612: bzero(&ioreq, sizeof (struct fd_ioreq));
613:
614: ioreq.density = format_info.density_info.density;
615: ioreq.timeout = 5000;
616: ioreq.command = FDCMD_CMD_XFR;
617: ioreq.num_cmd_bytes = sizeof(struct fd_format_cmd);
618: ioreq.addrs = (caddr_t)fdp_align;
619:
620: /*
621: * Note we can't do a DMA write using the actual byte count we want.
622: * Even worse, we won't really know how many bytes moved! Hardware
623: * feature...
624: */
625: ioreq.byte_count = IOAlign(int, data_size, FLOPPY_BUFSIZE);
626: ioreq.num_stat_bytes = SIZEOF_RW_STAT;
627: ioreq.flags = FD_IOF_DMA_WR;
628:
629: cmdp->mfm = format_info.density_info.mfm;
630: cmdp->opcode =FCCMD_FORMAT;
631: cmdp->hds = fmt_head;
632: cmdp->n = format_info.sectsize_info.n;
633: cmdp->sects_per_trk = format_info.sectsize_info.sects_per_trk;
634: cmdp->gap_length = fmt_gap_length;
635: cmdp->filler_data = 0x5a;
636: rtn = do_ioc(fd, &ioreq, TRUE);
637: free(fdp);
638: if(rtn == FDR_SUCCESS)
639: printf("...OK\n");
640: }
641:
642: void fx_dumpreg() {
643: struct fd_ioreq ioreq;
644: int rtn;
645: int i;
646: struct fd_82077_regs *regptr = (struct fd_82077_regs *)ioreq.stat_blk;
647: int density;
648:
649: if(format_info.density_info.density == FD_DENS_NONE)
650: density = FD_DENS_4;
651: else
652: density = format_info.density_info.density;
653: bzero(&ioreq, sizeof(struct fd_ioreq));
654: ioreq.cmd_blk[0] = FCCMD_DUMPREG;
655: ioreq.density = density;
656: ioreq.timeout = 2000;
657: ioreq.command = FDCMD_CMD_XFR;
658: ioreq.num_cmd_bytes = 1;
659: ioreq.addrs = 0;
660: ioreq.byte_count = 0;
661: ioreq.num_stat_bytes = SIZEOF_REGS;
662: rtn = do_ioc(fd, &ioreq, TRUE);
663: if(rtn != FDR_SUCCESS)
664: return;
665: /*
666: * Print registers
667: */
668: printf("82077 Register Dump (all base 10):\n");
669: for(i=0; i<4; i++)
670: printf(" pcn%d : %d\n", i, regptr->pcn[i]);
671: printf(" srt : %d\n", regptr->srt);
672: printf(" hut : %d\n", regptr->hut);
673: printf(" hlt : %d\n", regptr->hlt);
674: printf(" nd : %d\n", regptr->nd);
675: printf(" sc_eot : %d\n", regptr->sc_eot);
676: printf(" eis : %d\n", regptr->eis);
677: printf(" efifo : %d\n", regptr->efifo);
678: printf(" poll : %d\n", regptr->poll);
679: printf(" fifothr: %d\n", regptr->fifothr);
680: printf(" pretrk : %d\n", regptr->pretrk);
681: printf("\n");
682: }
683: void fx_dump_rb() {
684: printf("Read Buffer:");
685: dump_buf(rbuf, BUFSIZE);
686: }
687:
688:
689: void fx_zwb() {
690:
691: register int i;
692: register unsigned char *p;
693:
694: p = wbuf;
695: for(i=0; i<BUFSIZE; i++)
696: *p++ = 0;
697: printf("...OK\n");
698: }
699:
700: void fx_cwb() {
701:
702: register int i;
703: register int *p;
704: int dp=0;
705:
706: printf("Enter data pattern (CR=0x0): ");
707: dp = get_num(0, HEX);
708: p = (int *)wbuf;
709: for(i=0; i<BUFSIZE/4; i++)
710: *p++ = dp;
711: }
712:
713: void fx_sad() {
714:
715: register int i;
716: register int *p;
717: int sect_num=0;
718: int word_win_sect=0;
719: int words_per_sect = format_info.sectsize_info.sect_size / 4;
720:
721: printf("Enter starting sector # (CR=0x0): ");
722: sect_num = get_num(0, HEX);
723: p = (int *)wbuf;
724: for(i=0; i<BUFSIZE/4; i++) {
725: *p++ = sect_num;
726: if(++word_win_sect == words_per_sect) {
727: sect_num++;
728: word_win_sect = 0;
729: }
730: }
731: }
732:
733:
734: void fx_iwb() {
735:
736: register int i;
737: register unsigned char *p;
738:
739: p = wbuf;
740: for(i=0; i<BUFSIZE; i++)
741: *p++ = (char)(i & 0xFF);
742: printf("...OK\n");
743: }
744:
745: void fx_compare() {
746: buf_comp(byte_count, wbuf, rbuf);
747: }
748:
749: void fx_eject()
750: {
751: IOReturn rtn;
752:
753: rtn = [fd ejectPhysical];
754: if(rtn)
755: pr_iortn_text(fd, "ejectPhysical", rtn);
756: else
757: printf("...OK\n");
758: return;
759: }
760:
761: void fx_motoroff() {
762:
763: struct fd_ioreq ioreq;
764: int density;
765:
766: if(format_info.density_info.density == FD_DENS_NONE)
767: density = FD_DENS_4;
768: else
769: density = format_info.density_info.density;
770: bzero(&ioreq, sizeof (struct fd_ioreq));
771: ioreq.density = density;
772: ioreq.timeout = 1000;
773: ioreq.command = FDCMD_MOTOR_OFF;
774: ioreq.byte_count = 0;
775: if(!do_ioc(fd, &ioreq, FALSE))
776: printf("...OK\n");
777: return;
778: }
779:
780: void fx_quit() {
781: #ifdef notdef
782: if (close(fd) < 0) {
783: perror("close");
784: exit(1);
785: }
786: #endif notdef
787: exit(0);
788: }
789:
790: int fx_setformatparms() {
791:
792: IOReturn rtn;
793:
794: rtn = [fd fdGetFormatInfo:&format_info];
795: if(rtn) {
796: pr_iortn_text(fd, "fdGetFormatInfo", rtn);
797: return(1);
798: }
799: lblocksize = format_info.sectsize_info.sect_size;
800: byte_count = lblocksize;
801: fmt_gap_length = format_info.sectsize_info.fmt_gap_length;
802: return(0);
803: }
804:
805: /* end of fx.m */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.