home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol039 / 3740util.asm < prev    next >
Assembly Source File  |  1984-04-29  |  68KB  |  3,302 lines

  1.     TITLE    '3740UTIL - 3740/CP/M UTILITY'
  2. ;
  3. ;PROGRAM    3740UTIL - 3740 DISK UTILITY
  4. ;PROGRAMMER    ROBERT    M. WHITE
  5. ;        3986 BRYSON WAY
  6. ;        BOISE, ID  83704
  7. ;/////////////////////////////////////////////////////////////
  8. ;/                         W-A-R-N-I-N-G                     /
  9. ;/ USE THIS PROGRAM AT YOUR OWN RISK.  THE AUTHOR WILL NOT   /
  10. ;/ BE RESPONSIBLE FOR THIS PROGRAM OR ITS USE IN ANY WAY.    /
  11. ;/////////////////////////////////////////////////////////////
  12. ;        
  13. ;DATE WRITTEN    AUGUST 15, 1979
  14. ;DATE FINISHED    DECEMBER 23, 1979
  15. ;UPDATES
  16. ;        APRIL 21, 1980 - CHANGED DATASET LIST FUNCTION
  17. ;            (11) TO PRINT 80 CHARS.  BEFORE IT USED
  18. ;            BUFFER WRITE, THIS CAUSED BAD DISPLAYS
  19. ;            IF THE DATA CONTAINED IMBEDDED '$'s.
  20. ;        26 MAR 1981 - REMOVED STRUCTURED PROGRAMMING
  21. ;            MACROS TO GIVE 'MAC' MORE ROOM TO
  22. ;            ASSEMBLE IN AND LESSEN RISK OF NOT
  23. ;            BEING ABLE TO ASSEMBLE IT PROPERLY.
  24. ;        APRIL 9, 1981 - FIXED BUG IN TRANSFER WHERE
  25. ;            IBM OPEN DID NOT RESET BUFFER HEADER
  26. ;            CAUSING THE TRANSFER TO NOT BE PERFORMED.
  27. ;        APRIL 9, 1981 - ADDED RECORD COUNT DISPLAY FOR
  28. ;            SOURCE TRANSFERS AND IBM DISPLAY.
  29. ;        APRIL 9, 1981 - ADDED TRAILING BLANK REMOVAL ON
  30. ;            SOURCE TRANSFER FROM IBM TO CP/M.
  31. ;PURPOSE    THIS PROGRAM GIVES THE USER THE CAPABILITY
  32. ;        OF CONVERTING IBM 374X DISKETTES TO CP/M
  33. ;        FORMAT AND VICE VERSA.  ALSO, CERTAIN
  34. ;        OTHER MAINTENANCE FUNCTIONS ARE PROVIDED.
  35. ;INPUT
  36. ;OUTPUT
  37. ;OUTLINE
  38. ;REMARKS
  39. ;        1. REFERENCES FOR THIS PROGRAM ARE IBM
  40. ;           MANUALS:
  41. ;           A. GA21-9182, IBM GENERAL INFORMATION
  42. ;              MANUAL ON DISKETTES
  43. ;        2. THIS PROGRAM IS BASED ON IBM'S BASIC
  44. ;           DATA EXCHANGE FORMAT.  THE ABOVE MANUAL
  45. ;           DESCRIBE THIS FORMAT.  IN PARTICULAR,
  46. ;           IT WAS WRITTEN TO FORMAT DATA ACCEPTABLE
  47. ;           TO THE 3741 AND 3540 DISKETTE READER 
  48. ;           FOR EXCHANGE OF DATA BETWEEN CP/M AND
  49. ;           IBM 370 MAINFRAME.
  50. ;        3. ALL CP/M FILE NAMES ARE ASSUMED TO BE
  51. ;           THE EIGHT BYTE DATASET NAME ENTERED IN 
  52. ;           THE PARTICULAR FUNCTION WITH A FILE TYPE
  53. ;           OF 'DAT'.  OTHER THAN THIS, BOTH THE CP/M
  54. ;           AND IBM FILE NAMES ARE IDENTICAL.
  55. ;        4. ALL DISPLAYS ARE BASED ON THE SOROC-120.
  56. ;           THE CLEAR SCREEN IS THE ONLY DEPENDENT
  57. ;           ROUTINE AND IS LABELLED CLRSCRN.
  58. ;        5. ALL IBM DISKETTES ARE ASSUMED TO BE FORMATTED
  59. ;           TO 128-BYTE SECTORS, 26 SECTORS PER TRACK AND
  60. ;           76 TRACKS (SINGLE DENSITY ONLY).
  61. ;        6. THE 3741 REQUIRES THAT THE REMAINING BYTES AFTER
  62. ;           THE RECORD LENGTH BE NULLS.  OTHERWISE, IT ISSUES
  63. ;           A READ ERROR ON THE RECORD.
  64.  
  65. ;MACLIBS
  66.     MACLIB    MACS3740
  67.  
  68. ;EQUATES
  69. ;;
  70. ;;        * * *  ASSEMBLER EQUATES  * * *
  71. ;;
  72. TRUE    SET    0FFFFH        ;;TRUE VALUE
  73. FALSE    SET    NOT TRUE    ;;FALSE VALUE
  74. ;;
  75. ;;
  76. ;;
  77. ;;
  78. ;;        * * *  CP/M EQUATES  * * *
  79. ;;
  80. ;;        * *  ADDRESS ASSIGNMENTS  * *
  81. CPMEXIT    SET    0        ;;WARM START BOOT LOCATION
  82. BDOS    SET    5        ;;BDOS ENTRY POINT
  83. TBUFF    SET    0080H        ;;DEFAULT BUFFER LOCATION
  84. TDDN    SET    0004H        ;;CURRENT DEFAULT DRIVE NUMBER
  85. TFCB    SET    005CH        ;;DEFAULT FCB LOCATION 1
  86. TFCB2    SET    006CH        ;;DEFAULT FCB LOCATION 2 ( MUST BE MOVED)
  87. TIOBYTE    SET    0003H        ;;INTEL STANDARD I/O BYTE
  88. TPABGN    SET    0100H        ;;TRANSIENT PROGRAM AREA BEGINNING
  89. ;;
  90. ;;        *  FDOS FUNCTIONS  *
  91. CREAD    SET    1        ;;**CODE FOR CONSOLE READ
  92. CWRITE    SET    2        ;;**CODE FOR CONSOLE WRITE
  93. CPB    SET    9        ;;**CODE FOR CONSOLE PRINT BUFFER
  94. CRB    SET    10        ;;**CODE FOR CONSOLE READ BUFFER
  95. CSTAT    SET    11        ;;**CODE FOR CONSOLE STATUS CHECK
  96. DLDH    SET    12        ;;**CODE FOR LIFT DISK HEAD
  97. DRDS    SET    13        ;;**CODE FOR RESET DISK SYSTEM
  98. DSD    SET    14        ;;**CODE FOR SELECT DISK
  99. DOF    SET    15        ;;**CODE FOR OPEN FILE
  100. DCF    SET    16        ;;**CODE FOR CLOSE FILE
  101. DSF    SET    17        ;;**CODE FOR SEARCH FIRST
  102. DSN    SET    18        ;;**CODE FOR SEARCH NEXT
  103. DDF    SET    19        ;;**CODE FOR DELETE FILE
  104. DRR    SET    20        ;;**CODE FOR READ A RECORD
  105. DWR    SET    21        ;;**CODE FOR WRITE A RECORD
  106. DCRF    SET    22        ;;**CODE FOR CREATE A FILE
  107. DREN    SET    23        ;;**CODE FOR RENAME A FILE
  108. DINTL    SET    24        ;;**CODE FOR INTERROGATE LOGIN
  109. DRINT    SET    25        ;;**CODE FOR DRIVE INTERROGATE
  110. DDMA    SET    26        ;;**CODE FOR SET DMA ADDRESS
  111. DINTA    SET    27        ;;**CODE FOR INTERROGATE ALLOCATION
  112. ;;        * FCB EQUATES *
  113. FCBET    SET    0        ;;FCB ENTRY TYPE - *NOT USED*
  114. FCBFN    SET    1        ;;FILE NAME, 8 CHARS, PADDED WITH BALNKS
  115. FCBFT    SET    9        ;;FILE TYPE, 3 CHARS, PADDED WITH BLANKS
  116. FCBEX    SET    12        ;;FILE EXTENT, NORMALLY SET TO ZERO
  117. ;;        13-14        ;;*NOT USED*
  118. FCBRC    SET    15        ;;RECORD COUNT IN CURRENT EXTENT (0-128)
  119. FCBDM    SET    16        ;;DISK ALLOCATION MAP, USED BY CP/M
  120. FCBNR    SET    32        ;;NEXT RECORD NUMBER TO READ OR WRITE
  121. FCBLEN    SET    FCBNR-FCBET+1    ;;FCB LENGTH
  122. ;;
  123. ;;
  124. ;;
  125. ;;        * *  DOUBLE REGISTER EQUATES  * *
  126. BC    SET    B
  127. DE    SET    D
  128. HL    SET    H
  129. ;;
  130. ;;
  131. @TRNASEB SET    TRUE
  132. @TRNEBAS SET    TRUE
  133. @OUTTRN    SET    TRUE
  134. NBIOS    SET    FALSE    ;TRUE IF USING NEW BIOS FOR CP/M 2.0
  135. DMA$BIOS SET    TRUE    ;TRUE IF USING DMA BIOS FOR CP/M 2.0
  136. SPOOLER SET    FALSE    ;TRUE IF KLH SPOOLER IS IN NEW BIOS
  137. Z80    SET    FALSE    ;TRUE IF CPU IS Z80
  138.  
  139.     IF    SPOOLER    ;DISP TO SPECIAL BIOS 2.0 JUMPS
  140. JMPDSP    SET    033H+9
  141.     ELSE
  142. JMPDSP    SET    033H
  143.     ENDIF
  144. $+PRINT
  145. $+PRINT
  146.  
  147. ;IN-LINE MACROS
  148. $+PRINT
  149. ;
  150. ;        MOVE ASCII TO EBCDIC.
  151. MOVAE    MACRO    DST,SRC,LEN
  152.     LOCAL    OVERSUB,LOOP
  153.     JMP    OVERSUB
  154. @MVAE:    DS    0
  155.     MOV    A,M        ;;GET NEXT BYTE.
  156.     CALL    TRNASEB        ;;TRANSLATE TO EBCDIC.
  157.     STAX    DE        ;;SAVE IT.
  158.     INX    HL        ;;BUMP PTRS.
  159.     INX    DE
  160.     DCR    C        ;;DECR COUNT.
  161.     JNZ    @MVAE        ;;LOOP FOR ALL CHARACTERS.
  162.     RET
  163. OVERSUB:
  164. ;
  165. ;        MOVE EBCDIC TO ASCII.
  166. MOVAE    MACRO    D,S,L
  167.     IF    NOT NUL D
  168.     LXI    DE,D        ;;POINT OT DESTINATION.
  169.     ENDIF
  170.     IF    NOT NUL S
  171.     LXI    HL,S        ;;POINT TO SOURCE.
  172.     ENDIF
  173.     IF    NOT NUL L
  174.     LSR    C,L        ;;GET LENGTH.
  175.     ENDIF
  176.     CALL    @MVAE        ;;DO THE MOVE.
  177.     ENDM
  178.     MOVAE    DST,SRC,LEN
  179.     ENDM
  180. ;
  181. ;        PRINT AN EBCIDIC FIELD.
  182. PRNTEAF MACRO    ?STR,FLD,LNG
  183.     IF    NOT NUL ?STR
  184.     MVC    TBUFF,?STR    ;;MOVE IT TO THE BUFFER.
  185.     ENDIF
  186.     MOVEA    <>,FLD,LNG
  187.     MVI    A,CR        ;;ADD CR.
  188.     STAX    DE
  189.     INX    DE
  190.     MVI    A,LF        ;;ADD LF.
  191.     STAX    DE
  192.     INX    DE
  193.     MVI    A,'$'        ;;ADD EOL MARKER.
  194.     STAX    DE
  195.     CPM    CPB,TBUFF    ;;PRINT THE BUFFER.
  196.     ENDM
  197. ;
  198.  
  199.  
  200. ;        MOVE EBCDIC TO ASCII.
  201. MOVEA    MACRO    DST,SRC,LEN
  202.     LOCAL    OVERSUB,LOOP
  203.     JMP    OVERSUB
  204. @MVEA:    DS    0
  205.     MOV    A,M        ;;GET NEXT BYTE.
  206.     CALL    TRNEBAS        ;;TRANSLATE TO ASCII.
  207.     STAX    DE        ;;SAVE IT.
  208.     INX    HL        ;;BUMP PTRS.
  209.     INX    DE
  210.     DCR    C        ;;DECR COUNT.
  211.     JNZ    @MVEA        ;;LOOP FOR ALL CHARACTERS.
  212.     RET
  213. OVERSUB:
  214. MOVEA    MACRO    D,S,L
  215.     IF    NOT NUL D
  216.     LXI    DE,D        ;;POINT OT DESTINATION.
  217.     ENDIF
  218.     IF    NOT NUL S
  219.     LXI    HL,S        ;;POINT TO SOURCE.
  220.     ENDIF
  221.     IF    NOT NUL L
  222.     LSR    C,L        ;;GET LENGTH.
  223.     ENDIF
  224.     CALL    @MVEA        ;;DO THE MOVE.
  225.     ENDM
  226.     MOVEA    DST,SRC,LEN
  227.     ENDM
  228. ;
  229. ;
  230. ;
  231. ;
  232. ;
  233. ;        * * *  BEGINNING OF PROGRAM  * * *
  234. ;
  235.     ORG    TPABGN        ;ORG TO BEGINNING OF TPA
  236. ;        ESTABLISH STACK POINTER.
  237.     LHLD    6        ;GET ADDRESS OF BEGINNING OF CP/M.
  238.     DCX    HL
  239.     SPHL            ;INIT STACK.
  240.     CPM    DRDS        ;RESET ALL DISKS.
  241.     JMP    MAINMENU
  242. ;
  243. ;
  244. ;        * *  SPECIAL BIOS JUMPS * *
  245. BIOSSEL:            ;SELECT DISK.
  246.     PUSH    H
  247.     LHLD    1
  248.     MVI    L,000H+JMPDSP
  249.     XTHL
  250.     RET
  251.  
  252. BIOSHOM:            ;HOME DISK.
  253.     PUSH    H
  254.     LHLD    1
  255.     MVI    L,003H+JMPDSP
  256.     XTHL
  257.     RET
  258.  
  259. BIOSSEK:            ;SEEK TRACK.
  260.     PUSH    H
  261.     LHLD    1
  262.     MVI    L,006H+JMPDSP
  263.     XTHL
  264.     RET
  265.  
  266. BIOSRED:            ;READ SECTOR.
  267.     PUSH    H
  268.     LHLD    1
  269.     MVI    L,009H+JMPDSP
  270.     XTHL
  271.     RET
  272.  
  273. BIOSWRT:            ;WRITE SECTOR.
  274.     PUSH    H
  275.     MVI    C,1        ;CP/M 2.0 - DIR WRITE (IMMED)
  276.     LHLD    1
  277.     MVI    L,00CH+JMPDSP
  278.     XTHL
  279.     RET
  280.  
  281. CLRSCRN:
  282.     PRINT    <27,'*',0,0>    ;CLEAR SCREEN.
  283.     RET
  284.  
  285.  
  286. ;        * *  MAIN PROGRAM LOOP  * *
  287. ;
  288. ;        DISPLAY BASE MENU.
  289. MAINMENU: DS    0
  290. $+PRINT
  291.     CALL    CLRSCRN
  292.     PRINT    <'* * *  3740 IBM UTILITY  * * *',CR,LF>
  293.     PRINT    <'SELECT ONE OF THE FOLLOWING:',CR,LF>
  294.     PRINT    <'   0 - RETURN TO CP/M',CR,LF>
  295.     PRINT    <'   1 - INITIALIZE THE DIRECTORY',CR,LF>
  296.     PRINT    <'   2 - CHANGE A VOLUME SERIAL NUMBER',CR,LF>
  297.     PRINT    <'   3 - CHANGE A DATASET ENTRY',CR,LF>
  298.     PRINT    <'   4 - DELETE A DATASET ENTRY',CR,LF>
  299.     PRINT    <'   5 - DISPLAY A DATASET ENTRY',CR,LF>
  300.     PRINT    <'   6 - LIST THE DIRECTORY',CR,LF>
  301.     PRINT    <'   7 - TRANSFER CP/M TO 3740 (BLOCK)',CR,LF>
  302.     PRINT    <'   8 - TRANSFER 3740 TO CP/M (BLOCK)',CR,LF>
  303.     PRINT    <'   9 - TRANSFER CP/M TO 3740 (SOURCE)',CR,LF>
  304.     PRINT    <'  10 - TRANSFER 3740 TO CP/M (SOURCE)',CR,LF>
  305.     PRINT    <'  11 - DISPLAY AN IBM DATASET',CR,LF>
  306.     INPUT    'ENTER CHOICE: ',TBUFF
  307.     PRINT    <CR,LF>
  308. ;
  309. ;
  310. ;        IF NO INPUT, ISSUE ERROR MSG.
  311.     LDA    TBUFF+1        ;GET INPUT COUNT.
  312.     CPI    0        ;LENGTH CHECK (1-2)
  313.     JZ     MAINERR        ;...ISSUE ERROR.
  314.     CPI    2+1
  315.     JNC    MAINERR
  316. ;
  317. ;
  318. ;        CONVERT INPUT TO BINARY.
  319.     DECIN    TBUFF+2,TBUFF+1    ;GET INPUT NUMBER.
  320.     CPI    11+1        ;IF INVALID NUMBER
  321.     JNC    MAINERR        ;...ISSUE ERROR MESSAGE.
  322. ;
  323. ;
  324. ;               CLEAR THE SCREEN FOR EACH ROUTINES OUTPUT.
  325.         PUSH    PSW             ;SAVE OPTION CODE.
  326.     CALL    CLRSCRN
  327.         POP     PSW             ;RESTORE OPTION CODE.
  328. ;
  329. ;
  330. ;        CALL THE APPROPRIATE ROUTINE.
  331. ;
  332.     ADD    A        ;INDEX INTO TABLE.
  333.     LXI    HL,FNCTBL    
  334.     ADDHA
  335. ;
  336.     MOV    E,M        ;GET ENTRY.
  337.     INX    HL
  338.     MOV    D,M
  339. ;
  340.     LXI    HL,MAINMENU    ;SET RETURN PTR.
  341.     PUSH    HL
  342. ;
  343.     XCHG        ;CALL THE ROUTINE.
  344.     PCHL
  345. ;
  346. ;
  347. ;        ISSUE ERROR MESSAGE AND RE-PRINT MENU.
  348. MAINERR: DS    0
  349.     PRINT    <'***INVALID REPLY***',CR,LF>
  350.     INPUT    'PRESS <ENTER> TO CONTINUE.',TBUFF
  351.     JMP    MAINMENU
  352. ;
  353. ;
  354. ;
  355. ;
  356. $+PRINT
  357. $+PRINT
  358. ;        * * *  RETURN TO CPM  * * *
  359. ;PURPOSE
  360. ;        THIS ROUTINE RETURNS CONTROL TO CP/M ISSUEING
  361. ;        A WARM START AND DISK RESET.
  362. ;INPUT
  363. ;OUTPUT
  364. ;REMARKS
  365. ;
  366. ;
  367. ;
  368. ;        DO INITIALIZATION.
  369. RTNCPM:    DS    0
  370.     PRINT    <'*** RETURN TO CPM ***',CR,LF>
  371.     PRINT    <'PUT MASTER CP/M DISK IN DRIVE A.',CR,LF>
  372.     INPUT    'PRESS <ENTER> WHEN READY. ',TBUFF
  373.     CPM    DRDS        ;RESET ALL DRIVES.
  374.     JMP    CPMEXIT        ;COLD START CP/M.
  375. ;
  376. ;
  377. ;
  378. ;
  379. $+PRINT
  380. $+PRINT
  381. ;        * * *  INITIALIZE A DISKETTE  * * *
  382. ;PURPOSE
  383. ;        THIS ROUTINE ALLOWS THE USER TO FORMAT A
  384. ;        DISKETTE TO IBM FORMAT.  FIRST, IT BUILDS
  385. ;        THE DIRECTORY AND THEN BLANKS ALL REMAINING
  386. ;        RECORDS.
  387. ;INPUT
  388. ;        DISK DRIVE OF DISK TO BE FORMATTED
  389. ;        VOLUME SERIAL NUMBER FOR THE DISK
  390. ;OUTPUT
  391. ;        FORMATTED DISK
  392. ;REMARKS
  393. ;
  394. ;
  395. ;
  396. ;        DO INITIALIZATION.
  397. INITDISK: DS    0
  398.     PRINT    <'*** INITIALIZE A DISK  ***',CR,LF>
  399. ;
  400. ;
  401. ;        GET DISK DRIVE.
  402.     CALL    INPDSKNO
  403.     STA    DIRDSK        ;SAVE IT.
  404. ;
  405. ;
  406. ;        GET VOLUME SERIAL NUMBER.
  407.     FILL    VOLSER,6,' '
  408. INITDIRV: DS    0
  409.     INPUT    'ENTER VOLUME SERIAL NUMBER (1-6 CHARS): ',TBUFF
  410.     PRINT
  411.     LDA    TBUFF+1        ;VERIFY LENGTH.
  412.     CPI    1
  413.     JC    $+8        ;...INVALID.
  414.     CPI    6+1
  415.     JC    INITDIRG    ;...VALID
  416.     PRINT    <'*** INVALID REPLY ***',CR,LF>
  417.     JMP    INITDIRV
  418. INITDIRG: DS    0
  419.     MVC    VOLSER,TBUFF+2,TBUFF+1
  420. ;
  421. ;
  422. ;        WRITE SECTORS (1-4 AND 6)
  423.     FILL    DIRBUF,80,040H
  424.     FILL    DIRBUF+80,48,000H
  425.     MVI    A,1        ;SET SECTOR TO 1.
  426.     STA    DIRSCT
  427.     LDA    DIRSCT
  428. INITDIR0: DS    0
  429.     CPI    4+1
  430.     JNC    INITDIR1
  431.     CALL    WRTDIR
  432.     LDA    DIRSCT        ;BUMP SCTOR NUMBER.
  433.     INR    A
  434.     STA    DIRSCT
  435.     JMP    INITDIR0
  436. INITDIR1: DS    0
  437.     MVI    A,6
  438.     CALL    WRTDIR
  439. ;
  440. ;
  441. ;        WRITE SECTOR 5 (ERMAP).
  442.     MOVAE    DIRBUF,CERMAP,5
  443.     MVI    A,5
  444.     CALL    WRTDIR
  445. ;
  446. ;
  447. ;        WRITE SECTOR 7 (VOL1).
  448.     MOVAE    DIRBUF,CVOL1,4    ;PUT 'VOL1' IN COL 1.
  449.     MOVAE    DIRBUF+4,VOLSER,6 ;PUT VOLSER IN COL 5.
  450.     MVI    A,0E6H        ;PUT 'W' IN COL 80.
  451.     STA    DIRBUF+79
  452.     MVI    A,7
  453.     CALL    WRTDIR
  454. ;
  455. ;
  456. ;        WRITE SECTORS 8-26 (DATA).
  457.     MVI    A,8
  458.     STA    DIRSCT
  459. INITDIR2:
  460.     LDA    DIRSCT
  461.     CPI    26+1
  462.     JNC    INITDIR3
  463.     CALL    DFTDIR
  464.     LDA    DIRSCT
  465.     CALL    WRTDIR
  466.     LDA    DIRSCT
  467.     INR    A
  468.     STA    DIRSCT
  469.     JMP    INITDIR2
  470. INITDIR3: DS    0
  471. ;
  472. ;
  473. ;        WRITE REMAINING DISK BUFFERS.
  474.     PRINT    <'THE DIRECTORY HAS BEEN INITIALIZED.',CR,LF>
  475.     PRINT    <'THE REST OF THE DISK SHOULD HAVE BEEN',CR,LF>
  476.     PRINT    <'PREVIOUSLY INITIALIZED.',CR,LF>
  477. ;
  478. ;
  479. ;        ISSUE COMPLETION MESSAGE.
  480.     PRINT    <'*** INITIALIZATION IS COMPLETE ***',CR,LF>
  481.     INPUT   'PRESS <ENTER> TO CONTINUE.',TBUFF
  482. ;
  483. ;
  484. ;        RETURN TO CALLER.
  485.     RET
  486. ;
  487. ;
  488. ;
  489. ;
  490. $+PRINT
  491. $+PRINT
  492. ;        * * *  CHANGE A VOLUME SERIAL NUMBER  * * *
  493. ;PURPOSE
  494. ;        THIS ROUTINE ALLOWS THE USER TO CHANGE AN IBM
  495. ;        VOLUME SERIAL NUMBER AS FOUND IN THE 'VOL1'
  496. ;        SECTOR (00008).
  497. ;INPUT
  498. ;        DISK DRIVE OF IBM DISKETTE
  499. ;        VOLUME SERIAL NUMBER (OPTIONAL)
  500. ;OUTPUT
  501. ;        THE VOLUME SERIAL NUMBER IS CHANGED IF ENTERED.
  502. ;REMARKS
  503. ;
  504. ;
  505. ;
  506. ;        DO INITIALIZATION.
  507. CHGVOL: DS    0
  508.     PRINT    <'*** CHANGE A VOLUME SERIAL NUMBER ***',CR,LF>
  509. ;
  510. ;
  511. ;        GET THE DISK DRIVE AND VERIFY IT.
  512.     CALL    INPDSKNO    ;GET IT.
  513.     STA    DIRDSK        ;SAVE IT.
  514.     CALL    VERIBMD        ;VERIFY IBM DISK.
  515.     JC    CHGVOLE        ;...DIDN'T VERFIY, MSG WAS GIVEN.
  516. ;
  517. ;
  518. ;        PRINT THE VOLUME SERIAL NUMBER.
  519.     PRNTEAF    'CURRENT VOLUME SERIAL NUMBER: ',DIRBUF+4,6
  520.     MOVEA    VOLSER,DIRBUF+4,6
  521. ;
  522. ;
  523. ;        GET VOLUME SERIAL NUMBER.
  524. CHGVOLIV: DS    0
  525.     PRINT    <'(OPTIONALLY) '>
  526.     INPUT    'ENTER VOLUME SERIAL NUMBER (1-6 CHARS): ',TBUFF
  527.     PRINT
  528.     LDA    TBUFF+1        ;VERIFY LENGTH.
  529.     CPI    1
  530.     JC    CHGVOLIB    ;...NO ENTRY, SKIP REPLACE.
  531.     CPI    6+1
  532.     JC    CHGVOLIG    ;...VALID
  533.     PRINT    <'*** INVALID REPLY ***',CR,LF>
  534.     JMP    CHGVOLIV
  535. CHGVOLIG: DS    0
  536.     FILL    VOLSER,6,020H
  537.     MVC    VOLSER,TBUFF+2,TBUFF+1
  538. CHGVOLIB: DS    0
  539. ;
  540. ;
  541. ;        WRITE THE SECTOR BACK OUT.
  542.     MOVAE    DIRBUF+4,VOLSER,6    ;PUT VOLSER IN BUFFER.
  543.     MVI    A,7        ;WRITE OUT SECTOR 7 (VOL1).
  544.     CALL    WRTDIR
  545. ;
  546. ;
  547. ;        RETURN TO CALLER.
  548.     PRINT    <'*** CHANGE IS SUCCESSFUL.***',CR,LF>
  549. CHGVOLE: DS    0
  550.     INPUT    'PRESS <ENTER> TO CONTINUE.',TBUFF
  551.     RET
  552. ;
  553. ;
  554. ;
  555. ;
  556. $+PRINT
  557. $+PRINT
  558. ;        * * *  CHANGE A DATASET ENTRY  * * *
  559. ;PURPOSE
  560. ;        THIS ROUTINE ACTIVATES A DIRECTORY ENTRY AND/OR
  561. ;        ALLOWS THE USER TO CHANGE DIRECTORY INFORMATION
  562. ;        PERTAINING TO THAT DATASET.
  563. ;INPUT
  564. ;        IBM DISKETTE DISK DRIVE
  565. ;        DIRECTORY SECTOR NUMBER AS GIVEN IN DIRECTORY LIST
  566. ;OUTPUT
  567. ;        THE DIRECTORY ENTRY IS UPDATED.
  568. ;REMARKS
  569. ;
  570. ;
  571. ;
  572. ;        DO INITIALIZATION.
  573. CHGDIR: DS    0
  574.     PRINT    <'*** CHANGE A DATASET ENTRY ***',CR,LF>
  575. ;
  576. ;
  577. ;        GET DISK DRIVE.
  578.     CALL    INPDSKNO    ;GET IT.
  579.     STA    DIRDSK        ;SAVE IT.
  580.     CALL    VERIBMD        ;VERIFY IBM DISK.
  581.     RC
  582. ;
  583. ;
  584. ;        GET THE SECTOR NUMBER.
  585.     CALL    INPSCTNO    ;GET IT.
  586.     STA    DIRSCT        ;SAVE IT.
  587. ;
  588. ;
  589. ;        PRINT THE ENTRY.
  590.     CALL    REDDIR        ;READ THE ENTRY.
  591.     CALL    PRTDIR        ;PRINT IT.
  592. ;
  593. ;
  594. ;        PRINT CHANGE MESSAGES.
  595.     PRINT
  596.     PRINT    <'CHANGE ONLY THE FIELDS THAT YOU WANT UPDATED.',CR,LF>
  597.     PRINT    <'IF YOU DO NOT ENTER ANY DATA, THE FIELD',CR,LF>
  598.     PRINT    <'REMAINS UNCHANGED.',CR,LF>
  599.     PRINT
  600. ;
  601. ;
  602. ;        CHANGE THE FIELDS AND UPDATE THE RECORD.
  603.     MVI    A,0C8H        ;INSURE ACTIVE DATASET.
  604.     STA    DSHD
  605.     CALL    INPDIR        ;CHANGE THE FIELDS.
  606.     LDA    DIRSCT        ;UPDATE THE RECORD.
  607.     CALL    WRTDIR
  608.     PRINT    <'***CHANGE IS SUCCESSFUL.***',CR,LF>
  609. ;
  610. ;
  611. ;        RETURN TO CALLER.
  612.     INPUT    'PRESS <ENTER> TO CONTINUE.',TBUFF
  613.     RET
  614. ;
  615. ;
  616. ;
  617. ;
  618. $+PRINT
  619. $+PRINT
  620. ;        * * *  DELETE A DATASET ENTRY  * * *
  621. ;PURPOSE
  622. ;        THIS FUNCTION ALLOWS THE USER TO DELETE A
  623. ;        SPECIFIED DIRECTORY ENTRY.  THE ENTRY IS MARKED
  624. ;        AS DELETED AND INITIALIZED TO ITS INITIAL FORMAT
  625. ;        AS WHEN THE ENTIRE DIRECTORY WAS INITIALIZED.
  626. ;INPUT
  627. ;        IBM DISK DRIVE
  628. ;        DIRECTORY SECTORY NUMBER
  629. ;OUTPUT
  630. ;        DELETED INITIAL DIRECTORY ENTRY
  631. ;REMARKS
  632. ;        1. AT THIS POINT, WE HAVE FOUND THAT THE AM2 FIELD
  633. ;           OF THE RECORD DOES NOT HAVE TO INDICATE DELETED
  634. ;           RECORD.
  635. ;
  636. ;
  637. ;
  638. ;        DO INITIALIZATION.
  639. DELDIR: DS    0
  640.     PRINT    <'*** DELETE A DATASET ENTRY ***',CR,LF>
  641. ;
  642. ;
  643. ;        GET DISK DRIVE.
  644.     CALL    INPDSKNO    ;GET IT.
  645.     STA    DIRDSK        ;SAVE IT.
  646.     CALL    VERIBMD        ;VERIFY IBM DISK.
  647.     RC            ;...NOT IBM FORMAT!!
  648. ;
  649. ;
  650. ;        GET THE SECTOR NUMBER.
  651.     CALL    INPSCTNO    ;GET IT.
  652.     STA    DIRSCT        ;SAVE IT.
  653. ;
  654. ;
  655. ;        DELETE THE ENTRY.
  656.     LDA    DIRSCT        ;INITIALIZE THE ENTRY.
  657.     CALL    DFTDIR
  658.     LDA    DIRSCT        ;WRITE IT BACK TO DISK.
  659.     CALL    WRTDIR
  660. ;
  661. ;
  662. ;        RETURN TO CALLER.
  663.     PRINT    <'***DELETION IS SUCCESSFUL.***',CR,LF>
  664.     INPUT    'PRESS <ENTER> TO CONTINUE.',TBUFF
  665.     RET
  666. ;
  667. ;
  668. ;
  669. ;
  670. $+PRINT
  671. $+PRINT
  672. ;        * * *  DISPLAY A DATASET ENTRY  * * *
  673. ;PURPOSE
  674. ;        THIS ROUTINE DISPLAYS A SINGLE DIRECTORY ENTRY.
  675. ;        IT IS PRIMARILY USED TO INSURE THAT AN ENTRY
  676. ;        WAS CHANGED PROPERLY.
  677. ;INPUT
  678. ;        IBM DISK DRIVE
  679. ;        DIRECTORY SECTOR NUMBER
  680. ;OUTPUT
  681. ;        DIRECTORY ENTRY IS DISPLAYED
  682. ;REMARKS
  683. ;
  684. ;
  685. ;
  686. ;        DO INITIALIZATION.
  687. DSPLDIR: DS    0
  688.     PRINT    <'*** DISPLAY A DIRECTORY ENTRY ***',CR,LF>
  689. ;
  690. ;
  691. ;        GET DISK DRIVE.
  692.     CALL    INPDSKNO    ;GET IT.
  693.     STA    DIRDSK        ;SAVE IT.
  694.     CALL    VERIBMD        ;VERIFY IBM DISK.
  695.     RC
  696. ;
  697. ;
  698. ;        GET THE SECTOR NUMBER.
  699.     CALL    INPSCTNO    ;GET IT.
  700.     STA    DIRSCT        ;SAVE IT.
  701. ;
  702. ;
  703. ;        PRINT THE ENTRY.
  704.     CALL    REDDIR        ;READ THE ENTRY.
  705.     CALL    PRTDIR        ;PRINT IT.
  706. ;
  707. ;
  708. ;        RETURN TO CALLER.
  709.     INPUT    'PRESS <ENTER> TO CONTINUE.',TBUFF
  710.     RET
  711. ;
  712. ;
  713. ;
  714. ;
  715. $+PRINT
  716. $+PRINT
  717. ;        * * *  LIST THE DIRECTORY  * * *
  718. ;PURPOSE
  719. ;        THIS ROUTINE DISPLAYS THE ENTIRE IBM DISKETTE
  720. ;        DIRECTORY AND ALL PERTINENT DATA ASSOCIATED
  721. ;        WITH IT.
  722. ;INPUT
  723. ;        IBM DISK DRIVE
  724. ;OUTPUT
  725. ;        THE DIRECTORY IS DISPLAYED.
  726. ;REMARKS
  727. ;
  728. ;
  729. ;
  730. ;        DO INITIALIZATION.
  731. LISTDIR: DS    0
  732.     PRINT    <'*** LIST THE DIRECTORY ***',CR,LF>
  733. ;
  734. ;
  735. ;        GET THE DISK NUMBER.
  736.     CALL    INPDSKNO    ;GET IT.
  737.     STA    DIRDSK        ;SAVE IT.
  738. ;
  739. ;
  740. ;        READ AND VERIFY THE VOLSER.
  741.     CALL    VERIBMD        ;VERIFY 'VOL1' ID.
  742.     JC    LISTDIRR    ;...BAD VOL1.
  743.     CALL    CLRSCRN
  744.     PRNTEAF    '              DIRECTORY FOR ',DSHD+4,6
  745.     PRINT    <'                                           '>
  746.     PRINT    <'         M VL B S W V',CR,LF>
  747.     PRINT    <'SCT DATASET D LRECL  BOE   EOE   EOD  CREDT'>
  748.     PRINT    <'  EXPDT  V SQ I S P C',CR,LF>
  749. ;
  750. ;
  751. ;        LIST ALL DIRECTORY ENTRIES.
  752.     MVI    C,8        ;SET BEGINNING SECTOR.
  753.     MOV    A,C
  754. LISTDIR0: DS 0
  755.     CPI    26+1        ;LOOP FOR SECTORS 8-26.
  756.     JNC    LISTDIR1
  757.     CALL    LISTDIRE    ;LIST THE ENTRY.
  758.     INR    C        ;BUMP SECTOR.
  759.     MOV    A,C        ;SET FOR DOWHILE.
  760.     JMP    LISTDIR0
  761. LISTDIR1: DS 0
  762. ;
  763. ;
  764. ;        RETURN TO CALLER.
  765. LISTDIRR: DS    0
  766.     INPUT    'PRESS <ENTER> TO CONTINUE.',TBUFF
  767.     RET
  768. ;
  769. ;
  770. ;
  771. $+PRINT
  772. $+PRINT
  773.  
  774. ;        * *  LIST A DIRECORTY ENTRY  * *
  775. ;
  776. ;        DO INITIALIZATION.
  777. LISTDIRE: DS    0
  778.     PUSH    BC        ;SAVE REGS.
  779. ;
  780. ;
  781. ;        READ SECTOR.
  782.     MOV    A,C        ;GET SECTOR.
  783.     CALL    REDDIR        ;READ IT.
  784. ;
  785. ;
  786. ;        BUILD OUTPUT LINE.
  787.     FILL    TBUFF,80,' '    ;MOVE SPACES TO TBUFF.
  788.     LXI    HL,CSCTNO    ;  SECTOR NUMBER
  789.     LDA    DIRSCT
  790.     SUI    8
  791.     ADD    A
  792.     ADDHA
  793.     MVC    TBUFF,,2
  794.     LDA    DIRSCT
  795.     CPI    8
  796.     JNZ    LISTDIR2
  797.     MVC    TBUFF,'08'
  798. LISTDIR2: DS    0
  799.     MOVEA    TBUFF+3,DSID,8    ;  DATASET NAME
  800.     LDA    DSHD        ;  **DELETED**
  801.     CPI    0C4H
  802.     JNZ    LISTDIR3
  803.     MVI    A,'D'
  804.     STA    TBUFF+12
  805. LISTDIR3: DS    0
  806.     MOVEA    TBUFF+14,DSBLK,5    ;  LRECL
  807.     MOVEA    TBUFF+20,DSBOE,5    ;  BOE
  808.     MOVEA    TBUFF+26,DSEOE,5    ;  EOE
  809.     MOVEA    TBUFF+32,DSEOD,5    ;  EOD
  810.     MOVEA    TBUFF+38,DSCREDT,6
  811.     MOVEA    TBUFF+45,DSEXPDT,6    ;  EXP DATE
  812.     MOVEA    TBUFF+52,DSMVI,1    ;  MULTI-VOL IND
  813.     MOVEA    TBUFF+54,DSVLSQ,2    ;  VOL SEQ
  814.     MOVEA    TBUFF+57,DSBYPI,1    ;  BYP IND
  815.     MOVEA    TBUFF+59,DSSS,1        ;  SECURE IND
  816.     MOVEA    TBUFF+61,DSWP,1        ;  WRITE PRO IND
  817.     MOVEA    TBUFF+63,DSVCI,1    ;  VERI/COPY IND
  818. ;
  819. ;
  820. ;        PRINT THE LINE.
  821.     MVC    TBUFF+72,CEOL,3
  822.     PRINT    TBUFF,$
  823. ;
  824. ;
  825. ;        RETURN TO CALLER.
  826.     POP    BC        ;RESTORE REGS.
  827.     RET
  828. ;
  829. ;
  830. ;
  831. ;
  832. ;
  833. ;
  834. ;
  835. ;
  836. $+PRINT
  837. $+PRINT
  838. ;        * * *  TRANSFER CP/M TO 3740 (BLOCK)  * * *
  839. ;PURPOSE
  840. ;        THIS ROUTINE TRANSFERS A DATASET FROM CP/M TO
  841. ;        IBM FORMAT IN BLOCK MODE.  BLOCK MODE ASSUMES
  842. ;        EACH SECTOR ON BOTH THE INPUT AND OUTPUT DISKS
  843. ;        ARE ONE SECTOR.
  844. ;INPUT
  845. ;        CP/M INPUT DRIVE
  846. ;        IBM OUTPUT DRIVE
  847. ;        EIGHT-BYTE DATASET NAME
  848. ;OUTPUT
  849. ;        THE FILE IS MOVED TO THE IBM DISKETTE.
  850. ;REMARKS
  851. ;        1.  IT IS ASSUMED THAT THE INPUT FILE NAME
  852. ;            IS THE EIGHT-BYTE DATASET NAME CONCATENATED
  853. ;            WITH A FILE TYPE OF 'DAT'.
  854. ;        2.  IT IS ASSUMED THAT THE IBM FILE HAS BEEN
  855. ;            PRE-ALLOCATED ON THE DISK WITH ENOUGH SPACE
  856. ;            DEFINED TO HOLD THE INPUT FILE.
  857. ;
  858. ;
  859. ;
  860. ;        DO INITIALIZATION.
  861. TRSCIBLK: DS    0
  862.     PRINT    <'*** TRANSFER CP/M TO 3740 (BLOCK) ***',CR,LF>
  863.     XRA    A        ;ZERO ERROR COUNT.
  864.     STA    TRSERR
  865. ;
  866. ;
  867. ;        GET INPUT AND OPEN FILES.
  868.     CALL    TRSGETIN    ;GET INPUT PARMS.
  869.     MVI    A,0        ;OPEN CP/M FOR INPUT.
  870.     CALL    CPMOPEN
  871.     JC    TRSCIBEN    ;...UNSUCCESSFUL.
  872.     MVI    A,1        ;OPEN IBM FOR OUTPUT.
  873.     LXI    HL,DATDSK2
  874.     CALL    IBMOPEN
  875.     JC    TRSCIBEN
  876. ;
  877. ;
  878. ;        GET THE BLOCK LENGTH FOR MOVE.
  879.     MOVEA    TBUFF,DSBLK,5    ;GET THE DATASET BLOCK LENGTH.
  880.     DECIN    TBUFF,5        ;CONVERT TO BINARY.
  881.     XCHG            ;GET BINARY BLOCK LENGTH.
  882.     SHLD    BLKLEN        ;SAVE IT.
  883. ;
  884. ;
  885. ;        GET AN CP/M BLOCK.
  886. TRSCIBLP: DS    0
  887.     CPM    CSTAT        ;CHECK FOR SUSPEND.
  888.     CPM    DRINT        ;GET CP/M CURRENT DRIVE.
  889.     SELDSK            ;SELECT THE DISK DRIVE.
  890.     CPM    DDMA,DATA1    ;SET FOR CP/M BUFFER.
  891.     CPM    DRR,TRSFCB    ;READ THE BLOCK.
  892.     CPI    0        ;ERROR?
  893.     JZ    TRSCIB00    ;...NO.
  894.     CPI    1        ;EOF?
  895.     JZ    TRSCIBOK    ;...YES, CLOSE FILES.
  896.     PRINT    <'*** CP/M READ ERROR ***',CR,LF>
  897.     BUMP    TRSERR
  898. TRSCIB00: DS    0
  899. ;
  900. ;
  901. ;        MOVE BLOCK TO IBM BUFFER.
  902.     FILL    DATA2,128,000H    ;MOVE LOW VALUES TO BUFFER.
  903.     MOVAE    DATA2,DATA1,BLKLEN ;MOVE IN THE DATA.
  904. ;
  905. ;
  906. ;        IF PAST EOE, ISSUE ERROR.
  907.     CLC    DATTRK2,TDSEOE,2
  908.     JC    TRSCIBNF
  909.     JZ    TRSCIBNF
  910.     PRINT    <'*** IBM EXTENT FULL ***',CR,LF>
  911.     BUMP    TRSERR
  912.     JMP    TRSCIBOK
  913. TRSCIBNF: DS    0
  914. ;
  915. ;
  916. ;        WRITE IBM BLOCK.
  917.     CALL    WRTDAT2        ;WRITE THE BLOCK.
  918. ;
  919. ;
  920. ;        BUMP THE IBM TRK/SCT.
  921.     BUMP    DATSCT2
  922.     LDA    DATSCT2        ;LIMIT TO 26.
  923.     CPI    26+1        ;ROLL TRACK AFTER LAST
  924.     JC    TRSCIBLP
  925.     MVI    A,1
  926.     STA    DATSCT2
  927.     BUMP    DATTRK2
  928.     JMP    TRSCIBLP
  929. ;
  930. ;
  931. ;        CLOSE ALL FILES.
  932. TRSCIBOK: DS    0
  933.     MVI    A,0        ;CP/M FILE.
  934.     CALL    CPMCLOSE
  935.     MVI    A,1        ;IBM FILE.
  936.     LXI    HL,DATTRK2
  937.     CALL    IBMCLOSE
  938. ;
  939. ;
  940. ;        RETURN TO CALLER.
  941. TRSCIBEN: DS    0
  942.     LDA    TRSERR
  943.     CPI    0
  944.     JNZ    TRSCIB02
  945.     PRINT    <'*** TRANSFER SUCCESSFUL ***',CR,LF>
  946.     JMP    TRSCIB03
  947. TRSCIB02: DS    0
  948.     PRINT    <'*** TRANSFER NOT COMPLETED ***',CR,LF>
  949.     PRINT    <'PLEASE DELETE OUTPUT FILE.',CR,LF>
  950. TRSCIB03: DS    0
  951.     INPUT    'PRESS <ENTER> TO CONTINUE.',TBUFF
  952.     RET
  953. ;
  954. ;
  955. ;
  956. ;
  957. $+PRINT
  958. $+PRINT
  959. ;        * * *  TRANSFER 3740 TO CP/M (BLOCK)  * * *
  960. ;PURPOSE
  961. ;        THIS ROUTINE TRANSFERS A DATASET FROM IBM TO 
  962. ;        CP/M FORMAT IN BLOCK MODE.  BLOCK MODE ASSUMES
  963. ;        EACH SECTOR ON BOTH THE INPUT AND OUTPUT DISKS
  964. ;        ARE ONE SECTOR.
  965. ;INPUT
  966. ;        CP/M OUTPUT DRIVE
  967. ;        IBM INPUT DRIVE
  968. ;        EIGHT-BYTE DATASET NAME
  969. ;OUTPUT
  970. ;        THE FILE IS MOVED TO THE CP/M DISK.   
  971. ;REMARKS
  972. ;        1.  IT IS ASSUMED THAT THE INPUT FILE NAME
  973. ;            IS THE EIGHT-BYTE DATASET NAME CONCATENATED
  974. ;            WITH A FILE TYPE OF 'DAT'.
  975. ;
  976. ;
  977. ;
  978. ;        DO INITIALIZATION.
  979. TRSICBLK: DS    0
  980.     PRINT    <'*** TRANSFER 3740 TO CP/M (BLOCK) ***',CR,LF>
  981.     XRA    A        ;ZERO ERROR COUNT.
  982.     STA    TRSERR
  983. ;
  984. ;
  985. ;        GET INPUT AND OPEN FILES.
  986.     CALL    TRSGETIN    ;GET INPUT PARMS.
  987.     MVI    A,0        ;OPEN IBM FOR INPUT.
  988.     LXI    HL,DATDSK1
  989.     CALL    IBMOPEN
  990.     JC    TRSICBEN    ;...UNSUCCESSFUL.
  991.     MVI    A,1        ;OPEN CP/M FOR OUTPUT.
  992.     CALL    CPMOPEN
  993.     JC    TRSICBEN
  994. ;
  995. ;
  996. ;        GET BLOCK LENGTH OF IBM DATASET.
  997.     MOVEA    TBUFF,DSBLK,5    ;GET ASCII BLOCK LENGTH.
  998.     DECIN    TBUFF,5        ;CONVERT IT TO BINARY.
  999.     XCHG            ;SAVE IT.
  1000.     SHLD    BLKLEN
  1001. ;
  1002. ;
  1003. ;        GET AN IBM BLOCK.
  1004. TRSICBLP: DS    0
  1005.     CPM    CSTAT        ;CHECK FOR SUSPEND.
  1006.     CLC    DATTRK1,TDSEOD,2 ;END OF FILE?
  1007.     CMC
  1008.     JC    TRSICBOK    ;...YES.
  1009.     CALL    REDDAT1        ;GET THE BLOCK.
  1010. ;
  1011. ;
  1012. ;        MOVE BLOCK TO CP/M BUFFER.
  1013.     FILL    DATA2,128,000H    ;ZERO OUTPUT BUFFER.
  1014.     MOVEA    DATA2,DATA1,BLKLEN
  1015.     MVI    A,00DH        ;INSERT <CR><LF> PAIR FOR CP/M
  1016.     STAX    DE
  1017.     INX    DE
  1018.     MVI    A,00AH
  1019.     STAX    DE
  1020. ;    
  1021. ;
  1022. ;        WRITE CP/M BLOCK.
  1023.     CPM    DRINT        ;GET CP/M CURRENT DRIVE.
  1024.     SELDSK            ;SELECT DISK DRIVE.
  1025.     CPM    DDMA,DATA2
  1026.     CPM    DWR,TRSFCB
  1027.     CPI    0        ;WRITE ERROR?
  1028.     JZ    TRSICB00    ;...NO.
  1029.     PRINT    <'*** CP/M WRITE ERROR ***',CR,LF>
  1030.     BUMP    TRSERR
  1031.     JMP    TRSICBOK
  1032. TRSICB00:
  1033. ;
  1034. ;
  1035. ;        BUMP TO NEXT IBM BLOCK.
  1036.     BUMP    DATSCT1        ;BUMP SECTOR BY 1.
  1037.     CPI    26+1        ;ALLOW FOR TRACK OVERFLOW.
  1038.     JC    TRSICBLP
  1039.     MVI    A,1        ;SECTOR = 1
  1040.     STA    DATSCT1
  1041.     BUMP    DATTRK1
  1042.     JMP    TRSICBLP
  1043. ;
  1044. ;
  1045. ;        CLOSE ALL FILES.
  1046. TRSICBOK: DS    0
  1047.     MVI    A,0        ;IBM FILE.
  1048.     LXI    HL,DATTRK1
  1049.     CALL    IBMCLOSE
  1050.     MVI    A,1        ;CP/M FILE.
  1051.     CALL    CPMCLOSE
  1052. ;
  1053. ;
  1054. ;        RETURN TO CALLER.
  1055. TRSICBEN: DS    0
  1056.     LDA    TRSERR
  1057.     CPI    0
  1058.     JNZ    TRSICB01
  1059.     PRINT    <'*** TRANSFER SUCCESSFUL ***',CR,LF>
  1060.     JMP    TRSICB02
  1061. TRSICB01:
  1062.     PRINT    <'*** TRANSFER NOT COMPLETED ***',CR,LF>
  1063.     PRINT    <'PLEASE DELETE OUTPUT FILE.',CR,LF>
  1064. TRSICB02:
  1065.     INPUT    'PRESS <ENTER> TO CONTINUE.',TBUFF
  1066.     RET
  1067. ;
  1068. ;
  1069. ;
  1070. ;
  1071. $+PRINT
  1072. $+PRINT
  1073. ;        * * *  TRANSFER CP/M TO 3740 (SOURCE)  * * *
  1074. ;PURPOSE
  1075. ;        THIS ROUTINE TRANSFERS A CP/M SOURCE FILE TO AN
  1076. ;        IBM FILE ONE LINE AT A TIME.  <TAB>'S ARE EX-
  1077. ;        PANDED AS THEY ARE ENCOUNTERED.  EOF WILL OCCUR
  1078. ;        WHEN (A) A 01AH IS ENCOUNTERED OR (B) THE PHYSICAL
  1079. ;        EOF IS ENCOUNTERED.  NOTE THAT <CR><LF>'S ARE 
  1080. ;        NOT TRANSFERRED.
  1081. ;INPUT
  1082. ;        CP/M DISK DRIVE
  1083. ;        IBM DISK DRIVE
  1084. ;        DATASET NAME
  1085. ;OUTPUT
  1086. ;        IBM DATASET
  1087. ;REMARKS
  1088. ;        1.  EACH LINE OF TEXT IS TRANSFERRED AS ONE PHYSICAL
  1089. ;            RECORD ON THE IBM DRIVE.  THE IBM BEGINNING-OF-EXTENT
  1090. ;            POINTER INDICATES WHERE THE TRANSFER IS TO BEGIN.
  1091. ;        2.  IT IS ASSUMED THAT THE IBM DATASET HAS BEEN 
  1092. ;            PRE-ALLOCATED WITH ENOUGH SPACE TO HOLD THE
  1093. ;            ENTIRE CP/M DATASET.
  1094. ;
  1095. ;
  1096. ;
  1097. ;        DO INITIALIZATION.
  1098. TRSCISRC: DS    0
  1099.     PRINT    <'*** TRANSFER CP/M TO 3740 (SOURCE) ***',CR,LF>
  1100.     LXI    HL,0        ;ZERO RECORD COUNT.
  1101.     SHLD    RCDCNT
  1102.     XRA    A        ;ZERO ERROR COUNT.
  1103.     STA    TRSERR
  1104. ;
  1105. ;
  1106. ;        GET INPUT AND OPEN FILES.
  1107.     CALL    TRSGETIN    ;GET INPUT PARMS.
  1108.     MVI    A,0        ;OPEN CP/M FOR INPUT.
  1109.     CALL    CPMOPEN
  1110.     JC    TRSCISEN    ;...UNSUCCESSFUL.
  1111.     MVI    A,1        ;OPEN IBM FOR OUTPUT.
  1112.     LXI    HL,DATDSK2
  1113.     CALL    IBMOPEN
  1114.     JC    TRSCISEN
  1115.     CALL    TRSCISGT    ;GET THE FIRST CP/M BLOCK.
  1116.     JC    TRSCISOK    ;...**EOF REACHED**
  1117. ;
  1118. ;
  1119. ;        GET THE BLOCK LENGTH FOR MOVE.
  1120.     MOVEA    TBUFF,DSBLK,5    ;GET THE DATASET BLOCK LENGTH.
  1121.     DECIN    TBUFF,5        ;CONVERT TO BINARY.
  1122.     XCHG            ;GET BINARY BLOCK LENGTH.
  1123.     SHLD    BLKLEN        ;SAVE IT.
  1124. ;
  1125. ;
  1126. ;        GET THE NEXT LINE OF CP/M TEXT.
  1127. TRSCISLP: DS    0
  1128.     CALL    TRSCISGL    ;GET THE LINE.
  1129.     JC    TRSCISOK    ;...**EOF REACHED**
  1130.     INDEX    RCDCNT        ;BUMP RECORD COUNT.
  1131. ;
  1132. ;
  1133. ;        MOVE BLOCK TO IBM BUFFER.
  1134.     FILL    DATA2,128,000H    ;MOVE LOW VALUES TO BUFFER.
  1135.     MOVAE    DATA2,TBUFF,BLKLEN ;MOVE IN THE DATA.
  1136. ;
  1137. ;
  1138. ;        IF PAST EOE, ISSUE ERROR.
  1139.     CLC    DATTRK2,TDSEOE,2
  1140.     JC    TRSCISNF
  1141.     JZ    TRSCISNF
  1142.     PRINT    <'*** IBM EXTENT FULL ***',CR,LF>
  1143.     BUMP    TRSERR
  1144.     JMP    TRSCISOK
  1145. TRSCISNF: DS    0
  1146. ;
  1147. ;
  1148. ;        WRITE IBM BLOCK.
  1149.     CALL    WRTDAT2        ;WRITE THE BLOCK.
  1150. ;
  1151. ;
  1152. ;        BUMP THE IBM TRK/SCT.
  1153.     BUMP    DATSCT2
  1154.     CPI    26+1
  1155.     JC    TRSCISLP
  1156.     MVI    A,1
  1157.     STA    DATSCT2
  1158.     BUMP    DATTRK2
  1159.     JMP    TRSCISLP
  1160. ;
  1161. ;
  1162. ;        CLOSE ALL FILES.
  1163. TRSCISOK: DS    0
  1164.     MVI    A,0        ;CP/M FILE.
  1165.     CALL    CPMCLOSE
  1166.     MVI    A,1        ;IBM FILE.
  1167.     LXI    HL,DATTRK2
  1168.     CALL    IBMCLOSE
  1169. ;
  1170. ;
  1171. ;        RETURN TO CALLER.
  1172. TRSCISEN: DS    0
  1173.     DECOUT    RCDCNT        ;DISPLAY RECORDS XFERED.
  1174.     PRINT    <' RECORDS TRANSFERRED.',CR,LF>
  1175.     LDA    TRSERR
  1176.     CPI    0
  1177.     JNZ    TRSCIS01
  1178.     PRINT    <'*** TRANSFER SUCCESSFUL ***',CR,LF>
  1179.     JMP    TRSCIS02
  1180. TRSCIS01:
  1181.     PRINT    <'*** TRANSFER NOT COMPLETED ***',CR,LF>
  1182.     PRINT    <'PLEASE DELETE OUTPUT FILE.',CR,LF>
  1183. TRSCIS02:
  1184.     INPUT    'PRESS <ENTER> TO CONTINUE.',TBUFF
  1185.     RET
  1186. ;
  1187. ;
  1188. ;        * *  GET A LINE OF CP/M TEXT  * *
  1189. TRSCISGL: DS    0
  1190.     FILL    TBUFF,128,' '    ;MOVE SPACES TO BUFFER.
  1191.     LXI    DE,TBUFF    ;POINT TO BEGINNING OF BUFFER.
  1192. ;
  1193. ;
  1194. ;        MOVE THE TEXT TO THE BUFFER.
  1195. TRSCISGN: DS    0
  1196.     PUSH    DE        ;SAVE BUFFER PTR.
  1197.     CALL    TRSCISGB    ;GET THE NEXT BYTE.
  1198.     POP    DE        ;RESTORE BUFFER PTR.
  1199.     RC            ;...**EOF REACHED**
  1200. ;
  1201. ;        HANDLE SPECIAL CHARACTERS.
  1202.     CPI    009H        ;**<TAB>**
  1203.     JNZ    TRSCIS03
  1204.     INX    DE        ;BUMP OUTPUT PTR.
  1205.     MOV    A,E        ;ALIGN TO 8 BYTE BOUNDARY.
  1206.     ANI    8-1
  1207.     JNZ    $-4
  1208.     JMP    TRSCISGN    ;GO GET NEXT BYTE.
  1209. TRSCIS03:
  1210.     CPI    00DH        ;**<CR> OR <EOL>**
  1211.     JNZ    TRSCIS04
  1212.     CALL    TRSCISGB    ;GET TRAILING <LF>.
  1213.     RET
  1214. TRSCIS04:
  1215.     CPI    00AH        ;**<LF> OR <EOL>**
  1216.     RZ
  1217. ;
  1218. ;        ADD CHARACTER TO BUFFER.
  1219.     STAX    DE
  1220.     INX    DE        ;BUMP BUFFER PTR.
  1221.     JMP    TRSCISGN
  1222. ;
  1223. ;
  1224. ;
  1225. ;        * *  GET A BYTE  * *
  1226. TRSCISGB: DS    0
  1227.     LHLD    TRSBUFP        ;POINT INTO CP/M BUFFER.
  1228.     LDA    TRSBUFA        ;GET REMAINING # OF BYTES.
  1229.     CPI    0        ;NEED A NEW BLOCK?
  1230.     JNZ    TRSCIS05    ;...NO.
  1231.     CALL    TRSCISGT    ;READ IT.
  1232.     RC            ;...**EOF REACHED**
  1233. TRSCIS05:
  1234. ;
  1235. ;
  1236.     MOV    C,M        ;GET THE NEXT BYTE.
  1237.     INX    HL        ;BUMP BUFFER PTR.
  1238.     DCR    A        ;DECR BUFFER COUNT.
  1239.     SHLD    TRSBUFP        ;SAVE BUFFER PTR AND CNT.
  1240.     STA    TRSBUFA
  1241.     MOV    A,C
  1242. ;
  1243. ;
  1244.     CPI    01AH        ;**LOGICAL EOF**
  1245.     JNZ    TRSCIS06
  1246.     STC
  1247.     RET
  1248. TRSCIS06:
  1249.     ORA    A        ;RESET CY.
  1250.     RET
  1251. ;
  1252. ;
  1253. ;
  1254. ;        * *  GET A CP/M BLOCK  * *
  1255. TRSCISGT: DS    0
  1256.     CPM    CSTAT        ;CHECK FOR SUSPEND.
  1257.     CPM    DRINT        ;GET CP/M CURRENT DRIVE.
  1258.     SELDSK            ;SELECT THE DISK DRIVE.
  1259.     CPM    DDMA,DATA1    ;SET FOR CP/M BUFFER.
  1260.     CPM    DRR,TRSFCB    ;READ THE BLOCK.
  1261.     CPI    0
  1262.     JZ    TRSCIS07
  1263.     CPI    1
  1264.     JZ    TRSCIS08
  1265.     PRINT    <'*** CP/M READ ERROR ***',CR,LF>
  1266.     BUMP    TRSERR
  1267. TRSCIS08:
  1268. ;                ;** EOF REACHED **
  1269.     STC
  1270. TRSCIS07:
  1271. ;        SET UP VARIABLES AND RETURN.
  1272.     LXI    HL,DATA1    ;CURRENT BUFFER PTR
  1273.     SHLD    TRSBUFP
  1274.     MVI    A,128        ;# OF BYTES REMAINING
  1275.     STA    TRSBUFA
  1276.     RET
  1277. ;
  1278. ;
  1279. ;
  1280. ;
  1281. ;
  1282. ;
  1283. $+PRINT
  1284. $+PRINT
  1285. ;        * * *  TRANSFER 3740 TO CP/M (SOURCE)  * * *
  1286. ;PURPOSE
  1287. ;        THIS ROUTINE TRANSFERS A IBM DATASET TO A CP/M
  1288. ;        SOURCE FILE ONE LINE AT A TIME.  LINES ARE ENDED
  1289. ;        WITH <CR><LF> PAIRS AND OUTPUTTED CONTIGUOUSLY.
  1290. ;        INITIALLY, THE OUTPUT BUFFER IS INITIALIZED TO    
  1291. ;        01AH (LOGICAL EOF).  THEREFORE, ALL CONSTRAINTS
  1292. ;        FOR A CP/M SOURCE FILE ARE MET.
  1293. ;INPUT
  1294. ;        CP/M DISK DRIVE
  1295. ;        IBM DISK DRIVE
  1296. ;        DATASET NAME
  1297. ;OUTPUT
  1298. ;        CP/M DATASET
  1299. ;REMARKS
  1300. ;        1.  IF THE DATASET WAS PREVIOUSLY CREATED ON THE CP/M
  1301. ;            DRIVE.  IT IS DELETED AND RE-ALLOCATED. 
  1302. ;
  1303. ;
  1304. ;
  1305. ;        DO INITIALIZATION.
  1306. TRSICSRC: DS    0
  1307.     PRINT    <'*** TRANSFER 3740 TO CP/M (SOURCE) ***',CR,LF>
  1308.     LXI    HL,0        ;ZERO RECORD COUNT.
  1309.     SHLD    RCDCNT
  1310.     XRA    A        ;ZERO ERROR COUNT.
  1311.     STA    TRSERR
  1312. ;
  1313. ;
  1314. ;        GET INPUT AND OPEN FILES.
  1315.     CALL    TRSGETIN    ;GET INPUT PARMS.
  1316.     MVI    A,0        ;OPEN IBM FOR INPUT.
  1317.     LXI    HL,DATDSK1
  1318.     CALL    IBMOPEN
  1319.     JC    TRSICSEN    ;...UNSUCCESSFUL.
  1320.     MVI    A,1        ;OPEN CP/M FOR OUTPUT.
  1321.     CALL    CPMOPEN
  1322.     JC    TRSICSEN
  1323.     CALL    TRSICSIN    ;INITIALIZE OUTPUT BUFFER.
  1324.  
  1325. ;        GET BLOCK LENGTH OF IBM DATASET.
  1326.     MOVEA    TBUFF,DSBLK,5    ;GET ASCII BLOCK LENGTH.
  1327.     DECIN    TBUFF,5        ;CONVERT IT TO BINARY.
  1328.     XCHG            ;SAVE IT.
  1329.     SHLD    BLKLEN
  1330.  
  1331. ;        GET AN IBM BLOCK.
  1332. TRSICSLP: DS    0
  1333.     CPM    CSTAT        ;CHECK FOR SUSPEND.
  1334.     CLC    DATTRK1,TDSEOD,2 ;END OF FILE?
  1335.     CMC
  1336.     JC    TRSICSOK    ;...YES.
  1337.     CALL    REDDAT1        ;GET THE BLOCK.
  1338.     INDEX    RCDCNT        ;BUMP RECORD COUNT.
  1339.  
  1340. ;        MOVE RECORD TO CP/M BUFFER.
  1341.     MOVEA    TBUFF,DATA1,BLKLEN
  1342.  
  1343. ;        REMOVE TRAILING BLANKS.
  1344.     LXI    HL,TBUFF    ;POINT TO BUFFER.
  1345.     LDA    BLKLEN        ;GET BLOCK LENGTH - 1.
  1346.     DCR    A
  1347.     MOV    C,A        ;SAVE IT.
  1348.     ADD    L        ;POINT TO LAST BYTE.
  1349.     MOV    L,A
  1350.     MOV    A,H
  1351.     ACI    0
  1352.     MOV    H,A
  1353. TRSICS06:
  1354.     MOV    A,M        ;GET A BYTE.
  1355.     CPI    ' '        ;BLANK?
  1356.     JNZ    TRSICS07    ;...NO.
  1357.     DCX    HL        ;TRY NEXT BYTE.
  1358.     DCR    C        ;DECR COUNT.
  1359.     JNZ    TRSICS06
  1360. TRSICS07:
  1361.     MOV    A,C        ;SAVE THE NEW LENGTH.
  1362.     INR    A        ;MAKE IT RELATIVE TO ONE.
  1363.     STA    TWRKC3        ;SAVE IT.
  1364.  
  1365. ;        PUT THE RECORD TO CP/M.
  1366.     LXI    HL,TBUFF    ;POINT TO BUFFER.
  1367. TRSICS00:
  1368.     LDA    TWRKC3        ;** LOOP FOR FULL BUFFER **
  1369.     CPI    0
  1370.     JZ    TRSICS01
  1371.     MOV    A,M        ;GET THE NEXT BYTE.
  1372.     CPI    ' '        ;BLANK?
  1373.     JNZ    TRSICS08    ;...NO, PUT BYTE TO CP/M.
  1374.     MOV    A,L        ;8-BYTE BOUNDARY?
  1375.     ANI    8-1
  1376.     CPI    8-1        ;LAST BYTE ON BOUNDARY?
  1377.     JZ    TRSICS08-1    ;YES, SKIP TAB COMPRESS.
  1378.     SUI    8        ;GET REMAINING BYTES TO BOUNDARY.
  1379.     CMA
  1380.     MOV    C,A        ;SAVE IT.
  1381.     MOV    B,A
  1382.     PUSH    HL        ;SAVE HL.
  1383. TRSICS09:            ;**CHECK IF REST OF BOUNDARY IS
  1384. ;                ;**BLANK.
  1385.     INX    HL
  1386.     MOV    A,M        ;GET THE NEXT BYTE.
  1387.     CPI    ' '        ;IS IT A BLANK?
  1388.     JNZ    TRSICS08-2    ;...NO, SKIP COMPRESSION.
  1389.     DCR    C        ;DECR COUNT.
  1390.     JNZ    TRSICS09    ;LOOP FOR ALL BYTES.
  1391.     POP    DE        ;PUT PTR TO 8-BYTE BOUNDARY.
  1392.     LDA    TWRKC3        ;ADJUST BYTE COUNT.
  1393.     SUB    B
  1394.     STA    TWRKC3
  1395.     MVI    A,009H        ;OUTPUT A <TAB>.
  1396.     JMP    TRSICS08
  1397.     POP    HL
  1398.     MOV    A,M        ;GET THE BYTE.
  1399. TRSICS08:
  1400.     INX    HL        ;BUMP PTR.
  1401.     PUSH    HL        ;SAVE IT.
  1402.     CALL    TRSICSPB    ;ADD THE BYTE.
  1403.     POP    HL
  1404.     JC    TRSICSOK    ;...** WRITE ERROR **
  1405.     BUMP    TWRKC3,-1    ;DECR REMAINING COUNT.
  1406.     JMP    TRSICS00
  1407. TRSICS01:
  1408.  
  1409. ;        ADD TRAILING CR,LF FOR CP/M.
  1410.     MVI    A,00DH        ;ADD <CR>.
  1411.     CALL    TRSICSPB
  1412.     MVI    A,00AH        ;ADD <LF>.
  1413.     CALL    TRSICSPB
  1414.  
  1415. ;        BUMP TO NEXT IBM BLOCK.
  1416.     BUMP    DATSCT1        ;BUMP SECTOR BY 1.
  1417.     CPI    26+1
  1418.     JC    TRSICSLP
  1419.     MVI    A,1        ;SECTOR = 1
  1420.     STA    DATSCT1
  1421.     BUMP    DATTRK1
  1422.     JMP    TRSICSLP
  1423.  
  1424. ;        CLOSE ALL FILES.
  1425. TRSICSOK: DS    0
  1426.     CALL    TRSICSPT    ;PUT THE LAST BLOCK.
  1427.     MVI    A,0        ;IBM FILE.
  1428.     LXI    HL,DATTRK1
  1429.     CALL    IBMCLOSE
  1430.     MVI    A,1        ;CP/M FILE.
  1431.     CALL    CPMCLOSE
  1432.  
  1433. ;        RETURN TO CALLER.
  1434. TRSICSEN: DS    0
  1435.     DECOUT    RCDCNT        ;DISPLAY RECORDS XFERED.
  1436.     PRINT    <' RECORDS TRANSFERRED.',CR,LF>
  1437.     LDA    TRSERR
  1438.     CPI    0
  1439.     JNZ    TRSICS02
  1440.     PRINT    <'*** TRANSFER SUCCESSFUL ***',CR,LF>
  1441.     JMP    TRSICS03
  1442. TRSICS02:
  1443.     PRINT    <'*** TRANSFER NOT COMPLETED ***',CR,LF>
  1444.     PRINT    <'PLEASE DELETE OUTPUT FILE.',CR,LF>
  1445. TRSICS03:
  1446.     INPUT    'PRESS <ENTER> TO CONTINUE.',TBUFF
  1447.     RET
  1448.  
  1449.  
  1450. ;        * *  PUT A BYTE TO CP/M FILE  * *
  1451.  
  1452. ;        PUT BYTE IN BUFFER.
  1453. TRSICSPB: DS    0
  1454.     LHLD    TRSBUFP        ;GET BUFFER POINTER.
  1455.     MOV    M,A        ;ADD THE BYTE.
  1456.     INX    HL        ;BUMP BUFFER PTR.
  1457.     SHLD    TRSBUFP        ;SAVE IT.
  1458.  
  1459. ;        IF FULL BUFFER, WRITE IT OUT.
  1460.     BUMP    TRSBUFA,-1    ;DECR REMAINING BYTE CNT.
  1461.     LDA    TRSBUFA
  1462.     CPI    0        ;** FULL BUFFER **
  1463.     JNZ    TRSICS04
  1464.     CALL    TRSICSPT    ;ADD THE RECORD.
  1465.     RC            ;...** WRITE ERROR **
  1466.     CALL    TRSICSIN    ;INITIALIZE BUFFER.
  1467. TRSICS04:
  1468.  
  1469. ;        RETURN TO CALLER.
  1470.     ORA    A
  1471.     RET
  1472.  
  1473. ;        * *  WRITE CP/M BLOCK  * *
  1474. TRSICSPT: DS    0
  1475.     CPM    DRINT        ;GET CP/M CURRENT DRIVE.
  1476.     SELDSK            ;SELECT DISK DRIVE.
  1477.     CPM    DDMA,DATA2
  1478.     CPM    DWR,TRSFCB
  1479.     CPI    0        ;WRITE ERROR?
  1480.     JZ    TRSICS05    ;...NO.
  1481.     PRINT    <'*** CP/M WRITE ERROR ***',CR,LF>
  1482.     BUMP    TRSERR
  1483.     STC            ;INDICATE ERROR.
  1484.     RET
  1485. TRSICS05:
  1486.     ORA    A
  1487.     RET
  1488.  
  1489. ;        * *  INITIALIZE OUTPUT BUFFER  * *
  1490. TRSICSIN: DS    0
  1491.     FILL    DATA2,128,01AH    ;INITIALIZE BUFFER TO LOGICAL EOF.
  1492.     LXI    HL,DATA2    ;RESET BUFFER PTR.
  1493.     SHLD    TRSBUFP
  1494.     MVI    A,128        ;RESET REMAINING BYTE COUNT.
  1495.     STA    TRSBUFA
  1496.     RET
  1497.  
  1498.  
  1499.  
  1500. $+PRINT
  1501. $+PRINT
  1502. ;        * * *  DISPLAY AN IBM DATASET  * * *
  1503. ;PURPOSE
  1504. ;        THIS ROUTINE DISPLAYS THE CONTENTS OF A PARTICULAR
  1505. ;        IBM DATASET TO THE USER.  NOTE THAT ALL RECORDS
  1506. ;        ARE DISPLAYED.
  1507. ;INPUT
  1508. ;        IBM DISK DRIVE
  1509. ;        IBM EIGHT-BYTE DATASET NAME
  1510. ;OUTPUT
  1511. ;        THE CONTENTS OF THE FILE ARE LISTED ON THE SCREEN.
  1512. ;REMARKS
  1513. ;
  1514. ;
  1515. ;
  1516. ;        DO INITIALIZATION.
  1517. DSPIBMDS: DS    0
  1518.     PRINT    <'*** DISPLAY AN IBM DATASET ***',CR,LF>
  1519.     LXI    HL,0        ;ZERO RECORD COUNT.
  1520.     SHLD    RCDCNT
  1521.     XRA    A        ;ZERO ERROR COUNT.
  1522.     STA    TRSERR
  1523. ;
  1524. ;
  1525. ;        GET IBM DISK DRIVE.
  1526.     PRINT    <'(IBM) '>
  1527.     CALL    INPDSKNO    ;GET IT.
  1528.     STA    IBMDSKNO    ;SAVE IT.
  1529. ;
  1530. ;
  1531. ;        GET DATASET NAME.
  1532. DSPIBMDD: DS    0
  1533.     INPUT    'ENTER DATASET NAME (1-8 CHARS): ',TBUFF
  1534.     PRINT
  1535.     LDA    TBUFF+1        ;CHECK FOR 1-8 CHARS.
  1536.     CPI    1
  1537.     JC    DSPIBMDB
  1538.     CPI    8+1
  1539.     JC    DSPIBMDG
  1540. DSPIBMDB: DS    0
  1541.     PRINT    <'*** INVALID REPLY ***',CR,LF>
  1542.     JMP    DSPIBMDD
  1543. DSPIBMDG: DS    0
  1544.     FILL    TDSN,8,020H    ;INITIALIZE DATASET NAME.
  1545.     MVC    TDSN,TBUFF+2,TBUFF+1 ;MOVE IT IN.
  1546. ;
  1547. ;
  1548. ;        GET INPUT FILE.
  1549.     MVI    A,0        ;OPEN IBM FOR INPUT.
  1550.     LXI    HL,DATDSK1
  1551.     CALL    IBMOPEN
  1552.     JC    DSPIBMD1    ;...UNSUCCESSFUL.
  1553. ;
  1554. ;
  1555. ;        GET BLOCK LENGTH OF IBM DATASET.
  1556.     MOVEA    TBUFF,DSBLK,5    ;GET ASCII BLOCK LENGTH.
  1557.     DECIN    TBUFF,5        ;CONVERT IT TO BINARY.
  1558.     XCHG            ;SAVE IT.
  1559.     SHLD    BLKLEN
  1560. ;
  1561. ;
  1562. ;        GET AN IBM BLOCK.
  1563. DSPIBMDL: DS    0
  1564.     CPM    CSTAT        ;CHECK FOR SUSPEND.
  1565.     CLC    DATTRK1,TDSEOD,2 ;END OF FILE?
  1566.     CMC
  1567.     JC    DSPIBMD2    ;...YES.
  1568.     CALL    REDDAT1        ;GET THE BLOCK.
  1569.     INDEX    RCDCNT        ;BUMP RECORD COUNT.
  1570. ;
  1571. ;
  1572. ;        PRINT 80 CHARS OF INFO.
  1573.     MVI    C,80        ;SET COUNTER.
  1574.     LXI    HL,DATA1    ;POINT TO DATA.
  1575. DSPIBMRL: DS    0
  1576.     MOV    A,M        ;GET A CHAR.
  1577.     CALL    TRNEBAS        ;TRANSLATE IT TO ASCII.
  1578.     CALL    OUTTRN        ;REMOVE NON-PRINTABLE CHARS.
  1579.     PUSH    BC        ;SAVE REGS.
  1580.     CPM    CWRITE,,??    ;PUT THE CHAR.
  1581.     POP    BC        ;RESTORE REGS.
  1582.     INX    HL        ;BUMP CHAR PTR.
  1583.     DCR    C        ;LOOP FOR ALL CHARS.
  1584.     JNZ    DSPIBMRL
  1585. ;
  1586. ;
  1587. ;        BUMP TO NEXT IBM BLOCK.
  1588.     BUMP    DATSCT1        ;BUMP SECTOR BY 1.
  1589.     CPI    26+1
  1590.     JC    DSPIBMDL
  1591.     MVI    A,1        ;SECTOR = 1
  1592.     STA    DATSCT1
  1593.     BUMP    DATTRK1
  1594.     JMP    DSPIBMDL
  1595. ;
  1596. ;
  1597. ;        CLOSE ALL FILES.
  1598. DSPIBMD2: DS    0
  1599.     MVI    A,0        ;IBM FILE.
  1600.     LXI    HL,DATTRK1
  1601.     CALL    IBMCLOSE
  1602. ;
  1603. ;
  1604. ;        RETURN TO CALLER.
  1605. DSPIBMD1: DS    0
  1606.     DECOUT    RCDCNT        ;DISPLAY RECORDS XFERED.
  1607.     PRINT    <' RECORDS DISPLAYED.',CR,LF>
  1608.     LDA    TRSERR
  1609.     CPI    0
  1610.     JNZ    DSPIBM01
  1611.     PRINT    <'*** DISPLAY SUCCESSFUL ***',CR,LF>
  1612.     JMP    DSPIBM02
  1613. DSPIBM01: DS    0
  1614.     PRINT    <'*** ERROR DURING DISPLAY ***',CR,LF>
  1615. DSPIBM02: DS    0
  1616.     INPUT    'PRESS <ENTER> TO CONTINUE.',TBUFF
  1617.     RET
  1618. ;
  1619. ;
  1620. ;
  1621. ;
  1622. $+PRINT
  1623. $+PRINT
  1624. ;        * * *  GET TRANSFER INPUT  * * *
  1625. ;PURPOSE
  1626. ;        THIS ROUTINE QUIRIES THE OPERATOR FOR THE
  1627. ;        CP/M DRIVE, IBM DRIVE AND EIGHT-BYTE DATASET
  1628. ;        NAME TO BE USED IN THE TRANSFERS.
  1629. ;INPUT
  1630. ;        CP/M DISK DRIVE
  1631. ;        IBM DISK DRIVE
  1632. ;        EIGHT BYTE DATASET NAME
  1633. ;OUTPUT
  1634. ;        CPMDSKNO CONTAINS THE CP/M DISK DRIVE.
  1635. ;        IBMDSKNO CONTAINS THE IBM DISK DRIVE.
  1636. ;        TDSN CONTAINS THE EIGHT-BYTE DATASET NAME.
  1637. ;REMARKS
  1638. ;
  1639. ;
  1640. ;
  1641. ;        DO INITIALIZATION.
  1642. TRSGETIN: DS    0
  1643. ;
  1644. ;
  1645. ;        GET CP/M DISK DRIVE.
  1646. TRSGETCD: DS    0
  1647.     PRINT    <'(CP/M) '>
  1648.     CALL    INPDSKNO    ;GET IT.
  1649.     STA    CPMDSKNO    ;SAVE IT.
  1650. ;
  1651. ;
  1652. ;        GET IBM DISK DRIVE.
  1653.     PRINT    <'(IBM) '>
  1654.     CALL    INPDSKNO    ;GET IT.
  1655.     STA    IBMDSKNO    ;SAVE IT.
  1656. ;
  1657. ;
  1658. ;        INSURE IBM DRIVE IS SEPERATE FROM CP/M DRIVE.
  1659.     LDA    IBMDSKNO
  1660.     MOV    C,A
  1661.     LDA    CPMDSKNO
  1662.     JNZ    TRSGETD
  1663.     PRINT    <'*** IBM AND CP/M DRIVES MUST BE DIFFERENT. ***',CR,LF>
  1664.     PRINT    <'*** PLEASE RE-ENTER. ***',CR,LF>
  1665.     JMP    TRSGETCD
  1666. ;
  1667. ;
  1668. ;        GET DATASET NAME.
  1669. TRSGETD: DS    0
  1670.     INPUT    'ENTER DATASET NAME (1-8 CHARS): ',TBUFF
  1671.     PRINT
  1672.     LDA    TBUFF+1        ;CHECK FOR 1-8 CHARS.
  1673.     CPI    1
  1674.     JC    TRSGETDB
  1675.     CPI    8+1
  1676.     JC    TRSGETDG
  1677. TRSGETDB: DS    0
  1678.     PRINT    <'*** INVALID REPLY ***',CR,LF>
  1679.     JMP    TRSGETD
  1680. TRSGETDG: DS    0
  1681.     FILL    TDSN,8,020H    ;INITIALIZE DATASET NAME.
  1682.     MVC    TDSN,TBUFF+2,TBUFF+1 ;MOVE IT IN.
  1683. ;
  1684. ;
  1685. ;        RETURN TO CALLER.
  1686.     RET
  1687. ;
  1688. ;
  1689. ;
  1690. ;
  1691. $+PRINT
  1692. $+PRINT
  1693. ;        * * *  OPEN A CP/M FILE  * * *
  1694. ;PURPOSE
  1695. ;        THIS ROUTINE OPENS THE CP/M INPUT/OUTPUT
  1696. ;        FILE WITH THE APPROPRIATE HOUSEKEEPING.
  1697. ;INPUT
  1698. ;        A=0 (OPEN INPUT)
  1699. ;        A=1 (OPEN OUTPUT)
  1700. ;OUTPUT
  1701. ;REMARKS
  1702. ;
  1703. ;
  1704. ;
  1705. ;        DO INITIALIZATION.
  1706. CPMOPEN: DS    0
  1707.     SAVE
  1708.     PUSH    PSW        ;SAVE INPUT/OUTPUT INDICATOR.
  1709.     MVI    A,0        ;RESET ERROR INDICATOR.
  1710.     STA    TRSERR
  1711.  
  1712. ;        SELECT THE DISK DRIVE.
  1713.     CPM    DRINT        ;GET CP/M CURRENT DRIVE.
  1714.     SELDSK            ;COORDINATE BIOS.
  1715.     CPM    DDMA,TBUFF    ;SET DMA TO DEFAULT BUFFER.
  1716.     CPM    DSD,,CPMDSKNO    ;ISSUE LOGIN FOR DISK.
  1717. ;
  1718. ;
  1719. ;        SET UP CP/M FCB.
  1720.     FILL    TRSFCB,33,000H
  1721.     MVC    TRSFCB+FCBFN,TDSN,8
  1722.     MVC    TRSFCB+FCBFT,'DAT'
  1723. ;
  1724. ;
  1725. ;        IF OUTPUT, CREATE FILE.
  1726.     POP    PSW
  1727.     CPI    1
  1728.     JNZ    CPMOPEN00
  1729.     CPM    DDF,TRSFCB    ;DELETE IT FIRST.
  1730.     CPM    DCRF,TRSFCB    ;CREATE IT.
  1731.     CPI    255        ;UNSUCCESSFUL?
  1732.     JNZ    CPMOPEN00
  1733.     PRINT    <'*** CP/M OUTPUT FILE DIRECTORY FULL ***',CR,LF>
  1734.     BUMP    TRSERR
  1735. CPMOPEN00:
  1736. ;
  1737. ;
  1738. ;        OPEN THE FILE.
  1739.     CPM    DOF,TRSFCB    ;ISSUE OPEN.
  1740.     CPI    255
  1741.     JNZ    CPMOPEN01
  1742.     PRINT    <'*** CP/M FILE OPEN FAILURE ***',CR,LF>
  1743.     BUMP    TRSERR
  1744. CPMOPEN01:
  1745. ;
  1746. ;
  1747. ;        RETURN TO CALLER.
  1748.     RESTORE
  1749.     LDA    TRSERR        ;GET ERROR COUNT.
  1750.     ORA    A        ;RESET CY.
  1751.     RZ            ;...RETURN, NO ERROR.
  1752.     STC
  1753.     RET
  1754. ;
  1755. ;
  1756. ;
  1757. ;
  1758. $+PRINT
  1759. $+PRINT
  1760. ;        * * *  CLOSE A CP/M FILE  * * *
  1761. ;PURPOSE
  1762. ;        THIS ROUTINE CLOSES A CP/M FILE WITH THE
  1763. ;        APPROPRIATE HOUSEKEEPING.
  1764. ;INPUT
  1765. ;        A=0 (CLOSE INPUT)
  1766. ;        A=1 (CLOSE OUTPUT)
  1767. ;OUTPUT
  1768. ;REMARKS
  1769. ;
  1770. ;
  1771. ;
  1772. ;        DO INITIALIZATION.
  1773. CPMCLOSE: DS    0
  1774.     SAVE            ;SAVE REGS.
  1775.     MVI    A,0        ;RESET ERROR INDICATOR.
  1776.     STA    TRSERR
  1777.  
  1778. ;        SELECT THE DISK DRIVE.
  1779.     CPM    DRINT        ;GET CP/M CURRENT DRIVE.
  1780.     SELDSK            ;COORDINATE BIOS.
  1781.     CPM    DDMA,TBUFF    ;SET DMA FOR DEFAULT BUFFER.
  1782.  
  1783. ;        CLOSE THE FILE.
  1784.     CPM    DCF,TRSFCB    ;ISSUE CLOSE.
  1785.     CPI    255        ;UNSUCCESSFUL
  1786.     JNZ    CPMCLOS0
  1787.     PRINT    <'*** CP/M CLOSE FAILURE ***',CR,LF>
  1788.     BUMP    TRSERR
  1789. CPMCLOS0:
  1790.  
  1791. ;        RETURN TO CALLER.
  1792.     RESTORE            ;RESTORE REGS.
  1793.     LDA    TRSERR
  1794.     ORA    A        ;RESET CY.
  1795.     RZ
  1796.     STC
  1797.     RET
  1798.  
  1799.  
  1800.  
  1801. $+PRINT
  1802. $+PRINT
  1803. ;        * * *  CLOSE AN IBM FILE  * * *
  1804. ;PURPOSE
  1805. ;        THIS ROUTINE OPENS AN IBM FILE WITH THE
  1806. ;        APPROPRIATE HOUSEKEEPING.
  1807. ;INPUT
  1808. ;        A = 0 - INPUT FILE
  1809. ;            1 - OUTPUT FILE
  1810. ;        HL => INTERNAL DATA SECTOR
  1811. ;OUTPUT
  1812. ;REMARKS
  1813. ;
  1814. ;
  1815. ;
  1816. ;        DO INITIALIZATION.
  1817. IBMCLOSE: DS    0
  1818.     SAVE            ;SAVE REGS.
  1819.     PUSH    PSW
  1820.     MVI    A,0        ;ZERO ERROR INDICATOR.
  1821.     STA    TRSERR
  1822.     POP    PSW
  1823.     CPI    1        ;SKIP IF NOT OUTPUT.
  1824.     JNZ    IBMCLSEN
  1825. ;
  1826. ;
  1827. ;        DSEOD = DATA TRK/SCT
  1828.     MOV    D,M        ;GET TRK.
  1829.     INX    HL
  1830.     MOV    E,M        ;GET SCT.
  1831.     LXI    HL,TBUFF    ;CONVERT TO EXTERNAL.
  1832.     CALL    OUTTRSAD
  1833.     MOVAE    DSEOD,TBUFF,5    ;CONVERT TO EBCDIC.
  1834. ;
  1835. ;
  1836. ;        REWRITE THE DIRECTORY ENTRY.
  1837.     LDA    DIRSCT        ;GET THE SECTOR.
  1838.     CALL    WRTDIR        ;WRITE IT OUT.
  1839. ;
  1840. ;
  1841. ;        RETURN TO CALLER.
  1842. IBMCLSEN: DS    0
  1843.     RESTORE            ;RESTORE REGS.
  1844.     LDA    TRSERR        ;IF ERROR, CY:ON.
  1845.     CPI    0
  1846.     RZ
  1847.     STC
  1848.     RET
  1849. ;
  1850. ;
  1851. ;
  1852. ;
  1853. $+PRINT
  1854. $+PRINT
  1855. ;        * * *  OPEN AN IBM FILE  * * *
  1856. ;PURPOSE
  1857. ;        THIS ROUTINE OPENS AN IBM FILE WITH
  1858. ;        THE APPROPRIATE HOUSEKEEPING.
  1859. ;INPUT
  1860. ;        A=0 (OPEN INPUT)
  1861. ;        A=1 (OPEN OUTPUT)
  1862. ;        HL <= TRK/SCT AREA (2 BYTES)
  1863. ;OUTPUT
  1864. ;        TRK/SCT AREA = DSEOD
  1865. ;REMARKS
  1866. ;
  1867. ;
  1868. ;
  1869. ;        DO INITIALIZATION.
  1870. IBMOPEN: DS    0
  1871.     SAVE            ;SAVE REGS.
  1872.     PUSH    PSW
  1873.     MVI    A,0        ;ZERO ERROR INDICATOR.
  1874.     STA    TRSERR
  1875.     POP    PSW
  1876.  
  1877. ;        ZERO BUFFER HEADER.
  1878.     XRA    A
  1879.     MOV    M,A
  1880.     INX    HL
  1881.     MOV    M,A
  1882.     INX    HL
  1883.     MOV    M,A
  1884.     DCX    HL        ;RESET PTR.
  1885.     DCX    HL
  1886.  
  1887. ;        GET IBM DISK DRIVE.
  1888.     LDA    IBMDSKNO    ;DIRDSK.
  1889.     MOV    M,A        ;SAVE IN DATA AREA.
  1890.     INX    HL
  1891.     PUSH    HL
  1892.     STA    DIRDSK
  1893.  
  1894. ;        SCAN IBM DISK DRIVE FOR DATASET.
  1895.     MVI    A,8        ;SET FOR FIRST DIR ENTRY.
  1896.     STA    DIRSCT
  1897. IBMOPEN00: DS    0
  1898.     LDA    DIRSCT
  1899.     CPI    26+1
  1900.     JNC    IBMOPEN01
  1901.     CALL    REDDIR        ;READ THE DIRECTORY.
  1902.     MOVEA    TBUFF,DSID,8    ;COMPARE DATASET NAMES.
  1903.     CLC    TBUFF,TDSN,8
  1904.     JZ    IBMOPNFD    ;...FOUND IT.
  1905.     BUMP    DIRSCT
  1906.     JMP    IBMOPEN00
  1907. IBMOPEN01: DS    0
  1908.     PRINT    <'*** IBM DATASET NOT FOUND ***',CR,LF>
  1909.     BUMP    TRSERR
  1910.     POP    PSW
  1911.     JMP    IBMOPNEN
  1912. IBMOPNFD: DS    0
  1913.  
  1914. ;        GET BEGINNING OF EXTENT.
  1915.     MOVEA    TBUFF,DSBOE,5
  1916.     LXI    HL,TBUFF    ;CONVERT TO BINARY.
  1917.     CALL    VERTRSAD
  1918.     JNC    IBMOPNGB
  1919.     PRINT    <'*** IBM BAD BOE FOUND ***',CR,LF>
  1920.     BUMP    TRSERR
  1921. IBMOPNGB: DS    0
  1922.     MOV    A,H        ;SAVE IT.
  1923.     MOV    H,L
  1924.     MOV    L,A
  1925.     SHLD    TDSBOE
  1926.  
  1927. ;        GET END OF EXTENT.
  1928.     MOVEA    TBUFF,DSEOE,5
  1929.     LXI    HL,TBUFF    ;CONVERT TO BINARY.
  1930.     CALL    VERTRSAD
  1931.     JNC    IBMOPNGE
  1932.     PRINT    <'*** IBM BAD EOE FOUND ***',CR,LF>
  1933.     BUMP    TRSERR
  1934. IBMOPNGE: DS    0
  1935.     MOV    A,H        ;SAVE IT.
  1936.     MOV    H,L
  1937.     MOV    L,A
  1938.     SHLD    TDSEOE
  1939.  
  1940. ;        GET END OF DATA.
  1941.     MOVEA    TBUFF,DSEOD,5
  1942.     LXI    HL,TBUFF    ;CONVERT TO BINARY.
  1943.     CALL    VERTRSAD
  1944.     JNC    IBMOPNGD
  1945.     PRINT    <'*** IBM BAD EOD FOUND ***',CR,LF>
  1946.     BUMP    TRSERR
  1947. IBMOPNGD: DS    0
  1948.     MOV    A,H        ;SAVE IT.
  1949.     MOV    H,L
  1950.     MOV    L,A
  1951.     SHLD    TDSEOD
  1952.  
  1953. ;        DATA TRK/SCT = BOE
  1954.     POP    HL
  1955.     XCHG
  1956.     MVC    <>,TDSBOE,2
  1957.  
  1958. ;        RETURN TO CALLER.
  1959. IBMOPNEN: DS    0
  1960.     RESTORE            ;RESTORE REGS.
  1961.     LDA    TRSERR        ;IF ERROR, CY:ON.
  1962.     ORA    A
  1963.     RZ
  1964.     STC
  1965.     RET
  1966.  
  1967.  
  1968.  
  1969. $+PRINT
  1970. $+PRINT
  1971. ;        * *  INPUT DISK DRIVE NUMBER  * *
  1972. ;PURPOSE    THIS ROUTINE INPUTS A DISK DRIVE NUMBER
  1973. ;        AND VERIFIES IT.
  1974. ;INPUT        NONE
  1975. ;OUTPUT        A = DRIVE NO (0-3)
  1976. ;
  1977. ;
  1978. ;        DO INITIALIZATION.
  1979. INPDSKNO: DS    0
  1980.     SAVE    BC,DE,HL
  1981. ;
  1982. ;        REQUEST DRIVE NO.
  1983. INPDSKL: DS    0
  1984.     INPUT    'ENTER DISK DRIVE (A-D): ',TBUFF
  1985.     PRINT    <CR,LF>
  1986. ;
  1987. ;        VERIFY INPUT.
  1988.     LDA    TBUFF+1        ;IF INPUT LEN <>1 THEN ERR.
  1989.     CPI    1
  1990.     JNZ    INPDSKER
  1991.     LDA    TBUFF+2        ;VERIFY A-D.
  1992.     CPI    'A'
  1993.     JC    INPDSKER
  1994.     CPI    'D'+1
  1995.     JNC    INPDSKER
  1996. ;
  1997. ;        RETURN TO CALLER WITH ANSWER.
  1998.     SUI    'A'        ;MAKE RELATIVE TO ZERO.
  1999.     RESTORE HL,DE,BC
  2000.     RET
  2001. ;
  2002. ;        ERROR - RETRY.
  2003. INPDSKER: DS    0
  2004.     PRINT    <'***INVALID REPLY***',CR,LF>
  2005.     JMP    INPDSKL
  2006. ;
  2007. ;
  2008. ;
  2009. ;
  2010. $+PRINT
  2011. $+PRINT
  2012. ;        * *  INPUT DIRECTORY ENTRY  * *
  2013. ;PURPOSE
  2014. ;INPUT
  2015. ;OUTPUT
  2016. ;REMARKS
  2017. ;        1.  INSURE THAT THE FIELDS ARE ENTERED IN THE SAME
  2018. ;            SEQUENCE AS THE FIELDS ARE PRINTED IN 'PRTDIR'.
  2019. ;
  2020. ;
  2021. ;
  2022. ;        DO INITIALIZATION.
  2023. INPDIR:    DS    0
  2024.     SAVE            ;SAVE REGS.
  2025. ;
  2026. ;
  2027. ;        ENTER DATSET ID.
  2028.     LXI    HL,$        ;SET FOR ERROR.
  2029.     PUSH    HL
  2030.     INPUT    'ENTER DATASET ID: ',TBUFF
  2031.     PRINT
  2032.     LDA    TBUFF+1        ;VERIFY LEN (1-8).
  2033.     CPI    1
  2034.     JC    INPIDB
  2035.     CPI    8+1
  2036.     JNC    INPERR
  2037.     FILL    DSID,8,040H    ;MOVE SPACES TO FIELD.
  2038.     MOVAE    DSID,TBUFF+2,TBUFF+1
  2039. INPIDB:    POP    HL        ;RESET STACK FOR NEXT INP.
  2040. ;
  2041. ;
  2042. ;        ENTER LOGICAL RECORD LENGTH.
  2043.     LXI    HL,$        ;SET FOR ERROR.
  2044.     PUSH    HL
  2045.     INPUT    'ENTER LOGICAL RECORD LENGTH (NNNNN): ',TBUFF
  2046.     PRINT
  2047.     LDA    TBUFF+1        ;CHECK FOR PROPER LENGTH.
  2048.     ORA    A        ;...SKIP IF NO ENTRY.
  2049.     JZ    INPLRC
  2050.     CPI    5    
  2051.     JNZ    INPERR        ;...INVALID
  2052.     DECIN    TBUFF+2,5    ;CONVERT TO INTERNAL FORMAT.
  2053.     JC    INPERR        ;...INVALID
  2054.     MOV    A,E        ;GET VALUE.
  2055.     CPI    1        ;RANGE CHECK (1-128).
  2056.     JC    INPERR
  2057.     CPI    128+1
  2058.     JNC    INPERR
  2059.     MOVAE    DSBLK,TBUFF+2,5 ;MOVE IT TO DIR BUFFER.
  2060. INPLRC: POP    HL        ;RESET STACK FOR NEXT INPUT.
  2061. ;
  2062. ;
  2063. ;        ENTER BEGINNING OF EXTENT.
  2064.     LXI    HL,$        ;SET FOR ERROR.
  2065.     PUSH    HL
  2066.     PRINT    <'(BEGINNING OF EXTENT) '>
  2067.     CALL    INPTRSAD    ;GET TT0SS FOR BOE.
  2068.     JC    INPERR        ;...INVALID INPUT.
  2069.     LDA    TBUFF+1        ;CHECK IF INPUT GIVEN.
  2070.     ORA    A
  2071.     JZ    INPBOE
  2072.     MOVAE    DSBOE,TBUFF+2,5 ;MOVE IT IN PLACE.
  2073. INPBOE: POP    HL
  2074. ;
  2075. ;
  2076. ;        ENTER END OF EXTENT.
  2077.     LXI    HL,$        ;SET FOR ERROR.
  2078.     PUSH    HL
  2079.     PRINT    <'(END OF EXTENT) '>
  2080.     CALL    INPTRSAD    ;GET TT0SS FOR BOE.
  2081.     JC    INPERR        ;...INVALID INPUT.
  2082.     LDA    TBUFF+1        ;CHECK IF INPUT GIVEN.
  2083.     ORA    A
  2084.     JZ    INPEOE
  2085.     MOVAE    DSEOE,TBUFF+2,5 ;MOVE IT IN PLACE.
  2086. INPEOE: POP    HL
  2087. ;
  2088. ;
  2089. ;        ENTER END OF DATA.
  2090.     LXI    HL,$        ;SET FOR ERROR.
  2091.     PUSH    HL
  2092.     PRINT    <'(END OF DATA) '>
  2093.     CALL    INPTRSAD    ;GET TT0SS FOR BOE.
  2094.     JC    INPERR        ;...INVALID INPUT.
  2095.     LDA    TBUFF+1        ;CHECK IF INPUT GIVEN.
  2096.     ORA    A
  2097.     JZ    INPEOD
  2098.     MOVAE    DSEOD,TBUFF+2,5 ;MOVE IT IN PLACE.
  2099. INPEOD: POP    HL
  2100. ;
  2101. ;
  2102. ;        ENTER CREATION DATE.
  2103. ;
  2104. ;
  2105. ;        ENTER EXPIRATION DATE.
  2106. ;
  2107. ;
  2108. ;        ENTER MULTI-VOLUME IND.
  2109.     LXI    HL,$        ;SET FOR ERROR.
  2110.     PUSH    HL
  2111.     INPUT    'ENTER MULTI-VOLUME IND (C, L, OR BLANK): ',TBUFF
  2112.     PRINT
  2113.     LDA    TBUFF+1        ;VERIFY LEN (1-8).
  2114.     CPI    1
  2115.     JC    INPMVIB
  2116.     JNZ    INPERR
  2117.     LDA    TBUFF+2        ;GET CHAR INPUTTED.
  2118.     CPI    'C'        ;MUST BE C, L, OR BLANK.
  2119.     JZ    $+13
  2120.     CPI    'L'
  2121.     JZ    $+8
  2122.     CPI    ' '
  2123.     JNZ    INPERR
  2124.     CALL    TRNASEB        ;MAKE IT EBCDIC.
  2125.     STA    DSMVI        ;SAVE IT.
  2126. INPMVIB:    POP    HL        ;RESET STACK FOR NEXT INP.
  2127. ;
  2128. ;
  2129. ;        ENTER VOLUME SEQUENCE NUMBER.
  2130.     LXI    HL,$        ;SET FOR ERROR.
  2131.     PUSH    HL
  2132.     INPUT    'ENTER VOLUME SEQUENCE NUMBER (NN): ',TBUFF
  2133.     PRINT
  2134.     LDA    TBUFF+1        ;CHECK FOR PROPER LENGTH.
  2135.     ORA    A        ;...SKIP IF NO ENTRY.
  2136.     JZ    INPVLS
  2137.     CPI    2    
  2138.     JNZ    INPERR        ;...INVALID
  2139.     DECIN    TBUFF+2,2    ;CONVERT TO INTERNAL FORMAT.
  2140.     JC    INPERR        ;...INVALID
  2141.     MOV    A,E        ;GET VALUE.
  2142.     CPI    1        ;RANGE CHECK (1-99).
  2143.     JC    INPERR
  2144.     CPI    99+1
  2145.     JNC    INPERR
  2146.     MOVAE    DSVLSQ,TBUFF+2,2 ;MOVE IT TO DIR BUFFER.
  2147. INPVLS: POP    HL        ;RESET STACK FOR NEXT INPUT.
  2148. ;
  2149. ;
  2150. ;        ENTER BYPASS IND.
  2151.     LXI    HL,$        ;SET FOR ERROR.
  2152.     PUSH    HL
  2153.     INPUT    'ENTER BYPASS IND (B OR BLANK): ',TBUFF
  2154.     PRINT
  2155.     LDA    TBUFF+1        ;VERIFY LEN (1-8).
  2156.     CPI    1
  2157.     JC    INPBYPIB
  2158.     JNZ    INPERR
  2159.     LDA    TBUFF+2
  2160.     CPI    'B'
  2161.     JZ    $+8
  2162.     CPI    ' '
  2163.     JNZ    INPERR
  2164.     CALL    TRNASEB        ;MAKE IT EBCDIC.
  2165.     STA    DSBYPI        ;SAVE IT.
  2166. INPBYPIB:    POP    HL        ;RESET STACK FOR NEXT INP.
  2167. ;
  2168. ;
  2169. ;        ENTER SECURITY IND.
  2170.     LXI    HL,$        ;SET FOR ERROR.
  2171.     PUSH    HL
  2172.     INPUT    'ENTER SECURITY IND (NON-BLANK OR BLANK): ',TBUFF
  2173.     PRINT
  2174.     LDA    TBUFF+1        ;VERIFY LEN (1-8).
  2175.     CPI    1
  2176.     JC    INPSSP
  2177.     JNZ    INPERR
  2178.     LDA    TBUFF+2
  2179.     CALL    TRNASEB        ;MAKE IT EBCDIC.
  2180.     STA    DSSS        ;SAVE IT.
  2181. INPSSP:    POP    HL        ;RESET STACK FOR NEXT INP.
  2182. ;
  2183. ;
  2184. ;        ENTER WRITE PROTECT IND.
  2185.     LXI    HL,$        ;SET FOR ERROR.
  2186.     PUSH    HL
  2187.     INPUT    'ENTER WRITE PROTECT IND (P OR BLANK): ',TBUFF
  2188.     PRINT
  2189.     LDA    TBUFF+1        ;VERIFY LEN (1-8).
  2190.     CPI    1
  2191.     JC    INPWPB
  2192.     JNZ    INPERR
  2193.     LDA    TBUFF+2
  2194.     CPI    'P'
  2195.     JZ    $+8
  2196.     CPI    ' '
  2197.     JNZ    INPERR
  2198.     CALL    TRNASEB        ;MAKE IT EBCDIC.
  2199.     STA    DSWP        ;SAVE IT.
  2200. INPWPB:    POP    HL        ;RESET STACK FOR NEXT INP.
  2201. ;
  2202. ;
  2203. ;        ENTER VERIFY/COPY IND.
  2204.     LXI    HL,$        ;SET FOR ERROR.
  2205.     PUSH    HL
  2206.     INPUT    'ENTER VERIFY/COPY IND (C, V, OR BLANK): ',TBUFF
  2207.     PRINT
  2208.     LDA    TBUFF+1        ;VERIFY LEN (1-8).
  2209.     CPI    1
  2210.     JC    INPVCIB
  2211.     JNZ    INPERR
  2212.     LDA    TBUFF+2
  2213.     CPI    'C'
  2214.     JZ    $+13
  2215.     CPI    'V'
  2216.     JZ    $+8
  2217.     CPI    ' '
  2218.     JNZ    INPERR
  2219.     CALL    TRNASEB        ;MAKE IT EBCDIC.
  2220.     STA    DSVCI        ;SAVE IT.
  2221. INPVCIB:    POP    HL        ;RESET STACK FOR NEXT INP.
  2222. ;
  2223. ;
  2224. ;        RETURN TO CALLER.
  2225.     RESTORE
  2226.     RET
  2227. ;
  2228. ;
  2229. ;        ISSUE ERROR MESSAGE.
  2230. INPERR:    DS    0
  2231.     PRINT    <'***INVALID REPLY***',CR,LF>
  2232.     RET
  2233. ;
  2234. ;
  2235. ;
  2236. ;
  2237. $+PRINT
  2238. $+PRINT
  2239. ;        * *  INPUT SECTOR NUMBER  * *
  2240. ;PURPOSE    THIS ROUTINE INPUTS A SECTOR NUMBER
  2241. ;        AND VERIFIES IT.
  2242. ;INPUT        NONE
  2243. ;OUTPUT
  2244. ;        A = SECTOR NUMBER (8-26)
  2245. ;
  2246. ;
  2247. ;        DO INITIALIZATION.
  2248. INPSCTNO: DS    0
  2249.     SAVE    BC,DE,HL
  2250. ;
  2251. ;        REQUEST SECTOR NO.
  2252. INPSCTL: DS    0
  2253.     INPUT    'ENTER SECTOR NUMBER (8-26): ',TBUFF
  2254.     PRINT
  2255. ;
  2256. ;        VERIFY INPUT.
  2257.     LDA    TBUFF+1        ;IF INPUT LEN <1 THEN ERR.
  2258.     CPI    1
  2259.     JC    INPSCTER
  2260.     CPI    2+1        ;IF INPUT LEN > 2, THEN ERR.
  2261.     JNC    INPSCTER
  2262.     DECIN    TBUFF+2,TBUFF+1
  2263.     JC    INPSCTER    ;...CONVERSION ERROR.
  2264.     MOV    A,E
  2265.     CPI    8        ;IF <8 THEN
  2266.     JC    INPSCTER    ;   ERROR.
  2267.     CPI    26+1        ;IF >26 THEN
  2268.     JNC    INPSCTER    ;...ERROR.
  2269. ;
  2270. ;        RETURN TO CALLER WITH ANSWER.
  2271.     RESTORE HL,DE,BC
  2272.     RET
  2273. ;
  2274. ;        ERROR - RETRY.
  2275. INPSCTER: DS    0
  2276.     PRINT    <'***INVALID REPLY***',CR,LF>
  2277.     JMP    INPSCTL
  2278. ;
  2279. ;
  2280. ;
  2281. ;
  2282. $+PRINT
  2283. $+PRINT
  2284. ;        * *  INPUT TRACK/SECTOR NUMBER  * *
  2285. ;PURPOSE
  2286. ;INPUT
  2287. ;OUTPUT
  2288. ;        H = TRACK NUMBER
  2289. ;        L = SECTOR NUMBER
  2290. ;REMARKS
  2291. ;
  2292. ;
  2293. ;
  2294. ;        DO INITIALIZATION.
  2295. INPTRSAD: DS    0
  2296. ;
  2297. ;
  2298. ;        GET THE DATA TRACK/SECTOR.
  2299. INPTRSL: DS    0
  2300.     INPUT    'ENTER TRACK/SECTOR (TT0SS): ',TBUFF
  2301.     PRINT
  2302. ;
  2303. ;
  2304. ;        VERIFY AND CONVERT INPUT.
  2305.     LDA    TBUFF+1        ;IF INPUT LENGTH <> 5, THEN ERROR.
  2306.     ORA    A        ;CHECK FOR INPUT GIVEN OR NOT.
  2307.     JZ    INPTRSOK    ;...NO.
  2308.     CPI    5
  2309.     JNZ    INPTRSER
  2310. ;
  2311.     LXI    HL,TBUFF+2    ;VERIFY CONTENTS.
  2312.     CALL    VERTRSAD
  2313.     JC    INPTRSER    ;...INVALID.
  2314. ;
  2315. ;
  2316. ;        RETURN TO CALLER.
  2317. INPTRSOK: DS    0
  2318.     ORA    A        ;RESET CARRY.
  2319.     RET
  2320. ;
  2321. ;
  2322. ;        HANDLE INPUT ERROR.
  2323. INPTRSER: DS    0
  2324.     STC            ;SET CARRY.
  2325.     RET
  2326. ;
  2327. ;
  2328. ;
  2329. $+PRINT
  2330. $+PRINT
  2331. ;        * *  OUTPUT DATA TRACK/SECTOR  * *
  2332. ;PURPOSE
  2333. ;INPUT
  2334. ;        D = TRACK NUMBER
  2335. ;        E = SECTOR NUMBER
  2336. ;        HL <= 5 BYTE TRACK/SECTOR (TT0SS)
  2337. ;OUTPUT
  2338. ;        SAME AS INPUT   
  2339. ;REMARKS
  2340. ;
  2341. ;
  2342. ;        DO INITIALIZATION.
  2343. OUTTRSAD: DS    0
  2344.     SAVE            ;SAVE REGS.
  2345. ;
  2346. ;
  2347. ;        OUTPUT THE TRACK.
  2348.     MOV    A,D        ;SET FOR CALL.        .
  2349.     CALL    OUTTRSSB    ;DO IT.
  2350. ;
  2351. ;
  2352. ;        OUTPUT THE '0'.
  2353.     MVI    M,'0'
  2354.     INX    HL
  2355. ;
  2356. ;
  2357. ;        OUTPUT THE SECTOR.
  2358.     MOV    A,E        ;SET FOR CALL
  2359.     CALL    OUTTRSSB    ;DO IT.
  2360. ;
  2361. ;
  2362. ;        RETURN TO CALLER.
  2363.     RESTORE            ;RESTORE REGS.
  2364.     RET
  2365. ;
  2366. ;
  2367. ;        OUTPUT A TRACK/SECTOR ADDRESS.
  2368. OUTTRSSB: DS    0
  2369.     PUSH    DE        ;SAVE TRK/SCT.
  2370.     PUSH    HL        ;SAVE OUTPUT PTR.
  2371.     BAU8    TWRKC3        ;CONVERT TO ASCII.
  2372.     POP    HL        ;RESTORE OUTPUT PTR.
  2373.     XCHG            ;DE <= OUTPUT
  2374.     MVC    <>,TWRKC3+1,2    ;GET TRK/SCT.
  2375.     XCHG
  2376.     POP    DE        ;RESTORE TRK/SCT.
  2377.     RET
  2378. ;
  2379. ;
  2380. ;
  2381. ;
  2382. $+PRINT
  2383. $+PRINT
  2384. ;        * *  VERIFY DATA TRACK/SECTOR  * *
  2385. ;PURPOSE
  2386. ;INPUT
  2387. ;        HL <= 5 BYTE TRACK/SECTOR (TT0SS)
  2388. ;OUTPUT
  2389. ;        H = TRACK NUMBER
  2390. ;        L = SECTOR NUMBER
  2391. ;REMARKS
  2392. ;
  2393. ;
  2394. ;        DO INITIALIZATION.
  2395. VERTRSAD: DS    0
  2396. ;
  2397. ;
  2398. ;        VERIFY THE TRACK.
  2399.     DECIN    ,2        ;CONVERT IT TO DECIMAL.
  2400.     JC    VERTRSER    ;...INVALID.
  2401.     CPI    1        ;RANGE CHECK (1-74)
  2402.     JC    VERTRSER
  2403.     CPI    74+1
  2404.     CMC
  2405.     JC    VERTRSER
  2406.     STA    VERTRSTK    ;SAVE IT.
  2407. ;
  2408. ;
  2409. ;        VERIFY THE SECTOR NUMBER.
  2410.     DECIN    ,3        ;CONVERT IT TO DECIMAL.
  2411.     JC    VERTRSER    ;...INVALID.
  2412.     CPI    1        ;RANGE CHECK (1-26).
  2413.     JC    VERTRSER
  2414.     CPI    26+1
  2415.     CMC
  2416.     JC    VERTRSER
  2417. ;
  2418. ;
  2419. ;        RETURN TO CALLER.
  2420.     LDA    VERTRSTK    ;PUT TRACK NUMBER IN H.
  2421.     MOV    D,A
  2422.     XCHG            ;HL = TRK/SCT
  2423.     ORA    A        ;RESET CARRY.
  2424.     RET
  2425. ;
  2426. ;
  2427. ;        HANDLE ERROR.
  2428. VERTRSER: DS    0
  2429.     RET
  2430. ;
  2431. ;
  2432. ;        CONSTANTS AND VARIABLES.
  2433. VERTRSTK: DS    1        ;TRACK NUMBER SAVE AREA
  2434. ;
  2435. ;
  2436. ;
  2437. $+PRINT
  2438. $+PRINT
  2439. ;        * *  VERIFY IBM DISK  * *
  2440. ;PURPOSE
  2441. ;INPUT
  2442. ;OUTPUT
  2443. ;REMARKS
  2444. ;
  2445. ;
  2446. ;
  2447. ;        DO INITIALIZATION.
  2448. VERIBMD: DS    0
  2449.     SAVE        ;SAVE REGS.
  2450. ;
  2451. ;
  2452. ;        READ THE VOLSER SECTOR.
  2453.     MVI    A,7        ;READ SECTOR 7.
  2454.     CALL    REDDIR
  2455. ;
  2456. ;
  2457. ;        VERIFY 'VOL1' ID.
  2458.     MOVEA    TBUFF,DSHD,4    ;VERIFY VOL1 CONSTANT.
  2459.     CLC    TBUFF,CVOL1,4
  2460.     JZ    VERIBMDE    ;...OK.
  2461.     PRINT    <'*** DISK VOLUME SERIAL NUMBER NOT FOUND ***',CR,LF>
  2462.     STC            ;...ERROR.
  2463. ;
  2464. ;
  2465. ;        RETURN TO CALLER.
  2466. VERIBMDE: DS    0
  2467.     RESTORE
  2468.     RET
  2469. ;
  2470. ;
  2471. ;
  2472. ;
  2473. $+PRINT
  2474. $+PRINT
  2475. ;        * *  VERIFY SECTOR NUMBER  * *
  2476. ;PURPOSE
  2477. ;INPUT
  2478. ;OUTPUT
  2479. ;REMARKS
  2480. ;
  2481. ;
  2482. ;
  2483. ;        DO INITIALIZATION.
  2484. VERPTR: DS    0
  2485. ;
  2486. ;
  2487. ;        RIGHT JUSTIFY INPUT.
  2488.     FILL    PTRIN,5,'0'    ;DEFAULT TO ALL ZEROES.
  2489.     LDA    TBUFF+1        ;GET INPUT LENGTH.
  2490.     CPI    1        ;VERFIY LENGTH IS 1-5.
  2491.     JC    PTRNONE
  2492.     CPI    5+1
  2493.     CMC
  2494.     RC
  2495.     MOV    C,A        ;SAVE IT.
  2496.     LXI    DE,PTRIN+4    ;MOVE DESCENDING.
  2497.     LXI    HL,TBUFF+2
  2498.     ADDHA
  2499.     DCX    HL
  2500.     MOV    A,M        ;DO THE MOVE.
  2501.     STAX    DE
  2502.     DCX    HL
  2503.     DCX    DE
  2504.     DCR    C
  2505.     JNZ    $-5
  2506. ;
  2507. ;
  2508. ;        VERIFY THE TRACK.
  2509.     DECIN    PTRIN,2
  2510.     RC            ;...ERROR.
  2511.     MOV    A,E
  2512.     CPI    76+1
  2513.     CMC
  2514.     RC            ;...ERROR.
  2515. ;
  2516. ;
  2517. ;        VERIFY '0'.
  2518.     LDA    PTRIN+2
  2519.     CPI    '0'
  2520.     STC
  2521.     RNZ
  2522. ;
  2523. ;
  2524. ;        VERIFY SECTOR AND RETURN.
  2525.     DECIN    PTRIN+3,2
  2526.     RC            ;...ERROR.
  2527.     MOV    A,E
  2528.     CPI    1        ;RANGE CHECK 1-26.
  2529.     RC
  2530.     CPI    26+1
  2531.     CMC
  2532.     RET
  2533. ;
  2534. ;
  2535. ;        RETURN W/O VERIFY.
  2536. PTRNONE: DS    0
  2537.     MVI    A,1        ;RESET CY BUT KEEP NZ.
  2538.     ORA    A
  2539.     RET
  2540. ;
  2541. ;
  2542. ;        AREAS USED
  2543. PTRIN:    DS    5        ;TRK/SCT PTR
  2544. ;
  2545. ;
  2546. ;
  2547. ;
  2548. $+PRINT
  2549. $+PRINT
  2550. ;        * *  PRINT DIRECTORY ENTRY  * *
  2551. ;PURPOSE
  2552. ;INPUT
  2553. ;OUTPUT
  2554. ;REMARKS
  2555. ;
  2556. ;
  2557. ;
  2558. ;        DO INITIALIZATION.
  2559. PRTDIR:    DS    0
  2560.     SAVE            ;SAVE REGS.
  2561. ;
  2562. ;
  2563. ;        PRINT FIELDS.
  2564.     PRNTEAF    'DATASET NAME = ',DSID,8
  2565.     LDA    DSHD
  2566.     CPI    0C4H
  2567.     JNZ    PRTDIR00
  2568.     PRINT    <'    * * * DELETED * * *',CR,LF>
  2569. PRTDIR00:
  2570.     PRNTEAF    'LRECL = ',DSBLK,5
  2571.     PRNTEAF    'BOE = ',DSBOE,5
  2572.     PRNTEAF    'EOE = ',DSEOE,5
  2573.     PRNTEAF    'EOD = ',DSEOD,5
  2574.     PRNTEAF    'CREDT = ',DSCREDT,6
  2575.     PRNTEAF    'EXPDT = ',DSEXPDT,6
  2576.     PRNTEAF    'MULTI-VOLUME IND = ',DSMVI,1
  2577.     PRNTEAF    'VOL SEQ IND = ',DSVLSQ,2
  2578.     PRNTEAF    'BYPASS IND = ',DSBYPI,1
  2579.     PRNTEAF 'SECURE IND = ',DSSS,1
  2580.     PRNTEAF    'WRITE PROTECT IND = ',DSWP,1
  2581.     PRNTEAF    'VERIFY/COPY IND = ',DSVCI,1
  2582. ;
  2583. ;
  2584. ;        RETURN TO CALLER.
  2585.     RESTORE            ;RESTORE REGS.
  2586.     RET
  2587. ;
  2588. ;
  2589. ;
  2590. ;
  2591. $+PRINT
  2592. $+PRINT
  2593. ;        * *  DEFAULT DIR BUF DATA  * *
  2594. ;PURPOSE
  2595. ;INPUT
  2596. ;OUTPUT
  2597. ;REMARKS
  2598. ;
  2599. ;
  2600. ;
  2601. ;        DO INITIALIZATION.
  2602. DFTDIR:    DS    0
  2603.     STA    DIRSCT
  2604. ;
  2605. ;
  2606. ;        INITIALIZE BUFFER.
  2607.     FILL    DIRBUF,80,040H        ;EBCDIC SPACES
  2608.     FILL    DIRBUF+80,48,000H
  2609.     MOVAE    DSHD,CHDR1,4        ;DDR1
  2610.     MOVAE    DSID,CDSIDD,4        ;DATA
  2611.     LXI    HL,CSCTNO        ;SECTOR NUMBER
  2612.     LDA    DIRSCT
  2613.     SUI    8
  2614.     ADD    A
  2615.     ADDHA
  2616.     MOVAE    DSID+4,,2
  2617.     MOVAE    DSBLK,CLRL80,5        ;00080
  2618.     MOVAE    DSBOE,CSPRTRK,5        ;74001
  2619.     MOVAE    DSEOE,CHGHTRK,5        ;73026
  2620.     MOVAE    DSEOD,CSPRTRK,5        ;74001
  2621. ;
  2622. ;
  2623. ;        SET BOE,EOE,EOD FOR SECTOR 8.
  2624.     LDA    DIRSCT
  2625.     CPI    8
  2626.     JNZ    DFTDIR00
  2627.     MVI    A,'H'            ;HDR1
  2628.     CALL    TRNASEB
  2629.     STA    DSHD
  2630.     MOVAE    DSBOE,CLOWTRK,5        ;01001
  2631.     MOVAE    DSEOD,CLOWTRK,5        ;01001
  2632. DFTDIR00:
  2633. ;
  2634. ;
  2635. ;        RETURN TO CALLER.
  2636.     RET
  2637. ;
  2638. ;
  2639. ;
  2640. ;
  2641. $+PRINT
  2642. $+PRINT
  2643. ;        * *  READ A DIRECTORY SECTOR  * *
  2644. ;PURPOSE
  2645. ;INPUT
  2646. ;        A = SECTOR NUMBER
  2647. ;OUTPUT
  2648. ;
  2649. ;
  2650. ;
  2651. ;        DO INITIALIZATION.
  2652. REDDIR:    DS    0
  2653.     STA    DIRSCT        ;SAVE SECTOR NUMBER.
  2654.     XRA    A        ;SET TRKNO = 0.
  2655.     STA    DIRTRK
  2656. ;
  2657. ;
  2658. ;        READ THE SECTOR USING BIOS.
  2659.     SELDSK    DIRDSK        ;SELECT THE DISK.
  2660.     IF    NBIOS
  2661.     LDA    DIRDSK        ;SELECT IT PHYSICALLY.
  2662.     MOV    C,A
  2663.     CALL    BIOSSEL
  2664.     LDA    DIRTRK        ;SET THE TRACK.
  2665.     MOV    C,A
  2666.     CALL    BIOSSEK
  2667.     LDA    DIRSCT        ;READ THE SECTOR
  2668.     MOV    C,A
  2669.     LXI    H,DIRBUF    ;INTO DIRBUF.
  2670.     CALL    BIOSRED
  2671.     ENDIF
  2672.     IF DMA$BIOS
  2673.     SETTRK    DIRTRK        ;SET THE TRACK NO.
  2674.     SETSEC    DIRSCT        ;SET THE SECTOR NO.
  2675.     RC            ;...INVALID SECTOR.
  2676.     LXI    BC,DIRBUF    ;SET DMA TO DIRBUF.
  2677.     CALLBIOS DSETDMA
  2678.     CALLBIOS DREAD        ;READ THE SECTOR.
  2679.     ENDIF
  2680.     IF (NOT NBIOS) AND (NOT DMA$BIOS)
  2681.     SETTRK    DIRTRK        ;SET THE TRACK NO.
  2682.     SETSEC    DIRSCT        ;SET THE SECTOR NO.
  2683.     RC            ;...INVALID SECTOR.
  2684.     LXI    BC,DIRBUF    ;SET DMA TO DIRBUF.
  2685.     CALLBIOS DSETDMA
  2686.     CALLBIOS DREAD        ;READ THE SECTOR.
  2687.     ENDIF
  2688.  
  2689. ;
  2690. ;
  2691. ;        RETURN TO CALLER.
  2692.     RET
  2693. ;
  2694. ;
  2695. ;
  2696. ;
  2697. $+PRINT
  2698. $+PRINT
  2699. ;        * *  WRITE A DIRECTORY SECTOR  * *
  2700. ;PURPOSE
  2701. ;INPUT
  2702. ;        A = SECTOR NUMBER
  2703. ;OUTPUT
  2704. ;
  2705. ;
  2706. ;
  2707. ;        DO INITIALIZATION.
  2708. WRTDIR:    DS    0
  2709.     STA    DIRSCT        ;SAVE SECTOR NUMBER.
  2710.     XRA    A        ;SET TRKNO = 0.
  2711.     STA    DIRTRK
  2712. ;
  2713. ;
  2714. ;        READ THE SECTOR USING BIOS.
  2715.     SELDSK    DIRDSK        ;SELECT THE DISK.
  2716.     IF    NBIOS
  2717.     LDA    DIRDSK        ;SELECT IT PHYSICALLY.
  2718.     MOV    C,A
  2719.     CALL    BIOSSEL
  2720.     LDA    DIRTRK        ;SET THE TRACK.
  2721.     MOV    C,A
  2722.     CALL    BIOSSEK
  2723.     LDA    DIRSCT        ;WRITE THE SECTOR
  2724.     MOV    C,A
  2725.     LXI    H,DIRBUF    ;FROM DIRBUF.
  2726.     CALL    BIOSWRT
  2727.     ENDIF
  2728.     IF DMA$BIOS
  2729.     SETTRK    DIRTRK        ;SET THE TRACK NO.
  2730.     SETSEC    DIRSCT        ;SET THE SECTOR NO.
  2731.     RC            ;...INVALID SECTOR.
  2732.     LXI    BC,DIRBUF    ;SET DMA TO DIRBUF.
  2733.     CALLBIOS DSETDMA
  2734.     CALLBIOS DWRITE        ;READ THE SECTOR.
  2735.     ENDIF
  2736.     IF (NOT NBIOS) AND (NOT DMA$BIOS)
  2737.     SETTRK    DIRTRK        ;SET THE TRACK NO.
  2738.     SETSEC    DIRSCT        ;SET THE SECTOR NO.
  2739.     RC            ;...INVALID SECTOR.
  2740.     LXI    BC,DIRBUF    ;SET DMA TO DIRBUF.
  2741.     CALLBIOS DSETDMA
  2742.     CALLBIOS DWRITE        ;READ THE SECTOR.
  2743.     ENDIF
  2744. ;
  2745. ;
  2746. ;        RETURN TO CALLER.
  2747.     RET
  2748. ;
  2749. ;
  2750. ;
  2751. ;
  2752. $+PRINT
  2753. $+PRINT
  2754. ;        * *  READ A DATA 1 SECTOR  * *
  2755. ;PURPOSE
  2756. ;INPUT
  2757. ;        A = SECTOR NUMBER
  2758. ;OUTPUT
  2759. ;
  2760. ;
  2761. ;
  2762. ;        DO INITIALIZATION.
  2763. REDDAT1:    DS    0
  2764. ;
  2765. ;
  2766. ;        READ THE SECTOR USING BIOS.
  2767.     SELDSK    DATDSK1        ;SELECT THE DISK.
  2768.     IF    NBIOS
  2769.     LDA    DATDSK1        ;SELECT IT PHYSICALLY.
  2770.     MOV    C,A
  2771.     CALL    BIOSSEL
  2772.     LDA    DATTRK1        ;SET THE TRACK.
  2773.     MOV    C,A
  2774.     CALL    BIOSSEK
  2775.     LDA    DATSCT1        ;READ THE SECTOR
  2776.     MOV    C,A
  2777.     LXI    H,DATBUF1    ;INTO DATBUF1.
  2778.     CALL    BIOSRED
  2779.     ENDIF
  2780.     IF DMA$BIOS
  2781.     SETTRK    DATTRK1        ;SET THE TRACK NO.
  2782.     SETSEC    DATSCT1        ;SET THE SECTOR NO.
  2783.     RC            ;...INVALID SECTOR.
  2784.     LXI    BC,DATBUF1    ;SET DMA TO DIRBUF.
  2785.     CALLBIOS DSETDMA
  2786.     CALLBIOS DREAD        ;READ THE SECTOR.
  2787.     ENDIF
  2788.     IF (NOT NBIOS) AND (NOT DMA$BIOS)
  2789.     SETTRK    DATTRK1        ;SET THE TRACK NO.
  2790.     SETSEC    DATSCT1        ;SET THE SECTOR NO.
  2791.     RC            ;...INVALID SECTOR.
  2792.     LXI    BC,DATBUF1    ;SET DMA TO DIRBUF.
  2793.     CALLBIOS DSETDMA
  2794.     CALLBIOS DREAD        ;READ THE SECTOR.
  2795.     ENDIF
  2796. ;
  2797. ;
  2798. ;        RETURN TO CALLER.
  2799.     RET
  2800. ;
  2801. ;
  2802. ;
  2803. ;
  2804. $+PRINT
  2805. $+PRINT
  2806. ;        * *  WRITE A DATA 1 SECTOR  * *
  2807. ;PURPOSE
  2808. ;INPUT
  2809. ;        A = SECTOR NUMBER
  2810. ;OUTPUT
  2811. ;
  2812. ;
  2813. ;
  2814. ;        DO INITIALIZATION.
  2815. WRTDAT1:    DS    0
  2816. ;
  2817. ;
  2818. ;        READ THE SECTOR USING BIOS.
  2819.     SELDSK    DATDSK1        ;SELECT THE DISK.
  2820.     IF    NBIOS
  2821.     LDA    DATDSK1        ;SELECT IT PHYSICALLY.
  2822.     MOV    C,A
  2823.     CALL    BIOSSEL
  2824.     LDA    DATTRK1        ;SET THE TRACK.
  2825.     MOV    C,A
  2826.     CALL    BIOSSEK
  2827.     LDA    DATSCT1        ;WRITE THE SECTOR
  2828.     MOV    C,A
  2829.     LXI    H,DATBUF1    ;FROM DATBUF1.
  2830.     CALL    BIOSWRT
  2831.     ENDIF
  2832.     IF DMA$BIOS
  2833.     SETTRK    DATTRK1        ;SET THE TRACK NO.
  2834.     SETSEC    DATSCT1        ;SET THE SECTOR NO.
  2835.     RC            ;...INVALID SECTOR.
  2836.     LXI    BC,DATBUF1    ;SET DMA TO DIRBUF.
  2837.     CALLBIOS DSETDMA
  2838.     CALLBIOS DWRITE        ;WRITE THE SECTOR.
  2839.     ENDIF
  2840.     IF (NOT NBIOS) AND (NOT DMA$BIOS)
  2841.     SETTRK    DATTRK1        ;SET THE TRACK NO.
  2842.     SETSEC    DATSCT1        ;SET THE SECTOR NO.
  2843.     RC            ;...INVALID SECTOR.
  2844.     LXI    BC,DATBUF1    ;SET DMA TO DIRBUF.
  2845.     CALLBIOS DSETDMA
  2846.     CALLBIOS DWRITE        ;WRITE THE SECTOR.
  2847.     ENDIF
  2848. ;
  2849. ;
  2850. ;        RETURN TO CALLER.
  2851.     RET
  2852. ;
  2853. ;
  2854. ;
  2855. ;
  2856. $+PRINT
  2857. $+PRINT
  2858. ;        * *  READ A DATA 2 SECTOR  * *
  2859. ;PURPOSE
  2860. ;INPUT
  2861. ;        A = SECTOR NUMBER
  2862. ;OUTPUT
  2863. ;
  2864. ;
  2865. ;
  2866. ;        DO INITIALIZATION.
  2867. REDDAT2:    DS    0
  2868. ;
  2869. ;
  2870. ;        READ THE SECTOR USING BIOS.
  2871.     SELDSK    DATDSK2        ;SELECT THE DISK.
  2872.     IF    NBIOS
  2873.     LDA    DATDSK2        ;SELECT IT PHYSICALLY.
  2874.     MOV    C,A
  2875.     CALL    BIOSSEL
  2876.     LDA    DATTRK2        ;SET THE TRACK.
  2877.     MOV    C,A
  2878.     CALL    BIOSSEK
  2879.     LDA    DATSCT2        ;READ THE SECTOR
  2880.     MOV    C,A
  2881.     LXI    H,DATBUF2    ;INTO DATBUF2.
  2882.     ENDIF
  2883.     IF DMA$BIOS
  2884.     SETTRK    DATTRK2        ;SET THE TRACK NO.
  2885.     SETSEC    DATSCT2        ;SET THE SECTOR NO.
  2886.     RC            ;...INVALID SECTOR.
  2887.     LXI    BC,DATBUF2    ;SET DMA TO DIRBUF.
  2888.     CALLBIOS DSETDMA
  2889.     CALLBIOS DREAD         ;READ THE SECTOR.
  2890.     ENDIF
  2891.     IF (NOT NBIOS) AND (NOT DMA$BIOS)
  2892.     SETTRK    DATTRK2        ;SET THE TRACK NO.
  2893.     SETSEC    DATSCT2        ;SET THE SECTOR NO.
  2894.     RC            ;...INVALID SECTOR.
  2895.     LXI    BC,DATBUF2    ;SET DMA TO DIRBUF.
  2896.     CALLBIOS DSETDMA
  2897.     CALLBIOS DREAD         ;READ THE SECTOR.
  2898.     ENDIF
  2899. ;
  2900. ;
  2901. ;        RETURN TO CALLER.
  2902.     RET
  2903. ;
  2904. ;
  2905. ;
  2906. ;
  2907. $+PRINT
  2908. $+PRINT
  2909. ;        * *  WRITE A DATA 2 SECTOR  * *
  2910. ;PURPOSE
  2911. ;INPUT
  2912. ;        A = SECTOR NUMBER
  2913. ;OUTPUT
  2914. ;
  2915. ;
  2916. ;
  2917. ;        DO INITIALIZATION.
  2918. WRTDAT2:    DS    0
  2919. ;
  2920. ;
  2921. ;        READ THE SECTOR USING BIOS.
  2922.     SELDSK    DATDSK2        ;SELECT THE DISK.
  2923.     IF    NBIOS
  2924.     LDA    DATDSK2        ;SELECT IT PHYSICALLY.
  2925.     MOV    C,A
  2926.     CALL    BIOSSEL
  2927.     LDA    DATTRK2        ;SET THE TRACK.
  2928.     MOV    C,A
  2929.     CALL    BIOSSEK
  2930.     LDA    DATSCT2        ;WRITE THE SECTOR
  2931.     MOV    C,A
  2932.     LXI    H,DATBUF2    ;FROM DATBUF2.
  2933.     CALL    BIOSWRT
  2934.     ENDIF
  2935.     IF DMA$BIOS
  2936.     SETTRK    DATTRK2        ;SET THE TRACK NO.
  2937.     SETSEC    DATSCT2        ;SET THE SECTOR NO.
  2938.     RC            ;...INVALID SECTOR.
  2939.     LXI    BC,DATBUF2    ;SET DMA TO DIRBUF.
  2940.     CALLBIOS DSETDMA
  2941.     CALLBIOS DWRITE        ;WRITE THE SECTOR.
  2942.     ENDIF
  2943.     IF (NOT NBIOS) AND (NOT DMA$BIOS)
  2944.     SETTRK    DATTRK2        ;SET THE TRACK NO.
  2945.     SETSEC    DATSCT2        ;SET THE SECTOR NO.
  2946.     RC            ;...INVALID SECTOR.
  2947.     LXI    BC,DATBUF2    ;SET DMA TO DIRBUF.
  2948.     CALLBIOS DSETDMA
  2949.     CALLBIOS DWRITE        ;WRITE THE SECTOR.
  2950.     ENDIF
  2951. ;
  2952. ;
  2953. ;        RETURN TO CALLER.
  2954.     RET
  2955. ;
  2956. ;
  2957. ;
  2958. ;
  2959. ;        * * *  PROGRAM CONSTANTS AND AREAS  * * *
  2960. ;
  2961. ;        * *  GENERAL  * *
  2962. ;
  2963. $+PRINT
  2964. ;        *  MAIN FUNCTION TABLE  *
  2965. FNCTBL:    DS    0
  2966.     DW    RTNCPM        ;00 - RETURN TO CPM
  2967.     DW    INITDISK    ;01 - INITIALIZE A DISKETTE
  2968.     DW    CHGVOL        ;02 - CHANGE A VOLUME SERIAL NUMBER
  2969.     DW    CHGDIR        ;03 - CHANGE A DATASET ENTRY
  2970.     DW    DELDIR        ;04 - DELETE A DATASET
  2971.     DW    DSPLDIR        ;05 - DISPLAY A DATASET ENTRY
  2972.     DW    LISTDIR        ;06 - LIST THE DIRECTORY
  2973.     DW    TRSCIBLK    ;07 - TRANSFER CP/M TO 3740 (BLOCKED)
  2974.     DW    TRSICBLK    ;08 - TRANSFER 3740 TO CP/M (BLOCKED)
  2975.     DW    TRSCISRC    ;09 - TRANSFER CP/M TO 3740 (SOURCE)
  2976.     DW    TRSICSRC    ;10 - TRANSFER 3740 TO CP/M (SOURCE)
  2977.     DW    DSPIBMDS    ;11 - DISPLAY AN IBM DATASET
  2978. ;
  2979. ;        *  CONSTANTS  *
  2980. CVOL1:    DB    'VOL1'        ;VOLUME SECTOR ID
  2981. CHDR1:    DB    'DDR1'        ;DATASET SECTOR ID
  2982. CSPRTRK: DB    '74001'        ;SPARE TRACK PTR
  2983. CHGHTRK: DB    '73026'        ;HIGH TRACK PTR
  2984. CLOWTRK: DB    '01001'        ;LOW TRACK PTR
  2985. CLRL80: DB    '00080'        ;DEFAULT RECORD LENGTH
  2986. CDSIDD:    DB    'DATA'        ;DEFAULT DATASET ID
  2987. CERMAP: DB    'ERMAP'        ;ERMAP SECTOR ID
  2988. CSCTNO: DB    '  091011121314151617'    ;ASCII SECTOR NUMBERS.
  2989.     DB    '181920212223242526'
  2990. CEOL:    DB    CR,LF,'$'
  2991. CSPACES: DB    '        '    ;8 SPACES
  2992. ;
  2993. ;        * GENERAL VARIABLES *
  2994. VOLSER: DS    6        ;VOLUME SERIAL NUMBER
  2995. RCDCNT: DW    0        ;RECORD COUNT
  2996. ;
  2997. ;        * TRANSFER VARIABLES *
  2998. CPMDSKNO: DS    1        ;CP/M DISK DRIVE
  2999. IBMDSKNO: DS    1        ;IBM DISK DRIVE
  3000. TDSN:    DS    8        ;DATASET NAME
  3001. TDSBOE:    DS    2        ;IBM BOE (INTERNAL)
  3002. TDSEOE:    DS    2        ;IBM EOE (INTERNAL)
  3003. TDSEOD:    DS    2        ;IBM EOD (INTERNAL)
  3004. BLKLEN: DS    2        ;IBM BLOCK LENGTH (INTERNAL)
  3005. TRSFCB:    DS    33        ;CP/M FCB FOR TDSN
  3006. TWRKC3:    DS    3        ;CHAR WORK AREA
  3007. TRSERR:    DS    1        ;TRANSFER ERROR COUNT
  3008. TRSBUFP: DS    2        ;CURRENT BUFFER POINTER.
  3009. TRSBUFA: DS    1        ;CURRENT # OF BYTES REMAINING IN BUFFER
  3010. ;
  3011. ;
  3012. $+PRINT
  3013. $+PRINT
  3014. ;        * *  DISK I/O BUFFERS  * *
  3015. ;
  3016. ;        * IBM DIRECTORY BUFFER *
  3017. DIRDSK:    DS    1        ;CURRENT DISK NO
  3018. DIRTRK:    DS    1        ;CURRENT TRACK NO
  3019. DIRSCT:    DS    1        ;CURRENT SECTOR NO
  3020. DIRBUF:    DS    0
  3021. DSHD:    DS    4        ;'HDR1'
  3022.     DS    1        ;RESERVED
  3023. DSID:    DS    8        ;DATASET IDENTIFIER
  3024.     DS    9        ;**RESERVED
  3025. DSBLK:    DS    5        ;BLOCK LENGTH OR PHYSICAL
  3026. ;                ;RECORD SIZE
  3027. DSATTR:    DS    1        ;RECORD ATTRIBUTE
  3028. ;                ;  B - RECORDS UNBLOCKED, UNSPANNED
  3029. ;                ;  R - RECORDS BLOCKED, SPANNED
  3030. ;                ;  B - RECORDS BLOCKED, UNSPANNED
  3031. DSBOE:    DS    5        ;GEGINNING OF EXTENT
  3032. DSPRL:    DS    1        ;PHYSICAL RECORD LENGTH
  3033. ;                ;  B - 128 BYTES
  3034. ;                ;  1 - 256 BYTES
  3035. ;                ;  2 - 512 BYTES
  3036. DSEOE:    DS    5        ;END OF EXTENT
  3037. DSRBF:    DS    1        ;RECORD/BLOCK FORMAT
  3038. ;                ;  MUST BE B OR F
  3039. DSBYPI:    DS    1        ;BYPASS INDICATOR
  3040. ;                ;  B - TRANSFER DATA
  3041. ;                ;  B - BYPASS TRANSFER
  3042. DSSS:    DS    1        ;DATASET SECURITY
  3043. ;                ;  B - NOT SECURED
  3044. ;                ;  ANYTHING - SECURED
  3045. DSWP:    DS    1        ;WRITE PROTECT
  3046. ;                ;  B - READ AND WRITE VALID
  3047. ;                ;  P - READ ONLY
  3048. DSETI:    DS    1        ;EXCHANGE TYPE INDICATOR
  3049. ;                ;  B - BASIC DATA EXCHANGE
  3050. ;                ;  ANYTHING - ADDITIONAL
  3051. ;                ;      CHECKING REQUIRED
  3052. DSMVI:    DS    1        ;MULTI-VOLUME INDICATOR
  3053. ;                ;  B - DATASET RESIDES ON
  3054. ;                ;      VOLUME ONLY
  3055. ;                ;  C - DATASET IS CONTINUED
  3056. ;                ;      ON ANOTHER VOLUME
  3057. ;                ;  L - LAST VOLUME OF DATA-
  3058. ;                ;      SET
  3059. DSVLSQ:    DS    2        ;VOLUME SEQUENCE NUMBER
  3060. DSCREDT: DS    6        ;CREATION DATE (YYMMDD)
  3061. DSRL:    DS    4        ;RECORD LENGTH
  3062. DSONRS:    DS    5        ;OFFSET TO NEXT RECORD SPACE
  3063.     DS    4        ;**RESERVED
  3064. DSEXPDT: DS    6        ;EXPIRATION DATE (YYMMDD)
  3065. DSVCI:    DS    1        ;VERIFY/COPY INDICATOR
  3066. ;                ;  B - DATASET CREATED
  3067. ;                ;  C - SUCCESSFULLY COPIED
  3068. ;                ;  V - DATASET VERIFIED
  3069.     DS    1        ;**RESERVED
  3070. DSEOD:    DS    5        ;END OF DATA
  3071.     DS    1        ;**RESERVED
  3072. DSLV:    DS    48        ;**RESERVED - LOW VALUES
  3073. ;
  3074. ;        *  DATA BUFFER 1  *
  3075. DATDSK1: DS    1        ;CURRENT DISK NO
  3076. DATTRK1: DS    1        ;CURRENT TRACK
  3077. DATSCT1: DS    1        ;CURRENT SECTOR
  3078.     ORG    $+(($+7)MOD 256) ;ORG TO 8-BYTE BOUNDARY
  3079. DATBUF1: DS    0
  3080. DATA1:    DS    80
  3081.     DS    48        ;FILLER
  3082. ;
  3083. ;        *  DATA BUFFER 2  *
  3084. DATDSK2: DS    1        ;CURRENT DISK NO
  3085. DATTRK2: DS    1        ;CURRENT TRACK NO
  3086. DATSCT2: DS    1        ;CURRENT SECTOR NO
  3087.     ORG    $+(($+7)MOD 256) ;ORG TO 8-BYTE BOUNDARY
  3088. DATBUF2: DS    0
  3089. DATA2:    DS    80
  3090.     DS    48        ;FILLER
  3091. ;
  3092. ;
  3093. ;
  3094. $+PRINT
  3095. $+PRINT
  3096. ;FILE        TRNSUBS.LIB
  3097. ;        * * * *  CHARACTER TRANSLATIONS  * * * *
  3098. ;PURPOSE    THESE ROUTINES PROVIDE THE MEANS OF TRANS-
  3099. ;        LATING CHARACTERS FROM ASCII TO EBCDIC OR
  3100. ;        VICE VERSA.  ALSO, THEY PROVIDE A MEANS
  3101. ;        FOR REMOVING UNWANTED CHARACTERS FROM PRINT
  3102. ;        LINES SUCH AS FOR A DUMP OF CORE.
  3103. ;INPUT
  3104. ;        A = CHARACTER TO BE TRNASLATED
  3105. ;OUTPUT
  3106. ;        A = TRANSLATED CHARACTER
  3107. ;REMARKS
  3108. ;        1.  EACH SUBROUTINE WILL ONLY BE GENERATED
  3109. ;            IF ITS GLOBAL IS SET TO TRUE.  THE GLO-
  3110. ;            BALS ARE:
  3111. ;            @TRNASEB - ASCII TO EBCDIC
  3112. ;            @TRNEBAS - EBCDIC TO ASCII
  3113. ;            @OUTTRN - OUTPUT TRANSLATION
  3114. ;
  3115. ;
  3116. ;
  3117. ;
  3118. ;
  3119. $+PRINT
  3120. $+PRINT
  3121. ;        * * *  TRANSLATE ASCII TO EBCDIC  * * *
  3122. ;PURPOSE    THIS ROUTINE TRANSLATES AN ASCII CHARACTER
  3123. ;        TO EBCDIC.
  3124. ;INPUT
  3125. ;        A = ASCII CHARACTER
  3126. ;OUTPUT
  3127. ;        A = EBCDIC CHARACTER
  3128. ;
  3129. ;
  3130. ;        DO INITIALIZATION.
  3131.     IF    @TRNASEB
  3132. TRNASEB: DS    0
  3133.     PUSH    BC        ;SAVE REGS.
  3134.     PUSH    HL
  3135.     MOV    C,A
  3136. ;
  3137. ;        TRANSLATE THE CHAR BY INDEXING INTO TABLE.
  3138.     ANI    07FH        ;ZERO HIGH ORDER BIT.
  3139.     MVI    B,0        ;BC=A
  3140.     MOV    C,A
  3141.     LXI    HL,ASEBTBL    ;HL=>TABLE.
  3142.     DAD    BC        ;INDEX INTO TABLE.
  3143.     MOV    A,M        ;GET TRNLTD CHAR.
  3144. ;
  3145. ;        RETURN TO CALLER.
  3146.     POP    HL        ;RESTORE REGS.
  3147.     POP    BC
  3148.     RET
  3149. ;
  3150. ;
  3151. ;
  3152. ;        * *  ASCII TO EBCDIC TRANSLATION TABLE  * *
  3153. ;
  3154. ASEBTBL: DS    0
  3155.     DB    000H,001H,002H,003H,004H,02DH,02EH,02FH        ;000-007
  3156.     DB    016H,005H,025H,00BH,00CH,00DH,00EH,00FH        ;008-015
  3157.     DB    010H,011H,012H,013H,014H,03DH,032H,026H        ;016-023
  3158.     DB    018H,019H,03FH,027H,01CH,01DH,01EH,01FH        ;024-031
  3159.     DB    040H,05AH,07FH,07BH,05BH,06CH,050H,07DH        ;032-039
  3160.     DB    04DH,05DH,05CH,04EH,06BH,060H,04BH,061H        ;040-047
  3161.     DB    0F0H,0F1H,0F2H,0F3H,0F4H,0F5H,0F6H,0F7H        ;048-055
  3162.     DB    0F8H,0F9H,07AH,05EH,04CH,07EH,06EH,06FH        ;056-063
  3163.     DB    07CH,0C1H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H        ;064-071
  3164.     DB    0C8H,0C9H,0D1H,0D2H,0D3H,0D4H,0D5H,0D6H        ;072-079
  3165.     DB    0D7H,0D8H,0D9H,0E2H,0E3H,0E4H,0E5H,0E6H        ;080-087
  3166.     DB    0E7H,0E8H,0E9H,0ADH,0E0H,0BDH,05FH,06DH        ;088-095
  3167.     DB    079H,081H,082H,083H,084H,085H,086H,087H        ;096-103
  3168.     DB    088H,089H,091H,092H,093H,094H,095H,096H        ;104-111
  3169.     DB    097H,098H,099H,0A2H,0A3H,0A4H,0A5H,0A6H        ;112-119
  3170.     DB    0A7H,0A8H,0A9H,0C0H,06AH,0D0H,0A1H,007H        ;120-127
  3171.     ENDIF
  3172. ;
  3173. ;
  3174. ;
  3175. ;
  3176. $+PRINT
  3177. $+PRINT
  3178. ;        * * *  TRANSLATE EBCDIC TO ASCII  * * *
  3179. ;PURPOSE    THIS ROUTINE TRANSLATES AN EBCDIC CHARACTER
  3180. ;        TO ASCII.
  3181. ;INPUT
  3182. ;        A = EBCDIC CHARACTER
  3183. ;OUTPUT
  3184. ;        A = ASCII CHARACTER
  3185. ;
  3186. ;
  3187. ;        DO INITIALIZATION.
  3188.     IF    @TRNEBAS
  3189. TRNEBAS: DS    0
  3190.     PUSH    BC        ;SAVE REGS.
  3191.     PUSH    HL
  3192.     MOV    C,A
  3193. ;
  3194. ;        TRANSLATE THE CHAR BY INDEXING INTO TABLE.
  3195.     MVI    B,0        ;BC=A
  3196.     MOV    C,A
  3197.     LXI    HL,EBASTBL    ;HL=>TABLE.
  3198.     DAD    BC        ;INDEX INTO TABLE.
  3199.     MOV    A,M        ;GET TRNLTD CHAR.
  3200. ;
  3201. ;        RETURN TO CALLER.
  3202.     POP    HL        ;RESTORE REGS.
  3203.     POP    BC
  3204.     RET
  3205. ;
  3206. ;
  3207. ;
  3208. ;        * *  EBCDIC TO ASCII TRANSLATION TABLE  * *
  3209. ;
  3210. EBASTBL: DS    0
  3211.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;00-07
  3212.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;08-0F
  3213.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;10-17
  3214.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;18-1F
  3215.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;20-27
  3216.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;28-2F
  3217.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;30-37
  3218.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;38-3F
  3219.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;40-47
  3220.     DB    020H,020H,020H,02EH,03CH,028H,02BH,07CH        ;48-4F
  3221.     DB    026H,020H,020H,020H,020H,020H,020H,020H        ;50-57
  3222.     DB    020H,020H,021H,024H,02AH,029H,03BH,07EH        ;58-5F
  3223.     DB    02DH,02FH,020H,020H,020H,020H,020H,020H        ;60-67
  3224.     DB    020H,020H,020H,02CH,025H,05FH,03EH,03FH        ;68-6F
  3225.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;70-77
  3226.     DB    020H,020H,03AH,023H,040H,027H,03DH,022H        ;78-7F
  3227.     DB    024H,020H,020H,020H,020H,020H,020H,020H        ;80-87
  3228.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;88-8F
  3229.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;90-97
  3230.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;98-9F
  3231.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;A0-A7
  3232.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;A8-AF
  3233.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;B0-B7
  3234.     DB    020H,020H,020H,020H,020H,020H,020H,020H        ;B8-BF
  3235.     DB    020H,041H,042H,043H,044H,045H,046H,047H        ;C0-C7
  3236.     DB    048H,049H,020H,020H,020H,020H,020H,020H        ;C8-CF
  3237.     DB    020H,04AH,04BH,04CH,04DH,04EH,04FH,050H        ;D0-D7
  3238.     DB    051H,052H,020H,020H,020H,020H,020H,020H        ;D8-DF
  3239.     DB    020H,020H,053H,054H,055H,056H,057H,058H        ;E0-E7
  3240.     DB    059H,05AH,020H,020H,020H,020H,020H,020H        ;E8-EF
  3241.     DB    030H,031H,032H,033H,034H,035H,036H,037H        ;F0-F7
  3242.     DB    038H,039H,020H,020H,020H,020H,020H,020H        ;F8-FF
  3243.     ENDIF
  3244. ;
  3245. ;
  3246. ;
  3247. ;
  3248. $+PRINT
  3249. $+PRINT
  3250. ;        * * *  OUPUT TRANSLATION  * * *
  3251. ;
  3252. ;PURPOSE    THE FOLLOWING ROUTINE AND TABLE ARE
  3253. ;        USED FOR OUTPUT TRANSLATION OF NON-
  3254. ;        PRINTABLE CHARACTERS.  FOR INSTANCE,
  3255. ;        IF THE CHARACTER IS A <CR>, IT WILL
  3256. ;        BE PRINTED AS A SPACE.
  3257. ;PROGRAMMER    ROBERT M. WHITE
  3258. ;DATE CODED    MAY 23, 1977
  3259. ;INPUT        A = CHARACTER TO BE TRANSLATED.
  3260. ;OUTPUT        A = TRANSLATED CHARACTER
  3261. ;
  3262. ;
  3263. ;
  3264. ;        DO INITIALIZATION.
  3265.     IF    @OUTTRN
  3266. OUTTRN: DS    0
  3267.     PUSH    BC        ;SAVE REGS.
  3268.     PUSH    HL
  3269.     MOV    C,A
  3270. ;
  3271. ;        TRANSLATE THE CHAR BY INDEXING INTO TABLE.
  3272.     ANI    07FH        ;ZERO HIGH ORDER BIT.
  3273.     MVI    B,0        ;BC=A
  3274.     MOV    C,A
  3275.     LXI    HL,OUTTBL    ;HL=>TABLE.
  3276.     DAD    BC        ;INDEX INTO TABLE.
  3277.     MOV    A,M        ;GET TRNLTD CHAR.
  3278. ;
  3279. ;        RETURN TO CALLER.
  3280.     POP    HL        ;RESTORE REGS.
  3281.     POP    BC
  3282.     RET
  3283. ;
  3284. ;
  3285. ;        * *  TRANSLATION TABLE  * *
  3286. OUTTBL:    DB    '                '    ;000 - 015
  3287.     DB    '                '    ;016 - 031
  3288.     DB    ' !"#$%&',027H,'()*+,-./'    ;032 - 047
  3289.     DB    '0123456789:;<=>?'    ;048 - 063
  3290.     DB    '@ABCDEFGHIJKLMNO'    ;064 - 079
  3291.     DB    'PQRSTUVWXYZ[\]^_'    ;080 - 095
  3292.     DB    ' abcdefghijklmno'    ;096 - 111
  3293.     DB    'pqrstuvwxyz{|}  '    ;112 - 127
  3294.     ENDIF
  3295. ;
  3296. ;
  3297. ;
  3298. ;
  3299. $+PRINT
  3300. ;END        TRNSUBS.LIB
  3301.     END
  3302.