/* FULL SCREEN DISK SECTOR EDITOR */ /* AUTHOR: RAYMOND L. ZARLING DEPT. COMPUTER SCIENCE CAL STATE UNIV, STANISLAUS TURLOCK, CA 95380 WRITTEN FOR: COMMODORE 64 COMPUTER COMPILER: C-POWER COMPILER V2.4, PRO-LINE SOFTWARE, LTD. DATE: AUGUST, 1985 */ #INCLUDE /* THE FOLLOWING ARE USEFUL FOR CLARITY AND TO CONSERVE VARIABLE SPACE. UNFORTUNATELY, C-POWER 2.4 DOES NOT PERMIT FORMAL PARAMETERS THAT ARE ONE BYTE LONG, SO THESE ARE DECLARED "UNSIGNED" WITH COMMENTS DECLARING THE REAL TYPE. */ #DEFINE ÂÙÔÅ CHAR #DEFINE ÂÏÏÌ CHAR #DEFINE ÖÏÉÄ INT #DEFINE ÔÒÕÅ 1 #DEFINE ÆÁÌÓÅ 0 /* C64 MEMORY LOCATIONS */ #DEFINE ÊÃÌÏÃË (CHAR *)0X00A2 #DEFINE ÔÃÏÌ (CHAR *)0X0286 #DEFINE ÅÎÁÂÌ (CHAR *)0X02A1 #DEFINE ÓÉÄ 0XD400 /* COLORS: */ #DEFINE ÂÁÃËÃÏÌ 12 #DEFINE ÂÏÒÄÃÏÌ 12 #DEFINE ÃÏÍÐÃÏÌ 0 #DEFINE ÕÓÅÒÃÏÌ 1 #DEFINE ÓÅÔÃÏÍÐ *ÔÃÏÌ = ÃÏÍÐÃÏÌ #DEFINE ÓÅÔÕÓÅÒ *ÔÃÏÌ = ÕÓÅÒÃÏÌ /* SPECIAL CHARACTERS */ #DEFINE ÃÌÒÓ 147 #DEFINE ÈÏÍÅ 19 #DEFINE ÌÃ 14 #DEFINE ÃÂ 157 #DEFINE ÃÄ 17 /* FUNCTIONS WHICH RETURN A CHAR LENGTH RESULT MAY NOT BE EXPLICITY DECLARED UNDER C-POWER V2.4: ÖÏÉÄ PRINTV(); CHAR *CVT(); INT EVAL(); ÖÏÉÄ MOD(); ÂÏÏÌ DOPEN(); ÖÏÉÄ DCLOSE(); ÂÙÔÅ DISKERR(); ÖÏÉÄ INSTR1(); ÖÏÉÄ INSTR2(); ÖÏÉÄ DSECT(); ÖÏÉÄ DISPLAY(); ÂÏÏÌ BADTS(); ÂÏÏÌ DEVICE(); ÖÏÉÄ STALL(); ÖÏÉÄ LINEOUT(); CHAR TOASCII(); ÖÏÉÄ TONE(); */ STATIC ÂÙÔÅ TR, SE; STATIC CHAR MODE; STATIC ÂÏÏÌ RS232; STATIC ÆÉÌÅ OUTF; STATIC CHAR IMAGE[41]; STATIC CHAR BACK9[] = Û ÃÂ, ÃÂ, ÃÂ, ÃÂ, ÃÂ, ÃÂ, ÃÂ, ÃÂ, ÃÂ, 0 Ý; STATIC CHAR SECTOR[256]; STATIC CHAR LINE[81]; MAIN() Û STATIC ÂÙÔÅ OFFSET, NEWBAUD; REGISTER CHAR *LP, *BP, CH; REGISTER ÂÏÏÌ UPDATE, MORE; STATIC CHAR BAUD[] = Û 6, 0 Ý; OUTF = STDOUT; RS232 = 0; *(CHAR *)0XD020 = ÂÏÒÄÃÏÌ; *(CHAR *)0XD021 = ÂÁÃËÃÏÌ; PUTCHAR( ÌÃ ); *SECTOR = 18; SECTOR[ 1 ] = 1; MODE = 'Á'; FOR (;;) Û TR = *SECTOR; SE = SECTOR[ 1 ]; IF ( BADTS () ) Û TR = 18; SE = 1; Ý /* ÁSK FOR ÎEXT ÓECTOR TO ÄISPLAY: */ INSTR1(); PRINTF ( "ÔRACK, ÓECTOR, MODE? %02D, %02D, %C%S", TR, SE, MODE, BACK9 ); ÓÅÔÕÓÅÒ; GETS ( LINE ); IF ( FEOF ( STDIN ) ) BREAK; LP = CVT ( LINE, &TR, 10 ); LP = CVT ( LP, &SE, 10 ); WHILE ( *LP ) LP++; CH = (*--LP) ß 0X80; IF ( CH == 'È' ßß CH == 'Á' ) MODE = CH; IF ( BADTS () ) BREAK; /* ÄISPLAY THE ÓECTOR: */ IF ( DOPEN() ) CONTINUE; FPRINTF ( 9, "U1:8 0 %D %D\N", TR, SE ); IF ( DISKERR( "ÒEADING ÄISK" ) ) CONTINUE; PUTCHAR ( ÃÌÒÓ ); OFFSET = 0; BP = SECTOR; DO *BP++ = GETC ( 8 ); WHILE ( ++OFFSET ); DCLOSE (); DISPLAY (); /* ÁSK FOR ÍODIFICATIONS: */ UPDATE = 0; MORE = 1; DO Û PRINTF ( "%C%CX%C", ÈÏÍÅ, ÃÄ, ÃÂ ); ÓÅÔÕÓÅÒ; *LINE = '\0'; GETS ( LINE ); IF ( FEOF ( STDIN ) ) EXIT(); CH = *LINE; SWITCH ( CH ) Û CASE ':': LP = CVT ( LINE, &OFFSET, 16 ); MOD ( LP, OFFSET ); BREAK; CASE 'P': CASE 'Ð': IF ( DEVICE ( 4, "\021" ) ) DSECT (); DEVICE ( 3 ); BREAK; CASE 'R': CASE 'Ò': CVT ( LINE, &NEWBAUD, 10 ); IF (NEWBAUD) *BAUD = NEWBAUD; DEVICE ( 2, BAUD ); DSECT (); DEVICE ( 3 ); BREAK; CASE '-': LP = CVT ( LINE, &TR, 10 ); CVT ( LP, &SE, 10 ); IF ( BADTS () ) ABORT(); BREAK; CASE 'A': CASE 'Á': CASE 'H': CASE 'È': MODE = CH ß 0X80; PUTCHAR ( ÈÏÍÅ ); DISPLAY (); BREAK; CASE 'W': CASE '×': UPDATE = 1; CASE 'X': CASE 'Ø': MORE = 0; BREAK; Ý Ý WHILE ( MORE ); IF ( UPDATE ) Û IF ( DOPEN() ) CONTINUE; FPRINTF ( 9, "B-P:8 0\N" ); OFFSET = 0; BP = SECTOR; DO Û PUTC ( *BP++, 8 ); Ý WHILE ( ++OFFSET ); FPRINTF ( 9, "U2:8 0 %D %D\N", TR, SE ); IF ( DISKERR( "×RITING ÄISK" ) ) CONTINUE; DCLOSE(); Ý Ý /* FOR(;;) */ ÓÅÔÃÏÍÐ; Ý /* END OF MAIN PROGRAM */ ÖÏÉÄ PRINTV ( S, CH ) CHAR *S, CH; /* CONVERT CH TO A STRING AT S, ACCORDING TO CURRENT MODE. */ Û REGISTER CHAR *FMT; IF ( (MODE == 'Á') && ( ISPRINT ( CH ) ßß ISUPPER ( CH ) ) ) FMT = "'%C"; ELSE FMT = "%02X"; SPRINTF ( S, FMT, CH ); Ý CHAR *CVT ( P, V, B ) CHAR *P; ÂÙÔÅ *V, B; /* CONVERT THE NEXT BASE B NUMBER FOUND BEGINNING AT P TO A BYTE AT *V. RETURN ZERO IF NO BASE B NUMBER FOUND. */ Û REGISTER INT D; REGISTER ÂÙÔÅ R; WHILE ( *P && EVAL( *P, B ) < 0 ) P++; R = 0; FOR ( ; *P && (D = EVAL (*P, B)) >= 0; P++ ) R = R * B + D; *V = R; RETURN P; Ý INT EVAL ( CH, B ) UNSIGNED /* CHAR */ CH; ÂÙÔÅ B; /* EVALUATE THE CBMASCII CHAR CH IN THE GIVEN NUMBERING SYSTEM B (<=16). RETURN THE RESULT, OR -1 UPON ERROR. */ Û REGISTER INT RESULT; STATIC CHAR DIGITS[] = "0123456789ABCDEF"; CH = CH & 0X7F; RESULT = B; WHILE ( --RESULT >= 0 ) IF ( DIGITS[ RESULT ] == CH ) BREAK; RETURN RESULT; Ý ÖÏÉÄ LDISP ( OFFSET ) ÂÙÔÅ OFFSET; /* DISPLAY ONE LINE OF THE SECTOR AT THE GIVEN OFFSET ON THE CURRENT DEVICE. */ Û REGISTER ÂÙÔÅ J; REGISTER CHAR *BP, *S; ÓÅÔÃÏÍÐ; BP = SECTOR + OFFSET; SPRINTF ( IMAGE, ":%02X", OFFSET ); S = IMAGE + 3; FOR (J=0; J<16; J++) Û IF ( !(J & 3) ) *S++ = ' '; PRINTV ( S, *BP++ ); S += 2; Ý *S = '\0'; LINEOUT ( IMAGE ); Ý ÖÏÉÄ MOD ( LINE, O ) CHAR *LINE; ÂÙÔÅ O; /* MODIFY A LINE OF DATA AT GIVEN OFFSET INTO THE SECTOR. IF ERROR, DO NO MODIFICATION, AND REDISPLAY ENTIRE SECTOR */ Û REGISTER ÂÙÔÅ I, J, RESULT, STATE, OFFSET; REGISTER CHAR *LP, CH; REGISTER INT E; AUTO CHAR DATA[40]; #DEFINE ÅÒÒÓÔÁÔÅ 0 #DEFINE ÓÔÒÔ 1 #DEFINE ÏÎÅÄÉÇÉÔ 2 #DEFINE ÇÏÔÑÕÏÔÅ 3 OFFSET = O; I = 0; IF ( *LINE ) STATE = ÓÔÒÔ; ELSE STATE = ÅÒÒÓÔÁÔÅ; WHILE ( STATE && (CH = *++LINE) ) Û E = EVAL ( CH, 16 ); SWITCH ( STATE ) Û CASE ÓÔÒÔ: IF ( CH == ' ' ) CONTINUE; IF ( CH == '\'' ) STATE = ÇÏÔÑÕÏÔÅ; ELSE IF ( E >= 0 ) Û RESULT = E; STATE = ÏÎÅÄÉÇÉÔ; Ý ELSE STATE = ÅÒÒÓÔÁÔÅ; BREAK; CASE ÏÎÅÄÉÇÉÔ: STATE = ÓÔÒÔ; IF ( E >= 0 ) DATA[I++] = (RESULT<<4) + E; ELSE STATE = ÅÒÒÓÔÁÔÅ; BREAK; CASE ÇÏÔÑÕÏÔÅ: DATA [I++] = CH; STATE = ÓÔÒÔ; Ý Ý IF ( STATE == ÇÏÔÑÕÏÔÅ ) Û DATA [ I++ ] = ' '; STATE = ÓÔÒÔ; Ý IF ( STATE != ÓÔÒÔ ) Û TONE (); DISPLAY (); Ý ELSE Û FOR ( J=0; J 35 ßß TSIZE[ TR ] < SE ); Ý ÂÏÏÌ DEVICE ( D, S ) UNSIGNED /* ÂÙÔÅ */ D; CHAR *S; /* SWITCH THE CURRENT OUTPUT DEVICE TO DEVICE D ( = 2, 3, OR 4 ). S IS THE STRING TO USE IN OPENING THE DEVICE. USE FILE OUTF AS THE FILE DESCRIPTOR; OUTF=STDOUT ONLY IF D == 3. */ Û WHILE ( *ÅÎÁÂÌ & 3 ); /* WAIT 'TILL 232 DONE */ CLOSE ( 5 ); RS232 = ( D == 2 ); IF ( D == 3 ) OUTF = STDOUT; ELSE IF ( OPEN (5, D, 7, S) ßß D <= 3 ) Û OUTF = 5; RETURN ÔÒÕÅ; Ý ELSE Û DEVICE ( 3 ); ÓÅÔÃÏÍÐ; PRINTF ( "%CÃAN'T ÏPEN ÄEVICE %D\N", ÃÌÒÓ, D ); STALL (); DISPLAY (); RETURN ÆÁÌÓÅ; Ý Ý ÖÏÉÄ STALL () /* WAIT FOR THE USER TO RESPOND */ Û PRINTF ( "ÐRESS ÒÅÔÕÒÎ TO CONTINUE" ); WHILE ( GETCHAR () != '\N'); Ý ÖÏÉÄ LINEOUT ( S ) CHAR *S; /* OUTPUT THE STRING S TO THE CURRENT DEVICE, FOLLOWED BY \N. */ Û REGISTER CHAR C; WHILE ( C = *S++ ) Û IF ( RS232 ) C = TOASCII ( C ); PUTC ( C, OUTF ); Ý PUTC ( '\N', OUTF ); IF ( RS232 ) PUTC ( '\012', OUTF ); Ý CHAR TOASCII ( CH ) CHAR CH; /* CONVERT CH TO TRUE ASCII */ Û IF ( ISUPPER(CH) ) RETURN ( CH & 0X7F ); IF ( ISLOWER(CH) ) RETURN ( CH ß 0X20 ); RETURN CH; Ý ÖÏÉÄ TONE () /* SOUND AN ERROR TONE */ Û ÂÙÔÅ TIME; *(UNSIGNED *)ÓÉÄ = 0X0400; *(UNSIGNED *)(ÓÉÄ + 5) = 0XF00F; *(CHAR *)(ÓÉÄ + 4) = 0X21; *(CHAR *)(ÓÉÄ + 24) = 0X0F; TIME = *ÊÃÌÏÃË + 15; WHILE ( TIME != *ÊÃÌÏÃË ); *(CHAR *)(ÓÉÄ + 4) = 0; Ý