home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol010 / dsim.lib < prev    next >
Text File  |  1984-04-29  |  5KB  |  275 lines

  1. ;
  2. ; DOS SIMULATOR
  3. ;
  4. ; MODIFICATIONS TO CP/M TO IMPROVE ITS COMPATIBILITY
  5. ; WITH CROMENCO'S DISK OPERATING SYSTEM.
  6. ;
  7. ; NOTE: CROMENCOS DISK SYSTEM TREATS CP/M
  8. ; CALLS AS A SUBSET OF THEIR OWN SYSTEM, IN
  9. ; ADDITION, SEVERAL OF THE CP/M CALLS HAVE
  10. ; BEEN EMBLISHED.
  11. ;
  12. ; NOT ALL OF THE SPECIAL CALLS HAVE BEEN COVERED BY
  13. ; THESE MODIFICATIONS. ALSO YOU WILL NEED A Z80 PROCESSOR
  14. ; TO RUN MOST PROGRAMS WRITEN FOR THE CROMENCO
  15. ; DISK SYSTEM.
  16. ;
  17. ; IMPLEMNTATION NOTES:
  18. ;
  19. ; (1) CPMB = STARTING ADDRESS OF CP/M BDOS
  20. ; (2) THESE INTERNAL LOCATIONS ARE FOR
  21. ;     CP/M VERSION 1.4. (AND CAN BE EXPECTED TO VARY)
  22. ;     (A) CPMB+807H, A JUMP IN CP/M WHICH
  23. ;         IS REPLACED BY A JUMP TO DSIM.
  24. ;     (B) CPMB+0A07H, A FLAG/CHR BUFFER USED
  25. ;         BY THE CP/M I/O ROUTINES
  26. ;     (C) CPMB+869H, 8FAH, AND 9F8H FOR
  27. ;         THE CONTROL C ADDRESS.
  28. ; (3) IN THE GOCPM ROUTINE IN WARM BOOT, ADD:
  29. ;         LXI H,DSIM
  30. ;         SHLD CPMB+807H
  31. ;     THIS PROVIDES THE LINK TO DSIM
  32. ; (4) DSIM CAN RESIDE IN THE CBIOS.
  33. ; (5) REMEMBER, DON'T LET THE CBIOS GET TO
  34. ;     LONG, OR THERE WON'T BE SPACE FOR IT
  35. ;     ON THE DISK.
  36. ; (6) DMAADD IS ADDRESS OF LOCATION WHERE CP/M STORES
  37. ;     THE DMA ADDRESS.
  38. ;
  39. ; DOS SIMULATOR
  40. ;
  41. ; FIRST SORT OUT THE CP/M CALLS WE
  42. ; NEED TO MODIFY.
  43. ;
  44. DSIM:    MOV    A,C        ; GET COMMAND
  45.     CPI    0AH        ; READ BUFFER?
  46.     JZ    FLIN        ; YES
  47.     CPI    0FH        ; OPEN FILE?
  48.     JZ    FHL        ; YES
  49.     CPI    11H        ; SEARCH FOR FILE?
  50.     JZ    FHL        ; YES
  51.     CPI    12H        ; SEARCH FOR NEXT?
  52.     JZ    FHL        ; YES
  53.     ORA    A        ; RETURN TO DOS?
  54.     JZ    WBOOT        ; YES
  55.     JMP    CPMB+841H    ; IF BIT=7=0 NORMAL CPM
  56. ;
  57. ; ADDED CALLS
  58. ;
  59.     ANI    0FH        ; INPUT W/OUT ECHO
  60.     JZ    CONIN1        ; YES
  61.     CPI    02H        ; CONTROL C?
  62.     JZ    SCC        ; YES
  63.     CPI    06H        ; SET UP FCB?
  64.     JZ    SFCB        ; YES
  65.     CPI    09H        ; DO DE=DE*HL?
  66.     JZ    CMULT        ; YES
  67.     CPI    0AH        ; DO HL=HL/DE?
  68.     JZ    SDIV        ; YES
  69. ;
  70. ; IF WE GET HERE, CALL IS NOT HANDLED
  71. ; THIS JUMP IS TO THE BREAKPOINT ROUTINE
  72. ; IN MY PROM MONITOR, AND SHOULD BE REPLACED
  73. ; ANYWAY YOU SEE FIT
  74. ;
  75.     JMP    0C108H
  76. ;
  77. ; CHANGE CONTROL C ADDRESS
  78. ;
  79. SCC:    XCHG            ; GET ADDRESS
  80.     SHLD    CPMB+869H
  81.     SHLD    CPMB+8FAH
  82.     SHLD    CPMB+9F8H
  83.     XRA    A
  84.     RET
  85. ;
  86. ; ADD NULL TO INPUT BUFFER
  87. ;
  88. FLIN:    PUSH    D        ; SAVE BUFFER ADD
  89.     CALL    CPMB+841H    ; GO GET INPUT
  90.     POP    H        ; GET ADDRESS
  91.     MOV    A,M        ; REQ. NO.
  92.     INX    H
  93.     MOV    C,M        ; ACTUAL
  94.     CMP    C
  95.     RZ            ; BUFFER FULL
  96.     INX    H        ; FIRST CHAR
  97.     XRA    A
  98.     MOV    B,A
  99.     DAD    B        ; GET LAST LOC
  100.     MOV    M,A        ; ADD NULL
  101.     RET
  102. ;
  103. ; NON ECHO CONSOLE INPUT
  104. ;
  105. CONIN1:    LDA    CPMB+0A07H    ; CPM CHR READY FLAG
  106.     ORA    A
  107.     JNZ    CONIN2        ; ONE WAITING
  108.     CALL    CONIN
  109. CONIN2:    PUSH    PSW
  110.     XRA    A        ; CLEAR FLAG
  111.     STA    CPMB+0A07H
  112.     POP    PSW
  113.     RET
  114. ;
  115. ; SIMPLE DIVIDE
  116. ;
  117. SDIV:    MOV    A,D        ; CHECK FOR ZERO
  118.     ORA    E
  119.     JNZ    SDIV1
  120.     MOV    L,A        ; ANSWER
  121.     MOV    H,A
  122.     DCR    A        ; A=FF
  123.     RET
  124. SDIV1:    LXI    B,1
  125. SDIV2:    MOV    A,L
  126.     SUB    E
  127.     MOV    L,A
  128.     MOV    A,H
  129.     SBB    D
  130.     MOV    H,A
  131.     JM    SDIV3
  132.     INX    B
  133.     JMP    SDIV2
  134. ;
  135. SDIV3:    DAD    D
  136.     DCX    B
  137.     XCHG
  138.     PUSH    B
  139.     POP    H
  140.     XRA    A
  141.     RET
  142. ;
  143. ; MULTIPLY
  144. ;
  145. CMULT:    MVI    A,10H
  146.     STA    SHFT        ; TO DO
  147.     PUSH    H        ; SWAP
  148.     POP    B
  149.     LXI    H,0        ; ZERO
  150. CMULT1:    DAD    H        ; SHIFT PRODUCT
  151.     ORA    A        ; CLR CARRY
  152.     MOV    A,E        ; 16 BIT SHIFT
  153.     RAL
  154.     MOV    E,A
  155.     MOV    A,D
  156.     RAL
  157.     MOV    D,A
  158.     JNC    CMULT2        ; IF NO CY, SKIP
  159.     DAD    B        ; ADD
  160. CMULT2:    LDA    SHFT        ; SEE IF DONE
  161.     DCR    A
  162.     STA    SHFT        ; JUST IN CASE
  163.     JNZ    CMULT1        ; MORE
  164.     PUSH    H
  165.     POP    D
  166.     RET
  167. ;
  168. ; FIX HL ON SEARCH, OPEN COMMANDS
  169. ;
  170. FHL:    CALL    CPMB+841H
  171.     CPI    0FFH        ; SKIP?
  172.     RZ            ; YES
  173.     PUSH    PSW
  174.     RRC
  175.     RRC
  176.     RRC
  177.     ANI    60H
  178.     LHLD    DMAADD
  179.     MVI    D,0
  180.     MOV    E,A
  181. FHL1:    DAD    D        ; BASE ADDRESS
  182.     MOV    A,M        ; EMPTY?
  183.     CPI    0E5H
  184.     JZ    FHLE        ; YES, SKIP
  185.     PUSH    H        ; SAVE
  186.     LXI    D,0FH        ; CHECK EXT
  187.     DAD    D
  188.     MOV    A,M
  189.     CPI    80H        ; FULL?
  190.     JNZ    FHLE1
  191.     MVI    A,0EFH
  192.     CMP    L
  193.     JZ    FHLE1
  194.     POP    H
  195.     LXI    D,20H
  196.     JMP    FHL1
  197. ;
  198. FHLE1:    POP    H
  199. FHLE:    POP    PSW
  200.     RET
  201. ; SET UP FILE CONTROL BLOCK
  202. ;
  203. ; HL=SORCE
  204. ; DE=DEST
  205. ; FIRST CLEAR FCB
  206. ;
  207. SFCB:    XCHG
  208.     PUSH    H        ; SAVE FOR EXIT
  209.     MVI    M,0
  210.     INX    D        ; LOOK FOR COLON
  211.     LDAX    D        ; GET CHAR
  212.     DCX    D        ; IF NOT A COLON
  213.     CPI    ':'
  214.     JNZ    SFCB7        ; NOPE
  215.     LDAX    D        ; GET DRIVE
  216.     ANI    03H        ; STRIP
  217.     MOV    M,A        ; SET FCB
  218.     INX    D        ; AHEAD TO NAME
  219.     INX    D
  220. SFCB7:    INX    H
  221.     PUSH    H        ; FOR FILENAME
  222.     MVI    A,11
  223. SFCB1:    MVI    M,20H        ; SPACE
  224.     INX    H
  225.     DCR    A
  226.     JNZ    SFCB1
  227.     MVI    A,21        ; CLEAR
  228. SFCB2:    MVI    M,0
  229.     INX    H
  230.     DCR    A
  231.     JNZ    SFCB2
  232.     POP    H
  233.     PUSH    H
  234. ;
  235. ; HL=FCB+1
  236. ; DE=SCORCE
  237. ; STACK=FCB+1,FCB
  238. ;
  239.     MVI    C,8+1
  240. SFCB3:    LDAX    D
  241.     CPI    '.'
  242.     JZ    SFCB4
  243.     CPI    '/'
  244.     JM    SEXIT
  245.     DCR    C
  246.     JZ    SFCB5
  247.     MOV    M,A
  248.     INX    H
  249.     INX    D
  250.     JMP    SFCB3
  251. ;
  252. SFCB4:    INX    D
  253. SFCB5:    POP    H
  254.     PUSH    H    ; FOR EXIT
  255.     LXI    B,8
  256.     DAD    B
  257.     MVI    C,3+1
  258. SFCB6:    LDAX    D
  259.     CPI    '/'
  260.     JM    SEXIT
  261.     DCR    C
  262.     JZ    SEXIT
  263.     MOV    M,A
  264.     INX    H
  265.     INX    D
  266.     JMP    SFCB6
  267. ;
  268. SEXIT:    XCHG
  269.     POP    D
  270.     POP    D
  271.     RET
  272. ;
  273. SHFT:    DB    0        ; RAM FOR MULT
  274. ;
  275.