mirror of
https://github.com/Tolik-Trek/UserMenu.git
synced 2026-06-15 00:51:35 +03:00
1080 lines
14 KiB
NASM
Executable File
1080 lines
14 KiB
NASM
Executable File
;[]
|
||
;
|
||
; MENU.EXE
|
||
DEFINE App_EXE_Version 0
|
||
|
||
INCLUDE 'shared_includes/constants/dss_equ.inc'
|
||
CR EQU 13
|
||
LF EQU 10
|
||
|
||
MAX_MENU_ITEMS EQU 24
|
||
|
||
ORG #8100-EXE_HEADER.Size
|
||
|
||
EXE_HEADER:
|
||
DB 'EXE' ;EXE ID
|
||
DB App_EXE_Version ;EXE VERSION
|
||
DW EXE_HEADER.Size
|
||
DW #0000 ;CODE OFFSET HIGH
|
||
DW #0000 ;END-BEG ;PRIMARY LOADER
|
||
DW #0000 ;
|
||
DW #0000 ;RESERVED
|
||
DW #0000 ;
|
||
DW START ;LOAD ADDRESS
|
||
DW START ;START ADDRESS
|
||
DW #80FF ;STACK ADDRESS
|
||
DB #FF
|
||
.Size EQU $-EXE_HEADER
|
||
|
||
|
||
START: PUSH IX
|
||
|
||
LD A,(IX+2)
|
||
CP ' '
|
||
JR Z,.skipStartMessage
|
||
|
||
LD A,0
|
||
CALL MESSAGE
|
||
|
||
.skipStartMessage:
|
||
CALL INIT
|
||
;
|
||
LD C,Dss.SysTime
|
||
RST ToDSS
|
||
LD A,B
|
||
LD (RUN_TIME),A
|
||
;
|
||
LD C,0
|
||
RST #30
|
||
; LD C,1
|
||
; RST #30
|
||
LD BC,1*256+Dss.GetMem
|
||
RST ToDSS
|
||
JR NC,M_ALLOK
|
||
LD A,9
|
||
CALL MESSAGE
|
||
POP HL
|
||
JP QUIT
|
||
M_ALLOK
|
||
LD (HNDMEM),A
|
||
LD BC,Dss.SetWin3
|
||
RST ToDSS
|
||
|
||
; OUT (#E2),A
|
||
; LD (HNDMEM),A
|
||
;
|
||
LD HL,INIT_DATA
|
||
LD D,H
|
||
LD E,L
|
||
INC DE
|
||
LD BC,#FFFE-INIT_DATA
|
||
LD (HL),0
|
||
LDIR
|
||
|
||
|
||
LD C,Dss.CurDisk
|
||
RST ToDSS
|
||
ADD A,'A'
|
||
LD (WorkDir),A
|
||
LD A,':'
|
||
LD (WorkDir+1),A
|
||
LD C,Dss.CurDir
|
||
LD HL,WorkDir+2
|
||
RST ToDSS
|
||
|
||
|
||
POP HL
|
||
CALL EX_COMMAND_LINE
|
||
|
||
LD A,(QUITMODE) ;
|
||
OR A ; QUIT MODE
|
||
JP NZ,QUIT ;
|
||
|
||
CALL BUILD_TABLE
|
||
|
||
JP C,QUIT ;IO ERROR
|
||
|
||
LD A,(QUITMODE) ;
|
||
OR A ; SYNTAX ERROR
|
||
JP NZ,QUIT ;
|
||
|
||
|
||
LD A,(ITEMCOUNT)
|
||
CP MAX_MENU_ITEMS
|
||
JR C,NOCUTMENU
|
||
LD A,MAX_MENU_ITEMS
|
||
LD (ITEMCOUNT),A
|
||
NOCUTMENU
|
||
ADD A,4 ;MIN MENU HEIGHT
|
||
LD (WIN_H),A
|
||
LD B,A
|
||
;
|
||
LD A,(GO_TIME)
|
||
INC A
|
||
JR Z,NO_TRM
|
||
LD A,B
|
||
INC A
|
||
INC A
|
||
LD (WIN_H),A
|
||
NO_TRM
|
||
;
|
||
CALL CHECK_WINDOW_SIZE
|
||
CALL WIN_CLS
|
||
|
||
CALL BUILD_MENU
|
||
|
||
RETURN_TO_MENU
|
||
|
||
CALL WIN_SAVE
|
||
CALL WIN_SHOW
|
||
LD C,1
|
||
RST #30
|
||
|
||
CALL M_OBJECT ;INIT MOUSE COORDS
|
||
LD A,(DEFAULT_ITEM)
|
||
OR A
|
||
CALL NZ,MAKE_DEFAULT_ITEM
|
||
|
||
INC A
|
||
ADD A,#10
|
||
; LD A,#11
|
||
CALL MOUSE_OVER
|
||
|
||
NOEXIT
|
||
EI
|
||
HALT
|
||
LD A,(GO_TIME)
|
||
INC A
|
||
CALL NZ,CHECK_TIMER
|
||
|
||
CALL K_OBJECT
|
||
CALL NZ,MOUSE_OVER
|
||
|
||
CALL M_OBJECT
|
||
CALL NZ,MOUSE_OVER
|
||
|
||
LD C,3
|
||
RST #30
|
||
AND 7
|
||
CP 1
|
||
JP Z,CLICK
|
||
CP 2
|
||
JP NZ,NOEXIT
|
||
|
||
QUIT_MENU
|
||
LD C,2
|
||
RST #30
|
||
|
||
CALL WIN_BACK
|
||
|
||
QUIT: LD A,(HNDMEM)
|
||
LD C,Dss.FreeMem
|
||
RST ToDSS
|
||
;
|
||
.loop: LD BC,Dss.Exit
|
||
XOR A
|
||
RST ToDSS
|
||
JR .loop
|
||
|
||
MAKE_DEFAULT_ITEM
|
||
LD HL,ITEMCOUNT
|
||
CP (HL)
|
||
JR C,ACCEPT_DEF_ITEM
|
||
LD A,(HL) ;DEF_ITEM = MAX_ITEM
|
||
ACCEPT_DEF_ITEM
|
||
DEC A
|
||
RET
|
||
|
||
CHECK_TIMER
|
||
LD A,8
|
||
DEC A
|
||
LD (CHECK_TIMER+1),A
|
||
RET NZ
|
||
LD A,8
|
||
LD (CHECK_TIMER+1),A
|
||
;
|
||
LD DE,(OBSOLUTE_CNT_POS)
|
||
CALL LOCATE_
|
||
|
||
CALL GETTIMEOUT
|
||
CALL PRINT99
|
||
PRC_CNT LD A,#00
|
||
INC A
|
||
AND #03
|
||
LD (PRC_CNT+1),A
|
||
LD E,A
|
||
LD D,0
|
||
LD HL,PRC_STR
|
||
ADD HL,DE
|
||
LD A,(HL)
|
||
CALL PRINT_A
|
||
;
|
||
LD C,Dss.SysTime
|
||
RST ToDSS
|
||
LD A,(GO_TIME)
|
||
CP 60 ;GO_TIME > 60?
|
||
JR C,YES_MKSUB
|
||
SUB 60 ;THEN CORRECT IT
|
||
YES_MKSUB
|
||
CP B
|
||
JR Z,RUN_OK
|
||
RET
|
||
|
||
RUN_OK
|
||
JP ENTER_MENU
|
||
|
||
PRC_STR DB "-\\|/"; -\|/
|
||
|
||
|
||
;GET TIMEOUT
|
||
GETTIMEOUT
|
||
LD C,Dss.SysTime
|
||
RST ToDSS
|
||
LD A,(RUN_TIME)
|
||
CP B ;RUNTIME > CURTIME
|
||
JR Z,NO_TO_CORR ;ELSE
|
||
JR C,NO_TO_CORR
|
||
LD A,60
|
||
ADD A,B
|
||
LD B,A
|
||
NO_TO_CORR
|
||
LD A,(GO_TIME)
|
||
SUB B
|
||
RET
|
||
|
||
;50 - RUNTIME
|
||
;12 - DELAY
|
||
;62 - GOTIME
|
||
;
|
||
;IF RUNTIME > CURTIME {CURTIME+60}
|
||
;
|
||
|
||
|
||
; Initialization variables
|
||
|
||
INIT: XOR A
|
||
LD D,A
|
||
LD (QUITMODE),A
|
||
LD (ITEMCOUNT),A
|
||
LD (AEXIT),A
|
||
LD (EXTMENU),A
|
||
LD (ANCHOR),A
|
||
LD (DOEXIT),A
|
||
LD (DEFAULT_ITEM),A
|
||
LD (RUN_TIME),A
|
||
LD (CMD_MENU),A
|
||
DEC A
|
||
LD (GO_TIME),A
|
||
; !TODO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>㤥<EFBFBD> App_EXE_Version = 1
|
||
; LD A,(IX+0)
|
||
; ADD A,3
|
||
; LD E,A
|
||
; EX DE,HL
|
||
; LD D,XH
|
||
; LD E,XL
|
||
; EX DE,HL
|
||
; ADD HL,DE
|
||
; LD (WorkDirAddr),HL
|
||
; ;
|
||
; XOR A
|
||
; LD BC,128 ;!HARDCODE <20><><EFBFBD><EFBFBD><EFBFBD> CL
|
||
; CPIR
|
||
; DEC HL
|
||
; LD BC,128 ;!HARDCODE <20><><EFBFBD><EFBFBD><EFBFBD> CL
|
||
; LD A,'\' ;
|
||
; CPDR
|
||
; INC HL
|
||
; XOR A
|
||
; LD (HL),A
|
||
;
|
||
RET
|
||
;
|
||
|
||
HNDMEM DB 0
|
||
|
||
CLICK
|
||
CALL M_OBJECT
|
||
JP Z,NOEXIT
|
||
PRESS SUB #11
|
||
LD IX,MENU_TABLE
|
||
JR Z,CLICK2
|
||
LD BC,ITEMSIZE
|
||
CLICK1 ADD IX,BC
|
||
DEC A
|
||
JR NZ,CLICK1
|
||
CLICK2 LD L,(IX+2)
|
||
LD H,(IX+3)
|
||
PUSH HL
|
||
; PUSH HL
|
||
CALL WIN_BACK
|
||
LD A,#FF
|
||
LD (C_OBJECT),A
|
||
LD (GO_TIME),A
|
||
;
|
||
LD C,2
|
||
RST #30
|
||
|
||
|
||
POP HL
|
||
|
||
LD BC,Dss.Exec
|
||
RST ToDSS ;Launch the program
|
||
PUSH AF
|
||
; !TODO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>㤥<EFBFBD> App_EXE_Version = 1
|
||
; LD HL,(WorkDirAddr)
|
||
;
|
||
LD HL,WorkDir
|
||
LD C,Dss.ChDir
|
||
RST ToDSS
|
||
;
|
||
POP AF
|
||
JR NC,OK_EXEC
|
||
LD A,7
|
||
CALL MESSAGE
|
||
OK_EXEC
|
||
LD A,(DOEXIT)
|
||
LD C,A
|
||
|
||
LD A,(AEXIT)
|
||
OR C
|
||
JP NZ,QUIT
|
||
|
||
JP RETURN_TO_MENU
|
||
|
||
|
||
K_OBJECT
|
||
LD C,Dss.ScanKey
|
||
RST ToDSS
|
||
RET Z
|
||
CP 13
|
||
JR Z,ENTER_MENU
|
||
LD HL,#011B
|
||
AND A
|
||
SBC HL,DE
|
||
JR Z,ESCAPE
|
||
LD HL,#5800
|
||
AND A
|
||
SBC HL,DE
|
||
JR Z,KEY_UP
|
||
LD HL,#5200
|
||
AND A
|
||
SBC HL,DE
|
||
JR Z,KEY_DOWN
|
||
XOR A
|
||
RET
|
||
|
||
ESCAPE POP HL
|
||
JP QUIT_MENU
|
||
|
||
|
||
ENTER_MENU
|
||
LD A,(C_OBJECT)
|
||
POP HL
|
||
JP PRESS
|
||
|
||
KEY_DOWN
|
||
LD A,(ITEMCOUNT)
|
||
ADD A,#11
|
||
LD B,A
|
||
LD A,(C_OBJECT)
|
||
INC A
|
||
CP B
|
||
RET NZ
|
||
;DEC A
|
||
LD A,#11
|
||
OR A
|
||
RET
|
||
|
||
KEY_UP
|
||
LD A,(C_OBJECT)
|
||
DEC A
|
||
CP #10
|
||
RET NZ
|
||
;INC A
|
||
LD A,(ITEMCOUNT)
|
||
ADD A,#10
|
||
RET
|
||
|
||
|
||
MOUSE_OVER
|
||
LD HL,C_OBJECT
|
||
CP (HL)
|
||
RET Z ;IT'S CURRENT OBJECT
|
||
LD (N_OBJECT),A ;NEW OBJECT
|
||
LD A,(C_OBJECT)
|
||
CALL UNSEL_EVENT
|
||
LD A,(N_OBJECT)
|
||
LD (C_OBJECT),A
|
||
CALL SEL_EVENT
|
||
RET
|
||
|
||
;SEL_ATTR EQU #30
|
||
;SCR_ATTR EQU #1F
|
||
|
||
SEL_EVENT
|
||
CALL GET_OBJECT_PROP
|
||
RET Z ;NO OBJECT
|
||
PUSH BC
|
||
LD D,E
|
||
LD E,L
|
||
INC E
|
||
CALL LOCATE_
|
||
|
||
POP BC
|
||
; DEC C
|
||
LD B,C
|
||
LD C,#83
|
||
LD A,(SEL_ATTR)
|
||
LD E,A
|
||
RST #08
|
||
RET
|
||
|
||
UNSEL_EVENT
|
||
CALL GET_OBJECT_PROP
|
||
RET Z ;NO OBJECT
|
||
PUSH BC
|
||
LD D,E
|
||
LD E,L
|
||
INC E
|
||
CALL LOCATE_
|
||
POP BC
|
||
LD B,C
|
||
LD C,#83
|
||
LD A,(SCR_ATTR)
|
||
LD E,A
|
||
RST #08
|
||
;
|
||
LD A,(GO_TIME)
|
||
INC A
|
||
RET Z
|
||
LD A,#FF
|
||
LD (GO_TIME),A
|
||
LD DE,(OBSOLUTE_CNT_POS)
|
||
CALL LOCATE_
|
||
LD A,"0"
|
||
CALL PRINT_A
|
||
LD A,"0"
|
||
CALL PRINT_A
|
||
LD A," "
|
||
CALL PRINT_A
|
||
;
|
||
RET
|
||
|
||
|
||
N_OBJECT DW #FFFF
|
||
C_OBJECT DW #FFFF
|
||
|
||
|
||
INCLUDE "screen.asm"
|
||
INCLUDE "object.asm"
|
||
INCLUDE "parser.asm"
|
||
|
||
BUILD_MENU
|
||
LD BC,(WIN_W)
|
||
LD B,C
|
||
DEC B
|
||
DEC B
|
||
DEC C
|
||
DEC C
|
||
LD (W_SIZE),BC
|
||
LD DE,#0000
|
||
PUSH DE
|
||
CALL WIN_LOCATE
|
||
LD A,#C9 ;<3B>
|
||
CALL WIN_PUTCHAR
|
||
; LD A,#CD ;<3B>
|
||
LD BC,(W_SIZE)
|
||
TLINE1 PUSH BC
|
||
LD A,#CD
|
||
CALL WIN_PUTCHAR
|
||
POP BC
|
||
DJNZ TLINE1
|
||
LD A,#BB ;<3B>
|
||
CALL WIN_PUTCHAR
|
||
|
||
POP DE
|
||
INC D
|
||
PUSH DE
|
||
CALL WIN_LOCATE
|
||
LD A,#BA
|
||
CALL WIN_PUTCHAR
|
||
LD HL,MENU_TITLE
|
||
LD BC,(W_SIZE)
|
||
CALL CPRINT_Z
|
||
LD A,#BA
|
||
CALL WIN_PUTCHAR
|
||
;
|
||
POP DE
|
||
INC D
|
||
PUSH DE
|
||
CALL WIN_LOCATE
|
||
CALL HLINE
|
||
;
|
||
POP DE
|
||
INC D
|
||
PUSH DE
|
||
CALL WIN_LOCATE
|
||
|
||
LD IX,MENU_TABLE
|
||
LD B,MAX_MENU_ITEMS
|
||
LD C,#11 ;OBJECT ID
|
||
BTABLE
|
||
LD E,(IX+0)
|
||
LD D,(IX+1)
|
||
LD A,E
|
||
OR D
|
||
JR Z,ETABLE
|
||
PUSH BC
|
||
PUSH DE
|
||
LD A,#BA
|
||
CALL WIN_PUTCHAR
|
||
POP HL
|
||
LD BC,(W_SIZE)
|
||
CALL CPRINT_Z
|
||
LD A,#BA
|
||
CALL WIN_PUTCHAR
|
||
;
|
||
LD DE,ITEMSIZE
|
||
ADD IX,DE
|
||
POP BC
|
||
;
|
||
POP DE
|
||
|
||
CALL MK_OBJ
|
||
|
||
INC D
|
||
PUSH DE
|
||
PUSH BC
|
||
CALL WIN_LOCATE
|
||
; RST ToDSS
|
||
POP BC
|
||
INC C
|
||
DJNZ BTABLE
|
||
|
||
ETABLE
|
||
;
|
||
LD A,(GO_TIME)
|
||
INC A
|
||
JR Z,NO_TIME_MSG
|
||
CALL HLINE
|
||
POP DE
|
||
INC D
|
||
PUSH DE
|
||
CALL WIN_LOCATE
|
||
LD A,#BA
|
||
CALL WIN_PUTCHAR
|
||
LD HL,TIMEREM
|
||
LD BC,(W_SIZE)
|
||
CALL RPRINT_Z
|
||
LD A,#BA
|
||
CALL WIN_PUTCHAR
|
||
POP DE
|
||
INC D
|
||
PUSH DE
|
||
CALL WIN_LOCATE
|
||
NO_TIME_MSG
|
||
;
|
||
POP DE
|
||
; CALL ELINE
|
||
; CALL CRLF
|
||
; CALL ELINE
|
||
; CALL CRLF
|
||
|
||
LD A,#C8 ;<3B>
|
||
CALL WIN_PUTCHAR
|
||
; LD A,#CD ;<3B>
|
||
LD BC,(W_SIZE)
|
||
TLINE2 PUSH BC
|
||
LD A,#CD
|
||
CALL WIN_PUTCHAR
|
||
POP BC
|
||
DJNZ TLINE2
|
||
LD A,#BC ;<3B>
|
||
CALL WIN_PUTCHAR
|
||
RET
|
||
|
||
X_OFFSET EQU #16
|
||
Y_OFFSET EQU #0A
|
||
|
||
|
||
MK_OBJ PUSH IX
|
||
PUSH HL
|
||
PUSH DE
|
||
PUSH BC
|
||
LD A,(WIN_X) ;X_OFFSET
|
||
ADD A,E
|
||
LD L,A
|
||
LD A,(WIN_Y) ;Y_OFFSET
|
||
ADD A,D
|
||
LD E,A
|
||
LD A,C
|
||
LD BC,(W_SIZE)
|
||
LD C,B
|
||
LD B,1
|
||
; LD A,#11
|
||
CALL ADD_OBJECT
|
||
POP BC
|
||
POP DE
|
||
POP HL
|
||
POP IX
|
||
RET
|
||
|
||
|
||
|
||
ELINE LD A,#BA ;<3B>
|
||
CALL WIN_PUTCHAR
|
||
; LD A,#20 ;" "
|
||
LD BC,(W_SIZE)
|
||
; LD BC,#2000+Dss.PUTCHAR
|
||
TLINE PUSH BC
|
||
LD A,#20
|
||
CALL WIN_PUTCHAR
|
||
POP BC
|
||
DJNZ TLINE
|
||
LD A,#BA ;<3B>
|
||
CALL WIN_PUTCHAR
|
||
RET
|
||
|
||
HLINE LD A,#C7 ;<3B>
|
||
CALL WIN_PUTCHAR
|
||
; LD A,#C4 ;<3B>
|
||
LD BC,(W_SIZE)
|
||
; LD BC,#2000+Dss.PUTCHAR
|
||
TLINEH PUSH BC
|
||
LD A,#C4
|
||
CALL WIN_PUTCHAR
|
||
POP BC
|
||
DJNZ TLINEH
|
||
LD A,#B6 ;<3B>
|
||
CALL WIN_PUTCHAR
|
||
RET
|
||
|
||
;//VARIABLES
|
||
|
||
ITEMCOUNT
|
||
DB 0
|
||
|
||
W_SIZE
|
||
DB 91
|
||
DB 32
|
||
|
||
;HL - STRING
|
||
; B - SIZE
|
||
|
||
CPRINT_Z
|
||
PUSH HL
|
||
LD E,B
|
||
XOR A
|
||
LD BC,79
|
||
CPIR
|
||
DEC HL
|
||
LD (HL),A
|
||
LD B,E
|
||
POP HL
|
||
LD A,79-1
|
||
SUB C
|
||
LD E,A ; STRING SIZE
|
||
SRL A ; / 2
|
||
LD C,A
|
||
LD A,B
|
||
SRL A ; / 2
|
||
SUB C
|
||
CALL C,A_CORRECT
|
||
LD C,A ; LEFT SPACE
|
||
EX AF,AF'
|
||
LD A,B
|
||
SUB E
|
||
CALL C,A_CORRECT
|
||
SUB C
|
||
CALL C,A_CORRECT
|
||
LD B,A ; RIGHT SPACE
|
||
EX AF,AF'
|
||
JR Z,NOSPACE_L
|
||
REP1 PUSH BC
|
||
LD A," "
|
||
CALL WIN_PUTCHAR
|
||
POP BC
|
||
DEC C
|
||
JR NZ,REP1
|
||
NOSPACE_L
|
||
PUSH BC
|
||
CALL WIN_PCHARS
|
||
POP HL
|
||
INC H
|
||
DEC H
|
||
RET Z ; NOSPACE_R
|
||
REP2 LD A," "
|
||
CALL WIN_PUTCHAR
|
||
DEC H
|
||
JR NZ,REP2
|
||
RET
|
||
|
||
A_CORRECT
|
||
XOR A
|
||
RET
|
||
|
||
;HL - STRING
|
||
; B - SIZE
|
||
|
||
LPRINT_Z
|
||
PUSH HL
|
||
XOR A
|
||
LD C,#FF
|
||
CPIR
|
||
POP HL
|
||
LD A,#FF-1
|
||
SUB C
|
||
LD C,A ; STRING SIZE
|
||
LD A,B
|
||
SUB C
|
||
CALL C,A_CORRECT
|
||
LD B,A
|
||
PUSH BC
|
||
CALL WIN_PCHARS
|
||
POP HL
|
||
INC H
|
||
DEC H
|
||
RET Z ; NOSPACE_R
|
||
REP3 LD A," "
|
||
CALL WIN_PUTCHAR
|
||
DEC H
|
||
JR NZ,REP3
|
||
RET
|
||
|
||
|
||
;HL - STRING
|
||
; B - SIZE
|
||
|
||
RPRINT_Z
|
||
PUSH HL
|
||
XOR A
|
||
LD C,#FF
|
||
CPIR
|
||
POP HL
|
||
LD A,#FF-1
|
||
SUB C
|
||
LD C,A ; STRING SIZE
|
||
LD A,B
|
||
SUB C
|
||
CALL C,A_CORRECT
|
||
LD C,A
|
||
JR Z,NOSPACE_L2
|
||
REP4 PUSH BC
|
||
LD A," "
|
||
CALL WIN_PUTCHAR
|
||
POP BC
|
||
DEC C
|
||
JR NZ,REP4
|
||
NOSPACE_L2
|
||
CALL WIN_PCHARS
|
||
RET
|
||
|
||
EX_COMMAND_LINE
|
||
INC HL
|
||
NEXTPR LD DE,WORKBUF
|
||
LD BC,Dss.EX_Path.GSWITCH
|
||
RST ToDSS
|
||
PUSH AF
|
||
PUSH HL
|
||
LD A,(WORKBUF)
|
||
OR A
|
||
JR Z,EOCL
|
||
CP "-"
|
||
JR Z,ITCKEY
|
||
CP "/"
|
||
JR Z,ITCKEY
|
||
LD HL,WORKBUF
|
||
LD DE,FST_VAR
|
||
LD A,(DE)
|
||
OR A
|
||
JR Z,MOVNAME
|
||
LD DE,LST_VAR
|
||
LD A,1
|
||
LD (ANCHOR),A
|
||
MOVNAME LD A,(HL)
|
||
CP "#"
|
||
JR NZ,MNU_ANCH
|
||
INC HL
|
||
XOR A
|
||
LD (DE),A
|
||
INC A
|
||
LD (ANCHOR),A ;ANCHOR PRESENT
|
||
LD DE,LST_VAR
|
||
LD A,(HL)
|
||
MNU_ANCH
|
||
LDI
|
||
OR A
|
||
JR NZ,MOVNAME
|
||
INC A
|
||
LD (EXTMENU),A ;EXT MENU PRESENT
|
||
EOCL POP HL
|
||
POP AF
|
||
JR NC,NEXTPR
|
||
RET
|
||
|
||
ITCKEY LD A,(WORKBUF+1)
|
||
CP "a"
|
||
JR C,KNU
|
||
RES 5,A
|
||
KNU
|
||
CP "H"
|
||
JR Z,HELP
|
||
CP "?"
|
||
JR Z,HELP
|
||
CP "X"
|
||
JR Z,SETEXIT
|
||
CP "M"
|
||
JR Z,MENUDEFINITION
|
||
LD HL,WORKBUF
|
||
CALL PUTVAR
|
||
LD A,1
|
||
CALL MESSAGE
|
||
LD A,1
|
||
LD (QUITMODE),A
|
||
JR EOCL
|
||
|
||
HELP LD A,2
|
||
CALL MESSAGE
|
||
LD A,1
|
||
LD (QUITMODE),A
|
||
JR EOCL
|
||
|
||
SETEXIT
|
||
LD A,1
|
||
LD (DOEXIT),A
|
||
JR EOCL
|
||
|
||
MENUDEFINITION
|
||
POP HL
|
||
POP AF
|
||
LD DE,FILE_ARRAY
|
||
LD BC,0
|
||
MDEF LD A,(HL)
|
||
INC HL
|
||
CP ";"
|
||
JR NZ,NOBR
|
||
LD A,CR
|
||
LD (DE),A
|
||
INC DE
|
||
INC BC
|
||
LD A,LF
|
||
NOBR LD (DE),A
|
||
INC DE
|
||
INC BC
|
||
OR A
|
||
JR NZ,MDEF
|
||
LD (MDEF_SIZE),BC
|
||
LD A,1
|
||
LD (CMD_MENU),A
|
||
RET
|
||
|
||
MDEF_SIZE
|
||
DW 0
|
||
|
||
MAX_TEXT
|
||
DB 0
|
||
|
||
CHECK_WINDOW_SIZE
|
||
XOR A
|
||
LD (MAX_TEXT),A
|
||
LD IX,MENU_TABLE
|
||
LD B,MAX_MENU_ITEMS
|
||
CH_L1 LD L,(IX+0)
|
||
LD H,(IX+1)
|
||
LD A,L
|
||
OR H
|
||
JR Z,CH_L2
|
||
XOR A
|
||
LD BC,79
|
||
CPIR
|
||
DEC HL
|
||
LD (HL),A
|
||
LD A,79-1
|
||
SUB C
|
||
LD HL,MAX_TEXT
|
||
CP (HL)
|
||
JR C,NOINCTEXT
|
||
LD (HL),A
|
||
NOINCTEXT
|
||
;
|
||
LD DE,ITEMSIZE
|
||
ADD IX,DE
|
||
DJNZ CH_L1
|
||
CH_L2 LD HL,MENU_TITLE
|
||
LD BC,79
|
||
XOR A
|
||
CPIR
|
||
LD A,79-1
|
||
SUB C
|
||
LD HL,MAX_TEXT
|
||
CP (HL)
|
||
JR C,CH_L3
|
||
LD (HL),A
|
||
CH_L3
|
||
LD A,(HL)
|
||
CP 32 ;MIN WINDOW WIDTH
|
||
JR NC,CH_L4
|
||
LD A,32
|
||
CH_L4 INC A
|
||
INC A
|
||
LD (WIN_W),A
|
||
SRL A ;/2
|
||
LD C,A
|
||
LD A,40 ;SCREEN CENTER
|
||
SUB C
|
||
JR NC,CH_L5
|
||
LD A,0
|
||
CH_L5 LD (WIN_X),A
|
||
LD A,(WIN_H)
|
||
SRL A
|
||
LD B,A
|
||
LD A,16 ;SCREEN CENTER
|
||
SUB B
|
||
JR NC,CH_L6
|
||
LD A,0
|
||
CH_L6 LD (WIN_Y),A
|
||
LD A,(GO_TIME)
|
||
INC A
|
||
RET Z
|
||
LD HL,(WIN_XY)
|
||
LD A,(WIN_H)
|
||
ADD A,H
|
||
DEC A
|
||
DEC A
|
||
LD H,A
|
||
LD A,(WIN_W)
|
||
ADD A,L
|
||
SUB 4
|
||
LD L,A
|
||
LD (OBSOLUTE_CNT_POS),HL
|
||
RET
|
||
|
||
|
||
OBSOLUTE_CNT_POS
|
||
DW 0
|
||
|
||
MSG0 DB 0
|
||
;0
|
||
DB "User Menu v1.01, Copyright "
|
||
DB "2002 (c) Peters Plus LTD",CR,LF
|
||
DB "2023 (c) Sprinter Team",CR,LF,CR,LF,0
|
||
;1
|
||
DB " Error: Unknown switch: %1",CR,LF,0
|
||
;2
|
||
DB " Usage: MENU.EXE -switch [menufile.mnu] [menuname]",CR,LF,CR,LF
|
||
DB " Switches:",CR,LF
|
||
DB " -h, -? Help page.",CR,LF
|
||
DB " -x Quit from menu when launched program will terminated.",CR,LF
|
||
DB " -m <menu> Define menu in the command line.",CR,LF
|
||
DB CR,LF
|
||
DB " Menu command:",CR,LF
|
||
DB " Title= Define Menu title",CR,LF
|
||
DB " MenuColor= Set menu colors",CR,LF
|
||
DB " BarColor= Set cursor bar colors",CR,LF
|
||
DB " AutoExit= Auto quit menu",CR,LF
|
||
DB " DefaultItem= Set default menu item",CR,LF
|
||
DB " MenuItem= Define menu item",CR,LF
|
||
DB CR,LF
|
||
DB 0
|
||
;3
|
||
DB " Error: Can't open '%1' menu file.",CR,LF,0
|
||
;4
|
||
DB " Error: Menu section [%1] - not found.",CR,LF,0
|
||
;5
|
||
DB " Error: Invalid time parameter in 'DefaultItem='.",CR,LF,0
|
||
;6
|
||
DB " Error: Missing parameter in the item definition.",CR,LF,0
|
||
;7
|
||
DB CR,LF," Error: Launching has been failed.",CR,LF,0
|
||
;8
|
||
DB " Error: Invalid syntax, parse failure.",CR,LF,0
|
||
;9
|
||
DB " Error: Not enough memory.",CR,LF,0
|
||
;10
|
||
TIMEREM DB "Time remaining: 00 ",0
|
||
DB 0
|
||
DB 0
|
||
MSG1
|
||
|
||
MENU_TITLE DB "User Menu",0
|
||
DS 32
|
||
|
||
MENUFILE
|
||
DB "[MENU]",CR,LF
|
||
MENUFILE2
|
||
DB "title=It's a hidden User Menu :)",CR,LF
|
||
DB "item=Flex Navigator, \\fn\\fn.exe",CR,LF
|
||
DB "item=Command prompt, \\system.exe /s",CR,LF
|
||
DB "item=I hope that it a small program will help you in work at the Sprinter, \\system.exe @echo You found the secret feature :)",CR,LF
|
||
DB 0
|
||
|
||
;// DEFAULT VARIABLES
|
||
DEFAULT_FILE
|
||
DB "default.mnu",0,0
|
||
DEFAULT_MENU
|
||
DB "MENU",0,0,0,0,0
|
||
|
||
EXTMENU DB 0
|
||
ANCHOR DB 0
|
||
DOEXIT DB 0
|
||
QUITMODE
|
||
DB 0
|
||
CMD_MENU
|
||
DB 0
|
||
DEFAULT_ITEM
|
||
DB 0
|
||
SCR_ATTR
|
||
DB #1F
|
||
SEL_ATTR
|
||
DB #30
|
||
|
||
RUN_TIME
|
||
DB 0
|
||
GO_TIME DB #FF
|
||
|
||
TEXT_INDEX
|
||
DW TEXT_ARRAY
|
||
|
||
|
||
; !TODO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>㤥<EFBFBD> App_EXE_Version = 1
|
||
;WorkDirAddr: WORD 0
|
||
|
||
|
||
INIT_DATA
|
||
|
||
FST_VAR EQU $ ;DS 256
|
||
LST_VAR EQU $+256 ;DS 256
|
||
WORKBUF EQU $+256+256 ;DS 256
|
||
WORDBUF EQU $+256+256+256 ;DS 256
|
||
|
||
MENU_TABLE EQU $+256+256+256+256
|
||
;!FIXIT <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
ITEM_DEFINE
|
||
DW 0 ;ITEM 1 TEXT ADDRESS
|
||
DW 0 ;ITEM 1 COMMAND ADDRESS
|
||
DB 0,0 ;LEFT AND RIGHT
|
||
DB 0,0 ;TOP AND BOTTOM
|
||
ITEM_DEFINE_END
|
||
ITEMSIZE EQU ITEM_DEFINE_END-ITEM_DEFINE
|
||
;
|
||
; DW 0 ;ITEM 2 TEXT
|
||
; DW 0 ;ITEM 2 COMMAND
|
||
; DB 0,0 ;LEFT AND RIGHT
|
||
; DB 0,0 ;TOP AND BOTTOM
|
||
;
|
||
; DW 0 ;END
|
||
; DS 256
|
||
WorkDir EQU $+256+256+256+256+256
|
||
|
||
TEXT_ARRAY EQU $+256+256+256+256+256+256
|
||
; "Title name",0
|
||
; "Item 1",0
|
||
; "C:\fn\fn.exe",0
|
||
; DS 4096
|
||
|
||
FILE_ARRAY EQU $+256+256+256+256+256+256+4096
|
||
|
||
MYWIN EQU #0000-2560*4 ;DS 34*8*2
|
||
|
||
SCR_BUF EQU #0000-2560*2
|