This commit is contained in:
Wayne Warthen
2020-05-20 21:20:24 -07:00
parent 5c565f8c3e
commit 5e8e5424dc
11 changed files with 148 additions and 153 deletions

View File

@@ -17,15 +17,16 @@ echo.
echo *** CPM Loader ***
echo.
zx RMAC -CPMLDR
zx Z80ASM -UTIL/MF
copy optdsk.lib ldropts.lib
zx Z80ASM -BIOSLDR/MF
move /Y biosldr.rel biosldrd.rel
zx LINK -CPMLDRD[L100]=CPMLDR,BIOSLDRD
zx LINK -CPMLDRD[L100]=CPMLDR,BIOSLDRD,UTIL
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
zx LINK -CPMLDRC[L100]=CPMLDR,BIOSLDRC,UTIL
move /Y cpmldrc.com cpmldr.com
rem pause

View File

@@ -60,12 +60,12 @@ zpmbios3:
cp optzpm.lib options.lib
make OBJECTS=zpmbios3.spr DEST=
cpmldr.bin: biosldrd.rel cpmldr.rel
$(ZXCC) $(TOOLS)/cpm/bin/LINK -CPMLDRD[L100]=CPMLDR,BIOSLDRD
cpmldr.bin: biosldrd.rel cpmldr.rel util.rel
$(ZXCC) $(TOOLS)/cpm/bin/LINK -CPMLDRD[L100]=CPMLDR,BIOSLDRD,UTIL
mv cpmldrd.com cpmldr.bin
cpmldr.com: biosldrc.rel cpmldr.rel
$(ZXCC) $(TOOLS)/cpm/bin/LINK -CPMLDRC[L100]=CPMLDR,BIOSLDRC
cpmldr.com: biosldrc.rel cpmldr.rel util.rel
$(ZXCC) $(TOOLS)/cpm/bin/LINK -CPMLDRC[L100]=CPMLDR,BIOSLDRC,UTIL
mv cpmldrc.com cpmldr.com
biosldrc.rel: biosldr.z80 optcmd.lib

View File

