Odr❎bn⇧ grup❎ procedur stanowi⇧ podprogramy zarz⇧dzaj⇧ce zmiennymi¢③rodowiskowymi.¢¢NUMENV¢¢Procedura NUMENV zwraca warto③⇨ zmiennej o numerze danym w A i ustalonym¢wcze③niej wskaniku BUFADR. Warto③⇨ zmiennej zapisywana jest w BUF580.¢¢¢NUMber of ENVironment¢¢ org $BA89¢¢bufadr equ $15¢buf580 equ $0580¢envnum equ $0C53¢¢jext_off equ $07F4¢envfind equ $BAFF¢genvfadr equ $BB58¢senvmem equ $BB69¢¢NUMENV sta envnum¢ jsr senvmem¢ ldy #$FF¢ bne cnumenv¢¢Numer zmiennej zapisywany jest w ENVNUM. Procedura SENVMEM (opisana poniəej),¢dokonuje prze⇧czenia bankw pami❎ci RAM (je③li jest to konieczne) i ustala¢wska⇩nik dobufora zmiennych ③rodowiskowych BUFADR. Na koniec NUMENV ustawia w¢akumulatorze warto③⇨ przesuni❎cia i skacze w ③rodek GETENV.¢¢¢GETENV (GET ENvironment Variable)¢¢GETENV zwraca w BUF580 ($0580) warto③⇨ zmiennej o nazwie wskazanej rejestrami¢AX. Ustawiony bit N rejestru znacznikw sygnalizuje b⇧d.¢¢Najpierw, przy uəyciu procedury GENVFADR, pobierana jest nazwa zmiennej, a jej¢numer ustalany jest na zero. Skok do SENVMEM prze⇧cza banki pami❎ci RAM i¢ustawia wska⇩nik BUFADR. Nast❎pnie zmienna jest wyszukiwana przez procedur❎¢ENVFIND i przepisywana do bufora BUF580. Przed p❎tl⇧ przepisuj⇧c⇧, od etykiety¢CNUMENV, nast❎puje wej③cie z procedury NUMENV.¢¢ org $BA93¢¢GETENV jsr genvfadr¢ lda #$00¢ sta envnum¢ jsr senvmem¢ jsr envfind¢ bmi error¢cnumenv ldx #$00¢loop iny¢ lda (bufadr),y¢ beq error¢ sta buf580,x¢ inx¢ cmp #$9B¢ bne loop¢ dec envnum¢ bpl cnumenv¢ lda #$00¢ jmp jext_off¢error lda #$FF¢ jmp jext_off¢¢Po p❎tli nast❎puje zmniejszenie numeru zmiennej ③rodowiskowej ustawionego przez¢NUMENV (GETENV ustawia ten numer na zero) i, je③li jest on ujemny, procedura¢koczy dziaanie przywracaj⇧c wej③ciowy ukad bankw pami❎ci.¢¢¢PUTENV (PUT ENvironment Variable)¢¢¢Procedura ustawia (np.set s=3) lub kasuje (set s) zmienn⇧ ③rodowiskow⇧. Wska⇩nik¢do nazwy lub przypisania podany jest w AX. Parametry dla procedury to wska⇩nik¢do nazwy zmiennej w AX.¢¢ org $BAC1¢¢bufadr equ $15¢buf580 equ $580¢¢jext_off equ $7F4¢TOUPPER equ $B442¢envfind equ $BAFF¢envclr equ $BB35¢genvfadr equ $BB58¢senvmem equ $BB69¢¢PUTENV jsr genvfadr Na pocz⇧tku procedura przepisuje zmienn⇧ do bufora¢ jsr senvmem pomocniczego i ustawia pami❎⇨ oraz wska⇩nik do¢ jsr envfind bufora systemowego, teraz nast❎puje odszukanie¢ bmi eBACF nazwy zmiennej.¢¢ jsr envclr Gdy taka zmienna istnieje jest ona kasowana.¢¢eBACF ldy #$FF¢¢eBAD1 iny Teraz program poszukuje koca deklaracji zmiennych.¢ lda (bufadr),y¢ bne eBAD1¢¢ ldx #$00 A po jego odszukaniu procedura sprawdza czy chodzi o¢eBAD8 lda buf580,x deklaracj❎ czy teə kasowanie zmiennej.¢ cmp #$9B¢ beq eBAF8 Gdy znak EOL znajduje si❎ przed '=' oznacza to¢ inx wymazanie i procedura si❎ koczy.¢ cmp #'='¢ bne eBAD8¢¢ ldx #$00 W przeciwnym razie procedura sprawdza czy jest¢¢eBAE6 cpy #$FF jeszcze miejsce na now⇧ zmienn⇧.¢ beq eBAF8¢¢ lda buf580,x Gdy jest przepisuje now⇧ zmienn⇧ do buforu systemo-¢ jsr TOUPPER wego (zamieniaj⇧c mae znaki na duəe)¢ sta (bufadr),y¢ inx¢ iny¢ cmp #$9B aə do napotkania koca zmiennej.¢ bne eBAE6¢¢eBAF8 lda #$00 W ostatnim etapie procedura ustawia znak EOF na¢ sta (bufadr),y aktualnym wskazaniu Y¢ jmp jext_off i koczy si❎ ustawiaj⇧c poprzedni⇧ pami❎⇨.¢¢¢ENVFIND (ENvironment Variable FIND)¢¢¢Procedura odszukuje dan⇧ zmienn⇧ w buforze.¢¢ org $BAFF¢¢bufadr equ $15¢buf580 equ $580¢envoff equ $C52¢¢TOUPPER equ $B442¢¢envfind ldy #$00 Na pocz⇧tku procedura kasuje znacznik przesuni❎cia¢ zmiennej w buforze i w buf580.¢eBB01 ldx #$00¢ sty envoff¢¢eBB06 lda buf580,x Teraz sprawdza czy nast⇧pi koniec nazwy zmiennej¢ cmp #$9B poszukiwanej.¢ beq eBB2C¢ cmp #'='¢ beq eBB2C¢ jsr TOUPPER Gdy tak nie jest nazwa porwnywana jest z zmienn⇧ w¢ cmp (bufadr),y buforze¢ bne eBB1C¢ iny i gdy s⇧ one zgodne p❎tla si❎ zamyka.¢ inx¢ bne eBB06¢¢eBB1C lda (bufadr),y Gdy zmienne s⇧ rəne procedura poszukuje koca¢ beq eBB29 zmiennej ③rodowiskowej zdefiniowanej w buforze.¢ iny¢ cmp #$9B¢ bne eBB1C¢¢ lda (bufadr),y Gdy zosta napotkany koniec zmiennej i istnieje¢ bne eBB01 nast❎pna zmienna program przechodzi do porwnania.¢¢eBB29 lda #$FF Gdy nast⇧pi koniec zmiennych procedura wraca z¢ rts wynikiem b❎dnym.¢¢eBB2C lda (bufadr),y Gdy nazwy zmiennych s⇧ zgodne lecz nast❎pny znak¢ cmp #'=' istniej⇧cej zmiennej nie jest przypisaniem procedura¢ bne eBB1C poszukuje nast❎pnej zmiennej.¢ lda #$00 W przeciwnym razie koczy si❎ poprawnym wynikiem.¢ rts¢¢Procedura kasuje zmienn⇧ ③rodowiskow⇧.¢¢ org $BB35 ENVirontment CLeaR.¢¢bufadr equ $15¢envnum equ $C51¢envoff equ $C52¢envclr ldy envoff Na pocz⇧tku procedura poszukuje koca zmiennej lub¢eBB38 lda (bufadr),y koca buforu.¢ beq eBB46¢ cmp #$9B¢ beq eBB43¢ iny¢ bne eBB38¢eBB43 iny Gdy nast⇧pi koniec zmiennej przesuni❎cie zwi❎kszane¢ lda (bufadr),y jest o jeden (znak eol).¢eBB46 sty envnum Teraz jest ono zapami❎tane,¢ ldy envoff¢ sta (bufadr),y a znak nowej zmiennej zapisywany jest pod przesuni❎-¢ inc envoff cie pocz⇧tku zmiennej.¢ ldy envnum¢ tax¢ bne eBB43 P❎tla trwa aə do przepisania wszystkich zmiennych.¢ rts¢¢ org $BB58 Get ENVirontment From ADRes.¢¢bufadr equ $15¢buf580 equ $580¢¢genvfadr sta bufadr Procedura ustala wska♪nik zmiennej z AX i¢ stx bufadr+1 przepisuje j⇧ do buforu buf580.¢ ldy #$00¢eBB5E lda (bufadr),y¢ sta buf580,y¢ iny¢ cmp #$9B¢ bne eBB5E¢ rts¢¢Procedury SENVMEM i SENVPTR ⇧cz⇧ si❎. SENVMEM ma za zadanie odpowiednie¢prze⇧czenie bankw pami❎ci RAM tak, by bufor zmiennych ③rodowiskowych sta si❎¢bezpo③rednio dost❎pny. SENVPTR ustawia wska⇩nik bufora zmiennych ③rodowiskowych¢BUFADR.¢¢¢ org $BB69¢¢bufadr equ $15¢env_p equ $C54¢envext equ $C56¢jext_on equ $7F1¢¢senvmem lda envext¢ jsr jext_on¢¢ org $BB6F¢¢senvptr lda env_p¢ sta bufadr¢ lda env_p+1¢ sta bufadr+1¢⑦ rts¢