; CP/M DISC INTERFACE
;
; Last update:
;
; 881228 - EXTEND's R/W address now initialized with blanks
; 860120 - EXTEND's R/W address now HERE, was Osborne video ram
; 850511 - saved BC' in 'BDOS'
; 850227 - saved index regs. in 'BDOS'
; 840812 - added EXTEND
; 840731 - installed BDOS calls
;
;
; CP/M BDOS CALLS USED (as per Albert van der Horst, HCCH)
;
; R/W reads or writes a sector in the file specified when invoking
; Z80 fig-FORTH (A>Z80FORTH d:filename.ext), using the default FCB.
; More than one disc may be accessed by temporary use of a user de-
; fined FCB.
;
;
;
DEFFCB EQU 005CH ;default FCB
;
; CP/M FUNCTIONS
;
OPNFIL EQU 0FH ;open file
CLSFIL EQU 10H ;close file
SETDMA EQU 1AH ;set DMA address
WRTRND EQU 22H ;write random
;
;
; FORTH variables & constants used in disc interface
;
DEFB 83H ;FCB (current FCB address)
DM 'FCB'
DEFW PTSTO-5
FCB: DEFW DOCON,DEFFCB
;
DEFB 84H ;REC# (returns address of random rec.#)
DM 'REC#'
DEFW FCB-6
RECADR: DEFW DOCOL,FCB
DEFW LIT,21H
DEFW PLUS
DEFW SEMIS
;
DEFB 83H ;USE
DM 'USE'
DEFW RECADR-7
USE: DEFW DOVAR,0 ;/ initialised by CLD
;
DEFB 84H ;PREV
DM 'PREV'
DEFW USE-6
PREV: DEFW DOVAR,0 ;/ initialised by CLD
;
DEFB 85H ;#BUFF
DM '#BUFF'
DEFW PREV-07H
NOBUF: DEFW DOCON,NBUF
;
DEFB 8AH ;DISK-ERROR
DM 'DISK-ERROR'
DEFW NOBUF-08H
DSKERR: DEFW DOVAR,0
;
; DISC INTERFACE HIGH LEVEL ROUTINES
;
DEFB 84H ;+BUF
DM '+BUF'
DEFW DSKERR-0DH
PBUF: DEFW DOCOL
DEFW LIT,CO
DEFW PLUS,DUP
DEFW LIMIT,EQUAL
DEFW ZBRAN,PBUF1-$
DEFW DROP,FIRST
PBUF1: DEFW DUP,PREV
DEFW AT,SUBB
DEFW SEMIS
;
DEFB 86H ;UPDATE
DM 'UPDATE'
DEFW PBUF-07H
UPDAT: DEFW DOCOL,PREV
DEFW AT,AT
DEFW LIT,8000H
DEFW ORR
DEFW PREV,AT
DEFW STORE,SEMIS
;
DEFB 8DH ;EMPTY-BUFFERS
DM 'EMPTY-BUFFERS'
DEFW UPDAT-9
MTBUF: DEFW DOCOL,FIRST
DEFW LIMIT,OVER
DEFW SUBB,ERASEE
DEFW SEMIS
;
DEFB 83H ;DR0
DM 'DR0'
DEFW MTBUF-10H
DRZER: DEFW DOCOL
DEFW ZERO
DEFW OFSET,STORE
DEFW SEMIS
;
DEFB 83H ;DR1
DM 'DR1'
DEFW DRZER-6
DRONE: DEFW DOCOL
DEFW LIT,1600 ;Osborne DD
DRON2: DEFW OFSET,STORE
DEFW SEMIS
;
DEFB 86H ;BUFFER
DM 'BUFFER'
DEFW DRONE-6
BUFFE: DEFW DOCOL,USE
DEFW AT,DUP
DEFW TOR
BUFF1: DEFW PBUF ;won't work if single buffer
DEFW ZBRAN,BUFF1-$
DEFW USE,STORE
DEFW RR,AT
DEFW ZLESS
DEFW ZBRAN,BUFF2-$
DEFW RR,TWOP
DEFW RR,AT
DEFW LIT,7FFFH
DEFW ANDD,ZERO
DEFW RSLW
BUFF2: DEFW RR,STORE
DEFW RR,PREV
DEFW STORE,FROMR
DEFW TWOP,SEMIS
;
DEFB 85H ;BLOCK
DM 'BLOCK'
DEFW BUFFE-9
BLOCK: DEFW DOCOL,OFSET
DEFW AT,PLUS
DEFW TOR,PREV
DEFW AT,DUP
DEFW AT,RR
DEFW SUBB
DEFW DUP,PLUS
DEFW ZBRAN,BLOC1-$
BLOC2: DEFW PBUF,ZEQU
DEFW ZBRAN,BLOC3-$
DEFW DROP,RR
DEFW BUFFE,DUP
DEFW RR,ONE
DEFW RSLW
DEFW TWOMIN ;/
BLOC3: DEFW DUP,AT
DEFW RR,SUBB
DEFW DUP,PLUS
DEFW ZEQU
DEFW ZBRAN,BLOC2-$
DEFW DUP,PREV
DEFW STORE
BLOC1: DEFW FROMR,DROP
DEFW TWOP,SEMIS
;
DEFB 84H ;BDOS (CP/M function call)
DM 'BDOS'
DEFW BLOCK-8
BDOS: DEFW $+2
EXX ;SAVE IP
POP BC ;(C) <-- (S1)LB = CP/M function code
POP DE ;(DE) <-- (S2) = parameter
push ix ;/
push iy ;/
exx
push bc ;/ save ip
exx
CALL BDOSS ;return value in A
exx
pop bc ;restore ip
exx
pop iy ;/
pop ix ;/
EXX ;restore IP
LD L,A
LD H,00H
JHPUSH ;(S1) <-- (HL) = returned value
;
DEFB 83H ;R/W
DM 'R/W'
DEFW BDOS-07H
RSLW: DEFW DOCOL
DEFW TOR ;store R/W flag
DEFW RECADR,STORE
DEFW ZERO,RECADR ;set record #
DEFW TWOP,CSTOR
DEFW LIT,SETDMA
DEFW BDOS,DROP ;set DMA address
DEFW LIT,WRTRND
DEFW FROMR,SUBB ;select READ or WRITE
DEFW FCB,SWAP
DEFW BDOS ;do it
DEFW DSKERR,STORE ;store return code
DEFW SEMIS
;
DEFB 85H ;FLUSH
DM 'FLUSH'
DEFW RSLW-6
FLUSH: DEFW DOCOL
DEFW NOBUF,ONEP
DEFW ZERO,XDO
FLUS1: DEFW ZERO,BUFFE
DEFW DROP
DEFW XLOOP,FLUS1-$
DEFW SEMIS
;
;
defb 86h ;/ EXTEND
dm 'EXTEND'
defw flush-08h
extend:
defw docol
defw here ;/ fill with b/buf blanks
defw bbuf
defw blank
defw lit
defw 0008h
defw star
defw zero
extnd1:
defw onep ; begin
defw here ;/ was lit,f000h (Osborne video ram)
defw over
defw one
defw rslw
defw dskerr
defw at
defw zbran
defw extnd1-$ ; until
defw swap
defw over
defw plus
defw swap
defw xdo ; do
extnd2:
defw here ;/ was lit,f000h (Osborne video ram)
defw ido
defw zero
defw rslw
defw xloop
defw extnd2-$ ; loop
defw fcb
defw lit
defw clsfil
defw bdos ; close file
defw drop ; discard return code
defw fcb
defw lit
defw opnfil
defw bdos ; & re-open
defw drop ; discard return code
defw semis
;
;
DEFB 84H ;LOAD
DM 'LOAD'
DEFW EXTEND-09H
LOAD: DEFW DOCOL,BLK
DEFW AT,TOR
DEFW INN,AT
DEFW TOR,ZERO
DEFW INN,STORE
DEFW BSCR,STAR
DEFW BLK,STORE ;BLK <-- SCR * B/SCR
DEFW INTER ;INTERPRET FROM OTHER SCREEN
DEFW FROMR,INN
DEFW STORE
DEFW FROMR,BLK
DEFW STORE,SEMIS
;
DEFB 0C3H ;-->
DM '-->'
DEFW LOAD-7
ARROW: DEFW DOCOL,QLOAD
DEFW ZERO
DEFW INN,STORE
DEFW BSCR,BLK
DEFW AT,OVER
DEFW MODD,SUBB
DEFW BLK,PSTOR
DEFW SEMIS
;
;
;
file: /Techref/language/FORTH/z80fig-Forth1_1g_files/DISCIO.ASM, 5KB, , updated: 1997/12/31 08:21, local time: 2024/12/25 23:35,
|
| ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://linistepper.com/Techref/language/FORTH/z80fig-Forth1_1g_files/DISCIO.ASM"> language FORTH z80fig-Forth1_1g_files DISCIO</A> |
Did you find what you needed?
|