@@ -4,6 +4,11 @@
maclib cpm3.lib
cseg
extrn phex16, phex8
extrn cin, cout
extrn crlf, crlf2
; BIOS Jump vector.
@@ -100,7 +105,7 @@ boot1:
jr c,selerr ; loop if below 0 entered
cp 10 ; check for over 9
jr nc,selerr ; loop if over 9
ld de,crlf ; linefeed
ld de,msgcrlf ; linefeed
call writestr ; ... to console
jr boot2 ; boot w/ unit & slice
@@ -296,6 +301,12 @@ setsec:
ld (sect),bc
ret
setdma:
;push hl
;push bc
;pop hl
;call crlf
;call phex16
;pop hl
ld (dma),bc
ret
@@ -318,32 +329,6 @@ read:
rl d ; carry bit (head) into d
jr read3 ; do the disk i/o
; ; *** Simplify this to get rid of slice!!! ***
; ld b,1 ; assume it is floppy, 1 head bit
; ld c,01h ; 1 bit head mask
; push bc ; save bc
; ld a,(slice) ; get slice
; ld e,a ; slice to E
; ld h,65 ; number of tracks per slice
; call mult8 ; HL now has track offset for slice
; pop bc ; recover bc
; push hl ; save track offset for now
; ld hl,(trk) ; get track value
; ld a,l ; lsb of track to a
; and c ; apply mask
; ld d,a ; save in d
;read1:
; srl h ; shift one bit out
; rr l ; ... of hl
; djnz read1 ; do all bits
; ld a,(sect) ; get sector
; ld e,a ; stuff it in e
; ex de,hl ; DE=track, HL=head/sect
; ex (sp),hl ; save head/sect, HL = offset
; add hl,de ; HL has final track value
; pop de ; recover head/sect to de
; jr read3
; LBA I/O
read2:
ld hl,(trk) ; get track
@@ -449,20 +434,20 @@ xmove:
ld a,9DH
halt
cin:
; Input character from console via HBIOS
ld c,080H ; console unit to C
ld b,00H ; HBIOS func: input char
call 0FFF0H ; HBIOS reads character
ld a,e ; To A for return
ret ; done
;cin:
; ; Input character from console via HBIOS
; ld c,080H ; console unit to C
; ld b,00H ; HBIOS func: input char
; call 0FFF0H ; HBIOS reads character
; ld a,e ; To A for return
; ret ; done
cout:
; Output character to console via HBIOS
ld e,a ; output char to E
ld c,080H ; console unit to C
ld b,01H ; HBIOS func: output char
jp 0FFF0H ; output & return
;cout:
; ; Output character to console via HBIOS
; ld e,a ; output char to E
; ld c,080H ; console unit to C
; ld b,01H ; HBIOS func: output char
; jp 0FFF0H ; output & return
writestr:
push af
@@ -479,19 +464,6 @@ writestr2:
pop af
ret
mult8:
; Multiply: H := H * E
ld d,0
ld l,d
ld b,8
mult8_loop:
add hl,hl
jr nc,mult8_noadd
add hl,de
mult8_noadd:
djnz mult8_loop
ret
rl32:
; Left shift DE:HL by B bits (B > 0)
or a ; clear carry
@@ -535,7 +507,7 @@ str_err_api db "HBIOS API failure","$"
msgunit db 13,10,13,10,'Boot CP/M 3 from Disk Unit: $'
msgslc db ' Slice: $'
msginv db 13,10,13,10,'*** Invalid Selection ***$'
crlf db 13,10,'$'
msgcrlf db 13,10,'$'
dpb$start:
dpb$rom: ; 384K ROM Drive
@@ -718,7 +690,16 @@ medid ds 1 ; media id
lba ds 4 ; current lba
sps ds 2 ; sectors per slice
;csvbuf ds 128 ; length (CSV) = ((DRM+1)/4)
ds 64
stack equ $
stksav ds 2
csvbufs equ 256
alvbufs equ 512
dirbufs equ 512
dtabufs equ 512
;csvbuf ds 256 ; length (CSV) = ((DRM+1)/4)
;alvbuf ds 512 ; length (ALV) = ((DSM+1)/4)
;dirbuf ds 512 ; sector buffer
;dtabuf ds 512 ; sector buffer
@@ -729,12 +710,8 @@ sps ds 2 ; sectors per slice
; in upper memory actually helps quite a bit.
csvbuf equ 8000h
alvbuf equ csvbuf + 128
dirbuf equ alvbuf + 512
dtabuf equ dirbuf + 512
ds 64
stack equ $
stksav ds 2
alvbuf equ csvbuf + csvbufs
dirbuf equ alvbuf + alvbufs
dtabuf equ dirbuf + dirbufs
end

View File

@@ -14,9 +14,12 @@
extrn @date,@hour,@min,@sec
extrn @srch1
extrn @hbbio
extrn addhla, bcd2bin, bin2bcd
extrn cout, phex8, phex16, crlf, crlf2
extrn addhla
;extrn phex16, phex8
;extrn cin, cout
;extrn crlf, crlf2
extrn bcd2bin, bin2bcd
include c:ver.lib
bdos equ 5
@@ -381,18 +384,18 @@ fill:
?ldccp:
; Force CCP to use system boot drive as initial default
ld a,(@sysdr) ; get system boot drive
ld (@ccpdr),a ; set CCP current drive
;ld a,(@sysdr) ; get system boot drive
;ld (@ccpdr),a ; set CCP current drive
; First time, load the CCP.COM file into TPA
ld a,(@sysdr) ; get system boot drive
;ld (4),a ; save in page zero???
inc a ; drive + 1 for FCB
ld (ccp$fcb),a ; stuff into FCB
add 'A' - 1 ; drive letter
ld (ccp$msg$drv),a ; save for load msg
xor a
ld (ccp$fcb+15),a
;ld a,(@sysdr) ; get system boot drive
;;ld (4),a ; save in page zero???
;inc a ; drive + 1 for FCB
;ld (ccp$fcb),a ; stuff into FCB
;add 'A' - 1 ; drive letter
;ld (ccp$msg$drv),a ; save for load msg
;xor a
;ld (ccp$fcb+15),a
ld hl,0
ld (fcb$nr),hl
ld de,ccp$fcb
@@ -683,11 +686,11 @@ signon$msg db 13,10,'ZPM3'
db 13,10,13,10,0
ccp$msg db 13,10,'BIOS Err on '
ccp$msg$drv db '?'
ccp$msg$drv db 'A'
db ': No ZCCP.COM file',0
ccp$fcb db 0,'ZCCP ','COM',0,0,0,0
ccp$fcb db 1,'ZCCP ','COM',0,0,0,0
ds 16
fcb$nr db 0,0,0
@@ -702,11 +705,11 @@ signon$msg db 13,10,'CP/M v3.0'
db 13,10,13,10,0
ccp$msg db 13,10,'BIOS Err on '
ccp$msg$drv db '?'
ccp$msg$drv db 'A'
db ': No CCP.COM file',0
ccp$fcb db 0,'CCP ','COM',0,0,0,0
ccp$fcb db 1,'CCP ','COM',0,0,0,0
ds 16
fcb$nr db 0,0,0

