mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Reintegrate wbw -> trunk
This commit is contained in:
1073
Source/Apps/Assign - Copy.asm
Normal file
1073
Source/Apps/Assign - Copy.asm
Normal file
File diff suppressed because it is too large
Load Diff
1232
Source/Apps/Assign.asm
Normal file
1232
Source/Apps/Assign.asm
Normal file
File diff suppressed because it is too large
Load Diff
27
Source/Apps/Build.cmd
Normal file
27
Source/Apps/Build.cmd
Normal file
@@ -0,0 +1,27 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
set TOOLS=../../Tools
|
||||
|
||||
set PATH=%TOOLS%\tasm32;%TOOLS%\zx;%PATH%
|
||||
|
||||
set TASMTABS=%TOOLS%\tasm32
|
||||
|
||||
set ZXBINDIR=%TOOLS%/cpm/bin/
|
||||
set ZXLIBDIR=%TOOLS%/cpm/lib/
|
||||
set ZXINCDIR=%TOOLS%/cpm/include/
|
||||
|
||||
call :asm SysCopy || goto :eof
|
||||
call :asm Assign || goto :eof
|
||||
call :asm Format || goto :eof
|
||||
call :asm Talk || goto :eof
|
||||
|
||||
zx Z80ASM -SYSGEN/F
|
||||
|
||||
goto :eof
|
||||
|
||||
:asm
|
||||
echo.
|
||||
echo Building %1...
|
||||
tasm -t80 -b -g3 -fFF %1.asm %1.com %1.lst
|
||||
goto :eof
|
||||
4
Source/Apps/Clean.cmd
Normal file
4
Source/Apps/Clean.cmd
Normal file
@@ -0,0 +1,4 @@
|
||||
@echo off
|
||||
if exist *.bin del *.bin
|
||||
if exist *.com del *.com
|
||||
if exist *.lst del *.lst
|
||||
28
Source/Apps/Format.asm
Normal file
28
Source/Apps/Format.asm
Normal file
@@ -0,0 +1,28 @@
|
||||
;===============================================================================
|
||||
; FORMAT - DISK FORMAT UTILITY FOR ROMWBW ADAPTATION OF CP/M 2.2
|
||||
;===============================================================================
|
||||
;
|
||||
; AUTHOR: WAYNE WARTHEN (wwarthen@gmail.com)
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; CHANGELOG:
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; TODO:
|
||||
;
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
;
|
||||
;===============================================================================
|
||||
; MAIN PROGRAM PROCEDURE
|
||||
;===============================================================================
|
||||
;
|
||||
.ORG 00100H
|
||||
RET
|
||||
;
|
||||
STACKSAV .DW 0
|
||||
STACKSIZ .EQU 40H ; WE ARE A STACK PIG
|
||||
.FILL STACKSIZ,0
|
||||
STACK .EQU $
|
||||
;
|
||||
.END
|
||||
856
Source/Apps/SysCopy.asm
Normal file
856
Source/Apps/SysCopy.asm
Normal file
@@ -0,0 +1,856 @@
|
||||
;===============================================================================
|
||||
; SysCopy - Copy System Image to/from reserved tracks of disk for RomWBW
|
||||
; adaptation of CP/M 2.2
|
||||
;===============================================================================
|
||||
;
|
||||
; Author: Wayne Warthen (wwarthen@gmail.com)
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; Usage:
|
||||
; SYSCOPY <dest>[=<src>]
|
||||
;
|
||||
; <dest> and <src> may be a drive or a file reference
|
||||
; If <src> is not specified, the system image will
|
||||
; be read from the current drive
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; Change Log:
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; ToDo:
|
||||
; 1) Add option to wait/prompt for disk change
|
||||
; 2) Allow <src> and <dest> to be memory
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
;===============================================================================
|
||||
; Definitions
|
||||
;===============================================================================
|
||||
;
|
||||
stksiz .equ $40 ; we are a stack pig
|
||||
;
|
||||
restart .equ $0000 ; CP/M restart vector
|
||||
bdos .equ $0005 ; BDOS invocation vector
|
||||
;
|
||||
buf .equ $900 ; load point for system image (from original SYSGEN)
|
||||
;
|
||||
;===============================================================================
|
||||
; Code Section
|
||||
;===============================================================================
|
||||
;
|
||||
.org $100
|
||||
; setup stack (save old value)
|
||||
ld (stksav),sp ; save stack
|
||||
ld sp,stack ; set new stack
|
||||
; processing...
|
||||
call main ; do the real work
|
||||
call crlf ; formatting
|
||||
; return
|
||||
jp 0 ; return to CP/M via reset
|
||||
;
|
||||
;ld sp,(stksav) ; restore stack
|
||||
;ret ; return to CP/M w/o reset
|
||||
;
|
||||
; Main routine
|
||||
;
|
||||
main:
|
||||
call init ; initialize
|
||||
ret nz ; abort on failure
|
||||
|
||||
call parse ; parse command tail
|
||||
ret nz ; abort on failure
|
||||
|
||||
call confirm ; confirm pending action
|
||||
ret nz ; abort on failure
|
||||
|
||||
call crlf ; formatting
|
||||
|
||||
ld de,msgrd
|
||||
call prtstr ; display "reading" message
|
||||
call rdimg ; do the image read
|
||||
ret nz ; abort on failure
|
||||
|
||||
ld de,msgwrt
|
||||
call prtstr ; display "writing" message
|
||||
call wrtimg ; do the image write
|
||||
ret nz ; abort on failure
|
||||
|
||||
ld de,msgdon ; completion message
|
||||
call prtstr ; display it
|
||||
|
||||
ret
|
||||
;
|
||||
; Initialization
|
||||
;
|
||||
init:
|
||||
; add check for RomWBW?
|
||||
;
|
||||
; locate cbios function table address
|
||||
ld hl,(restart+1) ; load address of CP/M restart vector
|
||||
ld de,-3 ; adjustment for start of table
|
||||
add hl,de ; HL now has start of table
|
||||
ld (cbftbl),hl ; save it
|
||||
; save current drive no
|
||||
ld c,$19 ; bdos func: get current drive
|
||||
call bdos ; invoke BDOS function
|
||||
inc a ; 1-based index for fcb
|
||||
ld (defdrv),a ; save it
|
||||
; return success
|
||||
xor a
|
||||
ret
|
||||
;
|
||||
; Parse command tail
|
||||
;
|
||||
parse:
|
||||
ld hl,$81 ; point to start of command tail (after length byte)
|
||||
call nonblank ; locate start of parms
|
||||
jp z,erruse ; no parms
|
||||
ld de,destfcb ; point to destination fcb
|
||||
call convert ; convert destination spec
|
||||
jp nz,erramb ; Error, ambiguous file specification
|
||||
call nonblank ; skip blanks
|
||||
or a ; end of command tail (null)?
|
||||
jr z,parse2 ; setup default source fcb
|
||||
cp '=' ; std delimiter
|
||||
jr z,parse1 ; valid delimiter, continue
|
||||
cp '_' ; alt delimiter
|
||||
jr z,parse1 ; valid delimiter, continue
|
||||
jp errdlm ; invalid delimiter
|
||||
parse1:
|
||||
inc hl ; skip delimiter
|
||||
call nonblank ; skip blanks
|
||||
parse2:
|
||||
ld de,srcfcb ; point to source fcb
|
||||
call convert ; convert spec to fcb
|
||||
jp nz,erramb ; Error, ambiguous file specification
|
||||
; return success
|
||||
xor a ; signal success
|
||||
ret ; done parsing
|
||||
;
|
||||
; Confirm pending action with user
|
||||
;
|
||||
confirm:
|
||||
; prompt
|
||||
call crlf
|
||||
ld de,sconf1
|
||||
call prtstr
|
||||
ld hl,srcfcb
|
||||
call prtfcb
|
||||
ld de,sconf2
|
||||
call prtstr
|
||||
ld hl,destfcb
|
||||
call prtfcb
|
||||
ld de,sconf3
|
||||
call prtstr
|
||||
;
|
||||
; get input
|
||||
ld c,$0A ; get console buffer
|
||||
ld de,buf ; into buf
|
||||
ld a,1 ; max of 1 character
|
||||
ld (de),a ; set up buffer
|
||||
call bdos ; invoke BDOS
|
||||
ld a,(buf+1) ; get num chars entered
|
||||
dec a ; check that we got exactly one char
|
||||
jr nz,confirm ; bad input, re-prompt
|
||||
ld a,(buf+2) ; get the character
|
||||
and $DF ; force upper case
|
||||
cp 'Y' ; compare to Y
|
||||
ret ; return with Z set appropriately
|
||||
;
|
||||
; Read system image
|
||||
;
|
||||
rdimg:
|
||||
ld hl,srcfcb ; point to source fcb
|
||||
call chkfcb ; check if for drive/file spec
|
||||
bit 1,a ; is there a file spec?
|
||||
jp nz,rdfil ; yes, read using file i/o
|
||||
jp rddsk ; no, read using raw disk i/o
|
||||
;
|
||||
; Write system image
|
||||
;
|
||||
wrtimg:
|
||||
ld hl,destfcb ; point to destination fcb
|
||||
call chkfcb ; check it for drive/file spec
|
||||
bit 1,a ; is there a file spec?
|
||||
jp nz,wrfil ; yes, write using file i/o
|
||||
jp wrdsk ; no, write using raw disk i/o
|
||||
|
||||
;
|
||||
; Read system image from file system
|
||||
;
|
||||
rdfil:
|
||||
; open the file
|
||||
ld c,$0F ; bdos open file
|
||||
ld de,srcfcb ; source fcb
|
||||
ld (rwfcb),de ; save it
|
||||
call bdos ; invoke bdos function
|
||||
cp $FF ; $FF is error
|
||||
jp z,errfil ; handle error condition
|
||||
; read the header
|
||||
ld a,$14 ; setup for bdos read sequential
|
||||
ld (rwfun),a ; save bdos function
|
||||
ld a,12 ; start with 1536 byte header (12 records)
|
||||
ld (reccnt),a ; init record counter
|
||||
ld hl,buf ; start of buffer
|
||||
ld (bufptr),hl ; init buffer pointer
|
||||
call rwfil ; read the header
|
||||
ret nz ; abort on error (no need to close file)
|
||||
; check header and get image size
|
||||
call chkhdr ; verifies marker & ver, hl = image size
|
||||
ret nz ; abort on error (no need to close file)
|
||||
ld b,7 ; right shift 7 bits to get 128 byte record count
|
||||
rdfil1: srl h ; shift right msb
|
||||
rr l ; shift lsb w/ carry from msb
|
||||
djnz rdfil1 ; loop till done
|
||||
ld a,l ; record count to a
|
||||
ld (reccnt),a ; set remaining records to read
|
||||
add a,12 ; add the header back
|
||||
ld (imgsiz),a ; and save the total image size (in records)
|
||||
call rwfil ; do it
|
||||
ret nz ; abort on error
|
||||
; return via close file
|
||||
jp closefile ; close file
|
||||
;
|
||||
; Write system image to file system
|
||||
;
|
||||
wrfil:
|
||||
; check for pre-existing target file
|
||||
ld c,$11 ; bdos find first
|
||||
ld de,destfcb ; destination fcb
|
||||
call bdos
|
||||
cp $FF ; check for error
|
||||
jr z,wrfil1 ; not there, skip delete
|
||||
; delete target file if it exists
|
||||
ld c,$13 ; bdos delete
|
||||
ld de,destfcb ; destination fcb
|
||||
call bdos
|
||||
cp $FF ; check return code
|
||||
jp z,errdel ; handle error
|
||||
wrfil1: ; create target file
|
||||
ld c,$16 ; bdos create file
|
||||
ld de,destfcb ; destination fcb
|
||||
ld (rwfcb),de ; save it
|
||||
call bdos
|
||||
cp $FF ; check return code
|
||||
jp z,errfil ; handle error
|
||||
; write the image
|
||||
ld a,$15 ; setup for bdos write sequential
|
||||
ld (rwfun),a ; save bdos function
|
||||
ld a,(imgsiz) ; number of records to read
|
||||
ld (reccnt),a ; init record counter
|
||||
ld hl,buf ; start of buffer
|
||||
ld (bufptr),hl ; init buffer pointer
|
||||
call rwfil ; do it
|
||||
ret nz ; abort on error
|
||||
; return via close file
|
||||
jp closefile ; close file
|
||||
;
|
||||
; Common routine to handle read/write for file system
|
||||
;
|
||||
rwfil:
|
||||
ld c,$1A ; BDOS set dma
|
||||
ld de,(bufptr) ; current buffer pointer
|
||||
push de ; save pointer
|
||||
call bdos ; do it
|
||||
pop de ; recover pointer
|
||||
ld hl,128 ; record length
|
||||
add hl,de ; increment buffer pointer
|
||||
ld (bufptr),hl ; save it
|
||||
ld a,(rwfun) ; get the active function
|
||||
ld c,a ; set it
|
||||
ld de,(rwfcb) ; active fcb
|
||||
call bdos ; do it
|
||||
or a ; check return code
|
||||
jp nz,errdos ; BDOS err
|
||||
ld hl,reccnt ; point to record count
|
||||
dec (hl) ; decrement record count
|
||||
jr nz,rwfil ; loop till done
|
||||
xor a ; signal success
|
||||
ret ; done
|
||||
;
|
||||
; Close file
|
||||
;
|
||||
closefile:
|
||||
ld c,$10 ; BDOS close file
|
||||
ld de,(rwfcb) ; active fcb
|
||||
call bdos ; do it
|
||||
cp $FF ; $FF is error
|
||||
jp z,errclo ; if error, handle it
|
||||
xor a ; signal success
|
||||
ret ; done
|
||||
;
|
||||
; Read image directly from disk system tracks using CBIOS
|
||||
;
|
||||
rddsk:
|
||||
; force return to go through disk reset
|
||||
ld hl,resdsk ; load address of reset disk routine
|
||||
push hl ; and put it on the stack
|
||||
; set drive for subsequent reads
|
||||
ld a,(srcfcb) ; get the drive
|
||||
dec a ; adjust for zero indexing
|
||||
call setdsk ; setup disk
|
||||
ret nz ; abort on error
|
||||
; set function to read
|
||||
ld hl,(cbftbl) ; get address of CBIOS function table
|
||||
ld a,$27 ; $27 is CBIOS READ entry offset
|
||||
call addhl ; set HL to resultant entry point
|
||||
ld (actfnc),hl ; save it
|
||||
; read the header
|
||||
ld a,12 ; start with 1536 byte header (12 records)
|
||||
ld (reccnt),a ; initialize record counter
|
||||
call rwdsk ; read the header
|
||||
ret nz ; abort on error
|
||||
; check header and get image size
|
||||
call chkhdr ; check integrity, HL = image size on return
|
||||
ret nz ; abort on error
|
||||
; convert image size to count of 128-byte records
|
||||
ld b,7 ; right shift 7 bits to get 128 byte record count
|
||||
rddsk1: srl h ; shift right msb
|
||||
rr l ; shift lsb w/ carry from msb
|
||||
djnz rddsk1 ; loop till done
|
||||
; set the number of records pending to read
|
||||
ld a,l ; record count to a
|
||||
ld (reccnt),a ; set remaining records to read
|
||||
; save the total image size (including header) for later
|
||||
add a,12 ; add the header records back
|
||||
ld (imgsiz),a ; and save the total image size (in records)
|
||||
; read the remaining system image records
|
||||
call rwdsk ; finish up
|
||||
ret nz ; abort on error
|
||||
; perform BDOS disk reset (critical since we mucked with CBIOS)
|
||||
ld c,$0D ; BDOS reset disk
|
||||
call bdos ; do it
|
||||
; return
|
||||
xor a ; signal success
|
||||
ret ; done
|
||||
;
|
||||
; Write image directly to disk system tracks using CBIOS
|
||||
;
|
||||
wrdsk:
|
||||
; force return to go through disk reset
|
||||
ld hl,resdsk ; load address of reset disk routine
|
||||
push hl ; and put it on the stack
|
||||
; set drive for subsequent writes
|
||||
ld a,(destfcb) ; get the drive
|
||||
dec a ; adjust for zero indexing
|
||||
call setdsk ; setup disk
|
||||
ret nz ; abort on error
|
||||
; set function to write
|
||||
ld hl,(cbftbl) ; get address of CBIOS function table
|
||||
ld a,$2A ; $2A is CBIOS WRITE entry offset
|
||||
call addhl ; set HL to resultant entry point
|
||||
ld (actfnc),hl ; save it
|
||||
; setup the record count to write
|
||||
ld a,(imgsiz) ; get previously recorded image size
|
||||
ld (reccnt),a ; save it as pending record count
|
||||
; write the image
|
||||
call rwdsk ; write the image
|
||||
ret nz ; abort on error
|
||||
; return
|
||||
xor a ; signal success
|
||||
ret ; done
|
||||
;
|
||||
; Perform BDOS disk reset
|
||||
; Required after making direct CBIOS disk calls
|
||||
;
|
||||
resdsk:
|
||||
; perform BDOS disk reset
|
||||
push af ; preserve status
|
||||
ld c,$0D ; BDOS reset disk
|
||||
call bdos ; do it
|
||||
pop af ; restore status
|
||||
ret
|
||||
;
|
||||
; Setup for CBIOS disk access
|
||||
;
|
||||
setdsk:
|
||||
; select disk
|
||||
ld (actdsk),a ; save active disk no
|
||||
ld c,a ; move to c
|
||||
ld e,0 ; treat as first select
|
||||
call cbios ; invoke cbios with...
|
||||
.db $1B ; SELDSK entry offset
|
||||
; check return (sets HL to DPH address)
|
||||
ld a,h
|
||||
or l
|
||||
jp z,errsel ; HL == 0 is select error
|
||||
; set HL to DPB address
|
||||
ld de,10 ; DPB address is 10 bytes into DPH
|
||||
add hl,de ; HL := address of DPB pointer
|
||||
ld a,(hl) ; dereference...
|
||||
inc hl
|
||||
ld h,(hl)
|
||||
ld l,a ; HL := address of DPB
|
||||
; extract sectors per track from first word of DPB
|
||||
ld c,(hl)
|
||||
inc hl
|
||||
ld b,(hl) ; BC := sectors per track
|
||||
ld (actspt),bc ; save it
|
||||
; ensure there are system tracks (verify that offset field in DPB is not zero)
|
||||
ld de,12 ; offset field is 12 bytes into DPB
|
||||
add hl,de ; point to offset field in DPB
|
||||
ld a,(hl) ; load first byte in A
|
||||
inc hl ; point to second byte
|
||||
or (hl) ; or with first byte
|
||||
jp z,errsys ; if zero, abort (no system tracks)
|
||||
; initialize for I/O
|
||||
ld hl,0
|
||||
ld (acttrk),hl ; active track := 0
|
||||
ld (actsec),hl ; active sector := 0
|
||||
ld hl,buf
|
||||
ld (bufptr),hl ; reset buffer pointer
|
||||
;
|
||||
xor a ; signal success
|
||||
ret ; done
|
||||
;
|
||||
; Read or write (reccnt) sectors to/from disk via CBIOS
|
||||
;
|
||||
rwdsk:
|
||||
; setup to read/write a sector
|
||||
ld bc,(acttrk) ; get active track
|
||||
call cbios ; invoke cbios with...
|
||||
.db $1E ; SETTRK entry offset
|
||||
ld bc,(actsec) ; get active sector
|
||||
call cbios ; invoke cbios with...
|
||||
.db $21 ; SETSEC entry offset
|
||||
ld bc,(bufptr) ; get active buffer pointer
|
||||
call cbios ; invoke cbios with...
|
||||
.db $24 ; SETDMA entry offset
|
||||
; read/write sector
|
||||
ld a,(reccnt) ; get the pending record count
|
||||
dec a ; last record?
|
||||
ld c,2 ; allow cached writes by default
|
||||
jr nz,rwdsk1 ; not last record, continue
|
||||
ld c,1 ; last record, no caching please
|
||||
rwdsk1: ld hl,(actfnc) ; load the CBIOS function vector
|
||||
call jphl ; indirect call (read or write)
|
||||
or a ; set flags on return code
|
||||
jp nz,errio ; if not zero, error abort
|
||||
; adjust buffer pointer
|
||||
ld hl,(bufptr) ; get buffer pointer
|
||||
ld de,128 ; record length is 128 bytes
|
||||
add hl,de ; adjust buffer ptr for next record
|
||||
ld (bufptr),hl ; save it
|
||||
; next sector
|
||||
ld hl,(actsec) ; current sector
|
||||
inc hl ; increment sector
|
||||
ld (actsec),hl ; save it
|
||||
; check for end of track
|
||||
ld de,(actspt) ; get current sectors per track
|
||||
or a ; clear CF
|
||||
sbc hl,de ; current track == sectors per track?
|
||||
jr nz,rwdsk2 ; no, skip track change
|
||||
; next track
|
||||
ld hl,0
|
||||
ld (actsec),hl ; current sector := 0
|
||||
ld hl,acttrk ; point to track variable
|
||||
inc (hl) ; increment track
|
||||
; check pending record count and loop or return
|
||||
rwdsk2: ld hl,reccnt
|
||||
dec (hl) ; decrement pending record count
|
||||
ret z ; if zero, done, return with Z set
|
||||
jr rwdsk ; otherwise, loop
|
||||
;
|
||||
jphl: jp (hl) ; indirect jump
|
||||
;
|
||||
; Verify system image header in buf by checking the expected signature.
|
||||
; Compute and return image size (based on header values) in HL.
|
||||
; NZ set if signature error.
|
||||
;
|
||||
chkhdr:
|
||||
; check signature
|
||||
ld hl,(buf+$580) ; get signature
|
||||
ld de,$A55A ; signature value
|
||||
or a ; clear CF
|
||||
sbc hl,de ; compare
|
||||
jp nz,errsig ; invalid signature
|
||||
; compute the image size (does not include size of header)
|
||||
ld hl,(buf+$5FC) ; get CPM_END
|
||||
ld de,(buf+$5FA) ; get CPM_LOC
|
||||
or a ; clear CF
|
||||
sbc hl,de ; image size := CPM_END - CPM_LOC
|
||||
xor a ; signal success
|
||||
ret ; done
|
||||
;
|
||||
; Convert a filename at (HL) into an FCB at (DE).
|
||||
; Includes wildcard expansion.
|
||||
; On return, A=0 if unambiguous name specified, and
|
||||
; (HL) points to character following filename spec
|
||||
;
|
||||
convert:
|
||||
push de ; put fcb address on stack
|
||||
ex de,hl
|
||||
ld a,(de) ; get first character.
|
||||
or a
|
||||
jp z,convrt1
|
||||
sbc a,'A'-1 ; might be a drive name, convert to binary.
|
||||
ld b,a ; and save.
|
||||
inc de ; check next character for a ':'.
|
||||
ld a,(de)
|
||||
cp ':'
|
||||
jp z,convrt2
|
||||
dec de ; nope, move pointer back to the start of the line.
|
||||
convrt1:
|
||||
ld a,(defdrv)
|
||||
ld (hl),a
|
||||
jp convrt3
|
||||
convrt2:
|
||||
ld a,b
|
||||
ld (hl),b
|
||||
inc de
|
||||
; Convert the base file name.
|
||||
convrt3:ld b,08h
|
||||
convrt4:ld a,(de)
|
||||
call delim
|
||||
jp z,convrt8
|
||||
inc hl
|
||||
cp '*' ; note that an '*' will fill the remaining
|
||||
jp nz,convrt5 ; field with '?'
|
||||
ld (hl),'?'
|
||||
jp convrt6
|
||||
convrt5:ld (hl),a
|
||||
inc de
|
||||
convrt6:dec b
|
||||
jp nz,convrt4
|
||||
convrt7:ld a,(de)
|
||||
call delim ; get next delimiter
|
||||
jp z,getext
|
||||
inc de
|
||||
jp convrt7
|
||||
convrt8:inc hl ; blank fill the file name
|
||||
ld (hl),' '
|
||||
dec b
|
||||
jp nz,convrt8
|
||||
getext: ld b,03h
|
||||
cp '.'
|
||||
jp nz,getext5
|
||||
inc de
|
||||
getext1:ld a,(de)
|
||||
call delim
|
||||
jp z,getext5
|
||||
inc hl
|
||||
cp '*'
|
||||
jp nz,getext2
|
||||
ld (hl),'?'
|
||||
jp getext3
|
||||
getext2:ld (hl),a
|
||||
inc de
|
||||
getext3:dec b
|
||||
jp nz,getext1
|
||||
getext4:ld a,(de)
|
||||
call delim
|
||||
jp z,getext6
|
||||
inc de
|
||||
jp getext4
|
||||
getext5:inc hl
|
||||
ld (hl),' '
|
||||
dec b
|
||||
jp nz,getext5
|
||||
getext6:ld b,3
|
||||
getext7:inc hl
|
||||
ld (hl),0
|
||||
dec b
|
||||
jp nz,getext7
|
||||
pop hl ; HL := start of FCB
|
||||
push de ; save input line pointer
|
||||
; Check to see if this is an ambiguous file name specification.
|
||||
; Set the A register to non-zero if it is.
|
||||
ld bc,11 ; set name length.
|
||||
getext8:inc hl
|
||||
ld a,(hl)
|
||||
cp '?' ; any question marks?
|
||||
jp nz,getext9
|
||||
inc b ; count them.
|
||||
getext9:dec c
|
||||
jp nz,getext8
|
||||
ld a,b
|
||||
or a
|
||||
pop hl ; return with updated input pointer
|
||||
ret
|
||||
;
|
||||
; Print formatted FCB at (HL)
|
||||
;
|
||||
prtfcb:
|
||||
push hl ; save HL
|
||||
call chkfcb ; set flags indicating nature of FCB
|
||||
pop hl ; restore HL
|
||||
ret z ; nothing to print
|
||||
push af ; save FCB flags
|
||||
ld a,(hl) ; get first byte of FCB (drive)
|
||||
inc hl ; point to next char
|
||||
or a ; is drive specified (non-zero)?
|
||||
jr z,prtfcb1 ; if zero, do not print drive letter
|
||||
add a,'@' ; adjust drive number to alpha
|
||||
call prtchr ; print it
|
||||
ld a,':'
|
||||
call prtchr ; print drive separator
|
||||
prtfcb1:
|
||||
pop af ; restore FCB flags
|
||||
bit 1,a ; bit 1 set if filename specified
|
||||
ret z ; return if no filename
|
||||
ld b,8 ; base is 8 characters
|
||||
call prtfcb2 ; print them
|
||||
ld a,'.'
|
||||
call prtchr ; print file extension separator
|
||||
ld b,3 ; extension is 3 characters
|
||||
prtfcb2:
|
||||
ld a,(hl) ; load the next character
|
||||
inc hl ; point to next character
|
||||
cp ' ' ; check for blank
|
||||
call nz,prtchr ; print char if it is not a blank
|
||||
djnz prtfcb2 ; loop till done
|
||||
ret ; return
|
||||
;
|
||||
; Check FCB to see if a drive and/or filename is specified.
|
||||
; Set bit 0 for drive and bit 1 for filename in A
|
||||
;
|
||||
chkfcb:
|
||||
ld c,0 ; use C for flags, start with none
|
||||
ld a,(hl) ; get drive
|
||||
or a ; anything there?
|
||||
jr z,chkfcb1 ; skip if nothing there
|
||||
set 0,c ; set bit zero to indicate a drive spec
|
||||
chkfcb1:
|
||||
ld b,11 ; set up to check 11 bytes (base & ext)
|
||||
chkfcb2:
|
||||
inc hl ; bump to next byte
|
||||
ld a,(hl) ; get next
|
||||
cp 'A' ; blank means empty byte
|
||||
jr nc,chkfcb3 ; if not blank, we have a filename
|
||||
djnz chkfcb2 ; loop
|
||||
jr chkfcb4 ; nothing there
|
||||
chkfcb3:
|
||||
set 1,c ; set bit 1 to indicate a file spec
|
||||
chkfcb4:
|
||||
ld a,c ; put result in a
|
||||
or a ; set flags
|
||||
ret
|
||||
;
|
||||
; Print character in A without destroying any registers
|
||||
;
|
||||
prtchr:
|
||||
push bc ; save registers
|
||||
push de
|
||||
push hl
|
||||
ld e,a ; character to print in E
|
||||
ld c,$02 ; BDOS function to output a character
|
||||
call bdos ; do it
|
||||
pop hl ; restore registers
|
||||
pop de
|
||||
pop bc
|
||||
ret
|
||||
;
|
||||
; Print $ terminated string at (DE) without destroying any registers
|
||||
;
|
||||
prtstr:
|
||||
push bc ; save registers
|
||||
push de
|
||||
push hl
|
||||
ld c,$09 ; BDOS function to output a '$' terminated string
|
||||
call bdos ; do it
|
||||
pop hl ; restore registers
|
||||
pop de
|
||||
pop bc
|
||||
ret
|
||||
;
|
||||
; Print the value in A in hex without destroying any registers
|
||||
;
|
||||
prthex:
|
||||
push af ; save AF
|
||||
push de ; save DE
|
||||
call hexascii ; convert value in A to hex chars in DE
|
||||
ld a,d ; get the high order hex char
|
||||
call prtchr ; print it
|
||||
ld a,e ; get the low order hex char
|
||||
call prtchr ; print it
|
||||
pop de ; restore DE
|
||||
pop af ; restore AF
|
||||
ret ; done
|
||||
;
|
||||
; Convert binary value in A to ascii hex characters in DE
|
||||
;
|
||||
hexascii:
|
||||
ld d,a ; save A in D
|
||||
call hexconv ; convert low nibble of A to hex
|
||||
ld e,a ; save it in E
|
||||
ld a,d ; get original value back
|
||||
rlca ; rotate high order nibble to low bits
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
call hexconv ; convert nibble
|
||||
ld d,a ; save it in D
|
||||
ret ; done
|
||||
;
|
||||
; Convert low nibble of A to ascii hex
|
||||
;
|
||||
hexconv:
|
||||
and $0F ; low nibble only
|
||||
add a,$90
|
||||
daa
|
||||
adc a,$40
|
||||
daa
|
||||
ret
|
||||
;
|
||||
; Start a new line
|
||||
;
|
||||
crlf:
|
||||
ld a,13 ; <CR>
|
||||
call prtchr ; print it
|
||||
ld a,10 ; <LF>
|
||||
jr prtchr ; print it
|
||||
;
|
||||
; Get the next non-blank character from (HL).
|
||||
;
|
||||
nonblank:
|
||||
ld a,(hl) ; load next character
|
||||
or a ; string ends with a null
|
||||
ret z ; if null, return pointing to null
|
||||
cp ' ' ; check for blank
|
||||
ret nz ; return if not blank
|
||||
inc hl ; if blank, increment character pointer
|
||||
jr nonblank ; and loop
|
||||
;
|
||||
; Check character at (DE) for delimiter.
|
||||
;
|
||||
delim: or a
|
||||
ret z
|
||||
cp ' ' ; blank
|
||||
ret z
|
||||
jr c,delim1 ; handle control characters
|
||||
cp '=' ; equal
|
||||
ret z
|
||||
cp '_' ; underscore
|
||||
ret z
|
||||
cp '.' ; period
|
||||
ret z
|
||||
cp ':' ; colon
|
||||
ret z
|
||||
cp $3b ; semicolon
|
||||
ret z
|
||||
cp '<' ; less than
|
||||
ret z
|
||||
cp '>' ; greater than
|
||||
ret
|
||||
delim1:
|
||||
; treat control chars as delimiters
|
||||
xor a ; set Z
|
||||
ret ; return
|
||||
;
|
||||
; Invoke CBIOS function
|
||||
; The CBIOS function offset must be stored in the byte
|
||||
; following the call instruction. ex:
|
||||
; call cbios
|
||||
; .db $0C ; offset of CONOUT CBIOS function
|
||||
;
|
||||
cbios:
|
||||
ex (sp),hl
|
||||
ld a,(hl) ; get the function offset
|
||||
inc hl ; point past value following call instruction
|
||||
ex (sp),hl ; put address back at top of stack and recover HL
|
||||
ld hl,(cbftbl) ; address of CBIOS function table to HL
|
||||
call addhl ; determine specific function address
|
||||
jp (hl) ; invoke CBIOS
|
||||
;
|
||||
; Add the value in A to HL (HL := HL + A)
|
||||
;
|
||||
addhl:
|
||||
add a,l ; A := A + L
|
||||
ld l,a ; Put result back in L
|
||||
ret nc ; if no carry, we are done
|
||||
inc h ; if carry, increment H
|
||||
ret ; and return
|
||||
;
|
||||
; Errors
|
||||
;
|
||||
erruse: ; command usage error (syntax)
|
||||
ld de,msguse
|
||||
jr err
|
||||
erramb: ; ambiguous file spec (wild cards) is not allowed
|
||||
ld de,msgamb
|
||||
jr err
|
||||
errdlm: ; invalid delimiter in command tail
|
||||
ld de,msgdlm
|
||||
jr err
|
||||
errfil: ; source file not found
|
||||
ld de,msgfil
|
||||
jr err
|
||||
errclo: ; file close error
|
||||
ld de,msgclo
|
||||
jr err
|
||||
errdel: ; file delete error
|
||||
ld de,msgdel
|
||||
jr err
|
||||
errsig: ; invalid system image signature error
|
||||
ld de,msgsig
|
||||
jr err
|
||||
errsel: ; CBIOS drive select error
|
||||
ld de,msgsel
|
||||
jr err
|
||||
errsys: ; no system tracks on drive error
|
||||
ld de,msgsys
|
||||
jr err
|
||||
errio: ; I/O error
|
||||
ld de,msgio
|
||||
jr err
|
||||
err: ; print error string and return error signal
|
||||
call crlf ; print newline
|
||||
call prtstr ; print error string
|
||||
or $FF ; signal error
|
||||
ret ; done
|
||||
errdos: ; handle BDOS errors
|
||||
push af ; save return code
|
||||
call crlf ; newline
|
||||
ld de,msgdos ; load
|
||||
call prtstr ; and print error string
|
||||
pop af ; recover return code
|
||||
call prthex ; print error code
|
||||
or $FF ; signal error
|
||||
ret ; done
|
||||
;
|
||||
;===============================================================================
|
||||
; Storage Section
|
||||
;===============================================================================
|
||||
;
|
||||
defdrv .db 0 ; default drive for FCB
|
||||
cbftbl .dw 0 ; address of CBIOS function table
|
||||
imgsiz .db 0 ; image size (count of 128 byte records)
|
||||
;
|
||||
destfcb .fill 36,0 ; destination FCB
|
||||
srcfcb .fill 36,0 ; source FCB
|
||||
;
|
||||
stksav .dw 0 ; stack pointer saved at start
|
||||
.fill stksiz,0 ; stack
|
||||
stack .equ $ ; stack top
|
||||
;
|
||||
rwfun .db 0 ; active read/write function
|
||||
rwfcb .dw 0 ; active read/write FCB
|
||||
reccnt .db 0 ; active remaining records to read/write
|
||||
bufptr .dw 0 ; active pointer into buffer
|
||||
;
|
||||
actdsk .db 0 ; active disk no
|
||||
acttrk .dw 0 ; active track
|
||||
actsec .dw 0 ; active sector
|
||||
actspt .dw 0 ; active sectors per track
|
||||
actfnc .dw 0 ; active function (read or write)
|
||||
;
|
||||
; Messages
|
||||
;
|
||||
msguse .db "Usage: SYSCOPY <dest>[=<source>]$"
|
||||
msgamb .db "Ambiguous file specification not allowed$"
|
||||
msgdlm .db "Invalid delimiter$"
|
||||
msgfil .db "File not found$"
|
||||
msgclo .db "File close error$"
|
||||
msgdel .db "Error deleting target file$"
|
||||
msgsig .db "Invalid system image (bad signature)$"
|
||||
msgdos .db "DOS error, return code=0x$"
|
||||
msgsel .db "Disk select error$"
|
||||
msgsys .db "Non-system disk error$"
|
||||
msgio .db "Disk I/O error$"
|
||||
msgrd .db "Reading image... $"
|
||||
msgwrt .db "Writing image... $"
|
||||
msgdon .db "Done$"
|
||||
sconf1 .db "Transfer system image from $"
|
||||
sconf2 .db " to $"
|
||||
sconf3 .db " (Y/N)? $"
|
||||
;
|
||||
.end
|
||||
507
Source/Apps/SysGen.z80
Normal file
507
Source/Apps/SysGen.z80
Normal file
@@ -0,0 +1,507 @@
|
||||
TITLE 'SYSGEN - SYSTEM GENERATION PROGRAM 8/79'
|
||||
; SYSTEM GENERATION PROGRAM, VERSION FOR ROMWBW
|
||||
VERS EQU 20 ; X.X
|
||||
;
|
||||
; COPYRIGHT (C) DIGITAL RESEARCH
|
||||
; 1976, 1977, 1978, 1979
|
||||
;
|
||||
NDISKS EQU 16 ; NUMBER OF DISK DRIVES
|
||||
SECSIZ EQU 128 ; SIZE OF EACH SECTOR
|
||||
LOG2SEC EQU 7 ; LOG 2 SECSIZ
|
||||
;
|
||||
FCB EQU 05CH ; DEFAULT FCB LOCATION
|
||||
FCBCR EQU FCB+32 ; CURRENT RECORD LOCATION
|
||||
TPA EQU 0100H ; TRANSIENT PROGRAM AREA
|
||||
LOADP EQU 900H ; LOAD POINT FOR SYSTEM DURING LOAD/STORE
|
||||
BDOS EQU 5 ; DOS ENTRY POINT
|
||||
BOOT EQU 0 ; JMP TO 'BOOT' TO REBOOT SYSTEM
|
||||
CONI EQU 1 ; CONSOLE INPUT FUNCTION
|
||||
CONO EQU 2 ; CONSOLE OUTPUT FUNCTION
|
||||
OPENF EQU 15 ; DISK OPEN FUNCTION
|
||||
DREADF EQU 20 ; DISK READ FUNCTION
|
||||
;
|
||||
CR EQU 0DH ; CARRIAGE RETURN
|
||||
LF EQU 0AH ; LINE FEED
|
||||
STKSIZE EQU 16 ; SIZE OF LOCAL STACK
|
||||
;
|
||||
WBOOT EQU 1 ; ADDRESS OF WARM BOOT (OTHER PATCH ENTRY
|
||||
;
|
||||
ORG TPA ; TRANSIENT PROGRAM AREA
|
||||
JP START
|
||||
DB 'COPYRIGHT (C) 1978, DIGITAL RESEARCH '
|
||||
;
|
||||
; UTILITY SUBROUTINES
|
||||
;
|
||||
GETCHAR:
|
||||
; READ CONSOLE CHARACTER TO REGISTER A
|
||||
LD C,CONI
|
||||
CALL BDOS
|
||||
; CONVERT TO UPPER CASE BEFORE RETURN
|
||||
CP 'A' OR 20H
|
||||
RET C ; RETURN IF BELOW LOWER CASE A
|
||||
CP ('Z' OR 20H) + 1
|
||||
RET NC ; RETURN IF ABOVE LOWER CASE Z
|
||||
AND 5FH
|
||||
RET
|
||||
;
|
||||
PUTCHAR:
|
||||
; WRITE CHARACTER FROM A TO CONSOLE
|
||||
LD E,A
|
||||
LD C,CONO
|
||||
CALL BDOS
|
||||
RET
|
||||
;
|
||||
CRLF: ; SEND CARRIAGE RETURN, LINE FEED
|
||||
LD A,CR
|
||||
CALL PUTCHAR
|
||||
LD A,LF
|
||||
CALL PUTCHAR
|
||||
RET
|
||||
;
|
||||
CRMSG: ; PRINT MESSAGE ADDRESSED BY H,L TIL ZERO
|
||||
; WITH LEADING CRLF
|
||||
PUSH HL
|
||||
CALL CRLF
|
||||
POP HL ; DROP THRU TO OUTMSG0
|
||||
OUTMSG:
|
||||
LD A,(HL)
|
||||
OR A
|
||||
RET Z
|
||||
; MESSAGE NOT YET COMPLETED
|
||||
PUSH HL
|
||||
CALL PUTCHAR
|
||||
POP HL
|
||||
INC HL
|
||||
JP OUTMSG
|
||||
;
|
||||
DREAD: ; DISK READ FUNCTION VIA BDOS
|
||||
LD C,DREADF
|
||||
JP BDOS
|
||||
;
|
||||
OPEN: ; FILE OPEN FUNCTION VIA BDOS
|
||||
LD C,OPENF
|
||||
JP BDOS
|
||||
;
|
||||
; READ IMAGE DIRECTLY FROM DISK SYSTEM TRACKS USING CBIOS
|
||||
; DISK NUMBER MUST BE IN (ACTDSK)
|
||||
;
|
||||
RDDSK:
|
||||
; FORCE RETURN TO GO THROUGH DISK RESET
|
||||
LD HL,RESDSK ; LOAD ADDRESS OF RESET DISK ROUTINE
|
||||
PUSH HL ; AND PUT IT ON THE STACK
|
||||
; SET DRIVE FOR SUBSEQUENT READS
|
||||
CALL SETDSK ; SETUP DISK SPECIFIED IN A
|
||||
RET NZ ; ABORT ON ERROR
|
||||
; SET FUNCTION TO READ
|
||||
LD HL,(CBFTBL) ; GET ADDRESS OF CBIOS FUNCTION TABLE
|
||||
LD A,027H ; $27 IS CBIOS READ ENTRY OFFSET
|
||||
CALL ADDHL ; SET HL TO RESULTANT ENTRY POINT
|
||||
LD (ACTFNC),HL ; SAVE IT
|
||||
; READ THE HEADER
|
||||
LD A,12 ; START WITH 1536 BYTE HEADER (12 RECORDS)
|
||||
LD (RECCNT),A ; INITIALIZE RECORD COUNTER
|
||||
CALL RWDSK ; READ THE HEADER
|
||||
RET NZ ; ABORT ON ERROR
|
||||
; CHECK HEADER AND GET IMAGE SIZE
|
||||
CALL CHKHDR ; CHECK INTEGRITY, HL = IMAGE SIZE ON RETURN
|
||||
RET NZ ; ABORT ON ERROR
|
||||
; CONVERT IMAGE SIZE TO COUNT OF 128-BYTE RECORDS
|
||||
LD B,7 ; RIGHT SHIFT 7 BITS TO GET 128 BYTE RECORD COUNT
|
||||
RDDSK1: SRL H ; SHIFT RIGHT MSB
|
||||
RR L ; SHIFT LSB W/ CARRY FROM MSB
|
||||
DJNZ RDDSK1 ; LOOP TILL DONE
|
||||
; SET THE NUMBER OF RECORDS PENDING TO READ
|
||||
LD A,L ; RECORD COUNT TO A
|
||||
LD (RECCNT),A ; SET REMAINING RECORDS TO READ
|
||||
; SAVE THE TOTAL IMAGE SIZE (INCLUDING HEADER) FOR LATER
|
||||
ADD A,12 ; ADD THE HEADER RECORDS BACK
|
||||
LD (IMGSIZ),A ; AND SAVE THE TOTAL IMAGE SIZE (IN RECORDS)
|
||||
; READ THE REMAINING SYSTEM IMAGE RECORDS
|
||||
CALL RWDSK ; FINISH UP
|
||||
RET NZ ; ABORT ON ERROR
|
||||
; PERFORM BDOS DISK RESET (CRITICAL SINCE WE MUCKED WITH CBIOS)
|
||||
LD C,0DH ; BDOS RESET DISK
|
||||
CALL BDOS ; DO IT
|
||||
; RETURN
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; DONE
|
||||
;
|
||||
; WRITE IMAGE DIRECTLY TO DISK SYSTEM TRACKS USING CBIOS
|
||||
; DISK NUMBER MUST BE IN (ACTDSK)
|
||||
;
|
||||
WRDSK:
|
||||
; FORCE RETURN TO GO THROUGH DISK RESET
|
||||
LD HL,RESDSK ; LOAD ADDRESS OF RESET DISK ROUTINE
|
||||
PUSH HL ; AND PUT IT ON THE STACK
|
||||
; SET DRIVE FOR SUBSEQUENT WRITES
|
||||
CALL SETDSK ; SETUP DISK SPECIFIED IN A
|
||||
RET NZ ; ABORT ON ERROR
|
||||
; SET FUNCTION TO WRITE
|
||||
LD HL,(CBFTBL) ; GET ADDRESS OF CBIOS FUNCTION TABLE
|
||||
LD A,02AH ; $2A IS CBIOS WRITE ENTRY OFFSET
|
||||
CALL ADDHL ; SET HL TO RESULTANT ENTRY POINT
|
||||
LD (ACTFNC),HL ; SAVE IT
|
||||
; SETUP THE RECORD COUNT TO WRITE
|
||||
LD A,(IMGSIZ) ; GET PREVIOUSLY RECORDED IMAGE SIZE
|
||||
LD (RECCNT),A ; SAVE IT AS PENDING RECORD COUNT
|
||||
; WRITE THE IMAGE
|
||||
CALL RWDSK ; WRITE THE IMAGE
|
||||
RET NZ ; ABORT ON ERROR
|
||||
; RETURN
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; DONE
|
||||
;
|
||||
; PERFORM BDOS DISK RESET
|
||||
; REQUIRED AFTER MAKING DIRECT CBIOS DISK CALLS
|
||||
;
|
||||
RESDSK:
|
||||
; PERFORM BDOS DISK RESET
|
||||
PUSH AF ; PRESERVE STATUS
|
||||
LD C,0DH ; BDOS RESET DISK
|
||||
CALL BDOS ; DO IT
|
||||
POP AF ; RESTORE STATUS
|
||||
RET
|
||||
;
|
||||
; SETUP FOR CBIOS DISK ACCESS
|
||||
;
|
||||
SETDSK:
|
||||
; SELECT DISK
|
||||
LD A,(ACTDSK) ; GET ACTIVE DISK
|
||||
LD C,A ; MOVE TO C
|
||||
LD E,0 ; TREAT AS FIRST SELECT
|
||||
CALL CBIOS ; INVOKE CBIOS WITH...
|
||||
DB 01BH ; SELDSK ENTRY OFFSET
|
||||
; CHECK RETURN (SETS HL TO DPH ADDRESS)
|
||||
LD A,H
|
||||
OR L
|
||||
JP Z,ERRSEL ; HL == 0 IS SELECT ERROR
|
||||
; SET HL TO DPB ADDRESS
|
||||
LD DE,10 ; DPB ADDRESS IS 10 BYTES INTO DPH
|
||||
ADD HL,DE ; HL := ADDRESS OF DPB POINTER
|
||||
LD A,(HL) ; DEREFERENCE...
|
||||
INC HL
|
||||
LD H,(HL)
|
||||
LD L,A ; HL := ADDRESS OF DPB
|
||||
; EXTRACT SECTORS PER TRACK FROM FIRST WORD OF DPB
|
||||
LD C,(HL)
|
||||
INC HL
|
||||
LD B,(HL) ; BC := SECTORS PER TRACK
|
||||
LD (ACTSPT),BC ; SAVE IT
|
||||
; ENSURE THERE ARE SYSTEM TRACKS (VERIFY THAT OFFSET FIELD IN DPB IS NOT ZERO)
|
||||
LD DE,12 ; OFFSET FIELD IS 12 BYTES INTO DPB
|
||||
ADD HL,DE ; POINT TO OFFSET FIELD IN DPB
|
||||
LD A,(HL) ; LOAD FIRST BYTE IN A
|
||||
INC HL ; POINT TO SECOND BYTE
|
||||
OR (HL) ; OR WITH FIRST BYTE
|
||||
JP Z,ERRSYS ; IF ZERO, ABORT (NO SYSTEM TRACKS)
|
||||
; INITIALIZE FOR I/O
|
||||
LD HL,0
|
||||
LD (ACTTRK),HL ; ACTIVE TRACK := 0
|
||||
LD (ACTSEC),HL ; ACTIVE SECTOR := 0
|
||||
LD HL,LOADP
|
||||
LD (BUFPTR),HL ; RESET BUFFER POINTER
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; DONE
|
||||
;
|
||||
; READ OR WRITE (RECCNT) SECTORS TO/FROM DISK VIA CBIOS
|
||||
;
|
||||
RWDSK:
|
||||
; SETUP TO READ/WRITE A SECTOR
|
||||
LD BC,(ACTTRK) ; GET ACTIVE TRACK
|
||||
CALL CBIOS ; INVOKE CBIOS WITH...
|
||||
DB 01EH ; SETTRK ENTRY OFFSET
|
||||
LD BC,(ACTSEC) ; GET ACTIVE SECTOR
|
||||
CALL CBIOS ; INVOKE CBIOS WITH...
|
||||
DB 021H ; SETSEC ENTRY OFFSET
|
||||
LD BC,(BUFPTR) ; GET ACTIVE BUFFER POINTER
|
||||
CALL CBIOS ; INVOKE CBIOS WITH...
|
||||
DB 024H ; SETDMA ENTRY OFFSET
|
||||
; READ/WRITE SECTOR
|
||||
LD A,(RECCNT) ; GET THE PENDING RECORD COUNT
|
||||
DEC A ; LAST RECORD?
|
||||
LD C,2 ; ALLOW CACHED WRITES BY DEFAULT
|
||||
JR NZ,RWDSK1 ; NOT LAST RECORD, CONTINUE
|
||||
LD C,1 ; LAST RECORD, NO CACHING PLEASE
|
||||
RWDSK1: LD HL,(ACTFNC) ; LOAD THE CBIOS FUNCTION VECTOR
|
||||
CALL JPHL ; INDIRECT CALL (READ OR WRITE)
|
||||
OR A ; SET FLAGS ON RETURN CODE
|
||||
JP NZ,ERRIO ; IF NOT ZERO, ERROR ABORT
|
||||
; ADJUST BUFFER POINTER
|
||||
LD HL,(BUFPTR) ; GET BUFFER POINTER
|
||||
LD DE,128 ; RECORD LENGTH IS 128 BYTES
|
||||
ADD HL,DE ; ADJUST BUFFER PTR FOR NEXT RECORD
|
||||
LD (BUFPTR),HL ; SAVE IT
|
||||
; NEXT SECTOR
|
||||
LD HL,(ACTSEC) ; CURRENT SECTOR
|
||||
INC HL ; INCREMENT SECTOR
|
||||
LD (ACTSEC),HL ; SAVE IT
|
||||
; CHECK FOR END OF TRACK
|
||||
LD DE,(ACTSPT) ; GET CURRENT SECTORS PER TRACK
|
||||
OR A ; CLEAR CF
|
||||
SBC HL,DE ; CURRENT TRACK == SECTORS PER TRACK?
|
||||
JR NZ,RWDSK2 ; NO, SKIP TRACK CHANGE
|
||||
; NEXT TRACK
|
||||
LD HL,0
|
||||
LD (ACTSEC),HL ; CURRENT SECTOR := 0
|
||||
LD HL,ACTTRK ; POINT TO TRACK VARIABLE
|
||||
INC (HL) ; INCREMENT TRACK
|
||||
; CHECK PENDING RECORD COUNT AND LOOP OR RETURN
|
||||
RWDSK2: LD HL,RECCNT
|
||||
DEC (HL) ; DECREMENT PENDING RECORD COUNT
|
||||
RET Z ; IF ZERO, DONE, RETURN WITH Z SET
|
||||
JR RWDSK ; OTHERWISE, LOOP
|
||||
;
|
||||
JPHL: JP (HL) ; INDIRECT JUMP
|
||||
;
|
||||
; VERIFY SYSTEM IMAGE HEADER IN BUF BY CHECKING THE EXPECTED SIGNATURE.
|
||||
; COMPUTE AND RETURN IMAGE SIZE (BASED ON HEADER VALUES) IN HL.
|
||||
; NZ SET IF SIGNATURE ERROR.
|
||||
;
|
||||
CHKHDR:
|
||||
; CHECK SIGNATURE
|
||||
LD HL,(LOADP+580H) ; GET SIGNATURE
|
||||
LD DE,0A55AH ; SIGNATURE VALUE
|
||||
OR A ; CLEAR CF
|
||||
SBC HL,DE ; COMPARE
|
||||
JP NZ,ERRSIG ; INVALID SIGNATURE
|
||||
; COMPUTE THE IMAGE SIZE (DOES NOT INCLUDE SIZE OF HEADER)
|
||||
LD HL,(LOADP+5FCH) ; GET CPM_END
|
||||
LD DE,(LOADP+5FAH) ; GET CPM_LOC
|
||||
OR A ; CLEAR CF
|
||||
SBC HL,DE ; IMAGE SIZE := CPM_END - CPM_LOC
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; DONE
|
||||
;
|
||||
; INVOKE CBIOS FUNCTION
|
||||
; THE CBIOS FUNCTION OFFSET MUST BE STORED IN THE BYTE
|
||||
; FOLLOWING THE CALL INSTRUCTION. EX:
|
||||
; CALL CBIOS
|
||||
; DB 0CH ; OFFSET OF CONOUT CBIOS FUNCTION
|
||||
;
|
||||
CBIOS:
|
||||
EX (SP),HL
|
||||
LD A,(HL) ; GET THE FUNCTION OFFSET
|
||||
INC HL ; POINT PAST VALUE FOLLOWING CALL INSTRUCTION
|
||||
EX (SP),HL ; PUT ADDRESS BACK AT TOP OF STACK AND RECOVER HL
|
||||
LD HL,(CBFTBL) ; ADDRESS OF CBIOS FUNCTION TABLE TO HL
|
||||
CALL ADDHL ; DETERMINE SPECIFIC FUNCTION ADDRESS
|
||||
JP (HL) ; INVOKE CBIOS
|
||||
;
|
||||
; ADD THE VALUE IN A TO HL (HL := HL + A)
|
||||
;
|
||||
ADDHL:
|
||||
ADD A,L ; A := A + L
|
||||
LD L,A ; PUT RESULT BACK IN L
|
||||
RET NC ; IF NO CARRY, WE ARE DONE
|
||||
INC H ; IF CARRY, INCREMENT H
|
||||
RET ; AND RETURN
|
||||
;
|
||||
; START OF PROGRAM
|
||||
;
|
||||
START:
|
||||
LD SP,STACK ; SET LOCAL STACK POINTER
|
||||
LD HL,SIGNON
|
||||
CALL CRMSG
|
||||
; LOCATE CBIOS FUNCTION TABLE ADDRESS
|
||||
LD HL,(BOOT+1) ; LOAD ADDRESS OF CP/M RESTART VECTOR
|
||||
LD DE,-3 ; ADJUSTMENT FOR START OF TABLE
|
||||
ADD HL,DE ; HL NOW HAS START OF TABLE
|
||||
LD (CBFTBL),HL ; SAVE IT
|
||||
; CHECK FOR DEFAULT FILE LOAD INSTEAD OF GET
|
||||
LD A,(FCB+1); BLANK IF NO FILE
|
||||
CP ' '
|
||||
JP Z,GETSYS ; SKIP TO GET SYSTEM MESSAGE IF BLANK
|
||||
LD DE,FCB ; TRY TO OPEN IT
|
||||
CALL OPEN ;
|
||||
INC A ; 255 BECOMES 00
|
||||
JP NZ,RDOK ; OK TO READ IF NOT 255
|
||||
; FILE NOT PRESENT, ERROR AND REBOOT
|
||||
LD HL,NOFILE
|
||||
CALL CRMSG
|
||||
JP REBOOT
|
||||
;
|
||||
; FILE PRESENT - READ TO LOAD POINT
|
||||
;
|
||||
RDOK:
|
||||
XOR A
|
||||
LD (FCBCR),A; CURRENT RECORD = 0
|
||||
; PRE-READ AREA FROM TPA TO LOADP
|
||||
LD C,(LOADP-TPA)/SECSIZ
|
||||
PRERD: ; PRE-READ FILE
|
||||
PUSH BC ; SAVE COUNT
|
||||
LD DE,FCB ; INPUT FILE CONTROL COUNT
|
||||
CALL DREAD ; ASSUME SET TO DEFAULT BUFFER
|
||||
POP BC ; RESTORE COUNT
|
||||
OR A
|
||||
JP NZ,BADRD ; CANNOT ENCOUNTER END-OF FILE
|
||||
DEC C ; COUNT DOWN
|
||||
JP NZ,PRERD ; FOR ANOTHER SECTOR
|
||||
;
|
||||
; SECTORS SKIPPED AT BEGINNING OF FILE
|
||||
;
|
||||
LD HL,LOADP
|
||||
RDINP:
|
||||
PUSH HL
|
||||
LD B,H
|
||||
LD C,L ; READY FOR DMA
|
||||
CALL CBIOS ; INVOKE CBIOS WITH...
|
||||
DB 024H ; SETDMA ENTRY OFFSET
|
||||
LD DE,FCB ; READY FOR READ
|
||||
CALL DREAD ;
|
||||
POP HL ; RECALL DMA ADDRESS
|
||||
OR A ; 00 IF READ OK
|
||||
JP NZ,PUTSYS ; ASSUME EOF IF NOT.
|
||||
; MORE TO READ, CONTINUE
|
||||
LD DE,SECSIZ
|
||||
ADD HL,DE ; HL IS NEW LOAD ADDRESS
|
||||
JP RDINP
|
||||
;
|
||||
BADRD: ; EOF ENCOUNTERED IN INPUT FILE
|
||||
LD HL,BADFILE
|
||||
CALL CRMSG
|
||||
JP REBOOT
|
||||
;
|
||||
GETSYS:
|
||||
CALL CRLF
|
||||
LD HL,ASKGET ; GET SYSTEM?
|
||||
CALL CRMSG
|
||||
CALL GETCHAR
|
||||
CP CR
|
||||
JP Z,PUTSYS ; SKIP IF CR ONLY
|
||||
;
|
||||
SUB 'A' ; NORMALIZE DRIVE NUMBER
|
||||
CP NDISKS ; VALID DRIVE?
|
||||
JP C,GETC ; SKIP TO GETC IF SO
|
||||
; INVALID DRIVE NUMBER
|
||||
CALL BADDISK
|
||||
JP GETSYS ; TO TRY AGAIN
|
||||
;
|
||||
GETC:
|
||||
; SELECT DISK GIVEN BY REGISTER A
|
||||
ADD A,'A'
|
||||
LD (GDISK),A; TO SET MESSAGE
|
||||
SUB 'A'
|
||||
LD (ACTDSK),A ; SAVE ACTIVE DISK NO
|
||||
|
||||
; ; GETSYS, SET RW TO READ AND GET THE SYSTEM
|
||||
CALL CRLF
|
||||
LD HL,GETMSG
|
||||
CALL OUTMSG
|
||||
CALL GETCHAR
|
||||
CP CR
|
||||
JP NZ,REBOOT
|
||||
CALL CRLF
|
||||
CALL RDDSK
|
||||
JP NZ,GETSYS
|
||||
LD HL,DONE
|
||||
CALL OUTMSG
|
||||
;
|
||||
; PUT SYSTEM
|
||||
;
|
||||
PUTSYS:
|
||||
CALL CRLF
|
||||
LD HL,ASKPUT
|
||||
CALL CRMSG
|
||||
CALL GETCHAR
|
||||
CP CR
|
||||
JP Z,REBOOT
|
||||
SUB 'A'
|
||||
CP NDISKS
|
||||
JP C,PUTC
|
||||
; INVALID DRIVE NAME
|
||||
CALL BADDISK
|
||||
JP PUTSYS ; TO TRY AGAIN
|
||||
;
|
||||
PUTC: ; SET DISK FROM REGISTER C
|
||||
ADD A,'A'
|
||||
LD (PDISK),A ; MESSAGE SET
|
||||
SUB 'A'
|
||||
LD (ACTDSK),A ; SAVE ACTIVE DISK NO
|
||||
|
||||
; PUT SYSTEM
|
||||
LD HL,PUTMSG
|
||||
CALL CRMSG
|
||||
CALL GETCHAR
|
||||
CP CR
|
||||
JP NZ,REBOOT
|
||||
CALL CRLF
|
||||
CALL WRDSK
|
||||
JP NZ,PUTSYS
|
||||
LD HL,DONE
|
||||
CALL OUTMSG
|
||||
JP PUTSYS ; FOR ANOTHER PUT OPERATION
|
||||
;
|
||||
REBOOT:
|
||||
CALL CRLF
|
||||
JP BOOT
|
||||
;
|
||||
ERRSEL:
|
||||
LD HL,SELMSG
|
||||
JP ERR
|
||||
;
|
||||
ERRSYS:
|
||||
LD HL,SYSMSG
|
||||
JP ERR
|
||||
;
|
||||
ERRIO:
|
||||
LD HL,IOMSG
|
||||
JP ERR
|
||||
;
|
||||
ERRSIG:
|
||||
LD HL,SIGMSG
|
||||
JP ERR
|
||||
;
|
||||
ERR:
|
||||
CALL OUTMSG
|
||||
OR A,0FFH
|
||||
RET
|
||||
;
|
||||
BADDISK:;BAD DISK NAME
|
||||
LD HL,QDISK
|
||||
CALL CRMSG
|
||||
RET
|
||||
;
|
||||
; DATA AREAS
|
||||
; MESSAGES
|
||||
;
|
||||
SIGNON: DB 'ROMWBW SYSGEN VER '
|
||||
DB VERS/10+'0','.',VERS MOD 10+'0'
|
||||
DB 0
|
||||
ASKGET: DB 'SOURCE DRIVE NAME (OR RETURN TO SKIP): ',0
|
||||
GETMSG: DB 'SOURCE ON '
|
||||
GDISK: DS 1 ; FILLED IN AT GET FUNCTION
|
||||
DB ':, THEN TYPE RETURN',0
|
||||
ASKPUT: DB 'DESTINATION DRIVE NAME (OR RETURN TO REBOOT): ',0
|
||||
PUTMSG: DB 'DESTINATION ON '
|
||||
PDISK: DS 1 ; FILLED IN AT PUT FUNCTION
|
||||
DB ':, THEN TYPE RETURN',0
|
||||
ERRMSG: DB 'PERMANENT ERROR, TYPE RETURN TO IGNORE',0
|
||||
DONE: DB 'FUNCTION COMPLETE',0
|
||||
QDISK: DB 'INVALID DRIVE NAME (USE A-P)',0
|
||||
NOFILE: DB 'NO SOURCE FILE ON DISK',0
|
||||
BADFILE:
|
||||
DB 'SOURCE FILE INCOMPLETE',0
|
||||
SELMSG: DB 'DISK SELECTION ERROR',0
|
||||
SYSMSG: DB 'NON-SYSTEM DISK ERROR',0
|
||||
IOMSG: DB 'FATAL DISK I/O ERROR',0
|
||||
SIGMSG: DB 'INVALID SYSTEM IMAGE (BAD SIGNATURE)',0
|
||||
;
|
||||
; VARIABLES
|
||||
;
|
||||
CBFTBL DW 0 ; ADDRESS OF CBIOS FUNCTION TABLE
|
||||
IMGSIZ DB 0 ; IMAGE SIZE (COUNT OF 128 BYTE RECORDS)
|
||||
;
|
||||
RWFUN DB 0 ; ACTIVE READ/WRITE FUNCTION
|
||||
RECCNT DB 0 ; ACTIVE REMAINING RECORDS TO READ/WRITE
|
||||
BUFPTR DW 0 ; ACTIVE POINTER INTO BUFFER
|
||||
;
|
||||
ACTDSK DB 0 ; ACTIVE DISK NO
|
||||
ACTTRK DW 0 ; ACTIVE TRACK
|
||||
ACTSEC DW 0 ; ACTIVE SECTOR
|
||||
ACTSPT DW 0 ; ACTIVE SECTORS PER TRACK
|
||||
ACTFNC DW 0 ; ACTIVE FUNCTION (READ OR WRITE)
|
||||
DS STKSIZE*2
|
||||
STACK:
|
||||
;
|
||||
END
|
||||
406
Source/Apps/Talk.asm
Normal file
406
Source/Apps/Talk.asm
Normal file
@@ -0,0 +1,406 @@
|
||||
;===============================================================================
|
||||
; Talk - Bare minimum terminal interface
|
||||
;
|
||||
; Console talks to designated character device.
|
||||
;
|
||||
;===============================================================================
|
||||
;
|
||||
; Author: Wayne Warthen (wwarthen@gmail.com)
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; Usage:
|
||||
; TALK TTY:|CRT:|BAT:|UC1:
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; Change Log:
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; ToDo:
|
||||
; 1) Handle ZCPR devices somehow
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
;===============================================================================
|
||||
; Definitions
|
||||
;===============================================================================
|
||||
;
|
||||
stksiz .equ $40 ; Working stack size
|
||||
;
|
||||
restart .equ $0000 ; CP/M restart vector
|
||||
bdos .equ $0005 ; BDOS invocation vector
|
||||
iobyte .equ $0003 ; IOBYTE address
|
||||
;
|
||||
const .equ $06 ; CBIOS CONST function dispatch table offset
|
||||
conin .equ $09 ; CBIOS CONIN function dispatch table offset
|
||||
conout .equ $0C ; CBIOS CONOUT function dispatch table offset
|
||||
;
|
||||
;===============================================================================
|
||||
; Code Section
|
||||
;===============================================================================
|
||||
;
|
||||
.org $100
|
||||
;
|
||||
; setup stack (save old value)
|
||||
ld (stksav),sp ; save stack
|
||||
ld sp,stack ; set new stack
|
||||
;
|
||||
; initialization
|
||||
call init ; initialize
|
||||
jr nz,exit ; abort if init fails
|
||||
;
|
||||
ld de,msghel ; hello message
|
||||
call prtstr ; print it
|
||||
;
|
||||
; save active iobyte (console)
|
||||
ld a,(iobyte) ; get active IOBYTE
|
||||
ld (iobcon),a ; save it to iobcon
|
||||
;
|
||||
; parse command line
|
||||
call parse ; parse command line
|
||||
jr nz,exit ; abort if parse fails
|
||||
;
|
||||
; startup message
|
||||
;
|
||||
ld de,msgtlk1 ; message prefix
|
||||
call prtstr ; print it
|
||||
call prtstrz ; print dev name at HL
|
||||
ld de,msgtlk2 ; message suffix
|
||||
call prtstr ; print it
|
||||
;
|
||||
; do the real work
|
||||
call talk ; do the real work
|
||||
;
|
||||
; restore original iobyte
|
||||
ld a,(iobcon) ; load original iobyte
|
||||
ld (iobyte),a
|
||||
;
|
||||
ld de,msgbye ; goodbye message
|
||||
call prtstr ; print it
|
||||
;
|
||||
exit: ; clean up and return to command processor
|
||||
;
|
||||
call crlf ; formatting
|
||||
;
|
||||
ld sp,(stksav) ; restore stack
|
||||
ret ; return to CP/M w/o reset
|
||||
;
|
||||
; Initialization
|
||||
;
|
||||
init:
|
||||
; add check for RomWBW?
|
||||
;
|
||||
; locate cbios function table address
|
||||
ld hl,(restart+1) ; load address of CP/M restart vector
|
||||
ld de,-3 ; adjustment for start of table
|
||||
add hl,de ; HL now has start of table
|
||||
ld (cbftbl),hl ; save it
|
||||
; return success
|
||||
xor a
|
||||
ret
|
||||
;
|
||||
; Parse command line
|
||||
; If success, Z set and HL points to device name string (zero terminated)
|
||||
; ... else NZ set.
|
||||
;
|
||||
parse:
|
||||
;
|
||||
ld hl,$81 ; point to start of command tail (after length byte)
|
||||
call nonblank ; skip blanks
|
||||
jp z,erruse ; no parms
|
||||
;
|
||||
ld c,0 ; current table entry
|
||||
ex de,hl ; point to parm with de
|
||||
ld hl,devtbl ; point to device table with hl
|
||||
;
|
||||
parse0: ; compare loop
|
||||
push bc
|
||||
push de
|
||||
push hl
|
||||
call strcmp ; compare strings
|
||||
pop hl
|
||||
pop de
|
||||
pop bc
|
||||
jr z,parse1 ; if Z, we have a match
|
||||
inc c ; increment table entry
|
||||
ld a,5 ; bump hl by
|
||||
call addhl ; ... table entry size
|
||||
ld a,c ; get the table entry num to A
|
||||
cp 4 ; past end of table?
|
||||
jr nz,parse0 ; loop till done
|
||||
jp errprm ; handle parm error
|
||||
;
|
||||
parse1: ; handle match
|
||||
ld a,c ; device num to A
|
||||
ld (iobcom),a ; save as com device iobyte
|
||||
; return success
|
||||
xor a ; signal error
|
||||
ret ; and return
|
||||
;
|
||||
; Main routine
|
||||
;
|
||||
talk: ; CON: --> UC1:
|
||||
;
|
||||
ld a,(iobcon) ; setup iobyte to read from CON:
|
||||
ld (iobyte),a
|
||||
;
|
||||
call cbios ; check for char pending using cbios
|
||||
.db const ; ... const function
|
||||
or a ; set flags
|
||||
jr z,next ; no char ready
|
||||
call cbios ; read char using cbios
|
||||
.db conin ; ... conin function
|
||||
cp $1A ; check for exit request (ctrl+z)
|
||||
ret z ; if so, bail out
|
||||
;
|
||||
push af ; save the char we read
|
||||
ld a,(iobcom) ; setup iobyte to read from UC1:
|
||||
ld (iobyte),a
|
||||
pop af ; recover the character
|
||||
;
|
||||
ld c,a ; move it to C
|
||||
call cbios ; write char using cbios
|
||||
.db conout ; ... conout function
|
||||
;
|
||||
next: ; UC1: --> CON:
|
||||
;
|
||||
ld a,(iobcom) ; setup iobyte to read from com device
|
||||
ld (iobyte),a
|
||||
;
|
||||
call cbios ; check for char pending using cbios
|
||||
.db const ; ... const function
|
||||
or a ; set flags
|
||||
jr z,talk ; no char ready
|
||||
call cbios ; read char using cbios
|
||||
.db conin ; ... conin function
|
||||
;
|
||||
push af ; save the char we read
|
||||
ld a,(iobcon) ; setup iobyte to read from CON:
|
||||
ld (iobyte),a
|
||||
pop af ; recover the character
|
||||
;
|
||||
ld c,a ; move it to C
|
||||
call cbios ; write char using cbios
|
||||
.db conout ; ... conout function
|
||||
;
|
||||
jr talk ; loop
|
||||
;
|
||||
|
||||
;
|
||||
; Print character in A without destroying any registers
|
||||
;
|
||||
prtchr:
|
||||
push bc ; save registers
|
||||
push de
|
||||
push hl
|
||||
ld e,a ; character to print in E
|
||||
ld c,$02 ; BDOS function to output a character
|
||||
call bdos ; do it
|
||||
pop hl ; restore registers
|
||||
pop de
|
||||
pop bc
|
||||
ret
|
||||
;
|
||||
; Print a '$' terminated string at (DE) without destroying any registers
|
||||
;
|
||||
prtstr:
|
||||
push bc ; save registers
|
||||
push de
|
||||
push hl
|
||||
ld c,$09 ; BDOS function to output a '$' terminated string
|
||||
call bdos ; do it
|
||||
pop hl ; restore registers
|
||||
pop de
|
||||
pop bc
|
||||
ret
|
||||
;
|
||||
; Print a zero terminated string at (HL) without destroying any registers
|
||||
;
|
||||
prtstrz:
|
||||
push hl
|
||||
;
|
||||
prtstrz1:
|
||||
ld a,(hl) ; get next char
|
||||
or a
|
||||
jr z,prtstrz2
|
||||
call prtchr
|
||||
inc hl
|
||||
jr prtstrz1
|
||||
;
|
||||
prtstrz2:
|
||||
pop hl ; restore registers
|
||||
ret
|
||||
;
|
||||
; Print the value in A in hex without destroying any registers
|
||||
;
|
||||
prthex:
|
||||
push af ; save AF
|
||||
push de ; save DE
|
||||
call hexascii ; convert value in A to hex chars in DE
|
||||
ld a,d ; get the high order hex char
|
||||
call prtchr ; print it
|
||||
ld a,e ; get the low order hex char
|
||||
call prtchr ; print it
|
||||
pop de ; restore DE
|
||||
pop af ; restore AF
|
||||
ret ; done
|
||||
;
|
||||
; Convert binary value in A to ascii hex characters in DE
|
||||
;
|
||||
hexascii:
|
||||
ld d,a ; save A in D
|
||||
call hexconv ; convert low nibble of A to hex
|
||||
ld e,a ; save it in E
|
||||
ld a,d ; get original value back
|
||||
rlca ; rotate high order nibble to low bits
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
call hexconv ; convert nibble
|
||||
ld d,a ; save it in D
|
||||
ret ; done
|
||||
;
|
||||
; Convert low nibble of A to ascii hex
|
||||
;
|
||||
hexconv:
|
||||
and $0F ; low nibble only
|
||||
add a,$90
|
||||
daa
|
||||
adc a,$40
|
||||
daa
|
||||
ret
|
||||
;
|
||||
; Start a new line
|
||||
;
|
||||
crlf:
|
||||
ld a,13 ; <CR>
|
||||
call prtchr ; print it
|
||||
ld a,10 ; <LF>
|
||||
jr prtchr ; print it
|
||||
;
|
||||
; Get the next non-blank character from (HL).
|
||||
;
|
||||
nonblank:
|
||||
ld a,(hl) ; load next character
|
||||
or a ; string ends with a null
|
||||
ret z ; if null, return pointing to null
|
||||
cp ' ' ; check for blank
|
||||
ret nz ; return if not blank
|
||||
inc hl ; if blank, increment character pointer
|
||||
jr nonblank ; and loop
|
||||
;
|
||||
; Check character at (DE) for delimiter.
|
||||
;
|
||||
delim: or a
|
||||
ret z
|
||||
cp ' ' ; blank
|
||||
ret z
|
||||
jr c,delim1 ; handle control characters
|
||||
cp '=' ; equal
|
||||
ret z
|
||||
cp '_' ; underscore
|
||||
ret z
|
||||
cp '.' ; period
|
||||
ret z
|
||||
cp ':' ; colon
|
||||
ret z
|
||||
cp $3b ; semicolon
|
||||
ret z
|
||||
cp '<' ; less than
|
||||
ret z
|
||||
cp '>' ; greater than
|
||||
ret
|
||||
delim1:
|
||||
; treat control chars as delimiters
|
||||
xor a ; set Z
|
||||
ret ; return
|
||||
;
|
||||
; Compare $ terminated strings at HL & DE
|
||||
; If equal return with Z set, else NZ
|
||||
;
|
||||
strcmp:
|
||||
;
|
||||
ld a,(de) ; get current source char
|
||||
cp (hl) ; compare to current dest char
|
||||
ret nz ; compare failed, return with NZ
|
||||
or a ; set flags
|
||||
ret z ; end of string, match, return with Z set
|
||||
inc de ; point to next char in source
|
||||
inc hl ; point to next char in dest
|
||||
jr strcmp ; loop till done
|
||||
;
|
||||
; Invoke CBIOS function
|
||||
; The CBIOS function offset must be stored in the byte
|
||||
; following the call instruction. ex:
|
||||
; call cbios
|
||||
; .db $0C ; offset of CONOUT CBIOS function
|
||||
;
|
||||
cbios:
|
||||
ex (sp),hl
|
||||
ld a,(hl) ; get the function offset
|
||||
inc hl ; point past value following call instruction
|
||||
ex (sp),hl ; put address back at top of stack and recover HL
|
||||
ld hl,(cbftbl) ; address of CBIOS function table to HL
|
||||
call addhl ; determine specific function address
|
||||
jp (hl) ; invoke CBIOS
|
||||
;
|
||||
; Add the value in A to HL (HL := HL + A)
|
||||
;
|
||||
addhl:
|
||||
add a,l ; A := A + L
|
||||
ld l,a ; Put result back in L
|
||||
ret nc ; if no carry, we are done
|
||||
inc h ; if carry, increment H
|
||||
ret ; and return
|
||||
;
|
||||
; Errors
|
||||
;
|
||||
erruse: ; command usage error (syntax)
|
||||
ld de,msguse
|
||||
jr err
|
||||
errprm: ; command parameter error (syntax)
|
||||
ld de,msgprm
|
||||
jr err
|
||||
err: ; print error string and return error signal
|
||||
call crlf ; print newline
|
||||
call prtstr ; print error string
|
||||
or $FF ; signal error
|
||||
ret ; done
|
||||
errdos: ; handle BDOS errors
|
||||
push af ; save return code
|
||||
call crlf ; newline
|
||||
ld de,msgdos ; load
|
||||
call prtstr ; and print error string
|
||||
pop af ; recover return code
|
||||
call prthex ; print error code
|
||||
or $FF ; signal error
|
||||
ret ; done
|
||||
;
|
||||
;===============================================================================
|
||||
; Storage Section
|
||||
;===============================================================================
|
||||
;
|
||||
cbftbl .dw 0 ; address of CBIOS function table
|
||||
;
|
||||
iobcon .db 0 ; iobyte value for console
|
||||
iobcom .db 0 ; iobyte value for com device
|
||||
;
|
||||
devtbl: ; device table
|
||||
.db "TTY:",0
|
||||
.db "CRT:",0
|
||||
.db "BAT:",0
|
||||
.db "UC1:",0
|
||||
;
|
||||
stksav .dw 0 ; stack pointer saved at start
|
||||
.fill stksiz,0 ; stack
|
||||
stack .equ $ ; stack top
|
||||
;
|
||||
; Messages
|
||||
;
|
||||
msghel .db 13,10,"Talk v1.0",13,10,"$"
|
||||
msgbye .db 13,10,13,10,"*** Finished talking ***","$"
|
||||
msgtlk1 .db 13,10,"Talking on device $"
|
||||
msgtlk2 .db " (press <Ctrl+Z> to exit)...",13,10,13,10,"$"
|
||||
msguse .db "Usage: TALK TTY:|CRT:|BAT:|UC1:$"
|
||||
msgprm .db "Parameter error$"
|
||||
msgdos .db "DOS error, return code=0x$"
|
||||
;
|
||||
.end
|
||||
4
Source/BIOS/Build.cmd
Normal file
4
Source/BIOS/Build.cmd
Normal file
@@ -0,0 +1,4 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
PowerShell .\Build.ps1 %*
|
||||
157
Source/BIOS/Build.ps1
Normal file
157
Source/BIOS/Build.ps1
Normal file
@@ -0,0 +1,157 @@
|
||||
param([string]$Platform = "", [string]$Config = "", [string]$RomSize = "", [string]$RomName = "")
|
||||
|
||||
$Platform = $Platform.ToUpper()
|
||||
while ($true)
|
||||
{
|
||||
if (($Platform -eq "N8VEM") -or ($Platform -eq "ZETA") -or ($Platform -eq "N8") -or ($Platform -eq "MK4") -or ($Platform -eq "UNA") -or ($Platform -eq "S2I") -or ($Platform -eq "S100")) {break}
|
||||
$Platform = (Read-Host -prompt "Platform [N8VEM|ZETA|N8|MK4|UNA|S2I|S100]").Trim().ToUpper()
|
||||
}
|
||||
|
||||
while ($true)
|
||||
{
|
||||
$ConfigFile = "Config/${Platform}_${Config}.asm"
|
||||
if (Test-Path $ConfigFile) {break}
|
||||
if ($Config -ne "") {Write-Host "${ConfigFile} does not exist!"}
|
||||
|
||||
"Configurations available:"
|
||||
Get-Item "Config/${Platform}_*.asm" | foreach {Write-Host " >", $_.Name.Substring($Platform.Length + 1, $_.Name.Length - $Platform.Length - 5)}
|
||||
$Config = (Read-Host -prompt "Configuration").Trim()
|
||||
}
|
||||
|
||||
while ($true)
|
||||
{
|
||||
if (($RomSize -eq "512") -or ($RomSize -eq "1024")) {break}
|
||||
$RomSize = (Read-Host -prompt "ROM Size [512|1024]").Trim()
|
||||
}
|
||||
|
||||
if (($Platform -eq "N8") -or ($Platform -eq "MK4")) {$CPUType = "180"} else {$CPUType = "80"}
|
||||
|
||||
if ($Platform -eq "UNA") {$BIOS = "ubios"} else {$BIOS = "hbios"}
|
||||
|
||||
if ($RomName -eq "") {$RomName = "${Platform}_${Config}"}
|
||||
while ($RomName -eq "")
|
||||
{
|
||||
$CP = (Read-Host -prompt "ROM Name [${Config}]").Trim()
|
||||
if ($RomName -eq "") {$RomName = $Config}
|
||||
}
|
||||
|
||||
$ErrorAction = 'Stop'
|
||||
|
||||
$TasmPath = '..\..\tools\tasm32'
|
||||
$CpmToolsPath = '..\..\tools\cpmtools'
|
||||
|
||||
$env:TASMTABS = $TasmPath
|
||||
$env:PATH = $TasmPath + ';' + $CpmToolsPath + ';' + $env:PATH
|
||||
|
||||
$OutDir = "../../Output"
|
||||
#$RomFmt = "wbw_rom${RomSize}"
|
||||
if ($Platform -eq "UNA") {$RomFmt = "una_rom${RomSize}"} else {$RomFmt = "wbw_rom${RomSize}"}
|
||||
if ($Platform -eq "UNA") {$BlankFile = "blank${RomSize}KB-UNA.dat"} else {$BlankFile = "blank${RomSize}KB.dat"}
|
||||
$RomDiskFile = "RomDisk.tmp"
|
||||
$RomFile = "${OutDir}/${RomName}.rom"
|
||||
$CPMImgFile = "${OutDir}/${RomName}_CPM.sys"
|
||||
$ZSYSImgFile = "${OutDir}/${RomName}_ZSYS.sys"
|
||||
$CPMLoader = "${OutDir}/${RomName}_CPM.com"
|
||||
$ZSYSLoader = "${OutDir}/${RomName}_ZSYS.com"
|
||||
|
||||
""
|
||||
"Building ${RomName}: ${ROMSize}KB ROM configuration ${Config} for Z${CPUType}..."
|
||||
""
|
||||
|
||||
$TimeStamp = '"' + (Get-Date -Format 'dd-MMM-yyyy') + '"'
|
||||
|
||||
Function Asm($Component, $Opt, $Architecture=$CPUType, $Output="${Component}.bin")
|
||||
{
|
||||
$Cmd = "tasm -t${Architecture} -g3 ${Opt} ${Component}.asm ${Output}"
|
||||
$Cmd | write-host
|
||||
Invoke-Expression $Cmd | write-host
|
||||
if ($LASTEXITCODE -gt 0) {throw "TASM returned exit code $LASTEXITCODE"}
|
||||
}
|
||||
|
||||
Function Concat($InputFileList, $OutputFile)
|
||||
{
|
||||
Set-Content $OutputFile -Value $null
|
||||
foreach ($InputFile in $InputFileList)
|
||||
{
|
||||
Add-Content $OutputFile -Value ([System.IO.File]::ReadAllBytes($InputFile)) -Encoding byte
|
||||
}
|
||||
}
|
||||
|
||||
# Generate the build settings include file
|
||||
|
||||
@"
|
||||
; RomWBW Configured for ${Platform} ${Config}, $(Get-Date -Format "s")
|
||||
;
|
||||
#DEFINE TIMESTAMP ${TimeStamp}
|
||||
;
|
||||
ROMSIZE .EQU ${ROMSize} ; SIZE OF ROM IN KB
|
||||
PLATFORM .EQU PLT_${Platform} ; HARDWARE PLATFORM
|
||||
;
|
||||
; INCLUDE PLATFORM SPECIFIC DEVICE DEFINITIONS
|
||||
;
|
||||
#INCLUDE "std-n8vem.inc"
|
||||
;
|
||||
#INCLUDE "${ConfigFile}"
|
||||
;
|
||||
"@ | Out-File "build.inc" -Encoding ASCII
|
||||
|
||||
Copy-Item '..\cpm22\os2ccp.bin' 'ccp.bin'
|
||||
Copy-Item '..\cpm22\os3bdos.bin' 'bdos.bin'
|
||||
|
||||
Copy-Item '..\zcpr-dj\zcpr.bin' 'zcpr.bin'
|
||||
Copy-Item '..\zsdos\zsdos.bin' 'zsdos.bin'
|
||||
|
||||
Asm 'syscfg'
|
||||
Asm 'cbios' "-dBLD_SYS=SYS_CPM" -Output "cbios.bin"
|
||||
Asm 'cbios' "-dBLD_SYS=SYS_ZSYS" -Output "zbios.bin"
|
||||
Asm 'dbgmon'
|
||||
Asm 'prefix'
|
||||
Asm 'bootrom'
|
||||
Asm 'bootapp'
|
||||
Asm 'loader'
|
||||
Asm 'pgzero'
|
||||
Asm $BIOS
|
||||
Asm 'hbfill'
|
||||
Asm 'romfill'
|
||||
|
||||
# Generate result files using components above
|
||||
|
||||
"Building ${RomName} output files..."
|
||||
|
||||
Concat 'ccp.bin','bdos.bin','cbios.bin' 'cpm.bin'
|
||||
Concat 'zcpr.bin','zsdos.bin','zbios.bin' 'zsys.bin'
|
||||
|
||||
Concat 'prefix.bin','cpm.bin' $CPMImgFile
|
||||
Concat 'prefix.bin','zsys.bin' $ZSYSImgFile
|
||||
|
||||
Concat 'pgzero.bin','bootrom.bin','syscfg.bin','loader.bin','zsys.bin','hbfill.bin','dbgmon.bin','cpm.bin','hbfill.bin' 'rom1.bin'
|
||||
Concat 'pgzero.bin','bootrom.bin','syscfg.bin','loader.bin',"${BIOS}.bin" 'rom2.bin'
|
||||
|
||||
Concat 'bootapp.bin','syscfg.bin','loader.bin',"${BIOS}.bin",'dbgmon.bin','cpm.bin' $CPMLoader
|
||||
Concat 'bootapp.bin','syscfg.bin','loader.bin',"${BIOS}.bin",'dbgmon.bin','zsys.bin' $ZSYSLoader
|
||||
|
||||
# Create the RomDisk image
|
||||
|
||||
"Building ${RomSize}KB ${RomName} ROM disk data file..."
|
||||
|
||||
Copy-Item $BlankFile $RomDiskFile
|
||||
cpmcp -f $RomFmt $RomDiskFile ../RomDsk/ROM_${RomSize}KB/*.* 0:
|
||||
cpmcp -f $RomFmt $RomDiskFile ../RomDsk/${Platform}_${Config}/*.* 0:
|
||||
cpmcp -f $RomFmt $RomDiskFile ../Apps/*.com 0:
|
||||
cpmcp -f $RomFmt $RomDiskFile ${OutDir}/${RomName}_CPM.sys 0:CPM.sys
|
||||
cpmcp -f $RomFmt $RomDiskFile ${OutDir}/${RomName}_ZSYS.sys 0:ZSYS.sys
|
||||
|
||||
if ($Platform -eq "UNA")
|
||||
{
|
||||
Copy-Item 'rom1.bin' ${OutDir}\UNA_WBW_SYS.bin
|
||||
Copy-Item $RomDiskFile ${OutDir}\UNA_WBW_ROM${ROMSize}.bin
|
||||
|
||||
Concat 'UNA\UNA-BIOS.BIN','rom1.bin','UNA\FSFAT.BIN',$RomDiskFile $RomFile
|
||||
}
|
||||
else
|
||||
{
|
||||
Concat 'rom1.bin','rom2.bin',$RomDiskFile $RomFile
|
||||
}
|
||||
|
||||
# Cleanup
|
||||
Remove-Item $RomDiskFile
|
||||
10
Source/BIOS/Clean.cmd
Normal file
10
Source/BIOS/Clean.cmd
Normal file
@@ -0,0 +1,10 @@
|
||||
@echo off
|
||||
if exist *.bin del *.bin
|
||||
if exist *.com del *.com
|
||||
if exist *.img del *.img
|
||||
if exist *.rom del *.rom
|
||||
if exist *.lst del *.lst
|
||||
if exist *.exp del *.exp
|
||||
if exist *.tmp del *.tmp
|
||||
if exist *.mrk del *.mrk
|
||||
if exist build.inc del build.inc
|
||||
@@ -99,7 +99,7 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 21 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
@@ -118,14 +118,3 @@ Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 3 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_CNTLB0 .EQU 21H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_CNTLB1 .EQU 21H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,0,0) ; E: = PPIDE0:0 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,1,0) ; F: = PPIDE0:1 = SD UNIT 0, SLICE 0
|
||||
@@ -99,7 +99,7 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
@@ -118,14 +118,3 @@ Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_CNTLB0 .EQU 21H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_CNTLB1 .EQU 21H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_PRPSD,0,0,0) ; C: = PRPSD0:0 = PRPSD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PRPSD,0,1,0) ; D: = PRPSD0:1 = PRPSD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PRPSD,0,2,0) ; E: = PRPSD0:2 = PRPSD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PRPSD,0,3,0) ; F: = PRPSD0:3 = PRPSD UNIT 0, SLICE 0
|
||||
@@ -99,7 +99,7 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 21 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
@@ -118,14 +118,3 @@ Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_CNTLB0 .EQU 21H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_CNTLB1 .EQU 21H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_IDE,0,0,0) ; C: = IDE0:0 = IDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_IDE,0,1,0) ; D: = IDE0:0 = IDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,0,0) ; E: = SD0:0 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,1,0) ; F: = SD0:1 = SD UNIT 0, SLICE 0
|
||||
@@ -99,7 +99,7 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
@@ -108,16 +108,3 @@ Z180_MEMWAIT .EQU 0 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 3 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_CNTLB0 .EQU 20H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_CNTLB1 .EQU 20H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,0,0) ; E: = SD0:0 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,1,0) ; F: = SD0:1 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,2,0) ; G: = SD0:2 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,3,0) ; H: = SD0:3 = SD UNIT 0, SLICE 0
|
||||
@@ -99,7 +99,7 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
@@ -108,16 +108,3 @@ Z180_MEMWAIT .EQU 0 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 3 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_CNTLB0 .EQU 20H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_CNTLB1 .EQU 20H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,0,0) ; E: = SD0:0 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,1,0) ; F: = SD0:1 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,2,0) ; G: = SD0:2 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,3,0) ; H: = SD0:3 = SD UNIT 0, SLICE 0
|
||||
@@ -107,13 +107,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
@@ -101,15 +101,8 @@ TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
@@ -101,21 +101,8 @@ TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_IDE,0,0,0) ; E: = IDE0:0 = IDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_IDE,0,1,0) ; F: = IDE0:1 = IDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_IDE,0,2,0) ; G: = IDE0:2 = IDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_IDE,0,3,0) ; H: = IDE0:3 = IDE UNIT 0, SLICE 0
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
@@ -103,19 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_IDE,0,0,0) ; E: = IDE0:0 = IDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_IDE,0,1,0) ; F: = IDE0:1 = IDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_IDE,0,2,0) ; G: = IDE0:2 = IDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_IDE,0,3,0) ; H: = IDE0:3 = IDE UNIT 0, SLICE 0
|
||||
@@ -103,19 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,0,0) ; E: = PPIDE0:0 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,1,0) ; F: = PPIDE0:1 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,2,0) ; G: = PPIDE0:2 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,3,0) ; H: = PPIDE0:3 = PPIDE UNIT 0, SLICE 0
|
||||
@@ -103,19 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,0,0) ; E: = PPIDE0:0 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,1,0) ; F: = PPIDE0:1 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,2,0) ; G: = PPIDE0:2 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,3,0) ; H: = PPIDE0:3 = PPIDE UNIT 0, SLICE 0
|
||||
@@ -103,19 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,0,0) ; E: = SD0:0 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,1,0) ; F: = SD0:1 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,2,0) ; G: = SD0:2 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,3,0) ; H: = SD0:3 = SD UNIT 0, SLICE 0
|
||||
@@ -107,19 +107,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,0,0) ; E: = PPIDE0:0 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,1,0) ; F: = PPIDE0:1 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,2,0) ; G: = PPIDE0:2 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,3,0) ; H: = PPIDE0:3 = PPIDE UNIT 0, SLICE 0
|
||||
@@ -103,19 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,0,0) ; E: = PPIDE0:0 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,1,0) ; F: = PPIDE0:1 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,2,0) ; G: = PPIDE0:2 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,3,0) ; H: = PPIDE0:3 = PPIDE UNIT 0, SLICE 0
|
||||
@@ -103,19 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,0,0) ; E: = SD0:0 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,1,0) ; F: = SD0:1 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,2,0) ; G: = SD0:2 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,3,0) ; H: = SD0:3 = SD UNIT 0, SLICE 0
|
||||
@@ -103,17 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_PRPSD,0,0,0) ; C: = PRPSD0:0 = PRPSD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PRPSD,0,1,0) ; D: = PRPSD0:1 = PRPSD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PRPSD,0,2,0) ; E: = PRPSD0:2 = PRPSD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PRPSD,0,3,0) ; F: = PRPSD0:3 = PRPSD UNIT 0, SLICE 0
|
||||
@@ -103,15 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_RF,0,0,0) ; C: = RF0
|
||||
#DEFCONT DRVENT(DIODEV_RF,1,0,0) ; D: = RF1
|
||||
@@ -103,21 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_HDSK,0,0,0) ; C: = HDSK0:0
|
||||
#DEFCONT DRVENT(DIODEV_HDSK,0,1,0) ; D: = HDSK0:1
|
||||
#DEFCONT DRVENT(DIODEV_HDSK,0,2,0) ; E: = HDSK0:2
|
||||
#DEFCONT DRVENT(DIODEV_HDSK,0,3,0) ; F: = HDSK0:3
|
||||
#DEFCONT DRVENT(DIODEV_HDSK,1,0,0) ; G: = HDSK1:0
|
||||
#DEFCONT DRVENT(DIODEV_HDSK,1,1,0) ; H: = HDSK1:1
|
||||
#DEFCONT DRVENT(DIODEV_HDSK,1,2,0) ; I: = HDSK1:2
|
||||
#DEFCONT DRVENT(DIODEV_HDSK,1,3,0) ; J: = HDSK1:3
|
||||
@@ -103,13 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
@@ -103,19 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,0,0) ; E: = PPIDE0:0 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,1,0) ; F: = PPIDE0:1 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,2,0) ; G: = PPIDE0:2 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,3,0) ; H: = PPIDE0:3 = PPIDE UNIT 0, SLICE 0
|
||||
@@ -17,6 +17,6 @@ DSKTRACE .EQU FALSE ; ENABLE TRACING OF CBIOS DISK FUNCTION CALLS
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 21 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
@@ -103,19 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,0,0) ; E: = SD0:0 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,1,0) ; F: = SD0:1 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,2,0) ; G: = SD0:2 = SD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_SD,0,3,0) ; H: = SD0:3 = SD UNIT 0, SLICE 0
|
||||
@@ -103,19 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_PPPSD,0,0,0) ; E: = PPPSD0:0 = PPPSD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPPSD,0,1,0) ; F: = PPPSD0:1 = PPPSD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPPSD,0,2,0) ; G: = PPPSD0:2 = PPPSD UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPPSD,0,3,0) ; H: = PPPSD0:3 = PPPSD UNIT 0, SLICE 0
|
||||
@@ -103,19 +103,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
|
||||
;
|
||||
; CPM DRIVE MAPPING TABLE, DRIVE LETTERS ARE ASSIGNED SEQUENTIALLY
|
||||
; DRVENT(DEVICE,UNIT,SLICE,DPH)
|
||||
;
|
||||
#DEFINE DRVLST \
|
||||
#DEFCONT DRVENT(DIODEV_MD,1,0,0) ; A: = MD1 = RAM DISK
|
||||
#DEFCONT DRVENT(DIODEV_MD,0,0,0) ; B: = MD0 = ROM DISK
|
||||
#DEFCONT DRVENT(DIODEV_FD,0,0,0) ; C: = FD0 = FLOPPY DISK UNIT 0
|
||||
#DEFCONT DRVENT(DIODEV_FD,1,0,0) ; D: = FD1 = FLOPPY DISK UNIT 1
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,0,0) ; E: = PPIDE0:0 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,1,0) ; F: = PPIDE0:1 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,2,0) ; G: = PPIDE0:2 = PPIDE UNIT 0, SLICE 0
|
||||
#DEFCONT DRVENT(DIODEV_PPIDE,0,3,0) ; H: = PPIDE0:3 = PPIDE UNIT 0, SLICE 0
|
||||
@@ -3,9 +3,8 @@
|
||||
Set-Content -Value ([byte[]](0xE5) * (512KB - 64KB)) -Encoding byte -Path 'Blank512KB.dat'
|
||||
Set-Content -Value ([byte[]](0xE5) * (1MB - 64KB)) -Encoding byte -Path 'Blank1024KB.dat'
|
||||
|
||||
Set-Content -Value ([byte[]](0xE5) * (512KB - 160KB)) -Encoding byte -Path 'Blank512KB-UNALOAD.dat'
|
||||
Set-Content -Value ([byte[]](0xE5) * (1MB - 160KB)) -Encoding byte -Path 'Blank1024KB-UNALOAD.dat'
|
||||
|
||||
Set-Content -Value ([byte[]](0xE5) * (512KB - 128KB)) -Encoding byte -Path 'Blank512KB-UNA.dat'
|
||||
Set-Content -Value ([byte[]](0xE5) * (1MB - 128KB)) -Encoding byte -Path 'Blank1024KB-UNA.dat'
|
||||
|
||||
Set-Content -Value ([byte[]](0xE5) * (512KB - 160KB)) -Encoding byte -Path 'Blank512KB-UNALOAD.dat'
|
||||
Set-Content -Value ([byte[]](0xE5) * (1MB - 160KB)) -Encoding byte -Path 'Blank1024KB-UNALOAD.dat'
|
||||
BIN
Source/BIOS/UNA/FSFAT.BIN
Normal file
BIN
Source/BIOS/UNA/FSFAT.BIN
Normal file
Binary file not shown.
BIN
Source/BIOS/UNA/UNA-BIOS.BIN
Normal file
BIN
Source/BIOS/UNA/UNA-BIOS.BIN
Normal file
Binary file not shown.
@@ -91,7 +91,8 @@
|
||||
;
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
; IF RUNNING UNDER UNA, WE ARE DONE, PROCEED TO LOADER
|
||||
JP $8400 ; JUMP TO LOADER
|
||||
LD DE,$0100 ; *** FIX *** ASSUME WE WANT DEFAULT DRIVE TO BE ROM
|
||||
JP CPM_ENT ; JUMP TO OS
|
||||
#ELSE
|
||||
; NON-UNA REQUIRES PHASE 2
|
||||
JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY
|
||||
@@ -158,7 +159,8 @@ LOOP:
|
||||
CALL PGSEL ; SELECT IT
|
||||
CALL HBX_LOC ; CALL HBIOS PROXY INITIALIZATION
|
||||
;
|
||||
JP $8400 ; JUMP TO LOADER
|
||||
LD DE,$0000 ; ASSUME WE WANT DEFAULT DRIVE TO BE ROM
|
||||
JP CPM_ENT ; JUMP TO OS
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
; NOTE THAT MEMORY MANAGER CODE IS IN UPPER MEMORY!
|
||||
@@ -67,13 +67,11 @@
|
||||
LD HL,STR_BOOT ; POINT TO MESSAGE
|
||||
CALL XIO_OUTS ; SAY HELLO
|
||||
;
|
||||
; COPY ENTIRE CONTENTS OF ROM BANK TO HI RAM
|
||||
; THIS INCLUDES OURSELVES (FOR PHASE 2) AND THE LOADER CODE
|
||||
; CAREFUL, WORKING STACK AREA IS WIPED OUT!!!
|
||||
; COPY OURSELVES AND LOADER TO HI RAM FOR PHASE 2
|
||||
;
|
||||
LD HL,0 ; COPY FROM START OF ROM IMAGE
|
||||
LD DE,$8000 ; TO HIMEM $8000
|
||||
LD BC,$8000 - $400 ; ALL BUT TOP 1K TO AVOID OVERLAYING PROXY
|
||||
LD BC,$1000 ; COPY 4K
|
||||
LDIR
|
||||
;
|
||||
CALL XIO_DOT ; MARK PROGRESS
|
||||
@@ -145,7 +143,7 @@ LOOP:
|
||||
CP $80 ; HIGH BYTE WILL BE $80 WHEN WE ARE DONE
|
||||
JP NZ,LOOP ; IF NOT DONE, LOOP TO DO NEXT 4K CHUNK
|
||||
;
|
||||
LD A,BID_BOOT ; ROM PAGE WITH HBIOS IMAGE
|
||||
LD A,BID_BOOT ; ROM PAGE WITH BOOT IMAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
CALL XIO_DOT ; MARK PROGRESS
|
||||
;
|
||||
@@ -67,9 +67,10 @@ STPSIZ .EQU $ - STPIMG
|
||||
; RomWBW CBIOS. A pointer to the start of this section is stored with
|
||||
; with the ZPX data in page zero at $44 (see above).
|
||||
;
|
||||
CBX: .DW DEVMAP ; DEVICE MAP ADDRESS
|
||||
.DW DRVMAP ; DRIVE MAP ADDRESS
|
||||
.DW DPBMAP ; DPB MAP ADDRESS
|
||||
CBX:
|
||||
DEVMAPADR .DW DEVMAP ; DEVICE MAP ADDRESS
|
||||
DRVMAPADR .DW 0 ; DRIVE MAP ADDRESS (FILLED IN LATER)
|
||||
DPBMAPADR .DW DPBMAP ; DPB MAP ADDRESS
|
||||
;
|
||||
CBXSIZ .EQU $ - CBX
|
||||
.ECHO "CBIOS extension info occupies "
|
||||
@@ -171,40 +172,18 @@ DEVCNT .EQU ($ - DEVMAP)
|
||||
.ECHO " Input/Output devices defined.\n"
|
||||
;
|
||||
;==================================================================================================
|
||||
; DISK MAPPING TABLE
|
||||
; DRIVE MAPPING TABLE
|
||||
;==================================================================================================
|
||||
;
|
||||
; This table maps logical CP/M drive letters to the physical device,
|
||||
; unit, and slice within the HBIOS. Additionally, each entry is mapped
|
||||
; to a dedicated CP/M DPH structure for the drive.
|
||||
; Disk mapping is done using a drive map table (DRVMAP) which is built
|
||||
; dynamically at cold boot. See the DRV_INIT routine. This table is
|
||||
; made up of entries as documented below. The table is prefixed with one
|
||||
; byte indicating the number of entries. The index of the entry indicates
|
||||
; the drive letter, so the first entry is A:, the second entry is B:, etc.
|
||||
;
|
||||
; The position of the entry in the table determines the CP/M drive being
|
||||
; mapped. First entry is A:, second entry is B:, etc.
|
||||
;
|
||||
; Note that this table is intended to be modified dynamically to allow
|
||||
; user remapping of drives. Warning: BDOS drives must be reset and
|
||||
; warm start performed if this table is changed dynamically. The application
|
||||
; making changes to this table is responsible for ensuring the changes
|
||||
; are valid and appropriate or very bad things will happen.
|
||||
;
|
||||
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
DRVMAP .EQU 0 ; MANAGED DYNAMICALLY FOR UNA
|
||||
#ELSE
|
||||
;
|
||||
#DEFINE DRVENT(DEV,UNIT,SLICE,DPHADR) \
|
||||
#DEFCONT .DB DEV | UNIT \
|
||||
#DEFCONT .DB SLICE \
|
||||
#DEFCONT .DW DPHADR
|
||||
;
|
||||
.DB DRVCNT
|
||||
DRVMAP: DRVLST
|
||||
;
|
||||
DRVCNT .EQU ($ - DRVMAP) / 4
|
||||
.ECHO DRVCNT
|
||||
.ECHO " drive letters defined.\n"
|
||||
;
|
||||
#ENDIF
|
||||
; BYTE: DEVICE/UNIT (OR JUST UNIT FOR UNA)
|
||||
; BYTE: SLICE
|
||||
; WORD: ADDRESS OF DPH FOR THE DRIVE
|
||||
;
|
||||
;==================================================================================================
|
||||
; DPB MAPPING TABLE
|
||||
@@ -340,7 +319,7 @@ GOCPM:
|
||||
;
|
||||
; ENSURE VALID DISK AND JUMP TO CCP
|
||||
LD A,(CDISK) ; GET CURRENT USER/DISK
|
||||
AND $F ; ISOLATE DISK PART
|
||||
AND $0F ; ISOLATE DISK PART
|
||||
LD C,A ; SETUP C WITH CURRENT USER/DISK, ASSUME IT IS OK
|
||||
CALL DSK_STATUS ; CHECK DISK STATUS
|
||||
JR Z,CURDSK ; ZERO MEANS OK
|
||||
@@ -381,7 +360,7 @@ GOMON:
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
CONST:
|
||||
; CONSOLE STATUS, RETURN 0FFH IF CHARACTER READY, 00H IF NOT
|
||||
; CONSOLE STATUS, RETURN $FF IF CHARACTER READY, $00 IF NOT
|
||||
;
|
||||
LD B,BF_CIOIST ; B = FUNCTION
|
||||
LD HL,CIOST ; HL = ADDRESS OF COMPLETION ROUTINE
|
||||
@@ -525,7 +504,7 @@ CIO_DISP:
|
||||
PUSH HL ; PUT COMPLETION ROUTINE ON STACK
|
||||
|
||||
; LOOKUP IOBYTE MAPPED DEVICE CODE
|
||||
AND 0FH ; ISOLATE INDEX INTO DEVICE MAP
|
||||
AND $0F ; ISOLATE INDEX INTO DEVICE MAP
|
||||
|
||||
LD HL,DEVMAP ; HL = ADDRESS OF DEVICE MAP
|
||||
CALL ADDHLA ; ADD OFFSET
|
||||
@@ -545,7 +524,7 @@ CIO_DISP:
|
||||
|
||||
CIO_DISP1:
|
||||
; HANDLE SPECIAL DEVICES
|
||||
AND 0F0H ; ISOLATE DEVICE
|
||||
AND $F0 ; ISOLATE DEVICE
|
||||
CP CIODEV_BAT ; BAT: ?
|
||||
JR Z,CIO_BAT ; YES, GO TO BAT DEVICE HANDLER
|
||||
CP CIODEV_NUL ; NUL: ?
|
||||
@@ -1068,11 +1047,7 @@ BLK_SETUP:
|
||||
; ON RETURN, D=DEVICE/UNIT, E=SLICE, HL=DPH ADDRESS
|
||||
;
|
||||
DSK_GETINF:
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
LD HL,(UNA_DRVMAP) ; HL := START OF UNA DRIVE MAP
|
||||
#ELSE
|
||||
LD HL,DRVMAP ; HL := START OF DRIVE MAP
|
||||
#ENDIF
|
||||
LD HL,(DRVMAPADR) ; HL := START OF UNA DRIVE MAP
|
||||
DEC HL ; POINT TO DRIVE COUNT
|
||||
LD A,C ; A := CPM DRIVE
|
||||
CP (HL) ; COMPARE TO NUMBER OF DRIVES CONFIGURED
|
||||
@@ -1415,7 +1390,7 @@ DSKOP: .DB 0 ; DISK OPERATION (DOP_READ/DOP_WRITE)
|
||||
WRTYPE: .DB 0 ; WRITE TYPE (0=NORMAL, 1=DIR (FORCE), 2=FIRST RECORD OF BLOCK)
|
||||
DMAADR: .DW 0 ; DIRECT MEMORY ADDRESS
|
||||
HSTWRT: .DB 0 ; TRUE = BUFFER IS DIRTY
|
||||
BUFADR: .DW $8000-$400 ; ADDRESS OF PHYSICAL SECTOR BUFFER (DEFAULT MATCHES HBIOS)
|
||||
BUFADR: .DW $8000-$0400 ; ADDRESS OF PHYSICAL SECTOR BUFFER (DEFAULT MATCHES HBIOS)
|
||||
;
|
||||
; DISK I/O REQUEST PENDING
|
||||
;
|
||||
@@ -1464,10 +1439,6 @@ UNASIZ .EQU $ - UNA
|
||||
UNACNT: .DB 0 ; COUNT DOWN UNALLOCATED RECORDS IN BLOCK
|
||||
UNASPT: .DW 0 ; SECTORS PER TRACK
|
||||
;
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
UNA_DRVMAP .DW 0
|
||||
#ENDIF
|
||||
;
|
||||
;==================================================================================================
|
||||
; DISK CONTROL STRUCTURES (DPB, DPH)
|
||||
;==================================================================================================
|
||||
@@ -1713,6 +1684,9 @@ BUFPOOL .EQU $ ; START OF BUFFER POOL
|
||||
.FILL 16 * 16,0 ; RESERVED FOR DPH TABLE
|
||||
;
|
||||
INIT:
|
||||
; SAVE INCOMING BOOT DEVICE/UNIT & LU
|
||||
LD (BOOTDL),DE ; D -> BOOTDEV, E -> BOOTLU
|
||||
|
||||
; THIS INIT CODE WILL BE OVERLAID, SO WE ARE GOING
|
||||
; TO MODIFY THE BOOT ENTRY POINT TO CAUSE A PANIC
|
||||
; TO EASILY IDENTIFY IF SOMETHING TRIES TO INVOKE
|
||||
@@ -1749,10 +1723,9 @@ INIT1:
|
||||
LD (IOBYTE),A ; SET THE ACTIVE IOBYTE
|
||||
#ENDIF
|
||||
|
||||
; DEFAULT DRIVE
|
||||
; INIT DEFAULT DRIVE TO A: FOR NOW
|
||||
XOR A ; ZERO
|
||||
LD (DEFDRIVE),A ; STORE IT
|
||||
LD (CDISK),A ; SETUP CDISK
|
||||
|
||||
; STARTUP MESSAGE
|
||||
CALL NEWLINE ; FORMATTING
|
||||
@@ -1767,12 +1740,12 @@ INIT1:
|
||||
RST 08 ; DO IT
|
||||
CALL NZ,PANIC ; BIG PROBLEM
|
||||
LD (CCPBUF),HL ; SAVE THE ADDRESS (IN BIOS MEM)
|
||||
|
||||
|
||||
LD BC,$01FB ; UNA FUNC = SET BANK
|
||||
LD DE,$800D ; UBIOS_PAGE (SEE PAGES.INC)
|
||||
RST 08 ; DO IT
|
||||
PUSH DE ; SAVE PREVIOUS BANK
|
||||
|
||||
|
||||
LD HL,CPM_LOC ; ADDRESS IN HI MEM OF CCP
|
||||
LD DE,(CCPBUF) ; ADDRESS OF CCP BUF IN BIOS MEM
|
||||
LD BC,CCPSIZ ; SIZE OF CCP
|
||||
@@ -1787,17 +1760,15 @@ INIT1:
|
||||
LD B,BID_HB ; C = DEST BANK = HB BANK
|
||||
CALL HB_XCOPY ; SET BANKS FOR INTERBANK COPY
|
||||
LD HL,CPM_LOC ; COPY FROM CCP LOCATION IN USR BANK
|
||||
LD DE,$800 ; TO FIXED LOCATION IN HB BANK
|
||||
LD DE,$0800 ; TO FIXED LOCATION IN HB BANK
|
||||
LD BC,CCPSIZ ; COPY CONTENTS OF COMMAND PROCESSOR
|
||||
CALL HB_COPY ; DO IT
|
||||
#ENDIF
|
||||
|
||||
; SYSTEM INITIALIZATION
|
||||
; DISK SYSTEM INITIALIZATION
|
||||
CALL BLKRES ; RESET DISK (DE)BLOCKING ALGORITHM
|
||||
CALL MD_INIT ; INITIALIZE MEMORY DISK DRIVER (RAM/ROM)
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
CALL UNA_INIT
|
||||
#ENDIF
|
||||
CALL DRV_INIT ; INITIALIZE DRIVE MAP
|
||||
CALL DPH_INIT ; INITIALIZE DPH TABLE AND BUFFERS
|
||||
CALL NEWLINE ; FORMATTING
|
||||
;
|
||||
@@ -1811,6 +1782,9 @@ INIT1:
|
||||
CALL PRTDEC ; PRINT IT
|
||||
LD DE,STR_MEMFREE ; ADD DESCRIPTION
|
||||
CALL WRITESTR ; AND PRINT IT
|
||||
;
|
||||
LD A,(DEFDRIVE) ; GET DEFAULT DRIVE
|
||||
LD (CDISK),A ; ... AND SETUP CDISK
|
||||
;
|
||||
; SETUP AUTOSTART COMMAND
|
||||
LD HL,CMD ; ADDRESS OF STARTUP COMMAND
|
||||
@@ -1833,8 +1807,8 @@ STR_MEMFREE .DB " Disk Buffer Bytes Free\r\n$"
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
MD_INIT:
|
||||
;
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
|
||||
;
|
||||
; INITIALIZE RAM DISK BY FILLING DIRECTORY WITH 'E5' BYTES
|
||||
; FILL FIRST 8K OF RAM DISK TRACK 1 WITH 'E5'
|
||||
@@ -1853,7 +1827,7 @@ MD_INIT:
|
||||
LD B,32
|
||||
CLRRAM0:
|
||||
LD A,(HL)
|
||||
CP 0E5H
|
||||
CP $E5
|
||||
JR Z,CLRRAM1 ; E5 IS VALID
|
||||
CP 16
|
||||
JR C,CLRRAM1 ; 0-15 IS ALSO VALID
|
||||
@@ -1914,7 +1888,7 @@ CLRRAM3:
|
||||
LD B,32
|
||||
CLRRAM0:
|
||||
LD A,(HL)
|
||||
CP 0E5H
|
||||
CP $E5
|
||||
JR Z,CLRRAM1 ; E5 IS VALID
|
||||
CP 16
|
||||
JR C,CLRRAM1 ; 0-15 IS ALSO VALID
|
||||
@@ -1940,97 +1914,140 @@ CLRRAM3:
|
||||
LD A,BID_USR ; USR BANK (TPA)
|
||||
CALL HB_SETBNK ; SELECT IT
|
||||
#ENDIF
|
||||
|
||||
;
|
||||
#ENDIF
|
||||
|
||||
;
|
||||
RET
|
||||
;
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
;
|
||||
UNA_INIT:
|
||||
DRV_INIT:
|
||||
;
|
||||
; PERFORM UNA BIOS SPECIFIC INITIALIZATION
|
||||
; UPDATE DRVMAP BASED ON AVAILABLE UNA UNITS
|
||||
;
|
||||
; SETUP THE DRVMAP STRUCTURE
|
||||
LD HL,(BUFTOP) ; GET CURRENT BUFFER TOP
|
||||
; LD (UNA_DRVCNT),HL ; SAVE POINTER TO DRIVE COUNT
|
||||
INC HL ; SKIP 1 BYTE FOR ENTRY COUNT PREFIX
|
||||
LD (UNA_DRVMAP),HL ; SAVE AS UNA DRIVE MAP
|
||||
LD (DRVMAPADR),HL ; SAVE AS DRIVE MAP ADDRESS
|
||||
LD (BUFTOP),HL ; ... AND AS NEW BUFTOP
|
||||
;
|
||||
; PUSH HL ; *DEBUG*
|
||||
; POP BC ; *DEBUG*
|
||||
; CALL PRTHEXWORD ; *DEBUG*
|
||||
;
|
||||
EX DE,HL ; DE := UNA DRIVE MAP PTR
|
||||
LD HL,CBX ; HL := CBX
|
||||
INC HL ; BUMP TO
|
||||
INC HL ; ... DRVMAP ENTRY OF CBX
|
||||
LD (HL),E ; RECORD ADDRESS
|
||||
INC HL ; ... OF DRVMAP
|
||||
LD (HL),D ; ... IN CBX
|
||||
;
|
||||
LD B,0 ; START WITH UNIT 0
|
||||
;
|
||||
UNA_INIT1: ; LOOP THRU ALL UNITS AVAILABLE
|
||||
DRV_INIT1: ; LOOP THRU ALL UNITS AVAILABLE
|
||||
LD C,$48 ; UNA FUNC: GET DISK TYPE
|
||||
LD L,0 ; PRESET UNIT COUNT TO ZERO
|
||||
CALL $FFFD ; CALL UNA, B IS ASSUMED TO BE UNTOUCHED!!!
|
||||
LD A,L ; UNIT COUNT TO A
|
||||
OR A ; PAST END?
|
||||
JR Z,UNA_INIT2 ; WE ARE DONE
|
||||
JR Z,DRV_INIT2 ; WE ARE DONE
|
||||
PUSH BC ; SAVE UNIT
|
||||
CALL UNA_INIT3 ; PROCESS THE UNIT
|
||||
CALL DRV_INIT3 ; PROCESS THE UNIT
|
||||
POP BC ; RESTORE UNIT
|
||||
INC B ; NEXT UNIT
|
||||
JR UNA_INIT1 ; LOOP
|
||||
JR DRV_INIT1 ; LOOP
|
||||
;
|
||||
UNA_INIT2: ; FINALIZE THE DRIVE MAP
|
||||
DRV_INIT2: ; FINALIZE THE DRIVE MAP
|
||||
RET ; DONE
|
||||
;
|
||||
UNA_INIT3: ; PROCESS CURRENT UNIT (SEE UNA PROTOIDS.INC)
|
||||
DRV_INIT3: ; PROCESS CURRENT UNIT (SEE UNA PROTOIDS.INC)
|
||||
LD A,D ; MOVE DISK TYPE TO A
|
||||
; CALL PC_LBKT ; *DEBUG*
|
||||
; CALL PRTHEXBYTE ; *DEBUG*
|
||||
; CALL PC_RBKT ; *DEBUG*
|
||||
;
|
||||
CALL UNA_INIT4 ; MAKE A DRIVE MAP ENTRY
|
||||
CALL DRV_INIT4 ; MAKE A DRIVE MAP ENTRY
|
||||
LD A,D ; LOAD DRIVE TYPE
|
||||
CP $40 ; RAM/ROM?
|
||||
RET Z ; DONE IF SO
|
||||
; CP $?? ; FLOPPY DRIVE?
|
||||
; RET Z ; DONE IF SO
|
||||
CALL UNA_INIT4 ; ANOTHER ENTRY FOR HARD DISK
|
||||
CALL DRV_INIT4 ; ANOTHER ENTRY FOR HARD DISK
|
||||
LD A,1 ; BUT WITH SLICE VALUE OF 1
|
||||
INC HL ; BUMP TO SLICE POSITION
|
||||
LD (HL),A ; SAVE IT
|
||||
RET ; DONE
|
||||
;
|
||||
UNA_INIT4:
|
||||
DRV_INIT4:
|
||||
; ALLOCATE SPACE IN DRVMAP
|
||||
PUSH BC ; SAVE INCOMING UNIT NUM
|
||||
LD BC,4 ; 4 BYTES PER ENTRY
|
||||
CALL ALLOC ; ALLOCATE
|
||||
CALL NZ,PANIC ; SHOULD NEVER ERROR HERE
|
||||
; CALL PC_LBKT ; *DEBUG*
|
||||
; CALL PRTHEXWORD ; *DEBUG*
|
||||
; CALL PC_RBKT ; *DEBUG*
|
||||
PUSH BC ; MOVE MEM PTR
|
||||
POP HL ; ... TO HL
|
||||
POP BC ; RECOVER UNIT NUM
|
||||
LD (HL),B ; SAVE IT IN FIRST BYTE OF DRV MAP ENTRY
|
||||
PUSH HL ; SAVE HL
|
||||
LD HL,(UNA_DRVMAP) ; POINT TO DRIVE MAP
|
||||
LD HL,(DRVMAPADR) ; POINT TO DRIVE MAP
|
||||
DEC HL ; BACK TO ENTRY COUNT
|
||||
INC (HL) ; INCREMENT THE ENTRY COUNT
|
||||
; LD A,(HL) ; *DEBUG*
|
||||
; CALL PRTHEXBYTE ; *DEBUG*
|
||||
POP HL ; RECOVER HL
|
||||
RET ; DONE
|
||||
;
|
||||
#ELSE
|
||||
;
|
||||
DRV_INIT:
|
||||
;
|
||||
; PERFORM HBIOS SPECIFIC INITIALIZATION
|
||||
; BUILD DRVMAP BASED ON AVAILABLE HBIOS DISK DEVICE LIST
|
||||
;
|
||||
; SETUP THE DRVMAP STRUCTURE
|
||||
LD HL,(BUFTOP) ; GET CURRENT BUFFER TOP
|
||||
INC HL ; SKIP 1 BYTE FOR ENTRY COUNT PREFIX
|
||||
LD (DRVMAPADR),HL ; SAVE AS DRVMAP ADDRESS
|
||||
LD (BUFTOP),HL ; AND AS NEW BUFTOP
|
||||
;
|
||||
; SETUP TO LOOP THROUGH AVAILABLE DEVICES
|
||||
LD B,BF_DIODEVCNT ; HBIOS FUNC: DEVICE COUNT
|
||||
RST 08 ; CALL HBIOS, DEVICE COUNT TO B
|
||||
LD A,B ; COUNT TO A
|
||||
OR A ; SET FLAGS
|
||||
RET Z ; HANDLE ZERO DEVICES (ALBEIT POORLY)
|
||||
LD C,0 ; USE C AS DEVICE LIST INDEX
|
||||
;
|
||||
DRV_INIT1: ; DEVICE ENUMERATION LOOP
|
||||
PUSH BC ; PRESERVE LOOP CONTROL
|
||||
LD B,BF_DIODEVINF ; HBIOS FUNC: DEVICE INFO
|
||||
RST 08 ; CALL HBIOS, DEVICE/UNIT TO C
|
||||
CALL DRV_INIT3 ; MAKE DRIVE MAP ENTRY(S)
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
INC C ; INCREMENT LIST INDEX
|
||||
DJNZ DRV_INIT1 ; LOOP AS NEEDED
|
||||
RET ; FINISHED
|
||||
;
|
||||
DRV_INIT3: ; PROCESS DEVICE/UNIT
|
||||
LD A,C ; DEVICE/UNIT TO A
|
||||
PUSH AF ; SAVE DEVICE/UNIT
|
||||
CALL DRV_INIT4 ; MAKE A DRIVE MAP ENTRY
|
||||
POP AF ; RESTORE DEVICE/UNIT
|
||||
CP DIODEV_IDE ; FIRST SLICE CAPABLE DEVICE?
|
||||
RET C ; DONE IF NOT SLICE WORTHY
|
||||
CALL DRV_INIT4 ; MAKE ANOTHER ENTRY IF HARD DISK
|
||||
LD A,1 ; ... BUT WITH SLICE = 1
|
||||
INC HL ; BUMP TO SLICE POSITION
|
||||
LD (HL),A ; SAVE IT
|
||||
RET ; DONE
|
||||
;
|
||||
DRV_INIT4: ; MAKE A DRIVE MAP ENTRY
|
||||
; ALLOCATE SPACE FOR ENTRY
|
||||
PUSH AF ; SAVE INCOMING DEVICE/UNIT
|
||||
LD BC,4 ; 4 BYTES PER ENTRY
|
||||
CALL ALLOC ; ALLOCATE SPACE
|
||||
CALL NZ,PANIC ; SHOULD NEVER ERROR HERE
|
||||
PUSH BC ; MOVE MEM PTR
|
||||
POP HL ; ... TO HL
|
||||
POP AF ; RECOVER DEVICE/UNIT
|
||||
LD (HL),A ; SAVE IT IN FIRST BYTE OF DRVMAP
|
||||
PUSH HL ; SAVE ENTRY PTR
|
||||
LD HL,(DRVMAPADR) ; POINT TO DRIVE MAP
|
||||
DEC HL ; BACKUP TO ENTRY COUNT
|
||||
INC (HL) ; INCREMENT THE ENTRY COUNT
|
||||
POP HL ; RECOVER ENTRY POINTER
|
||||
RET ; DONE
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
;
|
||||
@@ -2045,11 +2062,7 @@ DPH_INIT:
|
||||
CALL NEWLINE ; FORMATTING
|
||||
;
|
||||
; ALLOCATE DPH POOL SPACE BASED ON DRIVE COUNT
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
LD HL,(UNA_DRVMAP) ; LOAD DRIVE MAP POINTER
|
||||
#ELSE
|
||||
LD HL,DRVMAP ; LOAD DRIVE MAP POINTER
|
||||
#ENDIF
|
||||
LD HL,(DRVMAPADR) ; LOAD DRIVE MAP POINTER
|
||||
DEC HL ; BACKUP TO ENTRY COUNT
|
||||
LD A,(HL) ; GET THE ENTRY COUNT
|
||||
LD L,A ; PUT DRIVE COUNT
|
||||
@@ -2077,11 +2090,7 @@ DPH_INIT:
|
||||
LD (DIRBUF),HL ; ... AND SAVE IN DIRBUF
|
||||
;
|
||||
; SETUP FOR DPH BUILD LOOP
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
LD HL,(UNA_DRVMAP) ; POINT TO DRIVE MAP
|
||||
#ELSE
|
||||
LD HL,DRVMAP ; POINT TO DRIVE MAP
|
||||
#ENDIF
|
||||
LD HL,(DRVMAPADR) ; POINT TO DRIVE MAP
|
||||
DEC HL ; BACKUP TO ENTRY COUNT
|
||||
LD B,(HL) ; LOOP DRVCNT TIMES
|
||||
LD C,0 ; DRIVE INDEX
|
||||
@@ -2104,19 +2113,31 @@ DPH_INIT1:
|
||||
INC HL ; BUMP
|
||||
CALL PRTDUS ; PRINT DEVICE/UNIT/SLICE
|
||||
LD A,D ; A := DEV/UNIT
|
||||
PUSH HL ; SAVE IT
|
||||
PUSH HL ; SAVE DRIVE MAP POINTER
|
||||
; MATCH AND SAVE DEFAULT DRIVE BASED ON BOOT DEVICE/UNIT/SLICE
|
||||
LD HL,BOOTDEV ; POINT TO BOOT DEVICE/UNIT
|
||||
LD A,D ; LOAD CURRENT DEVICE/UNIT
|
||||
CP (HL) ; MATCH?
|
||||
JR NZ,DPH_INIT1A ; BYPASS IF NOT BOOT DEVICE/UNIT
|
||||
DEC HL ; POINT TO BOOT SLICE
|
||||
LD A,E ; LOAD CURRENT SLICE
|
||||
CP (HL) ; MATCH?
|
||||
JR NZ,DPH_INIT1A ; BYPASS IF NOT BOOT SLICE
|
||||
LD A,C ; LOAD THE CURRENT DRIVE NUM
|
||||
LD (DEFDRIVE),A ; SAVE AS DEFAULT
|
||||
DPH_INIT1A:
|
||||
LD DE,(DPHTOP) ; GET ADDRESS OF NEXT DPH
|
||||
PUSH DE ; SAVE IT
|
||||
PUSH DE ; ... AND SAVE IT
|
||||
; INVOKE THE DPH BUILD ROUTINE
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
CALL MAKDPH ; MAKE THE DPH AT DE, DEV/UNIT IN A
|
||||
;CALL NZ,PANIC ; FOR NOW, PANIC ON ANY ERROR
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
; STORE THE DPH POINTER IN DRIVE MAP
|
||||
POP DE ; RESTORE DPH ADDRESS
|
||||
POP HL ; RESTORE HL := DPH PTR LOC
|
||||
POP DE ; RESTORE DPH ADDRESS TO DE
|
||||
POP HL ; RESTORE DRIVE MAP POINTER TO HL
|
||||
;RET NZ ; ABORT ON ERROR
|
||||
JR Z,DPH_INIT2 ; IF OK, CONTINUE
|
||||
JR Z,DPH_INIT2 ; IF MAKDPH OK, CONTINUE
|
||||
LD DE,0 ; ... OTHERWISE ZERO OUT THE DPH POINTER
|
||||
DPH_INIT2:
|
||||
LD (HL),E ; SAVE DPH POINTER
|
||||
@@ -2274,10 +2295,6 @@ ERR:
|
||||
OR $FF
|
||||
RET
|
||||
;
|
||||
DPHTOP .DW 0 ; CURRENT TOP OF DPH POOL
|
||||
DIRBUF .DW 0 ; DIR BUF POINTER
|
||||
BUFTOP .DW BUFPOOL ; CURRENT TOP OF BUF POOL
|
||||
;
|
||||
PRTDUS:
|
||||
;
|
||||
; PRINT THE DEVICE/UNIT/SLICE INFO
|
||||
@@ -2301,9 +2318,15 @@ PRTDUS:
|
||||
LD DE,DEVIDE ; IDE STRING
|
||||
CP $41 ; IDE?
|
||||
JR Z,PRTDUSX ; IF YES, PRINT
|
||||
LD DE,DEVPPIDE ; PPIDE STRING
|
||||
CP $42 ; PPIDE?
|
||||
JR Z,PRTDUSX ; IF YES, PRINT
|
||||
LD DE,DEVSD ; SD STRING
|
||||
CP $43 ; SD?
|
||||
JR Z,PRTDUSX ; IF YES, PRINT
|
||||
LD DE,DEVDSD ; DSD STRING
|
||||
CP $44 ; DSD?
|
||||
JR Z,PRTDUSX ; IF YES, PRINT
|
||||
|
||||
LD DE,DEVUNK ; OTHERWISE, UNKNOWN
|
||||
JR PRTDUSX ; PRINT IT
|
||||
@@ -2330,11 +2353,13 @@ PRTDUSX:
|
||||
CALL PRTDECB ; PRINT IT
|
||||
RET
|
||||
;
|
||||
DEVRAM .DB "RAM$"
|
||||
DEVROM .DB "ROM$"
|
||||
DEVIDE .DB "IDE$"
|
||||
DEVSD .DB "SD$"
|
||||
DEVUNK .DB "UNK$"
|
||||
DEVRAM .DB "RAM$"
|
||||
DEVROM .DB "ROM$"
|
||||
DEVIDE .DB "IDE$"
|
||||
DEVPPIDE .DB "PPIDE$"
|
||||
DEVSD .DB "SD$"
|
||||
DEVDSD .DB "DSD$"
|
||||
DEVUNK .DB "UNK$"
|
||||
;
|
||||
#ELSE
|
||||
;
|
||||
@@ -2390,6 +2415,13 @@ DEV15 .EQU DEVUNK
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
DPHTOP .DW 0 ; CURRENT TOP OF DPH POOL
|
||||
DIRBUF .DW 0 ; DIR BUF POINTER
|
||||
BUFTOP .DW BUFPOOL ; CURRENT TOP OF BUF POOL
|
||||
BOOTDL:
|
||||
BOOTLU .DB 0
|
||||
BOOTDEV .DB 0
|
||||
;
|
||||
STR_INITRAMDISK .DB "\r\nFormatting RAMDISK...$"
|
||||
STR_LDR .DB "\r\n $"
|
||||
STR_DPHINIT .DB "\r\n\r\nConfiguring Drives...$"
|
||||
@@ -37,7 +37,7 @@ BS: .EQU 08H ; ASCII BACKSPACE CHARACTER
|
||||
JP DSKY_ENTRY
|
||||
JP UART_ENTRY
|
||||
;
|
||||
#DEFINE CIOMODE_CBIOS
|
||||
#DEFINE CIOMODE_HBIOS
|
||||
#INCLUDE "util.asm"
|
||||
;
|
||||
#INCLUDE "memmgr.asm"
|
||||
@@ -266,16 +266,16 @@ diskdef interak
|
||||
sectrk 20
|
||||
blocksize 4096
|
||||
maxdir 256
|
||||
skew 1
|
||||
skew 0
|
||||
boottrk 2
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# For 512KB ROM, less 96K reserved for system
|
||||
# RomWBW 512KB ROM (64KB reserved, 448KB ROM Disk)
|
||||
|
||||
diskdef n8vem_rom512
|
||||
diskdef wbw_rom512
|
||||
seclen 512
|
||||
tracks 13
|
||||
tracks 14
|
||||
sectrk 64
|
||||
blocksize 2048
|
||||
maxdir 256
|
||||
@@ -284,11 +284,11 @@ diskdef n8vem_rom512
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# For 1024KB ROM, less 96K reserved for system
|
||||
# RomWBW 1024KB ROM (64KB reserved, 960KB ROM Disk)
|
||||
|
||||
diskdef n8vem_rom1024
|
||||
diskdef wbw_rom1024
|
||||
seclen 512
|
||||
tracks 29
|
||||
tracks 30
|
||||
sectrk 64
|
||||
blocksize 2048
|
||||
maxdir 256
|
||||
@@ -297,8 +297,34 @@ diskdef n8vem_rom1024
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# N8VEM Hard Disks, hd0 - hd3 are first 4 slices of disk
|
||||
diskdef n8vem_hd0
|
||||
# UNA 512KB ROM (128KB reserved, 384KB ROM Disk)
|
||||
|
||||
diskdef una_rom512
|
||||
seclen 512
|
||||
tracks 12
|
||||
sectrk 64
|
||||
blocksize 2048
|
||||
maxdir 256
|
||||
skew 0
|
||||
boottrk 0
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# UNA 512KB ROM (128KB reserved, 896KB ROM Disk)
|
||||
|
||||
diskdef una_rom1024
|
||||
seclen 512
|
||||
tracks 28
|
||||
sectrk 64
|
||||
blocksize 2048
|
||||
maxdir 256
|
||||
skew 0
|
||||
boottrk 0
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# RomWBW 8MB Hard Disk, LU 0-3
|
||||
diskdef wbw_hd0
|
||||
seclen 512
|
||||
tracks 65
|
||||
sectrk 256
|
||||
@@ -309,7 +335,7 @@ diskdef n8vem_hd0
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef n8vem_hd1
|
||||
diskdef wbw_hd1
|
||||
seclen 512
|
||||
tracks 130
|
||||
sectrk 256
|
||||
@@ -320,7 +346,7 @@ diskdef n8vem_hd1
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef n8vem_hd2
|
||||
diskdef wbw_hd2
|
||||
seclen 512
|
||||
tracks 195
|
||||
sectrk 256
|
||||
@@ -331,7 +357,7 @@ diskdef n8vem_hd2
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef n8vem_hd3
|
||||
diskdef wbw_hd3
|
||||
seclen 512
|
||||
tracks 260
|
||||
sectrk 256
|
||||
@@ -342,8 +368,8 @@ diskdef n8vem_hd3
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# N8VEM 720K floppy media
|
||||
diskdef n8vem_fd720
|
||||
# RomWBW 720K floppy media
|
||||
diskdef wbw_fd720
|
||||
seclen 512
|
||||
tracks 160
|
||||
sectrk 9
|
||||
@@ -354,8 +380,8 @@ diskdef n8vem_fd720
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# N8VEM 1.44M floppy media
|
||||
diskdef n8vem_fd144
|
||||
# RomWBW 1.44M floppy media
|
||||
diskdef wbw_fd144
|
||||
seclen 512
|
||||
tracks 160
|
||||
sectrk 18
|
||||
@@ -366,8 +392,8 @@ diskdef n8vem_fd144
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# N8VEM 360K floppy media
|
||||
diskdef n8vem_fd360
|
||||
# RomWBW 360K floppy media
|
||||
diskdef wbw_fd360
|
||||
seclen 512
|
||||
tracks 80
|
||||
sectrk 9
|
||||
@@ -378,8 +404,8 @@ diskdef n8vem_fd360
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# N8VEM 1.20M floppy media
|
||||
diskdef n8vem_fd120
|
||||
# RomWBW 1.20M floppy media
|
||||
diskdef wbw_fd120
|
||||
seclen 512
|
||||
tracks 160
|
||||
sectrk 15
|
||||
@@ -32,6 +32,75 @@ HBXX_COPY JP HBXI_COPY
|
||||
HBXX_XCOPY JP HBXI_XCOPY
|
||||
;
|
||||
;==================================================================================================
|
||||
; HBIOS INTERNAL PROXY JUMP TABLE
|
||||
;==================================================================================================
|
||||
;
|
||||
#DEFINE DEVENT(DEV,UNIT) \
|
||||
#DEFCONT .DB DEV | UNIT
|
||||
;
|
||||
.DB DEVCNT
|
||||
DEVMAP:
|
||||
#IFDEF DEVLST
|
||||
DEVLST
|
||||
#ELSE
|
||||
|
||||
; RAM/ROM MEMORY DISK UNITS
|
||||
#IF MDENABLE
|
||||
DEVENT(DIODEV_MD,1) ; MD1: (RAM DISK)
|
||||
DEVENT(DIODEV_MD,0) ; MD0: (ROM DISK)
|
||||
#ENDIF
|
||||
|
||||
#IF FDENABLE
|
||||
DEVENT(DIODEV_FD,0) ; FD0: (PRIMARY FLOPPY DRIVE)
|
||||
DEVENT(DIODEV_FD,1) ; FD1: (SECONDARY FLOPPY DRIVE)
|
||||
#ENDIF
|
||||
|
||||
; RAM FLOPPY MEMORY DISK UNITS
|
||||
#IF RFENABLE
|
||||
DEVENT(DIODEV_RF,0) ; RF0: (RAMFLOPPY DISK UNIT 0)
|
||||
; DEVENT(DIODEV_RF,1) ; RF1: (RAMFLOPPY DISK UNIT 1)
|
||||
#ENDIF
|
||||
|
||||
; IDE DISK UNITS
|
||||
#IF IDEENABLE
|
||||
DEVENT(DIODEV_IDE,0) ; IDE0: (IDE PRIMARY MASTER DISK)
|
||||
; DEVENT(DIODEV_IDE,1) ; IDE1: (IDE PRIMARY SLAVE DISK)
|
||||
#ENDIF
|
||||
|
||||
; PPIDE DISK UNITS
|
||||
#IF PPIDEENABLE
|
||||
DEVENT(DIODEV_PPIDE,0) ; PPIDE0: (PAR PORT IDE PRIMARY MASTER DISK)
|
||||
; DEVENT(DIODEV_PPIDE,1) ; PPIDE1: (PAR PORT IDE PRIMARY SLAVE DISK)
|
||||
#ENDIF
|
||||
|
||||
; SD CARD DISK UNITS
|
||||
#IF SDENABLE
|
||||
DEVENT(DIODEV_SD,0) ; SD0: (SD CARD DISK)
|
||||
#ENDIF
|
||||
|
||||
; PROPIO SD CARD DISK UNITS
|
||||
#IF (PRPENABLE & PRPSDENABLE)
|
||||
DEVENT(DIODEV_PRPSD,0) ; PRPSD0: (PROPIO SD DISK)
|
||||
#ENDIF
|
||||
|
||||
; PARPORTPROP SD CARD DISK UNITS
|
||||
#IF (PPPENABLE & PPPSDENABLE)
|
||||
DEVENT(DIODEV_PPPSD,0) ; PPPSD0: (PARPORTPROP SD DISK)
|
||||
#ENDIF
|
||||
|
||||
; SIMH EMULATOR DISK UNITS
|
||||
#IF HDSKENABLE
|
||||
DEVENT(DIODEV_HDSK,0) ; HDSK0: (SIMH DISK DRIVE 0)
|
||||
DEVENT(DIODEV_HDSK,1) ; HDSK1: (SIMH DISK DRIVE 1)
|
||||
#ENDIF
|
||||
|
||||
#ENDIF
|
||||
;
|
||||
DEVCNT .EQU ($ - DEVMAP) / 1
|
||||
.ECHO DEVCNT
|
||||
.ECHO " devices defined.\n"
|
||||
;
|
||||
;==================================================================================================
|
||||
; SYSTEM INITIALIZATION
|
||||
;==================================================================================================
|
||||
;
|
||||
@@ -381,6 +450,10 @@ DIO_COMMON:
|
||||
JR Z,DIO_GETBUF ; YES, HANDLE IT
|
||||
DEC A ; FUNCTION = DIOSETBUF?
|
||||
JR Z,DIO_SETBUF ; YES, HANDLE IT
|
||||
DEC A ; FUNCTION = DIODEVCNT?
|
||||
JR Z,DIO_DEVCNT ; YES, HANDLE IT
|
||||
DEC A ; FUNCTION = DIODEVINF?
|
||||
JR Z,DIO_DEVINF ; YES, HANDLE IT
|
||||
CALL PANIC ; INVALID FUNCTION SPECFIED
|
||||
;
|
||||
; DISK: GET BUFFER ADDRESS
|
||||
@@ -399,6 +472,32 @@ DIO_SETBUF:
|
||||
XOR A ; SIGNALS SUCCESS
|
||||
RET
|
||||
;
|
||||
; DISK: GET DEVICE COUNT
|
||||
;
|
||||
DIO_DEVCNT:
|
||||
LD A,(DEVMAP - 1) ; GET DEVICE COUNT
|
||||
LD B,A ; PUT IT IN B
|
||||
XOR A ; SIGNALS SUCCESS
|
||||
RET
|
||||
;
|
||||
; DISK: GET DEVICE INFO
|
||||
;
|
||||
DIO_DEVINF:
|
||||
LD HL,DEVMAP - 1 ; POINT TO DEVICE MAP ENTRY COUNT
|
||||
LD B,(HL) ; ENTRY COUNT TO B
|
||||
LD A,C ; INDEX TO A
|
||||
CP B ; CHECK INDEX AGAINST MAX VALUE (INDEX - COUNT)
|
||||
JR NC,DIO_DEVINF1 ; IF INDEX TOO HIGH, ERR
|
||||
INC HL ; BUMP TO START OF DEV MAP ENTRIES
|
||||
CALL ADDHLA ; AND POINT TO REQUESTED INDEX
|
||||
LD C,(HL) ; DEVICE/UNIT TO C
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; DONE
|
||||
|
||||
DIO_DEVINF1:
|
||||
OR $FF ; SIGNAL ERROR
|
||||
RET ; RETURN
|
||||
;
|
||||
;==================================================================================================
|
||||
; REAL TIME CLOCK DEVICE DISPATCHER
|
||||
;==================================================================================================
|
||||
@@ -11,6 +11,20 @@
|
||||
;
|
||||
; SETUP OUR STACK
|
||||
LD SP,BL_STACK ; SET UP LOADER STACK
|
||||
|
||||
; ENSURE THAT USER BANK IS MAPPED TO LOWER 32K
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
; SWITCH TO EXEC PAGE IN BANKED MEMORY
|
||||
LD BC,$01FB ; SET BANK
|
||||
LD DE,$800E ; EXEC_PAGE (SEE PAGES.INC)
|
||||
RST 08 ; DO IT
|
||||
|
||||
LD HL,BL_UNAMOD ; POINT TO UNA MODE FLAG
|
||||
LD (HL),$FF ; SET UNA MODE
|
||||
#ELSE
|
||||
LD A,BID_USR ; USER RAM PAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
#ENDIF
|
||||
|
||||
; TEST FOR UNA, CONFIG INVOCATION VECTOR IF FOUND
|
||||
CALL UNACHK
|
||||
@@ -51,20 +65,22 @@ DB_BOOTLOOP:
|
||||
;
|
||||
CALL CST
|
||||
OR A
|
||||
JR Z,DB_CONEND
|
||||
JP Z,DB_CONEND
|
||||
CALL CINUC
|
||||
CP 'M' ; MONITOR
|
||||
JR Z,GOMON
|
||||
CP 'R' ; ROM BOOT
|
||||
JR Z,GOROM
|
||||
JP Z,GOMON
|
||||
CP 'C' ; CP/M BOOT FROM ROM
|
||||
JP Z,GOCPM
|
||||
CP 'Z' ; ZSYSTEM BOOT FROM ROM
|
||||
JP Z,GOZSYS
|
||||
CP 'L' ; LIST DRIVES
|
||||
JR Z,GOLIST
|
||||
CP 'A' ; A-P, DISK BOOT
|
||||
JR C,DB_INVALID
|
||||
CP 'P' + 1 ; HMMM... 'M' DRIVE CONFLICTS WITH MONITOR SELECTION
|
||||
JR NC,DB_INVALID
|
||||
SUB 'A'
|
||||
JR GOBOOTDISK
|
||||
JP Z,GOLIST
|
||||
CP '0' ; 0-9, DISK DEVICE
|
||||
JP C,DB_INVALID
|
||||
CP '9' + 1
|
||||
JP NC,DB_INVALID
|
||||
SUB '0'
|
||||
JP GOBOOTDISK
|
||||
DB_CONEND:
|
||||
;
|
||||
; CHECK FOR DSKY BOOT KEYPRESS
|
||||
@@ -72,18 +88,18 @@ DB_CONEND:
|
||||
#IF (DSKYENABLE)
|
||||
CALL KY_STAT ; GET KEY FROM KB INTO A
|
||||
OR A
|
||||
JR Z,DB_DSKYEND
|
||||
JP Z,DB_DSKYEND
|
||||
CALL KY_GET
|
||||
CP KY_GO ; GO = MONITOR
|
||||
JR Z,GOMONDSKY
|
||||
JP Z,GOMONDSKY
|
||||
CP KY_BO ; BO = BOOT ROM
|
||||
JR Z,GOROM
|
||||
CP 0AH ; A-F, DISK BOOT
|
||||
JR C,DB_INVALID
|
||||
CP 0FH + 1
|
||||
JR NC,DB_INVALID
|
||||
SUB 0AH
|
||||
JR GOBOOTDISK
|
||||
JP Z,GOCPM
|
||||
; CP 0AH ; A-F, DISK BOOT
|
||||
; JP C,DB_INVALID
|
||||
CP 0FH + 1 ; 0-F, DISK BOOT
|
||||
; JP NC,DB_INVALID
|
||||
; SUB 0AH
|
||||
JP GOBOOTDISK
|
||||
; LD HL,BOOT ; POINT TO BOOT MESSAGE
|
||||
; LD A,00H ; BLANK OUT SELECTION,IT WAS INVALID
|
||||
; LD (HL),A ; STORE IT IN DISPLAY BUFFER
|
||||
@@ -105,20 +121,24 @@ DB_DSKYEND:
|
||||
LD (BL_TIMEOUT),BC
|
||||
LD A,B
|
||||
OR C
|
||||
JR NZ,DB_BOOTLOOP
|
||||
JP NZ,DB_BOOTLOOP
|
||||
|
||||
; TIMEOUT EXPIRED, PERFORM DEFAULT BOOT ACTION
|
||||
LD A,BOOT_DEFAULT
|
||||
CP 'M' ; MONITOR
|
||||
JR Z,GOMON
|
||||
CP 'R' ; ROM BOOT
|
||||
JR Z,GOROM
|
||||
CP 'A' ; A-P, DISK BOOT
|
||||
JR C,DB_INVALID
|
||||
CP 'P' + 1 ; HMMM... DRIVE M CONFLICTS WITH "MONITOR" SELECTION
|
||||
JR NC,DB_INVALID
|
||||
SUB 'A'
|
||||
JR GOBOOTDISK
|
||||
JP Z,GOMON
|
||||
CP 'C' ; CP/M BOOT FROM ROM
|
||||
JP Z,GOCPM
|
||||
CP 'Z' ; ZSYSTEM BOOT FROM ROM
|
||||
JP Z,GOZSYS
|
||||
CP 'L' ; LIST DRIVES
|
||||
JP Z,GOLIST
|
||||
CP '0' ; 0-9, DISK DEVICE
|
||||
JP C,DB_INVALID
|
||||
CP '9' + 1
|
||||
JP NC,DB_INVALID
|
||||
SUB '0'
|
||||
JP GOBOOTDISK
|
||||
#ENDIF
|
||||
|
||||
JP DB_BOOTLOOP
|
||||
@@ -131,18 +151,47 @@ DB_INVALID:
|
||||
JP DOBOOTMENU
|
||||
;
|
||||
GOMON:
|
||||
LD DE,STR_BOOTMON
|
||||
CALL WRITESTR
|
||||
CALL LDMON
|
||||
JP MON_SERIAL
|
||||
;
|
||||
GOMONDSKY:
|
||||
LD DE,STR_BOOTMON
|
||||
CALL WRITESTR
|
||||
CALL LDMON
|
||||
JP MON_DSKY
|
||||
;
|
||||
GOROM:
|
||||
LD DE,STR_BOOTROM
|
||||
LDMON:
|
||||
LD DE,STR_BOOTMON
|
||||
CALL WRITESTR
|
||||
LD HL,$4000
|
||||
LD DE,$C000
|
||||
LD BC,$1000
|
||||
JP LDIMG
|
||||
;
|
||||
GOCPM:
|
||||
LD DE,STR_BOOTCPM
|
||||
CALL WRITESTR
|
||||
LD HL,$5000
|
||||
LD DE,CPM_LOC
|
||||
LD BC,$3000 - $400
|
||||
CALL LDIMG
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
LD DE,$0100 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE)
|
||||
#ELSE
|
||||
LD DE,$0000 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE)
|
||||
#ENDIF
|
||||
JP CPM_ENT
|
||||
;
|
||||
GOZSYS:
|
||||
LD DE,STR_BOOTZSYS
|
||||
CALL WRITESTR
|
||||
LD HL,$1000
|
||||
LD DE,CPM_LOC
|
||||
LD BC,$3000 - $400
|
||||
CALL LDIMG
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
LD DE,$0100 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE)
|
||||
#ELSE
|
||||
LD DE,$0000 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE)
|
||||
#ENDIF
|
||||
JP CPM_ENT
|
||||
;
|
||||
GOLIST:
|
||||
@@ -151,14 +200,50 @@ GOLIST:
|
||||
LD DE,STR_DRVLIST
|
||||
CALL WRITESTR
|
||||
CALL PRTALL
|
||||
JR DOBOOTMENU
|
||||
JP DOBOOTMENU
|
||||
;
|
||||
GOBOOTDISK:
|
||||
LD C,A
|
||||
LD (BL_BOOTID),A
|
||||
LD DE,STR_BOOTDISK
|
||||
CALL WRITESTR
|
||||
JP BOOTDISK
|
||||
;
|
||||
LDIMG:
|
||||
;
|
||||
; LOAD IMAGE FROM ROM
|
||||
;
|
||||
; INPUT: HL=IMAGE SOURCE ADDRESS
|
||||
; DE=IMAGE TARGET ADDRESS
|
||||
; BC=IMAGE SIZE
|
||||
;
|
||||
PUSH HL
|
||||
PUSH DE
|
||||
PUSH BC
|
||||
;
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
; SWITCH TO ROM IMAGE IN THIRD ROM PAGE
|
||||
LD BC,$01FB ; SET BANK
|
||||
LD DE,$0002 ; THIRD ROM PAGE (SEE PAGES.INC)
|
||||
CALL $FFFD ; DO IT
|
||||
#ELSE
|
||||
LD A,BID_BOOT ; ROM PAGE WITH OS IMAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
#ENDIF
|
||||
POP BC
|
||||
POP DE
|
||||
POP HL
|
||||
LDIR
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
; SWITCH BACK TO EXEC PAGE IN BANKED MEMORY
|
||||
LD BC,$01FB ; SET BANK
|
||||
LD DE,$800E ; EXEC_PAGE (SEE PAGES.INC)
|
||||
CALL $FFFD ; DO IT
|
||||
#ELSE
|
||||
LD A,BID_USR ; USER RAM PAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
#ENDIF
|
||||
RET
|
||||
;
|
||||
; CHECK FOR UNA, SETUP INVOCATION VECTOR IF FOUND
|
||||
;
|
||||
UNACHK:
|
||||
@@ -195,20 +280,23 @@ BOOTDISK:
|
||||
JP NZ,BOOTUNA ; HANDLE UNA AS NEEDED
|
||||
|
||||
; CHECK FOR VALID DRIVE LETTER
|
||||
LD A,C ; GET BOOT DRIVE
|
||||
LD HL,DRVMAP - 1 ; POINT TO DRIVE COUNT
|
||||
CP (HL) ; ... AND COMPARE
|
||||
JP NC,DB_NODISK ; ERROR IF DRIVE ID >= COUNT
|
||||
LD A,(BL_BOOTID) ; BOOT DEVICE TO A
|
||||
PUSH AF ; SAVE BOOT DEVICE
|
||||
LD B,BF_DIODEVCNT ; HBIOS FUNC: DEVICE COUNT
|
||||
RST 08 ; CALL HBIOS, DEVICE COUNT TO B
|
||||
POP AF ; RESTORE BOOT DEVICE
|
||||
CP B ; CHECK MAX (INDEX - COUNT)
|
||||
JP NC,DB_NODISK ; HANDLE INVALID SELECTION
|
||||
|
||||
; GET DEVICE/UNIT, SLICE
|
||||
ADD A,A ; DRIVE MAP ENTRIES ARE 2 BYTES EACH
|
||||
LD HL,DRVMAP ; POINT TO DRIVE MAP
|
||||
CALL ADDHLA ; ... AND ADD DRIVE OFFSET
|
||||
LD A,(HL) ; GET DEVICE/UNIT
|
||||
LD (BL_DEVICE),A ; ... AND SAVE IT
|
||||
INC HL ; NEXT BYTE IS SLICE
|
||||
LD A,(HL) ; GET SLICE
|
||||
LD (BL_LU),A ; ... AND SAVE IT
|
||||
; GET DEVICE/UNIT, LU
|
||||
LD B,BF_DIODEVINF ; HBIOS FUNC: DEVICE INFO
|
||||
LD A,(BL_BOOTID) ; GET BOOT DEVICE ID
|
||||
LD C,A ; PUT IN C
|
||||
RST 08 ; CALL HBIOS, DEV INFO TO C
|
||||
LD A,C ; DEVICE/UNIT TO A
|
||||
LD (BL_DEVICE),A ; STORE IT
|
||||
XOR A ; LU ALWAYS ZERO
|
||||
LD (BL_LU),A ; STORE IT
|
||||
|
||||
; SENSE MEDIA
|
||||
LD A,(BL_DEVICE) ; GET DEVICE/UNIT
|
||||
@@ -244,7 +332,7 @@ BOOTDISK1:
|
||||
; DETERMINE STARTING TRACK FOR LU
|
||||
LD A,(BL_LU) ; GET LU SPECIFIED
|
||||
LD E,A ; LU INDEX
|
||||
LD H,65 ; 65 TRACKS PER SLICE
|
||||
LD H,65 ; 65 TRACKS PER LU
|
||||
CALL MULT8 ; HL := H * E
|
||||
LD (BL_LUTRK),HL ; SAVE IT
|
||||
|
||||
@@ -328,6 +416,12 @@ DB_LOOP:
|
||||
DEC (HL) ; ... AND DECREMENT IT
|
||||
JR NZ,DB_LOOP ; LOOP IF NEEDED
|
||||
CALL NEWLINE ; FORMATTING
|
||||
|
||||
; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT
|
||||
LD A,(BL_DEVICE) ; LOAD BOOT DEVICE/UNIT
|
||||
LD D,A ; SAVE IN D
|
||||
LD A,(BL_LU) ; LOAD BOOT LU
|
||||
LD E,A ; SAVE IN E
|
||||
|
||||
; JUMP TO COLD BOOT ENTRY
|
||||
LD HL,(BB_CPMENT)
|
||||
@@ -337,7 +431,8 @@ DB_LOOP:
|
||||
; BOOT FROM UNA DISK DRIVE
|
||||
;
|
||||
BOOTUNA:
|
||||
LD B,C ; MOVE UNIT CODE TO B
|
||||
LD A,(BL_BOOTID) ; GET BOOT DEVICE ID
|
||||
LD B,A ; MOVE TO B
|
||||
|
||||
; LOAD SECTOR 2 (BOOT INFO)
|
||||
LD C,$41 ; UNA FUNC: SET LBA
|
||||
@@ -353,8 +448,6 @@ BOOTUNA:
|
||||
RST 08 ; DO READ
|
||||
JP NZ,DB_ERR ; HANDLE ERROR
|
||||
CALL PC_PERIOD ; MARK PROGRESS
|
||||
;
|
||||
PUSH BC ; SAVE UNIT
|
||||
;
|
||||
; CHECK SIGNATURE
|
||||
CALL NEWLINE ; FORMATTING
|
||||
@@ -399,13 +492,14 @@ BOOTUNA:
|
||||
LD DE,STR_LOADING ; LOADING MESSAGE
|
||||
CALL WRITESTR ; PRINT IT
|
||||
;
|
||||
POP BC ; RESTORE UNIT
|
||||
LD A,(BL_BOOTID) ; GET BOOT DEVICE ID
|
||||
LD B,A ; MOVE TO B
|
||||
;
|
||||
LD C,$41 ; UNA FUNC: SET LBA
|
||||
LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO
|
||||
LD HL,3 ; LOAD STARTING AT SECTOR 3
|
||||
RST 08 ; SET LBA
|
||||
JR NZ,DB_ERR ; HANDLE ERROR
|
||||
JP NZ,DB_ERR ; HANDLE ERROR
|
||||
CALL PC_PERIOD ; MARK PROGRESS
|
||||
;
|
||||
LD C,$42 ; UNA FUNC: READ SECTORS
|
||||
@@ -418,8 +512,14 @@ BOOTUNA:
|
||||
LD L,A ; SECTORS TO READ
|
||||
LD DE,(BB_CPMLOC) ; DEST OF CPM IMAGE
|
||||
RST 08 ; DO READ
|
||||
JR NZ,DB_ERR ; HANDLE ERROR
|
||||
JP NZ,DB_ERR ; HANDLE ERROR
|
||||
CALL PC_PERIOD ; MARK PROGRESS
|
||||
;
|
||||
; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT
|
||||
LD A,(BL_BOOTID) ; LOAD BOOT DEVICE/UNIT
|
||||
LD D,A ; SAVE IN D
|
||||
XOR A ; BOOT LU IS ALWAYS 0
|
||||
LD E,A ; SAVE IN E
|
||||
;
|
||||
; JUMP TO COLD BOOT ENTRY
|
||||
CALL NEWLINE ; FORMATTING
|
||||
@@ -482,7 +582,7 @@ DB_READSEC:
|
||||
; SET HL=TRACK (ADD IN TRACK OFFSET)
|
||||
LD DE,(BL_LUTRK) ; DE = TRACK OFFSET FOR LU SUPPORT
|
||||
LD HL,(BL_CURTRK) ; HL = TRACK #
|
||||
ADD HL,DE ; APPLY OFFSET FOR ACTIVE SLICE
|
||||
ADD HL,DE ; APPLY OFFSET FOR ACTIVE LU
|
||||
; SET DE=SECTOR
|
||||
LD A,(BL_CURSEC) ; GET THE SECTOR INTO A
|
||||
LD E,A ; MOVE IT TO LSB
|
||||
@@ -506,7 +606,7 @@ DB_READSEC2:
|
||||
AND $0F ; GET RID OF TOP NIBBLE
|
||||
OR E ; COMBINE WITH E
|
||||
LD E,A ; BACK IN E
|
||||
LD HL,0 ; HL:DE NOW HAS SLICE RELATIVE LBA
|
||||
LD HL,0 ; HL:DE NOW HAS LU RELATIVE LBA
|
||||
; APPLY LU OFFSET NOW
|
||||
; LU OFFSET IS EXPRESSED AS NUMBER OF BLOCKS * 256 TO LU OFFSET!
|
||||
LD A,(BL_LUTRK) ; LSB OF LU TRACK TO A
|
||||
@@ -558,34 +658,35 @@ PRTALL:
|
||||
OR A ; SET FLAGS
|
||||
JP NZ,UPRTALL ; HANDLE UNA MODE
|
||||
|
||||
LD HL,DRVMAP - 1 ; POINT TO DRIVE COUNT
|
||||
LD B,(HL) ; DRIVE COUNT TO B
|
||||
LD C,0 ; DRIVE INDEX
|
||||
INC HL ; POINT TO FIRST ENTRY
|
||||
LD B,BF_DIODEVCNT ; HBIOS FUNC: DEVICE COUNT
|
||||
RST 08 ; CALL HBIOS
|
||||
LD A,B ; COUNT TO A
|
||||
OR A ; SET FLAGS
|
||||
RET Z ; BAIL OUT IF ZERO
|
||||
LD C,0 ; INIT DEVICE INDEX
|
||||
;
|
||||
PRTALL1:
|
||||
LD DE,STR_PREFIX ; FORMATTING
|
||||
CALL WRITESTR ; PRINT IT
|
||||
LD A,C ; DRIVE INDEX
|
||||
ADD A,'A' ; MAKE IS ALPHA
|
||||
LD A,C ; INDEX TO A
|
||||
ADD A,'0' ; MAKE NUMERIC CHAR
|
||||
CALL COUT ; PRINT IT
|
||||
LD A,':' ; DRIVE COLON
|
||||
LD A,')' ; FORMATTING
|
||||
CALL COUT ; PRINT IT
|
||||
LD A,'=' ; SEPARATOR
|
||||
CALL COUT ; PRINT IT
|
||||
LD D,(HL) ; GET DEVICE/UNIT
|
||||
INC HL ; BUMP TO LU
|
||||
LD E,(HL) ; GET LU
|
||||
INC HL ; MOVE TO NEXT DRIVE
|
||||
PUSH BC ; PRESERVE LOOP CONTROL
|
||||
CALL PRTDRV ; PRINT IT
|
||||
CALL PC_SPACE ; SPACING
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
LD B,BF_DIODEVINF ; HBIOS FUNC: DEVICE INFO
|
||||
RST 08 ; CALL HBIOS
|
||||
LD D,C ; DEVICE/UNIT TO D
|
||||
LD E,0 ; LU IS ZERO
|
||||
CALL PRTDRV ; PRINT IT
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
INC C ; NEXT DRIVE
|
||||
DJNZ PRTALL1 ; LOOP TILL DONE
|
||||
RET ; AND DONE
|
||||
INC C ; BUMP INDEX
|
||||
DJNZ PRTALL1 ; LOOP AS NEEDED
|
||||
RET ; DONE
|
||||
;
|
||||
; PRINT THE DEVICE/UNIT/SLICE INFO
|
||||
; ON INPUT D HAS DEVICE/UNIT, E HAS SLICE
|
||||
; PRINT THE DEVICE/UNIT/LU INFO
|
||||
; ON INPUT D HAS DEVICE/UNIT, E HAS LU
|
||||
; DESTROY NO REGISTERS OTHER THAN A
|
||||
;
|
||||
PRTDRV:
|
||||
@@ -611,8 +712,8 @@ PRTDRV:
|
||||
AND $0F ; ISOLATE UNIT
|
||||
CALL PRTDECB ; PRINT IT
|
||||
CALL PC_COLON ; FORMATTING
|
||||
LD A,E ; LOAD SLICE
|
||||
CALL PRTDECB ; PRINT IT
|
||||
; LD A,E ; LOAD LU
|
||||
; CALL PRTDECB ; PRINT IT
|
||||
RET
|
||||
;
|
||||
DEVTBL: ; DEVICE TABLE
|
||||
@@ -666,12 +767,11 @@ UPRTDRV:
|
||||
LD DE,STR_PREFIX ; NEWLINE AND SPACING
|
||||
CALL WRITESTR ; PRINT IT
|
||||
LD A,B ; DRIVE LETTER TO A
|
||||
ADD A,'A' ; MAKE IT ALPHA
|
||||
ADD A,'0' ; MAKE IT DISPLAY NUMERIC
|
||||
CALL COUT ; PRINT IT
|
||||
LD A,':' ; DRIVE LETTER COLON
|
||||
CALL COUT ; PRINT IT
|
||||
LD A,'=' ; SEPARATOR
|
||||
LD A,')' ; DRIVE LETTER COLON
|
||||
CALL COUT ; PRINT IT
|
||||
CALL PC_SPACE
|
||||
POP DE ; RECOVER DISK TYPE
|
||||
LD A,D ; DISK TYPE TO A
|
||||
CP $40 ; RAM/ROM?
|
||||
@@ -679,9 +779,15 @@ UPRTDRV:
|
||||
LD DE,UDEVIDE ; ASSUME IDE
|
||||
CP $41 ; IDE?
|
||||
JR Z,UPRTDRV2 ; PRINT IT
|
||||
LD DE,UDEVPPIDE ; ASSUME PPIDE
|
||||
CP $42 ; PPIDE?
|
||||
JR Z,UPRTDRV2 ; PRINT IT
|
||||
LD DE,UDEVSD ; ASSUME SD
|
||||
CP $43 ; SD?
|
||||
JR Z,UPRTDRV2 ; PRINT IT
|
||||
LD DE,UDEVDSD ; ASSUME DSD
|
||||
CP $44 ; DSD?
|
||||
JR Z,UPRTDRV2 ; PRINT IT
|
||||
LD DE,UDEVUNK ; OTHERWISE UNKNOWN
|
||||
JR UPRTDRV2
|
||||
;
|
||||
@@ -705,11 +811,13 @@ UPRTDRV2: ; PRINT DEVICE
|
||||
CALL COUT ; PRINT IT
|
||||
RET ; DONE
|
||||
;
|
||||
UDEVRAM .DB "RAM$"
|
||||
UDEVROM .DB "ROM$"
|
||||
UDEVIDE .DB "IDE$"
|
||||
UDEVSD .DB "SD$"
|
||||
UDEVUNK .DB "UNK$"
|
||||
UDEVRAM .DB "RAM$"
|
||||
UDEVROM .DB "ROM$"
|
||||
UDEVIDE .DB "IDE$"
|
||||
UDEVPPIDE .DB "PPIDE$"
|
||||
UDEVSD .DB "SD$"
|
||||
UDEVDSD .DB "DSD$"
|
||||
UDEVUNK .DB "UNK$"
|
||||
;
|
||||
#IF (DSKYENABLE)
|
||||
;
|
||||
@@ -764,8 +872,9 @@ SEGDISPLAY_LP:
|
||||
STR_BOOTDISK .DB "BOOT FROM DISK\r\n$"
|
||||
STR_BOOTDISK1 .DB "\r\nReading disk information...$"
|
||||
STR_BOOTMON .DB "START MONITOR\r\n$"
|
||||
STR_BOOTROM .DB "BOOT FROM ROM\r\n$"
|
||||
STR_LIST .DB "LIST DRIVES\r\n$"
|
||||
STR_BOOTCPM .DB "BOOT CPM FROM ROM\r\n$"
|
||||
STR_BOOTZSYS .DB "BOOT ZSYSTEM FROM ROM\r\n$"
|
||||
STR_LIST .DB "LIST DEVICES\r\n$"
|
||||
STR_INVALID .DB "INVALID SELECTION\r\n$"
|
||||
STR_SETUP .DB "SYSTEM SETUP\r\n$"
|
||||
STR_SIG .DB "SIGNATURE=$"
|
||||
@@ -773,7 +882,7 @@ STR_CPMLOC .DB "LOC=$"
|
||||
STR_CPMEND .DB "END=$"
|
||||
STR_CPMENT .DB "ENT=$"
|
||||
STR_LABEL .DB "LABEL=$"
|
||||
STR_DRVLIST .DB "\r\nDrives:\r\n$"
|
||||
STR_DRVLIST .DB "\r\nDevices:\r\n$"
|
||||
STR_PREFIX .DB "\r\n $"
|
||||
STR_LOADING .DB "\r\nLoading$"
|
||||
STR_NODISK .DB "\r\nNo disk!$"
|
||||
@@ -781,7 +890,8 @@ STR_NOBOOT .DB "\r\nDisk not bootable!$"
|
||||
STR_BOOTERR .DB "\r\nBoot failure!$"
|
||||
;
|
||||
STR_BANNER .DB "\r\n", PLATFORM_NAME, " Boot Loader$"
|
||||
STR_BOOTMENU .DB "\r\nBoot: (M)onitor, (R)OM, (L)ist, or Drive Letter ===> $"
|
||||
STR_BOOTMENU .DB "\r\nBoot: (C)PM, (Z)System, (M)onitor,\r\n"
|
||||
.DB " (L)ist devices, or Device ID ===> $"
|
||||
;
|
||||
.IF DSKYENABLE
|
||||
BOOT:
|
||||
@@ -793,6 +903,10 @@ BOOT:
|
||||
#DEFINE DSKY_KBD
|
||||
#INCLUDE "util.asm"
|
||||
;
|
||||
#IF (PLATFORM != PLT_UNA)
|
||||
#INCLUDE "memmgr.asm"
|
||||
#ENDIF
|
||||
;
|
||||
; READ A CONSOLE CHARACTER AND CONVERT TO UPPER CASE
|
||||
;
|
||||
CINUC:
|
||||
@@ -820,27 +934,11 @@ BL_CURSEC .DB 0 ; CURRENT SECTOR FOR LOAD
|
||||
BL_CURDMA .DW 0 ; CURRENT MEM LOC BEING LOADED
|
||||
BL_COUNT .DB 0 ; LOAD COUNTER
|
||||
BL_TIMEOUT .DW 0 ; AUTOBOOT TIMEOUT COUNTDOWN COUNTER
|
||||
BL_BOOTID .DB 0 ; BOOT DEVICE ID CHOSEN BY USER
|
||||
BL_DEVICE .DB 0 ; DEVICE TO LOAD FROM
|
||||
BL_LU .DB 0 ; LU TO LOAD FROM
|
||||
BL_UNAMOD .DB 0 ; UNA MODE FLAG, NONZERO IS UNA
|
||||
;
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
DRVMAP .EQU 0 ; MANAGED DYNAMICALLY FOR UNA
|
||||
#ELSE
|
||||
;
|
||||
#DEFINE DRVENT(DEV,UNIT,SLICE,DPHADR) \
|
||||
#DEFCONT .DB DEV | UNIT \
|
||||
#DEFCONT .DB SLICE
|
||||
;
|
||||
.DB DRVCNT
|
||||
DRVMAP: DRVLST
|
||||
;
|
||||
DRVCNT .EQU ($ - DRVMAP) / 2
|
||||
.ECHO DRVCNT
|
||||
.ECHO " drive letters defined.\n"
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
; BOOT INFO SECTOR IS READ INTO AREA BELOW
|
||||
; THE THIRD SECTOR OF A DISK DEVICE IS RESERVED FOR BOOT INFO
|
||||
;
|
||||
@@ -852,7 +950,8 @@ BB_PLATFORM .DB 0 ; FORMATTING PLATFORM
|
||||
BB_DEVICE .DB 0 ; FORMATTING DEVICE
|
||||
BB_FORMATTER .FILL 8,0 ; FORMATTING PROGRAM
|
||||
BB_DRIVE .DB 0 ; PHYSICAL DISK DRIVE #
|
||||
BB_LU .DW 0 ; LOGICAL UNIT (SLICE)
|
||||
BB_LU .DB 0 ; LOGICAL UNIT (LU)
|
||||
.DB 0 ; MSB OF LU, NOW DEPRECATED
|
||||
.FILL (BB_METABUF + 128) - $ - 32,0
|
||||
BB_PROTECT .DB 0 ; WRITE PROTECT BOOLEAN
|
||||
BB_UPDATES .DW 0 ; UPDATE COUNTER
|
||||
@@ -23,14 +23,20 @@ BOOT:
|
||||
CALL PRTSTR ; PRINT
|
||||
CALL PRTDOT ; PROGRESS
|
||||
;
|
||||
LD BC,$0241 ; UNIT=2, FUNCTION: SET LBA
|
||||
LD BC,$00FC ; UNA FUNC: GET BOOTSTRAP HISTORY
|
||||
CALL $FFFD ; CALL UNA
|
||||
JR NZ,ERROR ; HANDLE ERROR
|
||||
CALL PRTDOT ; PROGRESS
|
||||
LD B,L ; MOVE BOOT UNIT ID TO B
|
||||
;
|
||||
LD C,$41 ; UNA FUNC: SET LBA
|
||||
LD DE,0 ; HI WORD ALWAYS ZERO
|
||||
LD HL,3 ; IMAGE STARTS AT FOURTH SECTOR
|
||||
CALL $FFFD ; SET LBA
|
||||
JR NZ,ERROR ; HANDLE ERROR
|
||||
CALL PRTDOT ; PROGRESS
|
||||
;
|
||||
LD BC,$0242 ; UNIT=2, FUNCTION: READ SECTORS
|
||||
LD C,$42 ; UNA FUNC: READ SECTORS
|
||||
LD DE,$D000 ; STARTING ADDRESS FOR IMAGE
|
||||
LD L,22 ; READ 22 SECTORS
|
||||
CALL $FFFD ; DO READ
|
||||
@@ -40,21 +46,76 @@ BOOT:
|
||||
LD DE,STR_DONE ; DONE MESSAGE
|
||||
CALL PRTSTR ; PRINT IT
|
||||
;
|
||||
LD D,B ; PASS BOOT UNIT TO OS
|
||||
LD E,0 ; ASSUME LU IS ZERO
|
||||
JP CPM_ENT ; GO TO CPM
|
||||
;
|
||||
PRTCHR:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
LD BC,$0012 ; UNIT 0, WRITE CHAR
|
||||
LD E,A ; CHAR TO PRINT
|
||||
CALL $FFFD ; PRINT
|
||||
POP DE
|
||||
POP BC
|
||||
RET
|
||||
;
|
||||
PRTSTR:
|
||||
PUSH BC
|
||||
PUSH HL
|
||||
LD BC,$0015 ; UNIT 0, WRITE CHARS UNTIL TERMINATOR
|
||||
LD L,0 ; TERMINATOR IS NULL
|
||||
JP $FFFD ; PRINT
|
||||
CALL $FFFD ; PRINT
|
||||
POP HL
|
||||
POP BC
|
||||
RET
|
||||
;
|
||||
PRTDOT:
|
||||
LD BC,$0012 ; UNIT 0, WRITE CHAR
|
||||
LD E,'.' ; DOT
|
||||
JP $FFFD ; PRINT
|
||||
LD A,'.' ; DOT CHARACTER
|
||||
JR PRTCHR ; PRINT AND RETURN
|
||||
;
|
||||
; PRINT THE HEX BYTE VALUE IN A
|
||||
;
|
||||
PRTHEXBYTE:
|
||||
PUSH AF
|
||||
PUSH DE
|
||||
CALL HEXASCII
|
||||
LD A,D
|
||||
CALL PRTCHR
|
||||
LD A,E
|
||||
CALL PRTCHR
|
||||
POP DE
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE
|
||||
;
|
||||
HEXASCII:
|
||||
LD D,A
|
||||
CALL HEXCONV
|
||||
LD E,A
|
||||
LD A,D
|
||||
RLCA
|
||||
RLCA
|
||||
RLCA
|
||||
RLCA
|
||||
CALL HEXCONV
|
||||
LD D,A
|
||||
RET
|
||||
;
|
||||
; CONVERT LOW NIBBLE OF A TO ASCII HEX
|
||||
;
|
||||
HEXCONV:
|
||||
AND 0FH ;LOW NIBBLE ONLY
|
||||
ADD A,90H
|
||||
DAA
|
||||
ADC A,40H
|
||||
DAA
|
||||
RET
|
||||
;
|
||||
ERROR:
|
||||
LD DE,STR_ERR ; POINT TO ERROR STRINT
|
||||
JR PRTSTR ; PRINT IT
|
||||
LD DE,STR_ERR ; POINT TO ERROR STRING
|
||||
CALL PRTSTR ; PRINT IT
|
||||
HALT ; HALT
|
||||
;
|
||||
STR_LOAD .DB "\r\nLoading",0
|
||||
@@ -256,6 +256,8 @@ BF_DIOMED .EQU $FF ; DISK MEDIA
|
||||
BF_DIOID .EQU $FF ; DISK IDENTIFY
|
||||
BF_DIOGETBUF .EQU $FF ; DISK GET BUFFER ADR
|
||||
BF_DIOSETBUF .EQU $FF ; DISK SET BUFFER ADR
|
||||
BF_DIODEVCNT .EQU $FF ; DISK DEVICE COUNT
|
||||
BF_DIODEVINF .EQU $FF ; DISK DEVICE INFO
|
||||
;
|
||||
BF_RTC .EQU $20
|
||||
BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME
|
||||
@@ -311,6 +313,8 @@ BF_DIOMED .EQU BF_DIO + 3 ; DISK MEDIA
|
||||
BF_DIOID .EQU BF_DIO + 4 ; DISK IDENTIFY
|
||||
BF_DIOGETBUF .EQU BF_DIO + 8 ; DISK GET BUFFER ADR
|
||||
BF_DIOSETBUF .EQU BF_DIO + 9 ; DISK SET BUFFER ADR
|
||||
BF_DIODEVCNT .EQU BF_DIO + 10 ; DISK DEVICE COUNT
|
||||
BF_DIODEVINF .EQU BF_DIO + 11 ; DISK DEVICE INFO
|
||||
;
|
||||
BF_RTC .EQU $20
|
||||
BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME
|
||||
@@ -181,7 +181,7 @@ BOOTTIME .DB 0,0,0,0,0,0 ; SYSTEM STARTUP TIME (YY,MM,DD,HH,MM,SS)
|
||||
SC_TIMESTAMP .DB TIMESTAMP, "$"
|
||||
SC_BUILD .DB BIOSBLD, "$"
|
||||
;
|
||||
.EXPORT DISKBOOT,BOOTDEVICE,BOOTLU
|
||||
; .EXPORT DISKBOOT,BOOTDEVICE,BOOTLU
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
7
Source/BIOS/ver.inc
Normal file
7
Source/BIOS/ver.inc
Normal file
@@ -0,0 +1,7 @@
|
||||
#DEFINE RMJ 2
|
||||
#DEFINE RMN 6
|
||||
#DEFINE RUP 1
|
||||
#DEFINE RTP 12
|
||||
#DEFINE BIOSVER "2.6.1"
|
||||
#DEFINE BIOSBLD "Build 13"
|
||||
#DEFINE REVISION 500
|
||||
4
Source/Build.cmd
Normal file
4
Source/Build.cmd
Normal file
@@ -0,0 +1,4 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
pushd BIOS && Powershell .\Build.ps1 %* && popd
|
||||
157
Source/Build.ps1
157
Source/Build.ps1
@@ -1,157 +0,0 @@
|
||||
param([string]$Platform = "", [string]$Config = "", [string]$RomSize = "", [string]$SYS = "", [string]$RomName = "")
|
||||
|
||||
$Platform = $Platform.ToUpper()
|
||||
while ($true)
|
||||
{
|
||||
if (($Platform -eq "N8VEM") -or ($Platform -eq "ZETA") -or ($Platform -eq "N8") -or ($Platform -eq "MK4") -or ($Platform -eq "S2I") -or ($Platform -eq "S100")) {break}
|
||||
$Platform = (Read-Host -prompt "Platform [N8VEM|ZETA|N8|MK4|S2I|S100]").Trim().ToUpper()
|
||||
}
|
||||
|
||||
while ($true)
|
||||
{
|
||||
$ConfigFile = "config_${Platform}_${Config}.asm"
|
||||
if (Test-Path $ConfigFile) {break}
|
||||
if ($Config -ne "") {Write-Host "${ConfigFile} does not exist!"}
|
||||
|
||||
"Configurations available:"
|
||||
Get-Item "config_${Platform}_*.asm" | foreach {Write-Host " >", $_.Name.Substring(8 + $Platform.Length, $_.Name.Length - 12 - $Platform.Length)}
|
||||
$Config = (Read-Host -prompt "Configuration").Trim()
|
||||
}
|
||||
|
||||
while ($true)
|
||||
{
|
||||
if (($RomSize -eq "512") -or ($RomSize -eq "1024")) {break}
|
||||
$RomSize = (Read-Host -prompt "ROM Size [512|1024]").Trim()
|
||||
}
|
||||
|
||||
if (($Platform -eq "N8") -or ($Platform -eq "MK4")) {$CPUType = "180"} else {$CPUType = "80"}
|
||||
|
||||
$SYS = $SYS.ToUpper()
|
||||
while ($true)
|
||||
{
|
||||
if (($SYS -eq "CPM") -or ($SYS -eq "ZSYS")) {break}
|
||||
$SYS = (Read-Host -prompt "System [CPM|ZSYS]").Trim().ToUpper()
|
||||
}
|
||||
|
||||
if ($RomName -eq "") {$RomName = "${Platform}_${Config}"}
|
||||
while ($RomName -eq "")
|
||||
{
|
||||
$CP = (Read-Host -prompt "ROM Name [${Config}]").Trim()
|
||||
if ($RomName -eq "") {$RomName = $Config}
|
||||
}
|
||||
|
||||
$ErrorAction = 'Stop'
|
||||
|
||||
$TasmPath = '..\tools\tasm32'
|
||||
$CpmToolsPath = '..\tools\cpmtools'
|
||||
|
||||
$env:TASMTABS = $TasmPath
|
||||
$env:PATH = $TasmPath + ';' + $CpmToolsPath + ';' + $env:PATH
|
||||
|
||||
$OutDir = "../Output"
|
||||
$RomFmt = "n8vem_rom${RomSize}"
|
||||
$BlankFile = "blank${RomSize}KB.dat"
|
||||
$RomDiskFile = "RomDisk.tmp"
|
||||
$RomFile = "${OutDir}/${RomName}.rom"
|
||||
$SysImgFile = "${OutDir}/${RomName}.sys"
|
||||
$LoaderFile = "${OutDir}/${RomName}.com"
|
||||
|
||||
""
|
||||
"Building ${RomName}: ${ROMSize}KB ROM configuration ${Config} for Z${CPUType}..."
|
||||
""
|
||||
|
||||
$TimeStamp = '"' + (Get-Date -Format 'dd-MMM-yyyy') + '"'
|
||||
|
||||
Function Asm($Component, $Opt, $Architecture=$CPUType, $Output="${Component}.bin")
|
||||
{
|
||||
$Cmd = "tasm -t${Architecture} -g3 ${Opt} ${Component}.asm ${Output}"
|
||||
$Cmd | write-host
|
||||
Invoke-Expression $Cmd | write-host
|
||||
if ($LASTEXITCODE -gt 0) {throw "TASM returned exit code $LASTEXITCODE"}
|
||||
}
|
||||
|
||||
Function Concat($InputFileList, $OutputFile)
|
||||
{
|
||||
Set-Content $OutputFile -Value $null
|
||||
foreach ($InputFile in $InputFileList)
|
||||
{
|
||||
Add-Content $OutputFile -Value ([System.IO.File]::ReadAllBytes($InputFile)) -Encoding byte
|
||||
}
|
||||
}
|
||||
|
||||
# Generate the build settings include file
|
||||
|
||||
@"
|
||||
; RomWBW Configured for ${Platform} ${Config}, $(Get-Date -Format "s")
|
||||
;
|
||||
#DEFINE TIMESTAMP ${TimeStamp}
|
||||
;
|
||||
ROMSIZE .EQU ${ROMSize} ; SIZE OF ROM IN KB
|
||||
PLATFORM .EQU PLT_${Platform} ; HARDWARE PLATFORM
|
||||
;
|
||||
; INCLUDE PLATFORM SPECIFIC DEVICE DEFINITIONS
|
||||
;
|
||||
#INCLUDE "std-n8vem.inc"
|
||||
;
|
||||
#INCLUDE "${ConfigFile}"
|
||||
;
|
||||
"@ | Out-File "build.inc" -Encoding ASCII
|
||||
|
||||
# Build components
|
||||
|
||||
if ($SYS -eq "CPM")
|
||||
{
|
||||
# Asm 'ccpb03' -Output 'cp.bin'
|
||||
# Asm 'bdosb01' -Output 'dos.bin'
|
||||
|
||||
# Copy-Item '..\cpm22\ccpb03.bin' 'cp.bin'
|
||||
# Copy-Item '..\cpm22\bdosb01.bin' 'dos.bin'
|
||||
|
||||
# Copy-Item '..\cpm22\ccp22.bin' 'cp.bin'
|
||||
# Copy-Item '..\cpm22\bdos22.bin' 'dos.bin'
|
||||
|
||||
Copy-Item '..\cpm22\os2ccp.bin' 'cp.bin'
|
||||
Copy-Item '..\cpm22\os3bdos.bin' 'dos.bin'
|
||||
}
|
||||
if ($SYS -eq "ZSYS")
|
||||
{
|
||||
Copy-Item '..\zcpr-dj\zcpr.bin' 'cp.bin'
|
||||
Copy-Item '..\zsdos\zsdos.bin' 'dos.bin'
|
||||
}
|
||||
|
||||
Asm 'syscfg'
|
||||
Asm 'cbios' "-dBLD_SYS=SYS_${SYS}"
|
||||
Asm 'dbgmon'
|
||||
Asm 'prefix'
|
||||
Asm 'bootrom'
|
||||
Asm 'bootapp'
|
||||
Asm 'loader'
|
||||
Asm 'pgzero'
|
||||
Asm 'hbios'
|
||||
Asm 'hbfill'
|
||||
Asm 'romfill'
|
||||
|
||||
# Generate result files using components above
|
||||
|
||||
"Building ${RomName} output files..."
|
||||
|
||||
Concat 'cp.bin','dos.bin','cbios.bin' 'os.bin'
|
||||
Concat 'prefix.bin','os.bin' $SysImgFile
|
||||
Concat 'pgzero.bin','bootrom.bin','syscfg.bin','loader.bin','romfill.bin','dbgmon.bin','os.bin','hbfill.bin' 'rom1.bin'
|
||||
Concat 'pgzero.bin','bootrom.bin','syscfg.bin','loader.bin','hbios.bin' 'rom2.bin'
|
||||
Concat 'bootapp.bin','syscfg.bin','loader.bin','hbios.bin','dbgmon.bin','os.bin' $LoaderFile
|
||||
|
||||
# Create the RomDisk image
|
||||
|
||||
"Building ${RomSize}KB ${RomName} ROM disk data file..."
|
||||
|
||||
Copy-Item $BlankFile $RomDiskFile
|
||||
cpmcp -f $RomFmt $RomDiskFile ../RomDsk/${SYS}_${RomSize}KB/*.* 0:
|
||||
cpmcp -f $RomFmt $RomDiskFile ../RomDsk/cfg_${Platform}_${Config}/*.* 0:
|
||||
cpmcp -f $RomFmt $RomDiskFile ../Apps/*.com 0:
|
||||
cpmcp -f $RomFmt $RomDiskFile ${OutDir}/${RomName}.sys 0:${SYS}.sys
|
||||
|
||||
Concat 'rom1.bin','rom2.bin',$RomDiskFile $RomFile
|
||||
|
||||
# Cleanup
|
||||
Remove-Item $RomDiskFile
|
||||
8
Source/BuildCommon.cmd
Normal file
8
Source/BuildCommon.cmd
Normal file
@@ -0,0 +1,8 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
pushd Apps && call Build && popd
|
||||
pushd CPM22 && call Build && popd
|
||||
pushd ZCPR && call Build && popd
|
||||
pushd ZCPR-DJ && call Build && popd
|
||||
pushd ZSDOS && call Build && popd
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user