81 lines
3.1 KiB
Text
81 lines
3.1 KiB
Text
100H: /* DRAW SOME CUBOIDS USING ASCII ART */
|
|
|
|
/* CP/M BDOS SYSTEM CALL AND I/O ROUTINES */
|
|
BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END;
|
|
PR$CHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END;
|
|
PR$NL: PROCEDURE; CALL PR$CHAR( 0DH ); CALL PR$CHAR( 0AH ); END;
|
|
|
|
/* TASK */
|
|
|
|
/* DRAWS A CUBOID STANDING ON ONE EDGE USING ASCII ART */
|
|
DRAW$CUBOID: PROCEDURE( H, W, L );
|
|
DECLARE ( H, W, L ) BYTE;
|
|
DECLARE ( I, J, FACE$WIDTH, EDGE$POS ) BYTE;
|
|
|
|
BACKSLASH: PROCEDURE; CALL PR$CHAR( 92 ); END; /* PRINTS A BACKSLASH */
|
|
REPEAT$CHAR: PROCEDURE( CH, COUNT ); /* PRINTS CH COUNT TIMES */
|
|
DECLARE ( CH, COUNT ) BYTE;
|
|
DECLARE I BYTE;
|
|
IF COUNT > 0 THEN DO;
|
|
DO I = 1 TO COUNT; CALL PR$CHAR( CH ); END;
|
|
END;
|
|
END REPEAT$CHAR;
|
|
UNDERSCORES: PROCEDURE( COUNT ); /* PRINTS COUNT UNDERSCORES */
|
|
DECLARE COUNT BYTE;
|
|
CALL REPEAT$CHAR( 95, COUNT );
|
|
END UNDERSCORES;
|
|
|
|
/* TOP LINE */
|
|
CALL REPEAT$CHAR( ' ', L ); CALL UNDERSCORES( W + 1 ); CALL PR$NL;
|
|
/* REST OF THE TOP FACE AND PART OF THE VISIBLE SIDE */
|
|
FACE$WIDTH = 0;
|
|
EDGE$POS = 0;
|
|
DO I = 1 TO L;
|
|
CALL REPEAT$CHAR( ' ', L - I );
|
|
CALL PR$CHAR( '/' );
|
|
IF I = L THEN CALL UNDERSCORES( W );
|
|
ELSE CALL REPEAT$CHAR( ' ', W );
|
|
CALL PR$CHAR( '/' );
|
|
EDGE$POS = EDGE$POS + 1;
|
|
IF EDGE$POS <= H THEN DO;
|
|
/* DRAW THE BACK EDGE */
|
|
FACE$WIDTH = 2 * ( EDGE$POS - 1 );
|
|
CALL REPEAT$CHAR( ' ', FACE$WIDTH );
|
|
CALL BACKSLASH;
|
|
END;
|
|
ELSE DO;
|
|
/* DRAW THE BOTTOM EDGE AND THE MORE OF THE VISIBLE SIDE */
|
|
CALL REPEAT$CHAR( ' ', FACE$WIDTH + 1 );
|
|
CALL PR$CHAR( '/' );
|
|
END;
|
|
CALL PR$NL;
|
|
END;
|
|
/* OTHER VISIBLE FACE */
|
|
DO I = 1 TO H;
|
|
CALL REPEAT$CHAR( ' ', I - 1 );
|
|
CALL BACKSLASH;
|
|
IF I = H THEN CALL UNDERSCORES( W );
|
|
ELSE CALL REPEAT$CHAR( ' ', W );
|
|
CALL BACKSLASH;
|
|
EDGE$POS = EDGE$POS + 1;
|
|
IF EDGE$POS <= H THEN DO;
|
|
/* DRAW THE BACK EDGE */
|
|
CALL REPEAT$CHAR( ' ', FACE$WIDTH + 1 );
|
|
CALL BACKSLASH;
|
|
END;
|
|
ELSE DO;
|
|
/* DRAW THE BOTTOM EDGE */
|
|
CALL REPEAT$CHAR( ' ', FACE$WIDTH );
|
|
FACE$WIDTH = FACE$WIDTH - 2;
|
|
CALL PR$CHAR( '/' );
|
|
END;
|
|
CALL PR$NL;
|
|
END;
|
|
END DRAW$CUBOID;
|
|
|
|
CALL DRAW$CUBOID( 3, 2, 4 );
|
|
CALL DRAW$CUBOID( 4, 3, 2 );
|
|
CALL DRAW$CUBOID( 2, 4, 3 );
|
|
CALL DRAW$CUBOID( 2, 3, 4 );
|
|
|
|
EOF
|