;[BEGIN] ;//MODULE: ENVIRON ;//CREATE: 10-11-2002 AUTHOR: Denis Parinov ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- ;R02 13-05-2023 BAO Инициализация переменной BOOTDSK при старте ;R03 09-03-2007 VAS Функция ENV_EX теперь обрезает слишком длинную строку перед выходом ;R01 19-11-2002 DNS CORRECT DE ADDRESS IN GETENV ;--------------------------------------------------------------- ;///////////////////////////////////////////////////////////////////// ; Функция #46. Системное окружение. ; ; вход: B - номер подфункции: ; B=#FF, инициализация ; B=0, получение системного окружения. ; HL - буфер ; B=1, получить переменную окружения. ; HL - имя переменной ; DE - буфер для значения переменной ; B=2, установить/удалить переменную окружения ; HL - ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ ; В конце строки ноль. ; выход: A - состояние, если CF=0 ; DE - указывает на конец буфера (только для B=1) ; A=#FF - переменная обнаружена ; A=0 - переменная не обнаружена ; A - код ошибки, если CF=1 ;///////////////////////////////////////////////////////////////////// ENVIRON: INC B JR Z,INITENV ; B=#FF DEC B JR Z,READENV ; B=0. получить сист. окружение DEC B JP Z,GETENV ; B=1. получить перем. окружения DEC B JP Z,SETENV ; B=2. установить/удалить перем. окружения LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET ;------------------------------------------------- ; Инициализация буфера переменных окружения ;------------------------------------------------- INITENV: SET_PAGE_X ENVPAGE PUSH AF ; ;R02 LD A,(BOOTDSK.NUM) ADD A,'A' LD (DEFAULT_ENV.boot_disk),A ; LD DE,ENVIRONMENT ; начало буфера переменных окружения XOR A LD (DE),A INC DE LD HL,DEFAULT_ENV LD BC,DEF_ENV_SIZE LDIR LD (DE),A EX DE,HL LD DE,ENVIRONMENT AND A SBC HL,DE LD (ENVSIZE),HL ; POP AF OUT (SLOT3),A AND A RET ;------------------------------------------------- ; Получить сист. окружение ;------------------------------------------------- READENV: PUSH HL SET_PAGE_X ENVPAGE LD H,A LD C,SLOT3 IN L,(C) EXX LD HL,ENVIRONMENT INC HL POP DE LD BC,(ENVSIZE) EXX ; .loop: OUT (C),L EXX LD A,(HL) EXX OUT (C),H EXX LD (DE),A INC HL INC DE DEC BC LD A,B OR C EXX JR NZ,.loop //XOR A ;A=0 RET ;------------------------------------------------- ; Получить переменную окружения ;------------------------------------------------- GETENV: PUSH DE CALL ENV_EX ; скопир. строку перем. окруж. в буферы SET_PAGE_X ENVPAGE EX AF,AF' CALL F_ENV ; RET: DE - VAR VALUE; HL - VAR ADDRESS; BC - ENVIRONMENT SIZE POP DE LD A,0 LD (DE),A JR NC,.exit .loop: LD A,(HL) LDI OR A JR NZ,.loop DEC DE ;R01 LD A,#FF .exit: EX AF,AF' OUT (SLOT3),A EX AF,AF' AND A RET ;------------------------------------------------- ; Установить/Удалить переменную окружения ; ; вход: hl=имя перем. и значение, раздел. символом "=" ;------------------------------------------------- SETENV: CALL ENV_EX ; скопир. строку перем. окруж. в буферы SET_PAGE_X ENVPAGE PUSH AF CALL F_ENV ; RET: DE - VAR VALUE; HL - VAR ADDRESS; BC - ENVIRONMENT SIZE JR NC,PENV XOR A CPIR LD A,B OR C JR Z,PENV LDIR PENV LD A,(ENVVALUE) OR A JR Z,CLR_ENV LD HL,ENVNAME F_EVN2 LD A,(HL) LDI CP "=" JR NZ,F_EVN2 LD HL,ENVVALUE F_EVN3 LD A,(HL) LDI OR A JR NZ,F_EVN3 CLR_ENV XOR A LD (DE),A LD HL,ENVIRONMENT EX DE,HL SBC HL,DE LD (ENVSIZE),HL ; POP AF OUT (SLOT3),A AND A RET ; RET: ; DE - VAR VALUE ; HL - VAR ADDRESS ; BC - ENVIRONMENT SIZE F_ENV LD HL,ENVIRONMENT LD BC,(ENVSIZE) PUSH HL F_EVN0 POP DE LD DE,ENVNAME XOR A CPIR PUSH HL F_EVN1 LD A,(HL) OR A JR Z,END_OF_ENV LD A,(DE) CP (HL) INC HL INC DE DEC BC JR NZ,F_EVN0 CP "=" JR NZ,F_EVN1 SCF END_OF_ENV POP DE RET ;----------------------------------------------------------- ; Скопировать строку переменной окружения в буферы ; (имя и значение в разные буферы) ; вход: hl=имя перем. и значение, раздел. символом "=" ;----------------------------------------------------------- ENV_EX: LD B,ENVIRONMENT_STRING_LENGTH ; 255 макс. длина строки (имя+знач.) LD DE,ENVNAME ; куда ENV_E0: XOR A LD (DE),A LD (ENVVALUE),A ; скопир. в "ENVNAME" имя переменной ENV_E1: LD A,(HL) INC HL CP "=" JR Z,EQUAL_SG OR A JR Z,ENV_E3 CALL UPPER LD (DE),A INC DE DJNZ ENV_E1 ;R03 ; слишком длинная строка LD A,B LD (DE),A ; обрезать слишком длинную строку INC DE ; SCF RET ; значение не задано ENV_E3: LD A,"=" LD (DE),A INC DE XOR A LD (DE),A INC DE RET ; значение задано EQUAL_SG: LD (DE),A ; сохр. "=" INC DE XOR A LD (DE),A ; в конец имени перем. ; скопир. в "ENVVALUE" значение переменной (строку путей) LD DE,ENVVALUE ; 512 байт, буфер LD (DE),A LD C,#FF ; чтобы "ldi" не портила "b" ENV_E2 LD A,(HL) LDI OR A RET Z ; конец строки знач. переменной DJNZ ENV_E2 ;R03 ; слишком длинная строка LD A,B LD (DE),A ; обрезать слишком длинную строку INC DE ; SCF RET ENVNAME EQU CORE_BUFFERS.EXEBUFF ;DS 32 ENVVALUE EQU CORE_BUFFERS.BUFFER //#3800 ; BUFFER ;DS 128 ENVSIZE DW DEF_ENV_SIZE ;E_END-ENVIRONMENT ;160 ENVIRONMENT EQU ENVPAGE.ADDR DEFAULT_ENV: DB 'BOOTDSK=' ;R02 .boot_disk: DB 'X:',0 ;R02 ; DB 'SYSTEM=C:\system.exe',0 ; DB 'PATH=\SYSTEM\;\COMMAND\;',0 DEF_ENV_SIZE EQU $-DEFAULT_ENV ;R02 ; DB 'SYSTEM=C:\system.exe',0 ; DB 'PATH=\SYSTEM\;\COMMAND\;',0 ; DB 0 ; DB 'SYSTEM=C:\system.exe',0 ; DB 'PATH=C:\;\FN\;',0 ; DB 'OS=ESTEX',0 ; DB 'VAR1=000',0 ; DB 'OSNAME=ESTEX 2002',0 ; DB 0