; 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/11/12 17:03,
3.17.81.228:LOG IN
|
©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://techref.massmind.org/techref/language/FORTH/z80fig-Forth1_1g_files/DISCIO.ASM"> language FORTH z80fig-Forth1_1g_files DISCIO</A> |
Did you find what you needed? |
Welcome to massmind.org! |
Welcome to techref.massmind.org! |
.