home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / dskutl / pas2cpm.asm < prev    next >
Assembly Source File  |  1994-07-13  |  8KB  |  557 lines

  1. ;***********************************************
  2. ;
  3. ;    P A S 2 C P M . A S M
  4. ; PROGRAM TO BRING A PASCAL FILE OVER FROM A PASCAL DISK
  5. ; TO A CP/M DISK.  CP/M=A:  PASCAL=B:
  6. ;
  7. ; PAS2CPM ,<CP/M FILENAME> <PASCAL FILENAME>
  8. ;
  9. ;
  10. ;  WRITTEN BY RON PARSONS
  11. ;
  12. ;    REF. DDJ. VOL. 37 PG. 12
  13. ;
  14. ;    MOD'D IN ACCORDANCE WITH
  15. ;    DDJ. VOL. 42 PG. 42
  16. ;    MODS SUPPLIED BY JIM WARNER UC,SANTA CRUZ
  17. ;
  18. ; MODS TO RTN.S RB THRU SETEOF
  19. ; ADD RTN.  GETBYT
  20. ;
  21. ; PURPOSE OF MOD.--ELIM. ERROR WHEN A 'DLE' -SPACE CODE
  22. ;           FALLS ON A 512 BYTE BLOCK BOUNDARY
  23. ;
  24. ;*************************************************
  25. ;
  26. ;
  27. STACK    EQU    0ABFFH
  28. CBIOS    EQU    0AE00H
  29. DLE    EQU    10H
  30. CBOOT    EQU    0
  31. DENTSZ    EQU    1AH
  32. DTITLE    EQU    06H
  33. BLKBUF    EQU    1000H
  34. DIRTOP    EQU    2000H
  35. ;
  36.     ORG    100H
  37.     LXI    SP,STACK
  38. ;
  39.     LXI    H,BUFF+1
  40.     LXI    D,SYSTLE+1
  41.     MVI    C,0
  42.     CALL    SCBK
  43.     CALL    SCBKCH
  44. PFN2    MOV    A,M
  45.     CPI    0
  46.     JZ    PFN3
  47.     STAX    D
  48.     INX    H
  49.     INX    D
  50.     INR    C
  51.     JMP    PFN2
  52. PFN3    MOV    A,C
  53.     STA    SYSTLE
  54.     ORA    A
  55.     JZ    NOFLNM
  56. ; CHECK FOR .TEXT OR .CODE FILENAME
  57.     LXI    D,TEXT+6
  58.     DCX    H
  59.     PUSH    H
  60.     MVI    C,5
  61. TEXTLP    LDAX    D
  62.     CMP    M
  63.     JNZ    NOTEXT
  64.     DCX    H
  65.     DCX    D
  66.     DCR    C
  67.     JNZ    TEXTLP
  68.     LXI    H,TXTFLG
  69.     MVI    M,2
  70.     LXI    D,TEXT
  71.     MVI    C,WRITECB
  72.     CALL    BDOS
  73. NOTEXT    POP    H
  74.     LXI    D,CODE+6
  75.     MVI    C,5
  76. CODELP    LDAX    D
  77.     CMP    M
  78.     JNZ    NOTCODE
  79.     DCX    H
  80.     DCX    D
  81.     DCR    C
  82.     JNZ    CODELP
  83.     LXI    H,TXTFLG
  84.     MVI    M,1
  85.     LXI    D,CODE
  86.     MVI    C,WRITECB
  87.     CALL    BDOS
  88. NOTCODE LXI    D,FCB
  89.     MVI    C,OPENF
  90.     CALL    BDOS
  91.     CPI    ERNXF
  92.     JZ    CREF
  93.     LXI    D,PERMSG
  94.     MVI    C,WRITECB
  95.     CALL    BDOS
  96. RDCHR    MVI    C,READC
  97.     CALL    BDOS
  98.     CPI    MODE
  99.     JZ    CBOOT
  100.     CPI    CR
  101.     JNZ    RDCHR
  102.     LXI    D,FCB
  103.     MVI    C,DELETEF
  104.     CALL    BDOS
  105. CREF    LXI    D,FCB
  106.     MVI    C,CREATEF
  107.     CALL    BDOS
  108.     CPI    ERNDR
  109.     JZ    CERROR
  110. INIT    LXI    H,BUFF
  111.     SHLD    BOL
  112.     LXI    H,BUFF+127
  113.     SHLD    EOB
  114.     LXI    H,BLKBUF+512
  115.     SHLD    BUFADD
  116. ;
  117.     LXI    B,DIRTOP
  118.     CALL    READ$DIR
  119. ;
  120.     LXI    H,DIRTOP
  121.     LXI    D,DENTSZ
  122.     DAD    D
  123.     SHLD    DENTP
  124. ;
  125.     CALL    FIND$FILE
  126. ;
  127.     LHLD    DENTP
  128.     MOV    E,M
  129.     INX    H
  130.     MOV    D,M
  131.     PUSH    D
  132.     INX    H
  133.     MOV    E,M
  134.     INX    H
  135.     MOV    D,M
  136.     XCHG
  137.     DAD    H
  138.     DAD    H
  139.     SHLD    LSTLSN
  140.     POP    H
  141.     LDA    TXTFLG
  142. SKPBL1    DCR    A
  143.     JM    SKPBL2
  144.     INX    H
  145.     JMP    SKPBL1
  146. SKPBL2    DAD    H
  147.     DAD    H
  148.     SHLD    LSN
  149. LR80B    CALL    R80B
  150.     LDA    EOFFLAG
  151.     ORA    A
  152.     JNZ    FILL1A
  153.     CALL    WB
  154.     JMP    LR80B
  155. FILL1A    LDA    TXTFLG
  156.     CPI    2
  157.     JNZ    FILL2
  158.     CALL    CT
  159.     CALL    WB
  160. FILL2    LXI    D,FCB
  161.     MVI    C,CLOSEF
  162.     CALL    BDOS
  163.     JMP    CBOOT
  164. ;
  165. ;************************************
  166. ;
  167. ;    SUBROUTINES
  168. ;
  169. ;************************************
  170. ;
  171. READ$DIR  EQU $
  172.     MVI    E,4
  173.     LXI    H,2
  174.     CALL    SYSRD
  175.     RET
  176. ;
  177. ;
  178. FIND$FILE  EQU $
  179.     MVI    C,77
  180.     LHLD    DENTP
  181. FI$SCH$LP  EQU    $
  182.     LXI    D,DTITLE
  183.     DAD    D
  184.     LXI    D,SYSTLE
  185.     LDA    SYSTLE
  186.     INR    A
  187.     MOV    B,A
  188. FI$CMP$LP  EQU $
  189.     LDAX    D
  190.     CMP    M
  191.     JNZ    FI$CONT
  192.     INX    D
  193.     INX    H
  194.     DCR    B
  195.     JNZ    FI$CMP$LP
  196.     JMP    FI$FOUND
  197. FI$CONT  EQU $
  198.     LHLD    DENTP
  199.     LXI    D,DENTSZ
  200.     DAD    D
  201.     SHLD    DENTP
  202.     JNZ    FI$SCH$LP
  203. FI$HANG  EQU $
  204.     JMP    NOFILE
  205. FI$FOUND  EQU $
  206.     RET
  207. ;
  208. ;
  209. SYSRD    PUSH    D
  210.     PUSH    H
  211.     CALL    READ$RX
  212.     POP    H
  213.     POP    D
  214.     INX    H
  215.     DCR    E
  216.     JNZ    SYSRD
  217.     RET
  218. ;
  219. ;
  220. READ$RX DAD    H
  221.     DAD    H
  222.     MVI    E,4
  223. RR$LP    PUSH    B
  224.     PUSH    D
  225.     PUSH    H
  226.     CALL    SETDMA
  227.     POP    H
  228.     PUSH    H
  229.     CALL    MAP
  230.     MOV    C,H
  231.     PUSH    H
  232.     CALL    SETTRK
  233.     POP    H
  234.     MOV    C,L
  235.     CALL    SETSEC
  236.     MVI    C,1
  237.     CALL    SELDSK
  238.     CALL    READ
  239.     POP    H
  240.     POP    D
  241.     POP    B
  242.     PUSH    H
  243.     LXI    H,128
  244.     DAD    B
  245.     MOV    B,H
  246.     MOV    C,L
  247.     POP    H
  248.     INX    H
  249.     DCR    E
  250.     JNZ    RR$LP
  251.     RET
  252. ;
  253. ;
  254. RDSEC    MVI    C,DMAADD
  255.     CALL    BDOS
  256.     LHLD    LSN
  257.     CALL    MAP
  258.     MOV    C,L
  259.     CALL    SETSEC
  260.     MOV    C,H
  261.     CALL    SETTRK
  262.     CALL    READ
  263.     ORA    A
  264.     JNZ    RWERR
  265.     LHLD    LSN
  266.     INX    H
  267.     SHLD    LSN
  268.     RET
  269. ;
  270. CT    LHLD    EOB
  271.     INX    H
  272.     XCHG
  273.     LHLD    BOL
  274. CT1    CALL    EQUAL
  275.     RZ
  276.     MVI    M,CTRLZ
  277.     INX    H
  278.     JMP    CT1
  279. ;
  280. EQUAL    MOV    A,L
  281.     CMP    E
  282.     RNZ
  283.     MOV    A,H
  284.     CMP    D
  285.     RET
  286. ;
  287. COMPR    MOV    A,E
  288.     SUB    L
  289.     MOV    A,D
  290.     SBB    H
  291.     RET
  292. ;
  293. R80B    MVI    B,80H
  294.     LXI    H,BUFF
  295. R80B1    PUSH    B
  296.     PUSH    H
  297.     CALL    RB
  298.     POP    H
  299.     POP    B
  300.     PUSH    PSW
  301.     LDA    EOFFLAG
  302.     ORA    A
  303.     JZ    R80B2
  304.     POP    PSW
  305.     SHLD    BOL
  306.     RET
  307. R80B2    POP    PSW
  308.     MOV    M,A
  309.     INX    H
  310.     DCR    B
  311.     JNZ    R80B1
  312.     RET
  313. ;
  314. WB    MVI    C,0
  315.     CALL    SELDSK
  316.     LXI    D,BUFF
  317.     MVI    C,DMAADD
  318.     CALL    BDOS
  319.     LXI    D,FCB
  320.     MVI    C,WRITER
  321.     CALL    BDOS
  322.     ORA    A
  323.     JNZ    RWERR
  324.     RET
  325. ;
  326. ;
  327. SCBKCH    MOV    A,M
  328.     CPI    ' '
  329.     JZ    SCBK
  330.     INX    H
  331.     JMP    SCBKCH
  332. SCBK    MOV    A,M
  333.     CPI    ' '
  334.     RNZ
  335.     INX    H
  336.     RET
  337. ;
  338. RB    LDA    TXTFLG
  339.     CPI    2
  340.     JNZ    NOT$TXT
  341. RBCKLF    LDA    NLF
  342.     ORA    A
  343.     JZ    RBCKTB
  344.     XRA    A
  345.     STA    NLF
  346.     MVI    A,LF
  347.     RET
  348. RBCKTB    LDA    NTB
  349.     ORA    A
  350.     JZ    RBFB
  351.     DCR    A
  352.     STA    NTB
  353.     MVI    A,' '
  354.     RET
  355. RBFB    CALL    GETBYT
  356.     ORA    A
  357.     JZ    RBFB
  358.     CPI    CR
  359.     JNZ    CKDLE
  360.     STA    NLF
  361.     RET
  362. CKDLE    CPI    DLE
  363.     RNZ
  364.     CALL    GETBYT
  365.     SUI    32
  366.     STA    NTB
  367.     JMP    RBCKTB
  368. NOT$TXT CALL    GETBYT
  369.     RET
  370. ;
  371. GETBYT    EQU    $
  372.     LHLD    BUFADD
  373.     LXI    D,BLKBUF+512
  374.     CALL    EQUAL
  375.     CZ    RBLK    ;RETURN WITH HL--BLKBUF
  376.     MOV    A,M
  377.     INX    H
  378.     SHLD    BUFADD
  379.     RET
  380. ;
  381. ;
  382. RBLK    EQU    $
  383.     LHLD    LSN
  384.     XCHG
  385.     LHLD    LSTLSN
  386.     CALL    EQUAL
  387.     JZ    SETEOF
  388.     MVI    C,1    ;SELECT B DISK-FOUND LAST SECTOR
  389.     CALL    SELDSK
  390.     LXI    D,BLKBUF
  391.     CALL    RDSEC
  392.     LXI    D,BLKBUF+80H
  393.     CALL    RDSEC
  394.     LXI    D,BLKBUF+100H
  395.     CALL    RDSEC
  396.     LXI    D,BLKBUF+180H
  397.     CALL    RDSEC
  398.     LXI    H,BLKBUF
  399.     SHLD    BUFADD
  400.     RET
  401. ;
  402. SETEOF    LXI    H,EOFFLAG
  403.     MVI    M,1
  404.     RET
  405. ;
  406. ;    ERROR MESSAGES
  407. ;
  408. NOFLNM    LXI    D,NOFLNMSG
  409.     JMP    GENERR
  410. NOFILE    LXI    D,NOFMSG
  411.     JMP    GENERR
  412. RWERR    ORI    '0'
  413.     STA    WERMSG
  414.     LXI    D,WERMSG
  415. GENERR    MVI    C,WRITECB
  416.     CALL    BDOS
  417.     JMP    CBOOT
  418. ;
  419. CERROR    LXI    D,ERRMSG
  420.     ORI    '0'
  421.     STA    ERRMSG
  422.     JMP    GENERR
  423. ;
  424. MAP    PUSH    B
  425.     PUSH    D
  426. ;
  427.     CALL    DIV26
  428.     MOV    A,L
  429.     ADD    A
  430.     MOV    B,A
  431.     MVI    A,12
  432.     CMP    L
  433.     JNC    MAPC
  434.     INR    B
  435. MAPC    MOV    C,E
  436.     XRA    A
  437.     MOV    D,A
  438.     MOV    A,H
  439.     MOV    L,B
  440.     MVI    A,6
  441. MAP$LOOP  EQU $
  442.     DAD    D
  443.     DCR    A
  444.     JNZ    MAP$LOOP
  445.     PUSH    B
  446.     CALL    DIV26
  447.     POP    B
  448.     INR    L
  449.     MOV    H,C
  450.     INR    H
  451.     POP    D
  452.     POP    B
  453.     RET
  454. ;
  455. ;
  456. DIV26    LXI    B,-26
  457.     MVI    E,0FFH
  458. DIVL    INR    E
  459.     DAD    B
  460.     MOV    A,H
  461.     ORA    A
  462.     JP    DIVL
  463.     LXI    B,26
  464.     DAD    B
  465.     RET
  466. ;
  467. ;
  468. ;
  469. NOFLNMSG    DB    CR,LF,'MISSING FILE NAME$'
  470. NOFMSG    DB    CR,LF,'FILE DOES NOT EXIST$'
  471. WERMSG    DB    ' READ/WRITE ERROR$'
  472. PERMSG    DB    CR,LF,'FILE ALREADY EXISTS. $'
  473. PERMSG1 DB    CR,LF,'C/R TO CONTINUE. CTRL-@ TO ABORT$'
  474. ERRMSG    DB    ' ERROR IN CREATE OR OPEN$'
  475. TEXT    DB    CR,LF,'.TEXT FILE BEING PROCESSED$'
  476. CODE    DB    CR,LF,'.CODE FILE BEING PROCESSED$'
  477. ;
  478. ;
  479. TXTFLG    DB    0
  480. DENTP    DW    0
  481. EOFFLAG DB    0
  482. NLF    DB    0
  483. NTB    DB    0
  484. BUFADD    DW    0
  485. LSN    DW    0
  486. LSTLSN    DW    0
  487. BOL    DW    0
  488. EOB    DW    0
  489. SYSTLE    DS    22
  490. ;
  491. ;
  492. ; CP/M EQUATES
  493. ;
  494. BOOT    EQU    CBIOS
  495. WBOOT    EQU    BOOT+3
  496. CONST    EQU    WBOOT+3
  497. CONIN    EQU    CONST+3
  498. CONOUT    EQU    CONIN+3
  499. LIST    EQU    CONOUT+3
  500. PUNCH    EQU    LIST+3
  501. READER    EQU    PUNCH+3
  502. HOME    EQU    READER+3
  503. SELDSK    EQU    HOME+3
  504. SETTRK    EQU    SELDSK+3
  505. SETSEC    EQU    SETTRK+3
  506. SETDMA    EQU    SETSEC+3
  507. READ    EQU    SETDMA+3
  508. WRITE    EQU    READ+3
  509. ;
  510. BDOS    EQU    5
  511. FCB    EQU    5CH
  512. BUFF    EQU    80H
  513. ;
  514. SYSRST    EQU    0    ;SYSTEM RESET
  515. READC    EQU    1    ;READ CONSOLE
  516. WRITEC    EQU    2    ;WRITE CONSOLE
  517. READRD    EQU    3    ;READ READER
  518. WRITEP    EQU    4    ;WRITE PUNCH
  519. WRITEL    EQU    5    ;WRITE LIST
  520. ;
  521. IOSTAT    EQU    7    ;INTERROGATE I/O STATUS
  522. ALTIOS    EQU    8    ;ALTER I/O STATUS
  523. WRITECB EQU    9    ;WRITE CONSOLE BUFFER
  524. READCB    EQU    10    ;READ CONSOLE BUFFER
  525. CONSTAT EQU    11    ;CHECK CONSOLE STATUS
  526. LIFTDH    EQU    12    ;LIFT DISK HEAD
  527. RSTDS    EQU    13    ;RESET DISK SYS.
  528. SELECTD EQU    14    ;SELECT DISK
  529. OPENF    EQU    15    ;OPEN FILE
  530. CLOSEF    EQU    16    ;CLOSE FILE
  531. SEARCHF EQU    17    ;SEARCH FIRST
  532. SEARCHN EQU    18    ;SEARCH NEXT
  533. DELETEF EQU    19    ;DELETE FILE
  534. READR    EQU    20    ;READ RECORD
  535. WRITER    EQU    21    ;WRITE RECORD
  536. CREATEF EQU    22    ;CREATE FILE
  537. RENAMEF EQU    23    ;RENAME FILE
  538. LOGINV    EQU    24    ;GET LOGIN VECTOR
  539. LOGGED    EQU    25    ;GTET LOGGED DISK
  540. DMAADD    EQU    26    ;SET DMA ADDRESS
  541. ALLOCV    EQU    27    ;GET ALLOCATION VECTOR
  542. ;
  543. ERNXF    EQU    255    ;NON-EXISTANT FILE
  544. EREOF    EQU    1    ;E0F RETURN CODE
  545. ERURA    EQU    2    ;READ UNWRITTEN DATA
  546. EREXT    EQU    1    ;ERROR IN EXTENDING FILE
  547. EREOD    EQU    2    ;END OF DISK DATA
  548. ERNDR    EQU    255    ;NO MORE DIR. SPACE
  549. ;
  550. CR    EQU    13
  551. LF    EQU    10
  552. ESC    EQU    1BH
  553. MODE    EQU    0
  554. CTRLZ    EQU    1AH
  555. ;
  556.     END
  557.