View File

@@ -28,11 +28,12 @@
#INCLUDE "../ver.inc"
;
; BELOW, SYS_END MUST BE SET TO THE SIZE OF CPMLDR.BIN + SYS_LOC. IF
; THE SIZE OF CPMLDR.BIN CHANGES, SYS_END MUST BE UPDATED!!!
; THE SIZE OF CPMLDR.BIN CHANGES, SYS_SIZ MUST BE UPDATED!!!
;
SYS_SIZ .EQU $0F00 ; SIZE OF CPMLDR.BIN
SYS_ENT .EQU $0100 ; SYSTEM (OS) ENTRY POINT ADDRESS
SYS_LOC .EQU $0100 ; STARTING ADDRESS TO LOAD SYSTEM IMAGE
SYS_END .EQU $1580 + SYS_LOC ; ENDING ADDRESS OF SYSTEM IMAGE
SYS_END .EQU SYS_SIZ + SYS_LOC ; ENDING ADDRESS OF SYSTEM IMAGE
;
SEC_SIZE .EQU 512 ; DISK SECTOR SIZE
BLK_SIZE .EQU 128 ; OS BLOCK/RECORD SIZE

View File

@@ -1,9 +1,10 @@
title 'Utility module for RomWBW'
maclib options.lib
public addhla, bcd2bin, bin2bcd
public phex16, phex8, cout, crlf, crlf2
public addhla
public phex16, phex8
public cin, cout
public crlf, crlf2
public bcd2bin, bin2bcd
cseg
@@ -14,45 +15,6 @@ addhla:
inc h
ret
bcd2bin:
; convert A from packed bcd to binary
push bc
ld c,a
and 0F0h
srl a
ld b,a
srl a
srl a
add a,b
ld b,a
ld a,c
and 0Fh
add a,b
pop bc
ret
bin2bcd:
; convert A from binary to packed bcd
push bc
ld b,10
ld c,-1
bin2bcd1:
inc c
sub b
jr nc,bin2bcd1
add a,b
ld b,a
ld a,c
add a,a
add a,a
add a,a
add a,a
or b
pop bc
ret
if 1
;
; Print the hex word value in HL
;
phex16:
@@ -104,16 +66,29 @@ hexconv:
daa
ret
;
; input character to A
;
cin:
push bc
push de
push hl
ld bc,0080h
rst 08
ld a,e
pop hl
pop de
pop bc
ret
;
; output character from A
;
cout:
; save all incoming registers
push af
push bc
push de
push hl
ld e,a
ld bc,0100h
ld bc,0180h
rst 08
pop hl
pop de
@@ -134,16 +109,44 @@ crlf:
call cout
pop af
ret
else
phex16:
phex8:
cout:
crlf2:
crlf:
halt
endif
;
; Convert A from packed BCD to binary
;
bcd2bin:
push bc
ld c,a
and 0F0h
srl a
ld b,a
srl a
srl a
add a,b
ld b,a
ld a,c
and 0Fh
add a,b
pop bc
ret
;
; Convert A from binary to packed BCD
;
bin2bcd:
push bc
ld b,10
ld c,-1
bin2bcd1:
inc c
sub b
jr nc,bin2bcd1
add a,b
ld b,a
ld a,c
add a,a
add a,a
add a,a
add a,a
or b
pop bc
ret
end