UserMenu/parser.asm

550 lines
6.5 KiB
NASM
Executable File

BUILD_TABLE
LD A,(CMD_MENU)
OR A
JR Z,BT0
LD HL,FILE_ARRAY
LD IX,MENU_TABLE
CALL PARSER
AND A
RET
BT0 CALL READ_MENU
RET C
LD HL,(MENU_ADDRESS)
LD IX,MENU_TABLE
CALL PARSER
AND A
RET
MNU_FHND DB #FF
OPEN_MENU_FILE
XOR A ;;;;;;;;
LD C,Dss.Open
RST ToDSS
RET C
LD (MNU_FHND),A
RET
CLOSE_MENU_FILE
LD A,(MNU_FHND)
LD C,Dss.Close
RST ToDSS
RET
MENU_ADDRESS
DW 0
READ_MENU
; LD HL,DEFAULT_FILE
; LD A,(EXTMENU)
; OR A
; JR Z,DEFMNU
; LD HL,FST_VAR
LD HL,FST_VAR
LD A,(EXTMENU)
OR A
JR NZ,NOT_DEF_MNU
LD HL,DEFAULT_FILE
NOT_DEF_MNU:
PUSH HL
CALL OPEN_MENU_FILE
POP HL
JR NC,RM_STEP2
CALL PUTVAR
LD A,3
CALL MESSAGE
SCF
RET
RM_STEP2
LD HL,FILE_ARRAY
LD DE,16384
LD C,Dss.Read
LD A,(MNU_FHND)
RST ToDSS
JR C,RF_ERR
LD B,D
LD C,E
LD HL,FILE_ARRAY
FIND_AGAIN
LD A,"["
CPIR
JR NZ,NOMENU
LD A,(ANCHOR)
OR A
LD DE,DEFAULT_MENU
JR Z,CHECK_MNU_NAME
LD DE,LST_VAR
CHECK_MNU_NAME
LD A,(DE)
OR A
JR Z,END_MENU_TAG
CP (HL)
JR NZ,FIND_AGAIN
INC HL
INC DE
DEC BC
LD A,B
OR C
JR NZ,CHECK_MNU_NAME
JR NOMENU
END_MENU_TAG
LD A,"]"
CP (HL)
JR NZ,FIND_AGAIN
INC HL
LD (MENU_ADDRESS),HL
LD A,"["
CPIR
; JR NZ,NOM
DEC HL
XOR A
LD (HL),A
NOM
;;;
CALL CLOSE_MENU_FILE
AND A
RET
NOMENU
LD A,(ANCHOR)
OR A
LD HL,DEFAULT_MENU
JR Z,NM_2
LD HL,LST_VAR
NM_2 CALL PUTVAR
LD A,4
CALL MESSAGE
RF_ERR
CALL CLOSE_MENU_FILE
SCF
RET
;[PARSER]
; HL - MENU CONTENT
; IX - MENU STRUCT
PARSER LD A,(HL)
INC HL
CP " "
JR Z,PARSER
CP 9
JR Z,PARSER
CP 13
JR Z,PARSER
CP 10
JR Z,PARSER
OR A
RET Z
DEC HL
LD BC,0
LD DE,WORKBUF
PARSER1 LD A,(HL)
LD (DE),A
INC HL
INC DE
INC B
JR Z,PARSE_FAILURE
CP "="
JR Z,EQUAL
CP ","
JR Z,FIRST_VAR
CP 13
JR Z,LAST_VAR
CP 10
JR Z,LAST_VAR
OR A
JR NZ,PARSER1
DEC HL
JR LAST_VAR
PARSE_FAILURE
LD A,8
CALL MESSAGE
LD A,1
LD (QUITMODE),A
SCF
RET
LAST_VAR
LD A,B
DEC A
JR Z,PARSER
EXX
LD DE,LST_VAR
LD HL,WORKBUF
CALL COPY_STRING
EXX
PUSH HL
CALL PARSE_WORD
;
XOR A
LD (FST_VAR),A
LD (LST_VAR),A
LD (WORDBUF),A
;
POP HL
JP PARSER
FIRST_VAR
LD A,(FST_VAR)
OR A
JR NZ,PARSER1
LD A,B
DEC A
JR Z,PARSER
EXX
LD DE,FST_VAR
LD HL,WORKBUF
CALL COPY_STRING
EXX
JP PARSER
EQUAL LD A,(WORDBUF)
OR A
JR NZ,PARSER1
LD A,B
EXX
LD DE,WORDBUF
LD HL,WORKBUF
CALL COPY_STRING
EXX
JP PARSER
;HL - SOURCE
;DE - DESTINATION
; A - SIZE
COPY_STRING
LD B,0
LD C,A
LDIR
LD A,B
LD (DE),A
RET
;COPY_IT
; LD HL,WORKBUF
; LD B,0
; LD C,A
; LDIR
; LD A,B
; LD (DE),A
; EXX
; JR PARSER
PARSE_WORD
LD HL,DICT_REF-3
PUSH HL
PARSE_AGAIN
POP HL
INC HL
INC HL
INC HL
LD A,(HL)
INC HL
PUSH HL
LD H,(HL)
LD L,A
LD B,(HL)
INC HL
DJNZ DO_COMPARE
POP HL
SCF
RET
DO_COMPARE
LD DE,WORDBUF
COMPARE
LD A,(DE)
CP "a"
JR C,NOUP
RES 5,A
NOUP CP (HL)
JR NZ,PARSE_AGAIN
INC DE
INC HL
DJNZ COMPARE
POP HL
INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
JP (HL)
DICT_REF
DW WORD_1,PROG_1,WORD_2,PROG_2,WORD_3,PROG_3,WORD_4,PROG_4
DW WORD_5,PROG_5,WORD_6,PROG_6,WORD_7,PROG_7,WORD_8,PROG_1
DW WORD_N
DICT_WORDS
WORD_1 DB 6,"ITEM=",0
WORD_2 DB 7,"TITLE=",0
WORD_3 DB 9,"OPTIONS=",0
WORD_4 DB 10,"AUTOEXIT=",0
WORD_5 DB 13,"DEFAULTITEM=",0
WORD_6 DB 11,"MENUCOLOR=",0
WORD_7 DB 10,"BARCOLOR=",0
WORD_8 DB 10,"MENUITEM=",0
WORD_N DB 1 ; END
;GET TITLE
PROG_2
LD HL,LST_VAR
LD DE,MENU_TITLE
PROG2L1 LD A,(HL)
LDI
OR A
JR NZ,PROG2L1
RET
;GET ITEM
PROG_1 LD HL,FST_VAR
LD A,(HL)
OR A
JR NZ,PROG1L0
LD HL,LST_VAR
PROG1L0 LD DE,(TEXT_INDEX)
PUSH DE
PROG1L1 LD A,(HL)
LDI
OR A
JR NZ,PROG1L1
LD HL,LST_VAR
PUSH DE
PROG1L2 LD A,(HL)
LDI
OR A
JR NZ,PROG1L2
LD (TEXT_INDEX),DE
POP DE
LD (IX+2),E ;PUT ITEM COMMAND ADDRESS
LD (IX+3),D
POP DE
LD (IX+0),E ;PUT ITEMNAME ADDRESS
LD (IX+1),D
LD DE,ITEMSIZE
ADD IX,DE
XOR A
LD (IX+0),A ;PUT END CODE
LD (IX+1),A
LD HL,ITEMCOUNT
INC (HL)
LD A,(FST_VAR)
OR A
RET NZ
LD A,6
CALL MESSAGE
RET
;GET OPTIONS
PROG_3 LD HL,AE_STR
CALL FIND_VAR
RET
FIND_VAR
LD DE,LST_VAR
CALL FIND_STR
RET
FIND_STR
LD (P3_L1+1),HL
P3_L1 LD HL,#0000
LD B,(HL)
P3_L2 INC HL
P3_L3 LD A,(DE)
OR A
RET Z
INC DE
CP "a"
JR C,P3NOUP
RES 5,A
P3NOUP CP (HL)
JR NZ,P3_L3
P3_L4 INC HL
LD A,(DE)
OR A
RET Z
INC DE
CP "a"
JR C,P3NOUP2
RES 5,A
P3NOUP2 CP (HL)
JR NZ,P3_L1
DJNZ P3_L4
LD A,(DE)
CP "!"
JR NC,P3_L1
INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
XOR A
DEC A
RET
;OPTIONS
AE_STR DW AEXIT
DB 7,"AUTOEXIT"
AEXIT DB #00
;AUTOEXIT
PROG_4 LD A,(LST_VAR)
CP "1"
LD A,1
JR Z,P4_YES
DEC A
P4_YES LD (AEXIT),A
RET
;GET DEFAULT ITEM
PROG_5 LD HL,FST_VAR
LD A,(HL)
OR A
JR NZ,P5_AUTORUN
LD HL,LST_VAR
JR P5_L0
P5_AUTORUN
CALL P5_L0
LD HL,LST_VAR
LD C,0
P5_LOOP LD A,(HL)
INC HL
OR A
JR Z,P5_END
CALL STR2NUM
JR P5_LOOP
P5_END LD A,(RUN_TIME)
ADD A,C
LD (GO_TIME),A
LD A,60
CP C
RET NC
LD A,1
LD (QUITMODE),A
LD A,5
CALL MESSAGE
RET
; DEFAULT ITEM
P5_L0 XOR A
LD C,A ;VALUE = 0
P5_L1 LD A,(HL)
INC HL
OR A
JR Z,P5_L2
CP "0"
JR C,P5_L1
CP "9"+1
JR NC,P5_L1
SUB "0"
LD B,A ;SAVE DIGIT
LD A,C
ADD A,A
ADD A,A
ADD A,C
ADD A,A ;VALUE x 10
ADD A,B ;VALUE + DIGIT
LD C,A
JR P5_L1
P5_L2 LD A,C
LD (DEFAULT_ITEM),A
RET
; GET MENUCOLOR
PROG_6 LD A,(SCR_ATTR)
CALL PCHANGE_COLOR
LD (SCR_ATTR),A
RET
PCHANGE_COLOR
LD B,A
LD HL,FST_VAR
LD A,(HL)
OR A
JR Z,P6_NO_INK
PUSH BC
CALL MAKE_COLOR
POP BC
CP 16
JR NC,P6_NO_INK
LD C,A
LD A,B
AND #F0
OR C
LD B,A
P6_NO_INK
LD HL,LST_VAR
LD A,(HL)
OR A
JR Z,P6_NO_PAPER
PUSH BC
CALL MAKE_COLOR
POP BC
CP 16
JR NC,P6_NO_PAPER
AND #0F
RRCA
RRCA
RRCA
RRCA
LD C,A
LD A,B
AND #0F
OR C
LD B,A
P6_NO_PAPER
LD A,B
RET
MAKE_COLOR
LD C,0
P6_L1 LD A,(HL)
INC HL
OR A
JR Z,P6_END
CALL STR2NUM
JR P6_L1
P6_END LD A,C
RET
; C - VALUE "0..255"
; A - DIGIT "0".."9"
STR2NUM CP "0"
RET C
CP "9"+1
CCF
RET C
SUB "0"
LD B,A ;SAVE DIGIT
LD A,C
ADD A,A
ADD A,A
ADD A,C
ADD A,A ;VALUE x 10
ADD A,B ;VALUE + DIGIT
LD C,A
AND A
RET
; GET BARCOLOR
PROG_7 LD A,(SEL_ATTR)
CALL PCHANGE_COLOR
LD (SEL_ATTR),A
RET
;[/PARSER]