home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG036.ARK / TOP.AZM < prev    next >
Text File  |  1984-04-29  |  10KB  |  519 lines

  1. .TITLE "CP/M DISK I/O DRIVERS FOR TDL'S TEXT OUTPUT PROCESSOR VER. 1.0"
  2. ;
  3. ; MIKE FAVITTA
  4. ; 2 JANET LANE
  5. ; ALBANY, NY 12203
  6. ;
  7. ; THIS PROGRAM ADAPTS THE TDL TEXT OUTPUT PROCESSOR
  8. ; TO WORK UNDER CP/M.
  9. ;
  10. ; SEE TOP.DOC FOR DETAILS
  11. ;
  12. ;***********************************
  13. ;    CP/M STANDARD EQUATES
  14. ;***********************************
  15.  
  16. BOOT = 0000H    ;WARM START ADDRESS
  17. TFCB = 005CH    ;DEFAULT FCB ADDRESS
  18. TBUF = 0080H    ;DEFAULT BUFFER ADDRESS
  19. TBASE = 0100H    ;TRANSIENT PROGRAM BASE
  20. BDOS = 0005H    ;BDOS ENTRY POINT
  21.  
  22. ;***********************************
  23. ;    CP/M FUNCTION CODES
  24. ;***********************************
  25.  
  26. SRSET = 00    ;SYSTEM RESET
  27. RCON = 01    ;READ CONSOLE
  28. WCON = 02    ;WRITE CONSOLE
  29. RRDR = 03    ;READ READER
  30. WPUN = 04    ;WRITE PUNCH
  31. WLST = 05    ;WRITE LIST
  32. ISTAT = 07    ;GET IOSTATUS
  33. SSTAT = 08    ;SET IOSTATUS
  34. WCONB = 09    ;WRITE CONSOLE BUFFER
  35. RCONB = 10    ;READ CONSOLE BUFFER
  36. CSTAT = 11    ;CHECK CONSOLE STATUS
  37. LHEAD = 12    ;LIFT DISK HEAD
  38. RSDSK = 13    ;RESET DISK SYSTEM
  39. SDISK = 14    ;SELECT DISK
  40. OPEN = 15    ;OPEN FILE
  41. CLOSE = 16    ;CLOSE FILE
  42. SFRST = 17    ;SEARCH FIRST
  43. SNEXT = 18    ;SEARCH NEXT
  44. FDELT = 19    ;DELETE FILE
  45. READ = 20    ;READ RECORD
  46. WRITE = 21    ;WRITE RECORD
  47. CREATE = 22    ;CREATE FILE
  48. RENAM = 23    ;RENAME FILE
  49. LOGIN = 24    ;GET LOGIN
  50. IDISK = 25    ;GET DISK NUMBER
  51. SDMA = 26    ;SET DMA VECTOR
  52. IALLOC = 27    ;GET ALLOCATION VECTOR
  53. ;
  54. EOF = 1AH    ; CP/M END OF FILE CHAR
  55. CR = 0DH
  56. LF = 0AH
  57. ;
  58. .PABS        ; USE INTEL HEX FORMAT
  59. .LOC 100H    ; USE CP/M RUN ADDRESS
  60. ;
  61. START:    JMP TOPDK
  62. ;
  63. ;
  64. ; TRANSIENT PROGRAM STORAGE
  65. ; DEFINITIONS
  66. ;
  67. SDSK:    .WORD 0        ; SOURCE DRIVE
  68. ODSK:    .WORD 1        ; OUTPUT DRIVE
  69. OPT:    .WORD 0        ; SAVE OPTIONS HERE
  70. SRCPTR:    .WORD SRCBUF+128; SOURCE BUFFER POINTER
  71. LSTPTR:    .WORD LSTBUF    ; LISTING BUFFER POINTER
  72. SRCFCB:    .BLKB 36    ; SOURCE FILE CONTROL BLOCK
  73. SRCBUF:    .BLKB 128    ; SOURCE FILE BUFFER
  74. LSTFCB:    .BLKB 36    ; LISTING FILE CONTROL BLOCK
  75. LSTBUF:    .BLKB 128    ; LISTING FILE BUFFER
  76. ;
  77. ;
  78. TOPDK:    LXI SP,TOPST+16EH    ; SET TEMP STACK
  79.     LXI H,SRCFCB    
  80.     LXI B,TOPDK-SRCFCB
  81.     MVI A,0
  82. CLEAR:    MOV M,A        ; ZERO FCB AND BUFFER
  83.     INX H         ; AREAS
  84.     DCX B
  85.     CMP C    
  86.     JRNZ CLEAR
  87.     CMP B
  88.     JRNZ CLEAR
  89.     LDA TFCB+17    ; SAVE OPTIONS
  90.     STA OPT
  91.     LDA TFCB+18
  92.     STA OPT+1
  93.     MVI C,IDISK    ; GET ACTIVE DRIVE #
  94.     CALL BDOS
  95.     MOV C,A
  96.     MVI A,'S'    ; IS THE
  97.     CALL OPTS    ; S OPTION SET
  98.     MOV A,C
  99.     JRNZ DUAL     ; NO,SET UP FOR 2 DRIVES
  100.     STA SDSK    ; SET UP FOR 1 DRIVE
  101.     STA ODSK
  102.     JMPR SKIP
  103. DUAL:    BIT 0,A        ; IS SOURCE ON A
  104.     JRZ SKIP
  105.     STA SDSK    ; SOURCE ON B
  106.     MVI A,0
  107.     STA ODSK
  108. SKIP:    LXI H,TOP     ; INSERT FILETYPE
  109.     CALL CKFIL
  110.     CPI 0FFH    ; FILE EXIST?
  111.     JRNZ GOTFIL    ; YES
  112.     LXI H,DOC    ; NO, TRY DOC EXT
  113.     CALL CKFIL
  114.     MVI C,0        ; ERROR 0
  115.     CPI 0FFH    ; FILE EXIST?
  116.     CZ ERROR    ; NO, ERROR
  117. GOTFIL:    LXI H,TFCB    ; MOVE FILE NAME TO SRCFCB
  118.     LXI D,SRCFCB
  119.     LXI B,12
  120.     LDIR        ; MOVE BLOCK
  121.     LXI D,SRCBUF    ; MAKE SURE SRCBUF
  122.     MVI C,SDMA    ; IS USED
  123.     CALL BDOS
  124.     LXI D,SRCFCB    ; OPEN SOURCE FILE
  125.     MVI C,OPEN
  126.     CALL BDOS
  127.     MVI C,1        ; ERROR 1
  128.     CPI 0FFH
  129.     CZ ERROR
  130.     MVI A,'D'    ; ONLY WANT LIST FILE
  131.     CALL OPTS    ; IF D OPT IS SET
  132.     JRNZ ..SKP
  133.     LDED ODSK    ; LOG IN OUTPUT DRIVE
  134.     MVI C,SDISK
  135.     CALL BDOS
  136.     LXI D,LSTFCB    ; CREATE LISTING FILE
  137.     LXI B,PRN
  138.     CALL MAKEF
  139. ..SKP:    JMP TOPST    ; GO ASSEMBLE
  140. ;
  141. ; TABLE OF FILETYPES
  142. ;
  143. TOP:    .ASCII 'TOP'
  144. DOC:    .ASCII 'DOC'
  145. PRN:    .ASCII 'PRN'
  146. ;
  147. ; CHECK IF FILE EXISTS WITH
  148. ; EXT POINTED TO BY HL
  149. ;
  150. CKFIL:    LXI D,TFCB+9
  151.     LXI B,3        ; IN TRANSIENT FCB
  152.     LDIR        ; MOVE FILETYPE
  153.     LXI D,TFCB    ; CHECK DIRECTORY
  154.     MVI C,SFRST    ; TO SEE IF FILE EXISTS
  155.     CALL BDOS
  156.     RET
  157. ;
  158. ; TEXT OUTPUT PROCESSOR IS DONE
  159. ; MUST WRAP UP LOOSE ENDS
  160. ;
  161. TRPSIM:    MVI A,'D'    ; DON'T CLOSE IF
  162.     CALL OPTS    ; D OPT ISN'T SET
  163.     JRNZ DONE
  164.     MVI C,EOF    ; FILL WITH EOF'S
  165. LOOP:    CALL OUTSIM    ; AND EMPTY BUFFER
  166.     JRNC LOOP
  167.     MVI C,CLOSE    ; CLOSE FILE
  168.     LXI D,LSTFCB
  169.     CALL BDOS
  170. DONE:    JMP BOOT
  171. ;
  172. ; IF CHAR IN A MATCHES 1 OF THE
  173. ; OPTIONS, SET THE ZERO FLAG
  174. ;
  175. OPTS:    PUSH H
  176.     LXI H,OPT    ; POINT TO OPTIONS
  177.     CMP M        ; MATCH ?
  178.     JRZ ..SKP     ; YES,RETURN
  179.     INX H         ; NO,TRY NEXT ONE
  180.     CMP M
  181. ..SKP:    POP H
  182.     RET
  183. ;
  184. ; SIMULATE CONSOLE INPUT
  185. ;
  186. CISIM:    PUSH H    ; SAVE ASSEMBLER REGISTERS
  187.     PUSH D
  188.     PUSH B
  189.     MVI C,RCON    ; READ A CHAR FROM
  190.     CALL BDOS    ; CP/M CONSOLE
  191.     POP B
  192.     POP D
  193.     POP H
  194.     RET
  195. ;
  196. ; CHARACTER INPUT SUBROUTINE
  197. ;
  198. ; CREATE A SOURCE BUFFER AND LOAD
  199. ; IT FROM THE DISK. AT EACH CALL
  200. ; SUPPLY ONE CHARCTER IN A REG.
  201. ; IF BUFFER EMPTY, CALL BDOS TO
  202. ; FILL IT. SET CARRY IF EOF IS
  203. ; FOUND IN FILE.
  204. ;
  205. RISIM:    PUSH H        ; SAVE ASSM HL,DE
  206.     PUSH D
  207.     LXI D,SRCFCB    ; GET FCB ADDRESS
  208.     LHLD SRCPTR    ; GET BUFFER POINTER
  209.     CALL BUFIN    ; READ A BYTE
  210.     SHLD SRCPTR    ; SAVE BUFFER POINTER
  211.     POP D        ; RESTORE HL,DE
  212.     POP H
  213.     CPI EOF        ; CHECK FOR EOF CHAR
  214.     STC        ; SET EOF FLAG IN CARRY
  215.     RZ
  216.     CMC        ; NOT EOF, ERASE MARK
  217.     RET
  218. ;
  219. ; DETERMINE WHERE OUTPUT 
  220. ; SHOULD GO
  221. ;
  222. OUTSIM:    PUSH D        ; SAVE TOP'S REGISTERS
  223.     PUSH H
  224.     MVI A,'D'    ; D OPT SET ?
  225.     CALL OPTS
  226.     JRZ POSIM    ; YES, DISK FILE
  227.     JMPR LOSIM    ; NO, LIST DEVICE
  228. ;
  229. ; LIST DEVICE CHARACTER OUTPUT
  230. ;
  231. ; WRITE TOP OUTPUT TO THE
  232. ; LIST DEVICE
  233. ;
  234. LOSIM:    PUSH B
  235.     MOV E,C
  236.     MVI C,WLST    ; OUTPUT 1 CHAR
  237.     CALL BDOS
  238.     POP B
  239.     POP H
  240.     POP D
  241.     MOV A,C
  242.     RET
  243. ;
  244. ;
  245. ; PUNCH CHARACTER OUTPUT
  246. ; SIMILAR TO LIST OUTPUT BUT CHAR
  247. ; GOES TO A DISK FILE
  248. ;
  249. POSIM:    LHLD LSTPTR
  250.     LXI D,LSTFCB
  251.     CALL BUFOUT
  252.     SHLD LSTPTR
  253.     POP H
  254.     POP D
  255.     RET
  256. ;
  257. ; SOURCE BUFFER CONTROL
  258. ; REFILL BUFFER IF EMPTY, PUT NEXT CHARACTER IN A
  259. ; ENTER WITH FCB ADDRESS IN DE, BUFFER POINTER IN HL
  260. ; SAVES BC, RETURNS WITH CHAR IN A, BUFFER POINTER IN HL
  261. ;
  262. BUFIN:    MOV A,E        ; COMPUTE END OF BUFFER
  263.     ADI SRCBUF+128-SRCFCB
  264.     CMP L
  265.     JRNZ SRCB1
  266.     PUSH B
  267.     MVI C,READ
  268.     CALL REFILL
  269.     ANI 0FEH    ; CHECK FOR GOOD READ
  270.     CPI 0
  271.     MVI C,2        ; ERROR 2
  272.     CNZ ERROR
  273.     POP B
  274. SRCB1:    MOV A,M
  275.     INX H
  276.     RET
  277. ;
  278. ;
  279. ; OUTPUT BUFFER CONTROL
  280. ;
  281. ; IF BUFFER FULL, WRITE CONTENTS TO DISK,
  282. ; PUT CHAR FROM C IN BUFFER.
  283. ;
  284. ; ENTER WITH FCB ADDR IN DE, BUFFER PTR IN HL,
  285. ; AND CHAR IN C.
  286. ; RETURN WITH BUFFER PTR IN HL,SAVE BC,SET CARRY AFTER
  287. ; BUFFER REFILL.
  288. ;
  289. BUFOUT:    MOV A,E        ; COMPUTE END OF BUFFER
  290.     ADI 164
  291.     CMP L         ; FULL?
  292.     STC        ; CLEAR CARRY
  293.     CMC
  294.     JRNZ BUFOU1    ; NOT FULL, STORE CHAR
  295.     PUSH B        ; FULL, SAVE CHAR
  296.     MVI C,WRITE
  297.     CALL REFILL
  298.     CPI 0        ; GOOD WRITE?
  299.     MVI C,3        ; ERROR 3
  300.     CNZ ERROR
  301.     POP B
  302.     STC        ; MARK REFILL
  303. BUFOU1:    MOV M,C        ; STORE CHAR IN BUFFER
  304.     INX H        ; MOVE PTR TO NEXT CHAR
  305.     RET
  306. ;
  307. ;
  308. ; BUFFER I/O ROUTINE
  309. ;
  310. ; ENTER WITH CP/M READ OR WRITE CODE
  311. ; IN BC AND FCB ADDRESS IN DE.
  312. ; RETURN WITH INITIALIZED BUFFER
  313. ; POINTER IN HL.
  314. ;
  315. REFILL:    PUSH D
  316.     PUSH B
  317.     BIT 0,C        ; IN OR OUT DRIVE
  318.     JRZ SEL
  319.     LDED ODSK    ; OUTPUT DRIVE
  320.     JMPR CONT
  321. SEL:    LDED SDSK    ; SOURCE DRIVE
  322. CONT:    MVI C,SDISK    ; LOG IN DRIVE
  323.     CALL BDOS
  324.     POP B
  325.     POP D
  326.     LXI H,36    ; CALC START OF BUFFER
  327.     DAD D
  328.     PUSH H        ; SAVE START OF BUFFER
  329.     PUSH D         ; SAVE FCB ADDRESS
  330.     XCHG
  331.     PUSH B        ; SAVE CP/M CODE
  332.     MVI C,SDMA
  333.     CALL BDOS    ; SET DMA ADDRESS
  334.     POP B        ; GET CP/M CODE
  335.     POP D         ; GET FCB ADDRESS
  336.     CALL BDOS    ; READ OR WRITE BUFFER
  337.     POP H        ; SET PTR TO START OF BUFFER
  338.     RET
  339. ;
  340. ;
  341. ; CREATE AND OPEN A FILE WITH SAME NAME AS DEFAULT FCB
  342. ;
  343. ; ENTER WITH ADDRESS OF FCB IN DE, AND
  344. ; ADDRESS OF FILETYPE STRING IN BC.
  345. ;
  346. MAKEF:    LXI H,TFCB
  347.     PUSH D
  348.     PUSH B
  349.     LXI B,9
  350.     LDIR        ; MOVE FILENAME
  351.     POP H
  352.     LXI B,3
  353.     LDIR        ; MOVE FILETYPE
  354.     MVI C,FDELT
  355.     POP D
  356.     PUSH D
  357.     CALL BDOS    ; DELETE FILE
  358.     MVI C,CREATE
  359.     POP D
  360.     PUSH D
  361.     CALL BDOS    ; CREATE FILE
  362.     MVI C,4        ; ERROR 4
  363.     CPI 0FFH
  364.     CZ ERROR
  365.     MVI C,OPEN
  366.     POP D
  367.     CALL BDOS    ; OPEN FILE
  368.     MVI C,5        ; ERROR 5
  369.     CPI 0FFH
  370.     CZ ERROR
  371.     RET
  372. ;
  373. ; MEMORY SIZE TEST
  374. ;
  375. MEMSIM:    PUSH H
  376.     LHLD BDOS+1
  377.     DCX H
  378.     MOV A,L
  379.     MOV B,H
  380.     POP H
  381.     RET
  382. ;
  383. ; CONSOLE STATUS CHECK
  384.  
  385. CSTSIM:    PUSH B        ; SAVE REGISTERS
  386.     PUSH D
  387.     PUSH H
  388.     MVI C,CSTAT    ; SEE IF CHAR WAITING
  389.     CALL BDOS
  390.     ANI 1        ; YES IF TRUE
  391.     MVI A,0
  392.     JRZ ..SKP     ; NO
  393.     CMA
  394. ..SKP:    POP H         ; YES, A=0FFH
  395.     POP D
  396.     POP B
  397.     RET
  398.  
  399. ; IOCHECK
  400. ;
  401. IOSIM:    MVI A,0A5H
  402.     RET
  403. ;
  404. ; ERROR HANDLER
  405. ;
  406. ERROR:    PUSH B        ; SAVE ERROR INDEX
  407.     PUSH PSW
  408.     LXI D,ERMES1
  409.     CALL PRTMES
  410.     POP PSW
  411.     POP B
  412.     POP H         ; CALLER'S ADDRESS
  413.     PUSH B
  414.     ORA A        ; CLEAR CARRY
  415.     LXI D,3        ; ADJUST ADDRESS
  416.     DSBC D
  417.     PUSH PSW
  418.     CALL OUTHHL     ; PRINT IT
  419.     LXI D,ERMES2
  420.     CALL PRTMES
  421.     POP PSW
  422.     CALL OUT2H    ; PRINT ERR STATUS
  423.     LXI D,CRLF
  424.     CALL PRTMES
  425.     POP D         ; GET ERROR INDEX
  426.     MVI D,0        ; CLEAR HIGH ORDER BYTE
  427.     SLAR E        ; MULTIPLY BY 2
  428.     LXI H,MESLST    ; POINT TO MES ADDR
  429.     DAD D
  430.     MOV E,M        ; LOAD IT IN DE
  431.     INX H
  432.     MOV D,M
  433.     CALL PRTMES    ; PRINT IT
  434.     LXI D,CRLF
  435.     CALL PRTMES
  436.     JMP BOOT
  437. ;
  438. PRTMES:    MVI C,WCONB    ; PRINT A LINE
  439.     CALL BDOS
  440.     RET
  441. ;
  442. ;
  443. ERMES1:    .ASCII [CR][LF]'TEXT OUTPUT PROCESSOR DISK ERROR '
  444.     .ASCII 'AT ADDRESS $'
  445. ERMES2:    .ASCII [CR][LF]'CP/M RETURNED A STATUS OF $'
  446. CRLF:    .ASCII [CR][LF]'$'
  447. ;
  448. MESLST:    .WORD EMES0
  449.     .WORD EMES1
  450.     .WORD EMES2
  451.     .WORD EMES3
  452.     .WORD EMES4
  453.     .WORD EMES5
  454. ;
  455. EMES0:    .ASCII 'INPUT FILE NOT FOUND$'
  456. EMES1:    .ASCII 'CAN NOT OPEN INPUT FILE$'
  457. EMES2:    .ASCII '** BAD READ **$'
  458. EMES3:    .ASCII '** BAD WRITE **$'
  459. EMES4:    .ASCII 'CAN NOT CREATE OUTPUT FILE$'
  460. EMES5:    .ASCII 'CAN NOT OPEN OUTPUT FILE$'
  461. ;
  462. ;
  463. ;    OUT2H PRINT 2 HEX DIGITS FROM A
  464. ;    OUTHHL PRINT HL
  465.  
  466. OUTHHL:    MOV A,H        ; PRINT HL
  467.     CALL OUT2H
  468.     MOV A,L
  469.  
  470. OUT2H:    PUSH PSW
  471.     CALL OUTHL
  472.     POP PSW
  473.     JMPR OUTHR
  474.  
  475. OUTHL:    RRC
  476.     RRC
  477.     RRC
  478.     RRC
  479. OUTHR:    ANI 0FH
  480.     ADI '0'
  481.     CPI '9'+1
  482.     JRC OUTCH
  483.     ADI '@'-'9'
  484.     JMPR OUTCH
  485. COSIM:    MOV A,C
  486. OUTCH:    PUSH PSW
  487.     PUSH B
  488.     PUSH D
  489.     PUSH H
  490.     MVI C,WCON
  491.     MOV E,A
  492.     CALL BDOS
  493.     POP H
  494.     POP D
  495.     POP B
  496.     POP PSW
  497.     RET
  498. TEND:
  499.  
  500.  
  501. ; NEW TEXT OUTPUT PROCESSOR I/O VECTOR TABLE
  502. ; TO OVERWRITE PRESENT VECTOR TABLE
  503.  
  504. .BLKB 500H-(TEND-START)
  505. OFFSET = .    ; OFFSET=TOP LOAD ADDR - 100H
  506.  
  507. TOPST:    JMP OFFSET + 34AH
  508.     JMP OFFSET + 34EH
  509.     JMP CISIM
  510.     JMP RISIM
  511.     JMP COSIM
  512.     JMP OUTSIM
  513.     JMP CSTSIM
  514.     JMP IOSIM
  515.     JMP MEMSIM
  516.     JMP TRPSIM
  517.  
  518.     .END
  519.