; SYSTEM.SBR - A SUBROUTINE TO ALLOW SYSTEM CALLS FROM BASIC PROGRAMS ; 06/20/85 - DALE A. EICHBAUER ; 10/21/85 - [VERSION 1.1] - Changed final CHGMEM to manual reset ; of pointers to prevent trashing of arithmetic ; stack, temporarily reduced user's memory ; partition (during call to system) also to ; prevent trashing of arithmetic stack, and moved ; string into free memory area and properly ; terminated it. - D.E. ; ; PROPRIETARY PROGRAM MATERIAL ; ; THIS MATERIAL IS THE PROPERTY OF DALE A. EICHBAUER, ; 692 E. FREELAND ROAD, MERRILL, MICHIGAN, 48637. PERMISSION ; TO COPY & USE IS GRANTED FOR NON-PROFIT USES ONLY. ; ; SEARCH SYS SEARCH SYSSYM SEARCH TRM AUTOEXTERN OBJNAM SYSTEM.SBR VMAJOR=1. VMINOR=1. VSUB=0. VEDIT=100. VWHO=1. ; OFFSETS FROM A3 FOR PARAMETERS PASSED FROM BASIC PARMS=0 TYPE.1=2 ADD.1=4 SIZE.1=10 PHDR -1,PV$RPD,PH$REE!PH$REU BR START ASCII / COPYRIGHT (C) 1985 DALE A. EICHBAUER / EVEN START: JOBIDX A6 MOV JOBTRM(A6),A1 ; GET TRMDEF POINTER ORW #T$ECS!T$IMI,T.STS(A1) ; SET NOECHO, IMAGE MODE ; ; FOLLOWING ADDED SO THAT COMMAND FILE PROCESSOR PARSES STRINGS PROPERLY ; PUSH A4 ; SAVE FOR LATER USE [1.1] MOV SIZE.1(A3),D3 ; GET SIZE OF STRING TO PASS [1.1] MOV ADD.1(A3),A2 ; POINT TO THE STRING SENT FROM BASIC 10$: MOVB (A2)+,(A4)+ ; MOVE THE STRING INTO IMPURE AREA[1.1] SOB D3,10$ ; LOOP BACK TILL ALL DONE [1.1] MOVB #13.,(A4)+ ; TERMINATE WITH A CR [1.1] MOVB #10.,(A4)+ ; AND LINEFEED [1.1] CLRB (A4)+ ; AND NULL [1.1] EVNA A4 ; MAKE SURE ON EVEN BOUNDARY [1.1] USRBAS ; LOAD POINTER TO BEGINNING OF MEMORY MOV A6,A0 TEST: TST @A0 ; FOUND END? JEQ ENDING ; YES MOV @A0,D0 ; SAVE THE SIZE WORD IN CASE THIS IS LAST ADD @A0,A0 ; POINT TO NEXT MODULE BR TEST ENDING: SUB #12.,D0 ; ELIMINATE THE HOUSEKEEPING BYTES SUB D0,A0 ; STEP BACK TO BEGINNING OF LAST MOV A4,D1 ; GET BASIC'S POINTER TO FREE (ADJUSTED) SUB A0,D1 ; GET THE SIZE NEEDED PUSH D1 ; THE NEWLY COMPUTED SIZE PUSH A0 ; THE MODULE ADDRESS CHGMEM @SP ; CUT THE MODULE SIZE BACK TO MINIMUM POP ; CLEAR STACK POP ; DITTO POP A2 ; GET START OF FREE MEMORY (STRING) [1.1] ; ; THE FOLLOWING ADDED TO PRESERVE THE BASIC ARITHMETIC STACK ; WHILE AT THE MONITOR LEVEL ; JOBIDX A1 ; [1.1] PUSH JOBSIZ(A1) ; SAVE THE SIZE OF USER'S PARTITION[1.1] MOV A5,D2 ; GET THE BASIC ARITHMETIC STACK POINTER[1.1] USRBAS D3 ; GET THE START OF USER'S MEMORY[1.1] SUB D3,D2 ; CALCULATE NEW SIZE TO PROTECT STACK[1.1] SUB #2,D2 ; JUST TO MAKE SURE [1.1] MOV D2,JOBSIZ(A1) ; SET THE NEW PARTITION SIZE [1.1] SAVE D0-D7,A0-A6 AMOS ; PASS IT ON TO THE AMOS/L MONITOR REST D0-D7,A0-A6 ; ; FOLLOWING CHANGES RESTORE THE ORIGINAL SIZE OF THE USER'S PARTITION ; (UNPROTECT THE ARITHMETIC STACK) AND RESTORE THE ORIGINAL SIZE OF ; THE MEMORY MODULE FOR BASIC (MANUALLY RESTORED LENGTH SINCE CHGMEM ; WAS WIPING OUT THE ARITHMETIC STACK). ; POP JOBSIZ(A1) ; RESTORE THE ORIGINAL SIZE [1.1] ADD #12.,D0 ; COMPENSATE FOR HOUSEKEEPING WORDS[1.1] MOV D0,-12.(A0) ; RESTORE BASIC TO ORIGINAL SIZE[1.1] RTN ; BACK TO BASIC ASCII / COPYRIGHT (C) 1985 DALE A. EICHBAUER / EVEN END .