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>
2655 lines
52 KiB
Plaintext
2655 lines
52 KiB
Plaintext
; PROGRAM: VMENU
|
||
; VERSION: 1.0
|
||
; DATE: 26 June 84
|
||
; AUTHOR: Richard Conn
|
||
; PREVIOUS VERSIONS: None
|
||
;
|
||
z3env equ 0f400h
|
||
VERS EQU 10 ;version number
|
||
|
||
; VMENU is copyright (c) 1984 by Richard Conn
|
||
; All Rights Reserved
|
||
; VMENU may be used freely by the ZCPR3 Community
|
||
|
||
; VMENU is a screen-oriented, ZCPR3-specific file utility. It can not be
|
||
; installed to run under conventional CP/M. VMENU
|
||
; extensively employs cursor addressing to position a pointer on the
|
||
; screen, allow the user to manipulate the pointer (up, down, right, left,
|
||
; next screen, previous screen, GOTO file). The pointer points to files
|
||
; in the current user directory and displays the user's position dynamically
|
||
; on the screen. Once pointing to a file, user commands can be used to
|
||
; manipulate the file according to options presented in the menu displayed to
|
||
; the user. MENU and VMENU are compatible. In the way of being ZCPR3-
|
||
; specific, VMENU can chain to external programs via the Command Line Buffer
|
||
; and then return, and it recognizes Named Directories (so the user can log
|
||
; into B:, B4:, and MYDIR:, for example).
|
||
|
||
; VMENU is installed by Z3INS.
|
||
|
||
; VMENU works with ZCPR3 only, with 32k or more of RAM.
|
||
|
||
; VMENU can be assembled for use with a Z80 or 8080 microprocessor.
|
||
|
||
;
|
||
; SYSLIB, Z3LIB, and VLIB References
|
||
;
|
||
ext z3vinit,cls,gotoxy,ereol,vprint,envptr,stndout,stndend
|
||
ext pafdc,dutdir
|
||
ext qshell,getefcb,shpush,shpop,getcrt,getfn2,zprsfn
|
||
ext putshm,getshm,getsh,getzrun,getcl1,putzex,putcst
|
||
ext cin,cout,caps,crlf,bline,sksp
|
||
ext f$open,f$read,f$close,initfcb
|
||
ext retud
|
||
ext codend
|
||
|
||
;
|
||
; Basic Definitions
|
||
;
|
||
TRUE EQU 0FFH ;define true and..
|
||
FALSE EQU 0 ;..false.
|
||
;
|
||
DIM EQU 1 ;GOTO DIM
|
||
BRIGHT EQU 2 ;GOTO BRIGHT
|
||
ELTSIZ EQU 11 ;size of file name and type element
|
||
|
||
;
|
||
; User-Customized Definition
|
||
;
|
||
VMNAME MACRO ;;Name of VMENU
|
||
DB 'VMENU'
|
||
ENDM
|
||
VMNFILL MACRO ;;Spaces to fill out name to 8 chars
|
||
DB ' '
|
||
ENDM
|
||
;
|
||
Z80 EQU TRUE ;TRUE to use Z80 Instructions
|
||
WARMBOOT EQU FALSE ;set TRUE to warmboot on exit
|
||
EPS EQU 4*4 ;N lines x 4 cols per screen
|
||
; EPS = Entries Per Screen
|
||
|
||
;
|
||
; Command Line Builder Constants
|
||
;
|
||
FPESC EQU '%' ;escape char
|
||
FPDISK EQU 'D' ;disk only (D)
|
||
FPUSER EQU 'U' ;user only (U)
|
||
FPFILE EQU 'F' ;filename.typ
|
||
FPNAME EQU 'N' ;file name only
|
||
FPTYPE EQU 'T' ;file type only
|
||
FPPTR EQU 'P' ;file entry being pointed to
|
||
MNOTE EQU '#' ;denotes comment area in macro file
|
||
UIN1 EQU 27H ;single quote for user input
|
||
UIN2 EQU 22H ;double quote for user input
|
||
|
||
;
|
||
; Menu Constants
|
||
;
|
||
|
||
; 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
|
||
|
||
; 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
|
||
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
|
||
|
||
;
|
||
; Cursor Positioning Addresses
|
||
;
|
||
EPSLINE EQU (EPS/4)+3 ;position of last line of EPS + 1
|
||
BANADR EQU 1*256+24 ;banner address
|
||
CURHOME EQU 3*256+1 ;home address of cursor
|
||
BOTADR EQU 23*256+1 ;bottom of screen
|
||
CPMADR EQU 22*256+1 ;command prompt message
|
||
CPADR EQU CPMADR+27 ;command prompt address (cursor position)
|
||
ERADR EQU CPMADR+256+15 ;error message
|
||
FNADR EQU 1*256+62 ;address of current file name
|
||
MOREADR EQU FNADR+1*256 ;address of more files message
|
||
DUADR EQU 1*256+4 ;address of current DU
|
||
|
||
;
|
||
; System Functions
|
||
;
|
||
RDCON EQU 1
|
||
WRCON EQU 2
|
||
PUNCH EQU 4
|
||
LIST EQU 5
|
||
DIRCON EQU 6
|
||
RDBUF EQU 10
|
||
CONST EQU 11
|
||
LOGIN EQU 14
|
||
OPEN EQU 15
|
||
CLOSE EQU 16
|
||
SRCHF EQU 17
|
||
SRCHN EQU 18
|
||
ERASE EQU 19
|
||
READ EQU 20
|
||
WRITE EQU 21
|
||
MAKE EQU 22
|
||
REN EQU 23
|
||
INQDISK EQU 25
|
||
SETDMA EQU 26
|
||
INQALC EQU 27
|
||
ATTR EQU 30
|
||
GETPARM EQU 31
|
||
SGUSER EQU 32
|
||
COMPSZ EQU 35
|
||
|
||
;
|
||
; System Addresses
|
||
;
|
||
OS$BASE EQU 000H ;system base..
|
||
CCP EQU 800H ;..and 'ccp' length in bytes.
|
||
GET EQU 0FFH ;get user area e-reg value
|
||
BDOS EQU OS$BASE+05H
|
||
FCB EQU OS$BASE+5CH
|
||
FCBEXT EQU FCB+12
|
||
FCBRNO EQU FCB+32
|
||
FCB2 EQU OS$BASE+6CH
|
||
TBUFF EQU OS$BASE+80H
|
||
TPA EQU OS$BASE+100H
|
||
|
||
;
|
||
; ASCII Definitions
|
||
;
|
||
CTRLC EQU 'C'-'@' ;..control-C..
|
||
CTRLD EQU 'D'-'@'
|
||
CTRLE EQU 'E'-'@'
|
||
CTRLR EQU 'R'-'@'
|
||
CTRLS EQU 'S'-'@' ;..XOFF..
|
||
CTRLX EQU 'X'-'@'
|
||
BEL EQU 07H ;..bell..
|
||
BS EQU 08H ;..backspace..
|
||
TAB EQU 09H ;..tab..
|
||
LF EQU 0AH ;..linefeed..
|
||
FF EQU 0CH ;..formfeed..
|
||
CR EQU 0DH ;..carriage return..
|
||
CAN EQU 18H ;..cancel..
|
||
EOFCHAR EQU 1AH ;..end-of-file..
|
||
CTRLZ EQU 1AH ;..clear screen..
|
||
ESC EQU 1BH ;..and escape character.
|
||
|
||
;
|
||
; 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
|
||
;
|
||
BR MACRO ?N ;;JUMP RELATIVE
|
||
IF Z80
|
||
.z80
|
||
jr ?N
|
||
.8080
|
||
ELSE
|
||
jmp ?N
|
||
ENDIF
|
||
ENDM
|
||
;
|
||
BRC MACRO ?N ;;JUMP RELATIVE ON CARRY
|
||
IF Z80
|
||
.z80
|
||
jr c,?N
|
||
.8080
|
||
ELSE
|
||
jc ?N
|
||
ENDIF
|
||
ENDM
|
||
;
|
||
BRNC MACRO ?N ;;JUMP RELATIVE ON NO CARRY
|
||
IF Z80
|
||
.z80
|
||
jr nc,?N
|
||
.8080
|
||
ELSE
|
||
jnc ?N
|
||
ENDIF
|
||
ENDM
|
||
;
|
||
BRZ MACRO ?N ;;JUMP RELATIVE ON ZERO
|
||
IF Z80
|
||
.z80
|
||
jr z,?N
|
||
.8080
|
||
ELSE
|
||
jz ?N
|
||
ENDIF
|
||
ENDM
|
||
;
|
||
BRNZ MACRO ?N ;;JUMP RELATIVE ON NO ZERO
|
||
IF Z80
|
||
.z80
|
||
jr nz,?N
|
||
.8080
|
||
ELSE
|
||
jnz ?N
|
||
ENDIF
|
||
ENDM
|
||
;
|
||
BJNZ MACRO ?N ;;DECREMENT B AND JUMP RELATIVE ON NO ZERO
|
||
IF Z80
|
||
.z80
|
||
djnz ?N
|
||
.8080
|
||
ELSE
|
||
dcr b
|
||
jnz ?N
|
||
ENDIF
|
||
ENDM
|
||
;
|
||
; END OF Z80 MACRO EXTENSIONS
|
||
;
|
||
|
||
;
|
||
; 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 Z3BASE.LIB
|
||
MACLIB SYSENV.LIB
|
||
z3eadr:
|
||
jmp start
|
||
SYSENV
|
||
start:
|
||
lxi h,z3eadr ;pt to ZCPR3 environment
|
||
endif
|
||
|
||
;
|
||
; Start of Program -- Initialize ZCPR3 Environment
|
||
; Once Environment is Initialized, One of Three Major Functions
|
||
; will be Performed:
|
||
; 1. VMENU will be installed as a Shell if invoked explicitly
|
||
; by user command
|
||
; 2. The VMENU Function will be performed if VMENU is invoked
|
||
; by ZCPR3 as a Shell and ZEX is not Running
|
||
; 3. A Command Line will be Input by VMENU from ZEX and Passed
|
||
; on to ZCPR3 without Processing
|
||
;
|
||
call z3vinit ;initialize the ZCPR3 Env and the VLIB Env
|
||
;
|
||
; Set Opsys Stack Pointer
|
||
;
|
||
if not WARMBOOT
|
||
lxi h,0 ;clear hl-pair then..
|
||
dad sp ;..add stack address.
|
||
shld stack
|
||
endif ;not warmboot
|
||
|
||
;
|
||
; Check to see if VMENU was executed as a shell
|
||
;
|
||
call qshell ;get and test message from ZCPR3
|
||
jz runsh ;execute shell procedures
|
||
;
|
||
; Initialize VMENU as a Shell
|
||
;
|
||
call shtest1 ;there must be a shell stack
|
||
call shtest2 ;there must be a command line buffer
|
||
;
|
||
; FUNCTION 1: Set Up VMENU as a Shell
|
||
; Run Shell Via Exit to Opsys
|
||
;
|
||
call getefcb ;determine name of program
|
||
brz shgo1 ;name not given, so use default
|
||
inx h ;pt to name
|
||
lxi d,filercmd ;define name of program
|
||
mvi b,8
|
||
call moveb ;copy name
|
||
shgo1:
|
||
lxi h,filercmd ;establish shell
|
||
call shpush ;push onto shell stack
|
||
brnz shgo2 ;error?
|
||
;
|
||
; Establish File Selection
|
||
; 3rd System File = Name of Menu File (2nd token)
|
||
; 4th System File = Name of AFN to Select Files (1st token)
|
||
;
|
||
call getfn2 ;setup file name
|
||
lxi d,11 ;use 2nd system file
|
||
dad d
|
||
xchg ;destination in DE
|
||
lxi h,joker ;pt to joker
|
||
mvi b,11 ;copy joker into 2nd system file
|
||
call move ;... so selection is on joker
|
||
xchg ;HL now pts to 3rd system file
|
||
push h ;save ptr to name of Menu File
|
||
lxi d,fcb2+1 ;pt to FCB
|
||
xchg
|
||
mvi b,11 ;copy 11 chars
|
||
call move
|
||
push d ;save ptr to file spec
|
||
lxi h,fcb+1 ;pt to FCB (use 4th system file name)
|
||
mvi b,11 ;copy 11 chars
|
||
call move
|
||
pop d ;get ptr to file spec
|
||
lxi h,joker ;make wild if none
|
||
mvi b,11 ;11 chars
|
||
ldax d ;get first char
|
||
cpi ' ' ;wild if space
|
||
cz moveb ;copy
|
||
ldax d
|
||
cpi '/' ;wild if option
|
||
cz moveb
|
||
pop d ;get ptr to name of menu file
|
||
lxi h,menufile ;pt to menu file name (default)
|
||
ldax d ;check for no file name given
|
||
mvi b,11 ;11 chars
|
||
cpi ' ' ;if none, set default
|
||
cz moveb
|
||
lxi b,8 ;check file type
|
||
dad b
|
||
xchg
|
||
dad b
|
||
xchg
|
||
ldax d ;check for file type
|
||
mvi b,3 ;3 chars
|
||
cpi ' ' ;if none, set default
|
||
cz move
|
||
;
|
||
; Print Done Message
|
||
;
|
||
simsg:
|
||
mvi a,0 ;default to menu 0
|
||
mvi b,1 ;shell message 1 contains menu number
|
||
call putshm
|
||
;
|
||
mvi b,0 ;shell message 0
|
||
mvi a,0 ;no wait
|
||
call putshm ;set shell message
|
||
;
|
||
call vprint
|
||
db ' Shell Installed',0
|
||
;
|
||
jmp os$ccp1 ;return to opsys
|
||
;
|
||
; Error in Shell Stack Installation
|
||
;
|
||
shgo2:
|
||
cpi 2 ;shell stack full
|
||
brnz shgo3
|
||
call vprint
|
||
db ' Shell Stack Full',0
|
||
ret
|
||
shgo3:
|
||
call vprint
|
||
db ' Shell Entry Size',0
|
||
ret
|
||
|
||
;
|
||
; VMENU was invoked as a Shell
|
||
; Check for ZEX Input in Progress
|
||
;
|
||
runsh:
|
||
call getzrun ;check ZEX message byte
|
||
jnz zexrun ;process ZEX command line if ZEX running
|
||
;
|
||
; Check for Delay Before Resuming VMENU and Delay if Set
|
||
;
|
||
mvi b,0
|
||
call getshm ;get shell message 0
|
||
ani 80h ;check MSB
|
||
cnz sak ;pause for input
|
||
mvi a,0 ;set normal command status
|
||
call putcst
|
||
;
|
||
; FUNCTION 2: Run VMENU and Perform Main Function
|
||
;
|
||
call setup ;init buffers and pointers
|
||
call stackset ;setup stack
|
||
;
|
||
; Begin VMENU Processing
|
||
;
|
||
runsh2:
|
||
call stackset ;reset stack
|
||
call fileload ;load files
|
||
call setscr ;set up screen display variables
|
||
call findcfile ;locate current file
|
||
call menuload ;load menu file
|
||
;
|
||
; Entry Point for Command Processing
|
||
; Display Screen and Input/Process Command
|
||
;
|
||
runsh3:
|
||
call stackset ;reset stack
|
||
call refresh ;refresh screen display
|
||
;
|
||
; Display Current File and Input/Process Command
|
||
;
|
||
loopfn:
|
||
call prcfn1 ;print current file name
|
||
;
|
||
; Input/Process Command
|
||
;
|
||
loop:
|
||
call stackset ;reset stack
|
||
call prompt ;get command from user
|
||
call cmdproc ;process command in A
|
||
call icmsg ;print invalid command msg
|
||
br loop ;continue
|
||
;
|
||
; Set Stack Pointer
|
||
;
|
||
stackset:
|
||
pop d ;get return address
|
||
lhld ibuf ;top of stack
|
||
sphl ;start local stack
|
||
push d ;return address on new stack
|
||
ret
|
||
;
|
||
; Check for Presence of Shell Stack
|
||
;
|
||
shtest1:
|
||
call getsh ;get shell stack data
|
||
rnz
|
||
pop psw ;clear stack
|
||
call vprint
|
||
db 'No Shell Stack',0
|
||
ret
|
||
|
||
;
|
||
; Check for Command Line
|
||
;
|
||
shtest2:
|
||
call getcl1 ;get command line data
|
||
rnz
|
||
pop psw ;clear stack
|
||
call vprint
|
||
db 'No Cmd Line',0
|
||
ret
|
||
|
||
;
|
||
; FUNCTION 3: Run ZEX on Top of VMENU
|
||
; Accept Command Line and Pass it to ZCPR3
|
||
;
|
||
zexrun:
|
||
call vprint ;print prompt
|
||
db 'VMENU> ',0
|
||
mvi a,1 ;tell ZEX that it is prompted
|
||
call putzex
|
||
call getcl1 ;pt to command line buffer
|
||
mov a,l ;set ptr to first char
|
||
adi 4
|
||
mov c,a
|
||
mov a,h
|
||
aci 0
|
||
mov b,a ;BC pts to first char
|
||
mov m,c ;store low
|
||
inx h
|
||
mov m,b ;store high
|
||
inx h ;pt to char count
|
||
xchg ;... in DE
|
||
mvi c,rdbuf ;input line via BDOS
|
||
push d ;save ptr
|
||
call bdos
|
||
pop h ;pt to char count
|
||
inx h
|
||
mov e,m ;get char count
|
||
inx h ;pt to first char
|
||
push h ;save ptr
|
||
mvi d,0 ;DE=char count
|
||
dad d
|
||
xra a ;A=0
|
||
mov m,a ;store ending 0
|
||
pop h ;pt to first char
|
||
call sksp ;skip to first non-blank character
|
||
mov a,m ;get it
|
||
cpi ';' ;comment line?
|
||
jz zexrun1 ;process comment line
|
||
call putzex ;resume ZEX (A=0)
|
||
call putcst ;set command status to normal (A=0)
|
||
ret ;return to opsys
|
||
zexrun1:
|
||
call crlf ;new line
|
||
jmp zexrun
|
||
|
||
;
|
||
;**************************************************
|
||
;
|
||
; CRT Routine for VMENU
|
||
;
|
||
VCLS:
|
||
CALL CLS ;try to clear the screen
|
||
RNZ ;OK if done
|
||
PUSH H ;save regs
|
||
PUSH B
|
||
CALL GETCRT ;get CRT Data
|
||
INX H ;get number of lines on screen
|
||
MOV B,M ;B=number of lines
|
||
VCLS1:
|
||
CALL CRLF ;new line
|
||
BJNZ VCLS1
|
||
POP B ;restore regs
|
||
POP H
|
||
RET
|
||
;
|
||
; EREOL Routine for VMENU
|
||
;
|
||
VEREOL:
|
||
CALL EREOL ;try to erase to EOL
|
||
RNZ ;OK if done
|
||
PUSH B ;save count
|
||
MVI A,' ' ;space out
|
||
CALL VEREOL1 ;send B spaces
|
||
POP B ;get count
|
||
MVI A,BS ;backspace in
|
||
VEREOL1:
|
||
CALL COUT ;send char
|
||
BJNZ VEREOL1 ;count down
|
||
RET
|
||
;
|
||
; Setup Screen Display Variables
|
||
;
|
||
SETSCR:
|
||
LXI H,CURHOME ;set cursor home
|
||
SHLD CURAT
|
||
LHLD RING ;set ring position
|
||
CALL SETMORE ;set more flag if more files on screen
|
||
;
|
||
; Entry to Reset Ring Position at HL
|
||
;
|
||
SETSCR1:
|
||
SHLD RINGPOS ;set current file to first file in ring
|
||
;
|
||
; Entry to Reset Local Ring Position at HL
|
||
;
|
||
SETSCR2:
|
||
SHLD LOCBEG ;front of ring
|
||
LXI D,EPS*ELTSIZ ;new end?
|
||
DAD D
|
||
XCHG
|
||
LHLD RINGEND ;end of ring
|
||
XCHG
|
||
CALL CMPDEHL
|
||
BRC SETSCR3
|
||
XCHG
|
||
SETSCR3:
|
||
XCHG
|
||
SHLD LOCEND
|
||
RET
|
||
|
||
;
|
||
; Set More Flag - Count Files on Screen and See if Display Exceeded
|
||
;
|
||
SETMORE:
|
||
PUSH H ;SAVE REGS
|
||
PUSH D
|
||
PUSH B
|
||
XRA A ;CLEAR FLAG
|
||
STA MORE
|
||
MVI B,EPS ;COUNT DOWN
|
||
LXI D,ELTSIZ ;SIZE OF ELEMENT
|
||
SETMORE1:
|
||
MOV A,M ;GET CHAR
|
||
ORA A ;DONE IF ZERO
|
||
JZ SETMDONE
|
||
DAD D ;PT TO NEXT
|
||
DCR B ;COUNT DOWN
|
||
JNZ SETMORE1
|
||
MOV A,M ;GET CHAR
|
||
ORA A ;DONE IF ZERO
|
||
JZ SETMDONE
|
||
MVI A,0FFH ;SET FLAG
|
||
STA MORE
|
||
SETMDONE:
|
||
POP B ;RESTORE REGS
|
||
POP D
|
||
POP H
|
||
RET
|
||
|
||
;
|
||
; Search for Current File starting at position in HL
|
||
;
|
||
FINDCFILE:
|
||
CALL GETFN2 ;get ptr to current file
|
||
LXI D,11
|
||
DAD D ;... which is 2nd System File
|
||
XCHG ;... ptr in DE
|
||
;
|
||
; Next group of EPS files for file display
|
||
;
|
||
FINDCF1:
|
||
LXI H,CURHOME ;set cursor
|
||
SHLD CURAT
|
||
LHLD LOCBEG ;pt to first file in list
|
||
MVI B,EPS ;number of files in display
|
||
;
|
||
; Check current file
|
||
;
|
||
FINDCF2:
|
||
SHLD RINGPOS ;set position of current ring element
|
||
;
|
||
; Check for end of file ring
|
||
;
|
||
MOV A,M ;end of list?
|
||
ORA A ;done if so
|
||
BRZ FINDCF4
|
||
;
|
||
; Compare candidate file against file in ring
|
||
;
|
||
PUSH H ;save ptr to file
|
||
PUSH D ;save ptr to System File
|
||
PUSH B ;save count
|
||
MVI B,ELTSIZ ;compare
|
||
CALL CMPSTR
|
||
POP B ;get count
|
||
POP D ;get ptr to System File
|
||
POP H ;get ptr to file
|
||
BRZ FINDCF5 ;we found it
|
||
BRC FINDCF5 ;we found following file
|
||
;
|
||
; Advance to next file in ring
|
||
;
|
||
PUSH B ;save count
|
||
LXI B,ELTSIZ ;pt to next element
|
||
DAD B
|
||
;
|
||
; Advance to next file on screen
|
||
;
|
||
PUSH H
|
||
LHLD CURAT ;get cursor position
|
||
MOV A,L
|
||
ADI 19 ;advance cursor
|
||
MOV L,A
|
||
CPI 70
|
||
BRC FINDCF3
|
||
MOV A,H ;get current line
|
||
LXI H,CURHOME ;get home row
|
||
MOV H,A ;set current line
|
||
INR H ;next line
|
||
FINDCF3:
|
||
SHLD CURAT ;set cursor
|
||
POP H
|
||
POP B ;get count
|
||
;
|
||
; Count down files in current display
|
||
;
|
||
BJNZ FINDCF2 ;count down
|
||
MOV A,M ;any following elements in ring?
|
||
ORA A ;0=no
|
||
BRZ FINDCF4
|
||
;
|
||
; End of current display - set new display
|
||
;
|
||
SHLD LOCBEG ;new local beginning
|
||
BR FINDCF1 ;continue search
|
||
;
|
||
; File beyond end of file display - set pointers to first file
|
||
;
|
||
FINDCF4:
|
||
LXI H,CURHOME ;set cursor to first file
|
||
SHLD CURAT
|
||
LHLD RING ;pt to first file
|
||
SHLD RINGPOS
|
||
SHLD LOCBEG ;set local beginning
|
||
;
|
||
; Done - Set Local Ring
|
||
;
|
||
FINDCF5:
|
||
LHLD LOCBEG ;pt to local ring
|
||
JMP SETSCR2
|
||
|
||
;
|
||
; Display file name of current file
|
||
; Side Effect: Change Name of 2nd System File to Current File
|
||
;
|
||
PRCFN1:
|
||
LXI H,FNADR ;position cursor for file name print
|
||
CALL GOTOXY
|
||
CALL GETFN2 ;pt to system file name
|
||
LXI D,11 ;pt to 2nd System File Name
|
||
DAD D
|
||
XCHG ;... in DE
|
||
LHLD RINGPOS ;pt to current file name
|
||
MVI B,11 ;copy into 2nd System File Name
|
||
CALL MOVEB
|
||
JMP PRFN ;print file name
|
||
;
|
||
; Process Command
|
||
;
|
||
ICMSG:
|
||
CALL ERMSG
|
||
DB 'Invld Cmd: ',0
|
||
MOV A,B ;get char
|
||
CPI ' ' ;expand if less than space
|
||
JNC COUT
|
||
MVI A,'^' ;control
|
||
CALL COUT
|
||
MOV A,B ;get byte
|
||
ADI '@' ;convert to letter
|
||
JMP COUT ;return for loop processing
|
||
|
||
;
|
||
; SET UP BUFFERS
|
||
;
|
||
SETUP:
|
||
CALL RETUD ;get home DU
|
||
MOV A,B
|
||
STA H$DR ;home drive
|
||
MOV A,C
|
||
STA H$U$A ;home user area
|
||
CALL CODEND ;start of free space
|
||
LXI D,256 ;256 bytes/unit
|
||
DAD D
|
||
SHLD IBUF ;input line buffer and top of stack
|
||
MVI M,IBUFSZ ;number of bytes in line
|
||
DAD D
|
||
SHLD EXPLINE ;expansion line
|
||
DAD D
|
||
SHLD MENUFCB ;dummy FCB
|
||
DAD D ;next page
|
||
SHLD BUFFER ;free space to end of TPA
|
||
|
||
;
|
||
; Begin Further Inits
|
||
;
|
||
LHLD ENVPTR ;pt to ZCPR3 Env Desc
|
||
LXI D,80H+10H ;pt to cursor commands
|
||
DAD D
|
||
LXI D,CTABLE ;pt to area
|
||
MVI B,4 ;4 commands
|
||
CURINIT:
|
||
MOV A,M ;get command
|
||
STAX D ;put it
|
||
INX H ;pt to next
|
||
INX D
|
||
INX D
|
||
INX D
|
||
BJNZ CURINIT
|
||
;
|
||
LHLD BUFFER ;base address
|
||
SHLD RING ;beginning of ring
|
||
;
|
||
XRA A ;clear error message flag
|
||
STA ERMFLG
|
||
;
|
||
RET
|
||
|
||
; e x i t
|
||
|
||
; return to ccp
|
||
|
||
;
|
||
; Entry point for VMENU exit
|
||
;
|
||
OS$CCP:
|
||
CALL SHPOP ;clear shell stack
|
||
;
|
||
; Entry point for command line exec
|
||
;
|
||
OS$CCP1:
|
||
LXI D,TBUFF ;..tidy up..
|
||
MVI C,SETDMA ;..before going home.
|
||
CALL BDOS
|
||
|
||
IF WARMBOOT
|
||
JMP OS$BASE
|
||
ENDIF ;warmboot
|
||
|
||
IF NOT WARMBOOT
|
||
LHLD STACK ;put pointer..
|
||
SPHL ;..back to 'sp'.
|
||
RET ;return to ccp
|
||
ENDIF ;not warmboot
|
||
|
||
;
|
||
; FLOAD loads the files into the buffer, setting up the ring
|
||
; Return with NZ if load OK, Z if no files loaded
|
||
;
|
||
FILELOAD:
|
||
;
|
||
; Set up file name from System File 4
|
||
; Select all files if no entry in System File 4
|
||
;
|
||
CALL GETFN2 ;pt to first system file name
|
||
LXI D,11*3 ;pt to 4th file name
|
||
DAD D
|
||
LXI D,JOKER ;setup Joker if none
|
||
XCHG
|
||
LDAX D ;any chars?
|
||
MVI B,11 ;11 bytes
|
||
CPI ' '
|
||
CZ MOVEB
|
||
XCHG ;HL pts to system file name
|
||
LXI D,FCB+1 ;pt to FCB
|
||
MVI B,11 ;11 bytes
|
||
CALL MOVEB
|
||
;
|
||
; Build ring with filename positioned in default FCB area
|
||
;
|
||
LHLD RING ;pt to ring
|
||
MVI B,ELTSIZ ;set first element to 'noname'
|
||
FILEL1:
|
||
MVI M,1 ;store ^A's
|
||
INX H ;pt to next
|
||
BJNZ FILEL1
|
||
SHLD RINGPOS ;set ring position
|
||
SHLD RINGEND ;set ring end in case this is the only one
|
||
MVI M,0 ;store ending 0
|
||
MVI C,SETDMA ;initialize dma address..
|
||
LXI D,TBUFF ;..to default buffer.
|
||
CALL BDOS
|
||
XRA A ;clear search 'fcb'..
|
||
STA FCBEXT ;extent byte..
|
||
STA FCBRNO ;..and record number.
|
||
LXI D,FCB ;default FCB for search
|
||
CMA
|
||
MVI C,SRCHF ;..of first occurrence.
|
||
CALL BDOS
|
||
INR A ; 0ffh --> 00h if no file found
|
||
RZ
|
||
|
||
; put each found name in ring. a-reg --> offset into 'tbuf' name storage
|
||
|
||
SETRING:
|
||
DCR A ;un-do 'inr' from above and below
|
||
ADD A ;times 32 --> position index
|
||
ADD A
|
||
ADD A
|
||
ADD A
|
||
ADD A
|
||
ADI TBUFF+1 ;add page offset and..
|
||
MOV L,A ;..put address into..
|
||
MVI H,0 ;..hl-pair.
|
||
XCHG
|
||
LHLD RINGPOS ;pointer to current load point in ring
|
||
XCHG
|
||
MVI B,ELTSIZ ;move name to ring
|
||
CALL MOVE
|
||
XCHG ;de-pair contains next load point address
|
||
SHLD RINGPOS ;store and search..
|
||
MVI C,SRCHN ;..for next occurrence.
|
||
LXI D,FCB ;filename address field
|
||
CALL BDOS
|
||
INR A ;if all done, 0ffh --> 00h.
|
||
BRNZ SETRING ;if not, put next name into ring.
|
||
;
|
||
; All filenames in ring -- setup ring size and copy-buffer start point
|
||
;
|
||
LHLD RINGPOS ;next load point of ring is start of buffer
|
||
SHLD RINGEND ;set ring end..
|
||
MVI M,0 ;store ending 0
|
||
;
|
||
; Sort ring of filenames
|
||
;
|
||
SORT:
|
||
LHLD RING ;initialize 'i' sort variable and..
|
||
SHLD RINGI
|
||
LXI D,ELTSIZ ;..also 'j' variable.
|
||
DAD D
|
||
SHLD RINGJ
|
||
;
|
||
; Main Sort Loop
|
||
;
|
||
SORTLP:
|
||
LHLD RINGJ ;compare names 'i & j'
|
||
XCHG
|
||
LHLD RINGI
|
||
PUSH H ;save position pointers..
|
||
PUSH D ;..for potential swap.
|
||
|
||
; sort by file name and type
|
||
MVI B,ELTSIZ ; # of characters to compare
|
||
CALL CMPSTR ;do comparison
|
||
|
||
; final test for swapping purposes
|
||
NOCMP:
|
||
POP D
|
||
POP H
|
||
MVI B,ELTSIZ
|
||
BRNC NOSWAP
|
||
;
|
||
; Swap if 'j' string larger than 'i'
|
||
;
|
||
SWAP:
|
||
MOV C,M ;get character from one string..
|
||
LDAX D ;..and one from other string.
|
||
MOV M,A ;second into first
|
||
MOV A,C ;first into second
|
||
STAX D
|
||
INX H ;bump swap pointers
|
||
INX D
|
||
BJNZ SWAP
|
||
NOSWAP:
|
||
LHLD RINGJ ;increment 'j' pointer
|
||
LXI D,ELTSIZ
|
||
DAD D
|
||
SHLD RINGJ
|
||
XCHG ;see if end of 'j' loop
|
||
LHLD RINGEND
|
||
CALL CMPDEHL
|
||
BRNZ SORTLP ;no, so more 'j' looping.
|
||
LHLD RINGI ;bump 'i' pointer
|
||
LXI D,ELTSIZ
|
||
DAD D
|
||
SHLD RINGI
|
||
DAD D ;set start over 'j' pointer
|
||
SHLD RINGJ
|
||
XCHG ;see if end of 'i' loop
|
||
LHLD RINGEND
|
||
CALL CMPDEHL
|
||
BRNZ SORTLP ;must be more 'i' loop to do
|
||
RET
|
||
;
|
||
; left to right compare of two strings (de-pair points to 'a' string;
|
||
; hl-pair, to 'b'; b-reg contains string length.)
|
||
;
|
||
CMPSTR:
|
||
LDAX D ;get an 'a' string character and..
|
||
CMP M ;..check against 'b' string character.
|
||
RNZ ;if not equal, set flag.
|
||
INX H ;bump compare..
|
||
INX D ;..pointers and..
|
||
BJNZ CMPSTR ;..do next character.
|
||
RET
|
||
|
||
;
|
||
; Process command from table
|
||
;
|
||
CTPROC:
|
||
MOV B,A ;command in B
|
||
LXI H,CTABLE ;pt to table
|
||
MOV A,M ;any cursor commands?
|
||
ORA A
|
||
JNZ CTPR1
|
||
LXI H,CTAB1
|
||
;
|
||
; Command table scanner
|
||
; HL = Table
|
||
; B = Command Letter
|
||
;
|
||
CTPR1:
|
||
MOV A,M ;get table command char
|
||
ORA A ;end of table?
|
||
RZ ;done if so
|
||
CMP B ;match?
|
||
BRZ CTPR2
|
||
INX H ;skip to next entry
|
||
INX H
|
||
INX H
|
||
BR CTPR1
|
||
CTPR2:
|
||
INX H ;pt to address
|
||
MOV A,M ;get low
|
||
INX H
|
||
MOV H,M ;get high
|
||
MOV L,A
|
||
XTHL ;address on stack
|
||
RET ;"jump" to routine
|
||
|
||
; Command Table
|
||
CTABLE:
|
||
DB 0 ;user cursor positioning
|
||
DW UP
|
||
DB 0
|
||
DW DOWN
|
||
DB 0
|
||
DW FORWARD
|
||
DB 0
|
||
DW REVERSE
|
||
CTAB1:
|
||
DB CTRLC ;if exit, then to opsys
|
||
DW OS$CCP
|
||
DB CTRLR ;screen refresh?
|
||
DW RUNSH3
|
||
DB CTRLE ;system cursor positioning
|
||
DW UP
|
||
DB CTRLX
|
||
DW DOWN
|
||
DB CTRLD
|
||
DW FORWARD
|
||
DB CTRLS
|
||
DW REVERSE
|
||
DB CR ;nop
|
||
DW LOOP
|
||
DB '+' ;jump forward
|
||
DW JUMPF
|
||
DB '-' ;jump backward
|
||
DW JUMPB
|
||
DB ' ' ;go forward
|
||
DW FORWARD
|
||
DB BS ;back up?
|
||
DW REVERSE
|
||
;
|
||
DB 0 ;end of table
|
||
|
||
;
|
||
; COMMAND: - (Previous Screen)
|
||
;
|
||
JUMPB:
|
||
LXI H,CURHOME ;set cursor home
|
||
SHLD CURAT
|
||
LHLD RING ;at front?
|
||
XCHG
|
||
LHLD LOCBEG
|
||
CALL CMPDEHL
|
||
BRZ JUMPBW ;back up and wrap around
|
||
SHLD LOCEND ;set new end
|
||
LXI D,-EPS*ELTSIZ ;back up
|
||
DAD D
|
||
SHLD LOCBEG ;new beginning
|
||
SHLD RINGPOS ;new position
|
||
JMP RUNSH3
|
||
JUMPBW:
|
||
LHLD LOCBEG ;at first screen?
|
||
XCHG
|
||
LHLD RING ;pt to first element of ring
|
||
CALL CMPDEHL
|
||
BRZ JBW0 ;advance to end
|
||
LXI H,-EPS*ELTSIZ ;back up
|
||
DAD D ;first element of new local ring
|
||
BR JFW0
|
||
JBW0:
|
||
LXI D,EPS*ELTSIZ ;pt to next screen
|
||
DAD D
|
||
XCHG
|
||
LHLD RINGEND
|
||
CALL CMPDEHL
|
||
XCHG
|
||
BRZ JBW1
|
||
BRC JBW0
|
||
JBW1:
|
||
LXI D,-EPS*ELTSIZ
|
||
DAD D ;pt to first element of new local ring
|
||
BR JFW0
|
||
;
|
||
; COMMAND: + (Next Screen)
|
||
;
|
||
JUMPF:
|
||
LXI H,CURHOME ;set cursor to home
|
||
SHLD CURAT
|
||
LHLD LOCEND ;see if Local End <= Ring End
|
||
XCHG
|
||
LHLD RINGEND
|
||
CALL CMPDEHL
|
||
BRZ CMDLOOP
|
||
LHLD LOCEND ;new screen starting at LOCEND
|
||
BR JFW0
|
||
|
||
;
|
||
; Reset to Beginning of RING and Resume Command Looping
|
||
;
|
||
CMDLOOP:
|
||
CALL SETSCR ;reset all screen pointers
|
||
CMDLRET:
|
||
JMP RUNSH3
|
||
;
|
||
; Reset RING Position to HL
|
||
;
|
||
JFW0:
|
||
CALL SETSCR1 ;reset RINGPOS on ...
|
||
BR CMDLRET
|
||
;
|
||
; Reset Local Ring to HL
|
||
;
|
||
JFW0A:
|
||
CALL SETSCR2 ;reset LOCBEG on ...
|
||
BR CMDLRET
|
||
|
||
;
|
||
; COMMAND: ' ', Left-Arrow
|
||
;
|
||
FORWARD:
|
||
CALL CLRCUR ;clear cursor
|
||
CALL FOR0 ;position on screen and in ring
|
||
CALL SETCUR ;set cursor
|
||
JMP LOOPFN
|
||
; advance routine
|
||
FOR0:
|
||
LHLD RINGPOS ;at end of loop yet?
|
||
LXI D,ELTSIZ ;i.e., will we be at end of loop?
|
||
DAD D
|
||
XCHG
|
||
LHLD LOCEND
|
||
CALL CMPDEHL ;compare 'present' to 'end'
|
||
BRNZ FORW ;to next print position
|
||
CALL CUR$FIRST ;position cursor
|
||
LHLD LOCBEG ;set position pointer to beginning and..
|
||
SHLD RINGPOS
|
||
RET
|
||
FORW:
|
||
LHLD RINGPOS ;advance in ring
|
||
LXI D,ELTSIZ
|
||
DAD D
|
||
SHLD RINGPOS ;new position
|
||
CALL CUR$NEXT ;position cursor
|
||
RET
|
||
|
||
;
|
||
; COMMAND: BS, Right-Arrow
|
||
;
|
||
REVERSE:
|
||
CALL CLRCUR ;clear cursor
|
||
CALL REV0 ;position on screen and in ring
|
||
CALL SETCUR ;set cursor
|
||
JMP LOOPFN
|
||
; Back Up Routine
|
||
REV0:
|
||
LHLD LOCBEG
|
||
XCHG
|
||
LHLD RINGPOS ;see if at beginning of ring
|
||
CALL CMPDEHL
|
||
BRNZ REV1 ;skip position pointer reset if not..
|
||
CALL CUR$LAST ;end of local ring
|
||
LHLD LOCEND ;set to end +1 to backup to end
|
||
LXI D,-ELTSIZ
|
||
DAD D
|
||
SHLD RINGPOS
|
||
RET
|
||
REV1:
|
||
CALL CUR$BACK ;back up 1
|
||
REV2:
|
||
LHLD RINGPOS
|
||
LXI D,-ELTSIZ ;one ring position..
|
||
DAD D ;..backwards.
|
||
SHLD RINGPOS
|
||
RET
|
||
|
||
;
|
||
; COMMAND: Up-Arrow
|
||
;
|
||
UP:
|
||
CALL CLRCUR ;clear cursor
|
||
LHLD RINGPOS ;see if wrap around
|
||
LXI D,-ELTSIZ*4 ;4 entries
|
||
DAD D
|
||
XCHG
|
||
LHLD LOCBEG ;beginning of local screen
|
||
CALL CMPDEHL
|
||
BRC UP2 ;wrap around
|
||
MVI B,4 ;back up 4 entries
|
||
UP1:
|
||
PUSH B ;save count
|
||
CALL REV0 ;back up in ring and on screen (no print)
|
||
POP B ;get count
|
||
BJNZ UP1
|
||
BR DOWN1A
|
||
UP2:
|
||
LHLD RINGPOS ;advance to beyond end
|
||
LXI D,ELTSIZ*4
|
||
DAD D
|
||
XCHG
|
||
LHLD LOCEND ;compare to local end
|
||
XCHG
|
||
CALL CMPDEHL
|
||
BRZ DOWN1A ;at end, so too far
|
||
BRC DOWN1A ;beyond end, so back up
|
||
SHLD RINGPOS ;new ring position
|
||
LHLD CURAT ;advance cursor
|
||
INR H ;next line
|
||
SHLD CURAT
|
||
BR UP2
|
||
|
||
;
|
||
; COMMAND: Down-Arrow
|
||
;
|
||
DOWN:
|
||
CALL CLRCUR ;clear cursor
|
||
LHLD RINGPOS ;see if wrap around
|
||
LXI D,ELTSIZ*4 ;4 entries
|
||
DAD D
|
||
XCHG
|
||
LHLD LOCEND ;end of local screen
|
||
XCHG
|
||
CALL CMPDEHL
|
||
BRZ DOWN2 ;wrap around
|
||
BRC DOWN2 ;wrap around
|
||
MVI B,4 ;forward 4 entries
|
||
DOWN1:
|
||
PUSH B ;save count
|
||
CALL FOR0 ;advance in ring and on screen (no print)
|
||
POP B ;get count
|
||
BJNZ DOWN1
|
||
DOWN1A:
|
||
CALL SETCUR ;set cursor
|
||
JMP LOOPFN
|
||
DOWN2:
|
||
LHLD CURAT ;preserve column
|
||
MOV B,L ;column number in B
|
||
LXI H,CURHOME ;home position
|
||
SHLD CURAT ;set new position
|
||
LHLD LOCBEG ;beginning of local ring
|
||
SHLD RINGPOS ;new ring position
|
||
DOWN3:
|
||
LHLD CURAT ;check for at top of column
|
||
MOV A,L ;get col
|
||
CMP B ;there?
|
||
BRZ DOWN1A
|
||
LHLD RINGPOS ;advance in ring
|
||
LXI D,ELTSIZ ;ELTSIZ bytes/entry
|
||
DAD D
|
||
SHLD RINGPOS
|
||
LHLD CURAT ;get cursor position
|
||
LXI D,19 ;advance 19 bytes/screen entry
|
||
DAD D
|
||
SHLD CURAT
|
||
BR DOWN3
|
||
|
||
;
|
||
;**************************************************
|
||
;
|
||
; WORKHORSE Routines
|
||
;
|
||
; conin routine (waits for response)
|
||
;
|
||
KEYIN:
|
||
CALL CIN ;get input
|
||
JMP CAPS ;capitalize
|
||
|
||
;
|
||
; Fill buffer with 'spaces' with count in b-reg
|
||
;
|
||
FILL:
|
||
MVI M,' ' ;put in space character
|
||
INX H
|
||
BJNZ FILL ;no, branch.
|
||
RET
|
||
;
|
||
; Check for legal filename character -- return with carry set if illegal
|
||
;
|
||
CKLEGAL:
|
||
LDAX D ;get character from de-pair
|
||
INX D ;point at next character
|
||
CPI ' ' ;less than space?
|
||
RC ;return carry if unpermitted character
|
||
PUSH H
|
||
PUSH B
|
||
CPI '[' ;if greater than 'z', exit with..
|
||
BRNC CKERR ;..carry set.
|
||
MVI B,CHR$TEND-CHR$TBL
|
||
LXI H,CHR$TBL
|
||
CHR$LP:
|
||
CMP M
|
||
BRZ CKERR
|
||
INX H
|
||
BJNZ CHR$LP
|
||
ORA A ;clear carry for good character
|
||
POP B
|
||
POP H
|
||
RET
|
||
|
||
CKERR:
|
||
POP B
|
||
POP H
|
||
STC ;error exit with carry set
|
||
RET
|
||
|
||
CHR$TBL:
|
||
DB ',',':',';','<','=','>' ;invalid character table
|
||
CHR$TEND:
|
||
DS 0
|
||
;
|
||
; Print file name pted to by HL
|
||
; Advance HL 11 bytes
|
||
;
|
||
PRFN:
|
||
MOV A,M ;check for 'noname'
|
||
CPI 1 ;no name?
|
||
BRZ PRFN1
|
||
MVI B,8 ;8 chars
|
||
CALL PRFNS1
|
||
MVI A,'.'
|
||
CALL COUT
|
||
MVI B,3 ;file type and fall thru
|
||
PRFNS1:
|
||
MOV A,M ;get char
|
||
CALL COUT
|
||
INX H ;pt to next
|
||
BJNZ PRFNS1
|
||
RET
|
||
PRFN1:
|
||
CALL VPRINT
|
||
DB ' No File'
|
||
DB ' '
|
||
DB ' ',0
|
||
MVI B,11 ;advance 11 chars
|
||
PRFN2:
|
||
INX H ;pt to next
|
||
BJNZ PRFN2
|
||
RET
|
||
|
||
;
|
||
; move subroutine -- move b-reg # of bytes from hl-pair to de-pair
|
||
;
|
||
MOVE:
|
||
MOV A,M ;get hl-pair referenced source byte
|
||
ANI 7FH ;strip attributes
|
||
STAX D ;put to de-pair referenced destination
|
||
INX H ;fix pointers for next search
|
||
INX D
|
||
BJNZ MOVE
|
||
RET
|
||
|
||
MOVEB:
|
||
PUSH H ;SAVE HL, DE
|
||
PUSH D
|
||
CALL MOVE
|
||
POP D ;RESTORE DE, HL
|
||
POP H
|
||
RET
|
||
;
|
||
; Compare de-pair to hl-pair and set flags accordingly
|
||
;
|
||
CMPDEHL:
|
||
MOV A,D ;see if high bytes set flags
|
||
CMP H
|
||
RNZ ;return if not equal
|
||
MOV A,E
|
||
CMP L ;low bytes set flags instead
|
||
RET
|
||
;
|
||
; Shift hl-pair b-reg bits (-1) to right (divider routine)
|
||
;
|
||
SHIFTLP:
|
||
DCR B
|
||
RZ
|
||
MOV A,H
|
||
ORA A
|
||
RAR
|
||
MOV H,A
|
||
MOV A,L
|
||
RAR
|
||
MOV L,A
|
||
BR SHIFTLP
|
||
|
||
;
|
||
;**************************************************
|
||
;
|
||
; MESSAGE Routines
|
||
;
|
||
; Print VMENU Banner
|
||
;
|
||
BANNER:
|
||
CALL VCLS ;clear screen
|
||
LXI H,BANADR
|
||
CALL GOTOXY
|
||
CALL VPRINT ;print banner
|
||
DB 'VMENU, Version '
|
||
DB VERS/10+'0','.',(VERS MOD 10)+'0'
|
||
IF Z80
|
||
DB ' ',DIM,'[Z80 Code]',BRIGHT
|
||
ELSE
|
||
DB ' ',DIM,'[8080 Code]',BRIGHT
|
||
ENDIF
|
||
DB 0
|
||
RET
|
||
;
|
||
; Print DU:DIR and MORE Message
|
||
;
|
||
DIRMORE:
|
||
LXI H,DUADR ; POSITION CURSOR
|
||
CALL GOTOXY
|
||
CALL RETUD ; GET CURRENT DISK AND USER
|
||
MOV A,B ; PRINT DISK
|
||
ADI 'A'
|
||
CALL COUT
|
||
MOV A,C ; PRINT USER
|
||
CALL PAFDC ; FLOADING DECIMAL
|
||
MVI A,':'
|
||
CALL COUT
|
||
CALL DUTDIR ; GET DIR NAME
|
||
BRZ NODIR
|
||
MVI B,8 ; 8 CHARS IN NAME
|
||
PRNAME:
|
||
MOV A,M ; GET CHAR
|
||
CPI ' '+1 ; CHECK FOR DONE
|
||
BRC PRMORE
|
||
CALL COUT ; PRINT CHAR
|
||
INX H
|
||
BJNZ PRNAME
|
||
BR PRMORE
|
||
NODIR:
|
||
CALL VPRINT
|
||
DB 'Noname',0
|
||
PRMORE:
|
||
LDA MORE ; CHECK FLAG
|
||
ORA A ; 0=NO MORE
|
||
RZ
|
||
LXI H,MOREADR
|
||
CALL GOTOXY ; POSITION CURSOR
|
||
CALL VPRINT
|
||
DB DIM,'[More Files]',BRIGHT,0
|
||
RET
|
||
|
||
;
|
||
; Home the Cursor
|
||
;
|
||
CUR$FIRST:
|
||
LXI H,CURHOME ; HOME ADDRESS
|
||
SHLD CURAT ; SET CURSOR POSITION
|
||
JMP GOTOXY
|
||
;
|
||
; Last File Position
|
||
;
|
||
CUR$LAST:
|
||
LHLD RINGPOS ; ADVANCE
|
||
SHLD LOCPOS ; SET LOCAL POSITION
|
||
CL0:
|
||
LXI D,ELTSIZ
|
||
DAD D
|
||
XCHG
|
||
LHLD LOCEND ; END OF LOCAL RING?
|
||
CALL CMPDEHL
|
||
RZ
|
||
XCHG ; NEW POSITION
|
||
SHLD LOCPOS
|
||
PUSH H ; SAVE POSITION
|
||
CALL CUR$NEXT ; ADVANCE CURSOR
|
||
POP H ; GET POSITION
|
||
BR CL0
|
||
;
|
||
; Advance the Cursor
|
||
;
|
||
CUR$NEXT:
|
||
LHLD CURAT ; COMPUTE NEW POSITION
|
||
MOV A,L ; CHECK FOR NEW LINE
|
||
ADI 19 ; SIZE OF EACH ENTRY
|
||
CPI 70
|
||
BRNC CN1 ; ADVANCE TO NEXT LINE
|
||
MOV L,A ; NEW POSITION
|
||
SHLD CURAT
|
||
JMP GOTOXY
|
||
CN1:
|
||
MOV A,H ; GET LINE
|
||
LXI H,CURHOME ; GET COL
|
||
MOV H,A ; SET LINE AND FALL GO TO CUR$DOWN
|
||
SHLD CURAT
|
||
BR CUR$DOWN
|
||
;
|
||
; Back Up the Cursor
|
||
;
|
||
CUR$BACK:
|
||
LXI H,CURHOME ; GET HOME
|
||
XCHG ; ... IN DE
|
||
LHLD CURAT
|
||
CALL CMPDEHL ; COMPARE
|
||
BRZ CUR$LAST ; GOTO END IF LAST
|
||
MOV A,L ; CHECK FOR FIRST COL
|
||
CMP E
|
||
BRZ CB1
|
||
SUI 19 ; BACK UP ONE COL
|
||
MOV L,A
|
||
SHLD CURAT ; NEW POS
|
||
JMP GOTOXY
|
||
CB1:
|
||
MOV A,E ; GET HOME COL
|
||
ADI 19*3 ; GET LAST COL
|
||
MOV L,A
|
||
DCR H ; PREV LINE
|
||
SHLD CURAT
|
||
JMP GOTOXY
|
||
;
|
||
; Move Cursor Down One Line
|
||
;
|
||
CUR$DOWN:
|
||
LXI H,CURHOME ; GET HOME ADDRESS
|
||
MOV B,H ; LINE IN B
|
||
LHLD CURAT ; GET CURRENT ADDRESS
|
||
INR H ; MOVE DOWN
|
||
MOV A,H ; CHECK FOR TOO FAR
|
||
SUB B
|
||
CPI EPS/4
|
||
BRNC CD1
|
||
SHLD CURAT ; OK, SO SET POSITION
|
||
JMP GOTOXY
|
||
CD1:
|
||
MOV A,L ; GET COL
|
||
LXI H,CURHOME
|
||
MOV L,A
|
||
SHLD CURAT
|
||
JMP GOTOXY
|
||
;
|
||
; Refresh Screen
|
||
;
|
||
REFRESH:
|
||
LHLD CURAT ; SAVE CURSOR AND RING POSITIONS
|
||
SHLD SCURAT
|
||
LHLD RINGPOS
|
||
SHLD SRINGPOS
|
||
CALL BANNER ; PRINT BANNER
|
||
CALL DIRMORE ; PRINT CURRENT DIRECTORY AND MORE MESSAGE
|
||
CALL DISPFILES ; DISPLAY FILES
|
||
CALL DISPMENU ; DISPLAY MENU
|
||
LHLD SCURAT ; RESTORE CURSOR AND RING POSITIONS
|
||
SHLD CURAT
|
||
LHLD SRINGPOS
|
||
SHLD RINGPOS
|
||
CALL SETCUR ; RESTORE CURSOR ON SCREEN
|
||
call atcmd
|
||
call vprint
|
||
db DIM,'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 vprint
|
||
db ') - ',BRIGHT,0
|
||
RET
|
||
|
||
;
|
||
; Print ZCPR3 Return Prompt
|
||
;
|
||
prmptc:
|
||
call vprint
|
||
db ', ^C=Z3',0
|
||
ret
|
||
;
|
||
; Print First/Last Menu Chars
|
||
;
|
||
prmptf:
|
||
call vprint
|
||
db ', ',RFM,'=1st Menu, ',RLM,'=Prev Menu',0
|
||
ret
|
||
;
|
||
; Print next menu message
|
||
;
|
||
prmptn:
|
||
call vprint
|
||
db ', ',RNM,'=Next Menu',0
|
||
ret
|
||
|
||
;
|
||
; Refresh File Display
|
||
;
|
||
DISPFILES:
|
||
CALL CUR$FIRST ; POSITION CURSOR AT FIRST POSITION
|
||
LHLD LOCBEG ; PT TO FIRST FILE NAME
|
||
SHLD LOCPOS ; SAVE LOCAL POSITION
|
||
DSPF1:
|
||
LHLD LOCEND ; AT END?
|
||
XCHG
|
||
LHLD LOCPOS
|
||
CALL CMPDEHL
|
||
JZ CUR$FIRST ; POSITION AT FIRST ENTRY AND RETURN
|
||
MVI B,4 ; 4 SPACES
|
||
MVI A,' '
|
||
DSPF2:
|
||
CALL COUT
|
||
BJNZ DSPF2
|
||
CALL PRFN ; PRINT FILE NAME (HL IS ADVANCED)
|
||
SHLD LOCPOS
|
||
CALL CUR$NEXT ; ADVANCE CURSOR
|
||
BR DSPF1
|
||
;
|
||
; Position Cursor at CURAT
|
||
;
|
||
SETCUR:
|
||
LHLD CURAT
|
||
CALL GOTOXY
|
||
CALL VPRINT
|
||
DB '-->',0
|
||
RET
|
||
;
|
||
; Clear Cursor
|
||
;
|
||
CLRCUR:
|
||
LHLD CURAT
|
||
CALL GOTOXY
|
||
CALL VPRINT
|
||
DB ' ',0
|
||
RET
|
||
;
|
||
; Working Message
|
||
;
|
||
WORKMSG:
|
||
CALL ERMSG
|
||
DB DIM,'Working ...',BRIGHT,0
|
||
RET
|
||
;
|
||
; Error Message
|
||
;
|
||
ERMSG:
|
||
MVI A,0FFH ; SET ERROR MESSAGE FLAG
|
||
STA ERMFLG
|
||
LXI H,ERADR ; GET ADDRESS
|
||
CALL GOTOXY
|
||
JMP VPRINT
|
||
;
|
||
; Clear Error Message
|
||
;
|
||
ERCLR:
|
||
XRA A ; CLEAR FLAG
|
||
STA ERMFLG
|
||
LXI H,ERADR ; POSITION
|
||
CALL GOTOXY
|
||
PUSH B
|
||
MVI B,76-(ERADR MOD 255)
|
||
CALL VEREOL ; ERASE TO EOL
|
||
POP B
|
||
RET
|
||
;
|
||
; Position at Command Prompt and Clear It
|
||
;
|
||
ATCMD:
|
||
LXI H,CPMADR ; POSITION
|
||
CALL GOTOXY
|
||
PUSH B
|
||
MVI B,76-(CPMADR MOD 255)
|
||
CALL VEREOL ; CLEAR MESSAGE
|
||
POP B
|
||
LXI H,CPMADR ; REPOSITION
|
||
JMP GOTOXY
|
||
;
|
||
; Position at Bottom of Screen and Prompt for Continuation
|
||
;
|
||
BOTTOM:
|
||
LXI H,BOTADR ; POSITION
|
||
CALL GOTOXY
|
||
;
|
||
; Prompt for Continuation
|
||
;
|
||
SAK:
|
||
CALL VPRINT
|
||
DB DIM,'Strike Any Key -- ',BRIGHT,0
|
||
JMP KEYIN
|
||
|
||
;
|
||
; Open Menu File
|
||
;
|
||
menuload:
|
||
lhld menufcb ;pt to menu fcb
|
||
inx h
|
||
push h
|
||
call getfn2 ;copy FCB into MENU FCB
|
||
lxi d,11*2 ;pt to 3rd system file name
|
||
dad d
|
||
pop d ;DE pts to first char of MENU FCB file name
|
||
mvi b,11 ;11 bytes
|
||
call moveb
|
||
dcx d ;pt to fcb
|
||
call initfcb ;init fcb
|
||
call f$open ;open file
|
||
brz menu1 ;abort if no menu
|
||
call vprint
|
||
db CR,LF,' File ',0
|
||
lhld menufcb ;pt to file name
|
||
inx h
|
||
call prfn
|
||
call vprint
|
||
db ' Not Found',0
|
||
jmp os$ccp ;abort
|
||
;
|
||
; Load Menu File from disk
|
||
;
|
||
menu1:
|
||
call menustrt ;get address of buffer for menu load
|
||
xchg ;... in DE
|
||
;
|
||
; Load next block from Menu File -- DE pts to Load Address
|
||
;
|
||
mload:
|
||
lhld menufcb ;pt to FCB
|
||
xchg ;... in DE, HL = load address
|
||
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 move
|
||
lhld bdos+1 ;get address of top of TPA
|
||
mov a,h ;set to bottom of ZCPR3
|
||
sui 10
|
||
cmp d ;about to overflow ZCPR3?
|
||
brnc mload ;continue if not
|
||
call vprint
|
||
db CR,LF,' TPA Full',0
|
||
jmp os$ccp
|
||
|
||
;
|
||
; Init Flags and Clear MSB of all bytes in Menu File
|
||
;
|
||
mloaddn:
|
||
call f$close ;close input file
|
||
mvi m,CTRLZ ;ensure EOF mark
|
||
xra a ;A=0
|
||
sta cpmok ;turn off ZCPR3 return flag
|
||
call menustrt ;pt to first menu char
|
||
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
|
||
;
|
||
; 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 lskipt ;skip to beginning of next menu
|
||
brz menul2 ;resume if at beginning of next menu
|
||
cpi CTRLZ ;error?
|
||
jz mstrerr
|
||
br menul4
|
||
;
|
||
; Check Menu Options
|
||
;
|
||
menul5:
|
||
call menustrt ;pt to first menu char
|
||
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 XOPTION ;exit OK?
|
||
jnz mstrerr ;option error if not
|
||
;
|
||
; Disable Exit to ZCPR3
|
||
;
|
||
mvi a,0FFH ;turn flag off
|
||
sta cpmok
|
||
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
|
||
ret
|
||
|
||
;
|
||
; Entry Point for Menu Display
|
||
;
|
||
dispmenu:
|
||
mvi h,epsline ;pt to first line of menu
|
||
mvi l,1 ;col 1
|
||
call gotoxy ;position there
|
||
lhld mstart ;pt to first byte of current menu
|
||
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
|
||
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
|
||
cpi XOPTION ;ZCPR3 return?
|
||
jnz mstrerr ;error if not
|
||
;
|
||
; Toggle ZCPR3 Return Option
|
||
;
|
||
lda cpmok ;get flag
|
||
cma ;toggle
|
||
sta cpmok
|
||
br dispm1
|
||
;
|
||
; Done with Menu-Specific Option Processing
|
||
;
|
||
dispm2:
|
||
call lskip ;skip to LF
|
||
call getnlines ;get line count in A
|
||
sta pagcnt ;set count
|
||
;
|
||
; 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
|
||
;
|
||
dispm4:
|
||
call lskip ;skip to first char of next line (option char)
|
||
shld optstrt ;set start address of options
|
||
;
|
||
; Determine if Another Menu Follows
|
||
;
|
||
xra a ;A=0
|
||
sta nmenfl ;set for no next menu
|
||
dispm5:
|
||
mov a,m ;ok?
|
||
ani 7FH ;mask
|
||
cpi CTRLZ ;error if EOF
|
||
jz mstrerr
|
||
cpi MINDIC ;next menu?
|
||
brnz dispm6
|
||
inx h ;double indicator if end
|
||
mov a,m
|
||
cpi MINDIC ;end?
|
||
rz
|
||
mvi a,0FFH ;set next menu
|
||
sta nmenfl
|
||
ret
|
||
dispm6:
|
||
call lskip ;skip to next line
|
||
br dispm5
|
||
|
||
;
|
||
; Ready for Option Input
|
||
; The following Flags/Values are now set:
|
||
; OPTSTRT -- Address of First Menu Option
|
||
; NMENFL -- 0 if no next menu, 0FFH if next menu
|
||
; CSTART -- Address of First Char of Current Menu
|
||
; MSTART -- Start Address of MINDIC Before Menu Display
|
||
; (MSTART)=MFIRST with MSB Set
|
||
prompt:
|
||
lxi h,cpadr ;position for input
|
||
call gotoxy
|
||
mvi a,0ffh
|
||
sta pagcnt ;turn off paging
|
||
call keyin ;get user input
|
||
PUSH PSW ;save command
|
||
LDA ERMFLG ;error message?
|
||
ORA A ;0=no
|
||
CNZ ERCLR ;erase old error message
|
||
POP PSW ;get command
|
||
ret
|
||
|
||
;
|
||
; Process Command
|
||
;
|
||
cmdproc:
|
||
call ctproc ;process movement or exit command
|
||
|
||
;
|
||
; Check for Command to Return to First Menu
|
||
;
|
||
lhld cstart ;pt to first char of menu
|
||
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
|
||
call putshm ;reenter menu system at new menu
|
||
jmp os$ccp1
|
||
;
|
||
; 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
|
||
call putshm ;reenter shell at last menu
|
||
jmp os$ccp1
|
||
;
|
||
; This is where additional functions may be added
|
||
;
|
||
prmpt3:
|
||
|
||
;
|
||
; Check for Option Letter
|
||
;
|
||
lhld optstrt ;pt to first option char
|
||
prmptx:
|
||
mov a,m ;get it
|
||
ani 7FH ;mask MSB
|
||
call caps ;capitalize
|
||
cpi MINDIC ;at next menu?
|
||
rz
|
||
cmp b ;match user selection?
|
||
brz prmptd
|
||
call lskip ;skip to next line
|
||
br prmptx
|
||
|
||
;
|
||
; Process Option
|
||
;
|
||
prmptd:
|
||
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 os$ccp1 ;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 ibuf ;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
|
||
|
||
;
|
||
; 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 ;increment for following decrement
|
||
lhld mstart ;pt to start of 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
|
||
cpi CTRLZ ;EOF?
|
||
jz mstrerr
|
||
mchc3:
|
||
call lskipt ;skip to next line
|
||
brnz mchc3 ;continue if not at end of menu commands
|
||
cpi CTRLZ ;EOF?
|
||
jz mstrerr
|
||
inx h ;end of MENU.MNU?
|
||
mov a,m ;yes if double MINDIC
|
||
ani 7FH ;mask
|
||
cpi MINDIC
|
||
jz mstrerr ;error if so
|
||
dcx h ;pt to first char
|
||
br mchc1 ;continue
|
||
|
||
;
|
||
; 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:
|
||
lda pagcnt ;check for page overflow
|
||
ora a ;do nothing
|
||
brz lskip ;... except skip out line
|
||
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 BRIGHT ;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
|
||
ret
|
||
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
|
||
|
||
;
|
||
; 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
|
||
cpi CTRLZ ;EOF?
|
||
rz
|
||
inx h ;pt to next
|
||
cpi LF ;EOL?
|
||
brnz lskip
|
||
ret
|
||
|
||
;
|
||
; Menu Structure Error -- FATAL
|
||
; This message is printed to indicate an error in the structure of
|
||
; the MENU.MNU file.
|
||
;
|
||
mstrerr:
|
||
call vprint
|
||
db CR,LF,' Structure Error',0
|
||
jmp os$ccp
|
||
|
||
;
|
||
; Expand Line Pted to by HL into Scratch Area
|
||
; Return with HL pting to next line, DE pting to current line
|
||
;
|
||
expand:
|
||
xchg
|
||
lxi h,noname ;init no name file
|
||
mvi m,1 ;set no entry
|
||
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
|
||
ani 7FH ;mask
|
||
call caps ;capitalize variable
|
||
cpi FPDISK ;current disk?
|
||
brz expdisk
|
||
cpi FPUSER ;current user?
|
||
brz expuser
|
||
cpi FPFILE ;filename.typ?
|
||
brz expfile
|
||
cpi FPNAME ;filename?
|
||
brz expname
|
||
cpi FPPTR ;file being pointed to?
|
||
brz exppfile
|
||
cpi FPTYPE ;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
|
||
;
|
||
; Expand File at Pointer
|
||
;
|
||
exppfile:
|
||
mov a,m ;get option char
|
||
ani 7FH ;mask
|
||
call caps ;capitalize
|
||
cpi FPFILE ;filename.typ?
|
||
brz exppf
|
||
cpi FPNAME ;filename only?
|
||
brz exppn
|
||
cpi FPTYPE ;filetype only?
|
||
brz exppt
|
||
jmp exp1 ;abort if error
|
||
;
|
||
; Extract full filename.typ of file being pointed to
|
||
;
|
||
exppf:
|
||
inx h ;pt to next char
|
||
push h ;save ptr to next char
|
||
lhld ringpos ;set ring position
|
||
call cknoname ;check and substitute no file
|
||
call putn ;put name pted to by HL
|
||
mvi a,'.' ;store dot
|
||
stax d
|
||
inx d
|
||
call putt ;put type pted to by HL
|
||
pop h
|
||
jmp exp1 ;continue
|
||
;
|
||
; Expand file name of file being pointed to
|
||
;
|
||
exppn:
|
||
inx h ;pt to next char
|
||
push h ;save ptr to next char
|
||
lhld ringpos ;set ring position
|
||
call cknoname ;check and substitute no file
|
||
call putn ;put name
|
||
pop h
|
||
jmp exp1
|
||
;
|
||
; Expand file type of file being pointed to
|
||
;
|
||
exppt:
|
||
inx h ;pt to next char
|
||
push h ;save ptr to next char
|
||
push d ;save DE
|
||
lhld ringpos ;pt to ring entry
|
||
call cknoname ;check and substitute no file
|
||
lxi d,8 ;pt to file type
|
||
dad d
|
||
pop d ;get DE
|
||
call putt ;put type
|
||
pop h
|
||
jmp exp1
|
||
;
|
||
; Check to see if HL pts to 'noname' and, if so, substitute name
|
||
;
|
||
cknoname:
|
||
push d ;save DE
|
||
push b ;save BC
|
||
call ckno ;do check
|
||
pop b ;get BC
|
||
pop d ;restore DE
|
||
ret
|
||
ckno:
|
||
mov a,m ;get char
|
||
cpi 1 ;no name?
|
||
rnz
|
||
lxi h,noname ;pt to no name
|
||
mov a,m ;check for definition
|
||
cpi 1 ;no name?
|
||
rnz
|
||
xchg ;HL pts to file name
|
||
call ermsg
|
||
db 'File Name? ',0
|
||
lhld ibuf ;pt to input buffer
|
||
mvi a,0ffh ;capitalize input
|
||
call bline ;get line from user
|
||
call sksp ;skip spaces
|
||
xchg
|
||
lhld menufcb ;pt to dummy FCB
|
||
xchg
|
||
call zprsfn ;parse file name into FCB
|
||
inx d ;pt to first char
|
||
lxi h,noname ;pt to name buffer
|
||
xchg
|
||
mvi b,11 ;copy into buffer
|
||
call moveb
|
||
ret ;HL pts to name
|
||
;
|
||
; 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
|
||
sui EPSLINE+1 ;subtract number of lines in file display
|
||
; ... + 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
|
||
|
||
;
|
||
; Compute Address of Buffer for Menu Load
|
||
;
|
||
menustrt:
|
||
lhld ringend ;get address of buffer for menu load
|
||
inr h ;next page
|
||
mvi l,0
|
||
ret
|
||
|
||
;
|
||
; S T O R A G E
|
||
;
|
||
; Initialized
|
||
;
|
||
FILERCMD:
|
||
VMNAME ;VMENU Name
|
||
VMNFILL ;Filler
|
||
DB ' ' ;one space
|
||
DB 0 ;end of shell command
|
||
JOKER:
|
||
DB '???????????' ;*.* equivalent
|
||
MENUFILE:
|
||
db 'MENU '
|
||
db 'VMN'
|
||
|
||
;
|
||
; Uninitialized
|
||
;
|
||
STACK:
|
||
DS 2
|
||
BUFFER:
|
||
DS 2 ;buffer start
|
||
CURAT:
|
||
DS 2 ;current cursor position
|
||
ERMFLG:
|
||
DS 1 ;error message flag
|
||
EXPLINE:
|
||
DS 2 ;buffer to expand line in
|
||
H$DR:
|
||
DS 1 ;home drive
|
||
H$U$A:
|
||
DS 1 ;home user area (must follow H$DR)
|
||
IBUF:
|
||
DS 2 ;input line buffer
|
||
LOCBEG:
|
||
DS 2 ;local beginning of ring
|
||
LOCEND:
|
||
DS 2 ;local end of ring
|
||
LOCPOS:
|
||
DS 2 ;local ring position (temp)
|
||
MENUFCB:
|
||
DS 2 ;FCB for Menu File
|
||
NONAME:
|
||
DS 11 ;dummy user-defined file name
|
||
RING:
|
||
DS 2 ;ptr to beginning of ring
|
||
RINGI:
|
||
DS 2 ;ring sort pointer
|
||
RINGJ:
|
||
DS 2 ;another ring sort pointer
|
||
RINGEND:
|
||
DS 2 ;current ring end pointer
|
||
RINGPOS:
|
||
DS 2 ;current ring position in scan
|
||
SCURAT:
|
||
DS 2 ;save cursor position
|
||
SRINGPOS:
|
||
DS 2 ;save ring position
|
||
;
|
||
; Menu Buffers
|
||
;
|
||
more:
|
||
ds 1 ;More Files Flag
|
||
optstrt:
|
||
ds 2 ;Address of First Option in Current Menu
|
||
mstart:
|
||
ds 2 ;Address of First Menu
|
||
cstart:
|
||
ds 2 ;Address of Current Menu
|
||
nmenfl:
|
||
ds 1 ;Next Menu Available Flag (0=No)
|
||
menuno:
|
||
ds 1 ;Number of Menu
|
||
pagcnt:
|
||
ds 1 ;Paging Counter
|
||
cpmok:
|
||
ds 1 ;OK to Return to ZCPR3 (0=No)
|
||
|
||
END
|
||
|
||
|