* * PTDOS Disk interface routines * Programmed by Stephen Maguire * * Last modified: Nov., 1981 * * BPS EQU KBBUF Each sector is KBBUF bytes long BLKSZ EQU 0600H Block size of file * DB 83H ASC 'US' DB 'E'+80H DW PTSTO-5 USE DW DOVAR DW BUF1 * DB 84H ASC 'PRE' DB 'V'+80H DW USE-6 PREV DW DOVAR DW BUF1 * DB 87H ASC 'SEC/BL' DB 'K'+80H DW PREV-7 SPBLK DW DOCON DW KBBUF/BPS * DB 85H ASC '#BUF' DB 'F'+80H DW SPBLK-10 NOBUF DW DOCON DW NBUF * DB 87H ASC 'DENSIT' DB 'Y'+80H DW NOBUF-8 DENSTY DW DOVAR DW 1 * DB 8AH ASC 'DISK-ERRO' DB 'R'+80H DW DENSTY-10 DSKERR DW DOVAR DW 0 * * * The data for creating/opening the forth screens * FLDAT DB 'T'+80H File type DW BLKSZ The block size DB PNAT+PFINF+PKIL The information protect FLNAM DS 10 DB 0 End of name mark * SCRNAM DB 10 ASC '4THSCRNS/' UNIT DB '0' The drive number DB 0 * FDSCRP DS 2 Reserved for FINFO information DS 4 FSIZE DS 2 DS 16 * ****************************** * DB 88H ASC '4THSCRN' DB 'S'+80H DW DSKERR-13 FNADR DW DOCON DW FLNAM * DB 89H ASC 'FILE-DAT' DB 'A'+80H DW FNADR-0BH FILED DW DOCON DW FLDAT * DB 86H ASC 'DRVNU' DB 'M'+80H DW FILED-0CH DRVNM DW DOVAR DW UNIT * DB 85H ASC 'FILE' DB '#'+80H DW DRVNM-9 FILEN DW DOVAR DW 0 * DB 85H ASC 'OPEN' DB '?'+80H DW FILEN-8 OPENQ DW DOCON DW 0 * * * * Low level disk interface routines * * * OPEN: filename-ptr --> * file# 1 (open successful) * 0 (open not successful) * DB 86H ASC '(OPEN' DB ')'+80H DW OPENQ-8 OPEN DW $+2 POP D PUSH B LDAX D LXI H,FLNAM CPI 0BH JC OPN0 MVI A,0AH OPN0 MOV B,A OPEN0 INX D LDAX D MOV M,A INX H DCR B JNZ OPEN0 XRA A INX D STAX D LXI H,FLNAM LXI H,0 CALL SYS DB OPEOP JMP OPEN1 LXI H,1 POP B Restore BC MVI D,0 MOV E,A XRA A STA DSKERR+2 JMP DPUSH OPEN1 STA DSKERR+2 LXI H,0 POP B JMP HPUSH * * * * CLOSE: ( file# ---> ) * DB 87H ASC '(CLOSE' DB ')'+80H DW OPEN-9 CLOSE DW $+2 POP H MOV A,L PUSH B CALL SYS DB CLOOP JMP CLOS1 XRA A CLOS1 STA DSKERR+2 POP B JMP NEXT * * * FCREATE: fn$ -- f * DB 87H ASC '(ENTER' DB ')'+80H DW CLOSE-10 FCREA DW $+2 POP D PUSH B LXI H,FLNAM LDAX D CPI 0BH JC FCRE0 MVI A,0AH FCRE0 MOV B,A FCRE1 INX D LDAX D MOV M,A INX H DCR B JNZ FCRE1 XRA A INX D STAX D LXI H,FLDAT CALL SYS DB CREOP JMP FCRE2 XRA A FCRE2 STA DSKERR+2 POP B LXI H,1 ORA A JZ FCRE3 DCX H FCRE3 JMP HPUSH * * * FINFO: receiving-addr fn$ ---> flg * * DB 85H ASC 'FINF' DB 'O'+80H DW FCREA-10 FINFO DW $+2 POP D PUSH B LXI H,FLNAM LDAX D CPI 0BH JC FIN0 MVI A,0AH FIN0 MOV B,A FIN1 INX D LDAX D MOV M,A INX H DCR B JNZ FIN1 XRA A INX D STAX D LXI D,FLNAM POP B POP H PUSH B CALL SYS DB INFOP JMP FINF1 XRA A FINF1 STA DSKERR+2 POP B LXI H,1 ORA A JZ FINF2 DCX H FINF2 JMP HPUSH * * * KILL: fn$ ---> flg * * DB 86H ASC '(KILL' DB ')'+80H DW FINFO-8 KILL DW $+2 POP D PUSH B LXI H,FLNAM LDAX D CPI 0BH JC KIL0 MVI A,0AH KIL0 MOV B,A KIL1 INX D LDAX D MOV M,A INX H DCR B JNZ KIL1 XRA A INX D STAX D LXI D,FLNAM CALL SYS DB KILOP JMP KILL1 XRA A KILL1 STA DSKERR+2 POP B LXI H,1 ORA A JZ KILL2 DCX H KILL2 JMP HPUSH * * RANDOM: file# ---> flg * DB 88H ASC '(RANDOM' DB ')'+80H DW KILL-9 RANDM DW $+2 POP H MOV A,L PUSH B CALL SYS DB RNDOP JMP RNDM1 XRA A RNDM1 STA DSKERR+2 POP B LXI H,1 ORA A JZ RNDM2 DCX H RNDM2 JMP HPUSH * * * READ: addr #bytes file# ---> flg * * DB 86H ASC '(READ' DB ')'+80H DW RANDM-11 READ DW $+2 MOV H,B Save the system pointer MOV L,C POP B Get the file# MOV A,C POP B Get the byte count POP D PUSH H (an indirect PUSH B) CALL SYS DB RBLOP JMP READ1 XRA A READ1 STA DSKERR+2 POP B LXI H,1 ORA A JZ READ2 DCX H READ2 JMP HPUSH * * * WRITE: addr #bytes file# ---> flg * DB 87H ASC '(WRITE' DB ')'+80H DW READ-9 WRITE DW $+2 MOV H,B MOV L,C POP B MOV A,C POP B POP D WRIT0 PUSH H CALL SYS DB WBLOP JMP WRIT1 XRA A WRIT1 STA DSKERR+2 POP B LXI H,1 ORA A JZ WRIT2 DCX H WRIT2 JMP HPUSH * * * SEEK: byte#/blk# pos-option file# ---> flg * * DB 86H ASC '(SEEK' DB ')'+80H DW WRITE-10 SEEK DW $+2 MOV H,B MOV L,C XCHG . BC now in DE POP B MOV A,C POP B MOV B,C POP H PUSH D CALL SYS DB SEKOP JMP SEEK1 XRA A SEEK1 STA DSKERR+2 POP B LXI H,1 ORA A JZ SEEK2 DCX H SEEK2 JMP HPUSH * * * SPACE: dist-move type-movement file# ---> flg * * DB 88H ASC '(-SPACE' DB ')'+80H DW SEEK-9 PFSPC DW $+2 MOV H,B MOV L,C BC now in HL POP B MOV A,C POP D MOV D,E POP B PUSH H CALL SYS DB SPAOP JMP FSPC1 XRA A FSPC1 STA DSKERR+2 POP B LXI H,1 ORA A JZ FSPC2 DCX H FSPC2 JMP HPUSH * DB 87H ASC '(SPACE' DB ')'+80H DW PFSPC-11 FSPAC DW DOCOL DW OVER DW ZLESS DW ZEQU DW ZBRAN DW FSP1-$ DW ONE DW BRAN DW FSP2-$ FSP1 DW SWAP DW MINUS DW SWAP DW LIT DW -1 FSP2 DW SWAP DW PFSPC DS SEMIS * DB 86H ASC 'SYSTE' DB 'M'+80H DW FSPAC-10 SYSRST DW $+2 LDA CLD2 STA GLBIO CALL SYS DB RETOP * DB 88H ASC 'SET-TRA' DB 'P'+80H DW SYSRST-9 STRAP DW $+2 LHLD SYSGLO LXI D,GLERM DAD D MVI M,-1 INX H MVI M,-1 JMP NEXT * * * High level disk interface routines * DB 84H ASC '+BU' DB 'F'+80H DW STRAP-0BH PBUF DW DOCOL DW LIT DW CO DW PLUS DW DUP DW LIMIT DW EQUAL DW ZBRAN DW PBUF1-$ DW DROP DW FIRST PBUF1 DW DUP DW PREV DW AT DW SUBB DW SEMIS * DB 86H ASC 'UPDAT' DB 'E'+80H DW PBUF-7 UPDAT DW DOCOL DW PREV DW AT DW AT DW LIT DW 8000H DW ORR DW PREV DW AT DW STORE DW SEMIS * DB 8DH ASC 'EMPTY-BUFFER' DB 'S'+80H DW UPDAT-9 MTBUF DW DOCOL DW FIRST DW LIMIT DW OVER DW SUBB DW ERASE DW SEMIS * DB 86H ASC '(DRVX' DB ')'+80H DW MTBUF-16 XDRV DW DOCOL DW DUP DW DRVNM DW AT DW CAT DW SUBB DW ZBRAN DW XDRV1-$ DW FLUSH DW MTBUF DW FILEN DW AT DW CLOSE DW DRVNM DW AT DW CSTOR DW ZERO DW LIT DW OPENQ+2 DW STORE DW BRAN DW XDRV2-$ XDRV1 DW DROP XDRV2 DW SEMIS * DB 83H ASC 'DR' DB '0'+80H DW XDRV-9 DRZER DW DOCOL DW ZERO DW OFSET DW STORE DW SEMIS * DB 83H ASC 'DR' DB '1'+80H DW DRZER-6 DRONE DW DOCOL DW LIT DW BLKSZ/BPS*128 DW OFSET DW STORE DW SEMIS * DB 86H ASC 'BUFFE' DB 'R'+80H DW DRONE-6 BUFFE DW DOCOL DW USE DW AT DW DUP DW TOR BUFF1 DW PBUF DW ZBRAN DW BUFF1-$ DW USE DW STORE DW RR DW AT DW ZLESS DW ZBRAN DW BUFF2-$ DW RR DW TWOP DW RR DW AT DW LIT DW 7FFFH DW ANDD DW ZERO DW RSLW BUFF2 DW RR DW STORE DW RR DW PREV DW STORE DW FROMR DW TWOP DW SEMIS * DB 85H ASC 'BLOC' DB 'K'+80H DW BUFFE-9 BLOCK DW DOCOL DW OFSET DW AT DW PLUS DW TOR DW PREV DW AT DW DUP DW AT DW RR DW SUBB DW DUP DW PLUS DW ZBRAN DW BLOC1-$ BLOC2 DW PBUF DW ZEQU DW ZBRAN DW BLOC3-$ DW DROP DW RR DW BUFFE DW DUP DW RR DW ONE DW RSLW DW TWO DW SUBB BLOC3 DW DUP DW AT DW RR DW SUBB DW DUP DW PLUS DW ZEQU DW ZBRAN DW BLOC2-$ DW DUP DW PREV DW STORE BLOC1 DW FROMR DW DROP DW TWOP DW SEMIS * LST DB 85H ASC '(R/W' DB ')'+80H DW BLOCK-8 XRSLW DW DOCOL DW SWAP *DW BSCR *DW SUBB DW LIT DW BLKSZ/BPS DW SLMOD DW ONE DW FILEN DW AT DW SEEK DW DROP DW DSKERR DW AT DW DDUP DW ZBRAN DW XRW1-$ DW LIT DW 6 DW MESS DW SPSTO DW QUIT XRW1 DW BBUF DW STAR DW FILEN DW AT DW FSPAC DW DSKERR DW AT DW DDUP DW ZBRAN DW XRW2-$ DW LIT DW 6 DW MESS DW SPSTO DW QUIT XRW2 DW BBUF DW FILEN DW AT DW ROT DW ZBRAN DW XRW3-$ DW READ DW BRAN DW XRW4-$ XRW3 DW WRITE DW DROP XRW4 DW SEMIS * DB 8CH ASC 'MAKE-SCREEN' DB 'S'+80H DW XRSLW-8 MKSCR DW DOCOL DW FLUSH DW ZERO DW LIT DW -1 DW FILEN DW AT DW PFSPC DW MKSC0 DW MTBUF DW SEMIS * MKSC0 DW $+2 LXI H,BUF1 LXI D,BLKSZ MKSC1 MVI M,20H INX H DCX D MOV A,D ORA E JNZ MKSC1 POP D * MKSC2 MOV A,D ORA E JZ NEXT DCX D PUSH D * PUSH B LXI H,BUF1 XCHG . LXI B,BLKSZ LDA FILEN+2 CALL SYS DB WBLOP JMP MKSC3 XRA A MKSC3 STA DSKERR+2 POP B POP D ORA A JZ MKSC2 JMP NEXT * DB 88H ASC 'CREATED' DB '?'+80H DW MKSCR-15 CRTDQ DW DOCOL DW LIT DW FDSCRP DW FNADR DW FINFO DW DROP DW ONE DW DSKERR DW CAT DW ZBRAN DW CRTD1-$ DW ONE DW SUBB CRTD1 DW SEMIS * DB 83H ASC 'R/' DB 'W'+80H DW CRTDQ-11 RSLW DW DOCOL DW SWAP ; CALCULATE DRIVE NUMBER DW BSCR DW SUBB DW LIT DW BLKSZ/BPS*128 DW SLMOD DW LIT DW 30H DW PLUS DW XDRV DW SWAP ;********** DW OPENQ DW ZEQU DW ZBRAN DW RSLW2-$ DW CRTDQ DW ZEQU DW ZBRAN DW RSLW1-$ DW SCRNAM DW FCREA DW DROP DW CRTDQ DW SCRNAM DW OPEN DW DROP DW DUP DW RANDM DW DROP DW CLOSE DW DROP DW DROP RSLW1 DW ONE DW BRAN DW RSLW5+2-$ RSLW5 DW ZERO DW FNADR DW ZERO DW OPEN DW DROP the status flag *DW DUP DW FILEN DW STORE *DW RANDM DW DROP The file type DW ONE DW LIT DW OPENQ+2 DW STORE DW ZBRAN DW RSLW2-$ *DW ONE DW NOOP *DW MKSCR RSLW2 DW OVER ******TEST FOR OUT-OF-BOUNDS DW LIT DW BLKSZ/BPS DW SLASH DW LIT DW FSIZE DW AT DW OVER DW OVER DW LESS DW ZBRAN DW RSLW3-$ DW DROP DW DROP DW BRAN DW RSLW4-$ RSLW3 DW SUBB DW ONEP DW DUP DW MKSCR DW LIT DW FSIZE DW PSTOR RSLW4 DW XRSLW DW SEMIS * DB 85H ASC 'FLUS' DB 'H'+80H DW RSLW-6 FLUSH DW DOCOL DW NOBUF DW ONEP DW ZERO DW XDO FLUS1 DW ZERO DW BUFFE DW DROP DW XLOOP DW FLUS1-$ DW SEMIS * DB 84H ASC 'LOA' DB 'D'+80H DW FLUSH-8 LOAD DW DOCOL DW BLK DW AT DW TOR DW INN DW AT DW TOR DW ZERO DW INN DW STORE DW BSCR DW STAR DW BLK DW STORE DW INTER DW FROMR DW INN DW STORE DW FROMR DW BLK DW STORE DW SEMIS * DB 0C3H ASC '--' DB '>'+80H DW LOAD-7 ARROW DW DOCOL DW QLOAD DW ZERO DW INN DW STORE DW BSCR DW BLK DW AT DW OVER DW MODD DW SUBB DW BLK DW PSTOR DW SEMIS * Page * DB 0C1H DB 0A7H DW ARROW-6 TICK DW DOCOL DW DFIND DW ZEQU DW ZERO DW QERR DW DROP DW LITER DW SEMIS * DB 86H ASC 'FORGE' DB 'T'+80H DW TICK-4 FORG DW DOCOL DW CURR DW AT DW CONT DW AT DW SUBB DW LIT DW 18H DW QERR DW TICK DW DUP DW FENCE DW AT DW LESS DW LIT DW 15H DW QERR DW DUP DW NFA DW DP DW STORE DW LFA DW AT DW CONT DW AT DW STORE DW SEMIS ; DB 84H ASC 'BAC' DB 'K'+80H DW FORG-9 BACK DW DOCOL DW HERE DW SUBB DW COMMA DW SEMIS * DB 0C5H ASC 'BEGI' DB 'N'+80H DW BACK-7 BEGIN DW DOCOL DW QCOMP DW HERE DW ONE DW SEMIS * DB 0C5H ASC 'ENDI' DB 'F'+80H DW BEGIN-8 ENDIFF DW DOCOL DW QCOMP DW TWO DW QPAIR DW HERE DW OVER DW SUBB DW SWAP DW STORE DW SEMIS * DB 0C4H ASC 'THE' DB 'N'+80H DW ENDIFF-8 THEN DW DOCOL DW ENDIFF DW SEMIS * DB 0C2H ASC 'D' DB 'O'+80H DW THEN-7 DO DW DOCOL DW COMP DW XDO DW HERE DW THREE DW SEMIS * DB 0C4H ASC 'LOO' DB 'P'+80H DW DO-5 LOOP DW DOCOL DW THREE DW QPAIR DW COMP DW XLOOP DW BACK DW SEMIS * DB 0C5H ASC '+LOO' DB 'P'+80H DW LOOP-7 PLOOP DW DOCOL DW THREE DW QPAIR DW COMP DW XPLOO DW BACK DW SEMIS * DB 0C5H ASC 'UNTI' DB 'L'+80H DW PLOOP-8 UNTIL DW DOCOL DW ONE DW QPAIR DW COMP DW ZBRAN DW BACK DW SEMIS * DB 0C3H ASC 'EN' DB 'D'+80H DW UNTIL-8 ENDD DW DOCOL DW UNTIL DW SEMIS * DB 0C5H ASC 'AGAI' DB 'N'+80H DW ENDD-6 AGAIN DW DOCOL DW ONE DW QPAIR DW COMP DW BRAN DW BACK DW SEMIS * DB 0C6H ASC 'REPEA' DB 'T'+80H DW AGAIN-8 REPEA DW DOCOL DW TOR DW TOR DW AGAIN DW FROMR DW FROMR DW TWO DW SUBB DW ENDIFF DW SEMIS * DB 0C2H ASC 'I' DB 'F'+80H DW REPEA-9 IFF DW DOCOL DW COMP DW ZBRAN DW HERE DW ZERO DW COMMA DW TWO DW SEMIS * DB 0C4H ASC 'ELS' DB 'E'+80H DW IFF-5 ELSEE DW DOCOL DW TWO DW QPAIR DW COMP DW BRAN DW HERE DW ZERO DW COMMA DW SWAP DW TWO DW ENDIFF DW TWO DW SEMIS * DB 0C5H ASC 'WHIL' DB 'E'+80H DW ELSEE-7 WHILE DW DOCOL DW IFF DW TWOP DW SEMIS * DB 86H ASC 'SPACE' DB 'S'+80H DW WHILE-8 SPACS DW DOCOL DW ZERO DW MAX DW DDUP DW ZBRAN DW SPAX1-$ DW ZERO DW XDO SPAX2 DW SPACE DW XLOOP DW SPAX2-$ SPAX1 DW SEMIS * DB 82H ASC '<' DB '#'+80H DW SPACS-9 BDIGS DW DOCOL DW PAD DW HLD DW STORE DW SEMIS * DB 82H ASC '#' DB '>'+80H DW BDIGS-5 EDIGS DW DOCOL DW DROP DW DROP DW HLD DW AT DW PAD DW OVER DW SUBB DW SEMIS * DB 84H ASC 'SIG' DB 'N'+80H DW EDIGS-5 SIGN DW DOCOL DW ROT DW ZLESS DW ZBRAN DW SIGN1-$ DW LIT DW 2DH DW HOLD SIGN1 DW SEMIS * DB 81H DB '#'+80H DW SIGN-7 DIG DW DOCOL DW BASE DW AT DW MSMOD DW ROT DW LIT DW 9 DW OVER DW LESS DW ZBRAN DW DIG1-$ DW LIT DW 7 DW PLUS DIG1 DW LIT DW 30H DW PLUS DW HOLD DW SEMIS * DB 82H ASC '#' DB 'S'+80H DW DIG-4 DIGS DW DOCOL DIGS1 DW DIG DW OVER DW OVER DW ORR DW ZEQU DW ZBRAN DW DIGS1-$ DW SEMIS * DB 83H ASC 'D.' DB 'R'+80H DW DIGS-5 DDOTR DW DOCOL DW TOR DW SWAP DW OVER DW DABS DW BDIGS DW DIGS DW SIGN DW EDIGS DW FROMR DW OVER DW SUBB DW SPACS DW TYPE DW SEMIS * DB 82H ASC '.' DB 'R'+80H DW DDOTR-6 DOTR DW DOCOL DW TOR DW STOD DW FROMR DW DDOTR DW SEMIS * DB 82H ASC 'D' DB '.'+80H DW DOTR-5 DDOT DW DOCOL DW ZERO DW DDOTR DW SPACE DW SEMIS * DB 81H DB '.'+80H DW DDOT-5 DOT DW DOCOL DW STOD DW DDOT DW SEMIS * DB 81H DB '?'+80H DW DOT-4 QUES DW DOCOL DW AT DW DOT DW SEMIS * DB 82H ASC 'U' DB '.'+80H DW QUES-4 UDOT DW DOCOL DW ZERO DW DDOT DW SEMIS * DB 85H ASC 'VLIS' DB 'T'+80H DW UDOT-5 VLIST DW DOCOL DW LIT DW 80H DW OUTT DW STORE DW CONT DW AT DW AT VLIS1 DW OUTT DW AT DW CSLL DW LIT DW 10 DW SUBB DW GREAT DW ZBRAN DW VLIS2-$ DW CR DW ZERO DW OUTT DW STORE VLIS2 DW DUP DW IDDOT DW SPACE DW SPACE DW PFA DW LFA DW AT DW DUP DW ZEQU DW QTERM DW ORR DW ZBRAN DW VLIS1-$ DW DROP DW SEMIS * DB 84H ASC 'LIS' DB 'T'+80H DW VLIST-8 LIST DW DOCOL DW DEC DW CR DW DUP DW SCR DW STORE DW PDOTQ DB 9 ASC 'Screen # ' DW DOT DW LIT DW 10H DW ZERO DW XDO LIST1 DW CR DW IDO DW LIT DW 3 DW DOTR DW SPACE DW IDO DW SCR DW AT DW DLINE DW QTERM DW ZBRAN DW LIST2-$ DW LEAVE LIST2 DW XLOOP DW LIST1-$ DW CR DW SEMIS * DB 83H ASC 'BY' DB 'E'+80H DW LIST-7 BYE DW DOCOL DW OPENQ DW ZBRAN DW BYE1-$ DW FILEN ; FILE# @ CLOSE DW AT DW CLOSE DW ZERO ; 0 ' OPEN? ! DW LIT DW OPENQ+2 DW STORE BYE1 DW SYSRST DW SEMIS *