[comp.sys.tandy] Program to set the high memory pointer

stein@rocksanne.UUCP (Adam Stein) (12/03/87)

The TRSDOS command MEMORY won't allow you to set the high memory pointer
higher than the current setting, so I wrote this.  It was written with
Aztec C but the comments should provide enough information about the
Aztec specifics for someone to change it to another compiler.  The
comments also describe the use.

					Adam Stein
					rutgers!rochester!rocksanne!stein

-----cut here----------cut here----------cut here----------cut here-----
/*Program to set the high memory pointer or display it's current setting.
  Sethigh without arguments shows the high memory pointer's current
  setting (i.e. sethigh).  An optional high memory pointer can be given
  in decimal (i.e. sethigh 54000) or in hex (i.e. sethigh -x ff00) using
  the '-x' option.  Any errors in the arguments produces the usage
  message.

  Written to get around the problem of the restriction in the dos call
  MEMORY that specifies that the new value for high must be lower than
  the current setting.

  Written using Aztec C v1.06A.
  Specific aztec functions:
    svc [svc(code,bc,de,hl)]     - used to call a TRSDOS SVC.  The first
                                   argument is the SVC number, the last
                                   3 arguments fill the BC, DE, and HL
                                   registers, respectively.  If the SVC
                                   returns with the Z flag set, svc() 
                                   returns 0, otherwise it returns the
                                   value in the A register.
    svchl [svchl(code,bc,de,hl)] - Same as svc() except that if the Z flag
                                   is set on return from the SVC, svchl()
                                   returns the value in the HL register,
                                   otherwise, it returns 0.
  Specific aztec constants:
    S_ERROR - the SVC number for the error SVC (26).
    S_HIGH  - the SVC number the the high SVC (100).

  Written by Adam Stein (12/02/87).
*/

#include "stdio/h"
#include "ctype/h"
#include "trs4/h"

unsigned int high_memory;

main(argc,argv)
register int argc;
register char *argv[];
{
        register int error;

        getargs(argc,argv);

        if(!high_memory) {     /*No high value given, show current setting*/
          high_memory = svchl(S_HIGH,0,0,0);
          printf("High memory is set to 0x%x (%u)\n",high_memory,high_memory);
        } else
            if((error = svc(S_HIGH,0,0,high_memory)))
              svc(S_ERROR,error | 192,0,0);
}

getargs(argc,argv)
register int argc;
register char *argv[];
{
        high_memory = 0;

        if(argc > 1)
          if(argc > 3) {
            fputs("usage: sethigh [[-x] high]\n",stderr);
            exit(-1);
          } else switch(argc) {
                           case 2:
                                   if(!isdigit(argv[1][0]) ||
                                      !sscanf(argv[1],"%d",&high_memory)) {
                                     fputs("usage: sethigh [[-x] high]\n",stderr);
                                     exit(-1);
                                   }
                                   break;
                           case 3:
                                   if(strcmp("-x",argv[1])) {
                                     fputs("usage: sethigh [[-x] high]\n",stderr);
                                     exit(-1);
                                   } else if(!sscanf(argv[2],"%x",&high_memory)) {
                                            fputs("usage: sethigh [[-x] hex_high]\n",stderr);
                                            exit(-1);
                                          }
                                   break;
                 }
}
-----cut here----------cut here----------cut here----------cut here-----