Browse Source

added DOS_SHELL

pull/5/head
Michael Steil 4 years ago
parent
commit
7632826c07
  1. 80
      DOS_SHELL/boot.src
  2. 28
      DOS_SHELL/shell.src
  3. 76
      DOS_SHELL/shellam.src
  4. 284
      DOS_SHELL/shellct.src
  5. 223
      DOS_SHELL/shelleq.src
  6. 758
      DOS_SHELL/shellfa.src
  7. 1464
      DOS_SHELL/shellfb.src
  8. 1153
      DOS_SHELL/shellsa.src
  9. 1418
      DOS_SHELL/shellsb.src
  10. 789
      DOS_SHELL/shelltb.src
  11. 5
      README.md
  12. 5
      build.sh

80
DOS_SHELL/boot.src

@ -0,0 +1,80 @@
;
; THIS MODULE SIMULATES ROM COLD-START PROCEDURES FOR THE C=128 DOS SHELL
;
; Ram / Rom Labels Used for Shell Auto-Boot from Disk
;
txptr = $002d ; Basic Text-Pointer Used to Re-program F-key # 1
mode = $00d7 ; Screen-Editor 40 / 80 Column Mode ($80 = 80-Col)
txtop = $1210 ; Pointer to Top of Basic Text (txptr + 2)
nubas = $5b00 ; New Start-of-Basic Address After Shell is Loaded
setkey = $c021 ; Screen Editor Entry to Program a Function-Key
primm = $ff7d ; Kernal Entry to Print an Immediate String
chrout = $ffd2 ; Kernal Entry to Output one Character
plot = $fff0 ; Kernal Entry to Read / Set Screen Cursor Position
;
;
*= $0b00 ; Set Origin for Disk Auto-Boot Block # 1
;
; Data Constants for Disk Auto-boot Definition & Cold-Start
;
key .byt 'CBM' ; Key Pattern to Identify an Auto-boot Diskette
;
.byt 0,0,0,0 ; To Show No Additional Boot-blocks to Load
;
disk .byt 'C128 DOS SHELL',0 ; Display this Disk-Name While Loading
;
file .byt 'DOS SHELL',0 ; This File-name is the Shell Application
;
;
; Shell Cold-Start Code Called by Kernal 'Phoenix' From Basic 'Hard-Reset'
;
; Program F-Key # 1 for Shell Entry, Set-up a Null Basic Program-Link
; Set-up New Start-of-Basic Text-Pointer, Display Cold-Start Message
;
cold lda #<fkey ;
sta txptr ; lo-byte of pointer to new F-key string
lda #>fkey ;
sta txptr+1 ; hi-byte of pointer to new F-key string
lda #15 ;
sta txptr+2 ; Ram Bank # where new F-key string resides
lda #txptr ;
ldx #1 ; set addr of F-key pointer, Nr. of F-key to change
ldy #fend-fkey ;
jsr setkey ; set length of new F-key string, call Screen Editor
;
ldy #3 ; set-up to store four null-bytes
lda #0 ;
colda sta nubas,y ; to build a null Basic program-link
dey ;
bpl colda ; so Basic will work when System shows 'Ready' msg
lda #1 ;
sta txptr ; set-up a new Basic Start-of-Text pointer value
lda #>nubas ;
sta txptr+1 ; so that Basic programs will Load above the Shell
ldx #3 ;
stx txtop ; set-up a new Basic Top-of-Text pointer value
sta txtop+1 ;
lda #147 ; clear the screen in case Boot command was used
jsr chrout ;
clc ; position cursor to display Shell cold-start message
ldx #1 ;
ldy #29 ; centered on second line of the screen (80-Col Y-Pos)
bit mode ;
bmi coldb ; branch if 80-Col video-display mode
ldy #9 ;
coldb jsr plot ; else set 40-Col Y-Pos, then move the cursor
;
jsr primm ; print the immediately following string
;
.byt 'D.O.S. SHELL ON F-1 KEY',13,0
;
rts ; All Setup! Return to Basic Cold-Start Sequence
;
;
; Define Data to Set-up F1-key for Entry to Shell After Auto-Boot
;
fkey .byt 'BANK 12: SYS 6656',13 ; Press F1-Key to Enter C=128 Shell
;
fend = * ; Marks End of Shell Cold-Start Module
;
.end

28
DOS_SHELL/shell.src

@ -0,0 +1,28 @@
; C=128 VERSION OF D.O.S. UTILITY SHELL
;
.page
.subttl ** C=128 ** LABEL DEFINITIONS
.include shelleq
.page
.subttl ** C=128 ** SHELL COLD START-UP
.include shellam
.page
.subttl ** C=128 ** SHELL CONTROL MODULE
.include shellct
.page
.subttl ** C=128 ** FUNCTION CONTROL MODULE I
.include shellfa
.page
.subttl ** C=128 ** FUNCTION CONTROL MODULE II
.include shellfb
.page
.subttl ** C=128 ** GENERAL UTILITY SUBROUTINES
.include shellsa
.page
.subttl ** C=128 ** FILE-LIST BROWSE-SELECT / PRINT
.include shellsb
.page
.subttl ** C=128 ** DOS COMMAND / SHELL MESSAGE TABLES
.include shelltb
;
.end

76
DOS_SHELL/shellam.src

