home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol042 / fdos.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  28.8 KB  |  1,308 lines

  1. ;===================================================================
  2. ;    MICRO RESOURCES CP/M -- FDOS III FILE TRANSFER PROGRAM
  3. ;===================================================================
  4. ;
  5. ;
  6. ; THIS PROGRAM IS A UTILITY TO TRANSFER FILES FROM FDOS III
  7. ; SINGLE DENSITY DISKS TO CP/M DISKS OR TO TRANSFER A CP/M
  8. ; FILE TO AN FDOS III SINGLE DENSITY DISK. A PROVISION HAS
  9. ; ALSO BEEN INCLUDED TO ALLOW EXAMINATION THE DIRECTORY OF
  10. ; THE FDOS III DISKETTE. THE OPERATION OF THIS PROGRAM ASSUMES
  11. ; THAT A CP/M SYSTEM DISK IS PRESENT IN DRIVE A: AND THAT THE
  12. ; FDOS III DISK IS IN DRIVE B:. THE BIOS PRIMITIVES OF THE CP/M
  13. ; SYSTEM ARE ACCESSED DIRECTLY TO ALLOW READING AND WRITING
  14. ; OF THE SINGLE DENSITY FDOS III DISK WITH IT'S 10 TO 1 LOGICAL
  15. ; TO PHYSICAL SECTOR MAPPING.
  16. ;
  17. ; THIS PROGRAM DOES NOT PACK THE FILES OF THE FDOS III DISK
  18. ; WHEN CREATING NEW FILES UPON TRANSFER FROM A CP/M FILE.
  19. ; SUBSEQUENT PACKING MAY DONE UPON THE DESTINATION FDOS III
  20. ; SYSTEM.
  21. ;
  22. ; THE DIRECTORIES OF EITHER DISK WILL BE SCANNED FOR FILES
  23. ; OF SIMILAR NAMES BEFORE A TRANSFER IS ACTUALLY MADE. A PROMPT
  24. ; QUESTION WILL INDICATE WHEN THE FILE ALREADY EXISTS. IN THE
  25. ; CASE OF THE CP/M DISK THE INDICATED FILE MAY BE ERASED IF
  26. ; DESIRED. WITH THE FDOS III DISK A FILE WILL NOT BE DELETED
  27. ; AND THE NAME OF THE SOURCE FILE ON THE CP/M DISK WILL HAVE
  28. ; TO BE CHANGED TO A NAME NOT CURRENTLY ON THE FDOS III DISK.
  29. ; FILE NAMES OF FDOS FILES ARE A MAXIMUM OF 5 ASCII CHARACTERS
  30. ; IN LENGTH SO THE CP/M FILE TRANSFERRED TO THE FDOS III DISK
  31. ; WILL HAVE ITS NAME TRUNCATED TO THE FIRST FIVE CHARACTERS.
  32. ; THE FDOS FILE TYPE WILL ALWAYS BE SET TO 00 AS A USER TYPE
  33. ; DATA FILE.
  34. ;
  35. ; THIS PROGRAM BUFFERS SECTOR READS UP SIXTEEN IN LENGTH
  36. ; TO MAKE THE TRANSFER MORE EFFICIENT.
  37. ;
  38. ;
  39. ;
  40. ;
  41. ;*****************************************************************
  42. ;
  43. ;THIS SOFTWARE IS PROTECTED UNDER THE FOLLOWING COPYRIGHT
  44. ;AND MAY NOT BE REPRODUCED OR COPIED IN ANY FORM WITHOUT 
  45. ;SPECIFIC PERMISSION FROM MICRO RESOURCES.
  46. ;
  47. ;
  48. ;   COPYRIGHT (C) 1980
  49. ;
  50. ;
  51. ;    MICRO RESOURCES
  52. ;    MICHAEL J. KARAS
  53. ;    2468 HANSEN CT.
  54. ;    SIMI VALLEY, CA 93065
  55. ;    (805) 527-7922
  56. ;
  57. ;ANY QUESTIONS ABOUT THIS PROGRAM OR ITS APPLICATION
  58. ;CAN BE DIRECTED TO THE ABOVE ADDRESS OR TELEPHONE NUMBER.
  59. ;
  60. ;**********************************************************************
  61. ;
  62. WBOOT    EQU    00    ;CP/M WARM BOOT ENTRY ADDRESS
  63. ;
  64. ERRLIM    EQU    10    ;MAX ALLOWABLE ERRORS
  65. ;DEFINE ASCII CHARACTERS USED
  66. ;
  67. LF    EQU    10    ;LINEFEED
  68. CR    EQU    13    ;CARRIAGE RETURN
  69. ;
  70. ;START OF EXECUTABLE CODE
  71. ;
  72.     ORG    100H
  73.     CALL    START    ;GO PRINT ID
  74.     DB    'MICRO RESOURCES FILE TRANSFER UTILITY '
  75.     DB    CR,LF,'         CP/M <----> FDOS III'
  76.     DB    CR,LF,'           VER 1.4 5/29/80'
  77.     DB    CR,LF,'$'
  78. START:
  79.     POP    D    ;GET ID MESSAGE
  80.     MVI    C,PRINT
  81.     CALL    BDOS    ;PRINT ID MESSAGE
  82. ;
  83. ;INIT PRIVATE STACK
  84. ;
  85.     LXI    H,0    ;HL=0
  86.     DAD    SP    ;HL=STACK FROM CP/M
  87.     SHLD    STACK    ;..SAVE IT
  88.     LXI    SP,STACK ;SP=MY STACK
  89. ;
  90. ;INITIALIZE THE JMPS TO CP/M BIOS
  91. ;
  92.     CALL    INITADR
  93. ;
  94. ;SAVE PROGRAM OPTION
  95. ;
  96.     CALL    PROCOPT
  97. ;
  98. ;MOVE THE FILENAME FROM FCB 2 TO FCB 1
  99. ;
  100.     CALL    MOVEFCB
  101. ;
  102. ;JMP TO APPROPRIATE FUNCTION
  103. ;
  104.     LDA    OPTION    ;GET PROGRAM OPTION
  105. ;
  106.     CPI    'R'    ;READ FDOS FILE?
  107.     JZ    FDOSRD
  108. ;
  109.     CPI    'W'    ;WRITE FDOS FILE?
  110.     JZ    FDOSWR
  111. ;
  112.     CPI    'D'     ;LOOK AT FDOS III DIRECTORY
  113.     JZ    FDOSDIR
  114. ;
  115.     CPI    'H'    ;GO TO HELP FILE PRINTOUT?
  116.     JZ    HELP
  117. ;
  118. ;INVALID OPTION
  119. ;
  120.     JMP    BADOPT
  121. ;
  122. ;
  123. ;
  124. * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  125. *                                        *
  126. *    FDOSDIR: LISTS FDOS DIRECTORY TO CONSOLE        *
  127. *                                   *
  128. * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  129. ;
  130. ;
  131. ;THE DIRECTORY OF THE SINGLE DENSITY FDOS III
  132. ;DISK IN DRIVE B: IS LISTED TO THE CONSOLE IN
  133. ;A SINGLE COLUMN FORMAT. CONSOLE I/O IS DONE
  134. ;THROUGH CP/M SO THAT THE CTL-S AND CTL-P
  135. ;FUNCTIONS WILL WORK. THE LISTING ALSO STOPS
  136. ;AFTER EACH 16 ENTRIES HAVE BEEN TYPED
  137. ;
  138. FDOSDIR:
  139.     CALL    ILPRT    ;PRINT THE DIRECTORY HEADER LABEL
  140.     DB    CR,LF,'FDOS III DISK DIRECTORY'
  141.     DB    CR,LF,CR,LF
  142.     DB    'FILENAME  TYPE TRK SEC LENGTH',CR,LF,CR,LF,0
  143. ;
  144.     MVI    C,01H    ;SELECT DISK DRIVE B:
  145.     CALL    SELDSK    ;..THROUGH BIOS ACCESS
  146.     MVI    A,016    ;SET PRINT LOOP COUNT
  147.     STA    LISTCNT
  148.     MVI    A,00    ;SET SCAN FOR FIRST ENTRY
  149.     JMP    FDIR2    ;JUMP INTO LOOP
  150. FDIR1:
  151.     MVI    A,01    ;SET SCAN CODE FOR NEXT ENTRY
  152. FDIR2:
  153.     CALL    FDIRSC    ;SCAN FOR NEXT DIRECTORY ENTRY
  154.     ORA    A    ;SET FLAGES FOR RETURN CODE
  155.     JNZ    FDEREX    ;GO EXIT FOR FULL DISK DIRECTORY
  156.     LDA    FDENT+5    ;GET ENTRY TYPE BYTE
  157.     CPI    0FFH    ;MUST BE AT END OF THE LIST
  158.     JZ    FDIREX
  159.     CALL    PRTDIR    ;PRINT THIS ENTRY
  160. ;
  161.     LDA    LISTCNT    ;GET LIST LINE COUNT
  162.     DCR    A    ;DECREMENT IT
  163.     STA    LISTCNT    ;STORE NEW COUNT BACK
  164.     JNZ    FDIR1    ;GO TO DO NEXT ENTRY
  165. ;
  166.     CALL    ILPRT    ;GIVE THE GUY A CHANCE TO STOP A LONG DIRECTORY
  167.     DB    1,CR,LF,0
  168. ;
  169.     MVI    A,016    ;RESET PRINT LOOP COUNT
  170.     STA    LISTCNT
  171.     JMP    FDIR1    ;GO START ON 16 MORE ENTRIES
  172. ;
  173. FDIREX:
  174.     CALL    ILPRT    ;PRINT END OF LIST MESSAGE
  175.     DB    CR,LF,CR,LF,'END OF FDOS III DISK DIRECTORY',CR,LF,0
  176. FDIREX1:
  177.     MVI    C,00H    ;RESTORE SELECT OF DRIVE A:
  178.     CALL    SELDSK    ;DIRECT BIOS ACCESS
  179.     JMP    EXIT    ;DONE WITH DIRECTORY
  180. ;
  181. FDEREX:
  182.     CALL    ILPRT    ;PRINT DISK FULL MESSAGE
  183.     DB    CR,LF,'++FDOS III DISK DIRECTORY SPACE FULL++',CR,LF,0
  184. ;
  185.     JMP    FDIREX1
  186. ;
  187. ;
  188. ;
  189. ;
  190. ;SCAN FDOS III DIRECTORY ROUTINE
  191. ;    ROUTINE ENTRY IS CODED TO ALLOW VARIABLE FUNCTIONS
  192. ;    CODE IS PASSED IN THE A REGISTER
  193. ;    CODES AS FOLLOWS:
  194. ;        00=OPEN SCAN FROM BEGINNING OF TRACK 0 SECTOR 4
  195. ;        01=GET NEXT DIRECTORY ENTRY
  196. ;
  197. ;    RETURN VALUE IS THE FIRST OR NEXT ENTRY AS SPECIFIED BY THE
  198. ;    FUNCTION CODE AND IS PASSED IN BUFFER "FDENT" WHICH IS 11
  199. ;    BYTES LONG.
  200. ;
  201. ;    THIS ROUTINE SCANS AND RETURNS ALL POSSIBLE ENTRIES
  202. ;    AND WHEN END OF TRACK 0 IS ENCOUNTERED AN 0FFH CODE
  203. ;    IS RETURNED IN THE ACCUMULATOR. ELSE A 00H CODE IS 
  204. ;    RETURNED.
  205. ;
  206. ;
  207. ;
  208. FDIRSC:
  209.     ORA    A    ;SET FLAGS FOR FUNCTION CHECK
  210.     JNZ    NEXTENT    ;FOR NON-ZERO CODE JUST GET NEXT ENTRY
  211. ;
  212. ;SETUP FOR BEGINNING OF SCAN
  213.     MVI    A,003H    ;SETUP START SECTOR OF DIRECTORY-1 
  214.     STA    FDIRSEC
  215.     MVI    A,011    ;SET CURRENT SUBSCAN COUNT TO MAX
  216.     STA    DIRSECI
  217.     MVI    C,00H    ;SET TRACK NUMBER TO ZERO
  218.     CALL    SETTRK
  219. ;
  220. NEXTENT:
  221.     LDA    DIRSECI    ;GET SECTOR INDEX
  222.     CPI    011    ;AT MAXIMUM ENTRY?
  223.     JNZ    SAMSEC    ;NO STAY WITH THIS SECTOR
  224.     LXI    H,FDIRSEC
  225.     INR    M    ;INCREMENT CURRENT SECTOR NUMBER
  226.     MOV    A,M    ;GET THE SECTOR NUMBER
  227.     CPI    01BH    ;CHECK FOR THE LAST SECTOR
  228.     JNZ    NXTSEC    ;GO AROUND THE END OF TRACK EXIT
  229. ;
  230.     MVI    A,0FFH    ;SETUP EXIT FOR END OF DIRECTORY SPACE
  231.     RET
  232. ;
  233. NXTSEC:
  234.     MOV    C,A
  235.     CALL    FRDSEC    ;GO READ FDOS III SECTOR
  236.     LXI    H,IDBUF    ;MOVE INPUT BUFFER 
  237.     LXI    D,DIRBUF;..TO DIRECTORY BUFFER
  238.     CALL    MOVE128
  239.     MVI    A,00
  240.     STA    DIRSECI    ;SET SECTOR INDEX TO MINIMUM
  241. ;
  242. SAMSEC:
  243.     LXI    H,DIRSECI
  244.     MOV    B,M    ;GET THE INDEX
  245.     INR    M    ;INCR THE SECTOR INDEX
  246.     LXI    H,DIRBUF;POINT TO THE FDOS III DIRECTORY BUFFER
  247.     LXI    D,011    ;LENGTH OF AN ENTRY
  248.     MOV    A,B
  249.     CPI    00H    ;CHECK FOR ILLEGAL ZERO LOOP COUNT
  250.     JZ    SAMSEC2
  251. SAMSEC1:
  252.     DAD    D    ;LOOP TO MAKE OFFSET INDEX
  253.     DCR    B
  254.     JNZ    SAMSEC1
  255. SAMSEC2:
  256.     LXI    D,FDENT    ;POINT TO ENTRY PASS BUFFER
  257.     MVI    B,011    ;SETUP LENGTH OF DIRECTORY ENTRY
  258.     CALL    MOVE    ;GO MOVE A DIRECTORY ENTRY
  259.     MVI    A,00H    ;SET NORMAL RETURN FLAG
  260.     RET
  261. ;
  262. ;
  263. ;
  264. ;
  265. ;DIRECTORY SCAN POINTER PARAMETERS
  266. ;
  267. ;
  268. FDIRSEC    DB    00    ;CURRENT DIRECTORY SECTOR NUMBER
  269. DIRSECI    DB    00    ;INDEX OF SCAN INTO CURRENT DIRECTORY SECTOR
  270. DIRBUF    DS    128    ;128 BYTE DIRECTORY ENTRY BUFFER
  271. LISTCNT    DB    00    ;DIRECTORY LIST ENTRY COUNT
  272. ;
  273. ;
  274. ;
  275. ;PRINT DIRECTORY ENTRY SUBROUTINE
  276. ;
  277. ;
  278. PRTDIR:
  279.     LXI    H,FDENT    ;POINT TO DIRECTORY ENTRY BUFFER
  280.     MVI    A,'B'
  281.     CALL    CTYPE    ;PRINT OUT DRIVE DESIGNATOR
  282.     MVI    A,':'
  283.     CALL    CTYPE
  284.     MVI    B,05    ;FILE NAME CHARACTER COUNT
  285. NAMLP:
  286.     MOV    A,M    ;GET NAME CHARACTER
  287.     CALL    CTYPE
  288.     INX    H    ;INCREMENT BUFFER POINTER
  289.     DCR    B
  290.     JNZ    NAMLP    ;GO FOR NEXT NAME CHAR
  291. ;
  292.     CALL    SP4    ;FOUR SPACES
  293.     MOV    A,M    ;GET TYPE BYTE
  294.     CALL    HEXO    ;SHOW IT
  295.     INX    H    ;INCREMENT THE BUFFER POINTER
  296. ;
  297.     CALL    SP3    ;THREE SPACES
  298.     MOV    A,M    ;GET START TRACK ADDRESS
  299.     CALL    HEXO    ;SHOW IT
  300.     INX    H    ;INCR THE BUFFER POINTER
  301. ;
  302.     CALL    SP2    ;TWO SPACES
  303.     MOV    A,M    ;GET START SECTOR NUMBER
  304.     CALL    HEXO    ;SHOW IT
  305.     INX    H    ;INCR THE BUFFER POINTER
  306. ;
  307.     CALL    SP2    ;FINALLY TWO LAST SPACES
  308.     PUSH    D
  309.     MOV    D,M    ;GET MSB OF LENGTH
  310.     INX    H
  311.     MOV    E,M    ;GET LSB OF LENGTH
  312.     DCX    D    ;DECREMENT LENGTH FOR CRAZY FDOS
  313.     MOV    A,D    ;PRINT MSB OF ADJ LENGTH
  314.     CALL    HEXO    
  315.     MOV    A,E    ;PRINT LSB OF ADJ LENGTH
  316.     CALL    HEXO
  317.     POP     D
  318. ;
  319.     CALL    CRLF    ;GET READY FOR NEXT LINE
  320.     RET
  321. ;
  322. ;
  323. ;CONSOLE SPACE PRINTING ROUTINE
  324. ;
  325. SP5:
  326.     MVI    A,' '    ;5 SPACES
  327.     CALL    CTYPE
  328. SP4:
  329.     MVI    A,' '    ;4 SPACES
  330.     CALL    CTYPE
  331. SP3:
  332.     MVI    A,' '    ;3 SPACES
  333.     CALL    CTYPE
  334. SP2:
  335.     MVI    A,' '    ;2 SPACES
  336.     CALL    CTYPE
  337. SP1:
  338.     MVI    A,' '    ;1 SPACE
  339.     CALL    CTYPE
  340.     RET
  341. ;
  342. ;
  343. ;
  344. ;
  345. * * * * * * * * * * * * * * * * * * * * *
  346. *                    *
  347. *    FDOSWR: COPIES FILE TO FDOS     *
  348. *                    *
  349. * * * * * * * * * * * * * * * * * * * * *
  350. ;
  351. ;THE CP/M FILE SPECIFIED IN THE COMMAND
  352. ;IS TRANSFERRED TO THE FDOS III DISK IN DRIVE B:
  353. ;
  354. FDOSWR:
  355.     CALL    OPENFIL    ;OPEN THE FILE
  356.     MVI    C,01    ;SELECT DRIVE B:
  357.     CALL    SELDSK
  358.     MVI    A,00H    ;SET FDOS FILE EXIST FLAG FALSE
  359.     STA    FEFLG
  360.     MVI    A,00H    ;SETUP FOR DIRECTORY SCAN
  361.     JMP    SCAN2    ;JUMP INTO LOOP
  362. SCAN1:
  363.     MVI    A,01H    ;SET SCAN CODE FOR NEXT ENTRY
  364. SCAN2:
  365.     CALL    FDIRSC    ;SCAN FOR NEXT DIRECTORY ENTRY
  366.     ORA    A    ;SET FLAGS FOR RETURN CODE
  367.     JNZ    FDIRFUL    ;EXIT FOR FULL DIRECTORY
  368.     MVI    B,05    ;SETUP COMPARE OF FILE NAMES
  369.     LXI    D,FCB+1    ;..FOR 5 CHAR FROM CP/M FCB
  370.     LXI    H,FDENT    ;..TO FDOS III DIRECTORY ENTRY
  371.     CALL    COMPARE    ;GO DO THE COMPARE
  372.     ORA    A    ;CHECK    RETURN FLAG
  373.     JZ    FNOMAT    ;IF ZERO SKIP FLAG SET
  374.     MVI    A,0FFH    ;SET FILE EXISTS FLAG
  375.     STA    FEFLG
  376. FNOMAT:
  377.     LDA    FDENT+5    ;GET ENTRY TYPE BYTE
  378.     CPI    0FFH    ;ARE WE AT END OF LIST?
  379.     JNZ    SCAN1    ;IF NOT AT END THEN GO GET NEXT ENTRY
  380. ;
  381.     LDA    FEFLG    ;GET FLAG TO SEE IF FILE EXISTED
  382.     ORA    A
  383.     JNZ    FEXEX    ;GO EXIT WITH FILE EXISTS MESSAGE
  384.     MVI    B,11    ;MOVE END ENTRY INTO THE END HOLDING AREA
  385.     LXI    H,FDENT
  386.     LXI    D,ENDENT
  387.     CALL    MOVE
  388.     MVI    B,05    ;MOVE FILE NAME INTO FDOS DIRECTORY ENTRY
  389.     LXI    H,FCB+1
  390.     LXI    D,FDENT
  391.     CALL    MOVE
  392.     MVI    A,00    ;SET THE NEW FILE TYPE TO ZERO AS USER DATA
  393.     STA    FDENT+5
  394.     LXI    H,0000    ;SET INITIAL FILE LENGTH TO ZERO
  395.     SHLD    FDENT+8
  396. SENDLP:
  397.     CALL    RDSECT    ;READ A SECTOR
  398.     JC    UPDATD    ;UPDATE FDOS III DIRECTORY IF DONE
  399.     LXI    H,080H    ;MOVE SECTOR FROM CPM AREA
  400.     LXI    D,ODBUF
  401.     CALL    MOVE128
  402.     MVI    C,01    ;SELECT DISK DRIVE B:
  403.     CALL    SELDSK
  404.     LDA    ENDENT+6
  405.     MOV    C,A    ;GET AND SET TRACK NUMBER
  406.     CALL    SETTRK
  407.     LDA    ENDENT+7
  408.     MOV    C,A    ;GET SECTOR AND WRITE IT ON B:
  409.     CALL    FWRSEC
  410. ;
  411.     LDA    ENDENT+7  ;INCREMENT SECTOR NUMBER
  412.     INR    A
  413.     STA    ENDENT+7
  414.     CPI    01BH    ;CHECK IF TRACK FULL
  415.     JC    SAMTRK    ;NO, THEN STAY WITH THIS ONE
  416.     MVI    A,01H    ;SET SECTOR BACK IF NEW TRACK
  417.     STA    ENDENT+7
  418.     LDA    ENDENT+6  ;INCREMENT TRACK NUMBER
  419.     INR    A
  420.     STA    ENDENT+6
  421.     CPI    04DH    ;CHECK TRACK NUMBER FOR FULL DISK
  422.     JNC    DSKFUL
  423. ;
  424. SAMTRK:
  425.     LHLD    FDENT+8    ;GET CURRENT WRITTEN FILE SIZE
  426.     XCHG        ;CHANGE SIGNIFICANT ORDER
  427.     MOV    L,D
  428.     MOV    H,E
  429.     INX    H    ;INCREMENT BLOCK COUNT
  430.     XCHG        ;CHANGE ORDER BACK
  431.     MOV    L,D
  432.     MOV    H,E
  433.     SHLD    FDENT+8    ;SAVE NEW BLOCK COUNT
  434.     JMP    SENDLP    ;GO DO NEXT SECTOR
  435. ;
  436. ;FILE WRITTEN, NOW UPDATE THE DIRECTORY
  437. ;
  438. UPDATD:
  439.     XRA    A    ;INITIALIZE TWO SECTOR UPDATE FLAG
  440.     STA    U2SEC
  441. ;
  442.     LHLD    FDENT+8    ;GET CURRENT WRITTEN FILE SIZE
  443.     XCHG        ;CHANGE SIGNIFICANT ORDER
  444.     MOV    L,D
  445.     MOV    H,E
  446.     INX    H    ;INCREMENT BLOCK COUNT
  447.             ;ONE LAST TIME FOR COMPATABILITY
  448.             ;WITH CRAZY FDOS
  449.     XCHG        ;CHANGE ORDER BACK
  450.     MOV    L,D
  451.     MOV    H,E
  452.     SHLD    FDENT+8    ;SAVE NEW BLOCK COUNT
  453. ;
  454.     LXI    H,DIRBUF ;MOVE DIRECTORY SECTOR TO OUTPUT BUFFER
  455.     LXI    D,ODBUF
  456.     CALL    MOVE128
  457.     LDA    DIRSECI    ;GET DIRECTORY SECTOR INDEX    
  458.     LXI    H,ODBUF-11
  459.     LXI    D,11    ;MAKE INSERT POINTER FOR NEW ENTRY
  460. UPDAT:
  461.     DAD    D
  462.     DCR    A
  463.     JNZ    UPDAT
  464. ;
  465.     XCHG        ;PUT INSERT POINTER IN DE
  466.     LXI    H,FDENT    ;POINT TO NEW DIRECTORY ENTRY
  467.     MVI    B,11    ;LENGTH OF DIRECTORY ENTRY
  468.     CALL    MOVE    ;MOVE INTO OUTPUT BUFFER
  469.     LDA    DIRSECI    ;SEE IF NEW ENTRY IS LAST IN SECTOR
  470.     CPI    011
  471.     JNZ    ONESEC    ;JUMP TO PUT END ENTRY IN THIS SECTOR
  472. ;
  473.     MVI    A,0FFH    ;SET U2SEC FLAG
  474.     STA    U2SEC
  475.     JMP    WDIRSEC    ;GO WRITE CURRENT SECTOR
  476. ;
  477. ONESEC:
  478.     LXI    H,ENDENT ;PUT END ENTRY INTO THIS SECTOR
  479.     MVI    B,11    ;ENTRY LENGTH-- DE OK FROM PREVIOUS MOVE
  480.     CALL    MOVE    ;PUT IT IN
  481. ;
  482. WDIRSEC:
  483.     MVI    C,01    ;SELECT DRIVE B:
  484.     CALL    SELDSK
  485.     MVI    C,00    ;GO TO TRACK OF DIRECTORY
  486.     CALL    SETTRK
  487.     LDA    FDIRSEC    ;GET THE DIRECTORY SECTOR NUMBER
  488.     MOV    C,A
  489.     CALL    FWRSEC    ;GO WRITE THE SECTOR OF DIRECTORY
  490.     LDA    U2SEC    ;CHECK IF WE SHOULD UPDATE TWO SECTORS
  491.     ORA    A
  492.     JNZ    GETSEC    ;IF SO GO PREPARE FOR IT
  493. ;
  494.     JMP    DONE    ;ALL DONE
  495. ;
  496. GETSEC:
  497.     XRA    A
  498.     STA    U2SEC    ;RESET UPDATE TWO SECTORS FLAG
  499.     LDA    FDIRSEC    ;GET CURRENT DIRECTORY SECTOR NUMBER
  500.     INR    A
  501.     STA    FDIRSEC    ;STORE THIS NEW ONE AWAY
  502.     CPI    01BH    ;SEE IF DIRECTORY FULL HERE
  503.     JZ    UDFULL    ;GO PRINT EXIT MESSAGE
  504.     MOV    C,A
  505.     CALL    FRDSEC    ;GO READ NEXT SECTOR
  506.     LXI    H,IDBUF    ;MOVE INPUT BUFFER TO OUTPUT BUFFER
  507.     LXI    D,ODBUF
  508.     CALL    MOVE128
  509.     MVI    B,11    ;PUT IN ENDING ENTRY IN FIRST SLOT OF SECTOR
  510.     LXI    H,ENDENT
  511.     LXI    D,ODBUF
  512.     CALL    MOVE
  513.     JMP    WDIRSEC    ;GO WRITE THE SECOND UPDATED SECTOR
  514. ;
  515. ;
  516. ;EXIT POINT FROM WRITE IF FDOS III DIRECTORY IS FULL UPON UPDATE
  517. ;
  518. UDFULL:
  519.     CALL    ILPRT    ;PRINT DIRECTORY FULL MESSAGE
  520.     DB    CR,LF,'++FDOS III DIRECTORY FULL UPON UPDATE++'
  521.     DB    CR,LF,'++TRANSFERRED FILE EXISTS ON DISK++',CR,LF,0
  522.     JMP    EXIT
  523. ;
  524. ;
  525. ;EXIT POINT FROM WRITE IF FDOS III DIRECTORY IS FULL
  526. ;
  527. FDIRFUL:
  528.     CALL    ILPRT    ;PRINT DIRECTORY FULL MESSAGE
  529.     DB    CR,LF,'++FDOS III DIRECTORY MUST BE FULL++',CR,LF,0
  530.     JMP    EXIT
  531. ;
  532. ;
  533. ;EXIT POINT FROM WRITE IF FDOS III DISK GETS FULL
  534. ;
  535. DSKFUL:
  536.     CALL    ILPRT    ;PRINT DISK FULL MESSAGE
  537.     DB    CR,LF,'++FILE TOO BIG - FDOS III DISK FULL++'
  538.     DB    CR,LF,'++DIRECTORY NOT UPDATED WITH NEW FILE++',CR,LF,0
  539.     JMP    EXIT
  540. ;
  541. ;EXIT POINT FROM WRITE IF FDOS III FILE ALREADY EXISTS
  542. ;
  543. FEXEX:
  544.     CALL    ILPRT
  545.     DB    CR,LF,'++FDOS III FILE ALREADY EXISTS++'
  546.     DB    CR,LF,'++CHANGE NAME OF SOURCE FILE ON CP/M++',CR,LF,0
  547.     JMP    EXIT
  548. ;
  549. ;
  550. ;
  551. ;
  552. ;PARAMETER STORAGE AREA FOR FDOS WRITE ROUTINE
  553. ;
  554. U2SEC    DB    00    ;USED TO SEE IF TWO SECTORS S/B SET IN DIRECTORY
  555. FEFLG    DB    00    ;FDOS III FILE EXISTS IF SET
  556. ENDENT    DS    11    ;STORAGE FOR END ENTRY OF DIRECTORY
  557. ;
  558. ;
  559. ;
  560. * * * * * * * * * * * * * * * * * * * * *
  561. *                    *
  562. *    FDOSRD: COPY FILE FROM FDOS     *
  563. *                    *
  564. * * * * * * * * * * * * * * * * * * * * *
  565. ;
  566. ;FETCHES AN FDOS III FILE AND THEN WRITES
  567. ;IT TO A CP/M FILE ON DRIVE A:
  568. ;
  569. FDOSRD:
  570.     CALL    ERASFIL    ;ERASE THE CP/M FILE
  571.     CALL    MAKEFIL    ;..THEN MAKE NEW
  572.     MVI    C,01H    ;SELECT DISK DRIVE B:
  573.     CALL    SELDSK    ;..THROUGH BIOS ACCESS
  574.     MVI    A,00    ;SET SCAN FOR FIRST ENTRY
  575.     JMP    FIND2    ;JUMP INTO LOOP
  576. FIND1:
  577.     MVI    A,01    ;SET SCAN CODE FOR NEXT ENTRY
  578. FIND2:
  579.     CALL    FDIRSC    ;SCAN FOR NEXT DIRECTORY ENTRY
  580.     ORA    A    ;SET FLAGES FOR RETURN CODE
  581.     JNZ    FDNFEX    ;GO EXIT FOR NOT FOUND FDOS FILE
  582.     LDA    FDENT+5    ;GET ENTRY TYPE BYTE
  583.     CPI    0FFH    ;MUST BE AT END OF THE LIST
  584.     JZ    FDNFEX    ;GO EXIT FOR NOT FOUND FDOS FILE
  585.     MVI    B,05H    ;SETUP FOR COMPARE FILE NAMES
  586.     LXI    D,FCB+1    ;..FOR 5 CHAR FROM FCB TO
  587.     LXI    H,FDENT    ;..FDOS III DIRECTORY ENTRY
  588.     CALL    COMPARE    ;GO COMPARE
  589.     ORA    A    ;CHECK THE RETURN FLAG
  590.     JZ    FIND1    ;NO NAME MATCH IF ZERO    
  591. ;
  592. ;ADJUST BLOCK COUNT FOR REAL WORLD PEOPLE
  593. ;
  594.     LHLD    FDENT+8    ;GET REMAINING FILE SIZE
  595.     XCHG        ;CHANGE SIGNIFICANT ORDER
  596.     MOV    L,D
  597.     MOV    H,E
  598.     DCX    H    ;DECREMENT BLOCK COUNT
  599.             ;THIS ADJUSTS FILE SIZE FROM
  600.             ;CRAZY FDOS THAT SAVES LENGTH+1
  601.     XCHG        ;CHANGE ORDER BACK
  602.     MOV    L,D
  603.     MOV    H,E
  604.     SHLD    FDENT+8    ;PUT NEW BLOCK COUNT BACK
  605. ;
  606. ;FOUND FILE ON FDOS III DISK
  607. ;
  608. RCVLP:
  609.     MVI    C,01    ;SELECT DRIVE B: FOR FDOS
  610.     CALL    SELDSK
  611.     LDA    FDENT+6    ;GET AND SET TRACK NUMBER
  612.     MOV    C,A    ;GO DIRECT TO BDOS
  613.     CALL    SETTRK
  614.     LDA    FDENT+7    ;GET AND SET SECTOR NUMBER
  615.     MOV    C,A    ;SET AND READ SECTOR
  616.     CALL    FRDSEC
  617. ;
  618.     LXI    H,IDBUF    ;MOVE SECTOR TO CP/M AREA
  619.     LXI    D,080H
  620.     CALL    MOVE128
  621.     CALL    WRSECT    ;MOVE DATA TO CP/M QUEUE
  622. ;
  623.     LDA    FDENT+7    ;INCREMENT SECTOR NUMBER
  624.     INR    A
  625.     STA    FDENT+7    ;SAVE INCREMENTED SECTOR
  626.     CPI    01BH    ;CHECK IF TRACK DONE
  627.     JC    TRKOK
  628.     MVI    A,01H    ;SET SECTOR BACK FOR NEW TRACK
  629.     STA    FDENT+7    ;SAVE NEW SECTOR NUMBER
  630.     LDA    FDENT+6    ;INCREMENT TRACK NUMBER
  631.     INR    A
  632.     STA    FDENT+6
  633. TRKOK:
  634.     LHLD    FDENT+8    ;GET REMAINING FILE SIZE
  635.     XCHG        ;CHANGE SIGNIFICANT ORDER
  636.     MOV    L,D
  637.     MOV    H,E
  638.     DCX    H    ;DECREMENT BLOCK COUNT
  639.     XCHG        ;CHANGE ORDER BACK
  640.     MOV    L,D
  641.     MOV    H,E
  642.     SHLD    FDENT+8    ;PUT NEW BLOCK COUNT BACK
  643.     MOV    A,L    ;CHECK FOR DONE
  644.     ORA    H
  645.     JZ    RCVEOF    ;EXIT FOR END OF FDOS FILE
  646. ;
  647.     JMP    RCVLP    ;GO FOR NEXT SECTOR
  648. ;
  649. ;GOT EOF ON SECTOR - FLUSH BUFFERS, END
  650. ;
  651. RCVEOF:
  652.     CALL    WRBLOCK    ;WRITE THE LAST BLOCK
  653.     CALL    CLOSFIL    ;CLOSE THE FILE
  654.     JMP    DONE    ;GO PRINT END OF TRANSFER MESSAGE
  655. ;
  656. ;
  657. ;
  658. FDNFEX:
  659.     CALL    ILPRT    ;PRINT FDOS III FILE NOT FOUND
  660.     DB    CR,LF,'++FDOS FILE NOT FOUND++',CR,LF,0
  661.     JMP    EXIT
  662. ;
  663. ;
  664. ;
  665. * * * * * * * * * * * * * * * * * * * * *
  666. *                    *
  667. *        SUBROUTINES        *
  668. *                    *
  669. * * * * * * * * * * * * * * * * * * * * *
  670. ;
  671. ;
  672. ;
  673. ;---->    ERASFIL: ERASE THE INCOMING FILE.
  674. ;
  675. ;IF IT EXISTS, ASK IF IT MAY BE ERASED.
  676. ;
  677. ERASFIL:
  678.     LXI    D,FCB    ;POINT TO CTL BLOCK
  679.     MVI    C,SRCHF ;SEE IF IT..
  680.     CALL    BDOS    ;..EXISTS
  681.     INR    A    ;FOUND?
  682.     RZ        ;..NO, RETURN
  683.     CALL    ILPRT    ;PRINT:
  684.     DB    '++CP/M FILE EXISTS, TYPE Y TO ERASE: ',0
  685.     CALL    KEYIN    ;GET A CHARACTER FROM CONSOLE
  686.     ANI    5FH    ;MAKE UPPER CASE
  687.     CPI    'Y'    ;WANT ERASED?
  688.     JNZ    EXIT    ;QUIT IF NOT ERASE
  689.     CALL    CRLF    ;BACK TO START OF LINE
  690. ;
  691. ;ERASE OLD FILE
  692. ;
  693.     LXI    D,FCB    ;POINT TO FCB
  694.     MVI    C,ERASE    ;GET BDOS FNC
  695.     CALL    BDOS    ;DO THE ERASE
  696.     RET        ;FROM "ERASFIL"
  697. ;
  698. ;---->    MAKEFIL: MAKES THE FILE TO BE RECEIVED
  699. ;
  700. MAKEFIL:
  701.     LXI    D,FCB    ;POINT TO FCB
  702.     MVI    C,MAKE    ;GET BDOS FNC
  703.     CALL    BDOS    ;TO THE MAKE
  704.     INR    A    ;FF=BAD?
  705.     RNZ        ;OPEN OK
  706. ;DIRECTORY FULL - CAN'T MAKE FILE
  707.     CALL    ERXIT
  708.     DB    '++ERROR - CANNOT MAKE FILE',CR,LF
  709.     DB    '++DIRECTORY MUST BE FULL',CR,LF,'$'
  710. ;
  711. ;---->    OPENFIL: OPENS THE FILE TO BE SENT
  712. ;
  713. OPENFIL:
  714.     LXI    D,FCB    ;POINT TO FILE
  715.     MVI    C,OPEN    ;GET FUNCTION
  716.     CALL    BDOS    ;OPEN IT
  717.     INR    A    ;OPEN OK?
  718.     RNZ        ;FILE OPENED OK
  719.     CALL    ERXIT    ;..NO, ABORT
  720.     DB    'CANNOT OPEN CP/M FILE$'
  721. ;
  722. ;
  723. ;---->    CLOSFIL: CLOSES THE RECEIVED FILE
  724. ;
  725. CLOSFIL:
  726.     LXI    D,FCB    ;POINT TO FILE
  727.     MVI    C,CLOSE    ;GET FUNCTION
  728.     CALL    BDOS    ;CLOSE IT
  729.     INR    A    ;CLOSE OK?
  730.     RNZ        ;..YES, RETURN
  731.     CALL    ERXIT    ;..NO, ABORT
  732.     DB    'CANNOT CLOSE CP/M FILE$'
  733. ;
  734. ;---->    RDSECT: READS A SECTOR
  735. ;
  736. ;FOR SPEED, THIS ROUTINE BUFFERS UP 16
  737. ;SECTORS AT A TIME.
  738. ;
  739. RDSECT:
  740.     LDA    SECINBF    ;GET # SECT IN BUFF.
  741.     DCR    A    ;DECREMENT..
  742.     STA    SECINBF    ;..IT
  743.     JM    RDBLOCK    ;EXHAUSTED?  NEED MORE.
  744.     LHLD    SECPTR    ;GET POINTER
  745.     LXI    D,80H    ;TO DATA 
  746.     CALL    MOVE128    ;MOVE TO BUFFER
  747.     SHLD    SECPTR    ;SAVE BUFFER POINTER
  748.     STC
  749.     CMC        ;CLEAR CARRY SO EOF NOT INDICATED
  750.             ;ON NORMAL RETURN
  751.     RET        ;FROM "READSEC"
  752. ;
  753. ;BUFFER IS EMPTY - READ IN ANOTHER BLOCK OF 16
  754. ;
  755. RDBLOCK:
  756.     LDA    EOFLG    ;GET EOF FLAG
  757.     CPI    1    ;IS IT SET?
  758.     STC        ;TO SHOW EOF
  759.     RZ        ;GOT EOF
  760.     MVI    C,00H    ;SELECT DRIVE A:
  761.     CALL    SELDSK
  762.     MVI    C,0    ;SECTORS IN BLOCK
  763.     LXI    D,DBUF    ;TO DISK BUFFER
  764. RDSECLP:
  765.     PUSH    B
  766.     PUSH    D
  767.     MVI    C,STDMA    ;SET DMA..
  768.     CALL    BDOS    ;..ADDR
  769.     LXI    D,FCB
  770.     MVI    C,READ
  771.     CALL    BDOS
  772.     POP    D
  773.     POP    B
  774.     ORA    A    ;READ OK?
  775.     JZ    RDSECOK    ;YES
  776.     DCR    A    ;EOF?
  777.     JZ    REOF    ;GOT EOF
  778. ;
  779. ;READ ERROR
  780. ;
  781.     CALL    ERXIT
  782.     DB    '++CP/M FILE READ ERROR$'
  783. ;
  784. RDSECOK:
  785.     LXI    H,80H
  786.     DAD    D    ;TO NEXT BUFF
  787.     XCHG        ;BUFF TO DE
  788.     INR    C    ;MORE SECTORS?
  789.     MOV    A,C    ;GET COUNT
  790.     CPI    16    ;DONE?
  791.     JZ    RDBFULL    ;..YES, BUF IS FULL
  792.     JMP    RDSECLP    ;READ MORE
  793. ;
  794. REOF:
  795.     MVI    A,1
  796.     STA    EOFLG    ;SET EOF FLAG
  797.     MOV    A,C
  798. ;
  799. ;BUFFER IS FULL, OR GOT EOF
  800. ;
  801. RDBFULL:
  802.     STA    SECINBF    ;STORE SECTOR COUNT
  803.     LXI    H,DBUF    ;INIT BUFFER..
  804.     SHLD    SECPTR    ;..POINTER
  805.     LXI    D,80H    ;RESET..
  806.     MVI    C,STDMA    ;..DMA..
  807.     CALL    BDOS    ;..ADDR
  808.     JMP    RDSECT    ;PASS SECT TO CALLER
  809. ;
  810. ;---->    WRSECT: WRITE A SECTOR
  811. ;
  812. ;WRITES THE SECTOR INTO A BUFFER. WHEN 16
  813. ;HAVE BEEN WRITTEN, WRITES THE BLOCK TO DISK.
  814. ;
  815. ;ENTRY POINT "WRBLOCK" FLUSHES THE BUFFER AT EOF.
  816. ;
  817. WRSECT:
  818.     LHLD    SECPTR    ;GET BUFF ADDR
  819.     XCHG        ;TO DE FOR MOVE
  820.     LXI    H,80H    ;FROM HERE
  821.     CALL    MOVE128    ;MOVE TO BUFFER
  822.     XCHG        ;SAVE NEXT..
  823.     SHLD    SECPTR    ;..BLOCK POINTER
  824.     LDA    SECINBF    ;BUMP THE..
  825.     INR    A    ;..SECTOR #..
  826.     STA    SECINBF    ;..IN THE BUFF
  827.     CPI    16    ;HAVE WE 16?
  828.     RNZ        ;NO, RETURN
  829. ;
  830. ;---->    WRBLOCK: WRITES A BLOCK TO DISK
  831. ;
  832. WRBLOCK:
  833.     LDA    SECINBF    ;# SECT IN BUFFER
  834.     ORA    A    ;0 MEANS END OF FILE
  835.     RZ        ;NONE TO WRITE
  836.     PUSH    PSW    ;SAVE SECINBUF
  837.     MVI    C,00H    ;SELECT DISK DRIVE A:
  838.     CALL    SELDSK
  839.     POP    PSW    ;GET SECINBUF BACK
  840.     MOV    C,A    ;SAVE COUNT
  841.     LXI    D,DBUF    ;POINT TO DISK BUFF
  842. DKWRLP:
  843.     PUSH    H
  844.     PUSH    D
  845.     PUSH    B
  846.     MVI    C,STDMA    ;SET DMA
  847.     CALL    BDOS    ;TO BUFFER
  848.     LXI    D,FCB    ;THEN WRITE
  849.     MVI    C,WRITE    ;..THE..
  850.     CALL    BDOS    ;..BLOCK
  851.     POP    B
  852.     POP    D
  853.     POP    H
  854.     ORA    A
  855.     JNZ    WRERR    ;OOPS, ERROR
  856.     LXI    H,80H    ;LENGTH OF 1 SECT
  857.     DAD    D    ;HL= NEXT BUFF
  858.     XCHG        ;TO DE FOR SETDMA
  859.     DCR    C    ;MORE SECTORS?
  860.     JNZ    DKWRLP    ;..YES, LOOP
  861.     XRA    A    ;GET A ZERO
  862.     STA    SECINBF    ;RESET # OF SECTORS
  863.     LXI    H,DBUF    ;RESET BUFFER..
  864.     SHLD    SECPTR    ;..POINTER
  865.     RET
  866. ;
  867. WRERR:
  868.     CALL    ERXIT    ;EXIT W/MSG:
  869.  
  870.     DB    '++ERROR WRITING CP/M FILE',CR,LF,'$'
  871. ;
  872. ;
  873. ;---->  FRDSEC: READS A GIVEN SECTOR ACCORDING
  874. ;        TO FDOS III CONVENTION. REGISTER
  875. ;        C CONTAINS THE LOGICAL SECTOR NUMBER.
  876. ;
  877. FRDSEC:
  878.     MVI    B,00H    ;SET THE TABLE INDEX RIGHT
  879.     PUSH    B
  880.     PUSH    H
  881.     PUSH    D
  882.     LXI    H,TBL-1    ;MAKE POINTER TO SECTOR TRANSLATION TABLE
  883.     DAD    B    ;MAKE POINTER INTO TABLE
  884.     MOV    C,M    ;GET PHYSICAL SECTOR
  885.     CALL    SETSEC    ;SET SECTOR NUMBER PHYSICAL AT CONTROLLER
  886.     LXI    B,IDBUF    ;SETUP THE POINTER TO THE FDOS INPUT BUFFER
  887.     CALL    SETDMA    ;ACCESS BIOS DIRECT
  888.     CALL    RDSEC    ;READ THE SECTOR INTO BUFFER
  889.     POP    D
  890.     POP    H
  891.     POP    B
  892.     ORA    A    ;LOOK TO SEE IF READ ERROR
  893.     RZ        ;GO BACK IF NO ERRORS DETECTED
  894. ;
  895. ;FDOS DISK READ ERROR
  896. ;
  897.     CALL    ERXIT
  898.     DB    '++FDOS III DISK READ ERROR$'
  899. ;
  900. ;
  901. ;---->  FWRSEC:    WRITES A GIVEN SECTOR ACCORDING 
  902. ;        TO FDOS III CONVENTION. REGISTER C 
  903. ;        CONTAINS THE LOGICAL SECTOR NUMBER.
  904. ;
  905. ;
  906. FWRSEC:
  907.     MVI    B,00H    ;SET THE TABLE INDEX RIGHT
  908.     PUSH    B
  909.     PUSH    H
  910.     PUSH    D
  911.     LXI    H,TBL-1    ;MAKE POINTER TO SECTOR TRANSLATION TABLE
  912.     DAD    B    ;MAKE POINTER INTO TABLE
  913.     MOV    C,M    ;GET PHYSICAL SECTOR
  914.     CALL    SETSEC    ;SET SECTOR NUMBER PHYSICAL AT CONTROLLER
  915.     LXI    B,ODBUF    ;SETUP THE POINTER TO THE FDOS OUTPUT BUFFER
  916.     CALL    SETDMA    ;ACCESS BIOS DIRECT
  917.     CALL    WRTSEC    ;WRITE THE SECTOR INTO BUFFER
  918.     POP    D
  919.     POP    H
  920.     POP    B
  921.     ORA    A    ;LOOK TO SEE IF WRITE ERROR
  922.     RZ        ;GO BACK IF NO ERRORS DETECTED
  923. ;
  924. ;FDOS DISK WRITE ERROR
  925. ;
  926.     CALL    ERXIT
  927.     DB    '++FDOS III DISK WRITE ERROR$'
  928. ;
  929. ;
  930. ;
  931. ;
  932. ;---->    INITADR: INIT'S CP/M BDOS ADDRESSES
  933. ;
  934. ;THIS ROUTINE FILLS IN THE ADDRESSES OF VARIOUS
  935. ;JUMP VECTOR ENTRY POINTS SO THAT CP/M BDOS
  936. ;IS BYPASSED WHILE ACCESSING THE FDOS III DISK
  937. ;IN DRIVE B: SO THAT THE MODIFIED LOGICAL
  938. ;SECTORING MAY BE USED.
  939. ;
  940. INITADR:
  941.     LHLD    1    ;GET WARM BOOT ADDR
  942.     LXI    D,015H    ;OFFSET TO HOME VECTOR
  943.     DAD    D    ;TO HOME DISK ROUTINE
  944.     SHLD    HOME+1  ;SET INTERNAL HOME VECTOR
  945.     LXI    D,003H    ;OFFSET TO NEXT VECTOR
  946.     DAD    D    ;TO SELECT DISK ROUTINE
  947.     SHLD     SELDSK+1;SET INTERNAL SELDSK VECTOR
  948.     DAD    D    ;TO SET TRACK ROUTINE
  949.     SHLD    SETTRK+1;SET INTERNAL SETTRK VECTOR
  950.     DAD    D    ;TO SET SECTOR ROUTINE
  951.     SHLD    SETSEC+1;SET INTERNAL SETSEC VECTOR
  952.     DAD    D    ;TO SET DMA ADDRESS ROUTINE
  953.     SHLD    SETDMA+1;SET INTERNAL SETDMA VECTOR
  954.     DAD    D    ;TO READ SECTOR ROUTINE
  955.     SHLD    RDSEC+1    ;SET INTERNAL READ VECTOR
  956.     DAD    D    ;TO WRITE SECTOR ROUTINE
  957.     SHLD    WRTSEC+1;SET INTERNAL WRITE VECTOR
  958. ;
  959.     RET
  960. ;
  961. ;
  962. ;----> ENTRY POINTS FOR BIOS DISK ACCESS PRIMATIVES-ADDRESSES SETUP AT INIT
  963. ;
  964. HOME:
  965.     JMP    $-$    ;HOME DISK INTERNAL VECTOR
  966. SELDSK:
  967.     JMP    $-$    ;SELECT DISK INTERNAL VECTOR
  968. SETTRK:
  969.     JMP    $-$    ;SET TRACK INTERNAL VECTOR
  970. SETSEC:
  971.     JMP    $-$    ;SET SECTOR INTERNAL VECTOR
  972. SETDMA:
  973.     JMP    $-$    ;SET DMA ADDRESS INTERNAL VECTOR
  974. RDSEC:
  975.     JMP    $-$    ;READ SECTOR INTERNAL VECTOR
  976. WRTSEC:
  977.     JMP    $-$    ;WRITE SECTOR INTERNAL VECTOR
  978. ;
  979. ;
  980. ;
  981. ;---->    PROCOPT: PROCESS COMMAND OPTIONS
  982. ;SAVES THE PROGRAM OPTION IN 'OPTION';
  983. ;
  984. PROCOPT:
  985.     LXI    D,FCB+1    ;TO PROGRAM OPT.
  986.     LDAX    D    ;GET OPTION
  987.     STA    OPTION    ;SAVE IT
  988.     RET        ;FROM 'PROCOPT'
  989. ;
  990. ;DONE - CLOSE UP SHOP
  991. ;
  992. DONE:
  993.     CALL    ILPRT
  994.     DB    CR,LF,'TRANSFER COMPLETE'
  995.     DB    CR,LF,0
  996. ;
  997.     JMP    EXIT    ;DONE, GO BACK
  998. ;
  999. ;
  1000. ;ROUTINE MOVES THE FILENAME FROM THE SECOND FCB
  1001. ;TO THE FIRST
  1002. ;
  1003. MOVEFCB:
  1004.     LXI    H,FCB+16 ;FROM
  1005.     LXI    D,FCB    ;TO
  1006.     MVI    B,16    ;LEN
  1007.     CALL    MOVE    ;DO THE MOVE
  1008.     XRA    A    ;GET 0
  1009.     STA    FCBSNO    ;ZERO SECTOR #
  1010.     STA    FCB    ;..AND DRIVE DESIGNATOR
  1011.     STA    FCBEXT    ;..AND EXTENT
  1012.     RET
  1013. ;
  1014. ;
  1015. ;---->  KEYIN: GETS A KEY CODE IN FROM CONSOLE
  1016. ;
  1017. KEYIN:
  1018.     PUSH    B    ;SAVE..
  1019.     PUSH    D    ;..ALL..
  1020.     PUSH    H    ;..REGS
  1021.     MVI    C,RDCON    ;GET CONSOLE CHARACTER FUNCTION CODE
  1022.     CALL    BDOS    ;GET CHARACTER
  1023.     MOV    A,E
  1024.     POP    H    ;RESTORE..
  1025.     POP    D    ;..ALL..
  1026.     POP    B    ;..REGS
  1027.     RET
  1028. ;
  1029. ;
  1030. ;---->    CTYPE: TYPES VIA CP/M SO TABS ARE EXPANDED
  1031. ;
  1032. CTYPE:
  1033.     PUSH    B    ;SAVE..
  1034.     PUSH    D    ;..ALL..
  1035.     PUSH    H    ;..REGS
  1036.     MOV    E,A    ;CHAR TO E
  1037.     MVI    C,WRCON    ;GET BDOS FNC
  1038.     CALL    BDOS    ;PRIN THE CHR
  1039.     POP    H    ;RESTORE..
  1040.     POP    D    ;..ALL..
  1041.     POP    B    ;..REGS
  1042.     RET        ;FROM "CTYPE"
  1043. ;
  1044. CRLF:
  1045.     MVI    A,CR
  1046.     CALL    CTYPE
  1047.     MVI    A,LF
  1048.     CALL    CTYPE
  1049.     RET
  1050. ;
  1051. ;
  1052. ;HEX OUTPUT
  1053. ;
  1054. HEXO:
  1055.     PUSH    PSW    ;SAVE FOR RIGHT DIGIT
  1056.     RAR        ;RIGHT..
  1057.     RAR        ;..JUSTIFY..
  1058.     RAR        ;..LEFT..
  1059.     RAR        ;..DIGIT..
  1060.     CALL    NIBBL    ;PRINT LEFT DIGIT
  1061.     POP    PSW    ;RESTORE RIGHT
  1062.     CALL    NIBBL    ;PRINT RIGHT DIGIT
  1063.     RET
  1064. ;
  1065. ;
  1066. NIBBL:
  1067.     ANI    0FH    ;ISOLATE DIGIT
  1068.     CPI    10    ;IS IS <10?
  1069.     JC    ISNUM    ;YES, NOT ALPHA
  1070.     ADI    7    ;ADD ALPHA BIAS
  1071. ISNUM:
  1072.     ADI    '0'    ;MAKE PRINTABLE
  1073.     CALL    CTYPE    ;..THEN TYPE IT
  1074.     RET
  1075. ;
  1076. ;
  1077. ;---->    ILPRT: INLINE PRINT OF MSG
  1078. ;
  1079. ;THE CALL TO ILPRT IS FOLLOWED BY A MESSAGE,
  1080. ;BINARY 0 AS THE END.  BINARY 1 MAY BE USED TO
  1081. ;PAUSE (MESSAGE 'PRESS RETURN TO CONTINUE')
  1082. ;
  1083. ILPRT:
  1084.     XTHL        ;SAVE HL, GET HL=MSG
  1085. ILPLP:
  1086.     MOV    A,M    ;GET CHAR
  1087.     ORA    A    ;END OF MSG?
  1088.     JZ    ILPRET    ;..YES, RETURN
  1089.     CPI    1    ;PAUSE?
  1090.     JZ    ILPAUSE    ;..YES
  1091.     CALL    CTYPE    ;TYPE THE CHARACTER OF MESSAGE
  1092. ILPNEXT:
  1093.     INX    H    ;TO NEXT CHAR
  1094.     JMP    ILPLP    ;LOOP
  1095. ;
  1096. ;PAUSE WHILE TYPING HELP SO INFO DOESN'T
  1097. ;    SCROLL OFF OF VIDEO SCREENS
  1098. ;
  1099. ILPAUSE:
  1100.     CALL    ILPRT    ;PRINT:
  1101.  
  1102.     DB    CR,LF,'PRESS RETURN TO CONTINUE OR ^C TO EXIT'
  1103.     DB    CR,LF,0
  1104.     CALL    KEYIN    ;GET ANY CHAR
  1105.     CPI    'C'-40H    ;REBOOT?
  1106.     JZ    EXIT    ;YES.
  1107.     JMP    ILPNEXT    ;LOOP
  1108. ;
  1109. ILPRET:
  1110.     XTHL        ;RESTORE HL
  1111.     RET        ; & RETURN ADDR PAST MESSAGE
  1112. ;
  1113. ;---->    PRTMSG: PRINTS MSG POINTED TO BY (DE)
  1114. ;
  1115. ;A '$' IS THE ENDING DELIMITER FOR THE PRINT.
  1116. ;NO REGISTERS SAVED.
  1117. ;
  1118. PRTMSG:
  1119.     MVI    C,PRINT    ;GET BDOS FNC
  1120.     JMP    BDOS    ;PRINT MESSAGE, RETURN
  1121. ;
  1122. ;---->    ERXIT: EXIT PRINTING MSG FOLLOWING CALL
  1123. ;
  1124. ERXIT:
  1125.     POP    D    ;GET MESSAGE
  1126.     CALL    PRTMSG    ;PRINT IT
  1127. ;
  1128. EXIT:
  1129.     MVI    C,00H    ;SET SELECTED UNIT BACK TO A:
  1130.     CALL    SELDSK
  1131.     LXI    D,080H    ;RESET DEFAULT DMA ADDRESS FOR EXIT
  1132.     MVI    C,STDMA
  1133.     CALL    BDOS
  1134.     LHLD    STACK    ;GET ORIGINAL STACK
  1135.     SPHL        ;RESTORE IT
  1136.     JMP    WBOOT    ;GO DO A WARM BOOT OF CP/M SO THIS 
  1137.             ;THING WILL WORK IN A SUBMIT FILE
  1138. ;
  1139. ;MOVE 128 CHARACTERS
  1140. ;
  1141. MOVE128:
  1142.     MVI    B,128    ;SET MOVE COUNT
  1143. ;
  1144. ;MOVE FROM (HL) TO (DE) LENGTH IN (B)
  1145. ;
  1146. MOVE:
  1147.     MOV    A,M    ;GET A CHAR
  1148.     STAX    D    ;STORE IT
  1149.     INX    H    ;TO NEXT "FROM"
  1150.     INX    D    ;TO NEXT "TO"
  1151.     DCR    B    ;MORE?
  1152.     JNZ    MOVE    ;..YES, LOOP
  1153.     RET        ;..NO, RETURN
  1154. ;
  1155. ;
  1156. ;COMPARE FROM (HL) TO (DE) FOR (B) BYTES
  1157. ;RETURN WITH A REGISTER:
  1158. ;    =00 IF NO COMPARE
  1159. ;    =FF IF VALID COMPARE
  1160. ;
  1161. COMPARE:
  1162.     LDAX    D    ;GET A CHAR
  1163.     CMP    M    ;CHECK AGAINST OTHER
  1164.     JNZ    COMFAL    ;GO EXIT FOR FAIL
  1165.     INX    H    ;INCREMENT COMPARE POINTERS
  1166.     INX    D
  1167.     DCR    B    ;DECREMENT CHAR COUNT
  1168.     JNZ    COMPARE    ;MORE?
  1169.     MVI    A,0FFH    ;EXIT FOR GOOD COMPARE
  1170.     RET
  1171. COMFAL:
  1172.     XRA    A    ;EXIT FOR NON COMPARE
  1173.     RET
  1174. ;
  1175. ;
  1176. ;    ----------------
  1177. ;
  1178. ;PROGRAM DATA AREA SPACE ALLOCATIONS
  1179. ;
  1180. OPTION    DB    0    ;PROGRAM OPTION
  1181. ;
  1182. ;
  1183. ;FOLLOWING 3 USED BY THE CP/M DISK BUFFERING ROUTINES
  1184. ;
  1185. EOFLG    DB    0    ;EOF FLAG (1=TRUE)
  1186. SECPTR    DW    DBUF
  1187. SECINBF    DB    0    ;# OF SECTORS IN BUFFER
  1188. ;
  1189. ;
  1190. ;
  1191. ;FDOS III LOGICAL TO PHYSICAL SECTOR MAP
  1192. ;TABLE ENTRIES ARE IN LOGICAL SECTOR ORDER
  1193. ;
  1194. ;
  1195. TBL:    DB    001H
  1196.     DB    00AH
  1197.     DB    013H
  1198.     DB    002H
  1199.     DB    00BH
  1200.     DB    014H
  1201.     DB    003H
  1202.     DB    00CH
  1203.     DB    015H
  1204.     DB    004H
  1205.     DB    00DH
  1206.     DB    016H
  1207.     DB    005H
  1208.     DB    00EH
  1209.     DB    017H
  1210.     DB    006H
  1211.     DB    00FH
  1212.     DB    018H
  1213.     DB    007H
  1214.     DB    010H
  1215.     DB    019H
  1216.     DB    008H
  1217.     DB    011H
  1218.     DB    01AH
  1219.     DB    009H
  1220.     DB    012H
  1221.     DB    000H    ;DUMMY ENTRY
  1222.     DB    000H    ;DUMMY ENTRY
  1223.     DB    000H    ;DUMMY ENTRY
  1224. ;
  1225. ;
  1226. ;FDOS III FILE HANDLER PARAMETER STORAGE LOCATIONS
  1227. ;
  1228. ;
  1229. FDENT    DS    11    ;TEMPORARY STORAGE FOR A DIRECTORY ENTRY
  1230. ;
  1231. ;
  1232. ;SETUP A STACK AREA
  1233. ;
  1234.     DS    200    ;STACK AREA
  1235. STACK    DS    2    ;STACK POINTER
  1236. ;
  1237. ;+++++++++
  1238. ;+++++++++
  1239. ;++
  1240. ;++ NOTE: THE FOLLOWING DISK DATA BUFFERS ARE ALLOCATED
  1241. ;++       OVER THE HELP FILE AND NON DISK I/O SOFTWARE
  1242. ;++
  1243. ;+++++++++
  1244. ;+++++++++
  1245. ;
  1246. ;
  1247. ;
  1248. ;INPUT AND OUTPUT BUFFER STORAGE ALLOCATIONS FOR FDOS III DISK
  1249. ;
  1250. IDBUF    EQU    $     ;SINGLE SECTOR INPUT BUFFER
  1251. ODBUF    EQU    $+128    ;SINGLE SECTOR OUTPUT BUFFER
  1252. ;
  1253. ;
  1254. ;
  1255. ;16 SECTOR CP/M DISK BUFFER 
  1256. ;
  1257. DBUF    EQU    $+256    ;16 SECTOR CP/M DISK BUFFER
  1258. ;
  1259. ;INVALID COMMAND
  1260. ;
  1261. BADOPT:
  1262.     CALL    CTYPE
  1263.     CALL    ILPRT    ;EXIT W/ERROR
  1264.     DB    ': INVALID OPTION FOR PROGRAM SELECTION '
  1265.     DB    'COMMAND - ',CR,LF
  1266.     DB    'PRESS CTL-C TO ABORT',1,0
  1267. ;
  1268. HELP:
  1269.     CALL    ILPRT
  1270.     DB    CR,LF,CR,LF,'FORMAT FOR COMMAND IS:',CR,LF,CR,LF
  1271.     DB    'FDOS # FILENAME',CR,LF,CR,LF
  1272.     DB    'WHERE # IS A 1 CHARACTER PROGRAM OPTION,',CR,LF
  1273.     DB    'PROGRAM OPTIONS:',CR,LF
  1274.     DB    '    R TO READ AN FDOS III FILE FROM B:',CR,LF
  1275.     DB    '    W TO WRITE AN FDOS III FILE TO B:',CR,LF
  1276.     DB    '    D TO VIEW THE FDOS III DIRECTORY ON B:',CR,LF
  1277.     DB    '    H TO PRINT THIS HELP FILE',CR,LF,CR,LF,0
  1278.     JMP    EXIT
  1279. ;
  1280. ;
  1281. ; BDOS EQUATES (VERSION 2)
  1282. ;
  1283. RDCON    EQU    1
  1284. WRCON    EQU    2
  1285. PRINT    EQU    9
  1286. CONST    EQU    11    ;CONSOLE STAT
  1287. OPEN    EQU    15    ;0FFH=NOT FOUND
  1288. CLOSE    EQU    16    ;    "    "
  1289. SRCHF    EQU    17    ;    "    "
  1290. SRCHN    EQU    18    ;    "    "
  1291. ERASE    EQU    19    ;NO RET CODE
  1292. READ    EQU    20    ;0=OK, 1=EOF
  1293. WRITE    EQU    21    ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC
  1294. MAKE    EQU    22    ;0FFH=BAD
  1295. REN    EQU    23    ;0FFH=BAD
  1296. STDMA    EQU    26    ;SET DMA
  1297. BDOS    EQU    5
  1298. REIPL    EQU    0
  1299. FCB    EQU    5CH    ;SYSTEM FCB
  1300. FCBEXT    EQU    FCB+12    ;FILE EXTENT
  1301. FCBSNO    EQU    FCB+32    ;SECTOR #
  1302. FCB2    EQU    6CH    ;SECOND FCB
  1303.     END
  1304.