mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
* added hack to handle tunes * quiet clean * added chmod for execution * suppress warnings * Multi-boot fixes * the windows build somehow thinks that these filesystems are cpm3. * credit and primitive instructions * Update sd.asm Cosmetic fix. * make compile shut up about conditionals * Add bin2asm for linus and update build to process font files under linix * fixed quoted double quote bug, added tests * added tests * added bin2asm for font file source creation * Revert linux bin2asm font stuff * added rule for font source generation * build fonts * added directory mapping cache. if the same directory is being hit as last run, we don't need to rebuild the map. will likely break if you are running more than one at a time, in that the cache will be ineffective. also, if the directory contents change, this will also break. * removed strip. breaks osx * added directory tag so . isn't matched all over the place * added real cache validation * fixed build * this file is copied from optdsk.lib or optcmd.lib * install to ../HBIOS * prerequisite verbosity * diff soft failure and casefn speedup * added lzsa * added lzsa * removed strip. breaks on osx * added clobber * added code to handle multiple platform rom builds with rom size override * added align and 0x55 hex syntax * default to hd64180 * added N8 capability * added SBC_std.rom to default build * added support for binary diff * diff fixes * clean, identical build. font source generator emitted .align. this does not match the windows build * Upgrade NZCOM to latest * Misc. Cleanup * fixed expression parser bug : ~(1|2) returned 0xfe * added diff build option * Update Makefile Makefile enhancement to better handle ncurses library from Bob Dunlop. * Update sd.asm Back out hack for uz80as now that Curt fixed it. * Misc. Cleanup * UNA Catchup UNA support was lacking some of the more recent behavior changes. This corrects most of it. * Add github action for building RomWBW * Bump Pre-release Version * Update build.yml Added "make clean" which will remove temporary files without removing final binary outputs. * Update Makefile Build all ROM variants by default in Linux/Mac build. * Update Makefile * Update Makefile * Update Makefile * Update Makefile * Update Makefile * Update Makefile * Update Makefile * Update Makefile * Update Makefile * Update for GitHub Build Case issue in TASM includes showing up in GitHub build. This should correct that. * Added an gitignore files to exclude generated files * Removed Tunes/clean.cmd and Tunes/ReadMe.txt - as make clean removes them * Build.sh: marked as executable chmod +x Build.sh * Fix to HBIOS/build.sh When adding files to rom disk, if files were missing, it would error out. It appears the intent is to skip non-existing files. Updated to log out correctly for missing files - and continue operation. * Update Microsoft NASCOM BASIC.docx Nascom manual, text version by Jan S (full name unknown) * Fix issue with Apps/Tune not making If dest directory does not exist, fails to make Apps * Create ReadMe.txt * Update Makefile * Update Build.sh * Make .gitignores for Tools/unix more specific * cpmtools Update Updated cpmtools applications (Windows only). Removed hack in diskdefs that is no longer required. * HBIOS Proxy Temp Stack Enhancement Reuse the bounce buffer area as the temporary stack space required briefly in HBX_INVOKE when transitioning banks. Increases size of temporary stack space to 64 bytes. * Update ReadMe.txt * HBIOS - clean up TMPSTK * Update hbios.asm Minor cosmetic changes. * Build Process Updates Minor udpates to build process to improve consistency between Windows and Mac/Linux builds. * Update hbios.asm Add improved interrupt protection to HBIOS PEEK, POKE, and BNKCPY functions. * hbios - wrap hbx_bnkcpy * hbios - adjust hbx_peek hbx_poke guards * Update hbios.asm Adjusted used of DI/EI for PEEK and POKE to regain a bit of INTSTK space. Added code so that HB_INVBNK can be used as a flag indicating if HBIOS is active, $FF is inactive, anything else means active. * Add HBIOS MuTex * Initial Nascom basic ecb-vdu graphics set and reset for 80x25b screen with 256 character mod * Finalize Pre-release 34 Final support for FreeRTOS * Update nascom.asm Optimization, cleanup, tabs and white spaces * IDE & PPIDE Cleanup * Clean up Make version include files common. * Update Makefile * Update Makefile * Build Test * Build Test * Build Fixes * Update nascom.asm Cleanup * Update nascom.asm Optimization * hbios - temp stack tweak * Update hbios.asm Comments on HBX_BUF usage. * Update nascom.asm Optimization * Update nascom.asm Setup ECB-VDU build option, remove debug code * Update nascom.asm Set default build. update initialization * Update nascom.asm Make CLS clear vdu screen * Update nascom.asm Fixup top screen line not showing * Add SC131 Support Also cleaned up some ReadMe files. * HBIOS SCZ180 - remove mutex special files * HBIOS SCZ180 - adjust mutex comment * Misc. Cleanup Includes some minor improvements to contents in some disk images. * Delete FAT.COM Changing case of FAT.COM extension to lowercase. * Create FAT.com Completing change of case in extension of FAT.com. * Update Makefile Remove ROM variants that just have the HBIOS MUTEX enabled. Users can easily enable this in a custom build. * Cleanup Removed hack from Images Makefile. Fixed use of DEFSERCFG in various places. * GitHub CI Updates Adds automation of build and release assets upon release. * Prerelease 36 General cleanup * Build Script Cleanups * Config File Cleanups * Update RomWBW Architecture General refresh for v2.9.2 * Update vdu.asm Removed a hack in VDU driver that has existed for 8 years. :-) * Fix CONSOLE Constant Rename CIODEV_CONSOLE constant to CIO_CONSOLE because it is a unit code, not a device type code. Retabify TastyBasic. * Minor Bug Fixes - Disk assignment edge case - CP/M 3 accidental fall thru - Cosmetic updates * Update util.z80 * Documentation Cleanup * Documentation Update * Documentation Update * Documentation Updates * Documentation Updates * Create Common.inc * Documentation Updates * Documentation Updates * doc - a few random fixes * Documentation Cleanup * Fix IM 0 Build Error in ACIA * Documentation Updates * Documentation Cleanup * Remove OSLDR The OSLDR application was badly broken and almost impossible to fix with new expanded OS support. * Bug Fixes - Init RAM disk at boot under CP/M 3 - Fix ACR activation in TUNE * FD Motor Timeout - Made FDC motor timeout smaller and more consistent across different speed CPUs - Added "boot" messaging to RTC * Cleanup * Cleanup - Fix SuperZAP to work under NZCOM and ZPM3 - Finalize standard config files * Minor Changes - Slight change to ZAP configuration - Added ZSDOS.ZRL to NZCOM image * ZDE Upgrade - Upgraded ZDE 1.6 -> 1.6a * Config File Tuning * Pre-release for Testing * cfg - mutex consistent config language * Bump to Version 3.0 * Update SD Card How-To Thanks David! * update ReadMe.md Remove some odd `\`. * Update ReadMe.txt * Update ReadMe.md * Update Generated Doc Files * Improve XModem Startup - Extended startup timeout for XM.COM so that it doesn't timeout so quickly while host is selecing a file to send. - Updated SD Card How-To from David Reese. * XModem Timing Refinements * TMS Driver Z180 Improvements - TMS driver udpated to insert Z180 I/O waitstates internally so other code can run at full speed. - Updated How-To documents from David. - Fixed TUNE app to properly restore Z180 I/O waitstates after manipulating them. * CLRDIR and ZDE updates - CLRDIR has been updated by Max Scane for CP/M 3 compatibility. - A minor issue in the preconfigured ZDE VT100 terminal escape sequences was corrected. * Fix Auto CRT Console Switch on CP/M 3 * Handle lack of RTC better DSRTC driver now correctly returns an error if there is no RTC present. * Minor RTC Updates * Finalize v3.0.1 Cleanup release for v3.0 * New ROMLDR and INTRTC driver - Refactored romldr.asm - Added new periodic timer based RTC driver * CP/M 3 Date Hack - Hack to allow INTRTC to increment time without destroying the date * Update romldr.asm Work around minor Linux build inconsistency * Update Apps for New Version * Revert "Update Apps for New Version" This reverts commitad80432252. * Revert "Update romldr.asm" This reverts commit4a9825cd57. * Revert "CP/M 3 Date Hack" This reverts commit153b494e61. * Revert "New ROMLDR and INTRTC driver" This reverts commitd9bed4563e. * Start v3.1 Development * Update FDISK80.COM Updated FDISK80 to allow reserving up to 256 slices. * Update sd.asm For Z180 CSIO, ensure that xmit is finished, before asserting CS for next transaction. * Add RC2014 UART, Improve SD protocol fix - RC2014 and related platforms will autodetect a UART at 0xA0 and 0xA8 - Ensure that CS fully brackets all SD I/O * ROMLDR Improvements .com files can now be started from CP/M and size of .com files has been reduced so they always fit. * Update commit.yml Run commit build in all branches * Update commit.yml Run commit build for master and dev branches * Improved clock driver auto-detect/fallback * SIO driver now CTC aware The SIO driver can now use a CTC (if available) to provide much more flexible baud rate programming. * CTC driver fine tuning * Update xmdm125.asm Fixed a small issue in core XM125 code that caused a file write error message to not be displayed when it should be. * CF Card compatibility improvement Older CF Cards did not reset IDE registers to defaults values when reset. Implemented a work around. * Update ACIA detection ACIA should no longer be detected if there is also a UART module in the system. * Handle CTC anomaly Small update to accommodate CTC behavior that occurs when the CTC trigger is more than half the CTC clock. * Update acia.asm Updated ACIA detection to use primary ACIA port instead of phantom port. * Update acia.asm Fix bug in ACIA detection. Thanks Alan! * MacOS Build Improvement Build script updated to improve compatibility with MacOS. Credit to Fredrik Axtelius for this. * HBIOS Makefile - use env vars for target Allow build ROM targets to be restricted to just one platform thru use of ENV vars: ROM_PLATFORM - if defined to a known platform, only this platform is build - defaults to std config ROM_CONFIG - sets the desired platform config - defaults to std if the above ENVs are not defined, builds all ROMs * Added some more gitignores * Whitespace changes (crlf) * HBIOS: Force the assembly to fail for vdu drivers if function table count is not correct * Whitespace: trailing whitespaces * makefile: updated some make scripts to use when calling subdir makefiles * linux build: update to Build.sh fix for some platforms The initialization of the Rom dat file used the pipe (|) operator to build an initial empty file. But the pipe operator | may sometimes return a non-zero exit code for some linux platforms, if the the streams are closed before dd has fully processed the stream. This issue occured on a travis linux ubuntu image. Solution was to change to redirection. * Bump version * Enhance CTC periodic timer Add ability to use TIMER mode in CTC driver to generate priodic interrupts. * HBIOS: Added support for sound drivers New sound driver support with initial support for the SN76489 chip New build configuration entry: * SN76489ENABLE Ports are currently locked in with: * SN76489_PORT_LEFT .EQU $FC ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT) * SN76489_PORT_RIGHT .EQU $F8 ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT) * Miscellaneous Cleanup No functional changes. Co-authored-by: curt mayer <curt@zen-room.org> Co-authored-by: Wayne Warthen <wwarthen@gmail.com> Co-authored-by: ed <linux@maidavale.org> Co-authored-by: Dean Netherton <dnetherton@dius.com.au> Co-authored-by: ed <ed@maidavale.org> Co-authored-by: Phillip Stevens <phillip.stevens@gmail.com> Co-authored-by: Dean Netherton <dean.netherton@gmail.com>
1510 lines
30 KiB
Plaintext
1510 lines
30 KiB
Plaintext
;
|
||
; PROGRAM: MENU
|
||
; AUTHOR: RICHARD CONN
|
||
; VERSION: 3.2
|
||
; DATE: 10 June 84
|
||
; PREVIOUS VERSIONS: 3.1 (28 Mar 84), 3.0 (18 Mar 84)
|
||
; DERIVATION. MENU 1.4 for ZCPR2
|
||
;
|
||
VERS EQU 32
|
||
|
||
;
|
||
; MENU is the ZCPR3 Menu Processor. It loads, looks for the MENU.MNU
|
||
; file, and then displays it to the user (optionally) and prompts him for
|
||
; a single-character command. The ZCPR3 Multiple Command Line Buffer must
|
||
; be installed for MENU to work, and MENU uses this buffer to chain to the
|
||
; programs selected by the user and return to itself at the proper place.
|
||
;
|
||
; MENU supports multiple menus within one MENU.MNU file. When a command
|
||
; is invoked, MENU returns to the menu the command came from.
|
||
;
|
||
; MENU will ONLY RUN on ZCPR3 systems with the Multiple Command Line
|
||
; Buffer Option enabled.
|
||
;
|
||
|
||
;
|
||
; Menu Constants
|
||
;
|
||
sysmenu equ 0 ;System Menu Enabled? 0=no, 1=yes
|
||
|
||
; 1 Special Menu Command Chars
|
||
RNM EQU '>' ;NEXT MENU
|
||
RNMP EQU '.' ;NEXT MENU PRIME (ALTERNATE)
|
||
RLM EQU '<' ;LAST MENU
|
||
RLMP EQU ',' ;LAST MENU PRIME (ALTERNATE)
|
||
RFM EQU '*' ;FIRST MENU
|
||
;
|
||
if sysmenu
|
||
RSM EQU '$' ;SYSTEM MENU (PASSWORD REQUIRED)
|
||
; THIS IS SAME AS CONTROL CHAR
|
||
endif ;sysmenu
|
||
|
||
; 2 Internal Menu Control Chars
|
||
MCMD EQU ':' ;COMMAND TO JUMP TO ANOTHER MENU
|
||
PCHAR EQU '"' ;INDICATES AUTO PROMPT FOR SPECIFIC CMD
|
||
MINDIC EQU '#' ;MENU SECTION INDICATOR
|
||
MFIRST EQU '%' ;FIRST MENU INDICATOR
|
||
GOPTION EQU '-' ;GLOBAL OPTION INDICATOR
|
||
WOPTION EQU '!' ;ACTIVATES WAIT UPON RETURN
|
||
|
||
; 3 Menu Option Chars
|
||
COPTION EQU 'C' ;DISPLAY COMMAND LINE TO USER
|
||
DOPTION EQU 'D' ;DISPLAY MENU TO USER
|
||
POPTION EQU 'P' ;PAGE OUT MENU DISPLAY TO USER
|
||
XOPTION EQU 'X' ;DISABLE ZCPR3 RETURN
|
||
|
||
; 4 Miscellaneous
|
||
IBUFSZ EQU 254 ;SIZE OF INPUT LINE BUFFER
|
||
VARFLAG EQU '$' ;VARIABLE FLAG
|
||
;(FOLLOWED BY D,U,Fn,Nn,Tn)
|
||
CMDSEP EQU ';' ;ZCPR3 COMMAND SEPARATOR
|
||
|
||
;
|
||
; Enter/Exit Standout Mode (Recommended that these values not be changed)
|
||
;
|
||
DIM EQU 'A'-'@' ; ^A TO ENTER STANDOUT
|
||
NOTDIM EQU 'B'-'@' ; ^B TO EXIT STANDOUT
|
||
|
||
;
|
||
; MACRO Library of Definitions
|
||
;
|
||
MACLIB Z3BASE.LIB
|
||
|
||
;
|
||
; ZCPR3 CONSTANTS
|
||
;
|
||
wboot equ 0
|
||
bentry equ 5
|
||
fcb equ 5ch
|
||
tbuff equ 80h
|
||
BEL equ 7
|
||
CR equ 0dh
|
||
LF equ 0ah
|
||
CTRLC equ 'C'-'@'
|
||
TAB equ 'I'-'@'
|
||
CTRLZ equ 'Z'-'@'
|
||
|
||
;
|
||
; MACROS TO PROVIDE Z80 EXTENSIONS
|
||
; MACROS INCLUDE:
|
||
;
|
||
; BR - JUMP RELATIVE
|
||
; BRC - JUMP RELATIVE IF CARRY
|
||
; BRNC - JUMP RELATIVE IF NO CARRY
|
||
; BRZ - JUMP RELATIVE IF ZERO
|
||
; BRNZ - JUMP RELATIVE IF NO ZERO
|
||
; BJNZ - DECREMENT B AND JUMP RELATIVE IF NO ZERO
|
||
; PUTRG - SAVE REGISTERS
|
||
; GETRG - RESTORE REGISTERS
|
||
;
|
||
|
||
;
|
||
;
|
||
; Z80 MACRO EXTENSIONS
|
||
;
|
||
BR MACRO ?N ;;JUMP RELATIVE
|
||
IF I8080 ;;8080/8085
|
||
JMP ?N
|
||
ELSE ;;Z80
|
||
.Z80
|
||
JR ?N
|
||
.8080
|
||
ENDIF ;;I8080
|
||
ENDM
|
||
;
|
||
BRC MACRO ?N ;;JUMP RELATIVE ON CARRY
|
||
IF I8080 ;;8080/8085
|
||
JC ?N
|
||
ELSE ;;Z80
|
||
.Z80
|
||
JR C,?N
|
||
.8080
|
||
ENDIF ;;I8080
|
||
ENDM
|
||
;
|
||
BRNC MACRO ?N ;;JUMP RELATIVE ON NO CARRY
|
||
IF I8080 ;;8080/8085
|
||
JNC ?N
|
||
ELSE ;;Z80
|
||
.Z80
|
||
JR NC,?N
|
||
.8080
|
||
ENDIF ;;I8080
|
||
ENDM
|
||
;
|
||
BRZ MACRO ?N ;;JUMP RELATIVE ON ZERO
|
||
IF I8080 ;;8080/8085
|
||
JZ ?N
|
||
ELSE ;;Z80
|
||
.Z80
|
||
JR Z,?N
|
||
.8080
|
||
ENDIF ;;I8080
|
||
ENDM
|
||
;
|
||
BRNZ MACRO ?N ;;JUMP RELATIVE ON NO ZERO
|
||
IF I8080 ;;8080/8085
|
||
JNZ ?N
|
||
ELSE ;;Z80
|
||
.Z80
|
||
JR NZ,?N
|
||
.8080
|
||
ENDIF ;;I8080
|
||
ENDM
|
||
;
|
||
BJNZ MACRO ?N ;;DECREMENT B AND JUMP RELATIVE ON NO ZERO
|
||
IF I8080 ;;8080/8085
|
||
DCR B
|
||
JNZ ?N
|
||
ELSE ;;Z80
|
||
.Z80
|
||
DJNZ ?N
|
||
.8080
|
||
ENDIF ;;I8080
|
||
ENDM
|
||
;
|
||
PUTRG MACRO
|
||
PUSH H ;;SAVE REGISTERS IN ORDER
|
||
PUSH D
|
||
PUSH B
|
||
ENDM
|
||
;
|
||
GETRG MACRO
|
||
POP B ;;RESTORE REGISTERS IN ORDER
|
||
POP D
|
||
POP H
|
||
ENDM
|
||
;
|
||
; END OF Z80 MACRO EXTENSIONS
|
||
;
|
||
|
||
;
|
||
; Externals from SYSLIB
|
||
;
|
||
ext z3vinit,cls,stndout,stndend
|
||
ext getcl1,putcl,getsh2,qshell,retud,getefcb,shpush,shpop
|
||
ext getshm,putshm,moveb,getfn2,pfn1,getcrt,getzrun,putzex,putcst
|
||
ext eprint,cin,cout,caps,crlf,pafdc,madc,bline,initfcb,sksp
|
||
ext f$open,f$close,f$read,codend,hmovb
|
||
|
||
;
|
||
; Environment Definition
|
||
;
|
||
if z3env ne 0
|
||
;
|
||
; External ZCPR3 Environment Descriptor
|
||
;
|
||
jmp start
|
||
db 'Z3ENV' ;This is a ZCPR3 Utility
|
||
db 1 ;External Environment Descriptor
|
||
z3eadr:
|
||
dw z3env
|
||
start:
|
||
lhld z3eadr ;pt to ZCPR3 environment
|
||
;
|
||
else
|
||
;
|
||
; Internal ZCPR3 Environment Descriptor
|
||
;
|
||
MACLIB SYSENV.LIB
|
||
z3eadr:
|
||
jmp start
|
||
SYSENV
|
||
start:
|
||
lxi h,z3eadr ;pt to ZCPR3 environment
|
||
endif
|
||
|
||
;
|
||
; Start of Program -- Initialize ZCPR3 Environment
|
||
;
|
||
call z3vinit ;initialize the ZCPR3 Env and the VLIB Env
|
||
jmp strt
|
||
;
|
||
; This is the FCB which defines the default name of the MENU.MNU file
|
||
;
|
||
if sysmenu
|
||
ppass:
|
||
db 'SYSTEM ',0 ;system password
|
||
endif ;sysmenu
|
||
;
|
||
menufcb:
|
||
db 0 ;FCB for MENU.MNU
|
||
db 'MENU '
|
||
db 'MNU'
|
||
ds 4
|
||
scratch: ;this doubles as a scratch area
|
||
ds 16 ;buffer definition is at end of program
|
||
ds 4 ;36 bytes total
|
||
|
||
;
|
||
; Start of Program
|
||
;
|
||
strt:
|
||
;
|
||
; Check for Shell Stack
|
||
;
|
||
call getsh2 ;get shell status
|
||
brnz strt0 ;skip over shell init
|
||
call eprint
|
||
db ' No Shell Stack',0
|
||
ret
|
||
;
|
||
; See if Command Line Available
|
||
;
|
||
strt0:
|
||
call getcl1 ;get line
|
||
brnz strt01
|
||
call eprint
|
||
db ' No Command Line',0
|
||
ret
|
||
;
|
||
; See if this program was invoked as a shell
|
||
;
|
||
strt01:
|
||
call qshell ;find out from ZCPR3 environment
|
||
push psw ;save status
|
||
xra a ;A=0
|
||
call putcst ;put command status (normal = 0)
|
||
pop psw ;restore status
|
||
jz menu ;do not push onto stack if invoked as a shell
|
||
;
|
||
; Set Name of Shell from External FCB if Possible or From Default if Not
|
||
;
|
||
setshn:
|
||
call retud ;get run address
|
||
lxi h,shdisk ;pt to shell disk
|
||
mov a,b ;get disk
|
||
adi 'A' ;convert to letter
|
||
mov m,a ;set disk letter
|
||
inx h ;pt to user 10's
|
||
mov a,c ;get user number
|
||
mvi b,10 ;subtract 10's
|
||
mvi d,'0' ;set char
|
||
setshn1:
|
||
sub b ;subtract
|
||
brc setshn2
|
||
inr d ;increment digit
|
||
br setshn1
|
||
setshn2:
|
||
add b ;get 1's
|
||
mov m,d ;set 10's digit for user
|
||
inx h ;pt to 1's digit
|
||
adi '0' ;compute 1's digit
|
||
mov m,a ;set 1's digit
|
||
call getefcb ;get ptr to external fcb
|
||
brz strt02 ;no external FCB, so use default name
|
||
inx h ;pt to program name
|
||
lxi d,shname ;pt to string
|
||
mvi b,8 ;8 chars
|
||
call moveb ;copy into buffer
|
||
;
|
||
; Check for File Name and Set It If Given
|
||
;
|
||
strt02:
|
||
lxi h,fcb+1 ;pt to file name
|
||
lxi d,menufcb+1
|
||
mvi b,11 ;11 chars
|
||
mov a,m ;get first char
|
||
cpi ' '
|
||
cnz moveb ;copy if one present
|
||
;
|
||
; Set File Name in MENUFCB into Line
|
||
;
|
||
lxi h,menufcb+1 ;set shell file name
|
||
lxi d,shfile ;pt to shell file
|
||
mvi b,8 ;8 chars
|
||
strt03:
|
||
mov a,m ;get next char
|
||
cpi ' ' ;done?
|
||
brz strt04
|
||
stax d ;put char
|
||
inx d ;pt to next
|
||
strt04:
|
||
inx h ;pt to next
|
||
bjnz strt03
|
||
mvi a,'.' ;put dot
|
||
stax d
|
||
inx d ;pt to next
|
||
mvi b,3 ;file type
|
||
strt05:
|
||
mov a,m ;copy
|
||
stax d
|
||
inx h ;pt to next
|
||
inx d
|
||
bjnz strt05
|
||
xra a ;store zero
|
||
stax d
|
||
|
||
;
|
||
; Set Menu Number
|
||
;
|
||
mvi b,1 ;shell message 1
|
||
xra a ;menu 0
|
||
call putshm ;set message
|
||
|
||
;
|
||
; Push Name of Shell onto Stack
|
||
;
|
||
lxi h,shdisk ;pt to name of shell
|
||
call shpush ;push shell onto stack
|
||
brnz strt2
|
||
;
|
||
; Shell Successfully Installed
|
||
;
|
||
call eprint
|
||
db ' Shell Installed',0
|
||
ret
|
||
;
|
||
; Shell Stack Push Error
|
||
;
|
||
strt2:
|
||
cpi 2 ;shell stack full?
|
||
brnz strt3
|
||
;
|
||
; Shell Stack is Full
|
||
;
|
||
call eprint
|
||
db ' Shell Stack Full',0
|
||
ret
|
||
;
|
||
; Shell Stack Entry Size is too small for command line
|
||
;
|
||
strt3:
|
||
call eprint
|
||
db ' Shell Stack Entry Size',0
|
||
ret
|
||
;
|
||
; Check for ZEX Execution and Pass ZEX if So
|
||
;
|
||
menu:
|
||
call getzrun ;is ZEX running?
|
||
brz runmenu ;process menu if not
|
||
br menuz1 ;skip new line
|
||
menuzex:
|
||
call crlf ;new line
|
||
menuz1:
|
||
call eprint
|
||
db 'Menu> ',0
|
||
mvi a,1 ;tell ZEX that it is prompted
|
||
call putzex
|
||
call codend ;set up buffer
|
||
mvi m,ibufsz ;set size
|
||
mvi a,0FFH ;capitalize
|
||
call bline ;get line from ZEX
|
||
xra a ;A=0
|
||
call putzex ;resume ZEX normally
|
||
call sksp ;skip over leading spaces
|
||
mov a,m ;check for comment
|
||
cpi ';'
|
||
brz menuzex
|
||
xchg ;DE pts to command line
|
||
xra a ;don't display command
|
||
sta cpflag
|
||
jmp runcmnd ;run command pted to by DE
|
||
;
|
||
; Begin Menu Processing
|
||
;
|
||
runmenu:
|
||
call eprint
|
||
db 'MENU Version '
|
||
db (vers/10)+'0','.',(vers mod 10)+'0',0
|
||
;
|
||
; Check for Wait Flag and Wait if So
|
||
;
|
||
mvi b,0 ;get shell message 0
|
||
call getshm
|
||
ani 80h ;check for wait flag
|
||
cnz sak ;Strike Any Key
|
||
;
|
||
; Open Menu File
|
||
;
|
||
lxi h,fcb ;copy FCB into MENU FCB
|
||
lxi d,menufcb
|
||
mvi b,36 ;36 bytes
|
||
push d ;save ptr
|
||
call moveb
|
||
pop d ;pt to MENU.MNU FCB
|
||
call initfcb ;init fcb
|
||
call f$open ;open file
|
||
brz menu1 ;abort if no menu
|
||
call eprint
|
||
db CR,LF,' File ',0
|
||
lxi d,menufcb+1
|
||
call pfn1
|
||
call eprint
|
||
db ' Not Found',0
|
||
jmp shpop
|
||
;
|
||
; Load MENU.MNU from disk
|
||
;
|
||
menu1:
|
||
call codend ;get address of buffer for menu load
|
||
mload:
|
||
lxi d,menufcb ;pt to FCB
|
||
call f$read ;read in next block
|
||
ora a ;error?
|
||
brnz mloaddn ;load done if error
|
||
lxi d,tbuff ;copy from TBUFF into memory pted to by HL
|
||
xchg ;HL is source, DE is dest
|
||
mvi b,128 ;128 bytes
|
||
call hmovb
|
||
lhld bentry+1 ;get address of top of TPA
|
||
mov a,h ;set to bottom of ZCPR3
|
||
sui 10
|
||
cmp d ;about to overflow ZCPR3?
|
||
brnc mload1 ;continue if not
|
||
call eprint
|
||
db CR,LF,' TPA Full',0
|
||
ret
|
||
mload1:
|
||
xchg ;HL pts to next byte to load to
|
||
br mload ;continue load
|
||
|
||
|
||
;
|
||
; Init Flags and Clear MSB of all bytes in Menu File
|
||
;
|
||
mloaddn:
|
||
call f$close ;close input file
|
||
mvi m,CTRLZ ;ensure EOF mark
|
||
lxi d,80H ;pt to next block
|
||
dad d
|
||
shld ibuff ;set ptr to input line buffer
|
||
mvi m,ibufsz ;set size
|
||
dad d ;allow 256 bytes
|
||
dad d
|
||
shld expline ;set ptr to expand line
|
||
xra a ;A=0
|
||
sta cflag ;turn off command display
|
||
sta dflag ;turn off menu display
|
||
sta pflag ;disallow paging
|
||
sta cpmok ;turn off ZCPR3 return flag
|
||
call codend ;pt to beginning of file
|
||
push h ;save ptr
|
||
menul1:
|
||
mov a,m ;get byte
|
||
ani 7FH ;mask out MSB
|
||
mov m,a ;put byte
|
||
inx h ;pt to next
|
||
cpi CTRLZ ;EOF?
|
||
brnz menul1 ;continue if not
|
||
;
|
||
; Mark all Menu Sections
|
||
;
|
||
pop h ;HL pts to first byte of menu
|
||
mvi b,0FFH ;set menu counter
|
||
;
|
||
; Skip to Next Menu
|
||
;
|
||
menul2:
|
||
mov a,m ;get byte
|
||
cpi CTRLZ ;error?
|
||
jz mstrerr ;structure error if so
|
||
cpi MINDIC ;menu indicator (start of menu?)
|
||
brnz menul4
|
||
ori 80H ;beginning of menu found -- set MSB
|
||
mov m,a ;put byte
|
||
inr b ;increment menu count
|
||
inx h ;pt to next
|
||
mov a,m ;get byte
|
||
cpi MINDIC ;menu indicator (end of menu?)
|
||
brz menul5 ;done if so
|
||
cpi CTRLZ ;error?
|
||
jz mstrerr
|
||
;
|
||
if sysmenu
|
||
cpi RSM ;system menu indicator?
|
||
brnz menul3
|
||
mov a,b ;set system menu number
|
||
sta smeno
|
||
mvi a,0FFH ;set flag
|
||
sta smenfl ;system menu present
|
||
dcx h ;back up to beginning of menu
|
||
shld smenadr ;start address
|
||
inx h ;pt to RSM
|
||
endif ;sysmenu
|
||
;
|
||
; Skip out Menu Display
|
||
;
|
||
menul3:
|
||
call lskipt ;skip to beginning of next line
|
||
brz menul4 ;found menu indicator
|
||
cpi CTRLZ ;error?
|
||
jz mstrerr
|
||
br menul3 ;continue if not
|
||
;
|
||
; Skip to Next Menu
|
||
;
|
||
menul4:
|
||
call lskip ;skip to beginning of next menu
|
||
br menul2
|
||
;
|
||
; Check Menu Options
|
||
;
|
||
menul5:
|
||
call codend ;pt to beginning of file
|
||
mov a,m ;check for option
|
||
cpi GOPTION ;global option char?
|
||
jnz mfile ;if no global option, scan for menu files
|
||
inx h ;pt to option char
|
||
option:
|
||
mov a,m ;get option char
|
||
call caps ;capitalize
|
||
inx h ;pt to next
|
||
cpi CR ;done?
|
||
brz optdn
|
||
cpi COPTION ;display command?
|
||
brz optc
|
||
cpi DOPTION ;display menu?
|
||
brz optd
|
||
cpi POPTION ;paging?
|
||
brz optp
|
||
cpi XOPTION ;exit OK?
|
||
jnz mstrerr ;option error if not
|
||
;
|
||
; Disable Exit to ZCPR3
|
||
;
|
||
mvi a,0FFH ;turn flag off
|
||
sta cpmok
|
||
br option
|
||
;
|
||
; Process Paging Option
|
||
;
|
||
optp:
|
||
mvi a,0FFH ;set flag
|
||
sta pflag
|
||
br option
|
||
;
|
||
; Process Display Menu Option
|
||
;
|
||
optd:
|
||
mvi a,0FFH ;set flag
|
||
sta dflag
|
||
br option
|
||
;
|
||
; Process Display Command Option
|
||
;
|
||
optc:
|
||
mvi a,0FFH ;set flag
|
||
sta cflag
|
||
br option
|
||
|
||
;
|
||
; Option Processing Done
|
||
;
|
||
optdn:
|
||
inx h ;skip LF
|
||
|
||
;
|
||
; Check for Menu Display
|
||
;
|
||
mfile:
|
||
mov a,m ;get first byte
|
||
ani 7FH ;mask
|
||
cpi MINDIC ;start of menu?
|
||
jnz mstrerr
|
||
|
||
;
|
||
; Check and Set First Menu
|
||
;
|
||
shld mstart ;save start address of first menu item
|
||
mvi m,MFIRST+80H ;set first char of first menu
|
||
|
||
;
|
||
; Entry Point for Menu Display
|
||
; On entry, HL pts to first byte of current menu
|
||
;
|
||
dmenu:
|
||
mvi b,1 ;shell message 1 contains menu number
|
||
call getshm ;get menu number flag
|
||
cnz mchc0 ;skip to proper menu
|
||
shld cstart ;save start address of current menu
|
||
lda cflag ;copy display command flag for temp use
|
||
sta cpflag
|
||
lda dflag ;copy display menu flag for temp use
|
||
sta dpflag
|
||
lda pflag ;copy paging flag for temp use
|
||
sta ppflag
|
||
inx h ;pt to first char after menu indicator char
|
||
dispm1:
|
||
mov a,m ;get char
|
||
call caps ;capitalize
|
||
inx h ;pt to next
|
||
cpi CR ;end of options?
|
||
brz dispm2
|
||
;
|
||
if sysmenu
|
||
cpi RSM ;system menu?
|
||
brz dispm1 ;ok if so
|
||
endif ;sysmenu
|
||
;
|
||
cpi COPTION ;command display?
|
||
brz dispmc
|
||
cpi DOPTION ;display?
|
||
brz dispmd
|
||
cpi POPTION ;paging?
|
||
brz dispmp
|
||
cpi XOPTION ;ZCPR3 return?
|
||
jnz mstrerr ;error if not
|
||
;
|
||
; Toggle ZCPR3 Return Option
|
||
;
|
||
lda cpmok ;get flag
|
||
cma ;toggle
|
||
sta cpmok
|
||
br dispm1
|
||
;
|
||
; Toggle Paging Option
|
||
;
|
||
dispmp:
|
||
lda ppflag ;get flag
|
||
cma ;toggle
|
||
sta ppflag
|
||
br dispm1
|
||
;
|
||
; Toggle Display Menu Option
|
||
;
|
||
dispmd:
|
||
lda dpflag ;get flag
|
||
cma ;toggle
|
||
sta dpflag
|
||
br dispm1
|
||
;
|
||
; Toggle Display Command Option
|
||
;
|
||
dispmc:
|
||
lda cpflag ;get flag
|
||
cma ;toggle
|
||
sta cpflag
|
||
br dispm1
|
||
;
|
||
; Done with Menu-Specific Option Processing
|
||
;
|
||
dispm2:
|
||
call lskip ;skip to LF
|
||
lda dpflag ;display menu?
|
||
ora a ;0=no
|
||
brz dispm8 ;skip over menu if not
|
||
call getnlines ;get line count in A
|
||
sta pagcnt ;set count
|
||
lda ppflag ;paging?
|
||
ora a ;0=no
|
||
push psw ;save flag
|
||
cnz cls ;clear screen if so
|
||
pop psw ;get flag
|
||
cz crlf ;else new line
|
||
;
|
||
; Print Next Line of Menu if not Starting with ESCAPE Char (MINDIC)
|
||
;
|
||
dispm3:
|
||
mov a,m ;get first char of line
|
||
ani 7FH ;mask
|
||
cpi MINDIC ;done?
|
||
brz dispm4
|
||
call expand ;expand line pted to by HL
|
||
push h ;save ptr to next line
|
||
xchg ;HL pts to expanded line
|
||
call lprintx ;print line pted to by HL ending in <CR>
|
||
pop h ;pt to next line
|
||
br dispm3
|
||
;
|
||
; Done with Menu Display -- Page it out
|
||
;
|
||
dispm4:
|
||
call lskip ;skip to first char of next line (option char)
|
||
shld optstrt ;set start address of options
|
||
lda pagcnt ;number of remaining lines
|
||
mov b,a ;count in B
|
||
ora a ;ok?
|
||
brz dispm6 ;don't do anything if already there
|
||
lda ppflag ;page?
|
||
ora a ;0=No
|
||
brz dispm6
|
||
;
|
||
; Page Loop for Menu Display
|
||
;
|
||
dispm5:
|
||
call crlf ;new line
|
||
bjnz dispm5
|
||
;
|
||
; Determine if Another Menu Follows
|
||
;
|
||
dispm6:
|
||
xra a ;A=0
|
||
sta nmenfl ;set for no next menu
|
||
mov a,m ;ok?
|
||
ani 7FH ;mask
|
||
cpi CTRLZ ;error if EOF
|
||
jz mstrerr
|
||
cpi MINDIC ;next menu?
|
||
brnz dispm7
|
||
inx h ;double indicator if end
|
||
mov a,m
|
||
cpi MINDIC ;end?
|
||
brz dispm9
|
||
;
|
||
if sysmenu
|
||
cpi RSM ;system menu = no next menu
|
||
brz dispm9
|
||
endif ;sysmenu
|
||
;
|
||
mvi a,0FFH ;set next menu
|
||
sta nmenfl
|
||
br dispm9
|
||
dispm7:
|
||
call lskip ;skip to next line
|
||
br dispm6
|
||
|
||
;
|
||
; Skip over current menu so it is not displayed
|
||
;
|
||
dispm8:
|
||
call lskipt ;skip to beginning of command
|
||
brnz dispm8
|
||
call lskip ;skip over end of display indicator
|
||
shld optstrt ;set pointer to options
|
||
br dispm6 ;determine if next menu available
|
||
dispm9:
|
||
|
||
;
|
||
; Ready for Option Input
|
||
; The following Flags/Values are now set:
|
||
; CPFLAG -- Display Command Flag (0=No, 0FFH=Yes)
|
||
; DPFLAG -- Display Menu Flag (0=No, 0FFH=Yes)
|
||
; OPTSTRT -- Address of First Menu Option
|
||
; NMENFL -- 0 if no next menu, 0FFH if next menu
|
||
; MSTART -- Start Address of MINDIC Before Menu Display
|
||
; (MSTART)=MFIRST with MSB Set
|
||
prompt:
|
||
call stndout ;begin standout
|
||
mvi a,0ffh
|
||
sta pagcnt ;turn off paging
|
||
sta dpflag ;turn on future menu displays
|
||
call retud ;get DU
|
||
mov a,b ;print D
|
||
adi 'A'
|
||
call cout
|
||
mov a,c ;print U
|
||
call pafdc
|
||
call eprint
|
||
db '> Command (CR=Menu',0
|
||
lda cpmok ;OK to return to ZCPR3?
|
||
ora a ;0=No
|
||
cnz prmptc
|
||
lhld cstart ;pt to first char
|
||
mov a,m ;get it
|
||
ani 7FH ;mask
|
||
cpi MFIRST
|
||
cnz prmptf ;print previous menu prompt if not first menu
|
||
lda nmenfl ;next menu available?
|
||
ora a ;0=No
|
||
cnz prmptn ;print next menu prompt
|
||
call eprint
|
||
db ') - ',0
|
||
call stndend ;end standout
|
||
prompt1:
|
||
call cin ;get response
|
||
call caps ;capitalize
|
||
mov b,a ;result in B
|
||
|
||
;
|
||
; Check for CR
|
||
;
|
||
cpi CR ;<CR>?
|
||
jz dispm2 ;reprint menu if so
|
||
|
||
;
|
||
; Check for Reboot
|
||
;
|
||
lda cpmok ;ok to abort?
|
||
ora a ;0=No
|
||
brz prmpt0
|
||
mov a,b ;get command
|
||
cpi CTRLC ;reboot?
|
||
jz shpop ;pop shell stack and return to OS if so
|
||
|
||
;
|
||
; Check for Command to Return to First Menu
|
||
;
|
||
prmpt0:
|
||
mov a,m ;get it
|
||
ani 7FH ;mask
|
||
cpi MFIRST
|
||
brz prmpt1
|
||
mov a,b ;get command
|
||
cpi RFM ;return to first menu?
|
||
brnz prmpt1
|
||
lhld mstart ;pt to first menu
|
||
mvi b,1 ;shell message 1 is menu number
|
||
xra a ;A=0=menu 0
|
||
jmp putshm ;reenter shell at first menu
|
||
|
||
;
|
||
; Check for Command to go to Next Menu
|
||
;
|
||
prmpt1:
|
||
lda nmenfl ;next menu available?
|
||
ora a ;0=No
|
||
brz prmpt2
|
||
mov a,b ;get command
|
||
cpi RNMP ;goto next menu?
|
||
brz rnmx
|
||
cpi RNM ;goto next menu?
|
||
brnz prmpt2
|
||
rnmx:
|
||
mvi b,1 ;shell message 1 is menu number
|
||
call getshm ;increment menu number
|
||
inr a
|
||
jmp putshm ;reenter menu system at new menu
|
||
|
||
;
|
||
; Check for Command to go to Last Menu
|
||
;
|
||
prmpt2:
|
||
mov a,m ;get menu char
|
||
ani 7FH ;at first menu?
|
||
cpi MFIRST
|
||
brz prmpt3 ;skip if at first menu
|
||
mov a,b ;get command
|
||
cpi RLMP ;goto last menu?
|
||
brz lstmnu
|
||
cpi RLM ;goto last menu?
|
||
brnz prmpt3
|
||
lstmnu:
|
||
mvi b,1 ;shell message 1 is menu number
|
||
call getshm ;decrement menu number
|
||
dcr a
|
||
jmp putshm ;reenter shell at last menu
|
||
|
||
;
|
||
; Check for Command to goto System Menu
|
||
;
|
||
prmpt3:
|
||
if sysmenu
|
||
;
|
||
lda smenfl ;system menu available?
|
||
ora a ;0=No
|
||
brz prmpt4
|
||
mov a,b ;get command
|
||
cpi RSM ;system menu?
|
||
brnz prmpt4
|
||
call password ;prompt for and get password
|
||
jnz prompt ;reprompt if error
|
||
lhld smenadr ;get address of system menu
|
||
lda smeno ;set system menu number
|
||
mvi b,1 ;shell message 1 is menu number
|
||
jmp putshm ;reenter shell at system menu
|
||
;
|
||
endif ;sysmenu
|
||
;
|
||
; This is where additional functions may be added
|
||
;
|
||
prmpt4:
|
||
|
||
;
|
||
; Check for Option Letter
|
||
;
|
||
lhld optstrt ;pt to first option char
|
||
prmptx:
|
||
mov a,m ;get it
|
||
call caps ;capitalize
|
||
cpi MINDIC ;at next menu?
|
||
brz prmpter
|
||
cmp b ;match user selection?
|
||
brz prmptd
|
||
call lskip ;skip to next line
|
||
br prmptx
|
||
|
||
;
|
||
; Invalid Option
|
||
;
|
||
prmpter:
|
||
call eprint
|
||
db BEL,0
|
||
jmp prompt1
|
||
|
||
;
|
||
; Process Option
|
||
;
|
||
prmptd:
|
||
mov a,b ;output user selection
|
||
call cout
|
||
mvi b,0 ;shell message 0, bit 7 = wait flag
|
||
call getshm
|
||
ani 7FH ;set no wait
|
||
call putshm
|
||
inx h ;pt to first letter of command
|
||
mov a,m ;get it
|
||
cpi MCMD ;invoke other menu?
|
||
jz mchcmd ;menu change command
|
||
cpi WOPTION ;turn on wait?
|
||
brnz prmptg
|
||
mvi b,0 ;shell message 0, bit 7 = wait flag
|
||
call getshm
|
||
ori 80h ;set wait flag
|
||
call putshm ;set shell message
|
||
inx h ;skip option char
|
||
prmptg:
|
||
call expand ;expand line, DE pts to result
|
||
;
|
||
; Run Command Pted to by DE
|
||
;
|
||
runcmnd:
|
||
call getcl1 ;get address of command buffer
|
||
mov b,h ;... in BC also
|
||
mov c,l
|
||
mvi a,4 ;HL=HL+4 for address of first char
|
||
add l
|
||
mov l,a
|
||
mov a,h
|
||
aci 0
|
||
mov h,a
|
||
mov a,l ;store address
|
||
stax b
|
||
inx b
|
||
mov a,h
|
||
stax b
|
||
;
|
||
; Copy Command Line in DE into Buffer in HL
|
||
;
|
||
cmdcpy:
|
||
ldax d ;get command letter
|
||
call caps ;capitalize it
|
||
ora a ;done?
|
||
brz ccpyd
|
||
cpi CR ;done?
|
||
brz ccpyd
|
||
cpi PCHAR ;prompt?
|
||
brz ccpyp
|
||
mov m,a ;store it
|
||
inx h ;pt to next
|
||
inx d
|
||
br cmdcpy
|
||
ccpyd:
|
||
mvi m,0 ;store ending 0
|
||
jmp cmddisp ;optionally display command
|
||
;
|
||
; Prompt User for Input and Accept It
|
||
;
|
||
ccpyp:
|
||
inx d ;pt to first char of prompt
|
||
call crlf ;new line
|
||
ccpyp1:
|
||
ldax d ;get char
|
||
cpi PCHAR ;end of prompt?
|
||
brz ccpyp2
|
||
cpi CR ;new line?
|
||
brz ccpyp3
|
||
call cout ;echo char
|
||
inx d ;pt to next char
|
||
br ccpyp1 ;continue looping
|
||
ccpyp2:
|
||
inx d ;pt to char after closing PCHAR
|
||
ccpyp3:
|
||
push d ;save ptr to next char
|
||
xchg ;DE pts to buffer
|
||
mvi a,0FFH ;capitalize input from user
|
||
lhld ibuff ;input line buffer
|
||
call bline ;get input from user
|
||
xchg ;HL pts to buffer, DE pts to user input
|
||
cmdlp:
|
||
ldax d ;get char from user
|
||
ora a ;end of input?
|
||
brz cmdlp1 ;store rest of line
|
||
mov m,a ;store char
|
||
inx h ;pt to next
|
||
inx d
|
||
br cmdlp
|
||
cmdlp1:
|
||
pop d ;DE pts to next char, HL pts to buffer
|
||
br cmdcpy ;resume copying
|
||
;
|
||
; Check for Display of Loaded Command and Do So if Set
|
||
;
|
||
cmddisp:
|
||
lda cpflag ;display command?
|
||
ora a ;0=No
|
||
rz ;return to OS if so to run command
|
||
call crlf ;new line
|
||
call getcl1 ;pt to first char
|
||
mov e,m ;get low-order address
|
||
inx h
|
||
mov d,m ;get high-order address
|
||
xchg ;HL pts to first char
|
||
cmdd1:
|
||
mov a,m ;get char
|
||
cpi CMDSEP ;done if command separator
|
||
rz
|
||
inx h ;pt to next
|
||
call cout ;print char
|
||
br cmdd1
|
||
|
||
;
|
||
; Menu Change Command -- Jump to Specified Menu
|
||
;
|
||
mchcmd:
|
||
inx h ;pt to menu number
|
||
call eval ;convert to decimal number in A
|
||
sta menuno ;save menu number
|
||
call mchc0 ;skip to desired menu to check for it
|
||
lda menuno ;get menu number
|
||
mvi b,1 ;menu number is shell message 1
|
||
jmp putshm ;set message and reenter shell
|
||
|
||
;
|
||
; Entry Point if MENU is Reinvoked
|
||
;
|
||
mchc0:
|
||
mov b,a ;menu number in B
|
||
inr b ;add 1 for initial offset
|
||
lhld mstart ;pt to first menu
|
||
mchc1:
|
||
dcr b ;count down
|
||
rz ;done if found
|
||
mchc2:
|
||
call lskipt ;skip to next line
|
||
brnz mchc2 ;continue if not end of menu display
|
||
mchc3:
|
||
call lskipt ;skip to next line
|
||
brnz mchc3 ;continue if not at end of menu commands
|
||
inx h ;end of MENU.MNU?
|
||
mov a,m ;yes if double MINDIC
|
||
ani 7FH ;mask
|
||
cpi MINDIC
|
||
brz mchcerr ;error if so
|
||
dcx h ;pt to first char
|
||
br mchc1 ;continue
|
||
;
|
||
; Premature End of Menu File
|
||
;
|
||
mchcerr:
|
||
pop psw ;clear stack
|
||
jmp mstrerr ;menu structure error
|
||
|
||
;
|
||
; Print Line pted to by HL Ending in <CR>
|
||
; Decrement PAGCNT
|
||
;
|
||
lprintx:
|
||
call lprint ;print without <CR>
|
||
jmp crlf ;do <CR> <LF>
|
||
;
|
||
; Print Line Pted to by HL; Decrement PAGCNT
|
||
;
|
||
lprint:
|
||
mvi b,0 ;set tab counter
|
||
lprnt0:
|
||
mov a,m ;get char
|
||
inx h ;pt to next
|
||
ani 7FH ;mask MSB
|
||
cpi DIM ;goto standout mode?
|
||
brz lprnt3
|
||
cpi NOTDIM ;end standout mode?
|
||
brz lprnt4
|
||
cpi TAB ;tabulate?
|
||
brz lprnt2
|
||
cpi CR ;done?
|
||
brz lprnt1
|
||
call cout ;print
|
||
inr b ;incr tab counter
|
||
br lprnt0
|
||
lprnt1:
|
||
inx h ;pt to first char of next line
|
||
lda pagcnt ;count down pages
|
||
dcr a
|
||
sta pagcnt
|
||
rnz
|
||
call getnlines ;get line count in A
|
||
sta pagcnt
|
||
call eprint
|
||
db CR,LF,'Pause -',0
|
||
br sak1
|
||
lprnt2:
|
||
mvi a,' ' ;print <SP>
|
||
call cout
|
||
inr b ;incr tab counter
|
||
mov a,b ;done?
|
||
ani 7 ;every 8
|
||
brnz lprnt2
|
||
br lprnt0
|
||
lprnt3:
|
||
call stndout ;enter standout mode
|
||
br lprnt0
|
||
lprnt4:
|
||
call stndend ;end standout mode
|
||
br lprnt0
|
||
;
|
||
; Strike Any Key Message
|
||
;
|
||
sak:
|
||
mvi b,0 ;clear any pending wait
|
||
call getshm
|
||
ani 7FH ;mask MSB
|
||
call putshm
|
||
sak1:
|
||
call stndout ;goto standout
|
||
call eprint
|
||
db ' Strike Any Key - ',0
|
||
call stndend ;exit standout
|
||
call cin ;get response
|
||
call crlf ;new line
|
||
ret
|
||
|
||
;
|
||
; Prompt for, input, and check password (only one chance)
|
||
; If accepted, return with Zero Flag Set; if not, return with NZ
|
||
;
|
||
if sysmenu
|
||
password:
|
||
call eprint
|
||
db CR,LF,'Pass? ',0
|
||
lhld ibuff ;pt to input line buffer
|
||
xra a ;don't capitalize user input
|
||
call bline ;get line from user
|
||
lxi d,ppass ;pt to system password
|
||
pass1:
|
||
ldax d ;get sys pass char
|
||
cmp m ;ok?
|
||
brnz passerr ;error if no match
|
||
inx h ;pt to next
|
||
inx d
|
||
ora a ;end of strings?
|
||
brnz pass1
|
||
ret ;return with zero set to show match
|
||
passerr:
|
||
call eprint
|
||
db CR,LF,' Password Error',0
|
||
call sak1 ;strike any key
|
||
call crlf
|
||
mvi a,0FFH ;set no zero
|
||
ora a
|
||
ret
|
||
endif ;sysmenu
|
||
;
|
||
; Skip to Beginning of Next Line and Test First Char for Menu Indicator
|
||
;
|
||
lskipt:
|
||
call lskip ;skip
|
||
mov a,m ;get char
|
||
ani 7FH ;mask
|
||
cpi MINDIC ;test
|
||
ret
|
||
|
||
;
|
||
; Skip to Beginning of Next Line
|
||
;
|
||
lskip:
|
||
mov a,m ;get char
|
||
ani 7FH ;mask out MSB
|
||
inx h ;pt to next
|
||
cpi LF
|
||
brnz lskip
|
||
ret
|
||
|
||
;
|
||
; Print ZCPR3 Return Prompt
|
||
;
|
||
prmptc:
|
||
call eprint
|
||
db ', ^C=Z3',0
|
||
ret
|
||
;
|
||
; Print First/Last Menu Chars
|
||
;
|
||
prmptf:
|
||
call eprint
|
||
db ', ',RFM,'=1st Menu, ',RLM,'=Prev Menu',0
|
||
ret
|
||
;
|
||
; Print next menu message
|
||
;
|
||
prmptn:
|
||
call eprint
|
||
db ', ',RNM,'=Next Menu',0
|
||
ret
|
||
|
||
;
|
||
; Menu Structure Error -- FATAL
|
||
; This message is printed to indicate an error in the structure of
|
||
; the MENU.MNU file.
|
||
;
|
||
mstrerr:
|
||
call eprint
|
||
db CR,LF,' Structure Error',0
|
||
jmp shpop
|
||
|
||
;
|
||
; Expand Line Pted to by HL into Scratch Area
|
||
; Return with HL pting to next line, DE pting to current line
|
||
;
|
||
expand:
|
||
xchg
|
||
lhld expline ;pt to buffer
|
||
xchg
|
||
exp1:
|
||
mov a,m ;get next char
|
||
ani 7fh ;mask MSB
|
||
stax d ;store char
|
||
cpi CR ;end of line?
|
||
jz expx
|
||
inx h ;pt to next
|
||
inx d
|
||
cpi VARFLAG ;variable follows?
|
||
brnz exp1
|
||
;
|
||
; Variable Identified - Process it
|
||
;
|
||
mov a,m ;get next char
|
||
inx h ;pt to next
|
||
cpi VARFLAG ;one variable char?
|
||
brz exp1 ;resume if double VARFLAG
|
||
dcx d ;pt to variable position
|
||
call caps ;capitalize variable
|
||
cpi 'D' ;current disk?
|
||
brz expdisk
|
||
cpi 'U' ;current user?
|
||
brz expuser
|
||
cpi 'F' ;filename.typ?
|
||
brz expfile
|
||
cpi 'N' ;filename?
|
||
brz expname
|
||
cpi 'T' ;filetype?
|
||
brz exptype
|
||
br exp1 ;resume expansion
|
||
;
|
||
; Expand Exit
|
||
;
|
||
expx:
|
||
inx h ;pt to line feed
|
||
mov a,m ;get it
|
||
cpi LF ;line feed?
|
||
brnz expx1
|
||
inx h ;pt to char after line feed
|
||
expx1:
|
||
xchg ;DE pts to next line
|
||
lhld expline ;pt to expanded line
|
||
xchg ;HL pts to next line, DE pts to expanded line
|
||
ret
|
||
|
||
;
|
||
; Expand Disk
|
||
;
|
||
expdisk:
|
||
call retud ;get disk in B
|
||
mov a,b ;get disk number (A=0)
|
||
adi 'A' ;convert to ASCII
|
||
stax d ;store letter
|
||
inx d ;pt to next
|
||
br exp1 ;resume expansion
|
||
;
|
||
; Expand User
|
||
;
|
||
expuser:
|
||
call retud ;get user in C
|
||
mov a,c ;get user number
|
||
mvi b,10 ;subtract 10's
|
||
mvi c,'0' ;set char
|
||
expu1:
|
||
sub b ;-10
|
||
brc expu2
|
||
inr c ;increment digit
|
||
br expu1
|
||
expu2:
|
||
add b ;+10
|
||
adi '0' ;convert 1's to ASCII
|
||
mov b,a ;B=1's
|
||
mov a,c ;get 10's
|
||
stax d ;store 10's
|
||
inx d
|
||
mov a,b ;get 1's
|
||
stax d ;store 1's
|
||
inx d ;pt to next
|
||
br exp1 ;resume
|
||
;
|
||
; Expand File
|
||
;
|
||
expfile:
|
||
call getfnum ;get file number
|
||
jz exp1 ;resume if error
|
||
push h ;save ptr to next char
|
||
call ptfn ;set ptr to file name
|
||
call putn ;put file name
|
||
mvi a,'.'
|
||
stax d ;store dot
|
||
inx d ;pt to next
|
||
call putt ;put file type
|
||
pop h ;restore ptr
|
||
jmp exp1 ;resume
|
||
;
|
||
; Expand Name
|
||
;
|
||
expname:
|
||
call getfnum ;get file number
|
||
jz exp1 ;resume if error
|
||
push h ;save ptr to next char
|
||
call ptfn ;set ptr to file name
|
||
call putn ;put file name
|
||
pop h ;restore ptr
|
||
jmp exp1 ;resume
|
||
;
|
||
; Expand Type
|
||
;
|
||
exptype:
|
||
call getfnum ;get file number
|
||
jz exp1 ;resume if error
|
||
push h ;save ptr to next char
|
||
call ptfn ;set ptr to file name
|
||
mvi a,8 ;add 8
|
||
add l
|
||
mov l,a
|
||
mov a,h
|
||
aci 0
|
||
mov h,a
|
||
call putt ;put file type
|
||
pop h
|
||
jmp exp1 ;resume
|
||
;
|
||
; Pt to File Name whose Number (1-4) is in A
|
||
;
|
||
ptfn:
|
||
mov b,a ;get number in B
|
||
call getfn2 ;pt to file name 2
|
||
push d ;save DE
|
||
mov a,b ;file 0?
|
||
ora a
|
||
brz ptfnx
|
||
lxi d,11 ;size of file name and type
|
||
ptfn1:
|
||
dad d ;pt to next
|
||
bjnz ptfn1
|
||
ptfnx:
|
||
pop d ;restore DE
|
||
ret
|
||
;
|
||
; Put File Name pted to by HL
|
||
;
|
||
putn:
|
||
mvi b,8 ;8 chars
|
||
br putc
|
||
;
|
||
; Put File Type pted to by HL
|
||
;
|
||
putt:
|
||
mvi b,3 ;3 chars
|
||
;
|
||
; Copy Chars from HL to DE for up to B bytes -- flush if space
|
||
;
|
||
putc:
|
||
mov a,m ;get next char
|
||
cpi ' ' ;skip spaces
|
||
brz putc1
|
||
stax d ;put next char
|
||
inx d ;pt to next
|
||
putc1:
|
||
inx h ;pt to next
|
||
bjnz putc
|
||
ret
|
||
|
||
;
|
||
; Get File Number (1 to 4)
|
||
; If valid number, return with value in A and HL pting to next char
|
||
; If not valid, return with Z and HL pting to last char (F, N, T)
|
||
;
|
||
getfnum:
|
||
mov a,m ;get char
|
||
sui '1' ;convert
|
||
brc getfne ;error
|
||
cpi 4 ;range?
|
||
brnc getfne
|
||
inx h ;pt to next char
|
||
ret ;NZ from CPI 4
|
||
getfne:
|
||
dcx h ;error return
|
||
xra a
|
||
ret
|
||
|
||
;
|
||
; Return Number of Lines on CRT in A
|
||
;
|
||
getnlines:
|
||
push h ;save HL
|
||
call getcrt ;get CRT info
|
||
inx h ;pt to number of lines
|
||
mov a,m ;get count
|
||
pop h ;restore HL
|
||
dcr a ;subtract 1 for footer
|
||
ret
|
||
|
||
;
|
||
; Convert char string pted to by HL into decimal number in A
|
||
; On Entry, HL pts to first digit char
|
||
; On Exit, HL pts to after last digit char and A=number
|
||
;
|
||
eval:
|
||
push b ;save BC
|
||
mvi b,0 ;set value
|
||
eval1:
|
||
mov a,m ;get digit
|
||
sui '0' ;convert to binary
|
||
brc eval2
|
||
cpi 10 ;range?
|
||
brnc eval2
|
||
inx h ;pt to next digit
|
||
mov c,a ;new digit in C
|
||
mov a,b ;multiply B by 10
|
||
add a ;*2
|
||
add a ;*4
|
||
add b ;*5
|
||
add a ;*10
|
||
add c ;add in new digit
|
||
mov b,a ;result in B
|
||
br eval1
|
||
eval2:
|
||
mov a,b ;result in A
|
||
pop b ;restore ptr
|
||
ret
|
||
|
||
;
|
||
; These buffers overlay the scratch area to save space
|
||
;
|
||
optstrt equ scratch ;Address of First Option in Current Menu
|
||
mstart equ optstrt+2 ;Address of First Menu
|
||
cstart equ mstart+2 ;Address of Current Menu
|
||
smenfl equ cstart+2 ;System Menu Available Flag (0=No)
|
||
smeno equ smenfl+1 ;System Menu Number
|
||
smenadr equ smeno+1 ;Address of First Byte of System Menu
|
||
nmenfl equ smenadr+2 ;Next Menu Available Flag (0=No)
|
||
menuno equ nmenfl+1 ;Number of Menu
|
||
pagcnt equ menuno+1 ;Paging Counter
|
||
cflag equ pagcnt+1 ;Display Command Line Flag
|
||
dflag equ cflag+1 ;Display Menu Flag
|
||
pflag equ dflag+1 ;Paging Flag
|
||
|
||
;
|
||
; Buffers
|
||
;
|
||
ibuff:
|
||
ds 2 ;input line buffer
|
||
expline:
|
||
ds 2 ;scratch area to expand lines in
|
||
cpflag:
|
||
ds 1 ;Temp Display Command Line Flag
|
||
dpflag:
|
||
ds 1 ;Temp Display Menu Flag
|
||
ppflag:
|
||
ds 1 ;Temp Paging Flag
|
||
cpmok:
|
||
ds 1 ;OK to Return to ZCPR3 (0=No)
|
||
tnum:
|
||
ds 41 ;space for chars and ending 0
|
||
shdisk:
|
||
db 'A' ;disk to return to
|
||
db '00' ;user to return to
|
||
db ':;' ;log in and next command
|
||
shname:
|
||
db 'MENU ' ;program name (filled in at installation)
|
||
shfile:
|
||
ds 13 ;file name (12) and ending 0
|
||
|
||
end
|
||
|