SprinterFirmware/DOS/environ.asm
2024-05-27 11:03:22 +03:00

252 lines
2.9 KiB
NASM

;[BEGIN]
;//MODULE: ENVIRON
;//CREATE: 10-11-2002 AUTHOR: Denis Parinov
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R01 19-11-2002 DNS CORRECT DE ADDRESS IN GETENV
;---------------------------------------------------------------
; LD HL,MYVAR
; CALL SETENV
; LD HL,MYVAR2
; LD DE,MYBUF
; CALL GETENV
ENVIRON
INC B
ENVI_L1
JR Z,INITENV ;B=FF
ENVI_L2
DEC B
ENVI_L3
JR Z,READENV ;B=0
DEC B
JR Z,GETENV ;B=1
DEC B
JR Z,SETENV ;B=2
LD A,ERR_INVALID_FUNCTION ; TODO: Call to NOP?
SCF
RET
INITENV
LD A,ENVPAGE
CALL BANK
PUSH AF
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 (PAGE3),A
AND A
RET
READENV PUSH HL
LD A,ENVPAGE
CALL BANK
LD H,A
LD C,PAGE3
IN L,(C)
EXX
LD HL,ENVIRONMENT
INC HL
POP DE
LD BC,(ENVSIZE)
EXX
;
RD_ENV1
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,RD_ENV1
XOR A
RET
GETENV
PUSH DE
CALL ENV_EX
LD A,ENVPAGE
CALL BANK
EX AF,AF'
CALL F_ENV
POP DE
LD A,0
LD (DE),A
JR NC,GE_1
GE_0 LD A,(HL)
LDI
OR A
JR NZ,GE_0
DEC DE ;R01
LD A,#FF
GE_1 EX AF,AF'
OUT (PAGE3),A
EX AF,AF'
AND A
RET
SETENV
CALL ENV_EX
;
LD A,ENVPAGE
CALL BANK
PUSH AF
;
CALL F_ENV
JR NC,PENV
XOR A
CPIR
LD A,B
OR C
JR Z,PENV
LDIR
; DEC DE
PENV
LD A,(SECBUF)
OR A
JR Z,CLR_ENV
LD HL,EXEBUFF
F_EVN2
LD A,(HL)
LDI
CP "="
JR NZ,F_EVN2
LD HL,SECBUF
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 (PAGE3),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
ENV_EX
LD B,0xff
LD DE,ENVNAME
ENV_E0
XOR A
LD (DE),A
LD (SECBUF),A
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
JR ENV_E4
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
LD DE,SECBUF
LD (DE),A
LD C,#FF
ENV_E2
LD A,(HL)
LDI
OR A
RET Z
DJNZ ENV_E2
ENV_E4
LD A,B
LD (DE),A
INC DE
SCF
RET
ENVNAME EQU EXEBUFF ;DS 32
ENVVALUE EQU #3800 ; BUFFER ;DS 128
ENVSIZE DW 1 ;E_END-ENVIRONMENT ;160
ENVIRONMENT EQU ENVADDR
DEFAULT_ENV
DB 0 ; "",0
DEF_ENV_SIZE EQU $-DEFAULT_ENV
;[END]