Jeg har ikke kodet ret meget assembler i mit liv som programmør, men et af de moduler, jeg har mest glæde af kommer i dette tip. Helt tilbage i uge 21/2001 skrev jeg om, hvordan man i CICS laver et globalt areal, som alle tasks på den pågældende CICS kan dele. For at lave det samme nummer i TSO eller i BATCH (eller et hjemmelavet started task), er du nødt til at lave et assembler-program, der kalder LOAD-macroen. Det er netop, hvad det følgende assembler-program kan.
Hvis du er en meget ivrig læser af mine tip og derudover har en skarp hukommelse, så vil du straks påpege, at metoden beskrevet i uge 28/2005 kan bruges i stedet. Problemet med den metode er, at man kun kan gemme 16 bytes ad gangen. Og så vil du alligevel være tvunget til at allokere et større areal, hvilket nemmest gøres med LOAD:
Nu er assembler ikke særligt læse-venligt, så du må nøjes med en lidt mere udførlig beskrivelse af, hvad de enkelte parametre gør godt for, så du ved, hvordan programmet bruges. Parameteren LMODNAME giver vist sig selv og skal selvfølgelig indeholde navnet på det load-modul, du vil loade ind i storage. Dette load-modul kan med fordel laves som beskrevet i tippet fra uge 21/2001. Det er størrelsen af dette load-modul, der bestemmer, hvor stor et stykke storage, du får allokeret. Parameteren LMODADDR er efter kaldet sat til adressen på load-modulet i storage. Parameteren DCBADDR skal du sætte til 0 inden du kalder programmet, og bevirker at MVS søger efter load-modulet i den sædvanlige søge-rækkefølge. Parameteren FUNCTION sætter du til 0 for at loade. Med DCBADDR og FUNCTION kan du udføre andre snedigheder, men send en mail, hvis du vil vide mere om dem.
Efter kaldet skal du kontrollere returkoden, som enten er sat til 0 for at alting gik godt eller 806 for at load-modulet ikke blev fundet (eller der er fumlet med DCBADDR eller FUNCTION parameteren). Første gang du kalder programmet loades load-modulet som sagt ind i storage. Alle de efterfølgende gange vil LOAD-macroen konstatere, at load-modulet allerede er loadet og nøjes med at returnere adressen på det. En undtagelse er dog, hvis load-modulet har fået attributten NOREUS. Så vil du få loadet load-modulet igen og få en anden adresse retur, og så virker tippet absolut ikke efter hensigten.
Jeg benytter dette tip under ISPF i stedet for ISPF SHARED POOL variable, som desværre kun er globale inden for samme APPLID. Her skal du vide, at når den split session, den første load udføres under dør, så forsvinder load-modulet ud af storage, og dermed forsvinder det globale areal også. Dette er dog under normale omstændigheder ikke noget problem, men det er rigtig godt at vide.
Her til sidst får du lige en stump PLI-kode, der illustrerer brugen af programmet:
Her er det vigtigt at have en eyecatcher i starten af det globale areal, så du kan skelne den første load af MYLMOD fra alle de efterfølgende. I dette eksempel benyttes teksten GLOBALAREA i de første 10 tegn som eyecatcher. Husk at størrelsen af globalArea ikke må være større end størrelsen af MYLMOD, ellers risikerer du en 0C4 abend.