;[] ; ; MENU.EXE ; 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 #00 ;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 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 ; 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 ¤«¨­  CL CPIR DEC HL LD BC,128 ;!HARDCODE ¤«¨­  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 ; LD HL,(WorkDirAddr) 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 ;É CALL WIN_PUTCHAR ; LD A,#CD ;Í LD BC,(W_SIZE) TLINE1 PUSH BC LD A,#CD CALL WIN_PUTCHAR POP BC DJNZ TLINE1 LD A,#BB ;» 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 ;È CALL WIN_PUTCHAR ; LD A,#CD ;Í LD BC,(W_SIZE) TLINE2 PUSH BC LD A,#CD CALL WIN_PUTCHAR POP BC DJNZ TLINE2 LD A,#BC ;¼ 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 ;º 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 ;º CALL WIN_PUTCHAR RET HLINE LD A,#C7 ;Ç CALL WIN_PUTCHAR ; LD A,#C4 ;Ä 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 ;¶ 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 WorkDirAddr: WORD 0 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 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 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 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 TEXT_ARRAY EQU $+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+4096 MYWIN EQU #0000-2560*4 ;DS 34*8*2 SCR_BUF EQU #0000-2560*2