Home > Previous Page >  Character-Forming Exercises, Your Computer April, 1983
Archive Search  
CHARACTER-FORMING
EXERCISES FOR
YOUR ACE
Roger Liddiard's program
will help convert
your deformed
character into
true descenders
of the
Ace

THE SPEED of Forth and being able to redefine standard graphic characters are features of the Jupiter Ace which make it ideal for improved quality printing - either on screen or on paper- a parallel printer has been promised by Jupiter Carter.

   The Jupiter Ace Handbook explains that the character set is contained in RAM addresses 11264 to 12287. These characters can be changed by writing new values into this RAM, but cannot be read back again. The initial character set is created from the ROM when the computer is switched on. The raw data to generate the characters is contained in ROM bytes 7547 to 8187 which consist of an abbreviated set of ASCII characters 32 to 127. If you want to see this data, define the words DD and Change01 as follows:


: DO
  DUP 16 + DUP ROT
  DO
   I C@ 256 + 2 BASE C!
   . DECIMAL 32 EMIT I . CR
  LOOP ;

: CHANGE01
  11264 48 8 * + 8 0
  DO
   DUP 128 SWAP C! 8 +
   DUP 255 SWAP C! 7 -
  LOOP
  1- 255 SWAP C! ;

  Now enter

CHANGE01 INVIS CLS 7547 DD

and enter further DD as required. The program displays the ROM data in succession - with an additional character on the left-hand side - and the byte. number at the right. The word Change01 has turned the character 0 into a black square and the character 1 into a white square, so that the ASCII characters are readily discernible.

  If you look carefully at this section of ROM, you will see that the ASCII characters 32 to 62 copy seven bytes at a time. The top line of each character is a zero byte. ASCII characters 63 to 94 only use six bytes each with zero top and bottom, while 95 to 126 use seven as before. Finally character 127 uses all eight bytes.

  When you have finished looking at the ROM, enter Abort to clear the data stack.

   The ROM data provides a very simple means of returning any character set you may have devised back into the original form. For example, we do not want us and is to look like black and white squares for the rest of their lives. The word Reset emulates the action of the computer when it is first switched on, restoring to original any altered characters between 32 and 127.

  Two utility words are needed - ROW which enters a single byte where ordered, and Block, which copies a prescribed block of data from the ROM.

: ROW
  OVER C! 1 + ;

: BLOCK
  0 DO
   OVER C@ ROW SWAP
   1+ SWAP
  LOOP ;

: RESET
  7547 11520 31 0
  DO 0 ROW 7 BLOCK
  LOOP 32 0
  DO 0 ROW 6 BLOCK 0 ROW
  LOOP 32 0
  DO 0 ROW 7 BLOCK
  LOOP 8 BLOCK ABORT ;
BEFORE


Now Redefine DD and Change 01. This remove.. them from the dictionary and leaves just Row, Block and Reset Define another word Test to display all the characters on the screen:


: TEST
  127 32
  DO I EMIT
  LOOP 4 1
  DO I EMIT
  LOOP ;

  You will notice that three graphic characters appear at the end - we will need to look at these later on; they will be changed into something more useful.


  Examine the letters critically - several things detract from their appearance: the lines of writing are too close together; some lower case letters seem to be too short, not lining up with the top of the other letters; and the descenders, - the tails that are supposed to fall below the line - hardly descend at all.


  To overcome crammed writing one simple remedy is to print a blank line between lines of type. At first this might appear to spare the lines our too far, but if the blank lines are used to on,, better descend,,, and we increase the size of the capitals, the spacing looks just right.

  The word Capital increases the height of ASCII characters 63 to 94- it simply doubles up on the top two lines of the characters:


: CAPITAL
  7764 11766 32 0
  DO 2 BLOCK SWAP
   4 + SWAP 6 +
  LOOP DROP DROP ;

  The offending lower-case letters are stretched in a similar manner to smooth out their tops:


: LCASE
  1 1 4 4 4 1 4 1 4 1 4
  7977 12048 11 0
  DO 3 PICK BLOCK 3 PICK -
   SWAP ROT-7 + SWAP 8 +
  LOOP DROP DROP ;

  Now to put proper tails on your letters. The letters g, j, p, q and y are re-defined and their tails are drawn in graphic characters 1, 2 and 3. Yes, you only need three tails - those of g, j, and y are the same.

  The word Descenders makes this transformation - of course the tails are lost until we double space the typing, but you can see them being formed in the last three characters of Test.


: DESCENDERS
  4 664 64 56 68 11272
  DUP 24 0
  DO 0 ROW
  LOOP DROP 3 0
  DO 2 0
   DO SWAP ROW
   LOOP 6 +
  LOOP DROP
  8141 12237 8085 12173 8078 12165
  8035 12117 8015 12093 5 0
  DO 3 BLOCK DROP DROP
  LOOP ;

  If your Jupiter Ace has no additional memory, you will soon be running out of space, but do not worry - once the new set of characters has been formed, we can dear the dictionary and start again with some new words. So Save what we have done so far, then enter


CAPITAL LCASE DESCENDERS FORGET RESET


which should clear out the dictionary - check it with VLIST. Now the Create. Start by entering two utilities:


 32 VARIABLE NN
 : PRINT ;

Then define the word DType. It is quite long but its effect is dramatic:


: DTYPE
  32 NN ! FIND DUP 6 + SWAP 5- @ 13 -
  BEGIN
   DUP 32>
    IF
    ELSE DUP NN !
    THEN NN @ 0 >
  WHILE
   BEGIN
    INKEY DUP 80 =
     IF PRINT
     THEN
   UNTIL NN @ - SWAP DUP NN @ +
   SWAP NN @
   TYPE SWAP 32 NN @- SPACES 32 0
  DO 113 113 113 112 112 121 106 103
   0 15388 @ 32 - C@ 8 0
   DO DUP 4 ROLL = ROT + SWAP
  LOOP DROP DUP
   IF
   ELSE DROP 32
  THEN EMIT
 LOOP
 REPEAT DROP DROP ;

AFTER


  DType is used in conjunction with a word containing text. It starts on a new line so the text is best arranged in complete paragraphs. The first 32 letters are typed out, followed by a line of blanks and descenders. It then wait, for you to press any key before repeating the process with the next 32 letters. This control facility is very useful when you need to control the amount of text you wish to display, for example when a printer is used to copy a screen full of text, A dummy word Print has been included - if the letter P is pressed this subroutine is called up - it will be useful in the future. To use DType, define some text such as

P1 ." abcdefghijklmnop etc. " ;

preferably with more than one line of characters. Because DType uses the word Find, and calculates the length of text in P1, another word must appear in the dictionary after P1, otherwise the bytes in P1's header which define its length, will not be complete. So add a dummy word : P2 ; on the end.   Now enter

     INVIS CLS DTYPE P1

when the first line is complete, press any key and the next line will appear. The advantages of storing test in colon definitions are. that the length of text is not limited to 256 characters and full Edit facilities are available. In addition, memory space is not wasted in defining new words such as String. Successive paragraphs can be displayed by means of

     DTYPE P1 DTYPE P2 DTYPE P3 etc.

and paragraphs can be interspersed with additional blank lines by the use of CR as required. Your text can be Saved on tape in the normal manner.