; ; TEST SUBROUTINE FOR BASIC LOAD COMMAND ; ; THIS SUBROUTINE SHOULD REVERSE A STRING ; ; CALL IS CALL "REVSTR"(IN$,OU$) ; ; WHERE IN$=STRING TO BE REVERSED ; OU$=RESULTANT STRING ; ; IDENTIFYING INFO: .MCALL ULODHD ;CALL MACRO ;IDENTIFY START OF CODE, END OF CODE ;AND ONE ENTRY POINT ULODHD REVSTR,END,REVSTR ; ; NOW THE CODE ITSELF ; ; REVSTR: ;LABLE ACTUAL START OF CODE JSR R4,@#GTRGPI ;GO GET ARGUMENTS IN PI FASHION .BYTE 3,4,0 ;THIS IS ARG TYPE LIST ;3 = INPUT STRING (TO SUBROUTINE) ;4 = OUTPUT STRING (TO MAIN PROG.) .EVEN ;WE NOW HAVE THIS DATA ON THE STACK ;SP+4 5-WORD STRING TABLE ENTRY ; FOR OUTPUT STRING ;SP> 2-WORD INPUT DESCRIPTOR ; (SP)=LEN, 2(SP)=ADDR JSR PC,@#PARCHK ;CHECK FOR TRAILING RIGHT PAREN ;(ALSO BUMPS TEXT POINTER) MOV R1,-(SP) ;SAVE TEXT PTR MOV 2(SP),R0 ;LEN OF INPUT STRING -> R0 BEQ 3$ ;IF ZERO, BRANCH JSR PC,@#TSTU00 ;CHECK FOR ROOM IN USER STORAGE AREA ;WIPES R3,R4, ;R5 -> NEXT BYTE IN USER STORAGE AREA BHI 1$ ;BRANCH IF ROOM EXISTS OVFERR ;ELSE DO ERROR TRAP 1$: MOV R0,R4 ;SAVE LENGTH IN R4 BIS #160000,R0 ;MAKE R0 A "SCRATCH" DATA TYPE HEADER MOV R0,(R5)+ ;PUT HEADER IN USER AREA MOV R5,R2 ;SAVE STRING ADDRESS (IN USER AREA) MOV 4(SP),R3 ;ADDRESS OF INPUT STRING -> R3 MOV R4,R0 ;STRING LENGTH -> LOOP COUNTER ADD R4,R3 ;BUMP R3 PAST END OF INPUT STRING 2$: MOVB -(R3),(R5)+ ;REVERSE THE STRING SOB R0,2$ MOV R2,R3 ;OUTPUT STRING ADDRESS -> R3 ;STRING LENGTH STILL IS IN R4 3$: MOV SP,R5 ;GET ADD OF RETURN ARG DESCRIPTOR ADD #6,R5 ;IN R5 JSR PC,@#SSTORE ;AND RETURN THE RESULT TO THE CALLER MOV (SP)+,R1 ;RESTORE TEXT PTR ADD #7*2,SP ;CLEAN STACK OF 7 WORDS RTS PC ;AND RETURN END: ;LABLE END OF CODE .END