home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol111 / interdos.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  18.9 KB  |  1,134 lines

  1.     TITLE    'INTERDOS: NORTH STAR/CPM FILE CONVERSIONS'
  2. ; THIS PROGRAM DOES THE NORTH STAR TO CP/M AND CP/M TO NORTH STAR FILE
  3. ; CONVERSIONS.  IT WILL BE NECESSARY FOR THE USER TO CHANGE THE NSBOOT
  4. ; ADDRESS AND DENSITY AS LISTED BELOW IN THE FOLLOWING TWO EQUATES.
  5. NSBOOT    EQU    0E800H        ;NEWER NS SYSTEMS USE E800, 
  6.                 ;OLDER SYSTEMS USE E900
  7. DENSITY    EQU    'D'        ;S-SINGLE DENSITY
  8.                 ;D-DOUBLE OR QUAD DENSITY
  9.  
  10. ; COPYRIGHT 1980, G. YOUNG, INC
  11. ; WRITTEN BY G. YOUNG, INC, PO BOX 3218, NORTH HOLLYWOOD, CA 91609
  12. ; MODIFIED 02/01/81
  13. DOS    EQU    2028H
  14. DLOOK    EQU    201CH        ;DIRECTORY LOOKUP
  15. DCOM    EQU    2022H        ;DISK IO
  16. DBYTE    EQU    202FH        ;ACTUAL DENSITY OF DISK
  17. BDOS    EQU    5
  18.     ORG    100H
  19. START    LXI    SP,STACK+50
  20.     MVI    A,DENSITY
  21.     CPI    'S'
  22.     JZ    SIGNON1
  23.     LXI    D,SIGNOND
  24.     JMP    SIGNON2
  25. SIGNON1    LXI    D,SIGNONS
  26. SIGNON2    CALL    PRINT
  27.     LXI    D,BOOTMSG    ;BOOT NORTH STAR DOS?
  28.     CALL    PRINT
  29.     CALL    INPUT
  30.     CPI    'Y'
  31.     JZ    NSBOOT        ;BOOT NS DOS
  32.     CALL    FILLBUFF
  33. MESS1    LXI    D,DEST        ;DESTINATION SYSTEM?
  34.     CALL    PRINT
  35.     CALL    INPUT
  36.     STA    TODOS
  37.     CPI    'N'        ;TO NORTH STAR
  38.     JZ    TONS
  39.     CPI    'C'        ;TO CP/M
  40.     JZ    TOCPM
  41.     JMP    MESS1
  42. TONS    LXI    D,SRCCPM    ;CONFIRM SOURCE ON CPM
  43.     CALL    PRINT
  44.     JMP    MESS2
  45. TOCPM    LXI    D,SRCNS        ;CONFIRM SOURCE ON NS
  46.     CALL    PRINT
  47. MESS2    LXI    D,LINEA        ;DISPLAY OPTIONAL CONVERSION
  48.     CALL    PRINT        ;ROUTINES
  49.     LXI    D,LINE0
  50.     CALL    PRINT
  51.     LXI    D,LINE1
  52.     CALL    PRINT
  53.     LXI    D,LINE2
  54.     CALL    PRINT
  55.     LXI    D,LINE3
  56.     CALL    PRINT
  57.     LXI    D,LINE4
  58.     CALL    PRINT
  59.     LXI    D,LINE5
  60.     CALL    PRINT
  61.     LXI    D,LINEB        ;ASK QUESTION ABOUT OPTION
  62.     CALL    PRINT
  63.     CALL    INPUT
  64.     STA    CNVRT
  65.     CPI    '0'
  66.     JC    MESS2
  67.     CPI    '5'+1
  68.     JNC    MESS2        ;REASK QUESTION IF BAD INPUT
  69. MESS3    LXI    D,EOFMSG    ;HOW TO DETECT EOF?
  70.     CALL    PRINT
  71.     CALL    INPUT
  72.     STA    EOFIND    
  73.     CPI    '1'        ;FIND AN 01 IN DATA
  74.     JZ    MESS4
  75.     CPI    'B'        ;STOP ON BLOCK COUNT
  76.     JNZ    MESS3        ;REPEAT MESSAGE IF INVALID
  77. MESS4    XRA    A        ;RESET EOF INDICATOR
  78.     STA    EOF
  79. MESS6    LXI    D,MOUNT        ;TYPE MOUNT MESSAGE
  80.     CALL    PRINT        ;DONE NOW SO THAT DISKS ARE LOADED
  81.     CALL    INPUT        ;WHEN FILE NAMES ARE ENTERED
  82. MESS7    LXI    D,CPMFILE    ;GET CPM FILE NAME
  83.     CALL    PRINT
  84.     CALL    INPUT
  85.     CALL    GETFCB        ;CREATE FCB
  86.     CALL    OPENCPM
  87. MESS8    LXI    D,NSFILE    ;GET NORTH STAR FILE NAME
  88.     CALL    PRINT
  89.     MVI    A,DENSITY    ;RESET THE TRUE DENSITY TO THE SYSTEM
  90.     STA    TRUEDEN        ;DENSITY. IT WILL LATER BE CHANGED IN
  91.                 ;OPENNS TO THE ACTUAL DISK DENSITY
  92.     CALL    INPUT
  93.     CALL    OPENNS
  94.     LXI    H,NSBUFF    ;GET ADDR OF NS BUFFER
  95.     SHLD    NSADDR
  96.     LXI    H,CPMBUFF    ;GET ADDR OF CPM BUFFER
  97.     SHLD    CPMADDR
  98.     XRA    A
  99.     STA    NSCNT        ;CLEAR CHARACTER COUNTER
  100.     STA    NSCNT+1
  101.     STA    CPMCNT        ;CLEAR CPM CHAR COUNTER
  102.     LDA    TODOS        ;CHECK DESTINATION
  103.     CPI    'N'
  104.     JZ    CPMTONS        ;CPM TO NS COPY
  105. NSTOCPM    LDA    CNVRT        ;CHECK THE CONVERSION OPTION
  106.     CPI    '0'        ;NO CONVERSTION
  107.     JZ    NONSCNVT    ;NO CONVERSION OF NS TO CPM
  108.     CPI    '1'        ;NS SECRTARY TO CPM ASM FILE
  109.     JZ    SECTOASM
  110.     CPI    '2'        ;NS SECRTARY TO CPM ED FILE
  111.     JZ    SECTOED
  112.     CPI    '3'        ;NS SECRTARY TO CPM BASIC FILE
  113.     JZ    SECTOBAS
  114.     CPI    '4'        ;NS BASIC TO CPM BASIC
  115.     JZ    BASTOBAS
  116.     JMP    ERR1        ;INVALID OPTION
  117. CPMTONS    LDA    CNVRT
  118.     CPI    '0'        ;CPM TO NS WITHOUT CONVERSION
  119.     JZ    NOCPMCNVT    ;DATA OR SECRTARY FILES
  120.     CPI    '5'        ;CPM HEX TO NS TYPE 2 FILES
  121.     JZ    HEXTO2
  122. ERR1    LXI    D,ERRM1
  123.     CALL    PRINT
  124.     JMP    MESS1
  125. CPMERR    LXI    D,ERRM2
  126.     CALL    PRINT
  127.     JMP    FINISHED
  128. NSERR    LXI    D,ERRM3
  129.     CALL    PRINT
  130.     JMP    FINISHED
  131. PRINT    PUSH    D
  132.     LXI    D,CRLF
  133.     MVI    C,9
  134.     CALL    BDOS
  135.     POP    D
  136. PRINT2    MVI    C,9
  137.     CALL    BDOS
  138.     RET
  139. INPUT    LXI    D,IBUF
  140.     MVI    C,0AH
  141.     CALL    BDOS
  142.     LDA    IBUF+2
  143.     RET
  144.  
  145. RESET    EQU    $        ;RESET POINTERS AND COUNTERS
  146.     XRA    A
  147.     STA    EOF        ;RESET EOF
  148.     STA    NSCNT        ;RESET CHAR COUNTERS
  149.     STA    NSCNT+1
  150.     STA    CPMCNT
  151.     LXI    H,NSBUFF    ;DEFINE BUFFER ADDRESSES
  152.     SHLD    NSADDR
  153.     LXI    H,CPMBUFF
  154.     SHLD    CPMADDR
  155.     RET
  156.  
  157.  
  158. * SECRTARY FORMAT AS REFERENCED HERE IS THE OLD SCS FORMAT
  159. * CONSISTING OF A LINE COUNT, 4 ASCII CHARACTERS FOR THE LINE
  160. * NUMBER, THE TEXT, AND A SINGLE CARRIAGE RETURN AT THE END
  161. * WITHOUT THE LINE FEED.
  162.  
  163. * CONVERT SECRTARY FORMAT TO ASCII BASIC FORMAT IE RETAIN THE
  164. * LINE NUMBERS, BUT DELETE THE CHARACTER COUNT AND ADD A LINE
  165. * FEED AFTER THE CARRIAGE RETURN
  166.  
  167. SECTOBAS    EQU    $
  168.     CALL    RESET
  169.     CALL    READNS
  170. NEXTLINE3    CALL    GETNS        ;GET THE NS CHAR COUNT
  171.     CPI    1        ;IS IT AN EOF?
  172.     JZ    CLOSE2        ;YES!!!
  173. COPY3    CALL    GETNS
  174.     CALL    PUTCPM
  175.     LDA    TEMP
  176.     CPI    0DH        ;END OF LINE?
  177.     JZ    ENDSTB        ;YES
  178.     JMP    COPY3
  179. ENDSTB    MVI    A,0AH        ;ADD THE LINEFEED
  180.     STA    TEMP
  181.     CALL    PUTCPM
  182.     JMP    NEXTLINE3
  183.  
  184. * CONVERT SECRTARY FORMAT TO ED FORMAT IE DELETE THE LINE NUMBERS,
  185. * DELETE THE CHARACTER COUNT ON EACH LINE, AND ADD A LINE FEED
  186. * AFTER THE CARRIAGE RETURN
  187.  
  188. SECTOED    EQU    $
  189.     CALL    RESET
  190.     CALL    READNS
  191. NEXTLINE4    CALL    GETNS
  192.     CPI    1        ;EOF
  193.     JZ    CLOSE2
  194.     CALL    GETNS        ;GET LINE# CHAR 1
  195.     CALL    GETNS        ;GET LINE# CHAR 2
  196.     CALL    GETNS        ;GET LINE# CHAR 3
  197.     CALL    GETNS        ;GET LINE# CHAR 4
  198. COPY4    CALL    GETNS
  199.     CALL    PUTCPM
  200.     CPI    0DH        ;END OF LINE??
  201.     JNZ    COPY4
  202. ENDSTE    MVI    A,0AH
  203.     STA    TEMP
  204.     CALL    PUTCPM
  205.     JMP    NEXTLINE4
  206.  
  207. * NS SECRTARY TO CPM ASSEMBLER FORMAT
  208. * THIS IS SIMILAR TO NS SECRTARY TO ED FORMAT EXCEPT
  209. * THIS CHANGES CERTAIN BLANKS TO TABS
  210. SECTOASM    EQU    $
  211.     CALL    RESET
  212.     CALL    READNS        ;GET ONE NS BUFFER
  213. COPY2    CALL    GETNS        ;GET CHAR/LINE COUNT
  214.     CPI    1        ;EOF?
  215.     JZ    CLOSE2        ;YES, EOF FOUND
  216.     CALL    GETNS        ;GET LINE # CHAR 1
  217.     CALL    GETNS        ;GET LINE # CHAR 2
  218.     CALL    GETNS        ;GET LINE # CHAR 3
  219.     CALL    GETNS        ;1ST CHAR AFTER LINE IS ALWAYS BLANK
  220.     CALL    GETNS        ;GET LINE # CHAR 4
  221.     CALL    GETNS        ;GET FIRST CHAR OF THE LINE
  222.     CPI    20H        ;IS IT A SPACE
  223.     JNZ    LABEL2        ;NO, IT MUST BE A LABEL THEN
  224.     MVI    A,09
  225.     STA    TEMP        ;REPLACE SPACE WITH A TAB
  226.     CALL    PUTCPM
  227.     JMP    OPCODE
  228. LABEL2    CALL    PUTCPM        ;COPY THE LABEL
  229.     CALL    GETNS        ;GET NEXT CHAR OF LABEL
  230.     CPI    20H        ;LABEL DONE?
  231.     JNZ    LABEL2
  232. TAB2    MVI    A,09        ;REPLACE THE SPACE BETWEEN THE LABEL
  233.     STA    TEMP        ;AND THE OPCODE WITH A TAB
  234.     CALL    PUTCPM
  235. OPCODE    CALL    GETNS        ;COPY THE OPCODE
  236.     CPI    20H
  237.     JZ    TAB3
  238.     CPI    0DH        ;CARRIAGE RETURN?
  239.     JZ    ENDLINE
  240. OPCODE2    CALL    PUTCPM
  241.     JMP    OPCODE
  242. TAB3    MVI    A,09        ;REPLACE THE SPACE BETWEEN THE
  243.     STA    TEMP        ;OPCODE AND THE OPERAND WITH A TAB
  244.     CALL    PUTCPM
  245. OPERAND    CALL    GETNS
  246.     CPI    0DH
  247.     JZ    ENDLINE
  248.     CPI    20H
  249.     JZ    TAB4
  250.     CALL    PUTCPM        ;COPY THE OPERAND
  251.     JMP    OPERAND
  252. TAB4    MVI    A,09        ;REPLACE THE SPACE BETWEEN THE
  253.     STA    TEMP        ;OPERAND AND THE COMMENT
  254.     CALL    PUTCPM
  255. COMMENT    CALL    GETNS        ;COPY THE REST OF THE LINE
  256.     CPI    0DH
  257.     JZ    ENDLINE
  258.     CALL    PUTCPM
  259.     JMP    COMMENT
  260. ENDLINE    MVI    A,0DH        ;REPLACE THE SINGLE CARRIAGE
  261.     STA    TEMP        ;RETURN WITH A CARRIAGE RETURN/LINE FEED
  262.     CALL    PUTCPM
  263.     MVI    A,0AH        ;"DISPLAY" PUTS IN ITS OWN LINE FEED
  264.     STA    TEMP        ;SO IT DOES NOT HAVE TO BE CALLED
  265.     CALL    PUTCPM        ;TO PRINT THIS CHARACTER
  266.     JMP    COPY2
  267. CLOSE2    CALL    CLOSECPM
  268.     JMP    MESS7
  269.  
  270. * COPY FILES FROM NORTH STAR TO CPM WITHOUT ANY CONVERSION
  271.  
  272. NONSCNVT    EQU    $    ;COPY NS TO CPM WITHOUT CONVERSION
  273.     CALL    RESET
  274.     CALL    READNS
  275. COPY1    CALL    GETNS        ;GET ONE CHAR FROM NS
  276.     CALL    PUTCPM        ;PUT ONE CHAR INTO CPM BUFFER
  277.     LDA    EOF        ;CHECK FOR EOF
  278.     ORA    A
  279.     JZ    COPY1
  280.     CALL    CLOSECPM
  281.     JMP    MESS7
  282.  
  283.  
  284. * COPY CPM HEX FILE TO NS TYPE 2 FILE
  285. * ASSUME THAT THE ADDRESS OF THE TYPE 2 FILE CORRESPONDS
  286. * TO THE HEX ADDRESSES
  287.  
  288. HEXTO2    CALL    RESET
  289.     XRA    A
  290.     STA    LAST
  291.     CALL    READCPM
  292. COLON    MVI    E,0
  293.     MVI    C,0
  294.     CALL    GETCPM        ;GET THE COLON
  295.     CPI    ':'
  296.     JNZ    NOTHEX
  297.     CALL    GETBYTE        ;GET THE COUNT
  298.     ORA    A
  299.     JZ    CLOSENS        ;END WHEN BYTE COUNT IS ZERO
  300.     MOV    C,A        ;SAVE COUNT
  301.     CALL    GETBYTE        ;SKIP THE ADDRESS
  302.     STA    ABCD+1
  303.     CALL    GETBYTE        ;SKIP THE ADDRESS BYTE 2
  304.     STA    ABCD        ;SAVE THE ADDRESS
  305.     LDA    LAST        ;IS THIS THE FIRST ADDRESS
  306.     ORA    A    
  307.     JNZ    CHECKADDR    ;NO, SKIP INITIALIZATION
  308.     MVI    A,1        ;YES, INIT LAST ADDR
  309.     STA    LAST
  310.     LHLD    ABCD
  311.     SHLD    WXYZ
  312. CHECKADDR LHLD    ABCD
  313.     XCHG            ;DE=CURRENT ADDR
  314.     LHLD    WXYZ        ;HL=LAST ADDR
  315.     MOV    A,D        ;COMPARE FOR EQUAL
  316.     CMP    H
  317.     JNZ    ADDRGAP        ;THERE IS A GAP IN THE ADDRESSES
  318.     MOV    A,E
  319.     CMP    L
  320.     JZ    ADDROK        ;NO GAP IN ADDRESSES
  321. ADDRGAP MVI    A,00        ;FILL GAP WITH LOW VALUES
  322.     CALL    PUTNS
  323.     LHLD    WXYZ
  324.     INX    H
  325.     SHLD    WXYZ
  326.     JMP    CHECKADDR
  327. ADDROK    EQU    $
  328.     CALL    GETBYTE        ;SKIP THE TYPE BYTE
  329. NEXTHEX    CALL    GETBYTE
  330.     CALL    PUTNS
  331.     LHLD    WXYZ        ;INCREMENT LAST ADDRESS SO THAT
  332.     INX    H        ;IT WILL BE EQUAL TO THE NEXT ADDR
  333.     SHLD    WXYZ        ;WHEN THE NEXT ADDR IS READ
  334.     DCR    C
  335.     JNZ    NEXTHEX
  336.     CALL    GETBYTE        ;SKIP THE CHECKSUM
  337.     CALL    GETCPM        ;SKIP CR
  338.     CALL    GETCPM        ;SKIP LF
  339.     JMP    COLON
  340. CLOSENS    CALL    CLOSECPM
  341.     CALL    WRITENS
  342.     JMP    MESS7
  343. NOTHEX    LXI    D,HEXMSG
  344.     CALL    PRINT
  345.     JMP    MESS7
  346. HEXMSG    DB    'THIS IS NOT A HEX FILE$'
  347. GETBYTE    PUSH    H        ;CONVERT TWO ASCII CHARACTERS INTO
  348.     PUSH    B        ;ONE BINARY BYTE
  349.     LXI    H,0
  350.     MVI    C,3        ;TWO CHARACTERS
  351. HEX    DCR    C
  352.     JZ    FINI
  353.     CALL    GETCPM
  354.     DAD    H        ;SHIFT LEFT
  355.     DAD    H
  356.     DAD    H
  357.     DAD    H
  358.     CALL    AHS1
  359.     CPI    10H
  360.     CMC
  361.     JC    FINI
  362.     ADD    L
  363.     MOV    L,A
  364.     JMP    HEX
  365. FINI    POP    B
  366.     POP    H
  367.     RET
  368. AHS1    SUI    48
  369.     CPI    10
  370.     RC
  371.     SUI    7
  372.     RET
  373.  
  374.  
  375. * COPY CPM FILE TO NORTH STAR WITHOUT CONVERSION
  376.  
  377. NOCPMCNVT    EQU    $
  378.     CALL    RESET
  379.     CALL    READCPM
  380. COPY6    CALL    GETCPM
  381.     CALL    PUTNS
  382.     LDA    EOF
  383.     ORA    A
  384.     JZ    COPY6
  385.     JMP    CLOSENS
  386.  
  387.  
  388.  
  389.  
  390. DISPLAY    LDA    TEMP        ;GET CHAR TO DISPLAY
  391.     CPI    13
  392.     JZ    TYPECR
  393.     CPI    20H
  394.     JZ    TYPEIT
  395.     RC
  396.     CPI    7FH
  397.     RNC
  398. TYPEIT    MOV    E,A
  399.     MVI    C,2
  400.     CALL    BDOS        ;CONSOLE OUTPUT
  401.     RET
  402. TYPECR    LXI    D,CRLF
  403.     JMP    PRINT2
  404.  
  405.  
  406. ; CP/M IO ROUTINES
  407.  
  408. READCPM    LXI    D,CPMBUFF
  409.     MVI    C,1AH        ;SET DMA
  410.     CALL    BDOS
  411.     LXI    D,FCB
  412.     MVI    C,14H
  413.     CALL    BDOS        ;SEQUENTIAL READ
  414.     INR    A
  415.     JZ    EOFCPM
  416. RESET1    LXI    H,CPMBUFF    ;RESET BUFFER ADDR
  417.     SHLD    CPMADDR
  418.     XRA    A        ;RESET BYTE COUNT
  419.     STA    CPMCNT
  420.     RET
  421. EOFCPM    MVI    A,01
  422.     STA    EOF
  423.     JMP    RESET1
  424.  
  425. GETCPM    PUSH    H
  426.     PUSH    D
  427.     PUSH    B
  428.     LHLD    CPMADDR        ;GET ONE CHAR FROM CPM BUFFER
  429.     MOV    A,M
  430.     STA    TEMP
  431.     INX    H
  432.     SHLD    CPMADDR
  433.     LDA    CPMCNT
  434.     INR    A
  435.     STA    CPMCNT        ;INCREMENT COUNTER AND ADDRESS
  436.     CPI    128        ;CHECK FOR EMPTY BUFFER
  437.     CZ    READCPM        ;REFILL BUFFER
  438.     LDA    EOFIND
  439.     CPI    'B'
  440.     JZ    GETCPM1        ;SEE IF EOF DEPENDED ON 01 OB BLOCK CNT
  441.     LDA    TEMP        ;WAS CHAR READ AN EOF INDICATOR 01
  442.     CPI    01
  443.     JNZ    GETCPM1        ;NO
  444.     STA    EOF
  445. GETCPM1    LDA    TEMP
  446.     POP    B
  447.     POP    D
  448.     POP     H
  449.     RET            ;YES, SET INDICATOR ON
  450.  
  451. WRITECPM    LXI    D,FCB    ;WRITE ONE CPM BUFFER FULL
  452.     MVI    C,15H        ;WRITE SEQUENTILA
  453.     CALL    BDOS
  454.     INR    A
  455.     JZ    CPMERR        ;PROBABLY DISK FULL
  456.     CALL    FILLBUFF
  457.     JMP    RESET1
  458. FILLBUFF    LXI    D,CPMBUFF
  459.     MVI    B,128        ;FILL THE BUFFER WITH CPM 
  460.     MVI    A,1AH        ;END OF FILE CHARACTERS
  461. FILL2    STAX    D        ;ACCORDING TO CONVENTION
  462.     INX    D
  463.     DCR    B
  464.     JNZ    FILL2
  465.     RET
  466.  
  467. PUTCPM    PUSH    H        ;PUT ONE CHAR INTO CPM BUFFER
  468.     PUSH    D
  469.     PUSH    B
  470.     STA    TEMP
  471.     LHLD    CPMADDR
  472.     MOV    M,A
  473.     INX    H
  474.     SHLD    CPMADDR
  475.     LDA    CPMCNT
  476.     INR    A
  477.     STA    CPMCNT
  478.     CPI    128        ;CHECK FOR FULL BUFFER
  479.     CZ    WRITECPM    ;DUMP IT IF FULL
  480.     CALL    DISPLAY
  481.     POP    B
  482.     POP    D
  483.     POP    H
  484.     RET
  485.  
  486.  
  487. FINISHED    MVI    C,0    ;GO TO CPM
  488.     JMP    BDOS
  489.  
  490.  
  491. CLOSECPM    CALL    WRITECPM
  492.     LXI    D,FCB
  493.     MVI    C,10H
  494.     CALL    BDOS        ;CLOSE THE FILE
  495.     RET
  496.  
  497.  
  498. OPENCPM    LXI    D,FCB
  499.     MVI    C,0FH
  500.     CALL    BDOS        ;OPEN THE FILE
  501.     INR    A
  502.     JNZ    EXISTS        ;FILE ALREADY EXISTS
  503.     LDA    TODOS        ;FILE DOES NOT EXIST
  504.     CPI    'C'        ;THATS OK, IT IS TO CPM
  505.     JZ    MAKEIT        ;CREATE A FILE
  506. NOTFND    LXI    D,NOFILE    ;NO FILE ERR
  507.     CALL    PRINT
  508.     JMP    FINISHED
  509. MAKEIT    LXI    D,FCB        ;CREATE A FILE
  510.     MVI    C,16H        ;ON CPM
  511.     CALL    BDOS
  512.     INR    A
  513.     JZ    CPMERR        ;NO ROOM TO CREATE ONE
  514.     RET
  515. EXISTS    LDA    TODOS        ;FILE ALREADY EXISTS
  516.     CPI    'N'        ;THATS OK BECAUSE COPY IT TO NS
  517.     RZ
  518.     LXI    D,FCB        ;COPYING IT TO CPM SO DELETE
  519.     MVI    C,13H        ;THE EXISTING FILE AND MAKE
  520.     CALL    BDOS        ;A NEW ONE
  521.     JMP    MAKEIT
  522. GETFCB    LXI    H,IBUF+2    ;GET ADDRESS OF INPUT LINE
  523.     LDA    IBUF+1        ;GET CHAR CNT FROM INPUT BUFFER
  524.     ORA    A
  525.     JZ    FINISHED    ;QUIT IF NO NAME ENTERED
  526.     MOV    B,A
  527.     MVI    C,33
  528.     XRA    A
  529.     LXI    D,FCB        ;CLEAR THE FCB
  530. CLEARFCB    STAX    D
  531.     INX    D
  532.     DCR    C
  533.     JNZ    CLEARFCB
  534.     PUSH    H        ;SAVE THE POSITION OF THE DRIVE NUMBER
  535.     INX    H        ;CHECK FOR A COLON
  536.     MOV    A,M
  537.     CPI    ':'
  538.     JNZ    NOCOLON
  539.     POP    H
  540.     MOV    A,M
  541.     ANI    1FH        ;CONVERT A=1...P=16
  542.     STA    FCB
  543.     INX    H
  544.     INX    H        ;PASS THE COLON
  545.     DCR    B
  546.     DCR    B
  547.     JMP    GETNAME
  548. NOCOLON    POP    H
  549. GETNAME    LXI    D,FCB+1
  550.     MVI    C,11
  551.     MVI    A,20H        ;BLANK OUT THE NAME
  552. CLEARNAME    STAX    D
  553.     INX    D
  554.     DCR    C
  555.     JNZ    CLEARNAME
  556.     LXI    D,FCB+1
  557.     MVI    C,8
  558. MOVENAME    MOV    A,M    ;MOVE THE NAME TO THE FCB
  559.     CPI    '.'        ;LOOK FOR THE PERIOD THAT SEPARATES
  560.     JZ    PERIOD        ;THE NAME  FROM THE TYPE
  561.     CALL     UPPERCASE
  562.     STAX    D
  563.     INX    D
  564.     INX    H
  565.     DCR    B        ;DECREASE BYTE CNT IN INPUT BUFFER
  566.     RZ
  567.     DCR    C
  568.     JNZ    MOVENAME
  569.     MOV    A,M
  570.     CPI    '.'
  571.     JZ    PERIOD
  572.     DCR    B
  573.     RZ
  574.     JMP    CPMFILENAME
  575. PERIOD    LXI    D,TYPE
  576.     INX    H
  577.     MVI    C,3
  578. MOVETYPE    MOV    A,M
  579.     CALL    UPPERCASE
  580.     STAX    D
  581.     INX    D
  582.     INX    H
  583.     DCR    B
  584.     RZ
  585.     DCR    C
  586.     JNZ    MOVETYPE
  587.     RET
  588. CPMFILENAME    LXI    D,ERRM4
  589.     CALL    PRINT
  590.     JMP    FINISHED
  591. NSFILENAME    LXI    D,ERRM5
  592.     CALL    PRINT
  593.     JMP    FINISHED
  594. UPPERCASE    CPI    60H    ;CONVERT LOWER TO UPPER CASE
  595.     RC
  596.     SBI    20H
  597.     RET
  598.  
  599.  
  600. ; NORTH STAR IO ROUTINES
  601.  
  602. OPENNS    MVI    A,1        ;DEFAULT DISK DRIVE
  603.     STA    DISK
  604.     MVI    C,12        ;CLEAR THE FILE NAME AREA
  605.     MVI    A,20H
  606.     LXI    D,FILE
  607. BLKFILL    STAX    D
  608.     INX    D
  609.     DCR    C
  610.     JNZ    BLKFILL
  611.     LXI    H,IBUF+2    ;SEARCH FOR THE NAME IN THE INPUT LINE
  612.     ORA    A
  613.     JZ    MESS8
  614.     LDA    IBUF+1        ;CHAR COUNT IN INPUT BUFFER
  615.     MOV    B,A
  616. MFILE    MVI    C,9
  617.     LXI    D,FILE
  618. FILL1    MOV    A,M
  619.     CPI    ' '
  620.     JZ    UPPER
  621.     CPI    ','        ;DRIVE NO IS ABOUT TO BE FOUND
  622.     JZ    LOOKU
  623.     CALL    UPPERCASE
  624.     STAX    D
  625.     INX    H
  626.     INX    D
  627.     DCR    B
  628.     JZ    UPPER
  629.     DCR    C
  630.     JZ    NSFILENAME
  631.     JMP    FILL1
  632. LOOKU    INX    H        ;GET THE DRIVE NO
  633.     MOV    A,M
  634.     DCR    B
  635.     JZ    UPPER
  636.     CPI    '1'
  637.     JC    NSFILENAME
  638.     CPI    '4'+1
  639.     JNC    NSFILENAME
  640.     ANI    0FH        ;CONVERT TO BINARY
  641.     STA    DISK
  642. SINGLE    EQU    $
  643.     INX    H
  644. UPPER    LDA    DISK        ;SEE IF THE FILE EXISTS
  645.     LXI    H,FILE
  646.     CALL    DLOOK
  647.     JC    NOTFND
  648.     MOV    E,M        ;GET DISK ADDRESS
  649.     INX    H
  650.     MOV    D,M        ;GET REST OF DISK ADDRESS
  651.     INX    H
  652.     MOV    A,M        ;GET BLOCK COUNT
  653.     INR    A        ;INCREMENT BLOCK COUNT TO DECREMENT LA
  654.     STA    BLOCKS
  655.     XCHG
  656.     SHLD    DISKADDR    ;GET THE DISK ADDRESS
  657.     MVI    A,DENSITY    ;SET THE TRUE DENSITY TO SINGLE
  658.     CPI    'S'        ;IF THIS WAS A DOUBLE DENSITY SYSTEM
  659.     RZ            ;BUT THE DISK IS SINGLE DENSITY
  660.     LDA    DBYTE        ;CHECK TRUE DISK DENSITY
  661.     ORA    A
  662.     RNZ            ;SYSTEM=DOUBLE DEN AND DISK=DOUBLE DEN
  663.     MVI    A,'S'        ;SYSTEM=DOUBLE DEN BUT DISK=SINGLE DEN
  664.     STA    TRUEDEN
  665.     RET
  666.  
  667. READNS    LDA    BLOCKS
  668.     DCR    A
  669.     JZ    EOFNS
  670.     STA    BLOCKS
  671.     LHLD    DISKADDR
  672.     LDA    TRUEDEN
  673.     CPI    'S'
  674.     JZ    SINGDEN
  675.     LDA    DISK
  676.     ORI    80H
  677.     STA    DISK
  678. SINGDEN    LDA    DISK
  679.     MOV    C,A
  680.     MVI    A,1        ;READ ONE BLOCK ON SINGLE DENSITY (256 CHAR)
  681.                 ;OR ONE SECTOR ON DOUBLE DENSITY (512) CHAR
  682.     MVI    B,1        ;READ OPERATION
  683.     LXI    D,NSBUFF
  684.     CALL    DCOM
  685.     JC    NSERR
  686. IOGOOD    LHLD    DISKADDR
  687.     INX    H
  688.     SHLD    DISKADDR
  689. RESET2    LXI    H,NSBUFF
  690.     SHLD    NSADDR
  691.     XRA    A
  692.     STA    NSCNT
  693.     STA    NSCNT+1
  694.     RET
  695. EOFNS    MVI    A,01
  696.     STA    EOF
  697.     JMP    RESET2
  698.  
  699. GETNS    PUSH    H        ;GET ONE CHAR FROM NS BUFFER
  700.     PUSH    D
  701.     PUSH    B
  702.     LHLD    NSADDR
  703.     MOV    A,M
  704.     STA    TEMP
  705.     INX    H
  706.     SHLD    NSADDR
  707.     LHLD    NSCNT        ;CHECK FOR BUFFER EMPTY
  708.     INX    H
  709.     SHLD    NSCNT
  710.     MOV    A,L
  711.     ORA    A
  712.     JNZ    GETNS2
  713.     LDA    TRUEDEN
  714.     CPI    'S'
  715.     JZ    GETNS3
  716.     MOV    A,H        ;CHECK FOR 2 BLOCKS IN DOUBLE DENSITY
  717.     CPI    2
  718.     JNZ    GETNS2
  719. GETNS3    CZ    READNS
  720. GETNS2    LDA    EOFIND
  721.     CPI    'B'        ;EOF BY BLOCK COUNT?
  722.     JZ    GETNS1
  723.     LDA    TEMP
  724.     CPI    01
  725.     JNZ    GETNS1
  726.     STA    EOF
  727. GETNS1    LDA    TEMP
  728.     POP    B
  729.     POP    D
  730.     POP    H
  731.     RET
  732.  
  733. WRITENS    EQU    $
  734.     LDA    BLOCKS
  735.     DCR    A
  736.     JZ    EOFNS
  737.     STA    BLOCKS        ;BLOCK EOF IF FILE TOO BIG
  738.     LHLD    DISKADDR
  739.     LDA    DISK
  740.     MOV    C,A
  741.     MVI    A,1        ;WRITE ONE BLOCK AT A TIME
  742.     MVI    B,0        ;WRITE OPERATION
  743.     LXI    D,NSBUFF
  744.     CALL    DCOM
  745.     JNC    IOGOOD
  746.     JMP    NSERR
  747.  
  748. PUTNS    PUSH    H        ;PUT ONE CHAR INTO NS BUFFER
  749.     PUSH    D
  750.     PUSH    B
  751.     STA    TEMP
  752.     LHLD    NSADDR
  753.     MOV    M,A
  754.     INX    H
  755.     SHLD    NSADDR
  756.     LHLD    NSCNT        ;CHECK BUFFER FULL
  757.     INX    H
  758.     SHLD    NSCNT
  759.     MOV    A,L
  760.     ORA    A
  761.     JNZ    PUTNS1
  762.     LDA    TRUEDEN
  763.     CPI    'S'
  764.     JZ    PUTNS2
  765.     MOV    A,H
  766.     CPI    2
  767.     JNZ    PUTNS1
  768. PUTNS2    CALL    WRITENS
  769. PUTNS1    CALL    DISPLAY
  770.     POP    B
  771.     POP    D
  772.     POP    H
  773.     RET
  774. CRLF    DB    0DH,0AH,'$'
  775. DEST    DB    'DESTINATION SYSTEM (C/N)? $'
  776. ERRM2    DB    'CPM IO ERROR$'
  777. ERRM4    DB    'CPM FILE NAME ERROR$'
  778. ERRM5    DB    'NORTH STAR FILE NAME ERROR$'
  779. ERRM3    DB    'NORTH STAR IO ERROR$'
  780. NOFILE    DB    'FILE NOT FOUND$'
  781. SIGNONS    DB    0CH,'INTERDOS REL 2.0 SINGLE DENSITY AT E900$'
  782. SIGNOND DB    0CH,'INTERDOS REL 2.O DOUBLE DENSITY AT E800$'
  783. BOOTMSG    DB    'REBOOT NORTH STAR DOS (Y/N)? $'
  784. SRCCPM    DB    'COPY FROM CP/M FILE TO NORTH STAR FILE$'
  785. SRCNS    DB    'COPY FROM NORTH STAR FILE TO CP/M FILE$'
  786. LINEA    DB    'CONVERSION FORMATS:$'
  787. LINE0    DB    '  0 - NO CONVERSION$'
  788. LINE1    DB    '  1 - SEC. TO ASM (NO #, TABS, CR+LF)$'
  789. LINE2    DB    '  2 - SEC. TO ED  (NO #, CR+LF)$'
  790. LINE3    DB    '  3 - SEC. TO CPM BASIC (CR+LF)$'
  791. LINE4    DB    '  4 - NS BASIC TO CPM BASIC$'
  792. LINE5    DB    '  5 - CPM HEX FILE TO NS TYPE 2$'
  793. LINEB    DB    'WHICH CONVERESION FORMAT DO YOU WANT? $'
  794. EOFMSG    DB    'EOF USING 01 OR BLOCK COUNT (1/B)? $'
  795. VERMSG    DB    'VERIFY ON CONSOLE (Y/N)? $'
  796. CPMFILE    DB    'CPM FILE NAME? $'
  797. NSFILE    DB    'NORTH STAR FILE NAME? $'
  798. MOUNT    DB    'MOUNT DISKETTES AND ENTER RETURN$'
  799. ERRM1    DB    'INVALID OPTION AT THIS TIME$'
  800. TODOS    DS    1
  801. CNVRT    DS    1
  802. EOFIND    DS    1
  803. EOF    DS    1
  804. VERIFY    DS    1
  805. IBUF    DB    20
  806.     DS    22
  807. FCB    DS    9
  808. TYPE    DS    3
  809.     DS    25
  810. FILE    DS    20
  811. CPMCNT    DS    1
  812. DISK    DS    1
  813. DISKADDR    DS    2
  814. NSCNT    DS    2
  815. NSADDR    DS    2
  816. CPMADDR    DS    2
  817. BLOCKS    DS    1
  818. TRUEDEN    DS    1        ;TRUE DENSITY SINCE THERE MAY BE A
  819.                 ;SINGLE DENSITY DISK ON A DOUBLE DENSITY
  820.                 ;SYSTEM
  821. TEMP    DS    1
  822. LAST    DS    1
  823. MPTY    DS    2
  824. ABCD    DS    2
  825. WXYZ    DS    2        ;ABCD AND WXYZ WERE CHOSEN BECAUSE THE
  826.                 ;USAGE OF TEMP AND TEMP2 IN BACTOBAC
  827.                 ;CONFLICTED WITH USAGE IN THE REST OF THE
  828.                 ;PROGRAM
  829. STACK    DS    50
  830. NSBUFF    DS    512
  831. CPMBUFF    EQU    80H
  832.  
  833.  
  834. * CONVERT NORTH STAR PACKED BASIC INTO ASCII BASIC FORMAT
  835. * THIS CONVERTS THE BINARY LINE NUMBER TO ASCII AND CONVERTS
  836. * THE TOKENS TO ASCII
  837.  
  838. BASTOBAS EQU    $
  839.     CALL    RESET        ;THIS CODE WAS TAKEN FROM THE NORTH STAR
  840.     CALL    READNS        ;VERSION OF SECRTARY WORD PROCESSOR
  841. STRT1    CALL    GETNS     ;SKIP CNT
  842.     CPI    01
  843.     JZ    CLOSE2
  844.     CALL    GETNS    ;GET LINE NUMBER
  845.     MOV    C,A
  846.     CALL    GETNS
  847.     MOV    B,A
  848.     CALL    ASCII    ;LINE NO TO ASCII
  849. LOAD1    CALL    GETNS
  850.     CPI    13
  851.     JZ    EOFLN
  852.     CPI    09AH
  853.     JZ    LNNO
  854.     CPI    80
  855.     JNC    DECOD
  856.     CALL    PUTCPM        ;PUT THE CHAR INTO CPM BUFFER
  857.     JMP    LOAD1
  858. LNNO    CALL    GETNS
  859.     MOV    C,A
  860.     CALL    GETNS
  861.     MOV    B,A
  862.     CALL    ASCII
  863.     JMP    LOAD1
  864. EOFLN    CALL    PUTCPM    ;PUT OUT CR
  865.     MVI    A,0AH
  866.     CALL    PUTCPM    ;PUT OUT LF
  867.     JMP    STRT1
  868. ;CONVERT    BINARY    LINE    NO TO ASCII
  869. ASCII    EQU    $
  870. ASCI2    XRA    A
  871.     STA    LAST
  872.     MOV    H,B
  873.     MOV    L,C
  874.     SHLD    MPTY
  875.     LXI    H,10000
  876.     SHLD    ABCD
  877.     CALL    DIVID
  878.     LXI    H,1000
  879.     SHLD    ABCD
  880.     CALL    DIVID
  881.     LXI    H,100
  882.     SHLD    ABCD
  883.     CALL    DIVID
  884.     LXI    H,10
  885.     SHLD    ABCD
  886.     CALL    DIVID
  887.     LDA    MPTY
  888.     CALL    ASCX
  889.     RET
  890. DIVID    MVI    E,0
  891.     LHLD    MPTY
  892.     SHLD    WXYZ
  893. SB2    LXI    B,WXYZ
  894.     LXI    H,ABCD
  895.     XRA    A
  896.     LDAX    B
  897.     SBB    M
  898.     STAX    B
  899.     INX    B
  900.     INX    H
  901.     LDAX    B
  902.     SBB    M
  903.     STAX    B
  904.     JC    NEG
  905.     INR    E
  906.     PUSH    H
  907.     LHLD    WXYZ
  908.     SHLD    MPTY
  909.     POP    H
  910.     JMP    SB2
  911. NEG    MOV    A,E
  912. ASCX    ADI    '0'
  913.     MOV    D,A
  914.     LDA    LAST
  915.     ORA    A
  916.     JNZ    ZERO
  917.     MOV    A,D
  918.     CPI    '0'
  919.     RZ
  920.     STA    LAST
  921. ZERO    MOV    A,D
  922.     CALL    PUTCPM
  923.     RET
  924. ;REPLACE    TOKEN    WITH    ASCII TEXT
  925. DECOD    LXI    H,BTAB
  926.     MOV    B,A
  927. CODE1    MOV    A,M
  928.     CPI    0FFH
  929.     JZ    CODE6
  930.     CPI    80H
  931.     JNC    CODE2
  932. CODE3    INX    H
  933.     JMP    CODE1
  934. CODE2    CMP    B
  935.     JNZ    CODE3
  936.     INX     H
  937. CODE4    MOV    A,M
  938.     CPI    80H
  939.     JNC    CODE5
  940.     CALL    PUTCPM
  941.     INX    H
  942.     JMP    CODE4
  943. CODE6    MOV    A,B
  944.     CALL    PUTCPM
  945. CODE5    JMP    LOAD1
  946. BTAB    DB    80H
  947.     DB    'LET'
  948.     DB    81H
  949.     DB    'FOR'
  950.     DB    82H
  951.     DB    'PRINT'
  952.     DB    83H
  953.     DB    'NEXT'
  954.     DB    84H
  955.     DB    'IF'
  956.     DB    85H
  957.     DB    'READ'
  958.     DB    86H
  959.     DB    'INPUT'
  960.     DB    87H
  961.     DB    'DATA'
  962.     DB    88H
  963.     DB    'GOTO'
  964.     DB    89H
  965.     DB    'GOSUB'
  966.     DB    8AH
  967.     DB    'RETURN'
  968.     DB    8BH
  969.     DB    'DIM'
  970.     DB    8CH
  971.     DB    'STOP'
  972.     DB    8DH
  973.     DB    'END'
  974.     DB    8EH
  975.     DB    'RESTORE'
  976.     DB    8FH
  977.     DB    'REM'
  978.     DB    90H
  979.     DB    'FN'
  980.     DB    91H
  981.     DB    'DEF'
  982.     DB    92H
  983.     DB    '!'
  984.     DB    93H
  985.     DB    'ON'
  986.     DB    94H
  987.     DB    'OUT'
  988.     DB    95H
  989.     DB    'FILL'
  990.     DB    96H
  991.     DB    'EXIT'
  992.     DB    97H
  993.     DB    'OPEN'
  994.     DB    98H
  995.     DB    'CLOSE'
  996.     DB    99H
  997.     DB    'WRITE'
  998.     DB    9BH
  999.     DB    'CHAIN'
  1000.     DB    9CH
  1001.     DB    'LINE'
  1002.     DB    9DH
  1003.     DB    'DESTROY'
  1004.     DB    9EH
  1005.     DB    'CREATE'
  1006.     DB    9FH
  1007.     DB    'ERRSET'
  1008.     DB    0A0H
  1009.     DB    'RUN'
  1010.     DB    0A1H
  1011.     DB    'LIST'
  1012.     DB    0A2H
  1013.     DB    'MEMSET'
  1014.     DB    0A3H
  1015.     DB    'SCR'
  1016.     DB    0A4H
  1017.     DB    'AUTO'
  1018.     DB    0A5H
  1019.     DB    'LOAD'
  1020.     DB    0A6H
  1021.     DB    'CONT'
  1022.     DB    0A7H
  1023.     DB    'APPEND'
  1024.     DB    0A8H
  1025.     DB    'REN'
  1026.     DB    0A9H
  1027.     DB    'NSAVE'
  1028.     DB    0AAH
  1029.     DB    'SAVE'
  1030.     DB    0ABH
  1031.     DB    'BYE'
  1032.     DB    0ACH
  1033.     DB    'EDIT'
  1034.     DB    0ADH
  1035.     DB    'DEL'
  1036.     DB    0AEH
  1037.     DB    'PSIZE'
  1038.     DB    0AFH
  1039.     DB    'CAT'
  1040.     DB    0B0H
  1041.     DB    'STEP'
  1042.     DB    0B1H
  1043.     DB    'TO'
  1044.     DB    0B2H
  1045.     DB    'THEN'
  1046.     DB    0B3H
  1047.     DB    'TAB'
  1048.     DB    0B4H
  1049.     DB    'ELSE'
  1050.     DB    0B5H
  1051.     DB    'CHR$'
  1052.     DB    0B6H
  1053.     DB    'ASC'
  1054.     DB    0B7H
  1055.     DB    'VAL'
  1056.     DB    0B8H
  1057.     DB    'STR$'
  1058.     DB    0B9H
  1059.     DB    'NOENDMARK'
  1060.     DB    0BAH
  1061.     DB    'INCHAR'
  1062.     DB    0BBH
  1063.     DB    'FILE'
  1064.     DB    0E0H
  1065.     DB    '('
  1066.     DB    0E0H
  1067.     DB    '['
  1068.     DB    0E2H
  1069.     DB    '*'
  1070.     DB    0E3H
  1071.     DB    '+'
  1072.     DB    0E5H
  1073.     DB    '-'
  1074.     DB    0E7H
  1075.     DB    '/'
  1076.     DB    0ECH
  1077.     DB    'AND'
  1078.     DB    0EDH
  1079.     DB    'OR'
  1080.     DB    0EFH
  1081.     DB    '>='
  1082.     DB    0F0H
  1083.     DB    '<='
  1084.     DB    0F1H
  1085.     DB    '<>'
  1086.     DB    0EFH
  1087.     DB    '>='
  1088.     DB    0F0H
  1089.     DB    '=<'
  1090.     DB    0F4H
  1091.     DB    '<'
  1092.     DB    0F5H
  1093.     DB    '='
  1094.     DB    0F6H
  1095.     DB    '>'
  1096.     DB    0F7H
  1097.     DB    'NOT'
  1098.     DB    0E1H
  1099.     DB    '^'
  1100.     DB    0C6H
  1101.     DB    'INT'
  1102.     DB    0CCH
  1103.     DB    'LEN'
  1104.     DB    0CDH
  1105.     DB    'CALL'
  1106.     DB    0CEH
  1107.     DB    'RND'
  1108.     DB    0CAH
  1109.     DB    'SGN'
  1110.     DB    0CBH
  1111.     DB    'SIN'
  1112.     DB    0C4H
  1113.     DB    'SQRT'
  1114.     DB    0D2H
  1115.     DB    'ATN'
  1116.     DB    0D8H
  1117.     DB    'FREE'
  1118.     DB    0D9H
  1119.     DB    'INP'
  1120.     DB    0DAH
  1121.     DB    'EXAM'
  1122.     DB    0DBH
  1123.     DB    'ABS'
  1124.     DB    0DCH
  1125.     DB    'COS'
  1126.     DB    0DDH
  1127.     DB    'LOG'
  1128.     DB    0DEH
  1129.     DB    'EXP'
  1130.     DB    0DFH
  1131.     DB    'TYP'
  1132.     DB    0FFH
  1133.     END    100H
  1134.