TITLE 'INTERDOS: NORTH STAR/CPM FILE CONVERSIONS' ; THIS PROGRAM DOES THE NORTH STAR TO CP/M AND CP/M TO NORTH STAR FILE ; CONVERSIONS. IT WILL BE NECESSARY FOR THE USER TO CHANGE THE NSBOOT ; ADDRESS AND DENSITY AS LISTED BELOW IN THE FOLLOWING TWO EQUATES. NSBOOT EQU 0E800H ;NEWER NS SYSTEMS USE E800, ;OLDER SYSTEMS USE E900 DENSITY EQU 'D' ;S-SINGLE DENSITY ;D-DOUBLE OR QUAD DENSITY ; COPYRIGHT 1980, G. YOUNG, INC ; WRITTEN BY G. YOUNG, INC, PO BOX 3218, NORTH HOLLYWOOD, CA 91609 ; MODIFIED 02/01/81 DOS EQU 2028H DLOOK EQU 201CH ;DIRECTORY LOOKUP DCOM EQU 2022H ;DISK IO DBYTE EQU 202FH ;ACTUAL DENSITY OF DISK BDOS EQU 5 ORG 100H START LXI SP,STACK+50 MVI A,DENSITY CPI 'S' JZ SIGNON1 LXI D,SIGNOND JMP SIGNON2 SIGNON1 LXI D,SIGNONS SIGNON2 CALL PRINT LXI D,BOOTMSG ;BOOT NORTH STAR DOS? CALL PRINT CALL INPUT CPI 'Y' JZ NSBOOT ;BOOT NS DOS CALL FILLBUFF MESS1 LXI D,DEST ;DESTINATION SYSTEM? CALL PRINT CALL INPUT STA TODOS CPI 'N' ;TO NORTH STAR JZ TONS CPI 'C' ;TO CP/M JZ TOCPM JMP MESS1 TONS LXI D,SRCCPM ;CONFIRM SOURCE ON CPM CALL PRINT JMP MESS2 TOCPM LXI D,SRCNS ;CONFIRM SOURCE ON NS CALL PRINT MESS2 LXI D,LINEA ;DISPLAY OPTIONAL CONVERSION CALL PRINT ;ROUTINES LXI D,LINE0 CALL PRINT LXI D,LINE1 CALL PRINT LXI D,LINE2 CALL PRINT LXI D,LINE3 CALL PRINT LXI D,LINE4 CALL PRINT LXI D,LINE5 CALL PRINT LXI D,LINEB ;ASK QUESTION ABOUT OPTION CALL PRINT CALL INPUT STA CNVRT CPI '0' JC MESS2 CPI '5'+1 JNC MESS2 ;REASK QUESTION IF BAD INPUT MESS3 LXI D,EOFMSG ;HOW TO DETECT EOF? CALL PRINT CALL INPUT STA EOFIND CPI '1' ;FIND AN 01 IN DATA JZ MESS4 CPI 'B' ;STOP ON BLOCK COUNT JNZ MESS3 ;REPEAT MESSAGE IF INVALID MESS4 XRA A ;RESET EOF INDICATOR STA EOF MESS6 LXI D,MOUNT ;TYPE MOUNT MESSAGE CALL PRINT ;DONE NOW SO THAT DISKS ARE LOADED CALL INPUT ;WHEN FILE NAMES ARE ENTERED MESS7 LXI D,CPMFILE ;GET CPM FILE NAME CALL PRINT CALL INPUT CALL GETFCB ;CREATE FCB CALL OPENCPM MESS8 LXI D,NSFILE ;GET NORTH STAR FILE NAME CALL PRINT MVI A,DENSITY ;RESET THE TRUE DENSITY TO THE SYSTEM STA TRUEDEN ;DENSITY. IT WILL LATER BE CHANGED IN ;OPENNS TO THE ACTUAL DISK DENSITY CALL INPUT CALL OPENNS LXI H,NSBUFF ;GET ADDR OF NS BUFFER SHLD NSADDR LXI H,CPMBUFF ;GET ADDR OF CPM BUFFER SHLD CPMADDR XRA A STA NSCNT ;CLEAR CHARACTER COUNTER STA NSCNT+1 STA CPMCNT ;CLEAR CPM CHAR COUNTER LDA TODOS ;CHECK DESTINATION CPI 'N' JZ CPMTONS ;CPM TO NS COPY NSTOCPM LDA CNVRT ;CHECK THE CONVERSION OPTION CPI '0' ;NO CONVERSTION JZ NONSCNVT ;NO CONVERSION OF NS TO CPM CPI '1' ;NS SECRTARY TO CPM ASM FILE JZ SECTOASM CPI '2' ;NS SECRTARY TO CPM ED FILE JZ SECTOED CPI '3' ;NS SECRTARY TO CPM BASIC FILE JZ SECTOBAS CPI '4' ;NS BASIC TO CPM BASIC JZ BASTOBAS JMP ERR1 ;INVALID OPTION CPMTONS LDA CNVRT CPI '0' ;CPM TO NS WITHOUT CONVERSION JZ NOCPMCNVT ;DATA OR SECRTARY FILES CPI '5' ;CPM HEX TO NS TYPE 2 FILES JZ HEXTO2 ERR1 LXI D,ERRM1 CALL PRINT JMP MESS1 CPMERR LXI D,ERRM2 CALL PRINT JMP FINISHED NSERR LXI D,ERRM3 CALL PRINT JMP FINISHED PRINT PUSH D LXI D,CRLF MVI C,9 CALL BDOS POP D PRINT2 MVI C,9 CALL BDOS RET INPUT LXI D,IBUF MVI C,0AH CALL BDOS LDA IBUF+2 RET RESET EQU $ ;RESET POINTERS AND COUNTERS XRA A STA EOF ;RESET EOF STA NSCNT ;RESET CHAR COUNTERS STA NSCNT+1 STA CPMCNT LXI H,NSBUFF ;DEFINE BUFFER ADDRESSES SHLD NSADDR LXI H,CPMBUFF SHLD CPMADDR RET * SECRTARY FORMAT AS REFERENCED HERE IS THE OLD SCS FORMAT * CONSISTING OF A LINE COUNT, 4 ASCII CHARACTERS FOR THE LINE * NUMBER, THE TEXT, AND A SINGLE CARRIAGE RETURN AT THE END * WITHOUT THE LINE FEED. * CONVERT SECRTARY FORMAT TO ASCII BASIC FORMAT IE RETAIN THE * LINE NUMBERS, BUT DELETE THE CHARACTER COUNT AND ADD A LINE * FEED AFTER THE CARRIAGE RETURN SECTOBAS EQU $ CALL RESET CALL READNS NEXTLINE3 CALL GETNS ;GET THE NS CHAR COUNT CPI 1 ;IS IT AN EOF? JZ CLOSE2 ;YES!!! COPY3 CALL GETNS CALL PUTCPM LDA TEMP CPI 0DH ;END OF LINE? JZ ENDSTB ;YES JMP COPY3 ENDSTB MVI A,0AH ;ADD THE LINEFEED STA TEMP CALL PUTCPM JMP NEXTLINE3 * CONVERT SECRTARY FORMAT TO ED FORMAT IE DELETE THE LINE NUMBERS, * DELETE THE CHARACTER COUNT ON EACH LINE, AND ADD A LINE FEED * AFTER THE CARRIAGE RETURN SECTOED EQU $ CALL RESET CALL READNS NEXTLINE4 CALL GETNS CPI 1 ;EOF JZ CLOSE2 CALL GETNS ;GET LINE# CHAR 1 CALL GETNS ;GET LINE# CHAR 2 CALL GETNS ;GET LINE# CHAR 3 CALL GETNS ;GET LINE# CHAR 4 COPY4 CALL GETNS CALL PUTCPM CPI 0DH ;END OF LINE?? JNZ COPY4 ENDSTE MVI A,0AH STA TEMP CALL PUTCPM JMP NEXTLINE4 * NS SECRTARY TO CPM ASSEMBLER FORMAT * THIS IS SIMILAR TO NS SECRTARY TO ED FORMAT EXCEPT * THIS CHANGES CERTAIN BLANKS TO TABS SECTOASM EQU $ CALL RESET CALL READNS ;GET ONE NS BUFFER COPY2 CALL GETNS ;GET CHAR/LINE COUNT CPI 1 ;EOF? JZ CLOSE2 ;YES, EOF FOUND CALL GETNS ;GET LINE # CHAR 1 CALL GETNS ;GET LINE # CHAR 2 CALL GETNS ;GET LINE # CHAR 3 CALL GETNS ;1ST CHAR AFTER LINE IS ALWAYS BLANK CALL GETNS ;GET LINE # CHAR 4 CALL GETNS ;GET FIRST CHAR OF THE LINE CPI 20H ;IS IT A SPACE JNZ LABEL2 ;NO, IT MUST BE A LABEL THEN MVI A,09 STA TEMP ;REPLACE SPACE WITH A TAB CALL PUTCPM JMP OPCODE LABEL2 CALL PUTCPM ;COPY THE LABEL CALL GETNS ;GET NEXT CHAR OF LABEL CPI 20H ;LABEL DONE? JNZ LABEL2 TAB2 MVI A,09 ;REPLACE THE SPACE BETWEEN THE LABEL STA TEMP ;AND THE OPCODE WITH A TAB CALL PUTCPM OPCODE CALL GETNS ;COPY THE OPCODE CPI 20H JZ TAB3 CPI 0DH ;CARRIAGE RETURN? JZ ENDLINE OPCODE2 CALL PUTCPM JMP OPCODE TAB3 MVI A,09 ;REPLACE THE SPACE BETWEEN THE STA TEMP ;OPCODE AND THE OPERAND WITH A TAB CALL PUTCPM OPERAND CALL GETNS CPI 0DH JZ ENDLINE CPI 20H JZ TAB4 CALL PUTCPM ;COPY THE OPERAND JMP OPERAND TAB4 MVI A,09 ;REPLACE THE SPACE BETWEEN THE STA TEMP ;OPERAND AND THE COMMENT CALL PUTCPM COMMENT CALL GETNS ;COPY THE REST OF THE LINE CPI 0DH JZ ENDLINE CALL PUTCPM JMP COMMENT ENDLINE MVI A,0DH ;REPLACE THE SINGLE CARRIAGE STA TEMP ;RETURN WITH A CARRIAGE RETURN/LINE FEED CALL PUTCPM MVI A,0AH ;"DISPLAY" PUTS IN ITS OWN LINE FEED STA TEMP ;SO IT DOES NOT HAVE TO BE CALLED CALL PUTCPM ;TO PRINT THIS CHARACTER JMP COPY2 CLOSE2 CALL CLOSECPM JMP MESS7 * COPY FILES FROM NORTH STAR TO CPM WITHOUT ANY CONVERSION NONSCNVT EQU $ ;COPY NS TO CPM WITHOUT CONVERSION CALL RESET CALL READNS COPY1 CALL GETNS ;GET ONE CHAR FROM NS CALL PUTCPM ;PUT ONE CHAR INTO CPM BUFFER LDA EOF ;CHECK FOR EOF ORA A JZ COPY1 CALL CLOSECPM JMP MESS7 * COPY CPM HEX FILE TO NS TYPE 2 FILE * ASSUME THAT THE ADDRESS OF THE TYPE 2 FILE CORRESPONDS * TO THE HEX ADDRESSES HEXTO2 CALL RESET XRA A STA LAST CALL READCPM COLON MVI E,0 MVI C,0 CALL GETCPM ;GET THE COLON CPI ':' JNZ NOTHEX CALL GETBYTE ;GET THE COUNT ORA A JZ CLOSENS ;END WHEN BYTE COUNT IS ZERO MOV C,A ;SAVE COUNT CALL GETBYTE ;SKIP THE ADDRESS STA ABCD+1 CALL GETBYTE ;SKIP THE ADDRESS BYTE 2 STA ABCD ;SAVE THE ADDRESS LDA LAST ;IS THIS THE FIRST ADDRESS ORA A JNZ CHECKADDR ;NO, SKIP INITIALIZATION MVI A,1 ;YES, INIT LAST ADDR STA LAST LHLD ABCD SHLD WXYZ CHECKADDR LHLD ABCD XCHG ;DE=CURRENT ADDR LHLD WXYZ ;HL=LAST ADDR MOV A,D ;COMPARE FOR EQUAL CMP H JNZ ADDRGAP ;THERE IS A GAP IN THE ADDRESSES MOV A,E CMP L JZ ADDROK ;NO GAP IN ADDRESSES ADDRGAP MVI A,00 ;FILL GAP WITH LOW VALUES CALL PUTNS LHLD WXYZ INX H SHLD WXYZ JMP CHECKADDR ADDROK EQU $ CALL GETBYTE ;SKIP THE TYPE BYTE NEXTHEX CALL GETBYTE CALL PUTNS LHLD WXYZ ;INCREMENT LAST ADDRESS SO THAT INX H ;IT WILL BE EQUAL TO THE NEXT ADDR SHLD WXYZ ;WHEN THE NEXT ADDR IS READ DCR C JNZ NEXTHEX CALL GETBYTE ;SKIP THE CHECKSUM CALL GETCPM ;SKIP CR CALL GETCPM ;SKIP LF JMP COLON CLOSENS CALL CLOSECPM CALL WRITENS JMP MESS7 NOTHEX LXI D,HEXMSG CALL PRINT JMP MESS7 HEXMSG DB 'THIS IS NOT A HEX FILE$' GETBYTE PUSH H ;CONVERT TWO ASCII CHARACTERS INTO PUSH B ;ONE BINARY BYTE LXI H,0 MVI C,3 ;TWO CHARACTERS HEX DCR C JZ FINI CALL GETCPM DAD H ;SHIFT LEFT DAD H DAD H DAD H CALL AHS1 CPI 10H CMC JC FINI ADD L MOV L,A JMP HEX FINI POP B POP H RET AHS1 SUI 48 CPI 10 RC SUI 7 RET * COPY CPM FILE TO NORTH STAR WITHOUT CONVERSION NOCPMCNVT EQU $ CALL RESET CALL READCPM COPY6 CALL GETCPM CALL PUTNS LDA EOF ORA A JZ COPY6 JMP CLOSENS DISPLAY LDA TEMP ;GET CHAR TO DISPLAY CPI 13 JZ TYPECR CPI 20H JZ TYPEIT RC CPI 7FH RNC TYPEIT MOV E,A MVI C,2 CALL BDOS ;CONSOLE OUTPUT RET TYPECR LXI D,CRLF JMP PRINT2 ; CP/M IO ROUTINES READCPM LXI D,CPMBUFF MVI C,1AH ;SET DMA CALL BDOS LXI D,FCB MVI C,14H CALL BDOS ;SEQUENTIAL READ INR A JZ EOFCPM RESET1 LXI H,CPMBUFF ;RESET BUFFER ADDR SHLD CPMADDR XRA A ;RESET BYTE COUNT STA CPMCNT RET EOFCPM MVI A,01 STA EOF JMP RESET1 GETCPM PUSH H PUSH D PUSH B LHLD CPMADDR ;GET ONE CHAR FROM CPM BUFFER MOV A,M STA TEMP INX H SHLD CPMADDR LDA CPMCNT INR A STA CPMCNT ;INCREMENT COUNTER AND ADDRESS CPI 128 ;CHECK FOR EMPTY BUFFER CZ READCPM ;REFILL BUFFER LDA EOFIND CPI 'B' JZ GETCPM1 ;SEE IF EOF DEPENDED ON 01 OB BLOCK CNT LDA TEMP ;WAS CHAR READ AN EOF INDICATOR 01 CPI 01 JNZ GETCPM1 ;NO STA EOF GETCPM1 LDA TEMP POP B POP D POP H RET ;YES, SET INDICATOR ON WRITECPM LXI D,FCB ;WRITE ONE CPM BUFFER FULL MVI C,15H ;WRITE SEQUENTILA CALL BDOS INR A JZ CPMERR ;PROBABLY DISK FULL CALL FILLBUFF JMP RESET1 FILLBUFF LXI D,CPMBUFF MVI B,128 ;FILL THE BUFFER WITH CPM MVI A,1AH ;END OF FILE CHARACTERS FILL2 STAX D ;ACCORDING TO CONVENTION INX D DCR B JNZ FILL2 RET PUTCPM PUSH H ;PUT ONE CHAR INTO CPM BUFFER PUSH D PUSH B STA TEMP LHLD CPMADDR MOV M,A INX H SHLD CPMADDR LDA CPMCNT INR A STA CPMCNT CPI 128 ;CHECK FOR FULL BUFFER CZ WRITECPM ;DUMP IT IF FULL CALL DISPLAY POP B POP D POP H RET FINISHED MVI C,0 ;GO TO CPM JMP BDOS CLOSECPM CALL WRITECPM LXI D,FCB MVI C,10H CALL BDOS ;CLOSE THE FILE RET OPENCPM LXI D,FCB MVI C,0FH CALL BDOS ;OPEN THE FILE INR A JNZ EXISTS ;FILE ALREADY EXISTS LDA TODOS ;FILE DOES NOT EXIST CPI 'C' ;THATS OK, IT IS TO CPM JZ MAKEIT ;CREATE A FILE NOTFND LXI D,NOFILE ;NO FILE ERR CALL PRINT JMP FINISHED MAKEIT LXI D,FCB ;CREATE A FILE MVI C,16H ;ON CPM CALL BDOS INR A JZ CPMERR ;NO ROOM TO CREATE ONE RET EXISTS LDA TODOS ;FILE ALREADY EXISTS CPI 'N' ;THATS OK BECAUSE COPY IT TO NS RZ LXI D,FCB ;COPYING IT TO CPM SO DELETE MVI C,13H ;THE EXISTING FILE AND MAKE CALL BDOS ;A NEW ONE JMP MAKEIT GETFCB LXI H,IBUF+2 ;GET ADDRESS OF INPUT LINE LDA IBUF+1 ;GET CHAR CNT FROM INPUT BUFFER ORA A JZ FINISHED ;QUIT IF NO NAME ENTERED MOV B,A MVI C,33 XRA A LXI D,FCB ;CLEAR THE FCB CLEARFCB STAX D INX D DCR C JNZ CLEARFCB PUSH H ;SAVE THE POSITION OF THE DRIVE NUMBER INX H ;CHECK FOR A COLON MOV A,M CPI ':' JNZ NOCOLON POP H MOV A,M ANI 1FH ;CONVERT A=1...P=16 STA FCB INX H INX H ;PASS THE COLON DCR B DCR B JMP GETNAME NOCOLON POP H GETNAME LXI D,FCB+1 MVI C,11 MVI A,20H ;BLANK OUT THE NAME CLEARNAME STAX D INX D DCR C JNZ CLEARNAME LXI D,FCB+1 MVI C,8 MOVENAME MOV A,M ;MOVE THE NAME TO THE FCB CPI '.' ;LOOK FOR THE PERIOD THAT SEPARATES JZ PERIOD ;THE NAME FROM THE TYPE CALL UPPERCASE STAX D INX D INX H DCR B ;DECREASE BYTE CNT IN INPUT BUFFER RZ DCR C JNZ MOVENAME MOV A,M CPI '.' JZ PERIOD DCR B RZ JMP CPMFILENAME PERIOD LXI D,TYPE INX H MVI C,3 MOVETYPE MOV A,M CALL UPPERCASE STAX D INX D INX H DCR B RZ DCR C JNZ MOVETYPE RET CPMFILENAME LXI D,ERRM4 CALL PRINT JMP FINISHED NSFILENAME LXI D,ERRM5 CALL PRINT JMP FINISHED UPPERCASE CPI 60H ;CONVERT LOWER TO UPPER CASE RC SBI 20H RET ; NORTH STAR IO ROUTINES OPENNS MVI A,1 ;DEFAULT DISK DRIVE STA DISK MVI C,12 ;CLEAR THE FILE NAME AREA MVI A,20H LXI D,FILE BLKFILL STAX D INX D DCR C JNZ BLKFILL LXI H,IBUF+2 ;SEARCH FOR THE NAME IN THE INPUT LINE ORA A JZ MESS8 LDA IBUF+1 ;CHAR COUNT IN INPUT BUFFER MOV B,A MFILE MVI C,9 LXI D,FILE FILL1 MOV A,M CPI ' ' JZ UPPER CPI ',' ;DRIVE NO IS ABOUT TO BE FOUND JZ LOOKU CALL UPPERCASE STAX D INX H INX D DCR B JZ UPPER DCR C JZ NSFILENAME JMP FILL1 LOOKU INX H ;GET THE DRIVE NO MOV A,M DCR B JZ UPPER CPI '1' JC NSFILENAME CPI '4'+1 JNC NSFILENAME ANI 0FH ;CONVERT TO BINARY STA DISK SINGLE EQU $ INX H UPPER LDA DISK ;SEE IF THE FILE EXISTS LXI H,FILE CALL DLOOK JC NOTFND MOV E,M ;GET DISK ADDRESS INX H MOV D,M ;GET REST OF DISK ADDRESS INX H MOV A,M ;GET BLOCK COUNT INR A ;INCREMENT BLOCK COUNT TO DECREMENT LA STA BLOCKS XCHG SHLD DISKADDR ;GET THE DISK ADDRESS MVI A,DENSITY ;SET THE TRUE DENSITY TO SINGLE CPI 'S' ;IF THIS WAS A DOUBLE DENSITY SYSTEM RZ ;BUT THE DISK IS SINGLE DENSITY LDA DBYTE ;CHECK TRUE DISK DENSITY ORA A RNZ ;SYSTEM=DOUBLE DEN AND DISK=DOUBLE DEN MVI A,'S' ;SYSTEM=DOUBLE DEN BUT DISK=SINGLE DEN STA TRUEDEN RET READNS LDA BLOCKS DCR A JZ EOFNS STA BLOCKS LHLD DISKADDR LDA TRUEDEN CPI 'S' JZ SINGDEN LDA DISK ORI 80H STA DISK SINGDEN LDA DISK MOV C,A MVI A,1 ;READ ONE BLOCK ON SINGLE DENSITY (256 CHAR) ;OR ONE SECTOR ON DOUBLE DENSITY (512) CHAR MVI B,1 ;READ OPERATION LXI D,NSBUFF CALL DCOM JC NSERR IOGOOD LHLD DISKADDR INX H SHLD DISKADDR RESET2 LXI H,NSBUFF SHLD NSADDR XRA A STA NSCNT STA NSCNT+1 RET EOFNS MVI A,01 STA EOF JMP RESET2 GETNS PUSH H ;GET ONE CHAR FROM NS BUFFER PUSH D PUSH B LHLD NSADDR MOV A,M STA TEMP INX H SHLD NSADDR LHLD NSCNT ;CHECK FOR BUFFER EMPTY INX H SHLD NSCNT MOV A,L ORA A JNZ GETNS2 LDA TRUEDEN CPI 'S' JZ GETNS3 MOV A,H ;CHECK FOR 2 BLOCKS IN DOUBLE DENSITY CPI 2 JNZ GETNS2 GETNS3 CZ READNS GETNS2 LDA EOFIND CPI 'B' ;EOF BY BLOCK COUNT? JZ GETNS1 LDA TEMP CPI 01 JNZ GETNS1 STA EOF GETNS1 LDA TEMP POP B POP D POP H RET WRITENS EQU $ LDA BLOCKS DCR A JZ EOFNS STA BLOCKS ;BLOCK EOF IF FILE TOO BIG LHLD DISKADDR LDA DISK MOV C,A MVI A,1 ;WRITE ONE BLOCK AT A TIME MVI B,0 ;WRITE OPERATION LXI D,NSBUFF CALL DCOM JNC IOGOOD JMP NSERR PUTNS PUSH H ;PUT ONE CHAR INTO NS BUFFER PUSH D PUSH B STA TEMP LHLD NSADDR MOV M,A INX H SHLD NSADDR LHLD NSCNT ;CHECK BUFFER FULL INX H SHLD NSCNT MOV A,L ORA A JNZ PUTNS1 LDA TRUEDEN CPI 'S' JZ PUTNS2 MOV A,H CPI 2 JNZ PUTNS1 PUTNS2 CALL WRITENS PUTNS1 CALL DISPLAY POP B POP D POP H RET CRLF DB 0DH,0AH,'$' DEST DB 'DESTINATION SYSTEM (C/N)? $' ERRM2 DB 'CPM IO ERROR$' ERRM4 DB 'CPM FILE NAME ERROR$' ERRM5 DB 'NORTH STAR FILE NAME ERROR$' ERRM3 DB 'NORTH STAR IO ERROR$' NOFILE DB 'FILE NOT FOUND$' SIGNONS DB 0CH,'INTERDOS REL 2.0 SINGLE DENSITY AT E900$' SIGNOND DB 0CH,'INTERDOS REL 2.O DOUBLE DENSITY AT E800$' BOOTMSG DB 'REBOOT NORTH STAR DOS (Y/N)? $' SRCCPM DB 'COPY FROM CP/M FILE TO NORTH STAR FILE$' SRCNS DB 'COPY FROM NORTH STAR FILE TO CP/M FILE$' LINEA DB 'CONVERSION FORMATS:$' LINE0 DB ' 0 - NO CONVERSION$' LINE1 DB ' 1 - SEC. TO ASM (NO #, TABS, CR+LF)$' LINE2 DB ' 2 - SEC. TO ED (NO #, CR+LF)$' LINE3 DB ' 3 - SEC. TO CPM BASIC (CR+LF)$' LINE4 DB ' 4 - NS BASIC TO CPM BASIC$' LINE5 DB ' 5 - CPM HEX FILE TO NS TYPE 2$' LINEB DB 'WHICH CONVERESION FORMAT DO YOU WANT? $' EOFMSG DB 'EOF USING 01 OR BLOCK COUNT (1/B)? $' VERMSG DB 'VERIFY ON CONSOLE (Y/N)? $' CPMFILE DB 'CPM FILE NAME? $' NSFILE DB 'NORTH STAR FILE NAME? $' MOUNT DB 'MOUNT DISKETTES AND ENTER RETURN$' ERRM1 DB 'INVALID OPTION AT THIS TIME$' TODOS DS 1 CNVRT DS 1 EOFIND DS 1 EOF DS 1 VERIFY DS 1 IBUF DB 20 DS 22 FCB DS 9 TYPE DS 3 DS 25 FILE DS 20 CPMCNT DS 1 DISK DS 1 DISKADDR DS 2 NSCNT DS 2 NSADDR DS 2 CPMADDR DS 2 BLOCKS DS 1 TRUEDEN DS 1 ;TRUE DENSITY SINCE THERE MAY BE A ;SINGLE DENSITY DISK ON A DOUBLE DENSITY ;SYSTEM TEMP DS 1 LAST DS 1 MPTY DS 2 ABCD DS 2 WXYZ DS 2 ;ABCD AND WXYZ WERE CHOSEN BECAUSE THE ;USAGE OF TEMP AND TEMP2 IN BACTOBAC ;CONFLICTED WITH USAGE IN THE REST OF THE ;PROGRAM STACK DS 50 NSBUFF DS 512 CPMBUFF EQU 80H * CONVERT NORTH STAR PACKED BASIC INTO ASCII BASIC FORMAT * THIS CONVERTS THE BINARY LINE NUMBER TO ASCII AND CONVERTS * THE TOKENS TO ASCII BASTOBAS EQU $ CALL RESET ;THIS CODE WAS TAKEN FROM THE NORTH STAR CALL READNS ;VERSION OF SECRTARY WORD PROCESSOR STRT1 CALL GETNS ;SKIP CNT CPI 01 JZ CLOSE2 CALL GETNS ;GET LINE NUMBER MOV C,A CALL GETNS MOV B,A CALL ASCII ;LINE NO TO ASCII LOAD1 CALL GETNS CPI 13 JZ EOFLN CPI 09AH JZ LNNO CPI 80 JNC DECOD CALL PUTCPM ;PUT THE CHAR INTO CPM BUFFER JMP LOAD1 LNNO CALL GETNS MOV C,A CALL GETNS MOV B,A CALL ASCII JMP LOAD1 EOFLN CALL PUTCPM ;PUT OUT CR MVI A,0AH CALL PUTCPM ;PUT OUT LF JMP STRT1 ;CONVERT BINARY LINE NO TO ASCII ASCII EQU $ ASCI2 XRA A STA LAST MOV H,B MOV L,C SHLD MPTY LXI H,10000 SHLD ABCD CALL DIVID LXI H,1000 SHLD ABCD CALL DIVID LXI H,100 SHLD ABCD CALL DIVID LXI H,10 SHLD ABCD CALL DIVID LDA MPTY CALL ASCX RET DIVID MVI E,0 LHLD MPTY SHLD WXYZ SB2 LXI B,WXYZ LXI H,ABCD XRA A LDAX B SBB M STAX B INX B INX H LDAX B SBB M STAX B JC NEG INR E PUSH H LHLD WXYZ SHLD MPTY POP H JMP SB2 NEG MOV A,E ASCX ADI '0' MOV D,A LDA LAST ORA A JNZ ZERO MOV A,D CPI '0' RZ STA LAST ZERO MOV A,D CALL PUTCPM RET ;REPLACE TOKEN WITH ASCII TEXT DECOD LXI H,BTAB MOV B,A CODE1 MOV A,M CPI 0FFH JZ CODE6 CPI 80H JNC CODE2 CODE3 INX H JMP CODE1 CODE2 CMP B JNZ CODE3 INX H CODE4 MOV A,M CPI 80H JNC CODE5 CALL PUTCPM INX H JMP CODE4 CODE6 MOV A,B CALL PUTCPM CODE5 JMP LOAD1 BTAB DB 80H DB 'LET' DB 81H DB 'FOR' DB 82H DB 'PRINT' DB 83H DB 'NEXT' DB 84H DB 'IF' DB 85H DB 'READ' DB 86H DB 'INPUT' DB 87H DB 'DATA' DB 88H DB 'GOTO' DB 89H DB 'GOSUB' DB 8AH DB 'RETURN' DB 8BH DB 'DIM' DB 8CH DB 'STOP' DB 8DH DB 'END' DB 8EH DB 'RESTORE' DB 8FH DB 'REM' DB 90H DB 'FN' DB 91H DB 'DEF' DB 92H DB '!' DB 93H DB 'ON' DB 94H DB 'OUT' DB 95H DB 'FILL' DB 96H DB 'EXIT' DB 97H DB 'OPEN' DB 98H DB 'CLOSE' DB 99H DB 'WRITE' DB 9BH DB 'CHAIN' DB 9CH DB 'LINE' DB 9DH DB 'DESTROY' DB 9EH DB 'CREATE' DB 9FH DB 'ERRSET' DB 0A0H DB 'RUN' DB 0A1H DB 'LIST' DB 0A2H DB 'MEMSET' DB 0A3H DB 'SCR' DB 0A4H DB 'AUTO' DB 0A5H DB 'LOAD' DB 0A6H DB 'CONT' DB 0A7H DB 'APPEND' DB 0A8H DB 'REN' DB 0A9H DB 'NSAVE' DB 0AAH DB 'SAVE' DB 0ABH DB 'BYE' DB 0ACH DB 'EDIT' DB 0ADH DB 'DEL' DB 0AEH DB 'PSIZE' DB 0AFH DB 'CAT' DB 0B0H DB 'STEP' DB 0B1H DB 'TO' DB 0B2H DB 'THEN' DB 0B3H DB 'TAB' DB 0B4H DB 'ELSE' DB 0B5H DB 'CHR$' DB 0B6H DB 'ASC' DB 0B7H DB 'VAL' DB 0B8H DB 'STR$' DB 0B9H DB 'NOENDMARK' DB 0BAH DB 'INCHAR' DB 0BBH DB 'FILE' DB 0E0H DB '(' DB 0E0H DB '[' DB 0E2H DB '*' DB 0E3H DB '+' DB 0E5H DB '-' DB 0E7H DB '/' DB 0ECH DB 'AND' DB 0EDH DB 'OR' DB 0EFH DB '>=' DB 0F0H DB '<=' DB 0F1H DB '<>' DB 0EFH DB '>=' DB 0F0H DB '=<' DB 0F4H DB '<' DB 0F5H DB '=' DB 0F6H DB '>' DB 0F7H DB 'NOT' DB 0E1H DB '^' DB 0C6H DB 'INT' DB 0CCH DB 'LEN' DB 0CDH DB 'CALL' DB 0CEH DB 'RND' DB 0CAH DB 'SGN' DB 0CBH DB 'SIN' DB 0C4H DB 'SQRT' DB 0D2H DB 'ATN' DB 0D8H DB 'FREE' DB 0D9H DB 'INP' DB 0DAH DB 'EXAM' DB 0DBH DB 'ABS' DB 0DCH DB 'COS' DB 0DDH DB 'LOG' DB 0DEH DB 'EXP' DB 0DFH DB 'TYP' DB 0FFH END 100H