mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Load CP/M 3 from disk
Includes updated SYSCOPY application to put loader image on system tracks.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
;===============================================================================
|
||||
; SysCopy - Copy System Image to/from reserved tracks of disk for RomWBW
|
||||
; adaptation of CP/M 2.2
|
||||
; adaptation of CP/M 2.2 & CP/M 3
|
||||
;===============================================================================
|
||||
;
|
||||
; Author: Wayne Warthen (wwarthen@gmail.com)
|
||||
@@ -16,6 +16,7 @@
|
||||
;
|
||||
; Change Log:
|
||||
; 2016-04-24 [WBW] Updated to preserve MBR partition table
|
||||
; 2020-02-17 [WBW] Updated for CP/M 3
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; ToDo:
|
||||
@@ -27,6 +28,9 @@
|
||||
; Definitions
|
||||
;===============================================================================
|
||||
;
|
||||
false .equ 0 ; define true
|
||||
true .equ ~false ; define false
|
||||
;
|
||||
stksiz .equ $40 ; we are a stack pig
|
||||
;
|
||||
restart .equ $0000 ; CP/M restart vector
|
||||
@@ -86,6 +90,18 @@ main:
|
||||
init:
|
||||
; add check for RomWBW?
|
||||
;
|
||||
; get OS version
|
||||
ld c,12 ; BDOS get os version
|
||||
call bdos ; do it, L=version
|
||||
cp $30 ; Test for v3.0
|
||||
jr c,init1 ; if <, pre v3.0
|
||||
ld a,true ; OS v3.0 or above
|
||||
ld (v3os),a ; save it
|
||||
jr init2
|
||||
init1:
|
||||
ld a,false ; OS < v3.0
|
||||
ld (v3os),a ; save it
|
||||
init2:
|
||||
; locate cbios function table address
|
||||
ld hl,(restart+1) ; load address of CP/M restart vector
|
||||
ld de,-3 ; adjustment for start of table
|
||||
@@ -96,6 +112,20 @@ init:
|
||||
call bdos ; invoke BDOS function
|
||||
inc a ; 1-based index for fcb
|
||||
ld (defdrv),a ; save it
|
||||
; print version banner
|
||||
call crlf ; formatting
|
||||
ld de,msgban1 ; point to version message part 1
|
||||
call prtstr ; print it
|
||||
ld a,(v3os) ; get OS version flag
|
||||
or a ; set flags
|
||||
ld de,msgv2 ; point to V2 mode message
|
||||
call z,prtstr ; if V2, say so
|
||||
ld de,msgv3 ; point to V3 mode message
|
||||
call nz,prtstr ; if V3, say so
|
||||
call crlf ; formatting
|
||||
ld de,msgban2 ; point to version message part 2
|
||||
call prtstr ; print it
|
||||
call crlf ; formatting
|
||||
; return success
|
||||
xor a
|
||||
ret
|
||||
@@ -237,7 +267,7 @@ wrfil1: ; create target file
|
||||
; 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 a,(imgsiz) ; number of records to write
|
||||
ld (reccnt),a ; init record counter
|
||||
ld hl,imgbuf ; start of buffer
|
||||
ld (bufptr),hl ; init buffer pointer
|
||||
@@ -292,10 +322,8 @@ rddsk:
|
||||
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
|
||||
ld a,13 ; CBIOS func 13: Read
|
||||
ld (actfnc),a ; save it
|
||||
; read the header
|
||||
ld a,12 ; start with 1536 byte header (12 records)
|
||||
ld (reccnt),a ; initialize record counter
|
||||
@@ -339,11 +367,10 @@ wrdsk:
|
||||
ld hl,mbrbuf ; override to read
|
||||
ld (bufptr),hl ; ... into MBR buffer
|
||||
ld a,4 ; 4 records = 1 512 byte sector
|
||||
ld (reccnt),a ; initialize record counter
|
||||
; 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
|
||||
ld a,13 ; CBIOS func 13: Read
|
||||
ld (actfnc),a ; save it
|
||||
; read the existing MBR into memory
|
||||
call rwdsk ; read the sector
|
||||
ret nz ; abort on error
|
||||
@@ -366,10 +393,8 @@ wrdsk1: ; setup to write the image from memory to disk
|
||||
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
|
||||
ld a,14 ; CBIOS func 14: Write
|
||||
ld (actfnc),a ; 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
|
||||
@@ -399,7 +424,8 @@ setdsk:
|
||||
ld c,a ; move to c
|
||||
ld e,0 ; treat as first select
|
||||
call cbios ; invoke cbios with...
|
||||
.db $1B ; SELDSK entry offset
|
||||
;.db $1B ; SELDSK entry offset
|
||||
.db 9 ; SELDSK entry offset
|
||||
; check return (sets HL to DPH address)
|
||||
ld a,h
|
||||
or l
|
||||
@@ -436,29 +462,47 @@ setdsk:
|
||||
; Read or write (reccnt) sectors to/from disk via CBIOS
|
||||
;
|
||||
rwdsk:
|
||||
ld hl,128 ; assume rec len for < CP/M 3
|
||||
ld (reclen),hl ; and save it
|
||||
ld a,(v3os) ; CP/M 3 or greater?
|
||||
or a ; set flags
|
||||
jr z,rwdsk0 ; if not, continue
|
||||
; adjust reccnt, logical (128) to physical (512)
|
||||
ld a,(reccnt) ; get pending rec cnt
|
||||
add a,3 ; round up
|
||||
srl a ; shift to
|
||||
srl a ; ... divide by 4
|
||||
ld (reccnt),a ; and resave it
|
||||
ld hl,512 ; use physical rec len
|
||||
ld (reclen),hl ; and save it
|
||||
rwdsk0:
|
||||
; setup to read/write a sector
|
||||
ld bc,(acttrk) ; get active track
|
||||
call cbios ; invoke cbios with...
|
||||
.db $1E ; SETTRK entry offset
|
||||
;.db $1E ; SETTRK entry offset
|
||||
.db 10 ; SETTRK entry offset
|
||||
ld bc,(actsec) ; get active sector
|
||||
call cbios ; invoke cbios with...
|
||||
.db $21 ; SETSEC entry offset
|
||||
;.db $21 ; SETSEC entry offset
|
||||
.db 11 ; SETSEC entry offset
|
||||
ld bc,(bufptr) ; get active buffer pointer
|
||||
call cbios ; invoke cbios with...
|
||||
.db $24 ; SETDMA entry offset
|
||||
;.db $24 ; SETDMA entry offset
|
||||
.db 12 ; 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)
|
||||
rwdsk1:
|
||||
ld a,(actfnc)
|
||||
call cbiosfn
|
||||
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
|
||||
ld de,(reclen) ; get rec len
|
||||
add hl,de ; adjust buffer ptr for next record
|
||||
ld (bufptr),hl ; save it
|
||||
; next sector
|
||||
@@ -479,7 +523,7 @@ rwdsk1: ld hl,(actfnc) ; load the CBIOS function vector
|
||||
rwdsk2: ld hl,reccnt
|
||||
dec (hl) ; decrement pending record count
|
||||
ret z ; if zero, done, return with Z set
|
||||
jr rwdsk ; otherwise, loop
|
||||
jr rwdsk0 ; otherwise, loop
|
||||
;
|
||||
jphl: jp (hl) ; indirect jump
|
||||
;
|
||||
@@ -656,6 +700,15 @@ chkfcb4:
|
||||
or a ; set flags
|
||||
ret
|
||||
;
|
||||
; Print dot
|
||||
;
|
||||
prtdot:
|
||||
push af
|
||||
ld a,'.'
|
||||
call prtchr
|
||||
pop af
|
||||
ret
|
||||
;
|
||||
; Print character in A without destroying any registers
|
||||
;
|
||||
prtchr:
|
||||
@@ -775,13 +828,37 @@ delim1:
|
||||
;
|
||||
cbios:
|
||||
ex (sp),hl
|
||||
ld a,(hl) ; get the function offset
|
||||
ld a,(hl) ; get the function number
|
||||
inc hl ; point past value following call instruction
|
||||
ex (sp),hl ; put address back at top of stack and recover HL
|
||||
|
||||
cbiosfn:
|
||||
; enter here if function already in reg A
|
||||
ld (bpb_fn),a ; save function
|
||||
;
|
||||
ld a,(v3os) ; CP/M 3 or greater?
|
||||
or a ; set flags
|
||||
jr nz,cbios2 ; if >= V3, handle it
|
||||
;
|
||||
; CBIOS call for CP/M < v3
|
||||
ld a,(bpb_fn) ; get pending function number
|
||||
ld l,a ; function number to L
|
||||
add a,l ; ... and multiply by 3 for
|
||||
add a,l ; ... jump table offset
|
||||
ld hl,(cbftbl) ; address of CBIOS function table to HL
|
||||
call addhl ; determine specific function address
|
||||
jp (hl) ; invoke CBIOS
|
||||
;
|
||||
cbios2:
|
||||
; CBIOS call for CP/M v3 or greater
|
||||
ld (bpb_bc),bc
|
||||
ld (bpb_de),de
|
||||
ld (bpb_hl),hl
|
||||
|
||||
ld c,50 ; direct bios call function number
|
||||
ld de,bpb ; BIOS parameter block
|
||||
jp bdos ; return via BDOS call
|
||||
;
|
||||
; Add the value in A to HL (HL := HL + A)
|
||||
;
|
||||
addhl:
|
||||
@@ -862,10 +939,24 @@ 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)
|
||||
actfnc .db 0 ; active cbios i/o function (read or write)
|
||||
v3os .db 0 ; true ($FF) if OS v3.0 or greater
|
||||
reclen .dw 0 ; active record length
|
||||
;
|
||||
bpb: ; BIOS parameter block for CP/M 3 BIOS calls
|
||||
bpb_fn .db 0 ; function
|
||||
bpb_a .db 0 ; reg A
|
||||
bpb_bc .dw 0 ; reg BC
|
||||
bpb_de .dw 0 ; reg DE
|
||||
bpb_hl .dw 0 ; reg HL
|
||||
;
|
||||
; Messages
|
||||
;
|
||||
msgban1 .db "SYSCOPY v2.0 for RomWBW CP/M, 17-Feb-2020$"
|
||||
msgv2 .db " (CP/M 2 Mode)$"
|
||||
msgv3 .db " (CP/M 3 Mode)$"
|
||||
msgban2 .db "Copyright 2020, Wayne Warthen, GNU GPL v3$"
|
||||
|
||||
msguse .db "Usage: SYSCOPY <dest>[=<source>]$"
|
||||
msgamb .db "Ambiguous file specification not allowed$"
|
||||
msgdlm .db "Invalid delimiter$"
|
||||
|
||||
15
Source/BPBIOS/@WBW Issues.txt
Normal file
15
Source/BPBIOS/@WBW Issues.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
Loader uses CBIOS Disk I/O prior to CBOOT/WBOOT being run. As a
|
||||
result, DIOBUF is not properly initialized. At present, it is
|
||||
initialized to $7C00 which will work unless the location of the
|
||||
physical disk buffer in HBIOS ever changes!
|
||||
|
||||
The clock drivers supplied with BPBIOS (LDDS, LDP2D, and LDNZT)
|
||||
load into ZSYS user memory. If the user segment is not at the
|
||||
same location as the original BPBIOS ($E900), then the clock
|
||||
driver will just overlay other code. At present, the N config
|
||||
is OK because it does not relocate the user segment, but the T
|
||||
config fails because it uses a user segment at $E700. Note that
|
||||
this does not affect ZSDOS2 variants because they do not require
|
||||
a loadable clock driver.
|
||||
|
||||
BPBIOS needs to assign disk units dynamically via discovery of disk type
|
||||
@@ -59,6 +59,8 @@ rem if exist bpbio-ww.rel del bpbio-ww.rel
|
||||
zx ZMAC -BPBIO-WW -/P
|
||||
if exist bp%VER%.prn del bp%VER%.prn
|
||||
ren bpbio-ww.prn bp%VER%.prn
|
||||
ren bpbio-ww.err bp%VER%.err
|
||||
copy bpbio-ww.rel bp%VER%.rel
|
||||
|
||||
rem pause
|
||||
|
||||
|
||||
@@ -304,7 +304,7 @@ MEMOK:
|
||||
IF MOVCPM ; Space is critical for boot tracks
|
||||
DEFB CR,LF,'P112 - ' ; Save all bytes possible
|
||||
ELSE ; Otherwise sign on with complete name
|
||||
DEFB CR,LF,'D-X Designs P112 - '
|
||||
DEFB CR,LF,'RomWBW - '
|
||||
ENDIF
|
||||
DEFB 'B/P 50.00k Bios' ;**** Do NOT alter this string ****
|
||||
|
||||
@@ -322,7 +322,7 @@ MEMOK:
|
||||
DEFB ' ZCPR3+ Env'
|
||||
IF CLOCK
|
||||
IF DS1202
|
||||
DEFB CR,LF,' Dallas DS-1202 Clock, '
|
||||
DEFB CR,LF,' RomWBW HBIOS Clock, '
|
||||
IF CLKSET
|
||||
DEFB 'with '
|
||||
ELSE
|
||||
|
||||
@@ -115,7 +115,7 @@ HBX_INIT:
|
||||
LD (HB_SRCBNK),A
|
||||
LD (HB_DSTBNK),A
|
||||
|
||||
IF BANKED
|
||||
IF BANKED
|
||||
|
||||
; Copy vectors from TPA page zero to SYS page zero
|
||||
LD BC,(TPABNK) ; C := TPABNK, B := SYSBNK
|
||||
@@ -127,8 +127,68 @@ HBX_INIT:
|
||||
LD A,(TPABNK) ; Set all Bank regs to TPA
|
||||
|
||||
ENDIF
|
||||
|
||||
; CSEG
|
||||
;ORG_CSEG EQU $
|
||||
; DSEG
|
||||
;ORG_DSEG EQU $
|
||||
IF BANKED
|
||||
COMMON /BANK2/
|
||||
ORG_BANK2 EQU $
|
||||
COMMON /B2RAM/
|
||||
ORG_B2RAM EQU $
|
||||
ENDIF
|
||||
|
||||
CSEG
|
||||
|
||||
CALL NEWLINE2
|
||||
LD DE,HB_STR_TAG
|
||||
CALL WRITESTR
|
||||
|
||||
IF INTPXY
|
||||
LD DE,HB_STR_INTPXY
|
||||
ELSE
|
||||
LD DE,HB_STR_EXTPXY
|
||||
ENDIF
|
||||
CALL WRITESTR
|
||||
|
||||
CALL NEWLINE
|
||||
LD DE,HB_STR_CSEG
|
||||
CALL WRITESTR
|
||||
LD BC,BIOSJT
|
||||
CALL PRTHEXWORD
|
||||
LD DE,HB_STR_DSEG
|
||||
CALL WRITESTR
|
||||
LD BC,CBOOT
|
||||
CALL PRTHEXWORD
|
||||
|
||||
IF BANKED
|
||||
LD DE,HB_STR_BANK2
|
||||
CALL WRITESTR
|
||||
LD BC,ROMJT
|
||||
CALL PRTHEXWORD
|
||||
LD DE,HB_STR_B2RAM
|
||||
CALL WRITESTR
|
||||
LD BC,CBOOT0
|
||||
CALL PRTHEXWORD
|
||||
LD DE,HB_STR_RESVD
|
||||
CALL WRITESTR
|
||||
LD BC,ALV$50
|
||||
CALL PRTHEXWORD
|
||||
ENDIF
|
||||
|
||||
CALL NEWLINE
|
||||
|
||||
RET
|
||||
|
||||
HB_STR_TAG DB "HBIOS: $"
|
||||
HB_STR_INTPXY DB "Internal Proxy$"
|
||||
HB_STR_EXTPXY DB "External Proxy$"
|
||||
HB_STR_CSEG DB "CSEG=$"
|
||||
HB_STR_DSEG DB ", DSEG=$"
|
||||
HB_STR_BANK2 DB ", BANK2=$"
|
||||
HB_STR_B2RAM DB ", B2RAM=$"
|
||||
HB_STR_RESVD DB ", RESVD=$"
|
||||
|
||||
HBX_XCOPY:
|
||||
LD A,C
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
#DEFINE RMN 9
|
||||
#DEFINE RUP 2
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "2.9.2-pre.29"
|
||||
#DEFINE BIOSVER "2.9.2-pre.30"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;===============================================================================
|
||||
; BL.ASM
|
||||
; LOADER.ASM
|
||||
;
|
||||
; BOOTLOADER FOR ROMWBW DISK OPERATING SYSTEMS.
|
||||
;
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
#DEFINE RMN 9
|
||||
#DEFINE RUP 2
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "2.9.2-pre.29"
|
||||
#DEFINE BIOSVER "2.9.2-pre.30"
|
||||
|
||||
@@ -3,25 +3,31 @@ setlocal
|
||||
|
||||
set TOOLS=../../Tools
|
||||
|
||||
set PATH=%TOOLS%\zx;%TOOLS%\cpmtools;%PATH%
|
||||
set PATH=%TOOLS%\tasm32;%TOOLS%\zx;%TOOLS%\cpmtools;%PATH%
|
||||
|
||||
set TASMTABS=%TOOLS%\tasm32
|
||||
|
||||
set ZXBINDIR=%TOOLS%/cpm/bin/
|
||||
set ZXLIBDIR=%TOOLS%/cpm/lib/
|
||||
set ZXINCDIR=%TOOLS%/cpm/include/
|
||||
|
||||
rem cmd
|
||||
|
||||
rem CPM Loader
|
||||
echo.
|
||||
echo.
|
||||
echo *** CPM Loader ***
|
||||
echo.
|
||||
zx RMAC -CPMLDR
|
||||
copy optdsk.lib ldropts.lib
|
||||
zx Z80ASM -BIOSLDR/MF
|
||||
zx LINK -CPMLDR[L100]=CPMLDR,BIOSLDR
|
||||
move /Y biosldr.rel biosldrd.rel
|
||||
zx LINK -CPMLDRD[L100]=CPMLDR,BIOSLDRD
|
||||
move /Y cpmldrd.com cpmldr.bin
|
||||
copy optcmd.lib ldropts.lib
|
||||
zx Z80ASM -BIOSLDR/MF
|
||||
move /Y biosldr.rel biosldrc.rel
|
||||
zx LINK -CPMLDRC[L100]=CPMLDR,BIOSLDRC
|
||||
move /Y cpmldrc.com cpmldr.com
|
||||
rem pause
|
||||
|
||||
rem Resident CPM3
|
||||
echo.
|
||||
echo.
|
||||
echo *** Resident CPM3 BIOS ***
|
||||
@@ -41,7 +47,6 @@ zx GENCPM -AUTO -DISPLAY
|
||||
copy cpm3.sys cpm3res.sys
|
||||
rem pause
|
||||
|
||||
rem Banked CPM3
|
||||
echo.
|
||||
echo.
|
||||
echo *** Banked CPM3 BIOS ***
|
||||
@@ -61,7 +66,6 @@ zx GENCPM -AUTO -DISPLAY
|
||||
copy cpm3.sys cpm3bnk.sys
|
||||
rem pause
|
||||
|
||||
rem Banked ZPM3
|
||||
echo.
|
||||
echo.
|
||||
echo *** Banked ZPM3 BIOS ***
|
||||
@@ -82,9 +86,17 @@ rem copy cpm3.sys zpm3.sys
|
||||
rem pause
|
||||
|
||||
rem *** Resident ***
|
||||
|
||||
rem copy cpm3res.sys cpm3.sys
|
||||
rem copy genres.dat getcpm.dat
|
||||
|
||||
rem *** Banked ***
|
||||
|
||||
copy cpm3bnk.sys cpm3.sys
|
||||
copy genbnk.dat gencpm.dat
|
||||
|
||||
rem Loader
|
||||
|
||||
tasm -t80 -g3 -fFF loader.asm loader.bin loader.lst
|
||||
|
||||
copy /b loader.bin + cpmldr.bin cpmldr.sys
|
||||
|
||||
@@ -10,5 +10,6 @@ if exist *.err del *.err
|
||||
if exist *.lst del *.lst
|
||||
if exist *.sym del *.sym
|
||||
if exist *.sys del *.sys
|
||||
if exist *.bin del *.bin
|
||||
if exist gencpm.dat del gencpm.dat
|
||||
if exist options.lib del options.lib
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
|
||||
maclib ldropts.lib
|
||||
|
||||
maclib cpm3.lib
|
||||
|
||||
cseg
|
||||
@@ -50,16 +52,13 @@
|
||||
jp 0 ; reserved for future expansion
|
||||
|
||||
boot:
|
||||
;ld bc,0F8E0h ; HBIOS func: get boot info
|
||||
;call 0FFF0h ; do it, D := boot unit
|
||||
;ld a,d ; move to A
|
||||
;ld (unit),a ; save it
|
||||
;ret
|
||||
|
||||
if cmdline
|
||||
|
||||
boot1:
|
||||
ld (stksav),sp
|
||||
ld sp,stack
|
||||
|
||||
boot1:
|
||||
ld de,prompt
|
||||
call writestr
|
||||
|
||||
@@ -86,12 +85,19 @@ boot1:
|
||||
ld l,0 ; Bank
|
||||
call 0FFF0h ; do it
|
||||
|
||||
else
|
||||
|
||||
ld bc,0F8E0h ; HBIOS func: get boot info
|
||||
call 0FFF0h ; do it, D := boot unit
|
||||
ld a,d ; move to A
|
||||
ld (unit),a ; save it
|
||||
|
||||
endif
|
||||
|
||||
ld a,(unit) ; Get boot unit
|
||||
ld c,a ; put in C
|
||||
ld b,18h ; HBIOS Media function
|
||||
ld e,1 ; Enabled media check/discovery
|
||||
ld e,1 ; Enable media check/discovery
|
||||
call 0FFF0H ; HBIOS call
|
||||
ld a,e ; Resultant media id to accum
|
||||
or a ; Set flags
|
||||
@@ -110,7 +116,6 @@ dsk$login1:
|
||||
|
||||
; hl is ptr to desired dpb
|
||||
ld de,dph0 ; load DPH pointer
|
||||
;halt
|
||||
ex de,hl ; de = DPB adr, hl = DPH adr
|
||||
push de ; save DPB adr
|
||||
ld de,12 ; offset of DPB in DPH
|
||||
|
||||
7
Source/CPM3/ldropts.lib
Normal file
7
Source/CPM3/ldropts.lib
Normal file
@@ -0,0 +1,7 @@
|
||||
; global assembler options for CP/M loader
|
||||
; when loading from a command line
|
||||
|
||||
true equ -1
|
||||
false equ not true
|
||||
|
||||
cmdline equ true
|
||||
228
Source/CPM3/loader.asm
Normal file
228
Source/CPM3/loader.asm
Normal file
@@ -0,0 +1,228 @@
|
||||
;===============================================================================
|
||||
; LOADER.ASM
|
||||
;
|
||||
; BOOTLOADER FOR ROMWBW DISK OPERATING SYSTEMS.
|
||||
;
|
||||
; CP/M DISK FORMATS ALLOW FOR RESERVED TRACKS THAT CONTAIN AN IMAGE OF THE
|
||||
; OPERATING SYSTEM TO BE LOADED WHEN THE DISK IS BOOTED. THE OPERATING SYSTEM
|
||||
; IMAGE ITSELF IS NORMALLY PREFIXED BY A 1-N SECTORS CONTAINING OS BOOTSTRAP
|
||||
; CODE AND DISK METADATA.
|
||||
;
|
||||
; THE RETROBREW COMPUTING GROUP HAS BEEN USING A CONVENTION OF PREFIXING THE
|
||||
; OS IMAGE WITH 3 SECTORS (512 BYTES X 3 FOR A TOTAL OF 1536 BYTES):
|
||||
;
|
||||
; SECTOR 1: IBM-PC STYLE BOOT BLOCK CONTAINING BOOTSTRAP,
|
||||
; PARTITION TABLE, AND BOOT SIGNATURE
|
||||
; SECTOR 2: RESERVED
|
||||
; SECTOR 3: METADATA
|
||||
;
|
||||
; THE HARDWARE BIOS IS EXPECTED TO READ AND LOAD THE FIRST TWO SECTORS FROM THE
|
||||
; DISK TO MEMORY ADDRESS $8000 AND JUMP TO THAT LOCATION TO BEGIN THE BOOT
|
||||
; PROCESS. THE BIOS IS EXPECTED TO VERIFY THAT A STANDARD BOOT SIGNATURE
|
||||
; OF $55, $AA IS PRESENT AT OFFSET $1FE-$1FF. IF THE SIGNATURE IS NOT FOUND,
|
||||
; THE BIOS SHOULD ASSUME THE DISK HAS NOT BEEN PROPERLY INITIALIZED AND SHOULD
|
||||
; NOT JUMP TO THE LOAD ADDRESS.
|
||||
;
|
||||
;===============================================================================
|
||||
;
|
||||
#INCLUDE "../HBIOS/ver.inc"
|
||||
;
|
||||
SYS_ENT .EQU $0100 ; SYSTEM (OS) ENTRY POINT ADDRESS
|
||||
SYS_LOC .EQU $0100 ; STARTING ADDRESS TO LOAD SYSTEM IMAGE
|
||||
SYS_END .EQU $1480 ; ENDING ADDRESS OF SYSTEM IMAGE
|
||||
;
|
||||
BYT .EQU 1 ; used to describe METADATA_SIZE below
|
||||
WRD .EQU 2
|
||||
;
|
||||
SECTOR_SIZE .EQU 512
|
||||
BLOCK_SIZE .EQU 128
|
||||
PREFIX_SIZE .EQU (3 * SECTOR_SIZE) ; 3 SECTORS
|
||||
METADATA_SIZE .EQU BYT+WRD+(4*BYT)+16+BYT+WRD+WRD+WRD+WRD ; (as defined below)
|
||||
;
|
||||
PARTTBL_LOC .EQU $1BE
|
||||
PARTTBL_SIZ .EQU $40
|
||||
BOOTSIG_LOC .EQU $1FE
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; SECTOR 1
|
||||
;
|
||||
; THIS SECTOR FOLLOWS THE CONVENTIONS OF AN IBM-PC MBR CONTAINING THE OS
|
||||
; BOOTSTRAP CODE, PARTITION TABLE, AND BOOT SIGNATURE
|
||||
;
|
||||
;----------------------------------------------------------------------------
|
||||
;
|
||||
; THE FOLLOWING BOOTSTRAP CODE IS BUILT TO ASSUME IT WILL BE EXECUTED AT A STARTING
|
||||
; ADDRESS OF $8000.
|
||||
;
|
||||
.ORG $8000
|
||||
JR BOOT
|
||||
;
|
||||
BOOT:
|
||||
LD DE,STR_LOAD ; LOADING STRING
|
||||
CALL PRTSTR ; PRINT
|
||||
CALL PRTDOT ; PROGRESS
|
||||
;
|
||||
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 C,$42 ; UNA FUNC: READ SECTORS
|
||||
LD DE,$D000 ; STARTING ADDRESS FOR IMAGE
|
||||
LD L,22 ; READ 22 SECTORS
|
||||
CALL $FFFD ; DO READ
|
||||
JR NZ,ERROR ; HANDLE ERROR
|
||||
CALL PRTDOT ; PROGRESS
|
||||
;
|
||||
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 SYS_ENT ; GO TO SYSTEM
|
||||
;
|
||||
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
|
||||
CALL $FFFD ; PRINT
|
||||
POP HL
|
||||
POP BC
|
||||
RET
|
||||
;
|
||||
PRTDOT:
|
||||
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 STRING
|
||||
CALL PRTSTR ; PRINT IT
|
||||
HALT ; HALT
|
||||
;
|
||||
; DATA
|
||||
;
|
||||
STR_LOAD .DB "\r\nLoading",0
|
||||
STR_DONE .DB "\r\n",0
|
||||
STR_ERR .DB " Read Error!",0
|
||||
;
|
||||
.ORG $ - $8000 ; RESTORE ORG
|
||||
.FILL PARTTBL_LOC - $ ; FILL TO START OF PARTITION TABLE
|
||||
;
|
||||
; RESERVE SPACE FOR STANDARD IBM-PC PARTITION TABLE. ALTHOUGH A
|
||||
; PARTITION TABLE IS NOT RELEVANT FOR A FLOPPY DISK, IT DOES NO HARM.
|
||||
; THE CONTENTS OF THE PARTITION TABLE MUST BE MANAGED BY FDISK80.
|
||||
;
|
||||
PARTTBL .FILL PARTTBL_SIZ,$00 ; PARTITION TABLE, FILL WITH ZEROES
|
||||
;
|
||||
; THE END OF THE FIRST SECTOR MUST CONTAIN THE TWO BYTE BOOT
|
||||
; SIGNATURE.
|
||||
;
|
||||
BOOTSIG .DB $55,$AA ; STANDARD BOOT SIGNATURE
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; SECTOR 2
|
||||
;
|
||||
; THIS SECTOR HAS NOT BEEN DEFINED AND IS RESERVED.
|
||||
;
|
||||
;----------------------------------------------------------------------------
|
||||
;
|
||||
.FILL 512,0 ; JUST FILL SECTOR WITH ZEROES
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; SECTOR 3
|
||||
;
|
||||
; OS AND DISK METADATA
|
||||
;
|
||||
;----------------------------------------------------------------------------
|
||||
;
|
||||
.FILL 128 * 3,0 ; FIRST 384 BYTES ARE NOT YET DEFINED
|
||||
;
|
||||
; THE FOLLOWING TWO BYTES ARE AN ADDITIONAL SIGNATURE THAT IS VERIFIED BY
|
||||
; SOME HARDWARE BIOSES.
|
||||
;
|
||||
PR_SIG .DB $5A,$A5 ; SIGNATURE GOES HERE
|
||||
;
|
||||
; FIRST CHUNK OF METADATA IMMEDIATELY FOLLOWS THE SIGNATURE BYTES
|
||||
;
|
||||
PR_PLATFORM .DB 0 ; PLATFORM ID (SEE STD.ASM)
|
||||
PR_DEVICE .DB 0 ; ? (PROBABLY UNUSED)
|
||||
PR_FORMATTER .DB 0,0,0,0,0,0,0,0 ; ? (PROBABLY UNUSED)
|
||||
PR_DRIVE .DB 0 ; ? (PROBABLY UNUSED)
|
||||
PR_LOG_UNIT .DW 0 ; ? (PROBABLY UNUSED)
|
||||
;
|
||||
; FILLER TO PLACE SECOND CHUNK OF METADATA AT THE END OF THE SECTOR
|
||||
;
|
||||
.FILL ((PREFIX_SIZE - METADATA_SIZE) - $),00H
|
||||
;
|
||||
; SECOND CHUNK OF METADATA
|
||||
;
|
||||
PR_WP .DB 0 ; WRITE PROTECT BOOLEADN
|
||||
PR_UPDSEQ .DW 0 ; PREFIX UPDATE SEQUENCE NUMBER (DEPRECATED?)
|
||||
PR_VER .DB RMJ,RMN,RUP,RTP ; OS BUILD VERSION
|
||||
PR_LABEL .DB "Unlabeled Drive ","$" ; DISK LABEL (EXACTLY 16 BYTES!!!)
|
||||
.DW 0 ; DEPRECATED
|
||||
PR_LDLOC .DW SYS_LOC ; ADDRESS TO START LOADING SYSTEM
|
||||
PR_LDEND .DW SYS_END ; ADDRESS TO STOP LOADING SYSTEM
|
||||
PR_ENTRY .DW SYS_ENT ; ADDRESS TO ENTER SYSTEM (OS)
|
||||
;
|
||||
;
|
||||
;
|
||||
.END
|
||||
7
Source/CPM3/optcmd.lib
Normal file
7
Source/CPM3/optcmd.lib
Normal file
@@ -0,0 +1,7 @@
|
||||
; global assembler options for CP/M loader
|
||||
; when loading from a command line
|
||||
|
||||
true equ -1
|
||||
false equ not true
|
||||
|
||||
cmdline equ true
|
||||
7
Source/CPM3/optdsk.lib
Normal file
7
Source/CPM3/optdsk.lib
Normal file
@@ -0,0 +1,7 @@
|
||||
; global assembler options for CP/M loader
|
||||
; when loading from a boot disk
|
||||
|
||||
true equ -1
|
||||
false equ not true
|
||||
|
||||
cmdline equ false
|
||||
@@ -3,5 +3,5 @@ rmn equ 9
|
||||
rup equ 2
|
||||
rtp equ 0
|
||||
biosver macro
|
||||
db "2.9.2-pre.29"
|
||||
db "2.9.2-pre.30"
|
||||
endm
|
||||
|
||||
@@ -680,7 +680,7 @@ GOBOOTDISK:
|
||||
OR A ; CLEAR CARRY
|
||||
SBC HL,DE ; HL := LENGTH TO LOAD
|
||||
LD A,H ; DETERMINE 512 BYTE SECTOR COUNT
|
||||
RRCA ; ... BY DIVIDING MSB BY TWO
|
||||
RRA ; ... BY DIVIDING MSB BY TWO
|
||||
LD (BL_COUNT),A ; ... AND SAVE IT
|
||||
;
|
||||
#IF (BIOS == BIOS_UNA)
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
#DEFINE RMN 9
|
||||
#DEFINE RUP 2
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "2.9.2-pre.29"
|
||||
#DEFINE BIOSVER "2.9.2-pre.30"
|
||||
|
||||
@@ -12,8 +12,8 @@ echo :
|
||||
call BuildFD.cmd cpm22 ..\cpm22\cpm_wbw.sys
|
||||
call BuildFD.cmd zsdos ..\zsdos\zsys_wbw.sys
|
||||
call BuildFD.cmd nzcom ..\zsdos\zsys_wbw.sys
|
||||
call BuildFD.cmd cpm3
|
||||
call BuildFD.cmd zpm3
|
||||
call BuildFD.cmd cpm3 ..\cpm3\cpmldr.sys
|
||||
call BuildFD.cmd zpm3 ..\cpm3\cpmldr.sys
|
||||
call BuildFD.cmd ws4
|
||||
|
||||
echo :
|
||||
@@ -22,8 +22,8 @@ echo :
|
||||
call BuildHD.cmd cpm22 ..\cpm22\cpm_wbw.sys
|
||||
call BuildHD.cmd zsdos ..\zsdos\zsys_wbw.sys
|
||||
call BuildHD.cmd nzcom ..\zsdos\zsys_wbw.sys
|
||||
call BuildHD.cmd cpm3
|
||||
call BuildHD.cmd zpm3
|
||||
call BuildHD.cmd cpm3 ..\cpm3\cpmldr.sys
|
||||
call BuildHD.cmd zpm3 ..\cpm3\cpmldr.sys
|
||||
call BuildHD.cmd ws4
|
||||
|
||||
if exist ..\BPBIOS\bpbio-ww.rel call BuildHD.cmd bp
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#
|
||||
../BPBIOS/*.img 0:
|
||||
../BPBIOS/*.rel 0:
|
||||
../BPBIOS/*.zrl 0:
|
||||
../BPBIOS/*.zex 0:
|
||||
../BPBIOS/myterm.z3t 0:
|
||||
../BPBIOS/Z34RCP11/z34rcp11.rel 0:rcp.zrl
|
||||
|
||||
@@ -19,4 +19,8 @@
|
||||
# Add Tune application and sample files
|
||||
#
|
||||
../../Binary/Apps/tune.com 3:
|
||||
../../Binary/Apps/Tunes/*.* 3:
|
||||
../../Binary/Apps/Tunes/*.* 3:
|
||||
#
|
||||
# Add OS image
|
||||
#
|
||||
../CPM22/cpm_wbw.sys 0:cpm.sys
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
# Add files from CPM3 build
|
||||
#
|
||||
../CPM3/cpmldr.com 0:
|
||||
../CPM3/cpmldr.sys 0:
|
||||
../CPM3/ccp.com 0:
|
||||
../CPM3/gencpm.com 0:
|
||||
../CPM3/genres.dat 0:
|
||||
|
||||
@@ -19,4 +19,9 @@
|
||||
# Add Tune application and sample files
|
||||
#
|
||||
../../Binary/Apps/tune.com 3:
|
||||
../../Binary/Apps/Tunes/*.* 3:
|
||||
../../Binary/Apps/Tunes/*.* 3:
|
||||
#
|
||||
# Add OS images
|
||||
#
|
||||
../CPM22/cpm_wbw.sys 0:cpm.sys
|
||||
../ZSDOS/zsys_wbw.sys 0:zsys.sys
|
||||
@@ -2,7 +2,9 @@
|
||||
# Add files from CPM3 build
|
||||
#
|
||||
../ZPM3/zpmldr.com 0:
|
||||
../ZPM3/cpmldr.com 0:
|
||||
../ZPM3/zpmldr.sys 0:
|
||||
../CPM3/cpmldr.com 0:
|
||||
../CPM3/cpmldr.sys 0:
|
||||
../ZPM3/autotog.com 0:
|
||||
../ZPM3/clrhist.com 0:
|
||||
../ZPM3/setz3.com 0:
|
||||
|
||||
@@ -19,4 +19,8 @@
|
||||
# Add Tune application and sample files
|
||||
#
|
||||
../../Binary/Apps/tune.com 3:
|
||||
../../Binary/Apps/Tunes/*.* 3:
|
||||
../../Binary/Apps/Tunes/*.* 3:
|
||||
#
|
||||
# Add OS image
|
||||
#
|
||||
../ZSDOS/zsys_wbw.sys 0:zsys.sys
|
||||
@@ -3,7 +3,9 @@ setlocal
|
||||
|
||||
set TOOLS=../../Tools
|
||||
|
||||
set PATH=%TOOLS%\zx;%TOOLS%\cpmtools;%PATH%
|
||||
set PATH=%TOOLS%\tasm32;%TOOLS%\zx;%TOOLS%\cpmtools;%PATH%
|
||||
|
||||
set TASMTABS=%TOOLS%\tasm32
|
||||
|
||||
set ZXBINDIR=%TOOLS%/cpm/bin/
|
||||
set ZXLIBDIR=%TOOLS%/cpm/lib/
|
||||
@@ -15,15 +17,19 @@ copy ..\ZCCP\startzpm.com .
|
||||
copy ..\CPM3\genbnk.dat .
|
||||
copy ..\CPM3\zpmbios3.spr bnkbios3.spr
|
||||
copy ..\CPM3\gencpm.com .
|
||||
copy ..\CPM3\biosldr.rel .
|
||||
copy ..\CPM3\cpmldr.com .
|
||||
copy ..\CPM3\biosldrd.rel .
|
||||
copy ..\CPM3\biosldrc.rel .
|
||||
rem copy ..\CPM3\cpmldr.com .
|
||||
|
||||
rem ZPM Loader
|
||||
echo.
|
||||
echo.
|
||||
echo *** ZPM Loader ***
|
||||
echo.
|
||||
zx LINK -ZPMLDR[L100]=ZPM3LDR,BIOSLDR
|
||||
zx LINK -ZPMLDRD[L100]=ZPM3LDR,BIOSLDRD
|
||||
move /Y zpmldrd.com zpmldr.bin
|
||||
zx LINK -ZPMLDRC[L100]=ZPM3LDR,BIOSLDRC
|
||||
move /Y zpmldrc.com zpmldr.com
|
||||
rem pause
|
||||
|
||||
rem Banked ZPM3
|
||||
@@ -34,3 +40,9 @@ echo.
|
||||
copy genbnk.dat gencpm.dat
|
||||
zx gencpm -auto -display
|
||||
rem pause
|
||||
|
||||
rem Loader
|
||||
|
||||
tasm -t80 -g3 -fFF loader.asm loader.bin loader.lst
|
||||
|
||||
copy /b loader.bin + zpmldr.bin zpmldr.sys
|
||||
|
||||
@@ -16,3 +16,6 @@ if exist cpmldr.com del cpmldr.com
|
||||
if exist startzpm.com del startzpm.com
|
||||
if exist gencpm.com del gencpm.com
|
||||
if exist *.dat del *.dat
|
||||
if exist biosldr?.rel del biosldr?.rel
|
||||
if exist *.bin del *.bin
|
||||
if exist *.lst del *.lst
|
||||
|
||||
228
Source/ZPM3/loader.asm
Normal file
228
Source/ZPM3/loader.asm
Normal file
@@ -0,0 +1,228 @@
|
||||
;===============================================================================
|
||||
; LOADER.ASM
|
||||
;
|
||||
; BOOTLOADER FOR ROMWBW DISK OPERATING SYSTEMS.
|
||||
;
|
||||
; CP/M DISK FORMATS ALLOW FOR RESERVED TRACKS THAT CONTAIN AN IMAGE OF THE
|
||||
; OPERATING SYSTEM TO BE LOADED WHEN THE DISK IS BOOTED. THE OPERATING SYSTEM
|
||||
; IMAGE ITSELF IS NORMALLY PREFIXED BY A 1-N SECTORS CONTAINING OS BOOTSTRAP
|
||||
; CODE AND DISK METADATA.
|
||||
;
|
||||
; THE RETROBREW COMPUTING GROUP HAS BEEN USING A CONVENTION OF PREFIXING THE
|
||||
; OS IMAGE WITH 3 SECTORS (512 BYTES X 3 FOR A TOTAL OF 1536 BYTES):
|
||||
;
|
||||
; SECTOR 1: IBM-PC STYLE BOOT BLOCK CONTAINING BOOTSTRAP,
|
||||
; PARTITION TABLE, AND BOOT SIGNATURE
|
||||
; SECTOR 2: RESERVED
|
||||
; SECTOR 3: METADATA
|
||||
;
|
||||
; THE HARDWARE BIOS IS EXPECTED TO READ AND LOAD THE FIRST TWO SECTORS FROM THE
|
||||
; DISK TO MEMORY ADDRESS $8000 AND JUMP TO THAT LOCATION TO BEGIN THE BOOT
|
||||
; PROCESS. THE BIOS IS EXPECTED TO VERIFY THAT A STANDARD BOOT SIGNATURE
|
||||
; OF $55, $AA IS PRESENT AT OFFSET $1FE-$1FF. IF THE SIGNATURE IS NOT FOUND,
|
||||
; THE BIOS SHOULD ASSUME THE DISK HAS NOT BEEN PROPERLY INITIALIZED AND SHOULD
|
||||
; NOT JUMP TO THE LOAD ADDRESS.
|
||||
;
|
||||
;===============================================================================
|
||||
;
|
||||
#INCLUDE "../HBIOS/ver.inc"
|
||||
;
|
||||
SYS_ENT .EQU $0100 ; SYSTEM (OS) ENTRY POINT ADDRESS
|
||||
SYS_LOC .EQU $0100 ; STARTING ADDRESS TO LOAD SYSTEM IMAGE
|
||||
SYS_END .EQU $1480 ; ENDING ADDRESS OF SYSTEM IMAGE
|
||||
;
|
||||
BYT .EQU 1 ; used to describe METADATA_SIZE below
|
||||
WRD .EQU 2
|
||||
;
|
||||
SECTOR_SIZE .EQU 512
|
||||
BLOCK_SIZE .EQU 128
|
||||
PREFIX_SIZE .EQU (3 * SECTOR_SIZE) ; 3 SECTORS
|
||||
METADATA_SIZE .EQU BYT+WRD+(4*BYT)+16+BYT+WRD+WRD+WRD+WRD ; (as defined below)
|
||||
;
|
||||
PARTTBL_LOC .EQU $1BE
|
||||
PARTTBL_SIZ .EQU $40
|
||||
BOOTSIG_LOC .EQU $1FE
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; SECTOR 1
|
||||
;
|
||||
; THIS SECTOR FOLLOWS THE CONVENTIONS OF AN IBM-PC MBR CONTAINING THE OS
|
||||
; BOOTSTRAP CODE, PARTITION TABLE, AND BOOT SIGNATURE
|
||||
;
|
||||
;----------------------------------------------------------------------------
|
||||
;
|
||||
; THE FOLLOWING BOOTSTRAP CODE IS BUILT TO ASSUME IT WILL BE EXECUTED AT A STARTING
|
||||
; ADDRESS OF $8000.
|
||||
;
|
||||
.ORG $8000
|
||||
JR BOOT
|
||||
;
|
||||
BOOT:
|
||||
LD DE,STR_LOAD ; LOADING STRING
|
||||
CALL PRTSTR ; PRINT
|
||||
CALL PRTDOT ; PROGRESS
|
||||
;
|
||||
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 C,$42 ; UNA FUNC: READ SECTORS
|
||||
LD DE,$D000 ; STARTING ADDRESS FOR IMAGE
|
||||
LD L,22 ; READ 22 SECTORS
|
||||
CALL $FFFD ; DO READ
|
||||
JR NZ,ERROR ; HANDLE ERROR
|
||||
CALL PRTDOT ; PROGRESS
|
||||
;
|
||||
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 SYS_ENT ; GO TO SYSTEM
|
||||
;
|
||||
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
|
||||
CALL $FFFD ; PRINT
|
||||
POP HL
|
||||
POP BC
|
||||
RET
|
||||
;
|
||||
PRTDOT:
|
||||
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 STRING
|
||||
CALL PRTSTR ; PRINT IT
|
||||
HALT ; HALT
|
||||
;
|
||||
; DATA
|
||||
;
|
||||
STR_LOAD .DB "\r\nLoading",0
|
||||
STR_DONE .DB "\r\n",0
|
||||
STR_ERR .DB " Read Error!",0
|
||||
;
|
||||
.ORG $ - $8000 ; RESTORE ORG
|
||||
.FILL PARTTBL_LOC - $ ; FILL TO START OF PARTITION TABLE
|
||||
;
|
||||
; RESERVE SPACE FOR STANDARD IBM-PC PARTITION TABLE. ALTHOUGH A
|
||||
; PARTITION TABLE IS NOT RELEVANT FOR A FLOPPY DISK, IT DOES NO HARM.
|
||||
; THE CONTENTS OF THE PARTITION TABLE MUST BE MANAGED BY FDISK80.
|
||||
;
|
||||
PARTTBL .FILL PARTTBL_SIZ,$00 ; PARTITION TABLE, FILL WITH ZEROES
|
||||
;
|
||||
; THE END OF THE FIRST SECTOR MUST CONTAIN THE TWO BYTE BOOT
|
||||
; SIGNATURE.
|
||||
;
|
||||
BOOTSIG .DB $55,$AA ; STANDARD BOOT SIGNATURE
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; SECTOR 2
|
||||
;
|
||||
; THIS SECTOR HAS NOT BEEN DEFINED AND IS RESERVED.
|
||||
;
|
||||
;----------------------------------------------------------------------------
|
||||
;
|
||||
.FILL 512,0 ; JUST FILL SECTOR WITH ZEROES
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; SECTOR 3
|
||||
;
|
||||
; OS AND DISK METADATA
|
||||
;
|
||||
;----------------------------------------------------------------------------
|
||||
;
|
||||
.FILL 128 * 3,0 ; FIRST 384 BYTES ARE NOT YET DEFINED
|
||||
;
|
||||
; THE FOLLOWING TWO BYTES ARE AN ADDITIONAL SIGNATURE THAT IS VERIFIED BY
|
||||
; SOME HARDWARE BIOSES.
|
||||
;
|
||||
PR_SIG .DB $5A,$A5 ; SIGNATURE GOES HERE
|
||||
;
|
||||
; FIRST CHUNK OF METADATA IMMEDIATELY FOLLOWS THE SIGNATURE BYTES
|
||||
;
|
||||
PR_PLATFORM .DB 0 ; PLATFORM ID (SEE STD.ASM)
|
||||
PR_DEVICE .DB 0 ; ? (PROBABLY UNUSED)
|
||||
PR_FORMATTER .DB 0,0,0,0,0,0,0,0 ; ? (PROBABLY UNUSED)
|
||||
PR_DRIVE .DB 0 ; ? (PROBABLY UNUSED)
|
||||
PR_LOG_UNIT .DW 0 ; ? (PROBABLY UNUSED)
|
||||
;
|
||||
; FILLER TO PLACE SECOND CHUNK OF METADATA AT THE END OF THE SECTOR
|
||||
;
|
||||
.FILL ((PREFIX_SIZE - METADATA_SIZE) - $),00H
|
||||
;
|
||||
; SECOND CHUNK OF METADATA
|
||||
;
|
||||
PR_WP .DB 0 ; WRITE PROTECT BOOLEADN
|
||||
PR_UPDSEQ .DW 0 ; PREFIX UPDATE SEQUENCE NUMBER (DEPRECATED?)
|
||||
PR_VER .DB RMJ,RMN,RUP,RTP ; OS BUILD VERSION
|
||||
PR_LABEL .DB "Unlabeled Drive ","$" ; DISK LABEL (EXACTLY 16 BYTES!!!)
|
||||
.DW 0 ; DEPRECATED
|
||||
PR_LDLOC .DW SYS_LOC ; ADDRESS TO START LOADING SYSTEM
|
||||
PR_LDEND .DW SYS_END ; ADDRESS TO STOP LOADING SYSTEM
|
||||
PR_ENTRY .DW SYS_ENT ; ADDRESS TO ENTER SYSTEM (OS)
|
||||
;
|
||||
;
|
||||
;
|
||||
.END
|
||||
@@ -2,4 +2,4 @@
|
||||
#DEFINE RMN 9
|
||||
#DEFINE RUP 2
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "2.9.2-pre.29"
|
||||
#DEFINE BIOSVER "2.9.2-pre.30"
|
||||
|
||||
Reference in New Issue
Block a user