@ -0,0 +1,76 @@
; SET-UP SHELL COLD-START VARIABLE VALUES & RAM-LINKS TO ROM SUBROUTINES
;
; Define Start-up Values for Shell Variables Later Moved to Zero-Page
;
*= zpsav ; Start of F-key App. Ram Used to Save Basic Z-Page
;
.byt -1 ; Default Language for Shell Messages (-1 = Un-selected)
.byt 4 ; Default Printer Device # (0 = None, 4 - 6 Supported)
.byt 0 ; Default Disk Configuration (0 = Single-Drive)
.byt 'A' ; Logical Drive-Name For Single-Drive Config.
.byt 8, 8 ; Default Device # for Logical Drives A & B
.byt '00' ; Physical Drive # for Logical Drives A & B
.byt 1 ; Default Source Device/Drive/LFN # Index (1= Drive A)
.byt 0 ; Temp Logical File Nr. Used to Open Channels
.byt 4, 8 ; Data-Channel Logical File Nr. for Drives A & B
;
;
; Define Shell F-Key Data to Replace System Function-Key Definitions
;
*= pfdef ; Data for F1, F3, F5, F7: Run/Stop & Help Disabled
;
.byt 1,0,1,0,1,0,1,0,0,0 ; Shell F-Key Length Bytes
;
.byt 133,134,135,136,0,0 ; Shell F-Key String Values
;
;
*= ramlnk ; Code-Origin for Ram-Linkage Subroutines
;
; Shell RAM-code Link Needed for Direct-Calls to Run a Basic Program
; Because Runc Trashes System-Stack & Return-Address for Kernal JSRFAR
;
runjmp lda #0 ; Set System Configuration (Std. Bank # 15)
sta mmucr ;
jsr setexc ; set-up various Basic Run-modes & flags
;
jsr runc ; set-up Basic Text & Variable Pointers & Stacks
;
jsr lnkprg ; re-build Basic-text Line-link pointers
;
jmp newstt ; check Stop-key & start executing Basic text
;
;
; Shell RAM-Code Link to Kernal JSRFAR for Calling Basic Subroutines
; Enter With: pchi, pclo, .S, .A, .X, .Y Pseudo-Regs Set by Caller
;
rajsrf lda #15 ; Set System Default Configuration Bank #
sta bank ;
jsr kjsrfr ; Call the Long-Call Subroutine in Shared RAM
lda #6 ;
sta mmucr ; Set Shell ROM Configuration (Std. Bank # 12)
rts ;
;
;
; Shell Ram-Links to Long-Fetch, Long-Store, Long-Compare Subroutines
;
kndfet sei ;
jsr lngfet ; call long-fetch with irq's disabled
cli ;
rts ; return with irq's enabled
;
kndsta sei ;
jsr lngsta ; call long-store with irq's disabled
cli ;
rts ; return with irq's enabled
;
kndcmp sei ;
jsr lngcmp ; call long-compare with irq's disabled
cli ;
rts ; return with irq's enabled
;
*= bama ; origin for dos shell version message
;
.byt ' c128 dos shell ' ;
.byt 'version # 1.0 by' ; current shell version #
.byt ' dave middleton ' ;
;

284
DOS_SHELL/shellct.src

@ -0,0 +1,284 @@
; D.O.S. SHELL - PRIMARY CONTROL MODULE (Entry on F-Key # 1)
;
;
*= shell ; RAM origin for shell entry point = decimal 6656
;
;
; SET-UP SHELL OPERATING ENVIRONMENT & SELECT USER LANGUAGE
;
; init screen editor & I/O, save system z-page & F-key defs
;
jsr bcmsgj ; close all files - precautionary
jsr restor ; restore Basic and Kernal system vectors
jsr pcint ; initialize video chip & screen editor
jsr pagot ; move system zero-page & F-keys to save-area
jsr color ; un-set window, set bg/fg colors, clear screen
;
; check language flag for first-time entry to shell
;
lda lang ; set to -1 by Cold-Start
bmi shellb ;
jmp shomu ; go display menu if laguage already selected
;
shellb inc lang ; bump flag to next language
lda lang ;
and #3 ; clear bits for modulo 4 values
sta lang ;
;
; clear screen and print the messages for language selection
;
lda #clear ; clear the screen
jsr chrout ;
lda #10 ;
jsr fndmsb ; msg = cbm disk utility system
lda #11 ;
jsr fndmsb ; msg = press space to select your language
lda #12 ;
jsr fndmsb ; msg = name of current language
;
; set-up count-down timer for 6-second wait
;
lda #<wtsix ; low-byte of delay time
sta work ;
lda #>wtsix ; high-byte of delay time
sta work+1 ;
;
; get a keystroke and look for crsr-down or space
;
shelld jsr getin ; try for a keystroke
cmp #space ;
beq shomu ; done when key = space, goto main menu
cmp #crsrd ;
beq shellb ; if key = cursor-down, cycle to next language
;
; check for six-second timer expired
;
lda work ; delay-counter value
ora work+1 ;
beq shellb ; if timer is expired
dec work ;
bne shellg ; timer not expired, decrement timer
dec work+1 ;
;
; wait for one jiffy then try keyboard again
;
shellg lda jiflo ; jiffy-clock low-byte
shellj cmp jiflo ;
beq shellj ; delay until jiffy clock ticks once
bne shelld ;
;
; DISPLAY THE PRIMARY SHELL MENU SCREEN
;
; clear the screen, display headings, rvs-fill menu-area, display menu
;
shomu lda #0 ;
sta rptflg ; set auto-repeat for space + cursor + inst/del keys
jsr setmsg ;
jsr bcmsgj ; disable Kernal messages, close all files & DOS chans
jsr color ; un-set window, set bg/fg colors, clear the screen
lda #60 ; msg = move cursor then press space to select
ldx #0 ;
ldy #0 ; absolute X-Y position same for 40-80 col. video
jsr fndmsa ; print first heading-message in rvs-video
bit mode ;
bpl shomua ; on 40-col video
lda #13 ; msg = press f5 to un-select / stop to cancel
jsr fndmsa ; locate the message and print in reverse-video
;
shomua lda #1 ; X-position for start of fill
sta msgxy ;
ldx #4 ; pre-set nr of rows to fill for 80-col video
bit mode ;
bmi shomub ; on 80-col video
inx ; nr of rows to fill for 40-col
shomub jsr fill ; fill the menu-area with rvs-video spaces
;
; display primary menu items, showing function = 0 as selected
;
lda #0 ; show func = 0 as selected function
sta func ;
jsr fndmsb ; print first menu-item message in normal-video
;
shomuc inc msgnr ; print menu-item messages 1 - 9
lda msgnr ;
jsr fndmsa ; locate the message and print rvs-video
lda msgnr ;
cmp #9 ; check for last menu message
bne shomuc ; if more messages to print
;
ldx #lynml8-1 ; preset X-position for 80-col video
bit mode ;
bmi shomud ; on 80-col video
inx ;
shomud stx msgxy ; set the X-position
ldx #1 ; nr of rows to fill
jsr filla ; fill one line below the menu with rvs-chr$(162)
;
; initialize the 40-80 Col. Drive/Disk-ID line
;
ldx #lyndl8-1 ; pre-set X-position for 80-col video
bit mode ;
bmi shomue ; on 80-column video
inx ;
shomue stx msgxy ; set 40-80 Col. X-position = 1 above drive-line
ldx #1 ;
jsr fillb ; fill one line with rvs-video chr$(162)
inc msgxy ;
ldx #1 ;
jsr fill ; fill the drive-ID line with rvs-video spaces
;
;
; SELECT A FUNCTION, GET THE DRIVE ID, EXECUTE THE FUNCTION
;
; set-up drive-ID line & DOS-buffer for hard-copy, clear error status
;
lda #14 ; msg = drive: x diskette-name-xx nnn free
jsr fndmsa ;
ldy #39 ; begin building file-list hard-copy heading
;
selfna lda (curmsg),y ;
sta dosbf,y ; by storing msg # 14 into DOS msg-buffer
dey ;
bpl selfna ; if more message bytes to store
;
iny ;
sty stsav ; clear any previous ST / DOS error status
sty doserr ;
sty laskey ; clear any previous keyboard controls
;
; check for mode-swap / shell-exit, then select function code (0 - 9)
;
selfnb jsr getin ;
beq selfnb ; wait for any keystroke
cmp #escap ;
beq selfnc ; if key = ESCape (ESC-X Sequence to Swap Mode)
cmp #swap ;
beq selfnd ; if key = 'X' go check for previous ESC
;
sta laskey ; to prevent any keys between ESC and X
cmp #f1 ;
beq selfne ; if key = f1, then go exit from shell
cmp #space ;
beq selfnf ; if key = space-bar, a function has been selected
jsr updmen ;
jmp selfnb ; update menu area to show new func, get another key
;
selfnc sta laskey ; show ESC as last keystroke to set-up Mode Swap
jmp selfnb ;
selfnd lda laskey ; pick-up last keystroke value
cmp #escap ;
bne selfnb ; if not an ESC-X sequence, then don't swap
jsr kswap ;
jmp shomu ; Swap 40 / 80 column video, re-display shell menu
;
selfne lda #clear ; quitting time - clear the screen first
jsr chrout ;
jsr pagin ; restore Basic / Kernal operating environment
lda #128 ;
jsr setmsg ; enable Kernal control-messages only
;
jsr stdclr ; clear both screens and restore default colors
lda #15 ;
sta bank ; key = F1, set System Bank # for Long-jump
lda #<warm ;
sta pclo ; set-up address for the Long-jump
lda #>warm ;
sta pchi ; bail-out to Basic Warm-Start on key = F1
jmp kjmpfr ;
;
selfnf bit mode ;
bmi seldr ; skip this message on 80-column video
lda #13 ;
jsr fndmsa ; msg = press f5 to un-select / stop to cancel
;
; select logical drive-ID to use, check for abort, set drive-index
;
seldr lda func ; branch if func = Disk/Printer Setup (Drive = A)
beq seldrd ;
lda config ; branch if single-drive configuration (Drive = A)
beq seldrd ;
lda #44 ; pre-set msg = from which drive
ldx func ;
cpx #2 ; branch if func = 2 (format)
beq seldra ;
cpx #3 ; branch if not func = 3 (cleanup)
bne seldrb ;
seldra lda #45 ; msg = using which drive
;
seldrb jsr fndmsb ; display drive-selection message in normal-video
lda #1 ;
jsr pick ; display suffix ' A B ' and get user's choice
;
cmp #space ; branch if exit keystroke = Space-bar
beq seldrc ;
jmp shomu ; bail out to menu, Stop or F5 key was pressed
seldrc lda tempa ;
;
seldrd clc ; pick-up drive-selection index (user's choice)
adc #'A' ;
sta drivid ; set-up selected logical drive-name
and #3 ;
sta drivx ; set-up index to active unit/drive
;
; update drive/disk id-line, call browse & select as required
;
jsr wdlyn ;
lda func ; erase message-line, pick-up shell function code
cmp #5 ;
bcs exfuna ; for file / directory oriented functions 5 - 9
lsr a ;
bcc exfunc ; for functions = 0, 2, 4 don't update drive-line yet
;
exfuna jsr opndos ; open DOS command channel for the selected drive
bne exfung ;
jsr updrl ; init BAM & update ID-line: disk-name & blocks free
lda drivx ;
jsr close ; close the DOS command channel
lda stsav ;
ora doserr ; branch if ST / DOS status error
bne exfung ;
lda func ; else pick-up shell function-code
cmp #1 ;
beq exfunb ; if function = Run a Program
cmp #5 ;
bcc exfunc ; if not a file-oriented function, don't browse
;
exfunb jsr brows ;
bne exfung ; branch if ST / DOS error during browse & select
lda worka ;
cmp #-1 ; branch if there were no files on the disk
beq exfunj ;
lda laskey ; pick-up last keystroke from browse & select
cmp #stpky ;
beq exfunj ; branch if Stop key pressed while browsing
;
; execute the selected function via dispatch table
;
exfunc lda sxfun+1 ; set-up a return-addr on the stack
pha ;
lda sxfun ; so functions can RTS to 'exfund' label
pha ;
lda func ; dispatch control to selected function
asl a ;
tax ; index to dispatch table
lda funtbl+1,x ; high-byte of function exec addr
pha ;
lda funtbl,x ; low-byte of function exec addr
pha ;
rts ; to the function
;
; control returns here from all shell functions for error-check
;
exfund jsr bcmsgj ; close all files on return from functions
lda laskey ; pick-up last keystroke from the function
cmp #stpky ;
beq exfunj ; if Stop key was pressed, re-display menu
;
lda stsav ; pick-up ST / DOS error status from function
ora doserr ;
beq exfunj ; if ST and DOS status both OK
;
exfung jsr errms ; find and print error an message
;
exfunj jmp shomu ; on any key, go re-display shell menu
;

223
DOS_SHELL/shelleq.src

@ -0,0 +1,223 @@
; ******** C = 1 2 8 D. O. S. U T I L I T Y S H E L L ********
;
;
; STANDARD I/O LABELS USED IN C=128 D.O.S. SHELL
;
vic = $d000 ; 6567 video controller (40-col)
mmucr = $d500 ; system MMU memory configuration register
ramcr = $d506 ; system RAM configuration register
vic80 = $d600 ; 8563 video controller (80-col)
v8clrg = 26 ; offset to bkgnd color reg of 8563
random = $dc06 ; jiffy-clock hardware timer (CIA # 1, Timer B)
;
;
; VIDEO COLOR CONSTANTS FOR SHELL MESSAGES
;
clrbdr = 14 ; light blue border (40-col)
clrbkg = 15 ; grey3 background (40-col & 80-col)
clrhl = 151 ; grey1 used for heading line
clrmu = 31 ; dark blue used for menu area
clrml = 28 ; red used for query/message line
clrdl = 151 ; grey1 used for drive/disk id line
clrwh = 154 ; light blue used for window heading
clrfl = 31 ; dark blue used for file-list window
stdbdr = 13 ; system default border color (40-col)
stdbkg = 48 ; system default background color (40-col & 80-col)
;
;
; MESSAGE X-COORDINATES FOR COLOR CONTROL
;
lynml8 = 6 ; 80-col message line
lyndl8 = 8 ; 80-col drive/disk id line
lynwh8 = 9 ; 80-col window heading line
lynfl4 = 11 ; 40-col file-list window starts here
lynfl8 = 10 ; 80-col file-list window starts here
;
;
; C=128 KERNAL ROM SUBROUTINES CALLED
;
chkin = $ffc6 ; serial talk
chkout = $ffc9 ; serial listen
chrin = $ffcf ; input to <cr>
chrout = $ffd2 ; put character
close = $ffc3 ; close a file
clrchn = $ffcc ; untalk/unlisten
getin = $ffe4 ; get character
load = $ffd5 ; load ram from device
open = $ffc0 ; open a file
pcint = $ff81 ; set up screen
plot = $fff0 ; read (.C=1) or set (.C=0) cursor position
restor = $ff8a ; restore default i/o vectors
setlfs = $ffba ; set file parameters
setmsg = $ff90 ; allow/suppress kernal messages
setnam = $ffbd ; set file-name parameters
stop = $ffe1 ; check for stop key
;
kswap = $ff5f ; swap 40 / 80 column screen display mode
setbnk = $ff68 ; set bank # for open / load / save / verify
kjsrfr = $ff6e ; JSR to another bank with RTS to calling bank
kjmpfr = $ff71 ; JMP to another bank (no return)
lngfet = $ff74 ; Long-Fetch: LDA (fetvec),y from another bank
lngsta = $ff77 ; Long-Store: STA (stavec),y to another bank
lngcmp = $ff7a ; Long-Compare: CMP (cmpvec),y to another bank
;
;
; C=128 BASIC / EDITOR ROM ROUTINES CALLED
;
warm = $4003 ; Basic Warm-Start Entry Point used for Shell Exit
runc = $af7e ; setup basic program text/variable pointers
lnkprg = $af87 ; re-build Basic program text link-pointers
newstt = $af90 ; check stop key then execute basic stmnt
setexc = $af9c ; setup for Basic program execution
runprg = $af99 ; Basic jump-entry to run a program (Beta-7 ROMs)
wndset = $c02d ; Editor jump-table entry to set-up a window
;
;
; SYSTEM RAM-BASED BANKING ROUTINE PSEUDO-REGISTERS USED
;
*= $0002 ; Pseudo-Registers used by Long-Call / Long-Jump
;
bank *= *+1 ; Standard Bank # used by 'getcfg' (required)
pchi *= *+1 ; High-byte of Destination addr (required)
pclo *= *+1 ; Low-byte of Destination addr (required)
sreg *= *+1 ; Status Register sent / returned (opt)
areg *= *+1 ; .A register sent / returned (opt)
xreg *= *+1 ; .X register sent / returned (opt)
yreg *= *+1 ; .Y register sent / returned (opt)
;
stavec = $02b9 ; Addr of Z-page indirect pointer for Long-Store
;
cmpvec = $02c8 ; Addr of Z-page indirect pointer for Long-Compare
;
;
; SHELL USAGE OF FUNCTION-KEY APPLICATION RAM AREA & RAM BANKS 0 & 1
;
*= $1800 ; Space Reserved For F-key Applications Use
;
zpsav *= *+64 ; Save-Area for Basic Zero-Page Swap-out
pfsav *= *+16 ; Save-area for System Function-key Definitions
pfdef *= *+16 ; Shell Function-key Definitions Set by Cold-Start
lstbf *= *+32 ; Temp-Hold Buffer for File-List Management
bfnam = lstbf+5 ; Relative Offset to File-name for File-list Entry
fdriv *= *+2 ; Physical Drive # for Opening / Loading Files
fnam1 *= *+20 ; Temp Buffer for File-name-1
*= *+2 ;
fnam2 *= *+16 ; Temp Buffer for File-name-2
dosbf *= *+40 ; Temp Buffer for Disk Header-Name & Blocks Free
dsnam = dosbf+12 ; Relative Offset to Header-name Field
bfree = dosbf+29 ; Relative Offset to Blocks-free Field
ramlnk *= *+48 ; Ram-Code Links to ROM Calls & Inter-Bank Transfers
;
lista = $0400 ; Primary File-List Buffer-A in Ram Bank # 1
listb = $1600 ; Secondary File-List Buffer-B in Ram Bank # 1
bama = $1900 ; BAM Image Buffer for Restore / Backup (Both Sides)
shell = $1a00 ; Warm-Start Entry-Point to DOS Shell on F-key # 1
bufra = $5b00 ; Start of I/O Buffer for Backup / Copy in Bank # 0
bufrb = listb ; Start of I/O Buffer for Backup / Copy in Bank # 1
bufnd = $ff00 ; End of I/O Buffer for Backup / Copy in Both Banks
;
;
; BASIC, EDITOR & KERNAL VARIABLES & MEMORY LOCATIONS REFERENCED
;
zpbas = $0020 ; Start of Basic Z-page used for Shell variables
stat = $0090 ; system status word ST for input / output
jiflo = $00a2 ; low-byte of system jiffy-clock counter
mode = $00d7 ; screen editor 40 / 80 column mode ($80 = 80-col)
qtsw = $00f4 ; screen editor quote-mode switch ($01 = quote-mode)
insrt = $00f5 ; screen editor insert-mode switch ($01 = insert-mode)
scroll = $00f8 ; screen editor scrolling/line-link flag
rptflg = $0a22 ; screen editor key-repeat flag ($80 = all, $60 = none)
pkybuf = $1000 ; System Prog. Function-key Buffer (length = 256 bytes)
txtop = $1210 ; Pointer to Basic Top-of-Text (+1)
;
;
; SEMI-PERMANENT VARIABLES STORED IN BASIC ZERO-PAGE
;
*= zpbas ; Origin for Shell Variables in Basic Zero-Page
;
lang *= *+1 ; current language for shell messages
prdev *= *+1 ; current device # for printer (0 = none)
config *= *+1 ; current system disk configuration type
drivid *= *+1 ; selected shell logical drive id
unita *= *+1 ; device nr for drive: A
unitb *= *+1 ; device nr for drive: B
driva *= *+1 ; physical drive # for drive: A
drivb *= *+1 ; physical drive # for drive: B
drivx *= *+1 ; current active unit/drive/lfn index
lfnr *= *+1 ; current active data-file LFN
lfna *= *+1 ; data-channel logical file nr. for drive: A
lfnb *= *+1 ; data-channel logical file nr. for drive: B
stsav *= *+1 ; temp save cell for STatus
doserr *= *+1 ; last D.O.S. error code returned
laskey *= *+1 ; holds last keystroke for controls
;
; TEMPORARY VARIABLES STORED IN BASIC ZERO-PAGE
;
func *= *+1 ; current shell function in progress
msgnr *= *+1 ; current message nr to print
curmsg *= *+2 ; pointer to current message group
msglen *= *+1 ; length of current message
msgxy *= *+2 ; screen coordinates for current message
work *= *+2 ; misc. temp work area
worka *= *+2 ; misc. temp work area
workb *= *+2 ; misc. temp work area
workc *= *+2 ; misc. temp work area
workd *= *+2 ; misc. temp work area
worke *= *+2 ; misc. temp work area
diska *= *+2 ; diskette-id code for drive: A
diskb *= *+2 ; diskette-id code for drive: B
pntra *= *+2 ; pointers used
pntrb *= *+2 ; for file-
pntrc *= *+2 ; list browse
pntrd *= *+2 ; and select
pntre *= *+2 ; disk I/O and
pntrf *= *+2 ; screen display
flen1 *= *+1 ; length of file-name-1
fadr1 *= *+2 ; file-name-1 address for Open / DOS command
fpbuf *= *+4 ; Work-area for Binary-Ascii Number Conversions
tempa *= *+1 ; temp work area
tempb *= *+1 ; temp work area
tempc *= *+1 ; temp work area
tempd *= *+1 ; temp work area
*= *+3 ;
;
zplen = *-zpbas-1 ; length of Basic zero-page to save before using
;
;
; CHARACTER VALUES USED FOR CONTROLS
;
stpky = 3 ; value to flag stop key pressed
caret = 13 ; carriage-return character
crsrd = 17 ; cursor-down character
rvson = 18 ; reverse-video ON char
home = 19 ; cursor-home character
delt = 20 ; screen delete character
crsrr = 29 ; cursor-right character
space = 32 ; blank space character
quote = 34 ; double-quote character
acent = 39 ; accent-mark used in messages
f1 = 133 ; function key # 1
f3 = 134 ; function key # 3
f5 = 135 ; function key # 5
f7 = 136 ; function key # 7
graph = 141 ; start of shifted screen-cntl chars
crsru = 145 ; cursor-up character
rvsoff = 146 ; reverse-video OFF char
clear = 147 ; clear-screen character
crsrl = 157 ; cursor-left character
shpac = 160 ; shifted space character
;
;
; SCREEN EDITOR WINDOW-CONTROL CHARACTERS & MISC. LABEL VALUES
;
escap = 27 ; Screen-Editor ESCape character
erase = '@' ; Erase to End-of-Screen
erlyn = 'Q' ; Erase to End of Current Line
scrup = 'V' ; Scroll the Screen Upwards
scrdn = 'W' ; Scroll the Screen Downwards
swap = 'X' ; Swap 40 / 80 Column Display Mode
;
cent = 128 ; bit 7 set in Y-position = center the message
blink = 15 ; nr of jiffies for flashing options
wtsix = 640 ; nr of jiffies for language selection
;

758
DOS_SHELL/shellfa.src

@ -0,0 +1,758 @@
;
; SHELL FUNCTION CODES 0 - 3 ARE FOUND IN THIS MODULE. THEY ARE
; CALLED BY SHELL-CONTROL, AND IN TURN CALL SUBROUTINES WITHIN
; THE SHELLSA AND SHELLSB MODULES TO PERFORM STANDARDIZED TASKS.
;____________________________________________________________________________
;
; FUNCTION CODE = 0: CHANGE DISK / PRINTER SETUP
;
; display page-1 messages, save X-Y positions and sub-strings needed
;
confg lda #64 ; disable auto-repeat on all keys for this function
sta rptflg ;
jsr crmsg ; print msg = move cursor then press space to select
;
lda #61 ; msg = drive X: device # =
ldx #lynfl8 ;
ldy #11 ; X-Y positions for 80-col video
bit mode ;
bmi confgb ; on 80-col video
ldy #2 ; X-Y positions for 40-col video
inx ;
confgb stx diskb ; save message X-position for later
jsr fndmsb ; find and print the message in normal-video
lda #'A' ;
jsr confg2 ; plot cursor to the drive name and print it
lda #3 ;
jsr prcon ; display suffix ' 8 9 10 11'
lda msgxy+1 ;
sta diskb+1 ; save Y-position of suffix sub-string
lda curmsg ;
sta worka ; save address of suffix sub-string
lda curmsg+1 ;
sta worka+1 ; suffix address hi-byte
;
lda #62 ; msg = drive # =
ldx #lynfl8 ;
ldy #54 ; X-Y positions for 80-col video
bit mode ;
bmi confgc ; on 80-col video
ldy #12 ; X-Y positions for 40-col video
ldx #lynfl4+2 ;
confgc stx pntra ; save message X-position for later
jsr fndmsb ; find and print the message in normal-video
lda #2 ;
jsr prcon ; display suffix ' 0 1 '
lda msgxy+1 ;
sta pntra+1 ; save Y-position of suffix sub-string
lda curmsg ;
sta workb ; save address of suffix sub-string
lda curmsg+1 ;
sta workb+1 ; suffix address hi-byte
;
lda #61 ; msg = drive X: device # =
ldx #lynfl8+2 ;
ldy #11 ; X-Y positions for 80-col video
bit mode ;
bmi confgd ; on 80-col video
ldy #2 ; X-Y positions for 40-col video
ldx #lynfl4+4 ;
confgd stx pntrb ; save message X-position for later
jsr fndmsb ; find and print the message in normal-video
lda #'B' ;
jsr confg2 ; plot the cursor to the drive name and print it
lda #3 ;
jsr prcon ; display suffix ' 8 9 10 11'
lda msgxy+1 ;
sta pntrb+1 ; save msg Y-position of suffix sub-string
;
lda #62 ; msg = drive # =
ldx #lynfl8+2 ;
ldy #54 ; X-Y positions for 80-col video
bit mode ;
bmi confge ; on 80-col video
ldy #12 ; X-Y positions for 40-col video
ldx #lynfl4+6 ;
confge stx pntrc ; save message X-position for later
jsr fndmsb ; find and print the message
lda #2 ;
jsr prcon ; display suffix ' 0 1 '
lda msgxy+1 ;
sta pntrc+1 ; msg Y-position of sub-string
;
lda #15 ; msg = printer device # = 4 5 6 none
jsr fndmsb ; find and print the message in normal-video
ldx msgxy ;
stx pntrd ; save message X-position for later
ldy #8 ;
confgf lda (curmsg),y ; search for start of the sub-string
iny ;
cmp #'=' ; this char is two before the sub-string
bne confgf ;
iny ; so bump the string-index before using it
tya ;
clc ; message Y-position plus offset to sub-string
adc msgxy+1 ;
sta pntrd+1 ; give Y-position for first sub-string character
tya ;
adc curmsg ; message table-addr plus offset to sub-string
sta workc ;
lda #0 ;
adc curmsg+1 ; sub-string = ' 4 5 6 none'
sta workc+1 ;
jsr confg0 ; print msg # 63 = change disk device #
;
; set-up indexes to current default units/drives within sub-strings
;
lda #0 ;
sta msgnr ; used as index to current message-line
lda unita ;
and #7 ;
sta workd ; used as index to device # for drive: A
lda unitb ;
and #7 ;
sta worke ; used as index to device # for drive: B
lda driva ;
and #1 ;
sta workd+1 ; used as index to physical drive for drive: A
lda drivb ;
and #1 ;
sta worke+1 ; used as index to physical drive for drive: B
lda prdev ;
and #3 ; used as index to device # for printer
sta diska ;
lda #rvsoff ; initial pre-set for message flasher
;
; control routine for default device / drive set-up changes
;
confgg sta work ; store pre-set value for message-flasher
ldy msgnr ;
cpy #5 ; branch if not msg-line # 5 (device # change)
bne confgh ;
jsr confg0 ; special setup on msg-line = #5
bne confgn ;
confgh lda #3 ;
sta msglen ; length to print for all other default selections
tya ;
asl a ; forms index to screen X-Y pairs
tax ;
lda diskb,x ; X-position for curr msg line
sta msgxy ;
lda diskb+1,x ; Y-position of first line-item
ldx workd,y ; index-value for current line-item
beq confgj ; if line-item index = zero
clc ;
confgi adc msglen ; add Y-offset for each line-item
dex ;
bne confgi ; if more to add
;
confgj sta msgxy+1 ; set Y-position for line-item
ldx #2 ;
tya ; current msg line to update
ror a ;
bcs confgk ; if current line = 1 or 3
ldx #4 ;
ror a ; test for current line = 4
ror a ;
bcs confgk ; on current line index = 4
ldx #0 ; current line = 0 or 2
confgk lda worka,x ;
sta curmsg ; set base addres of sub-string
lda worka+1,x ;
sta curmsg+1 ; but it still needs line-item offset
;
ldx workd,y ; index to current line-item
beq confgn ; if line-item index = zero
confgl clc ;
lda curmsg ; base address of sub-string
adc msglen ;
sta curmsg ; plus offset for each line-item
bcc confgm ;
inc curmsg+1 ; bump sub-string addr on carry
confgm dex ;
bne confgl ; if more to add
;
; flash current line-item, get a key, decide what to do with it
;
confgn lda work ; pick-up rvs/norm video pre-set
jsr flasha ; blinks a message and gets a keystroke
lda laskey ;
cmp #stpky ; check values of key returned from flasher
beq confgp ; exit to function-menu, Stop key was pressed
cmp #f7 ;
bne confgr ; if key not = F7
jsr dpset ; quitting time, save new defaults, re-calc config
confgp jsr wdlyn ;
jmp wders ; clear msg-line, file-list window, then return
;
confgr cmp #f5 ;
beq confgn ; ignore the f5 key here
ldy msgnr ; pick-up index to current msg-line
ldx workd,y ; pick-up line-item value
cmp #space ;
bne confgs ; if key not = space
lda #crsrd ; key = space, check current message line #
cpy #5 ;
bne confgs ; for lines < #5, treat space like cursor-down
jmp dvchg ; for line #5, change disk device # was selected
;
confgs sta laskey ; save key value in case it changed
cmp #crsrd ;
beq confgx ; on key = cursor-down (or Space)
cmp #crsru ;
beq confgw ; on key = cursor-up
cpy #5 ;
beq confgn ; on msg-line #5, ignore cursor left / right key
;
; change message line-nr / line-item values according to key values
;
tya ; curr msg line-nr (key = cursor left / right)
ror a ;
bcc confgt ; message line-nr = 0, 2, or 4
txa ;
eor #1 ; toggle the physical drive #
tax ;
bcs confgv ; on msg-line = 1 or 3
confgt lda laskey ;
bmi confgu ; key must be = cursor-left
inx ;
txa ; on cursor-right bump line-item index
and #3 ;
tax ; make the index wrap-around 0 - 3 values
jmp confgv ;
confgu dex ; on cursor-left decrement line-item index
bpl confgv ;
ldx #3 ; make the index wrap-around 0 - 3 values
;
confgv stx workd,y ; set new line-item index value
jsr prtmsk ; clear old default value to normal-video
lda #rvson ; to pre-set message flasher for rvs-video
jmp confgg ; go setup to flash new line-item default
;
confgw tya ; save old message line-nr (key = cursor-up)
dey ;
bpl confgy ; on key = cursor-up decrement line-nr
ldy #5 ;
bne confgy ; make line-nr wrap around 0 - 5 values
;
confgx tya ; save old message line-nr (key = cursor-down)
iny ;
cpy #6 ; on key = cursor-down bump line-nr
bne confgy ;
ldy #0 ; make line-nr wrap around 0 - 5 values
;
confgy sty msgnr ; set new message line-nr
cmp #5 ;
bne confgz ; if old msg-line not #5, leave item in rvs-video
jsr prtmsk ; clear msg-line #5 to normal-video
confgz lda #rvsoff ;
jmp confgg ;pick-up flasher pre-set, go flash new msg-line
;
confg0 lda #63 ; msg = change disk device #
ldx #lynfl8+5 ;
ldy #52 ; X-Y positions for 80-col video
bit mode ;
bmi confg1 ; on 80-col video
ldy #cent ; X-Y positions for 40-col video
ldx #lynfl4+12 ;
confg1 jsr fndmsb ; find and print the message in normal-video
ldy #5 ;
sty msgnr ; used as index to current message-line
lda #rvsoff ;
sta work ; pre-set flasher for normal-video
rts ;
;
confg2 pha ; save the drive name for later
ldy #3 ;
confg3 iny ; search for position of drive name in message
lda (curmsg),y ;
cmp #':' ; this char is one byte beyond drive name
bne confg3 ;
dey ; so back-up one char position
clc ;
tya ;
adc msgxy+1 ; start of message plus offset to drive name
ldx msgxy ;
tay ;
jsr plot ; move the cursor to the drive name
pla ;
jmp chrout ; print the drive name
;
; on F7 key, lock in new defaults, re-calc config, return to menu
;
dpset lda workd ; convert line-item indexes to shell defaults
ora #8 ;
sta unita ; new default device # for drive: A
lda worke ;
ora #8 ;
sta unitb ; new default device # for drive: B
lda workd+1 ;
ora #48 ;
sta driva ; new physical drive # for drive: A
lda worke+1 ;
ora #48 ;
sta drivb ; new physical drive # for drive: A
lda diska ;
ora #4 ;
sta prdev ; new default printer device # (0 = None)
;
ldx #0 ; pre-set for single-drive configuration
lda unita ;
cmp unitb ; check for differing device nrs.
beq dpsetb ;
ldx #2 ; set dual-unit configuration
bne dpsetc ;
dpsetb lda driva ; check for differing drive nrs.
cmp drivb ;
beq dpsetc ; set single-drive configuration
inx ;
dpsetc stx config ; set new configuration value
rts ;
;
; DISK / PRINTER SETUP (PAGE 2) CHANGE DISK DEVICE # WAS SELECTED
;
; print the messages to start changing the device #
;
dvchg jsr dpset ; set-up the new default configuration
jsr wdlyn ; erase the query-message line
bit mode ;
bmi dvchgb ; on 80-col video
jsr wders ; erase the 40-col file-list window
ldx #lynfl4 ;
ldy #cent ; set-up X-Y position for 40-cols
lda #63 ;
jsr fndmsb ; msg = change disk device #
;
dvchgb lda #16 ; msg = turn on the drive to be changed
jsr fndmsb ;
lda #17 ; msg = turn off the other drive
jsr fndmsb ;
ldx #lynfl8+9 ; pre-set X-position for 80-column video
bit mode ;
bmi dvchgd ;
ldx #lynfl4+4 ; set X-position for 40-column video
dvchgd ldy #cent ;
lda #64 ; msg = then press space
jsr fndmsb ;
;
dvchgf jsr getky ; fetch a keystroke
lda laskey ;
cmp #space ;
beq dvchgj ; proceed on key = space
cmp #stpky ;
bne dvchgg ; if not Stop key, go check for F5
rts ;
dvchgg cmp #f5 ;
bne dvchgf ; ignore all keys except space, Stop, or F5
jsr confgp ;
jmp confg ; on key = F5, go start over at the top
;
; hunt for any disk device # present on the buss
;
dvchgj lda unita ;
sta worka ; save current device # for drive A
lda #8 ;
sta unita ; set-up first device # to hunt for
;
dvchgk jsr opndos ; open DOS command channel, branch if device is present
beq dvchgm ;
inc unita ; else, bump the device nr, check for last device #
lda unita ;
cmp #12 ; branch if no device found yet, to try the next one
bne dvchgk ;
lda #8 ; when all possible devices are dead
sta unita ;
jsr errms ; tell the user nobody is home (device # 8 not present)
lda worka ;
sta unita ; restore the original device # for drive A
;
lda laskey ; pick-up the keystroke from the error-message
cmp #space ;
beq dvchgj ; if key = space, try the device hunt again
cmp #stpky ;
beq dvchgl ; if Stop key pressed, bail out to function menu
jsr confgp ;
jmp confg ; on key = F5, start over again at the top
dvchgl rts ;
;
; reset the live unit, then ask the user to select the new device #
;
dvchgm lda #14 ; send 'UI' command (soft-reset) to the live unit
jsr sendos ;
jsr crmsg ; print msg = move cursor then press space to select
lda #18 ;
jsr fndmsb ; msg = 'new device # = '
lda #3 ;
jsr prcon ; display suffix ' 8 9 10 11 '
lda msgxy+1 ;
sta workb+1 ; save Y-position of suffix sub-string
;
lda unita ; pick-up the device # that responded
and #7 ;
sta workb ; set index into the sub-string
lda #3 ;
sta msglen ; set length for each device in sub-string
;
dvchgp lda #<constd ; set base address of sub-string
sta curmsg ;
lda #>constd ; but it still needs line-item offset
sta curmsg+1 ;
lda workb+1 ; Y-position of first device #
ldx workb ; current line-item index into the sub-string
beq dvchgr ; if line-item index = zero
clc ;
dvchgq adc msglen ; add offset for each line-item
dex ;
bne dvchgq ; if more to add
;
dvchgr sta msgxy+1 ; set Y-position for current line-item
ldx workb ;
beq dvchgu ; if line-item index = zero
dvchgs clc ;
lda curmsg ; base address of sub-string
adc msglen ;
sta curmsg ; plus offset for each line-item
bcc dvchgt ;
inc curmsg+1 ; bump sub-string addr on carry
dvchgt dex ;
bne dvchgs ; if more to add
;
; flash the current device as the default then select new device
;
dvchgu jsr flash ; blinks the current option and gets a keystroke
lda laskey ;
cmp #stpky ; check keystroke value returned from flasher
bne dvchgv ;
jmp dxchgv ; bail out, Stop key was pressed
;
dvchgv cmp #space ;
beq dxchgc ; on key = space, a new device # has been selected
cmp #f5 ;
bne dvchgx ; if key not = F5, go check for cursor right-left
jsr confgp ;
jmp confg ; key = F5, start over again at the top
;
dvchgx ldx workb ; pick-up current line-item index to new device #
cmp #crsrr ;
beq dxchga ; if key = cursor-right
cmp #crsrl ;
bne dvchgu ; if key not = cursor-left (ignore all others)
;
dex ; key = cursor-left, decrement line-item index
bpl dxchgb ;
ldx #3 ; make index wrap around values 0 - 3
bne dxchgb ;
dxchga inx ; key = cursor-right, increment line-item index
txa ;
and #3 ; make index wrap around values 0 - 3
tax ;
dxchgb stx workb ; set the new line-item index value
jsr prtmsk ;
beq dvchgp ; clear old option, go flash the new one
;
; change the device that responded to the selected new device #
;
dxchgc lda drivx ; close the command channel for the old device #
jsr close ;
lda #8 ; set-up to hunt for its device # after soft-reset
sta unita ;
dxchgd jsr opndos ; try to open command channel, branch when status OK
beq dxchge ;
inc unita ; else, bump the device #, continue the hunt
bne dxchgd ;
;
dxchge ldx drivx ; found it, set-up DOS cmnd chan as current input
jsr chkin ;
dxchgf jsr chrin ; fetch & waste status-bytes until the first
cmp #'V' ;
bne dxchgf ; char of the DOS version string is found
ldy #0 ;
dxchgg jsr chrin ; then save the next three bytes for reference
sta fnam2,y ;
iny ;
cpy #3 ; branch while more bytes to save
bne dxchgg ;
dxchgh jsr chrin ; then waste the rest until EOI recvd
lda stat ;
beq dxchgh ; if not end-of-message yet
jsr clrchn ;
;
lda fnam2 ; pick-up first byte of DOS-type identifier
cmp #'3' ;
beq dxchgj ; if unit-type is 1571 / 1572 DOS 3.0
ldy #16 ;
lda fnam2+2 ; else, pre-set DOS cmnd # for 154x / 2031 unit-types
cmp #'6' ;
beq dxchgm ; if unit-type is 154x / 2031 DOS 2.6
ldy #15 ;
bne dxchgm ; else, pre-set DOS cmnd # for 4040-type units
;
dxchgj ldx drivx ; set-up DOS cmnd chan as current output
jsr chkout ;
ldy #2 ; set-up index for 157x unit-type DOS cmnd
dxchgk lda dcmd17,y ;
jsr chrout ; send canned device # / mode change cmnd for 157x
dey ;
bpl dxchgk ; while more canned string to send
clc ;
lda workb ; pick-up index to user-selected new device #
adc #8 ;
jsr chrout ; index plus 8 = new device #
jsr clrchn ;
jmp dxchgn ; return to default i/o, go close DOS cmnd chan
;
dxchgm lda #2 ;
sta fnam1 ; nr of bytes for M-W cmnd
clc ;
lda workb ; line-item index for selected new device #
adc #40 ;
sta fnam1+1 ; plus 8 plus 32 yields new device #
adc #32 ;
sta fnam1+2 ; plus 32 again for last byte of M-R
lda #3 ;
sta flen1 ; set file-name length for M-R command
tya ;
jsr sendos ; send the M-W command to change the device #
;
dxchgn lda #19 ; msg = done... turn on the other drive
jsr fndmsb ;
ldx #lynfl8+14 ; pre-set X-position for 80-column video
bit mode ;
bmi dxchgp ;
ldx #lynfl4+9 ; set X-position for 40-column video
dxchgp ldy #cent ;
lda #64 ; msg = then press space
jsr fndmsb ;
;
dxchgt jsr getin ; wait for any keystroke
beq dxchgt ;
lda #stpky ; but don't care what it really was
sta laskey ;
dxchgv lda drivx ; close the DOS cmnd chan for the old device #
jsr close ;
lda worka ; restore original default device # for drive A
sta unita ;
rts ; go re-display function menu
;
;
; FUNCTION CODE = 1: LOAD & RUN A BASIC PROGRAM
;
runpg lda #22 ;
jsr fndmsb ; msg = loading program: file-name-xx
ldy #0 ;
runpga lda bfnam,y ; set-up the file-name for loading
sta fnam1,y ;
jsr namot ; and print the file-name being loaded
iny ;
cpy #16 ; branch if more file-name to move and print
bne runpga ;
;
; setup kernal and DOS, load the selected program, check for Stop-key
;
ldy drivx ;
lda driva-1,y ; set-up physical drive # to load from
sta fdriv ;
lda #':' ; set-up drive # and colon in front of file-name
sta fdriv+1 ;
lda lfnr,y ; set-up LFN and device # for the load
ldx unita-1,y ;
ldy #0 ; set-up Secondary-Addr for Basic program load
jsr setlfs ;
lda #18 ; set-up file-name length for the load
ldx #<fdriv ;
ldy #>fdriv ; set-up pointer to file-name
jsr setnam ;
lda #12 ; set-up the 'load' and 'file-name' bank #s
tax ;
jsr setbnk ; before calling Kernal Load routine
;
jsr pagin ; restore Basic zero-page before loading
;
lda #<load ; set-up address of Kernal Load routine
sta pclo ;
lda #>load ; for a Long-Call via Shell RAM code
sta pchi ;
lda #0 ; tell Kernal we want to load a program
sta areg ;
ldx #$01 ; pick-up Start-of-Basic address set by Cold-start
stx xreg ;
ldy #>bufra ; so the program loads above the Shell in Bank # 0
sty yreg ;
jsr rajsrf ; to return here instead of somewhere inside Basic
bcc runpgc ;
jsr pagot ; Stop pressed while loading, restore Shell zero-page
;
lda #stpky ; show Stop key as the last keystroke
sta laskey ;
rts ; bail out to re-display function menu
;
; No stop-key during load, set-up Basic environment, then run the program
;
runpgc pla ; throw away normal return-addr to control module
pla ;
lda xreg ; pick-up saved end-of-load address from Long-call
sta txtop ;
lda yreg ; leave word for basic, where program-text ends
sta txtop+1 ;
lda #128 ; enable Kernal control-messages
jsr setmsg ;
jsr stdclr ; clear both screens and restore default colors
;
jmp runjmp ; go make direct-calls from Ram to Run Basic Program
;
;
; FUNCTION CODE = 2: FORMAT A DISKETTE
;
; ask user for blank disk - abort on key = f5 / Stop
;
formt jsr opndos ;
bne formte ;
formta lda #46 ; msg = insert a blank disk then press space
jsr fndmsb ;
formtb jsr getky ; try for a keystroke
cmp #space ;
beq formtc ; on key = space
cmp #f5 ;
beq formtc ; on key = F5
cmp #stpky ;
bne formtb ; if key not = Stop
;
formtc jsr wdlyn ; erase the message-line
lda laskey ;
cmp #space ; branch if last keystroke = Space
beq formtf ;
formte sec ;
rts ; key = F5 / Stop, abort format with no action
;
; read the old disk-name, check for error, setup a default name
;
formtf jsr updrl ; try to update the drive/disk id-line
lda stsav ;
bne formtg ; on ST error, assume drive not ready
lda doserr ;
beq formtj ; no errors found, so proceed with format
cmp #22 ;
bcc formth ; unformatted disk, no disk, or drive door open
;
formtg jsr errms ; show an error-message, get response keystroke
cmp #stpky ;
beq formte ; on key = Stop, abort format with no action
cmp #space ;
beq formtf ; on key = space, just try to read the disk again
ldx func ;
cpx #2 ; branch on format func & key = f5, re-start from top
beq formta ;
bne formtf ; else, just try to read the disk again
;
formth lda drivx ; pick-up current active drive index
asl a ;
tay ; forms index to disk-id field for active drive
lda #shpac ;
sta diska-2,y ; set-up disk-id field with shifted spaces
sta diska-1,y ;
ldx #15 ;
formti sta dsnam,x ; set-up disk-name field with shifted spaces
dex ;
bpl formti ; if more shifted spaces to store
;
; prompt user for new disk-name, showing old-name & ID as default
;
formtj lda #27 ; msg = enter disk name: diskette-name-xx
jsr fndmsb ;
lda #rvson ; set reverse-video = On to display disk-name
jsr chrout ;
ldy #0 ; set-up index to disk-name
formtk lda dsnam,y ;
sta fnam1,y ; set-up current name as default if user hits Return
jsr namot ;
iny ; and display the current disk-name
cpy #16 ;
bne formtk ; while more disk-name to set-up & display
;
sty flen1 ; set-up length of file-name-1 for DOS command
lda #44 ;
jsr chrout ; comma separates disk-name & disk-id fields
lda drivx ;
asl a ; forms index to disk-id for current active drive
tay ;
lda diska-2,y ; display first disk-id char
jsr chrout ;
lda diska-1,y ; display second disk-id char
jsr chrout ;
;
; enter disk-name, start over on key = f5, abort on stop-key
;
clc ;message Y-position plus message length
lda msgxy+1 ;
adc msglen ; gives Y-position of disk-name field
sta msgxy+1 ;
jsr enter ; returns disk-name in fnam1, disk-id in diska(b)
jsr wdlyna ;
lda laskey ; pick-up exit-keystroke from data-entry
cmp #caret ;
beq formtn ; all ok, user likes current name & id-code
cmp #stpky ;
beq formte ; on key = Stop, user wants to kill function
;
ldx func ; pick-up shell function code
cpx #2 ;
beq formtl ; key = F5 & func not = Format, user don't want format
jmp formte ;
formtl jmp formta ; on func = Format & key = F5, start again from the top
;
formtn lda #28 ;
jsr fndmsb ; msg = disk format working on drive: X
clc ;
lda drivx ; current active drive-index plus 64 gives drive-name
adc #64 ;
jsr chrout ; print the active logical-drive name
;
; check for long/short format, generate ID for long format
;
lda #5 ; pre-set for long-format cmnd
ldx work+1 ;
cpx #2 ; branch if user entered a disk-id code
beq formts ;
lda #4 ; pre-set for short-format command
ldx doserr ;
beq formts ; no read-error on header, so do short format
lda drivx ;
asl a ; active drive times 2 = index for diskette ID variable
tay ;
lda random ; pick-up CIA # 1 hardware value for ID char
;
and #127 ; clear bit 7 off ID char
cmp #48 ;
bcs formtp ; if char already in range 48 - 127
adc #48 ;
formtp sta diska-2,y ; set char to range (first ID char)
lda random+1 ;
and #127 ; clear bit 7 off ID char
cmp #48 ;
bcs formtq ; if char already in range 48 - 127
adc #48 ;
formtq sta diska-1,y ; set char to range (second ID char)
lda #5 ; use long-format command with random id-code
;
formts jsr sendos ; send the format command, save status-flag
php ;
jsr wdlyna ; erase the 'format-working' message
plp ;
bcc formtv ; return flag .C clear = status OK to caller
jmp formtg ; else, go show error-message, maybe re-try
formtv rts ;
;
;
; FUNCTION CODE = 3: CLEANUP A DISK (VALIDATE BAM)
;
clean jsr opndos ;
bne cleanb ; open DOS command channel, branch if status bad
lda #29 ;
jsr fndmsb ; msg = disk cleanup working on drive: x
lda drivid ;
jsr chrout ; then print the active drive name
cleana lda #2 ;
jsr sendos ; send validate command to active drive
jsr wdlyna ;
cleanb rts ; clear the 'working' message & exit to menu
;

1464
DOS_SHELL/shellfb.src

File diff suppressed because it is too large Load Diff

1153
DOS_SHELL/shellsa.src

File diff suppressed because it is too large Load Diff

1418
DOS_SHELL/shellsb.src

File diff suppressed because it is too large Load Diff

789
DOS_SHELL/shelltb.src

@ -0,0 +1,789 @@
; TABLES AND CONSTANTS USED BY SHELL FUNCTIONS AND SUBROUTINES
;
;
; DISPATCH TABLE FOR SHELL FUNCTION ENTRY POINTS
;
funtbl .word confg-1 ; change disk/printer setup
.word runpg-1 ; run a (basic) program
.word formt-1 ; format (header) a disk
.word clean-1 ; cleanup (validate BAM) a disk
.word bakup-1 ; copy (backup) a disk
.word copy-1 ; copy selected files
.word delet-1 ; delete (scratch) files
.word restr-1 ; restore (un-scratch) files
.word renam-1 ; rename selected files
.word reseq-1 ; re-order disk directory
;
sxfun .word exfund-1 ; Shell Functions return control to this label
;
;
; TABLE OF D.O.S. COMMAND STRING PATTERNS
;
dostbl = * ; start of DOS command table
;
dcmd00 .byt dcmd01-* ; command length byte
.byt 'I',1 ; initialize the active drive
dcmd01 .byt dcmd02-* ;
.byt 'I',2 ; initialize the other drive
dcmd02 .byt dcmd03-* ;
.byt 'V',1 ; validate bam on the active drive
dcmd03 .byt dcmd04-* ;
.byt 'V',2 ; validate bam on the other drive
dcmd04 .byt dcmd05-* ;
.byt 'N',1,':',3 ; format disk - without ID code
dcmd05 .byt dcmd06-* ;
.byt 'N',1,':',3,',',5 ; format disk - with ID code
dcmd06 .byt dcmd07-* ;
.byt 'D',2,'=',1 ; dual-drive backup
dcmd07 .byt dcmd08-* ;
.byt 'C',2,':',4,'=',1,':',3 ; dual-drive file copy
dcmd08 .byt dcmd09-* ;
.byt 'R',1,':',4,'=',1,':',3 ; rename a file
dcmd09 .byt dcmd10-* ;
.byt 'S',1,':',3 ; scratch a file
dcmd10 .byt dcmd11-* ;
.byt 'U1:',6 ; read a block
dcmd11 .byt dcmd12-* ;
.byt 'U2:',6 ; write a block
dcmd12 .byt dcmd13-* ;
.byt 'B-P:',6 ; set dos buffer pointer
dcmd13 .byt dcmd14-* ;
.byt 'P',3 ; position relative file pointer
dcmd14 .byt dcmd15-* ;
.byt 'UI' ; soft-reset disk-unit to device # 8
dcmd15 .byt dcmd16-* ;
.byt 'M-W',12,0,3 ; write dos memory (for 4040 device # change)
dcmd16 .byt dcmd17-* ;
.byt 'M-W',119,0,3 ; write dos memory (154x / 2031 device # change)
;
dcmd17 .byt '>0U' ; device # / mode change for 157x unit-type
;
; special pattern for cmnd # 17, stored backwards
;
;
; FILE-TYPE CODES USED BY COPY-FILES FUNCTION FOR OPENING FILES
;
ftype .byt ' SPUL' ; Sequential, Program, User, Relative (L) Length
;
;
; BIT PATTERNS USED BY 'RESTORE FILES' AND 'BACKUP' FOR B.A.M. SEARCH
;
bits .byt 1, 2, 4, 8, 16, 32, 64, 128 ; to isolate allocated blocks
;
;
; TRACK / SECTOR LIMITS BY DISK-BAND FOR SINGLE-DRIVE / DUAL-UNIT BACKUP
;
band .byt 17, 20, 24, 18, 30, 17, 35, 16 ; Bands 0 - 3 for Side # 0
.byt 52, 20, 59, 18, 65, 17, 70, 16 ; Bands 4 - 7 for Side # 1
;
;
; CONSTANTS USED IN BINARY - ASCII CONV FOR SCREEN / PRINTER / DISK
;
mask .byt '0000' ; four ascii zeros to start the conversion
;
dval .byt 10, 100, 2, 5, 6 ; decimal values for conversion
;
;
; BROWSING-CURSOR IMAGE FOR SCREEN OUTPUT (Data is Backwards!)
;
bzcur .byt rvsoff, clrfl, 62, 192, 192, clrml, rvson
;
;
; TABLE OF USEABLE KEY-STROKE VALUES FOR 'Getky' SUBROUTINE
;
kytab .byt 0, f7, f5, f3, space ;
.byt crsru, crsrd, crsrl, crsrr ;
;
;
; SHELL MESSAGE COLOR TABLE: 80-Col., 40-Col. Within X-Position
;
msclr .byt clrhl, clrhl, clrmu, clrmu, clrmu, clrmu
.byt clrmu, clrmu, clrmu, clrmu, clrmu, clrmu
.byt clrml, clrmu, clrdl, clrml, clrdl, clrdl
.byt clrwh, clrdl, clrfl, clrwh
;
;
; SCREEN X-Y COORDINATES FOR TABLE-PLOTTED SHELL MESSAGES
;
; Format: 80-Col. X-Y, 40-Col. X-Y Within Message-Number (0 - 20)
;
xytbl .byt 1, 5, 1, 1 ; msg # 0
.byt 2, 5, 2, 1 ; msg # 1
.byt 3, 5, 3, 1 ; msg # 2
.byt 4, 5, 4, 1 ; msg # 3
.byt 2, 31, 5, 1 ; msg # 4
.byt 3, 31, 1, 21 ; msg # 5
.byt 4, 31, 2, 21 ; msg # 6
.byt 2, 57, 3, 21 ; msg # 7
.byt 3, 57, 4, 21 ; msg # 8
.byt 4, 57, 5, 21 ; msg # 9
.byt 1, cent, 1, cent ; msg # 10
.byt 3, cent, 3, cent ; msg # 11
.byt 5, cent, 5, cent ; msg # 12
.byt 0, 40, 0, 0 ; msg # 13
.byt 8, cent, 9, 0 ; msg # 14
.byt 15, 9, 20, cent ; msg # 15
.byt 17, cent, 13, cent ; msg # 16
.byt 18, cent, 14, cent ; msg # 17
.byt 21, 25, 17, 5 ; msg # 18
.byt 23, cent, 19, cent ; msg # 19
.byt 12, cent, 13, cent ; msg # 20
.byt 6, 21, 7, 1 ; msg # 21
.byt 6, 21, 7, 1 ; msg # 22
.byt 6, 21, 7, 1 ; msg # 23
.byt 6, 21, 7, 1 ; msg # 24
.byt 6, 21, 7, 1 ; msg # 25
.byt 9, 0, 10, 0 ; msg # 26
.byt 10, 21, 11, 1 ; msg # 27
;
;
; CONSTANTS USED AS SUFFIXES TO SHELL MESSAGES
;
contbl = * ; Base Address of Message-Suffix List
;
.byt constb-1-* ; length of constant
consta .byt ' N Y N O N J N S ' ; Abbreviations of No & Yes
;
.byt constc-1-* ; length of constant
constb .byt ' A B ' ; Choice of Logical Drive Name
;
.byt constd-1-* ; length of constant
constc .byt ' 0 1 ' ; Choice of Physical Drive Nr.
;
.byt conste-1-* ; length of constant
constd .byt ' 8 9 10 11' ; Choice of Default Device Nr.
;
.byt msgtbl-* ; length of constant
conste .byt ' SEQ PRG USR REL ' ; Choice of File-Type Code
;
;
; SHELL MESSAGE TABLE: Segmented By Message-Type Within Language
;
msgtbl = * ; Base Address Table for Shell Messages
;
.word msg00a ; English Language
.word msg00b ; French Language
.word msg00c ; German Language
.word msg00d ; Italian Language
;
;
; English Language Section - All Messages
;
; First Segment: Messages With Screen Positions Plotted From X-Y Table
;
msg00a .byt msg01a-* ;
.byt 'DISK/PRINTER SETUP' ;
msg01a .byt msg02a-* ;
.byt 'RUN A PROGRAM ' ;
msg02a .byt msg03a-* ;
.byt 'FORMAT A DISK ' ;
msg03a .byt msg04a-* ;
.byt 'CLEANUP A DISK ' ;
msg04a .byt msg05a-* ;
.byt 'COPY A DISK ' ;
msg05a .byt msg06a-* ;
.byt 'COPY FILES ' ;
msg06a .byt msg07a-* ;
.byt 'DELETE FILES ' ;
msg07a .byt msg08a-* ;
.byt 'RESTORE FILES ' ;
msg08a .byt msg09a-* ;
.byt 'RENAME FILES ' ;
msg09a .byt msg10a-* ;
.byt 'REORDER DIRECTORY ' ;
msg10a .byt msg11a-* ;
.byt 'COMMODORE DISK UTILITY SYSTEM' ;
msg11a .byt msg12a-* ;
.byt 'PRESS SPACE TO SELECT YOUR LANGUAGE' ;
msg12a .byt msg13a-* ;
.byt 'ENGLISH' ;
msg13a .byt msg14a-* ;
.byt ' PRESS ',rvsoff,'F5',rvson,' TO UN-SELECT / ' ;
.byt rvsoff,'STOP',rvson,' TO CANCEL ' ;
msg14a .byt msg15a-* ;
.byt ' DRIVE: FREE ' ;
msg15a .byt msg16a-* ;
.byt 'PRINTER DEVICE # = 4 5 6 NONE' ;
msg16a .byt msg17a-* ;
.byt 'TURN ON THE DRIVE TO BE CHANGED' ;
msg17a .byt msg18a-* ;
.byt 'TURN OFF THE OTHER DRIVE' ;
msg18a .byt msg19a-* ;
.byt 'NEW DEVICE # = ' ;
msg19a .byt msg20a-* ;
.byt 'DONE... TURN ON THE OTHER DRIVE' ;
msg20a .byt msg21a-* ;
.byt 'INSERT COPY DISK INTO DRIVE: ' ;
msg21a .byt msg22a-* ;
.byt 'FILE ALREADY EXISTS: ' ;
msg22a .byt msg23a-* ;
.byt 'LOADING PROGRAM: ' ;
msg23a .byt msg24a-* ;
.byt 'CHOOSE FILE TYPE: ' ;
msg24a .byt msg25a-* ;
.byt 'CANNOT RESTORE FILE: ' ;
msg25a .byt msg26a-* ;
.byt 'ENTER NEW NAME: ' ;
msg26a .byt msg27a-* ;
.byt ' SIZE FILE NAME TYPE ' ;
msg27a .byt msg28a-* ;
.byt 'ENTER DISK NAME: ' ;
;
;
; Second Segment: Messages Always Centered At Top Of File-List Window
;
msg28a .byt msg29a-* ;
.byt 'DISK FORMAT WORKING ON DRIVE: ' ;
msg29a .byt msg30a-* ;
.byt 'DISK CLEANUP WORKING ON DRIVE: ' ;
msg30a .byt msg31a-* ;
.byt 'PRESS SPACE TO CONTINUE' ;
msg31a .byt msg32a-* ;
.byt 'INSERT ORIGINAL DISK INTO DRIVE: ' ;
msg32a .byt msg33a-* ;
.byt 'DISK COPY WORKING FROM DRIVE: ' ;
msg33a .byt msg34a-* ;
.byt 'INSERT ORIGINAL DISK THEN PRESS SPACE' ;
msg34a .byt msg35a-* ;
.byt 'READING FROM ORIGINAL DISK' ;
msg35a .byt msg36a-* ;
.byt 'INSERT COPY DISK THEN PRESS SPACE' ;
msg36a .byt msg37a-* ;
.byt 'WRITING TO COPY DISK' ;
msg37a .byt msg38a-* ;
.byt 'FILE COPY WORKING FROM DRIVE: ' ;
msg38a .byt msg39a-* ;
.byt 'FILES RESTORED... CLEANUP WORKING' ;
;
;
; Third Segment: Messages Always Centered On Query/Message Line
;
msg39a .byt msg40a-* ;
.byt 'DRIVE NOT READY: ' ;
msg40a .byt msg41a-* ;
.byt 'BAD DISK IN DRIVE: ' ;
msg41a .byt msg42a-* ;
.byt 'READ ERROR ON DISK IN DRIVE: ' ;
msg42a .byt msg43a-* ;
.byt 'WRITE ERROR ON DISK IN DRIVE: ' ;
msg43a .byt msg44a-* ;
.byt 'DEVICE # NOT PRESENT' ;
msg44a .byt msg45a-* ;
.byt 'FROM WHICH DRIVE: ' ;
msg45a .byt msg46a-* ;
.byt 'USING WHICH DRIVE: ' ;
msg46a .byt msg47a-* ;
.byt 'INSERT A BLANK DISK THEN PRESS SPACE' ;
msg47a .byt msg48a-* ;
.byt 'PROGRAMS IN MEMORY WILL BE DESTROYED' ;
msg48a .byt msg49a-* ;
.byt 'COPY DISK CANNOT HOLD ALL FILES!' ;
msg49a .byt msg50a-* ;
.byt 'ERROR: WRONG DISK - TRY AGAIN' ;
msg50a .byt msg51a-* ;
.byt 'ERROR: FILE NAME NOT UNIQUE - RETRY' ;
msg51a .byt msg52a-* ;
.byt 'USE CURSOR TO MOVE FILE / PRESS SPACE ' ;
;
;
; Fourth Segment: Messages Centered (Minus 3) on Query/Message Line
;
msg52a .byt msg53a-* ;
.byt 'WANT TO FORMAT THE COPY DISK: ' ;
msg53a .byt msg54a-* ;
.byt 'COPY DISK FILL - ANOTHER DISK: ' ;
msg54a .byt msg55a-* ;
.byt 'WANT TO ALPHABETIZE DIRECTORY: ' ;
msg55a .byt msg56a-* ;
.byt 'OK TO COPY FILE-LIST: ' ;
msg56a .byt msg57a-* ;
.byt 'OK TO DELETE FILE-LIST: ' ;
msg57a .byt msg58a-* ;
.byt 'OK TO RESTORE FILE-LIST: ' ;
msg58a .byt msg59a-* ;
.byt 'OK TO CHANGE FILE-LIST: ' ;
msg59a .byt msg60a-* ;
.byt 'OK TO RE-WRITE DIRECTORY: ' ;
;
;
; Fifth Segment: Messages With X-Y Positions Passed By Caller
;
msg60a .byt msg61a-* ;
.byt ' MOVE CURSOR THEN PRESS SPACE TO SELECT ' ;
msg61a .byt msg62a-* ;
.byt 'DRIVE : DEVICE # = ' ;
msg62a .byt msg63a-* ;
.byt 'DRIVE # = ' ;
msg63a .byt msg64a-* ;
.byt 'CHANGE DISK DEVICE #' ;
msg64a .byt msg00b-* ;
.byt ' THEN PRESS SPACE' ;
;
;
; French Language Section - All Messages
;
; First Segment: Messages With Screen Positions Plotted From X-Y Table
;
msg00b .byt msg01b-* ;
.byt 'DISQUE/IMPRIMANTE ' ;
msg01b .byt msg02b-* ;
.byt 'EXECUTER PROGRAMME' ;
msg02b .byt msg03b-* ;
.byt 'FORMATER UN DISQUE' ;
msg03b .byt msg04b-* ;
.byt 'NETTOYER UN DISQUE' ;
msg04b .byt msg05b-* ;
.byt 'COPIER UN DISQUE ' ;
msg05b .byt msg06b-* ;
.byt 'COPIER FICHIERS ' ;
msg06b .byt msg07b-* ;
.byt 'EFFACER FICHIERS ' ;
msg07b .byt msg08b-* ;
.byt 'RESTAURER FICHIERS' ;
msg08b .byt msg09b-* ;
.byt 'RENOMMER FICHIERS ' ;
msg09b .byt msg10b-* ;
.byt 'REFAIRE REPERTOIRE' ;
msg10b .byt msg11b-* ;
.byt 'SYSTEME UTILITAIRE DE DISQUE COMMODORE' ;
msg11b .byt msg12b-* ;
.byt 'APPUYER ',rvson,'ESPACE',rvsoff ;
.byt ' POUR CHOIX DE LANGUE' ;
msg12b .byt msg13b-* ;
.byt 'FRANCAIS' ;
msg13b .byt msg14b-* ;
.byt ' ',rvsoff,'F5',rvson,' ANNULE CHOIX / ' ;
.byt rvsoff,'STOP',rvson,' ANNULE FONCTION ' ;
msg14b .byt msg15b-* ;
.byt ' UNITE: OCTETS' ;
msg15b .byt msg16b-* ;
.byt '# D',acent,'IMPRIMANTE = 4 5 6 AUCUN' ;
msg16b .byt msg17b-* ;
.byt 'ALLUMER L',acent,'UNITE DE DISQU A CHANGER' ;
msg17b .byt msg18b-* ;
.byt 'ETEINDRE L',acent,'AUTRE UNITE DE DISQUE' ;
msg18b .byt msg19b-* ;
.byt 'NOUVEAU DISPOSITIF = ' ;
msg19b .byt msg20b-* ;
.byt 'TERMINE... ALLUMER L',acent,'AUTRE UNITE' ;
msg20b .byt msg21b-* ;
.byt 'INSERER DISQUE-COPIE DANS UNITE: ' ;
msg21b .byt msg22b-* ;
.byt 'FICHIER DEJA EXISTANT: ' ;
msg22b .byt msg23b-* ;
.byt 'CHARGE PROGRAMME: ' ;
msg23b .byt msg24b-* ;
.byt 'TYPE DE FICHIER: ' ;
msg24b .byt msg25b-* ;
.byt 'NE PEUT RESTAURER: ' ;
msg25b .byt msg26b-* ;
.byt 'DONNER NOUVEAU NOM: ' ;
msg26b .byt msg27b-* ;
.byt ' TAILLE NOM DU FICHIER TYPE ' ;
msg27b .byt msg28b-* ;
.byt 'NOM DU DISQUE: ' ;
;
;
; Second Segment: Messages Always Centered At Top Of File-List Window
;
msg28b .byt msg29b-* ;
.byt 'FORMATE DISQUE SUR UNITE: ' ;
msg29b .byt msg30b-* ;
.byt 'NETTOIE DISQUE SUR UNITE: ' ;
msg30b .byt msg31b-* ;
.byt 'APPUYER ',rvson,'ESPACE',rvsoff ;
.byt ' POUR CONTINUER' ;
msg31b .byt msg32b-* ;
.byt 'INSERER DISQUE ORIGINAL DANS UNITE: ' ;
msg32b .byt msg33b-* ;
.byt 'COPIE DISQUE A PARTIR DE L',acent,'UNITE: ' ;
msg33b .byt msg34b-* ;
.byt 'INSERER DISQUE ORIGINAL PUIS ' ;
.byt rvson,'ESPACE',rvsoff ;
msg34b .byt msg35b-* ;
.byt 'LIT A PARTIR DU DISQUE ORIGINAL' ;
msg35b .byt msg36b-* ;
.byt 'INSERER DISQUE-COPIE, PUIS ' ;
.byt rvson,'ESPACE',rvsoff ;
msg36b .byt msg37b-* ;
.byt 'ECRIT SUR DISQUE-COPIE' ;
msg37b .byt msg38b-* ;
.byt 'COPIE FICHIER A PARTIR DE L',acent,'UNITE: ' ;
msg38b .byt msg39b-* ;
.byt 'FICHIERS RESTAURES... NETTOYAGE EN COURS' ;
;
;
; Third Segment: Messages Always Centered On Query/Message Line
;
msg39b .byt msg40b-* ;
.byt 'L',acent,'UNITE DE DISQUE N' ;
.byt acent,'EST PAS PRETE: ' ;
msg40b .byt msg41b-* ;
.byt 'MAUVAIS DISQUE DANS L',acent,'UNITE: ' ;
msg41b .byt msg42b-* ;
.byt 'ERREUR DE LECTURE - UNITE DE DISUE: ' ;
msg42b .byt msg43b-* ;
.byt 'ERREUR D',acent,'ECRITURE UNITE DE DISQUE: ' ;
msg43b .byt msg44b-* ;
.byt 'DE DISPOSITIF MANQUANT #' ;
msg44b .byt msg45b-* ;
.byt 'DE QUELLE UNITE DE DISQUE: ' ;
msg45b .byt msg46b-* ;
.byt 'AVEC QUELLE UNITE DE DISQUE: ' ;
msg46b .byt msg47b-* ;
.byt 'INSERER DISQ VIERGE PUIS ' ;
.byt rvson,'ESPACE',rvsoff ;
msg47b .byt msg48b-* ;
.byt 'PROGAMMES EN MEMOIRE SERONT DETRUITS' ;
msg48b .byt msg49b-* ;
.byt 'DISQUE-COPIE MANQUE D',acent,'ESPACE' ;
msg49b .byt msg50b-* ;
.byt 'ERREUR: MAUVAIS DISQUE; ESSAYER ENCORE' ;
msg50b .byt msg51b-* ;
.byt 'ERREUR: NOM FICHIER EN DOUBLE; RESSAYER' ;
msg51b .byt msg52b-* ;
.byt 'CURSEUR POUR DEPLACER FICHIER' ;
.byt '/ ',rvson,' ESPACE',rvsoff ;
;
;
; Fourth Segment: Messages Centered (Minus 3) on Query/Message Line
;
msg52b .byt msg53b-* ;
.byt 'FORMATER DISQUE-COPIE: ' ;
msg53b .byt msg54b-* ;
.byt 'DISQUE-COPIE PLEIN; AUTRE DISQUE: ' ;
msg54b .byt msg55b-* ;
.byt 'REPERTOIRE EN ORDRE ALPHABETIQUE: ' ;
msg55b .byt msg56b-* ;
.byt 'COPIER LISTE DES FICHIERS: ' ;
msg56b .byt msg57b-* ;
.byt 'EFFACER LISTE DES FICHIERS: ' ;
msg57b .byt msg58b-* ;
.byt 'RESTAURER LISTE DES FICHIERS: ' ;
msg58b .byt msg59b-* ;
.byt 'MODIFIER LISTE DES FICHIERS: ' ;
msg59b .byt msg60b-* ;
.byt 'REECRIRE REPERTOIRE: ' ;
;
;
; Fifth Segment: Messages With X-Y Positions Passed By Caller
;
msg60b .byt msg61b-* ;
.byt ' CURSEUR PUIS (ESPACE) POUR CHOISIR ' ;
msg61b .byt msg62b-* ;
.byt 'UNITE : DISPOSITIF = ' ;
msg62b .byt msg63b-* ;
.byt 'UNITE DE DISQUE = ' ;
msg63b .byt msg64b-* ;
.byt 'CHANGER # DISPOSITIF D',acent,'UNITE' ;
msg64b .byt msg00c-* ;
.byt ' PUIS APPUYER ',rvson,'ESPACE',rvsoff ;
;
;
; German Language Section - All Messages
;
; First Segment: Messages With Screen Positions Plotted From X-Y Table
;
msg00c .byt msg01c-* ;
.byt 'DISK/DRUCKER SETUP' ;
msg01c .byt msg02c-* ;
.byt 'PROGRAMMSTART ' ;
msg02c .byt msg03c-* ;
.byt 'DISK FORMATIEREN ' ;
msg03c .byt msg04c-* ;
.byt 'BAM ORDNEN ' ;
msg04c .byt msg05c-* ;
.byt 'DISK KOPIEREN ' ;
msg05c .byt msg06c-* ;
.byt 'FILES KOPIEREN ' ;
msg06c .byt msg07c-* ;
.byt 'FILES LOESCHEN ' ;
msg07c .byt msg08c-* ;
.byt 'FILES WIEDERHERST ' ;
msg08c .byt msg09c-* ;
.byt 'FILES UMBENENNEN ' ;
msg09c .byt msg10c-* ;
.byt 'DIRECTORY ORDNEN ' ;
msg10c .byt msg11c-* ;
.byt 'COMMODORE DISK-UTILITY' ;
msg11c .byt msg12c-* ;
.byt 'AUSWAHL IHRER SPRACHE MIT (SPACE)' ;
msg12c .byt msg13c-* ;
.byt 'DEUTSCH' ;
msg13c .byt msg14c-* ;
.byt ' NEUWAHL MIT ',rvsoff,'F5',rvson,' ' ;
.byt ' ABBRUCH MIT ',rvsoff,'STOP',rvson,' ' ;
msg14c .byt msg15c-* ;
.byt ' LAUFW: FREI ' ;
msg15c .byt msg16c-* ;
.byt 'DRUCKER GERAETE # = 4 5 6 KEINE' ;
msg16c .byt msg17c-* ;
.byt 'ZU AENDERNDES LAUFWERK EINSCHALTEN' ;
msg17c .byt msg18c-* ;
.byt 'ANDERES LAUFWERK AUSSCHALTEN!' ;
msg18c .byt msg19c-* ;
.byt 'NEUE GERAETE # = ' ;
msg19c .byt msg20c-* ;
.byt 'OK... ANDERES LAUFWERK EINSCHALTEN' ;
msg20c .byt msg21c-* ;
.byt 'ZIEL-DISKETTE EINLEGEN IN LAUFWERK: ' ;
msg21c .byt msg22c-* ;
.byt 'FILE EXISTIERT.: ' ;
msg22c .byt msg23c-* ;
.byt 'PROGRAM WIRD GELADEN: ' ;
msg23c .byt msg24c-* ;
.byt 'WAEHLE FILE-TYP: ' ;
msg24c .byt msg25c-* ;
.byt 'WIEDERHERST UNMOEGLICH: ' ;
msg25c .byt msg26c-* ;
.byt 'EINGABE NEUER NAME: ' ;
msg26c .byt msg27c-* ;
.byt ' GROESSE FILE-NAME FILE-TYP ' ;
msg27c .byt msg28c-* ;
.byt 'DISK-NAME: ' ;
;
;
; Second Segment: Messages Always Centered At Top Of File-List Window
;
msg28c .byt msg29c-* ;
.byt 'DISKETTE WIRD FORMATIERT IN LAUFWERK: ' ;
msg29c .byt msg30c-* ;
.byt 'DISK WIRD NEU GEORDNET IN LAUFW.: ' ;
msg30c .byt msg31c-* ;
.byt 'WEITER MIT (SPACE)' ;
msg31c .byt msg32c-* ;
.byt 'QUELL-DISKETTE EINLEGEN IN LAUFWERK: ' ;
msg32c .byt msg33c-* ;
.byt 'DISKETTE WIRD KOPIERT VON LAUFWERK: ' ;
msg33c .byt msg34c-* ;
.byt 'QUELL-DISKETTE EINLEGEN, DANN (SPACE)' ;
msg34c .byt msg35c-* ;
.byt 'QUELL-DISKETTE WIRD GELESEN' ;
msg35c .byt msg36c-* ;
.byt 'ZIEL-DISKETTE EINLEGEN, DANN (SPACE)' ;
msg36c .byt msg37c-* ;
.byt 'ZIEL-DISKETTE WIRD BESCHRIEBEN' ;
msg37c .byt msg38c-* ;
.byt 'FILE WIRD KOPIERT VON LAUFWERK: ' ;
msg38c .byt msg39c-* ;
.byt 'FILES WERDEN WIEDERHERGESTELLT' ;
;
;
; Third Segment: Messages Always Centered On Query/Message Line
;
msg39c .byt msg40c-* ;
.byt 'LAUFWERK NICHT BETRIEBSBEREIT: ' ;
msg40c .byt msg41c-* ;
.byt 'SCHLECHTE DISKETTE IN LAUFWERK: ' ;
msg41c .byt msg42c-* ;
.byt 'LESEFEHLER AUF DISKETTE IN LAUFWERK: ' ;
msg42c .byt msg43c-* ;
.byt 'SCHREIBFEHLER AUF DISKETTE IN LAUFW.: ' ;
msg43c .byt msg44c-* ;
.byt 'GERAET # NICHT ANGESCHLOSSEN' ;
msg44c .byt msg45c-* ;
.byt 'QUELL-LAUFWERK: ' ;
msg45c .byt msg46c-* ;
.byt 'LAUFWERK: ' ;
msg46c .byt msg47c-* ;
.byt 'LEERE DISKETTE EINLEGEN DANN (SPACE)' ;
msg47c .byt msg48c-* ;
.byt 'PROGRAMM IM SPEICHER WIRD GELOESCHT' ;
msg48c .byt msg49c-* ;
.byt 'ZUWENIG SPEICHERPLATZ FUER ALLE FILES' ;
msg49c .byt msg50c-* ;
.byt 'FEHLER! FALSCHE DISKETTE - NOCHMAL!' ;
msg50c .byt msg51c-* ;
.byt 'FEHLER! FILE-NAME DOPPELT BITTE WIDERHOLEN' ;
msg51c .byt msg52c-* ;
.byt 'WAEHLE EIN FILE MIT CURSOR / (SPACE)' ;
;
;
; Fourth Segment: Messages Centered (Minus 3) on Query/Message Line
;
msg52c .byt msg53c-* ;
.byt 'ZIEL-DISKETTE FORMATIEREN: ' ;
msg53c .byt msg54c-* ;
.byt 'ZIEL-DISKETTE VOLL! WEITERE DISK: ' ;
msg54c .byt msg55c-* ;
.byt 'DIRECTORY ALPHABETHISCH ORDNEN: ' ;
msg55c .byt msg56c-* ;
.byt 'FILE-LISTE OK ZUM KOPIEREN: ' ;
msg56c .byt msg57c-* ;
.byt 'FILE-LISTE OK ZUM LOESCHEN: ' ;
msg57c .byt msg58c-* ;
.byt 'FILE-LISTE OK ZUM WIEDERHERST: ' ;
msg58c .byt msg59c-* ;
.byt 'FILE-LISTE OK ZUM UMBENENNEN: ' ;
msg59c .byt msg60c-* ;
.byt 'DIRECTORY ZURUECKSCHREIBEN: ' ;
;
;
; Fifth Segment: Messages With X-Y Positions Passed By Caller
;
msg60c .byt msg61c-* ;
.byt 'AUSWAHL MIT CURSORSTEUERUNG DANN (SPACE)' ;
msg61c .byt msg62c-* ;
.byt 'LAUFWERK : GERAETE # = ' ;
msg62c .byt msg63c-* ;
.byt 'LAUFWERK # = ' ;
msg63c .byt msg64c-* ;
.byt 'AENDERE LAUFWERK #' ;
msg64c .byt msg00d-* ;
.byt ' DANN (SPACE) DRUECKEN' ;
;
;
; Italian Language Section - All Messages
;
; First Segment: Messages With Screen Positions Plotted From X-Y Table
;
msg00d .byt msg01d-* ;
.byt 'AVVIA DISK/PRINTER' ;
msg01d .byt msg02d-* ;
.byt 'ESEGUE PROGRAMMA ' ;
msg02d .byt msg03d-* ;
.byt 'FORMATTA DISCO ' ;
msg03d .byt msg04d-* ;
.byt 'PULIZIA DISCO ' ;
msg04d .byt msg05d-* ;
.byt 'COPIA DISCO ' ;
msg05d .byt msg06d-* ;
.byt 'COPIA FILE ' ;
msg06d .byt msg07d-* ;
.byt 'RIMUOVI FILE ' ;
msg07d .byt msg08d-* ;
.byt 'RIPRISTINA FILE ' ;
msg08d .byt msg09d-* ;
.byt 'CAMBIA NOME FILE ' ;
msg09d .byt msg10d-* ;
.byt 'RIORDINA DIRECTORY' ;
msg10d .byt msg11d-* ;
.byt 'DISCO SISTEMA UTILITY COMMODORE' ;
msg11d .byt msg12d-* ;
.byt 'PREMI SPAZIO PER SCEGLIERE LA LINGUA' ;
msg12d .byt msg13d-* ;
.byt 'ITALIANO' ;
msg13d .byt msg14d-* ;
.byt ' ',rvsoff,'F5',rvson,' PER SCARTARE / ' ;
.byt rvsoff,'STOP',rvson,' PER ANNULLARE ' ;
msg14d .byt msg15d-* ;
.byt ' DRIVE: LIB. ' ;
msg15d .byt msg16d-* ;
.byt 'UNITA',acent,' STAMPANTE # = 4 5 6 NESSUNA' ;
msg16d .byt msg17d-* ;
.byt 'ACCENDI IL DRIVE DA CAMBIARE' ;
msg17d .byt msg18d-* ;
.byt 'SPEGNI L',acent,'ALTRO DRIVE' ;
msg18d .byt msg19d-* ;
.byt 'NUOVA UNITA',acent,' # = ' ;
msg19d .byt msg20d-* ;
.byt 'FATTO... ACCENDI L',acent,'ALTRO DRIVE' ;
msg20d .byt msg21d-* ;
.byt 'INSERISCI DISCO COPIA NEL DRIVE: ' ;
msg21d .byt msg22d-* ;
.byt 'FILE GIA',acent,' ESISTENTE: ' ;
msg22d .byt msg23d-* ;
.byt 'CARICAMENTO PROG.: ' ;
msg23d .byt msg24d-* ;
.byt 'SCEGLI TIPO FILE: ' ;
msg24d .byt msg25d-* ;
.byt 'IMPOS.RIPRISTINO FILE: ' ;
msg25d .byt msg26d-* ;
.byt 'NUOVO NOME: ' ;
msg26d .byt msg27d-* ;
.byt ' BLOCCHI NOME FILE TIPO ' ;
msg27d .byt msg28d-* ;
.byt 'NOME DISCO: ' ;
;
;
; Second Segment: Messages Always Centered At Top Of File-List Window
;
msg28d .byt msg29d-* ;
.byt 'STO FORMATTANDO IL DISCO SUL DRIVE: ' ;
msg29d .byt msg30d-* ;
.byt 'PULIZIA DISCO IN FUNZIONE SUL DRIVE: ' ;
msg30d .byt msg31d-* ;
.byt 'PREMI SPAZIO PER CONTINUARE' ;
msg31d .byt msg32d-* ;
.byt 'INSERISCI DISCO ORIGINALE NEL DRIVE: ' ;
msg32d .byt msg33d-* ;
.byt 'COPIA DISCO IN FUNZIONE DAL DRIVE: ' ;
msg33d .byt msg34d-* ;
.byt 'INSERISCI DISCO ORIGINALE-PREMI SPAZIO' ;
msg34d .byt msg35d-* ;
.byt 'LETTURA DAL DISCO ORIGINALE' ;
msg35d .byt msg36d-* ;
.byt 'INSERISCI DISCO COPIA E PREMI SPAZIO' ;
msg36d .byt msg37d-* ;
.byt 'SCRITTURA SUL DISCO COPIA' ;
msg37d .byt msg38d-* ;
.byt 'COPIA FILE IN FUNZIONE DAL DRIVE: ' ;
msg38d .byt msg39d-* ;
.byt 'FILE RIPRISTINATI-RIALLOCO BLOCCHI' ;
;
;
; Third Segment: Messages Always Centered On Query/Message Line
;
msg39d .byt msg40d-* ;
.byt 'DRIVE NON PRONTO: ' ;
msg40d .byt msg41d-* ;
.byt 'ERRORE DISCO NEL DRIVE: ' ;
msg41d .byt msg42d-* ;
.byt 'ERRORE LETTURA SU DISCO NEL DRIVE: ' ;
msg42d .byt msg43d-* ;
.byt 'ERRORE SCRITTURA SU DISCO NEL DRIVE: ' ;
msg43d .byt msg44d-* ;
.byt 'UNITA',acent,' # NON PRONTA' ;
msg44d .byt msg45d-* ;
.byt 'DA QUALE DRIVE: ' ;
msg45d .byt msg46d-* ;
.byt 'UTILIZZANDO QUALE DRIVE: ' ;
msg46d .byt msg47d-* ;
.byt 'INSERIRE DISCO NUOVO E PREMERE SPAZIO' ;
msg47d .byt msg48d-* ;
.byt 'I PROGRAMMI IN MEMORIA SARANNO PERDUTI' ;
msg48d .byt msg49d-* ;
.byt 'DISO COPIA NON CONTIENE TUTTI I FILE!' ;
msg49d .byt msg50d-* ;
.byt 'ERRORE: DISCO DANNEGGIATO - RIPROVA' ;
msg50d .byt msg51d-* ;
.byt 'ERRORE: NOME FILE ESISTENTE - RIPROVA' ;
msg51d .byt msg52d-* ;
.byt 'SPOSTA FILE COL CURSORE / PREMI SPAZIO' ;
;
;
; Fourth Segment: Messages Centered (Minus 3) on Query/Message Line
;
msg52d .byt msg53d-* ;
.byt 'VUOI FORMATTARE IL DISCO COPIA: ' ;
msg53d .byt msg54d-* ;
.byt 'DISO COPIA PIENO - ALTRO DISCO: ' ;
msg54d .byt msg55d-* ;
.byt 'DIRECTORY IN ORDINE ALFABETICO: ' ;
msg55d .byt msg56d-* ;
.byt 'OK PER COPIARE LISTA FILE: ' ;
msg56d .byt msg57d-* ;
.byt 'OK PER RIMUOVERE LISTA FILE: ' ;
msg57d .byt msg58d-* ;
.byt 'OK PER RIPRISTINARE LISTA FILE: ' ;
msg58d .byt msg59d-* ;
.byt 'OK PER CAMBIARE LISTA FILE: ' ;
msg59d .byt msg60d-* ;
.byt 'OK PER RISCRIVERE LA DIRECTORY: ' ;
;
;
; Fifth Segment: Messages With X-Y Positions Passed By Caller
;
msg60d .byt msg61d-* ;
.byt ' SCEGLI COL CURSORE E POI PREMI SPAZIO ' ;
msg61d .byt msg62d-* ;
.byt 'DRIVE : UNITA',acent,' # = ' ;
msg62d .byt msg63d-* ;
.byt 'DRIVE # = ' ;
msg63d .byt msg64d-* ;
.byt 'CAMBIO UNITA',acent,' DISCO #' ;
msg64d .byt msgend-* ;
.byt ' POI PREMI SPAZIO' ;
;
msgend = * ; Marks End of Shell Message Tables
;

5
README.md

@ -134,6 +134,7 @@ Using [kernalemu](https://github.com/mist64/kernalemu) and [cbm6502asm](https://
| [MONITOR_PET_ADDON](MONITOR_PET_ADDON) | 1981 | RAM-based monitor for PET 8x92 |
| [MONITOR_C64](MONITOR_C64) | 1982 | RAM-based monitor for C64 |
| [DISK_MONITOR](DISK_MONITOR) | 1980 | Monitor extension for PET |
| [DOS_SHELL](DOS_SHELL) | 1985 | DOS SHELL tool (1571 Test/Demo disk) |
| [FIG](FIG) | 1980 | fig-FORTH |
## Software: Resident Assembler & HCD65
@ -444,6 +445,10 @@ The source contains a 90 degree rotated 6x8 pixel variant of the PETSCII charact
"DISK MONITOR 2040 V1.0", an extension to the PET monitor for disk commands (see mon.cmd). Extracted from UNKN008.D80 from [Ruud Baltissen's ICPUG disks](http://www.pagetable.com/docs/CBM2_Sources.zip) and converted to LF line breaks and LST-style indenting.
### DOS_SHELL
The DOS Shell tool from the 1571 Test/Demo disk, autoboot for C128. Source: [c128_dev_pack.tar.gz](http://www.zimmers.net/anonftp/pub/cbm/src/c128/index.html)
### MATHPACK
A variant of the "BCD Math Package" printed in the [Commodore 700 Reference Manual](http://www.zimmers.net/anonftp/pub/cbm/programming/b/Commodore_700_Reference_Manual.pdf). Extracted from UNKN008.D80 from [Ruud Baltissen's ICPUG disks](http://www.pagetable.com/docs/CBM2_Sources.zip) and converted to LF line breaks and LST-style indenting.

5
build.sh

@ -57,9 +57,6 @@ test_tools
rm -rf build
mkdir build
build2 LOADER_C128 loader
exit
build1 MONITOR_KIM kim.asm
build1 MONITOR_AIM65 pa00-j001a
build1 TIM tim.asm
@ -193,3 +190,5 @@ build1 FIG FOR1-1
# ldz zp/abs
# build2 LOADER_C65 loader65
# build2 LOADER_C65_RS232 l232
# expression error
# build2 DOS_SHELL shell

Loading…
Cancel
Save