復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第154回]
●CP/M互換DOS(仮RAMディスク版)ZBDOSプログラムのソースリスト
今回は前回に続いて、出来あがりましたCP/M互換DOS(仮RAMディスク版)ZBDOSプログラムのソースリストをお見せします。
;bdos for nd80z3
;CP/M2.2 compatible
;2012/5/6 5/7 5/8 5/9 5/11 5/12 5/13 5/14 5/15 5/16
;5/17 5/19 5/20 5/21 5/22 5/23 5/25 5/28 5/29 5/31
;6/1 6/2 6/7 6/8
;
ORG $C406
;
B_BOOT=$D200
B_WBOOT=$D203
B_CONST=$D206
B_CONIN=$D209
B_CONOUT=$D20C
B_LIST=$D20F
B_PUNCH=$D212
B_READER=$D215
B_HOME=$D218
B_SELDSK=$D21B
B_SETTRK=$D21E
B_SETSEC=$D221
B_SETDMA=$D224
B_READ=$D227
B_WRITE=$D22A
B_PRSTAT=$D22D
SECTRN=$D230
ZREENT=$D236
;
IOBYTE=$8003
;
CURDRVVCT=$D000
ROVCT=$D002
CURDRV=$D004
CDRV_DIRWK=$D005
DMABFADRS=$D006
DIRTRK=$D008
DIRSCT=$D009
FNPOS=$D00A;in DIR all
FNPOSS=$D00B;in SECTOR
SAVECNTR=$D00C;-D00D
DIRCNTR=$D00E
DRVCHR=$D00F
;
DPARAM=$D010;to $D02E
DIRADRS=$D018
DPTOP=$D01A
CSVTOP=$D01C
ALVTOP=$D01E
SEC=$D020;SECTORS PER TRACK/DISK PARAMETER TOP
BLKSFT=$D022
BLKMSK=$D023
;
BLKMAX=$D025
DIRMAX=$D027
DIRALC=$D029
;
SYSFCB=$D03C
SYSFCBEX=$D048
SYSFCBRC=$D04B
SYSFCBALC=$D04C;=SYSFCB2
SYSFCBCR=$D05C
;D05D-D05F reserved
INDATA=$D060
CURROMK=$D061
DIRBFADRS=$D062
CURSOR=$D064;-D065;D065 is dummy
CONBFINWK=$D066;-D067
CURSORWK=$D068
RWSW=$D069
;
CONINBF=$D0FE;-D1FE
;
;BDOS ENTRY
;
JP BDOS
;jump table
JP SYSRES;00
JP CONIN;01
JP CONOUT;02
JP RDRIN;03
JP PUNOUT;04
JP LSTOUT;05
JP CONINOT;06
JP IOBYTERD;07
JP IOBYTESET;08
JP DEOUT;09
JP CONBFIN;0A
JP CONCHK;0B
JP VERRD;0C
JP DISKRES;0D
JP DRVNOSET;0E
JP OPEN;0F
JP CLOSE;10
JP SRCHFST;11
JP SRCHNXT;12
JP DELETE;13
JP SEQRD;14
JP SEQWR;15
JP NEWOPEN;16
JP RENAME;17
JP CURDRVVCTRD;18
JP CURDRVNORD;19
JP DMAADRSSET;1A
JP ALVADRSRD;1B
JP WPSET;1C
JP ROVRD;1D
JP ATTRSET;1E
JP DPARAMRD;1F
JP RNDMRD;21
JP RNDMWR;22
JP FSIZERD;23
JP RNDMNOSET;24
JP DRVVCTRES;25
JP RNDMWR0;28
;
JP ALVSET
;
BDOS:LD L,C
LD H,00
ADD HL,HL
LD BC,FNCTBL
ADD HL,BC
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
JP (HL)
;
FNCTBL:DW SYSRES;00
DW CONIN;01
DW CONOUT;02
DW RDRIN;03
DW PUNOUT;04
DW LSTOUT;05
DW CONINOT;06
DW IOBYTERD;07
DW IOBYTESET;08
DW DEOUT;09
DW CONBFIN;0A
DW CONCHK;0B
DW VERRD;0C
DW DISKRES;0D
DW DRVNOSET;0E
DW OPEN;0F
DW CLOSE;10
DW SRCHFST;11
DW SRCHNXT;12
DW DELETE;13
DW SEQRD;14
DW SEQWR;15
DW NEWOPEN;16
DW RENAME;17
DW CURDRVVCTRD;18
DW CURDRVNORD;19
DW DMAADRSSET;1A
DW ALVADRSRD;1B
DW WPSET;1C
DW ROVRD;1D
DW ATTRSET;1E
DW DPARAMRD;1F
DW UNDEFINE;20
DW RNDMRD;21
DW RNDMWR;22
DW FSIZERD;23
DW RNDMNOSET;24
DW DRVVCTRES;25
DW UNDEFINE;26
DW UNDEFINE;27
DW RNDMWR0;28
;
;SYSTEM RESET FCALL 00
;
SYSRES:RET
;
;CONSOLE INPUT FCALL 01
;
CONIN:CALL CONINSB
PUSH DE
PUSH AF
LD E,A
CALL CONOUT
POP AF
POP DE
RET
;
CONINSB:PUSH HL
LD HL,INDATA
LD A,(HL)
OR A
LD (HL),00
POP HL
RET NZ
JP B_CONIN
;
;CONSOLE OUTPUT FCALL 02
;
CONOUT:PUSH HL
PUSH BC
LD HL,(CURSOR)
LD A,E
CP 08;BS
JP Z,CONOUT2
CP 09;TAB
JP Z,CONOUT3
CP 0D;CR
JP Z,CONOUT4
CP 0A;LF
JP Z,CONOUT4
CP 1B
JP C,CONOUT44;ctrl+
CONOUT12:LD C,E
CALL B_CONOUT
INC L
LD A,L
CP 50
JP Z,CONOUT42
JP CONOUT43
;BS
CONOUT2:LD A,L
OR A
JP Z,CONOUT44
LD C,E;BS
CALL B_CONOUT
DEC L
LD A,L
JP CONOUT43
;TAB
CONOUT3:CALL TABOUT
JP CONOUT43
;
TABOUT:LD A,L
CPL
AND 07
INC A
LD B,A
LD C,20
TABOUT1:CALL B_CONOUT
INC L
DEC B
JP NZ,TABOUT1
LD A,L
CP 50
RET NZ
XOR A
RET
;
;CR,LF
CONOUT4:LD C,E
CALL B_CONOUT
CONOUT42:LD A,00
CONOUT43:LD (CURSOR),A
CONOUT44:CALL CONCHK
POP BC
POP HL
RET
;
;READER INPUT FCALL 03
;
RDRIN:JP B_READER
;
;PUNCHER OUTPUT FCALL 04
;
PUNOUT:LD C,E
JP B_PUNCH
;
;PRINTER OUTPUT FCALL 05
;
LSTOUT:RET
;
;CONSOLE INPUT/OUTPUT FCALL 06
;
CONINOT:LD A,E
INC A;if FF
JP Z,CONIO_IN
LD C,E
JP B_CONOUT
CONIO_IN:CALL B_CONST
RET Z
JP B_CONIN
;
;IOBYTE READ FCALL 07
;
IOBYTERD:LD A,(IOBYTE)
RET
;
;IOBYTE SET FCALL 08
;
IOBYTESET:LD A,E
LD (IOBYTE),A
RET
;
;CHARACTER OUT FROM (DE) TO $ / FCALL 09
;
DEOUT:LD H,D
LD L,E
DEOUT2:LD A,(HL)
CP 24;$
RET Z
LD E,A
CALL CONOUT
INC HL
JP DEOUT2
;
;CONSOLE BUFFER INPUT FCALL 0A
;if ctrl+D then BREAK
;
CONBFIN:LD HL,(CURSOR)
LD A,L
LD (CURSORWK),A
LD H,D
LD L,E
CONBFIN1:PUSH HL
LD C,(HL)
LD B,00
INC HL
PUSH HL
INC HL
LD (CONBFINWK),HL
CONBFIN2:CALL CONINSB
AND 7F
CP 04;ctrl+D
JP NZ,CONBFIN22
LD E,A
LD A,B
OR A
JP Z,ZREENT
LD A,E
CONBFIN22:CP 0D;CR
JP Z,CONBFIN4
CP 0A;LF
JP Z,CONBFIN4
CP 09;TAB
JP Z,CONBFIN3
CP 08;BS
JP Z,CONBFIN5
CP 12;^R
JP Z,CONBFIN6
CP 15;^U
JP Z,CONBFIN7
CP 18;^X
JP Z,CONBFIN8
CP 1B
JP C,CONBFIN9
CONBFIN23:LD (HL),A
LD E,A
CALL CONOUT
CONBFIN24:INC HL
INC B
DEC C
JP NZ,CONBFIN2
;CR,LF
CONBFIN4:POP HL
LD (HL),B
LD D,H
LD E,L
EX DE,HL
LD A,B
OR A
JP Z,CONBFIN43
CONBFIN41:INC HL
LD A,(HL)
OR A
JP P,CONBFIN42
LD (HL),09;TAB
CONBFIN42:DEC B
JP NZ,CONBFIN41
CONBFIN43:EX DE,HL
POP DE;dummy
RET
;
;TAB
CONBFIN3:PUSH HL
PUSH BC
LD HL,(CURSOR)
LD A,L
CPL
AND 07
LD B,A
INC A
LD C,A
LD E,20
CONINBF31:CALL CONOUT
DEC C
JP NZ,CONINBF31
LD A,B
RLCA
RLCA
RLCA
RLCA
OR 89;TAB
POP BC
POP HL
LD (HL),A
JP CONBFIN24
;
;BS
CONBFIN5:LD A,B
OR A
JP Z,CONBFIN2
DEC HL
LD A,(HL)
OR A
JP M,CONBFIN54;TAB
CP 20;ctrl check
JP NC,CONBFIN52
CALL BSOUT
CONBFIN52:CALL BSOUT
CONBFIN53:DEC B
INC C
JP CONBFIN2
CONBFIN54:PUSH HL
PUSH BC
RRCA
RRCA
RRCA
RRCA
AND 07
INC A
LD C,A
CONBFIN55:CALL BSOUT
DEC C
JP NZ,CONBFIN55
POP BC
POP HL
JP CONBFIN53
;
BSOUT:CALL BSOUT2
LD E,20
CALL CONOUT
BSOUT2:LD E,08
JP CONOUT
;
; ctrl+R
CONBFIN6:LD E,23;#
CALL CONOUT
PUSH BC
LD A,(CURSORWK)
LD C,A
CALL CRLF
LD A,C
OR A
JP Z,CONBFIN62
LD E,20
CONBFIN61:CALL CONOUT
DEC C
JP NZ,CONBFIN61
CONBFIN62:LD HL,(CONBFINWK)
CONBFIN63:LD A,(HL)
OR A
JP M,CONBFIN66;TAB
CP 20;ctrl check
JP NC,CONBFIN64
CALL CTRLDSP
JP CONBFIN65
CONBFIN64:LD E,A
CALL CONOUT
CONBFIN65:INC HL
DEC B
JP NZ,CONBFIN63
POP BC
JP CONBFIN2
CONBFIN66:PUSH HL
PUSH BC
LD HL,(CURSOR)
CALL TABOUT
LD (CURSOR),HL
POP BC
POP HL
JP CONBFIN65
;
CRLF:LD E,0D
CALL CONOUT
LD E,0A
JP CONOUT
;
;ctrl+U
CONBFIN7:LD E,23;#
CALL CONOUT
LD A,(CURSORWK)
LD C,A
CALL CRLF
LD A,C
OR A
JP Z,CONBFIN72
CONBFIN71:LD E,20
CALL CONOUT
DEC C
JP NZ,CONBFIN71
CONBFIN72:POP HL
POP HL
JP CONBFIN1
;
;ctrl+X
CONBFIN8:DEC HL
LD A,(HL)
CP 20;ctrl check
JP NC,CONBFIN82
CALL BSOUT
CONBFIN82:CALL BSOUT
DEC B
JP NZ,CONBFIN8
POP HL
POP HL
JP CONBFIN1
;
;ctrl+
CONBFIN9:CALL CTRLDSP
JP CONBFIN23
CTRLDSP:PUSH AF
LD E,5E;^
CALL CONOUT
POP AF
PUSH AF
ADD A,40
LD E,A
CALL CONOUT
POP AF
RET
;
;CONSOLE STATUS CHECK FCALL 0B
;
CONCHK:PUSH HL
LD HL,INDATA
LD A,(HL)
OR A
JP NZ,CONCHK3
CALL B_CONST
JP NZ,CONCHK1
POP HL
RET
CONCHK1:CALL B_CONIN
CP 13;Ctrl+S
JP NZ,CONCHK2
CALL B_CONIN
CP 04;Ctrl+D
JP NZ,CONCHK2
JP ZREENT
CONCHK2:LD (HL),A
CONCHK3:LD A,01
POP HL
RET
;
;VERSION NO. READ FCALL 0C
;
VERRD:LD HL,$0022
RET
;
;DISK RESET FCALL 0D
;
DISKRES:LD HL,$0000
LD (ROVCT),HL
RET
;
;DISK DRIVE NO. SET FCALL 0E
;
DRVNOSET:LD A,E
DRVNOSET1:LD C,A
LD B,A
PUSH BC
CALL B_SELDSK
JP NZ,DRVNOSETE
LD DE,DPARAM
LD C,10
CALL PRMCOPY
LD HL,(DPTOP)
LD C,0F
CALL PRMCOPY
POP BC
LD HL,$0001
INC C
DRVNOSET2:DEC C
JP Z,DRVNOSET3
ADD HL,HL
JP DRVNOSET2
DRVNOSET3:LD D,H
LD E,L
LD A,L
LD HL,(CURDRVVCT)
OR L
LD L,A
LD A,D
OR H
LD H,A
LD (CURDRVVCT),HL
LD A,B
LD (CURDRV),A
LD A,E
LD HL,(ROVCT)
AND L
LD L,A
LD A,D
AND H
OR L
LD (CURROMK),A
RET Z
LD A,FF
LD (CURROMK),A
XOR A
RET
DRVNOSETE:POP BC
RET
;
PRMCOPY:LD A,(HL)
LD (DE),A
INC HL
INC DE
DEC C
JP NZ,PRMCOPY
RET
;
;DISK FILE OPEN FCALL 0F
;
OPEN:CALL SRCHFST
CP FF
RET Z
PUSH HL
LD BC,$000C
ADD HL,BC
LD A,(HL);extent No.
POP HL
OR A
JP Z,OPEN2
CALL SRCHNXT
CP FF
RET Z
PUSH HL
LD BC,$000C
ADD HL,BC
LD A,(HL);extent No.
POP HL
OR A
JP Z,OPEN2
LD A,FF
RET
OPEN2:LD B,20
LD A,(DE)
PUSH AF
PUSH DE
OPEN3:LD A,(HL)
LD (DE),A
INC DE
INC HL
DEC B
JP NZ,OPEN3
POP DE
POP AF
LD (DE),A
LD A,(FNPOSS)
RET
;
;DISK FILE CLOSE FCALL 10
;
CLOSE:CALL SRCHFST
CP FF
RET Z
CLOSE1:PUSH HL
LD BC,$000C
ADD HL,BC
LD A,(HL);extent No.
LD H,D
LD L,E
ADD HL,BC
LD B,(HL)
POP HL
CP B
JP Z,CLOSE2
CALL SRCHNXT
CP FF
RET Z
JP CLOSE1
CLOSE2:LD B,20
PUSH DE
PUSH HL
CLOSE3:LD A,(DE)
LD (HL),A
INC HL
INC DE
DEC B
JP NZ,CLOSE3
POP HL
LD (HL),00
CALL B_WRITE
POP DE
LD A,(FNPOSS)
RET
;
;FILE NAME SEARCH FIRST FCALL 11 return with HL=FCB
;
SRCHFST:CALL CURDRVCK
CALL DIRSET
SRCHFST3:LD HL,(DIRBFADRS)
LD BC,$0400
SRCHFST4:PUSH BC
CALL NMCMP
JP Z,SRCHFST8
SRCHFST42:LD BC,$0020
ADD HL,BC
POP BC
INC C
DEC B
JP NZ,SRCHFST4
SRCHFST43:LD HL,FNPOS
INC (HL)
INC (HL)
INC (HL)
INC (HL)
LD A,(DIRMAX)
CP (HL)
JP C,SRCHFST9
CALL NDIRSET
JP SRCHFST3
;
SRCHFST8:POP BC
LD A,C
LD (FNPOSS),A
RET
SRCHFST9:LD A,FF
RET
;
;NAME COMP return with HL=FCB
NMCMP:LD A,(HL)
CP E5
JP NZ,NMCMP02
OR A;reset zflag
RET
NMCMP02:PUSH DE
PUSH HL
INC DE
INC HL
LD C,08
NMCMP1:LD A,(DE)
CP 3F;?
JP Z,NMCMP2
CP (HL)
JP Z,NMCMP2
POP HL
POP DE
RET
NMCMP2:INC DE
INC HL
DEC C
JP NZ,NMCMP1
LD C,03
NMCMP3:LD A,(DE)
AND 7F
CP 3F;?
JP Z,NMCMP4
LD B,A
LD A,(HL)
AND 7F
CP B
JP Z,NMCMP4
POP HL
POP DE
RET
NMCMP4:INC DE
INC HL
DEC C
JP NZ,NMCMP3
POP HL
POP DE
RET
;
;FILE NAME SEARCH NEXT FCALL 12
;
SRCHNXT:LD A,(FNPOSS)
CP 03
JP Z,SRCHFST43
LD C,A
LD A,04
SUB C
LD B,A
LD A,C
LD HL,(DIRBFADRS)
OR A
JP Z,SRCHNXT22
PUSH DE
LD DE,$0020
SRCHNXT2:ADD HL,DE
DEC A
JP NZ,SRCHNXT2
POP DE
SRCHNXT22:PUSH BC
JP SRCHFST42
;
;FILE DELETE FCALL 13
;
DELETE:LD A,(CURROMK)
OR A
RET NZ
CALL SRCHFST
CP FF
RET Z
DELETE2:LD (HL),E5
PUSH DE
LD DE,$0020
ADD HL,DE
LD B,10;=16
DELETE3:LD A,(HL)
OR A
JP Z,DELETE4
PUSH BC
LD B,7F
CALL BLKTOALV
POP BC
DELETE4:DEC B
JP NZ,DELETE3
EX DE,HL
LD HL,(DIRBFADRS)
EX DE,HL
CALL B_WRITE
POP DE
CALL SRCHNXT
CP FF
JP NZ,DELETE2
XOR A
RET
;
;SEQUENTIAL READ FCALL 14
;
SEQRD:LD HL,$000F
ADD HL,DE
LD B,(HL);rec no. in this extent
PUSH HL
LD DE,$0011
ADD HL,DE
LD A,(HL);next rec no.
CP B
JP Z,SEQRDEND; end or next extent!!
INC (HL)
POP HL
INC HL
CALL SRCHBLK
SEQRD1:PUSH AF;position
LD C,(HL)
LD B,00
CALL BLKTOTS;B=TRK,C=SEC
POP AF
ADD A,C
LD C,A
LD HL,SEC
CP (HL)
JP C,SEQRD2
INC B
SUB (HL)
LD C,A
SEQRD2:PUSH BC
LD C,B
CALL B_SETTRK
POP BC
CALL B_SETSEC
LD HL,(DMABFADRS)
LD B,H
LD C,L
CALL B_SETDMA
CALL B_READ
XOR A
RET
;
SEQRDEND:POP HL
LD A,01;end of file
RET
;
;rec no. to brock no. alloc & position
;
SRCHBLK:PUSH AF
LD A,(BLKMSK)
INC A
LD C,A
POP AF
CP C
RET C
INC HL
SUB C
JP SRCHBLK
;
;SEQUENTIAL WRITE FCALL 15
;
SEQWR:LD A,(CURROMK)
OR A
RET NZ
LD HL,$000F
ADD HL,DE
LD A,(HL);rec amount in this extent
INC A
CP 81
JP Z,SEQWR8;next extent
LD (HL),A
PUSH HL
LD DE,$0011
ADD HL,DE
LD A,(HL)
INC (HL);next rec no.
POP HL
INC HL
CALL SRCHBLK
SEQWR1:PUSH AF;position
LD A,(HL)
OR A
JP NZ,SEQWR2
CALL SRCHNXTBLK;A=next block no.
JP C,SEQWR9;DISK FULL
LD (HL),A;next block no.
PUSH BC
LD B,80
CALL BLKTOALV
POP BC
SEQWR2:LD C,(HL)
LD B,00
CALL BLKTOTS;B=TRK,C=SEC
POP AF
ADD A,C
LD C,A
LD HL,SEC
CP (HL)
JP C,SEQWR3
INC B
SUB (HL)
LD C,A
SEQWR3:PUSH BC
LD C,B
CALL B_SETTRK
POP BC
CALL B_SETSEC
LD HL,(DMABFADRS)
LD B,H
LD C,L
CALL B_SETDMA
CALL B_WRITE
XOR A
RET
;
;next extent make !!!
SEQWR8:RET
;
SEQWR9:POP AF
LD A,02;DISK FULL
RET
;
;search next block return with A=next block no.
SRCHNXTBLK:PUSH HL
PUSH DE
PUSH BC
LD HL,(ALVTOP)
LD A,(BLKMAX);<FF !
INC A
LD B,A
LD C,00
SRCHNXTBLK1:LD D,08
LD A,(HL)
SRCHNXTBLK2:RLCA
JP NC,SRCHNXTBLK3
DEC B
JP Z,SRCHNXTBLK9;disk full
INC C
DEC D
JP NZ,SRCHNXTBLK2
INC HL
JP SRCHNXTBLK1
SRCHNXTBLK3:LD A,C
POP BC
POP DE
POP HL
OR A;reset Cflag
RET
SRCHNXTBLK9:POP BC
POP DE
POP HL
SCF;disk full
RET
;
;NEW FILE OPEN FCALL 16
;
NEWOPEN:CALL CURDRVCK
CALL DIRSET
CALL SRCHE5
CP FF
RET Z;directory full
PUSH AF
LD A,(CURROMK)
OR A
JP Z,NEWOPEN1
POP BC;dummy
RET
NEWOPEN1:PUSH HL
LD HL,$0010
ADD HL,DE
XOR A
LD B,10
NEWOPEN2:LD (HL),A
INC HL
DEC B
JP NZ,NEWOPEN2
POP HL
LD B,20
NEWOPEN3:LD A,(DE)
LD (HL),A
INC HL
INC DE
DEC B
JP NZ,NEWOPEN3
LD HL,(DIRBFADRS)
EX DE,HL
CALL B_WRITE
POP AF
RET
;
CURDRVCK:LD A,(DE)
OR A
RET Z
DEC A
LD HL,CURDRV
CP (HL)
RET Z
PUSH DE
CALL DRVNOSET1
POP DE
RET
;
;dir search 'E5'
SRCHE5:PUSH DE
SRCHE5_2:LD HL,(DIRBFADRS)
LD DE,$0400
SRCHE5_3:LD A,(HL)
CP E5
JP Z,SRCHE5_8
LD BC,$0020
ADD HL,BC
INC E
DEC D
JP NZ,SRCHE5_3
LD HL,FNPOS
INC (HL)
INC (HL)
INC (HL)
INC (HL)
LD A,(DIRMAX)
CP (HL)
JP C,SRCHE5_9
CALL NDIRSET
JP SRCHE5_2
;
SRCHE5_8:LD A,E
POP DE
RET
SRCHE5_9:POP DE
LD A,FF
RET
;
;RENAME FCALL 17
;
RENAME:LD A,(CURROMK)
OR A
RET NZ
CALL SRCHFST
CP FF
RET Z
RENAME2:INC HL
PUSH DE
EX DE,HL
LD BC,$0011
ADD HL,BC
LD B,0B;=11
RENAME3:LD A,(HL)
LD (DE),A
INC HL
INC DE
DEC B
JP NZ,RENAME3
CALL B_WRITE
POP DE
CALL SRCHNXT
CP FF
JP NZ,RENAME2
XOR A
RET
;
;CURRENT DRIVE VECTOR(LOGIN VECTOR) ADDRESS READ FCALL 18
;
CURDRVVCTRD:LD HL,(CURDRVVCT)
RET
;
;CURRENT DRIVE NO. READ FCALL 19
;
CURDRVNORD:LD A,(CURDRV)
RET
;
;DMA ADRRESS SET FCALL 1A
;
DMAADRSSET:LD H,D
LD L,E
LD (DMABFADRS),HL
RET
;
;ALLOCATION VECTOR ADDRESS READ FCALL 1B
;
ALVADRSRD:LD HL,(ALVTOP)
RET
;
;WRITE PROTECT SET FCALL 1C
;
WPSET:LD HL,(ROVCT)
EX DE,HL
LD A,(CURDRV)
INC A
LD HL,$0001
WPSET1:DEC A
JP Z,WPSET2
ADD HL,HL
JP WPSET1
WPSET2:LD A,H
OR D
LD H,A
LD A,L
OR E
LD L,A
LD (ROVCT),HL
RET
;
;READ ONLY VECTOR ADDRESS READ FCALL 1D
;
ROVRD:LD HL,(ROVCT)
RET
;
;FILE ATTRIBUTE SET FCALL 1E
;
ATTRSET:CALL SRCHFST
CP FF
RET Z
PUSH HL
LD BC,$000C
ADD HL,BC
LD A,(HL);extent No.
POP HL
OR A
JP Z,ATTRSET2
CALL SRCHNXT
CP FF
RET Z
PUSH HL
LD BC,$000C
ADD HL,BC
LD A,(HL);extent No.
POP HL
OR A
JP Z,ATTRSET2
LD A,FF
RET
ATTRSET2:LD BC,$0009
ADD HL,BC
EX DE,HL
ADD HL,BC
LD B,03
ATTRSET3:LD A,(HL)
LD (DE),A
INC HL
INC DE
DEC B
JP NZ,ATTRSET3
CALL B_WRITE
LD A,(FNPOSS)
RET
;
;DISK PARAMETER ADDRESS READ FCALL 1F
;
DPARAMRD:LD HL,(DPTOP)
RET
;
;UNDEFINE FCALL 20,26,27
;
UNDEFINE:RET
;
;RANDOM READ FCALL 21
;
RNDMRD:XOR A
LD (RWSW),A
CALL RNDMSB
JP NC,SEQRD1
LD A,FF;********** err CODE
RET
;
;rec no. to BLOCK aloc position
;return value B=this extent no. C=rec no. in this extent
;HL=BLOCK ALOC POINT
;if err then cf on
RNDMSB:LD HL,$0021
ADD HL,DE
LD A,(HL)
INC HL
LD H,(HL)
LD L,A;HL=next rec no.
LD B,07;
RNDMSB2:LD A,H
RRA
LD H,A
LD A,L
RRA
LD L,A
DEC B
JP NZ,RNDMSB2
LD A,H
RRA
RRA
LD C,A;rec no. in extent
LD B,L;extent no.
RNDMSB3:LD HL,$000C
ADD HL,DE
LD A,B
CP (HL)
JP NZ,RNDMSB5;read next extent
RNDMSB30:INC HL
INC HL
INC HL
LD A,(RWSW)
OR A
JP Z,RNDMSB31
LD A,C
INC A
CP (HL);amount in this extent
JP C,RNDMSB31
LD (HL),A
RNDMSB31:INC HL
EX DE,HL
LD HL,(BLKSFT)
EX DE,HL;E=BLKSFT,D=BLKMSK
LD A,C
AND D
LD D,A
LD A,C
RNDMSB32:RRCA
DEC E
JP NZ,RNDMSB32
AND 1F
JP Z,RNDMSB42
RNDMSB4:INC HL
DEC A
JP NZ,RNDMSB4
RNDMSB42:LD A,D;position no. in block
OR A;reset cf
RET
;
RNDMSB5:PUSH BC
PUSH AF
LD A,(RWSW)
OR A
CALL NZ,CLOSE;save this FCB
CALL SRCHFST
RNDMSB52:POP AF
PUSH HL
LD BC,$000C
ADD HL,BC
CP (HL);same extent No.?
JP Z,RNDMSB6;FCB found
POP HL
PUSH AF
CALL SRCHNXT
CP FF
JP Z,RNDMSB7;then,make new FCB
JP RNDMSB52
;
RNDMSB6:POP HL
PUSH DE
LD B,20
RNDMSB62:LD A,(HL)
LD (DE),A
INC HL
INC DE
DEC B
JP NZ,RNDMSB62
POP DE
LD HL,$000C
ADD HL,DE
POP BC
LD (HL),B;extent No.
JP RNDMSB30
;
RNDMSB7:POP AF
LD A,(RWSW)
OR A
JP NZ,RNDMSB71
POP BC
SCF
RET
RNDMSB71:POP BC
LD HL,$000C
ADD HL,DE
LD (HL),B;extent No.
PUSH HL
INC HL
LD B,13
XOR A
RNDMSB72:LD (HL),A
INC HL
DEC B
JP NZ,RNDMSB72
PUSH BC
CALL DIRSET
CALL SRCHE5
CP FF
JP NZ,RNDMSB73
POP BC
POP HL
SCF
RET
RNDMSB73:PUSH DE
LD B,20
RNDMSB74:LD A,(DE)
LD (HL),A
INC HL
INC DE
DEC B
JP NZ,RNDMSB74
LD HL,(DIRBFADRS)
EX DE,HL
CALL B_WRITE
POP DE
POP BC
POP HL
JP RNDMSB30
;
;RANDOM WRITE FCALL 22
;
RNDMWR:LD A,(CURROMK)
OR A
RET NZ
LD A,01
LD (RWSW),A
CALL RNDMSB
JP NC,SEQWR1
LD A,FF;******* err CODE
RET
;
;FILE SIZE READ FCALL 23
;
FSIZERD:LD B,00
PUSH BC;B=max extent No.
CALL SRCHFST
CP FF
JP Z,FSIZERDERR
FSIZERD1:LD BC,$000C
ADD HL,BC
LD A,(HL);extent No.
POP BC;max extent No.
CP B
JP C,FSIZERD2
LD B,A
INC HL
INC HL
INC HL
LD C,(HL);sectors in this extent
FSIZERD2:PUSH BC
CALL SRCHNXT
CP FF
JP NZ,FSIZERD1
POP BC
LD L,B
LD H,00
LD B,07
FSIZERD3:ADD HL,HL
DEC B
JP NZ,FSIZERD3;*128
ADD HL,BC
EX DE,HL
LD BC,$0021
ADD HL,BC
LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),00;**************
XOR A
RET
FSIZERDERR:POP BC
LD A,FF
RET
;
;RANDOM ACCESS RECOAD NO. SET FCALL 24
;
RNDMNOSET:LD HL,$000C
ADD HL,DE
LD C,(HL);extent
LD HL,$0020
ADD HL,DE
LD L,(HL);next rec no.
LD A,(BLKSFT)
LD B,00
LD H,A
OR A;reset CF
RNDMNOSET2:CALL RLBC
DEC H
JP NZ,RNDMNOSET2
LD H,04
RNDMNOSET3:CALL RLBC
DEC H
JP NZ,RNDMNOSET3
LD H,00
ADD HL,BC
LD B,H
LD C,L
LD HL,$0021
ADD HL,DE
LD (HL),C
INC HL
LD (HL),B
INC HL
LD (HL),00
RET
;
RLBC:LD A,C
RLA
LD C,A
LD A,B
RLA
LD B,A
RET
;
;WITH DISK DRIVE VECTOR RESET FCALLO 25
;
DRVVCTRES:LD A,D
LD B,D
LD C,E
LD HL,(CURDRVVCT)
EX DE,HL
LD HL,(ROVCT)
CPL
LD B,A
AND H
LD H,A
LD A,B
AND D
LD D,A
LD A,C
CPL
LD C,A
AND L
LD L,A
LD A,C
AND E
LD E,A
LD (ROVCT),HL
EX DE,HL
LD (CURDRVVCT),HL
RET
;
;RANDOM WRITE WITH 00 FCALL 28
;
RNDMWR0:LD A,(CURROMK)
OR A
RET NZ
CALL RNDMSB
PUSH HL
CALL SEQWR1
POP HL
CP FF
RET Z
LD A,(BLKMSK)
RNDMWR03:PUSH HL
PUSH AF
CALL SEQRD1
CP FF
JP Z,RNDMWR09
LD HL,(DMABFADRS)
LD B,80
LD A,E5
RNDMWR04:CP (HL)
JP NZ,RNDMWR06
INC HL
DEC B
JP NZ,RNDMWR04
LD B,80
LD HL,(DMABFADRS)
XOR A
RNDMWR05:LD (HL),A
INC HL
DEC B
JP NZ,RNDMWR05
POP AF
POP HL
PUSH HL
PUSH AF
CALL SEQWR1
CP FF
JP Z,RNDMWR09
RNDMWR06:POP AF
POP HL
DEC A
JP P,RNDMWR03
XOR A
RET
;
RNDMWR09:POP AF
POP HL
LD A,FF
RET
;
ALVSET:LD HL,(BLKMAX);clr ALV
LD B,H
LD A,L
LD HL,(DIRALC)
LD D,H
LD E,L
LD HL,(ALVTOP)
LD (HL),E
INC HL
LD (HL),D
;
CALL DIRSET
LD C,00
ALVSET1:LD HL,(DIRBFADRS)
LD B,04
ALVSET11:LD A,(HL)
CP E5
JP Z,ALVSET2
LD DE,$0010
ADD HL,DE
LD D,10
ALVSET12:LD A,(HL)
OR A
JP Z,ALVSET13
PUSH BC
LD B,80
CALL BLKTOALV
POP BC
ALVSET13:INC HL
DEC D
JP NZ,ALVSET12
JP ALVSET21
ALVSET2:LD DE,$0020
ADD HL,DE
ALVSET21:INC C
DEC B
JP NZ,ALVSET11
LD A,(DIRMAX)
CP C
RET C
PUSH BC
CALL NDIRSET
POP BC
JP ALVSET1
;
;A=BLOCK NO. B=80(SET) B=7F(CLR)
BLKTOALV:PUSH HL
LD HL,(ALVTOP)
BLKTOALV1:CP 08
JP C,BLKTOALV2
INC HL
SUB 08
JP BLKTOALV1
BLKTOALV2:LD C,A
INC C
LD A,B
BLKTOALV3:DEC C
JP Z,BLKTOALV4
RRCA
JP BLKTOALV3
BLKTOALV4:LD C,A
LD A,B
CP 80
LD A,(HL)
JP Z,BLKTOALV5
AND C
JP BLKTOALV6
BLKTOALV5:OR C
BLKTOALV6:LD (HL),A
POP HL
RET
;
;DIR TRACK&SECTOR SET & READ
DIRSET:PUSH DE
LD HL,DIRALC
LD A,(HL)
LD B,08
LD C,00
DIRSET1:RLCA
JP C,DIRSETE
INC C
DEC B
JP NZ,DIRSET1
INC HL
LD A,(HL)
LD B,08
DIRSET2:RLCA
JP C,DIRSETE
INC C
DEC B
JP NZ,DIRSET2
;
DIRSETE:XOR A
LD (FNPOS),A
LD B,00
CALL BLKTOTS
DIRSETE2:LD HL,DIRTRK
LD (HL),B
INC HL
LD (HL),C
PUSH BC
LD C,B
CALL B_SETTRK
POP BC
CALL B_SETSEC
LD HL,(DIRBFADRS)
LD B,H
LD C,L
CALL B_SETDMA
CALL B_READ
LD (FNPOSS),A
POP DE
RET
;
;NEXT DIR TRACK&SECTOR SET & READ
NDIRSET:PUSH DE
LD HL,DIRTRK
LD B,(HL)
INC HL
LD C,(HL)
INC C
LD A,(SEC)
CP C
JP NZ,DIRSETE2
LD C,00
INC B
JP DIRSETE2
;
;FROM BLOCK NO. TO TRACK,SECTOR
;BC=BLKNo. > B=TRK C=SEC
BLKTOTS:LD A,(BLKSFT);BROCK TO SECTOR
LD E,A
BLKTOTS1:LD A,C
OR A
RLA
LD C,A
LD A,B
RLA
LD B,A
DEC E
JP NZ,BLKTOTS1
;TRACK=BC/SEC SEC must be 2^n
LD A,(SEC)
LD D,A
LD A,C
DEC D
AND D
PUSH AF;SECTOR
INC D
BLKTOTS2:LD A,D
RRA
LD D,A
JP C,BLKTOTS3
LD A,B
RRA
LD B,A
LD A,C
RRA
LD C,A
JP BLKTOTS2
BLKTOTS3:LD B,C
POP AF
LD C,A;SECTOR
RET
;
|