; ; TEST SUBROUTINE FOR BASIC LOAD COMMAND ; ; THIS SUBROUTINE SHOULD CHANGE A STRING TO LOWER CASE ; ; CALL IS CALL "LOWCAS"(IN$,OU$) ; ; WHERE IN$=STRING TO BE LOWEREDD ; OU$=RESULTANT STRING ; ; IDENTIFYING INFO: .MCALL ULODHD ;CALL MACRO ;IDENTIFY START OF CODE, END OF CODE ;AND ONE ENTRY POINT ULODHD LOWCAS,END,LOWCAS ; ; NOW THE CODE ITSELF ; ; LOWCAS: ;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 2$: MOVB (R3)+,(R5) ;REVERSE THE STRING CMPB (R5),#101 ;LESS THAN "A" ? BLT 22$ ;IF SO, DON'T CHANGE CMPB (R5),#132 ;GREATER THAN "Z" ? BGT 22$ ;IF SO, DON'T CHANGE BISB #40,(R5) ;OK, LOWER HIM 22$: INC R5 ;AND BUMP THE POINTER 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