ACT Apricot disk image㐞VR 1.5.0 F v㐞@`  @`Z>㐞@`  @`Z>㐞BASUTIL COM \ BASUTIL ASM \ ;Z>Z>Z> Z>Z>Z>Z>㐞as3 Ȏ.zb|3 Ȏ.c3 Ȏ.󤺮'UPSQRVWތȎػӃFMMCC7CCs..&Ȏ..&_^ZY[X] Z>Z>Z>Z> Z>Z>Z>㐞UPSQRVWߌȎ؋v&.C&..>ڻ5 ^_^ZY[X]UPSQRVWߌȎ؋v&.C&..>ڻ1^_^ZY[X]..N....+YGtPPF^]UVvPtDPD |uLL DL*^]UV㐞vDt1FFPFPDP=t L 6DF,PtDP=u֋DDF^]UWV u F-rPFONT EXE _b  GRAPHICSEXER,  GSX DOCLW PVEMIBM EXE gC dREADME DOCzP lKEYS EXE _b  MORE COM sPPC GSX\ N800400EGEXEP u!PRINT COMa RAMDISK SYSR㐞; MSBASIC Interpreter utility routines ; ; REVISED:- ; 11/10/84 ; TO RESOLVE PROBLEMS DUE TO INSUFFICIENT STACK IN PROGRAMS ; COMPILED WITH MSBASIC COMPILER. ; ; PROVIDES FOR COMMUNICATION WITH GSX FROM COMPILED ; BASIC USING CALLS TO 'GSX' ; FORMAT: ; 15/4/85 To add a print string and display string ; call to the original GSX interface: S P Lucy ; ; CALL GSX(ARRAY1,ARRAY2,ARRAY3,ARRAY4,ARRAY5) ; ; call prt(string$,ret%) ; call scrn(string$,ret%) STAKSIZE EQU 2048 ; MSBASIC COMPI㐞LER DOES NOT HAVE SUFFICIENT STACK FOR SOME GSX ; OPERATIONS SO A TEMPORARY STACK HAS BEEN IMPLEMENTED IN THIS ; MODULE. THE EQUATE STAKSIZE ABOVE DETERMINES THE SIZE OF THE ; TEMPORARY STACK. IF YOUR MEMORY LIMITS ARE TIGHT, THEN TRY ; DECREASING STAKSIZE (BUT DON'T FORGET TO RETEST YOUR PROGRAM ; AFTERWARDS). ; ; IF YOU ARE USING A COMPILER VERSION WHICH ALLOCATES SUFFICIENT ; STACK SPACE (ie MICROSOFT BUSINESS BASIC), OR ARE NOT CHANGING ; WORKSTATIONS DURING YOUR PROGRAM (OPEN WORKSTATION BEI㐞NG THE ; MOST STACK CONSUMING CALL TO GSX IF THE SPECIFIED DRIVER IS ; DIFFERENT TO THE CURRENT ONE), THEN TRY REMOVING THE LINES OF ; CODE COMMENTED ';*' BELOW TO SAVE MEMORY. ; ; This would also seem to apply to the interpreter EXTRA SEGMENT PUBLIC 'EXTRA' EXTRA ENDS STACK SEGMENT PUBLIC 'STACK' STACK ENDS DATA SEGMENT PUBLIC 'DATA' DATA ENDS CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA,ES:EXTRA,SS:STACK ; ORG 100H START: MOV AX,0061h MOV ES,AX MOV SI㐞 ,offset gsxentry XOR DI,DI MOV CX,offset gsxend - offset gsxentry MOV AX,CS MOV DS,AX mov cs:gsxseg,ax CLD REP MOVSB ;now install the printer handler MOV AX,0062h MOV ES,AX MOV SI,offset prtentry XOR DI,DI MOV CX,offset prtend - offset prtentry MOV AX,CS MOV DS,AX mov cs:prtseg,ax CLD REP MOVSB ;and now the screen far jump MOV AX,0063h MOV ES,AX MOV SI,offset scrnentry XOR DI,DI MOV CX,offse㐞t scrnend - offset scrnentry MOV AX,CS MOV DS,AX mov cs:scrnseg,ax CLD REP MOVSB mov dx,offset lastaddr + 32 INT 27h HLT PUBLIC GSX public prt GSX PROC FAR ; ; STACK ON ENTRY: ; SP -> | RET OFFSET | ; 2 | RET SEGMENT | ; 4 | ARRAY 5 OFF | ; 6 | ARRAY 4 OFF | ; 8 | ARRAY 3 OFF | ; 10 | ARRAY 2 OFF | ; 12 | ARRAY 1 OFF | ; BEGIN: PUSH BP MOV BP,SP ; POINT INTO STACK PUSH AX ; SAVE THE WORLD PUSH BX PUSH 㐞CX PUSH DX PUSH SI PUSH DI PUSH DS ; SAVE REGS PUSH ES MOV SI,DS ; SAVE DS IN SI MOV AX,CS ; SET UP DS MOV DS,AX MOV BX,OFFSET ARRAY ; OFFSET OF TABLE FROM START MOV DX,BX ; SAVE IN DX FOR GSX ADD BP,14 ; POINT TO ARRAY 1 OFFSET ON STACK MOV CX,5 ; FIVE POINTERS TO CONSTRUCT SETUP: MOV AX,[BP] ; GET ARRAY OFFSET MOV [BX],AX ; COPY INTO TABLE DEC BP DEC BP ; POINT TO NEXT STACK ENTRY INC BX INC BX ; SET-UP SEGMENT ADDRESS MOV [BX],SI ; USING OL㐞D DS SAVED IN SI INC BX INC BX ; BUMP TO NEXT ENTRY LOOP SETUP ; FILL TABLE MOV CX,473H ; GSX COMMAND CLI ;* SWITCH TO LOCAL STACK MOV AX,SS ;* MOV CS:WORD PTR OLDSS,AX ;* MOV CS:WORD PTR OLDSP,SP ;* MOV SP,OFFSET STAKTOP ;* MOV AX,CS ;* MOV SS,AX ;* STI ;* INT 224 ; GO TO GSX CLI ;* BACK TO BASIC STACK MOV AX,CS:WORD PTR OLDSS ;* MOV SS,AX ;* MOV SP,CS:WORD PTR OLDSP ;* STI ;* POP ES POP DS POP DI POP SI POP DX POP CX POP㐞 BX POP AX POP BP RET 10 ; GSX ENDP ; ARRAY DW 10 DUP(0) ; ARRAY POINTERS FOR GSX GSXSTAK DW STAKSIZE DUP(0) ;* LOCAL STACK STAKTOP: ;* DW 10 DUP(0) ;* IN CASE OF STACK OVER-RUN OLDSS DW 0 ;* SAVE AREA FOR OLD STACK WHILST IN GSX OLDSP DW 0 ;* str_sizel db 0 ;parameter area for ms-basic strings str_size db 0 str_ptr dw 0 str_seg dw 0 prt proc far ; called from interpreted basic as 'call prt(string$,ret%)' jmp prtbegin prtbegin: PUSH BP MOV BP,SP㐞 ; POINT INTO STACK PUSH AX ; SAVE THE WORLD PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH DS ; SAVE REGS PUSH ES MOV DI,DS ; SAVE DS IN DI MOV AX,CS ; SET UP DS MOV DS,AX ; ; stack is set up as ; bp return addr (4) ; bp+4 return value (2) ; bp+6 string pointer ; as control device expects dx:si to contain ; a pointer to string we can merely convert the ; values given to a word followed by a double word ; to si, with dx containing old ds mov si, [bp+8]㐞 mov bx, si mov al, byte ptr es:[bx] ;the lower byte mov cs:str_sizel, al inc bx mov ax, word ptr es:[bx] mov cs:str_ptr, ax mov cs:str_seg, di mov si, offset cs:str_sizel mov dx, ds ;old ds mov bx, 35h ;parallel driver mov cx, 9 ;print string int 0fch ;go and print the string mov bx, [bp+6] ;return value mov [bx], ax ;give user the result ;bring back the old universe POP ES POP DS POP DI POP SI POP DX POP CX POP BX POP AX POP BP ret 4 ;2 p㐞arameters so pop them off prt endp scrn proc far ; called from interpreted basic as 'call scrn(string$,ret%)' jmp scrnbegin scrnbegin: PUSH BP MOV BP,SP ; POINT INTO STACK PUSH AX ; SAVE THE WORLD PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH DS ; SAVE REGS PUSH ES MOV DI,DS ; SAVE DS IN DI MOV AX,CS ; SET UP DS MOV DS,AX ; ; stack is set up as ; bp return addr (4) ; bp+4 return value (2) ; bp+6 string pointer ; as control device expects dx:si t㐞o contain ; a pointer to string we can merely convert the ; values given to a word followed by a double word ; to si, with dx containing old ds mov si, [bp+8] mov bx, si mov al, byte ptr es:[bx] ;the lower byte mov cs:str_sizel, al inc bx mov ax, word ptr es:[bx] mov cs:str_ptr, ax mov cs:str_seg, di mov si, offset cs:str_sizel mov dx, ds ;old ds mov bx, 31h ;screen driver mov cx, 5 ;print string int 0fch ;go and print the string mov bx, [bp+6] ;return value㐞  mov [bx], ax ;give user the result ;bring back the old universe POP ES POP DS POP DI POP SI POP DX POP CX POP BX POP AX POP BP ret 4 ;2 parameters so pop them off scrn endp ; ;gsx interface call pointer gsxentry: jmp cs:dword ptr [5] gsxptr dw offset begin gsxseg dw 0 gsxend: ; printer call to control device prtentry: jmp cs:dword ptr [5] prtptr dw offset prtbegin prtseg dw 0 prtend: scrnentry: jmp cs:dword ptr [5] scrnptr dw offset scrnbegin scr㐞nseg dw 0 scrnend: lastaddr: CODE ENDS END BEGIN 7UTOR 012q UTOR 013q UTOR DOCq UTOR ICNq ACTIVITYCON^P cCTIVITYBAK \P eCTIVITYBAK fVP dZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ>NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ> NZ>!NZ>!NZ>!NZ>!NZ>!NZ>!NZ>!NZ>!NZ> !NZ>"NZ>"NZ>"NZ>"NZ>"NZ>"NZ>"NZ>"NZ> "NZ>#NZ>#NZ>#NZ>#NZ>#NZ>#NZ>#NZ>#NZ> #NZ>$NZ>$NZ>$NZ>$NZ>$NZ>$NZ>$NZ>$NZ> $NZ>%NZ>%NZ>%NZ>%NZ>%NZ>%NZ>%NZ>%NZ> %NZ>&NZ>&NZ>&NZ>&NZ>&NZ>&NZ>&NZ>&NZ> &NZ>'NZ>'NZ>'NZ>'NZ>'NZ>'NZ>'NZ>'NZ> 'NZ>(NZ>(NZ>(NZ>(NZ>(NZ>(NZ>(NZ>(NZ> (NZ>)NZ>)NZ>)NZ>)NZ>)NZ>)NZ>)NZ>)NZ> )NZ>*NZ>*NZ>*NZ>*NZ>*NZ>*NZ>*NZ>*NZ> *NZ>+NZ>+NZ>+NZ>+NZ>+NZ>+NZ>+NZ>+NZ> +NZ>,NZ>,NZ>,NZ>,NZ>,NZ>,NZ>,NZ>,NZ> ,NZ>-NZ>-NZ>-NZ>-NZ>-NZ>-NZ>-NZ>-NZ> -NZ>.NZ>.NZ>.NZ>.NZ>.NZ>.NZ>.NZ>.NZ> .NZ>/NZ>/NZ>/NZ>/NZ>/NZ>/NZ>/NZ>/NZ> /NZ>0NZ>0NZ>0NZ>0NZ>0NZ>0NZ>0NZ>0NZ> 0NZ>1NZ>1NZ>1NZ>1NZ>1NZ>1NZ>1NZ>1NZ> 1NZ>2NZ>2NZ>2NZ>2NZ>2NZ>2NZ>2NZ>2NZ> 2NZ>3NZ>3NZ>3NZ>3NZ>3NZ>3NZ>3NZ>3NZ> 3NZ>4NZ>4NZ>4NZ>4NZ>4NZ>4NZ>4NZ>4NZ> 4NZ>5NZ>5NZ>5NZ>5NZ>5NZ>5NZ>5NZ>5NZ> 5NZ>6NZ>6NZ>6NZ>6NZ>6NZ>6NZ>6NZ>6NZ> 6NZ>7NZ>7NZ>7NZ>7NZ>7NZ>7NZ>7NZ>7NZ> 7NZ>8NZ>8NZ>8NZ>8NZ>8NZ>8NZ>8NZ>8NZ> 8NZ>9NZ>9NZ>9NZ>9NZ>9NZ>9NZ>9NZ>9NZ> 9NZ>:NZ>:NZ>:NZ>:NZ>:NZ>:NZ>:NZ>:NZ> :NZ>;NZ>;NZ>;NZ>;NZ>;NZ>;NZ>;NZ>;NZ> ;NZ><NZ><NZ><NZ><NZ><NZ><NZ><NZ><NZ> <NZ>=NZ>=NZ>=NZ>=NZ>=NZ>=NZ>=NZ>=NZ> =NZ>>NZ>>NZ>>NZ>>NZ>>NZ>>NZ>>NZ>>NZ> >NZ>?NZ>?NZ>?NZ>?NZ>?NZ>?NZ>?NZ>?NZ> ?NZ>@NZ>@NZ>@NZ>@NZ>@NZ>@NZ>@NZ>@NZ> @NZ>ANZ>ANZ>ANZ>ANZ>ANZ>ANZ>ANZ>ANZ> ANZ>BNZ>BNZ>BNZ>BNZ>BNZ>BNZ>BNZ>BNZ> BNZ>CNZ>CNZ>CNZ>CNZ>CNZ>CNZ>CNZ>CNZ> CNZ>DNZ>DNZ>DNZ>DNZ>DNZ>DNZ>DNZ>DNZ> DNZ>ENZ>ENZ>ENZ>ENZ>ENZ>ENZ>ENZ>ENZ> EN㐞8BASUTIL.ASM BASUTIL.COM EXTENDED STACK SPACE FOR GXBAS