Scrittura di macro BMS
Poiché una macro BMS è un'istruzione in linguaggio assembler, è necessario seguire le regole di sintassi del linguaggio assembler.
Le seguenti regole funzionano, ma sono più restrittive di quelle attuali. Per l'insieme completo delle regole di sintassi del linguaggio assembler, vedere High Level Assembler Language Reference.
- I nomi iniziano nella colonna 1. I nomi delle mappe e dei set di mappe possono essere lunghi fino a sette caratteri. La lunghezza massima dei nomi dei campi (la macro DFHMDF) dipende dal linguaggio di programmazione. BMS crea etichette aggiungendo suffissi di un carattere ai nomi dei campi. Queste etichette non devono essere più lunghe di quanto consentito dalla lingua di destinazione, perché vengono copiate nel programma. Pertanto, il limite per il nome di un campo mappa è di 29 caratteri per COBOL, 30 per Pl/I e Assembler H e 7 per Assembler F. Per C® e C++, è di 30 caratteri se la mappa viene copiata nel programma come oggetto dati interno e di 6 caratteri se si tratta di un oggetto dati esterno (vedere Acquisizione e definizione della memoria per le mappe per ulteriori informazioni sulla copia della mappa).
- Iniziare l'identificatore della macro nella colonna 10, oppure lasciare uno spazio vuoto tra questa e il nome se il nome supera le otto posizioni. Per le definizioni di campo, l'identificatore è sempre DFHMDF; per le definizioni di mappa, DFHMDI; e per le macro dell'insieme di mappe che iniziano e terminano l'insieme di mappe, DFHMSD.
- Il resto della descrizione del campo consiste in parole chiave (come POS per il parametro posizione) seguite dai valori. A volte una parola chiave non ha un valore, ma se ce l'ha, un segno di uguale (=) separa sempre la parola chiave dal suo valore.
- Lasciate uno spazio vuoto dopo l'identificativo della macro e poi iniziate le parole chiave. Possono comparire in qualsiasi ordine.
- Separate le parole chiave con una virgola (senza spazi vuoti), ma non mettete una virgola dopo l'ultima.
- Le parole chiave possono estendersi fino alla colonna 71. Se occorre più spazio, fermarsi dopo la virgola che segue l'ultima parola chiave che si inserisce interamente nella riga e riprendere nella colonna 16 della riga successiva.
- I valori iniziali (le parole chiave INITIAL, XINIT e GINIT) sono un'eccezione alla regola, perché potrebbero non essere adatti anche se si inizia su una nuova riga. Tranne quando si tratta di caratteri a doppio byte, è possibile dividerli in qualsiasi punto dopo il primo carattere del valore iniziale stesso. Quando si divide in questo modo, utilizzare tutte le colonne fino alla 71 e continuare nella colonna 16 della riga successiva. I dati del set di caratteri a doppio byte (DBCS) sono più complicati da esprimere rispetto ai normali dati a singolo byte (SBCS). Vedere il passaggio 12 se si dispone di valori iniziali DBCS.
- Circondare i valori iniziali con virgolette singole. Se è necessario un apice singolo all'interno del testo, utilizzare due apici singoli successivi (l'assemblatore rimuove quello in più). Anche gli ampere hanno un significato speciale per l'assemblatore e si usa la stessa tecnica: si usano due ampere dove se ne vuole uno, e l'assemblatore rimuove quello in più.
- Se si utilizza più di una riga per una macro, inserire un carattere (uno qualsiasi tranne lo spazio vuoto) nella colonna 72 di tutte le righe tranne l'ultima.
- Se si desidera inserire dei commenti nella mappa, utilizzare le righe di commento tra le macro, non tra le righe che compongono una singola macro. Le righe di commento presentano un asterisco nella colonna 1 e uno spazio vuoto nella colonna 72. I commenti possono apparire in qualsiasi punto delle colonne 2-71.
- Usare solo il maiuscolo, tranne che per i valori del parametro INITIAL e nei commenti.
- Per i valori iniziali contenenti DBCS. Se i dati iniziali sono interamente DBCS, usare la parola chiave GINIT per i dati e specificare anche la parola chiave PS=8. Se i dati contengono sia caratteri DBCS che SBCS, cioè se sono misti, utilizzare INITIAL e specificare SOSI=YES. (Dobbiamo spiegare una terza alternativa, XINIT, perché potreste trovarla nel codice che state manutenendo. Se possibile, tuttavia, si consiglia di utilizzare GINIT e INITIAL, poiché XINIT è più difficile da usare e i dati non vengono convalidati in modo completo. XINIT può essere utilizzato per DBCS puro o misto. XINIT con PS=8 segue le regole di GINIT e XINIT con SOSI=YES segue quelle di INITIAL (per lo più, almeno). La differenza principale è che con XINIT si esprimono i dati in esadecimale, mentre per GINIT e INITIAL si utilizzano caratteri ordinari)È così che si scrivono i valori iniziali di DBCS:
- I dati sono racchiusi tra apici singoli, come nel caso del normale parametro INITIAL.
- Si utilizzano due caratteri ordinari per ogni carattere DBCS della costante (due coppie di cifre esadecimali con XINIT) e uno per ogni carattere SBCS (una coppia con XINIT).
- Ciascuna stringa di caratteri DBCS deve essere separata da un carattere shift-out (SO) immediatamente precedente e da un carattere shift-in (SI) immediatamente successivo. SO è l'esadecimale X'0E', che appare come '<' sulla maggior parte delle tastiere, e SI è X'0F' ('>'). (XINIT con PS=8 è un'eccezione; le parentesi SO/SI sono implicite e non vanno digitate) Ad esempio, tutti questi definiscono lo stesso valore iniziale, che è interamente DBCS. (Ignorate per il momento i valori di LUNGHEZZA; li spiegheremo tra poco)
GINIT='<D1D2D3D4D5>',PS=8,LENGTH=10 INITIAL='<D1D2D3D4D5>',SOSI=YES,LENGTH=12 XINIT='C4F1C4F2C4F3C4F4C4F5',PS=8,LENGTH=10 XINIT='0EC4F1C4F2C4F3C4F4C4F50F',SOSI=YES,LENGTH=12 - Le sequenze SBCS e DBCS possono susseguirsi in qualsiasi combinazione con INITIAL (e XINIT con SOSI=YES). Se si aggiunge 'ABC' davanti alla stringa DBCS dell'esempio precedente e 'def' dopo la stringa, si ottiene:
INITIAL='ABC<D1D2D3D4D5>def',SOSI=YES,LENGTH=18 XINIT='C1C2C30EC4F1C4F2C4F3C4F4C4F50F848586',SOSI=YES,LENGTH=18 - Per calcolare la lunghezza del valore iniziale, contate due per ogni carattere DBCS e uno per ogni carattere SBCS, sia che li esprimiate in caratteri normali o in coppie esadecimali. Con GINIT (e XINIT con PS=8 ) non si contano i caratteri SO e SI, ma con INITIAL (e XINIT con SOSI=YES) se ne aggiunge uno per ogni SO e per ogni SI. (Notate i diversi valori di LENGTH per le stesse costanti negli esempi precedenti) In ogni caso, il valore di LENGTH non deve essere superiore a 256.
- Per GINIT e INITIAL, se la costante non rientra in una riga, si utilizzano le regole di continuazione "estese", che sono leggermente diverse da quelle descritte in precedenza. Con la continuazione estesa, è possibile fermarsi dopo qualsiasi carattere completo (carattere SBCS, coppia DBCS o SI che termina una stringa DBCS) all'interno del valore iniziale. Se ci si trova nel mezzo di una stringa DBCS, aggiungere un SI (i SO e i SI su una riga devono essere bilanciati). Compilare quindi la riga fino alla colonna 72 con un carattere di continuazione. Va bene qualsiasi carattere, purché sia diverso dall'ultimo carattere significativo della riga.Se ci si è fermati all'interno di una stringa DBCS, inserire un carattere SO nella colonna 16 della riga successiva e riprendere in 17; altrimenti riprendere in 16, quindi:
GXMPL1 DFHMDF POS=(02,21),LENGTH=20,PS=8,GINIT='<D1D2D3D4D5D6>****** <D7D8D9D0>' IXMPL1 DFHMDF POS=(02,21),LENGTH=23,PS=8,INITIAL='abc<D1D2D3D4>ABC** DEFGHIJ'Non è possibile utilizzare la continuazione estesa con XINIT; utilizzare le regole descritte al passaggio 7.
- Se la specifica LENGTH supera la lunghezza del valore iniziale fornito, il valore viene riempito a destra con spazi vuoti DBCS fino al valore LENGTH se si è utilizzato GINIT (o XINIT con PS=8 ). Se si è utilizzato INITIAL, il carattere di riempimento è un vuoto SBCS se l'ultima parte della costante era SBCS, un vuoto DBCS se l'ultima parte era DBCS. Se si utilizza XINIT con SOSI=YES, il carattere di riempimento è sempre uno spazio vuoto SBCS.