home *** CD-ROM | disk | FTP | other *** search
- ;***********************************************
- ;
- ; P A S 2 C P M . A S M
- ; PROGRAM TO BRING A PASCAL FILE OVER FROM A PASCAL DISK
- ; TO A CP/M DISK. CP/M=A: PASCAL=B:
- ;
- ; PAS2CPM ,<CP/M FILENAME> <PASCAL FILENAME>
- ;
- ;
- ; WRITTEN BY RON PARSONS
- ;
- ; REF. DDJ. VOL. 37 PG. 12
- ;
- ; MOD'D IN ACCORDANCE WITH
- ; DDJ. VOL. 42 PG. 42
- ; MODS SUPPLIED BY JIM WARNER UC,SANTA CRUZ
- ;
- ; MODS TO RTN.S RB THRU SETEOF
- ; ADD RTN. GETBYT
- ;
- ; PURPOSE OF MOD.--ELIM. ERROR WHEN A 'DLE' -SPACE CODE
- ; FALLS ON A 512 BYTE BLOCK BOUNDARY
- ;
- ;*************************************************
- ;
- ;
- STACK EQU 0ABFFH
- CBIOS EQU 0AE00H
- DLE EQU 10H
- CBOOT EQU 0
- DENTSZ EQU 1AH
- DTITLE EQU 06H
- BLKBUF EQU 1000H
- DIRTOP EQU 2000H
- ;
- ORG 100H
- LXI SP,STACK
- ;
- LXI H,BUFF+1
- LXI D,SYSTLE+1
- MVI C,0
- CALL SCBK
- CALL SCBKCH
- PFN2 MOV A,M
- CPI 0
- JZ PFN3
- STAX D
- INX H
- INX D
- INR C
- JMP PFN2
- PFN3 MOV A,C
- STA SYSTLE
- ORA A
- JZ NOFLNM
- ; CHECK FOR .TEXT OR .CODE FILENAME
- LXI D,TEXT+6
- DCX H
- PUSH H
- MVI C,5
- TEXTLP LDAX D
- CMP M
- JNZ NOTEXT
- DCX H
- DCX D
- DCR C
- JNZ TEXTLP
- LXI H,TXTFLG
- MVI M,2
- LXI D,TEXT
- MVI C,WRITECB
- CALL BDOS
- NOTEXT POP H
- LXI D,CODE+6
- MVI C,5
- CODELP LDAX D
- CMP M
- JNZ NOTCODE
- DCX H
- DCX D
- DCR C
- JNZ CODELP
- LXI H,TXTFLG
- MVI M,1
- LXI D,CODE
- MVI C,WRITECB
- CALL BDOS
- NOTCODE LXI D,FCB
- MVI C,OPENF
- CALL BDOS
- CPI ERNXF
- JZ CREF
- LXI D,PERMSG
- MVI C,WRITECB
- CALL BDOS
- RDCHR MVI C,READC
- CALL BDOS
- CPI MODE
- JZ CBOOT
- CPI CR
- JNZ RDCHR
- LXI D,FCB
- MVI C,DELETEF
- CALL BDOS
- CREF LXI D,FCB
- MVI C,CREATEF
- CALL BDOS
- CPI ERNDR
- JZ CERROR
- INIT LXI H,BUFF
- SHLD BOL
- LXI H,BUFF+127
- SHLD EOB
- LXI H,BLKBUF+512
- SHLD BUFADD
- ;
- LXI B,DIRTOP
- CALL READ$DIR
- ;
- LXI H,DIRTOP
- LXI D,DENTSZ
- DAD D
- SHLD DENTP
- ;
- CALL FIND$FILE
- ;
- LHLD DENTP
- MOV E,M
- INX H
- MOV D,M
- PUSH D
- INX H
- MOV E,M
- INX H
- MOV D,M
- XCHG
- DAD H
- DAD H
- SHLD LSTLSN
- POP H
- LDA TXTFLG
- SKPBL1 DCR A
- JM SKPBL2
- INX H
- JMP SKPBL1
- SKPBL2 DAD H
- DAD H
- SHLD LSN
- LR80B CALL R80B
- LDA EOFFLAG
- ORA A
- JNZ FILL1A
- CALL WB
- JMP LR80B
- FILL1A LDA TXTFLG
- CPI 2
- JNZ FILL2
- CALL CT
- CALL WB
- FILL2 LXI D,FCB
- MVI C,CLOSEF
- CALL BDOS
- JMP CBOOT
- ;
- ;************************************
- ;
- ; SUBROUTINES
- ;
- ;************************************
- ;
- READ$DIR EQU $
- MVI E,4
- LXI H,2
- CALL SYSRD
- RET
- ;
- ;
- FIND$FILE EQU $
- MVI C,77
- LHLD DENTP
- FI$SCH$LP EQU $
- LXI D,DTITLE
- DAD D
- LXI D,SYSTLE
- LDA SYSTLE
- INR A
- MOV B,A
- FI$CMP$LP EQU $
- LDAX D
- CMP M
- JNZ FI$CONT
- INX D
- INX H
- DCR B
- JNZ FI$CMP$LP
- JMP FI$FOUND
- FI$CONT EQU $
- LHLD DENTP
- LXI D,DENTSZ
- DAD D
- SHLD DENTP
- JNZ FI$SCH$LP
- FI$HANG EQU $
- JMP NOFILE
- FI$FOUND EQU $
- RET
- ;
- ;
- SYSRD PUSH D
- PUSH H
- CALL READ$RX
- POP H
- POP D
- INX H
- DCR E
- JNZ SYSRD
- RET
- ;
- ;
- READ$RX DAD H
- DAD H
- MVI E,4
- RR$LP PUSH B
- PUSH D
- PUSH H
- CALL SETDMA
- POP H
- PUSH H
- CALL MAP
- MOV C,H
- PUSH H
- CALL SETTRK
- POP H
- MOV C,L
- CALL SETSEC
- MVI C,1
- CALL SELDSK
- CALL READ
- POP H
- POP D
- POP B
- PUSH H
- LXI H,128
- DAD B
- MOV B,H
- MOV C,L
- POP H
- INX H
- DCR E
- JNZ RR$LP
- RET
- ;
- ;
- RDSEC MVI C,DMAADD
- CALL BDOS
- LHLD LSN
- CALL MAP
- MOV C,L
- CALL SETSEC
- MOV C,H
- CALL SETTRK
- CALL READ
- ORA A
- JNZ RWERR
- LHLD LSN
- INX H
- SHLD LSN
- RET
- ;
- CT LHLD EOB
- INX H
- XCHG
- LHLD BOL
- CT1 CALL EQUAL
- RZ
- MVI M,CTRLZ
- INX H
- JMP CT1
- ;
- EQUAL MOV A,L
- CMP E
- RNZ
- MOV A,H
- CMP D
- RET
- ;
- COMPR MOV A,E
- SUB L
- MOV A,D
- SBB H
- RET
- ;
- R80B MVI B,80H
- LXI H,BUFF
- R80B1 PUSH B
- PUSH H
- CALL RB
- POP H
- POP B
- PUSH PSW
- LDA EOFFLAG
- ORA A
- JZ R80B2
- POP PSW
- SHLD BOL
- RET
- R80B2 POP PSW
- MOV M,A
- INX H
- DCR B
- JNZ R80B1
- RET
- ;
- WB MVI C,0
- CALL SELDSK
- LXI D,BUFF
- MVI C,DMAADD
- CALL BDOS
- LXI D,FCB
- MVI C,WRITER
- CALL BDOS
- ORA A
- JNZ RWERR
- RET
- ;
- ;
- SCBKCH MOV A,M
- CPI ' '
- JZ SCBK
- INX H
- JMP SCBKCH
- SCBK MOV A,M
- CPI ' '
- RNZ
- INX H
- RET
- ;
- RB LDA TXTFLG
- CPI 2
- JNZ NOT$TXT
- RBCKLF LDA NLF
- ORA A
- JZ RBCKTB
- XRA A
- STA NLF
- MVI A,LF
- RET
- RBCKTB LDA NTB
- ORA A
- JZ RBFB
- DCR A
- STA NTB
- MVI A,' '
- RET
- RBFB CALL GETBYT
- ORA A
- JZ RBFB
- CPI CR
- JNZ CKDLE
- STA NLF
- RET
- CKDLE CPI DLE
- RNZ
- CALL GETBYT
- SUI 32
- STA NTB
- JMP RBCKTB
- NOT$TXT CALL GETBYT
- RET
- ;
- GETBYT EQU $
- LHLD BUFADD
- LXI D,BLKBUF+512
- CALL EQUAL
- CZ RBLK ;RETURN WITH HL--BLKBUF
- MOV A,M
- INX H
- SHLD BUFADD
- RET
- ;
- ;
- RBLK EQU $
- LHLD LSN
- XCHG
- LHLD LSTLSN
- CALL EQUAL
- JZ SETEOF
- MVI C,1 ;SELECT B DISK-FOUND LAST SECTOR
- CALL SELDSK
- LXI D,BLKBUF
- CALL RDSEC
- LXI D,BLKBUF+80H
- CALL RDSEC
- LXI D,BLKBUF+100H
- CALL RDSEC
- LXI D,BLKBUF+180H
- CALL RDSEC
- LXI H,BLKBUF
- SHLD BUFADD
- RET
- ;
- SETEOF LXI H,EOFFLAG
- MVI M,1
- RET
- ;
- ; ERROR MESSAGES
- ;
- NOFLNM LXI D,NOFLNMSG
- JMP GENERR
- NOFILE LXI D,NOFMSG
- JMP GENERR
- RWERR ORI '0'
- STA WERMSG
- LXI D,WERMSG
- GENERR MVI C,WRITECB
- CALL BDOS
- JMP CBOOT
- ;
- CERROR LXI D,ERRMSG
- ORI '0'
- STA ERRMSG
- JMP GENERR
- ;
- MAP PUSH B
- PUSH D
- ;
- CALL DIV26
- MOV A,L
- ADD A
- MOV B,A
- MVI A,12
- CMP L
- JNC MAPC
- INR B
- MAPC MOV C,E
- XRA A
- MOV D,A
- MOV A,H
- MOV L,B
- MVI A,6
- MAP$LOOP EQU $
- DAD D
- DCR A
- JNZ MAP$LOOP
- PUSH B
- CALL DIV26
- POP B
- INR L
- MOV H,C
- INR H
- POP D
- POP B
- RET
- ;
- ;
- DIV26 LXI B,-26
- MVI E,0FFH
- DIVL INR E
- DAD B
- MOV A,H
- ORA A
- JP DIVL
- LXI B,26
- DAD B
- RET
- ;
- ;
- ;
- NOFLNMSG DB CR,LF,'MISSING FILE NAME$'
- NOFMSG DB CR,LF,'FILE DOES NOT EXIST$'
- WERMSG DB ' READ/WRITE ERROR$'
- PERMSG DB CR,LF,'FILE ALREADY EXISTS. $'
- PERMSG1 DB CR,LF,'C/R TO CONTINUE. CTRL-@ TO ABORT$'
- ERRMSG DB ' ERROR IN CREATE OR OPEN$'
- TEXT DB CR,LF,'.TEXT FILE BEING PROCESSED$'
- CODE DB CR,LF,'.CODE FILE BEING PROCESSED$'
- ;
- ;
- TXTFLG DB 0
- DENTP DW 0
- EOFFLAG DB 0
- NLF DB 0
- NTB DB 0
- BUFADD DW 0
- LSN DW 0
- LSTLSN DW 0
- BOL DW 0
- EOB DW 0
- SYSTLE DS 22
- ;
- ;
- ; CP/M EQUATES
- ;
- BOOT EQU CBIOS
- WBOOT EQU BOOT+3
- CONST EQU WBOOT+3
- CONIN EQU CONST+3
- CONOUT EQU CONIN+3
- LIST EQU CONOUT+3
- PUNCH EQU LIST+3
- READER EQU PUNCH+3
- HOME EQU READER+3
- SELDSK EQU HOME+3
- SETTRK EQU SELDSK+3
- SETSEC EQU SETTRK+3
- SETDMA EQU SETSEC+3
- READ EQU SETDMA+3
- WRITE EQU READ+3
- ;
- BDOS EQU 5
- FCB EQU 5CH
- BUFF EQU 80H
- ;
- SYSRST EQU 0 ;SYSTEM RESET
- READC EQU 1 ;READ CONSOLE
- WRITEC EQU 2 ;WRITE CONSOLE
- READRD EQU 3 ;READ READER
- WRITEP EQU 4 ;WRITE PUNCH
- WRITEL EQU 5 ;WRITE LIST
- ;
- IOSTAT EQU 7 ;INTERROGATE I/O STATUS
- ALTIOS EQU 8 ;ALTER I/O STATUS
- WRITECB EQU 9 ;WRITE CONSOLE BUFFER
- READCB EQU 10 ;READ CONSOLE BUFFER
- CONSTAT EQU 11 ;CHECK CONSOLE STATUS
- LIFTDH EQU 12 ;LIFT DISK HEAD
- RSTDS EQU 13 ;RESET DISK SYS.
- SELECTD EQU 14 ;SELECT DISK
- OPENF EQU 15 ;OPEN FILE
- CLOSEF EQU 16 ;CLOSE FILE
- SEARCHF EQU 17 ;SEARCH FIRST
- SEARCHN EQU 18 ;SEARCH NEXT
- DELETEF EQU 19 ;DELETE FILE
- READR EQU 20 ;READ RECORD
- WRITER EQU 21 ;WRITE RECORD
- CREATEF EQU 22 ;CREATE FILE
- RENAMEF EQU 23 ;RENAME FILE
- LOGINV EQU 24 ;GET LOGIN VECTOR
- LOGGED EQU 25 ;GTET LOGGED DISK
- DMAADD EQU 26 ;SET DMA ADDRESS
- ALLOCV EQU 27 ;GET ALLOCATION VECTOR
- ;
- ERNXF EQU 255 ;NON-EXISTANT FILE
- EREOF EQU 1 ;E0F RETURN CODE
- ERURA EQU 2 ;READ UNWRITTEN DATA
- EREXT EQU 1 ;ERROR IN EXTENDING FILE
- EREOD EQU 2 ;END OF DISK DATA
- ERNDR EQU 255 ;NO MORE DIR. SPACE
- ;
- CR EQU 13
- LF EQU 10
- ESC EQU 1BH
- MODE EQU 0
- CTRLZ EQU 1AH
- ;
- END