 "CSAVEM" FOR MC-10   V.2  rls
       (DOCUMENTATION)
 
 'CSAVEM.MC' IS A PATCH ROUTINE
TO FILL THE GAP LEFT BY THE
ABSENCE OF "CSAVEM" ON THE
MC-10. IT'S POSITION INDEPENDENT
AND USEABLE FROM BASIC.
 
**
  EXCEPT FOR USING "EXEC", THE
SYNTAX IS IDENTICAL TO THE
"CSAVEM" COMMAND ON THE CO-CO.
THAT IS:
 
EXEC(ADDRESS)"FILENAME",START ADDR.,END ADDR. <,OPTIONAL 'LOAD' ADDRESS>
 
ADDRESS=    ADDRESS OF 'CSAVEM' ROUTINE. USING THE 'CSAVEM.MC' PROGRAM,
            THIS ADDRESS WILL BE 20410 FOR 4K OR 36794 FOR 20K.
FILENAME=   1 TO 8 CHARACTERS. MAY BE A LITERAL (IN QUOTES) OR IT MAY BE
            A STRING VARIABLE (STILL 1 TO 8 CHARACTERS).
START ADDR.=STARTING ADDRESS OF MEMORY TO SAVE (IN DECIMAL). THIS MAY
            ALSO BE A NUMERIC VARIABLE OR EXPRESSION AS: INT(A-B/2)
END ADDR.=  ENDING ADDRESS OF MEMORY TO SAVE. MAY BE VARIABLE OR EXPRESSION.
LOAD ADDR.= THIS IS OPTIONAL AND IS USED WHEN YOU WISH THE BINARY FILE
            TO "CLOADM" AT AN ADDRESS OTHER THAN THAT ORIGINALLY SAVED.
            THIS ALSO IS NUMERIC: LITERAL, VARIABLE, OR EXPRESSION.
 
  ASSUME THE ROUTINE IS LOADED
AT ADDRESS 36794 (20K) AND YOU
ARE SAVING A ML PROGRAM THAT
STARTS AT 17222 AND EXTENDS
TO 17299. YOU WISH THE PROGRAM
TO "CLOADM" AT THE SAME ADDRESS.
YOU TYPE:
 
EXEC(36794)"CRUD",17222,17299
 
  IF YOU WISH THE PROGRAM TO
AUTOMATICALLY LOAD AT A DIFFER-
ENT ADDRESS (SAY 20000), YOU
WOULD USE THE OPTIONAL "LOAD
ADDRESS" PARAMETER:
 
EXEC(36794)"CRUD",17222,17299,20000
 
MOST ERRORS IN THE STATEMENT LIST
GIVE AN 'SN' (SYNTAX) ERROR.
HOWEVER, IF YOU ENTER AN ENDING
ADDRESS LOWER THAN THE STARTING
ADDRESS YOU WILL GET AN 'OV'
ERROR. THE USE OF THAT ERROR
MESSAGE IS NOT ACTUALLY CORRECT
BUT IT MAY HELP FLAG AN
UNNOTICED BLUNDER (ESPECIALLY
IF YOU USE NUMERIC VARIABLES).
 
**
 THE ASSEMBLY SOURCE CODE FOLLOWS:
**
( THIS LISTING DENOTES HEX NUMBERS WITH A PRECEEDING '$')
 
* PROGRAM ADDRESS LABELS (EQUATES)
 
CHRGOT EQU  $F3    ;READ AND STORE
                   ;CURRENT BASIC CHAR/ TOKEN -> 'A' REG.
 
GETADR EQU  $EF4C  ;EVALUATES NUMERIC
                   ;EXPRESSION, RETURNS 16 BIT INTEGER
                   ;RESULT IN 'X' REGISTER
 
CHKCOM EQU  $EA2F  ;CHECKS THAT CURRENT
                   ;BASIC CHAR = COMMA ELSE 'SN' ERROR.
 
* NAMEFILE BLOCK BUFFER ($425F-$426D)
 
FILTYP EQU  $4267  ;FILE TYPE
MLSTRT EQU  $426A  ;STARTING ADDRESS OF ML
MLLOAD EQU  $426C  ;LOADING " " "
 
* TAPE WORK ADDRESSES FOR CSAVE ROUTINES
 
DTSTRT EQU  $426F  ;START OF DATA
DTEND  EQU  $4271  ;END OF DATA -1
 
* CSAVE ROUTINES (OR SEGMENTS)
 
DODATA EQU  $FC5D  ;PART OF 'CSAVE' CODE
DONFLB EQU  $FC8E  ;SAVE NAMEFILE BLK
GTNAM  EQU  $FD33  ;GET FILENAME AND
                   ;STORE IN BUFFER ($425F-$4266)
 
* BASIC ERROR ROUTINES
 
SNERR  EQU  $EA3C  ;'SN' ERROR
ERROR  EQU  $E238  ;MAIN ERROR ROUTINE
                   ;ON ENTRY, REG. 'B' = ERROR CODE
 
* START CODE
 
       ORG  $00    ;ANY ADDRESS
 
       BEQ  SERR   ;NO PARMS= ERROR
       LDAA #02    ;ML FILE TYPE
       STAA FILTYP
       JSR  GTNAM  ;EVALUATE FILENAME
       BSR  GVAL   ;EVAL. START ADDRRESS
       STX  MLSTRT
       STX  DTSTRT
       STX  MLLOAD ;DEFAULT LOAD ADDR.
       BSR  GVAL   ;EVAL. END ADDR.
       INX         ;AND INCREMENT VALUE TO INCLUDE LAST BYTE.
       STX  DTEND  ;STORE
       LDD  DTEND  ;AND XFER FOR NEXT OPERATION
       SUBD DTSTRT ;CHECK RANGE. END >= START?
       BCC  OK     ;YES- CONTINUE.
       LDAB #$0A   ;ELSE- SET FOR 'OV' ERROR AND
       JMP  ERROR  ;CRASH IT!
OK     JSR  CHRGOT ;CHK FOR 'LOAD' PARM
       BEQ  DOIT   ;BRANCH IF DONE
       BSR  GVAL2  ;ELSE GET LOAD ADDR.
       STX  MLLOAD ;AND STORE IT.
DOIT   JSR  DONFLB ;SEND THE NAMFILE BLK
       JMP  DODATA ;SAVE THE DATA AND END
SERR   JMP  SNERR  ;CRASH IT W/'SN' ERR
GVAL   JSR  CHRGOT ;NO PARMS?
       BEQ  SERR   ;OFF W/HEAD
GVAL2  JSR  CHKCOM ;BETTER BE COMMA!
       JSR  GETADR ;GET NUMERIC EXPR.
       RTS
