mirror of
https://github.com/Tolik-Trek/UserMenu.git
synced 2026-06-15 00:51:35 +03:00
550 lines
6.5 KiB
NASM
Executable File
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 #10
|
|
RET C
|
|
LD (MNU_FHND),A
|
|
RET
|
|
|
|
CLOSE_MENU_FILE
|
|
LD A,(MNU_FHND)
|
|
LD C,DSS_CLOSE
|
|
RST #10
|
|
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 #10
|
|
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]
|