home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / TURBODSG / EMUL.A < prev    next >
Text File  |  2000-06-30  |  11KB  |  495 lines

  1.     #TITLE    "8080 EMULATOR FOR NEC V-30  BY ESKAY 12/07/85"
  2.     #PAGE    132,66
  3.     MODULE    "EmulV30"
  4. ;
  5. ;    This copyrighted program has been released to the Public Domain
  6. ;    for NONCOMMERCIAL uses only. Users wishing to use this utility
  7. ;    for ANY purpose other than personal use must first obtain written
  8. ;    authorization. Commercial distribution of this utility is
  9. ;    strictly forbidden without authorization and a $20.00 royalty fee
  10. ;    per distributed copy.
  11. ;    The above does not apply to distribution via "SIG-M library"!
  12. ;
  13. ;    The author assumes no liability of any kind for damages arising
  14. ;    from the use or inability to use this utility.
  15. ;
  16. JMP    ==    0XC3
  17. ;
  18. ; below we define the CP/M version number which is returned in response to
  19. ; BDOS function 12. Note that TurboDOS and MP/M-86 users should select
  20. ; "0X0130" to recognize MP/M functions. See .DOC file for more info.
  21. ;
  22. CPMVER    ==    0X0022        ; CP/M VERSION RETURNED
  23. ;
  24. ; below, the new BDOS interrupt vector is defined
  25. ;
  26. BDOSN    ==    0XFE        ; NEW BDOS INTERRUPT FOR EMULATION MODE
  27. ;
  28.     LOC    Extra#
  29. ;
  30. ;    THIS BECOMES THE 8080 ENVIRONMENT
  31. ;    SAVE A FEW BYTES BY STATIC ALLOCATION RATHER
  32. ;    THAN DYNAMIC.
  33. ;
  34. ENV80:    RES    0X7FFF
  35.     RES    0X7FFF
  36. ;
  37.     LOC    Data#
  38. ;
  39. ;    IN THIS VERSION OF EMUL, THE 8080 ENVIRONMENT IS
  40. ;    CARRIED IN THE DATA SEGMENT AND LOADED INTO ALLOCATED
  41. ;    RAM IN A 2-STEP PROCESS. NOTE THAT DATA SEGMENT BECOMES
  42. ;    USABLE ONLY FROM 100H, THUS ALL EQUATES IN THE BDOS/BIOS
  43. ;    AREA ARE SEEMINGLY OFF BY 0X100.
  44. ;
  45. WBOOT:    BYTE    JMP            ; BASE PAGE WARMBOOT JUMP
  46.     WORD    &WBOOTE
  47.     BYTE    0
  48.     BYTE    0
  49. BDOS:    BYTE    JMP            ; BDOS ENTRY POINT
  50.     WORD    &BDOSE
  51.     LOC    WBOOT+0X5C
  52. DFCB1:    BYTE    0,"           ",0,0,0,0    ; DEFAULT FCB 1
  53. DFCB2:    BYTE    0,"           ",0,0,0,0    ; DEFAULT FCB 2
  54.     LOC    WBOOT+0X80
  55. DBUF:    BYTE    0            ; DEFAULT DMA BUFFER
  56.     RES    127
  57. TPA:    BYTE    0X11            ; LXI D,TEST1
  58.     WORD    &TEST1-0X100
  59.     BYTE    0X0E,0X09        ; MVI C,9
  60.     BYTE    0XCD            ; CALL BDOS
  61.     WORD    &BDOS-0X100
  62.     BYTE    JMP            ; JMP WBOOT
  63.     WORD    &WBOOT-0X100
  64. TEST1:    BYTE    "ERROR: no command line specified.\r\n\7"
  65.     BYTE    "USAGE:\r\n"
  66.     BYTE    "EMUL <command> [tail]\r\n"
  67.     BYTE    "Where <command> is an 8080 CP/M .COM file which must be\r\n"
  68.     BYTE    "currently accessible, and [tail] is an optional command\r\n"
  69.     BYTE    "tail which is to be passed to the command file.\r\n"
  70.     BYTE    "    This message is produced by the emulation mode.\r\n\n"
  71.     BYTE    "NOTE: commercial distribution without authorization\r\n"
  72.     BYTE    "strictly prohibited. License fee for commercial use: 20.00"
  73.     BYTE    " dollars.\r\n"
  74.     BYTE    "(c) 1985, S. Kluger, 7120 Skillman #2104,"
  75.     BYTE    " Dallas TX 75231\r\n\n"
  76.     BYTE    "CP/M-80 available TPA space = 0100..FEFC (65020 bytes)."
  77.     BYTE    "\r\n$"
  78. ;
  79. BEGENV    ==    .            ; BEGINNING OF BDOS/BIOS ENVIRONMENT
  80. BDOSE    ==    WBOOT+0XFDFD
  81.     BYTE    JMP
  82.     WORD    &NATIVE
  83. ;
  84. ; SIMULATED BIOS TABLE
  85. ;
  86. CBOOT    ==    BDOSE+3
  87.     BYTE    JMP            ; COLD BOOT
  88.     WORD    &ENDEM
  89. WBOOTE    ==    BDOSE+6
  90.     BYTE    JMP            ; WARMBOOT ENTRY (RETURN TO 16 BIT)
  91.     WORD    &ENDEM
  92. CONST    ==    BDOSE+9
  93.     BYTE    JMP            ; CON STATUS
  94.     WORD    &BCONST
  95. CONIN    ==    BDOSE+12
  96.     BYTE    JMP            ; CON IN
  97.     WORD    &BCONIN
  98. CONOT    ==    BDOSE+15
  99.     BYTE    JMP            ; CON OUT
  100.     WORD    &BCONOT
  101. LIST    ==    BDOSE+18
  102.     BYTE    JMP            ; LST OUT
  103.     WORD    &BLIST
  104.     BYTE    JMP            ; REST IS INVALID
  105.     WORD    &INVAL
  106.     BYTE    JMP            ; REST IS INVALID
  107.     WORD    &INVAL
  108.     BYTE    JMP            ; REST IS INVALID
  109.     WORD    &INVAL
  110.     BYTE    JMP            ; REST IS INVALID
  111.     WORD    &INVAL
  112.     BYTE    JMP            ; REST IS INVALID
  113.     WORD    &INVAL
  114.     BYTE    JMP            ; REST IS INVALID
  115.     WORD    &INVAL
  116.     BYTE    JMP            ; REST IS INVALID
  117.     WORD    &INVAL
  118.     BYTE    JMP            ; REST IS INVALID
  119.     WORD    &INVAL
  120.     BYTE    JMP            ; REST IS INVALID
  121.     WORD    &INVAL
  122.     BYTE    JMP            ; LIST STATUS
  123.     WORD    &BLSTS
  124.     BYTE    JMP            ; REST IS INVALID
  125.     WORD    &INVAL
  126.     BYTE    JMP            ; REST IS INVALID
  127.     WORD    &INVAL
  128.     BYTE    JMP            ; REST IS INVALID
  129.     WORD    &INVAL
  130. ;
  131.     RES    7            ; LEAVE SOME ROOM
  132. ;
  133. BCONST    ==    CBOOT+0X40
  134.     BYTE    0X0E,0X0B,JMP
  135.     WORD    &NATIVE
  136. BCONIN    ==    CBOOT+0X45
  137.     BYTE    0X0E,3,JMP
  138.     WORD    &NATIVE
  139. BCONOT    ==    CBOOT+0X4A
  140.     BYTE    0X59,0X0E,4,JMP
  141.     WORD    &NATIVE
  142. BLIST    ==    CBOOT+0X50
  143.     BYTE    0X59,0X0E,5,JMP
  144.     WORD    &NATIVE
  145. BLSTS    ==    CBOOT+0X56
  146.     BYTE    0XAF,0XC9        ; XRA A ! RET
  147.     BYTE    0            ; NOP
  148. ;
  149. ; ENTER HERE WHEN GETTING CONTROL FROM ABOVE
  150. ;
  151. ENTRY    ==    CBOOT+0X59
  152.     BYTE    0X31
  153.     WORD    &STK80
  154.     BYTE    0X21,0,0        ; LXI    H,0
  155.     BYTE    0XE5            ; PUSH    H
  156.     BYTE    0XC3,0,1        ; JMP    100H
  157. ;
  158. ; CALL THE HIGHER BEING IN THE V30
  159. ;
  160. NATIVE    ==    CBOOT+0X63
  161.     BYTE    0X79            ; MOV    A,C    ; GET FUNCTION #
  162.     BYTE    0XFE,0X0C        ; CPI    12    ; SEE IF VERSION CALL
  163.     BYTE    0XC2            ; JNZ    NO12    ; NO, SKIP
  164.     WORD    &NO12
  165.     BYTE    0X21            ; LXI    H,CPMVER ; SET UP OUR VERSION
  166. CV    ==    CBOOT+0X6A
  167.     WORD    CPMVER
  168.     BYTE    0XC9            ; RET
  169. NO12    ==    CBOOT+0X6D
  170.     BYTE    0XED,0XED,BDOSN        ; CALL NATIVE (INT BDOSN)
  171.     BYTE    0XC9            ; RET
  172. ;
  173. ; GO BACK TO CREATOR
  174. ;
  175. ENDEM    ==    CBOOT+0X71
  176.     BYTE    0XED,0XFD        ; RETURN FROM EMULATION
  177. ;
  178. ; INVALID BIOS CALL
  179. ;
  180. INVAL    ==    CBOOT+0X73
  181.     BYTE    0X11            ; LXI D,ERRMSG
  182.     WORD    &ERRMSG
  183.     BYTE    0X0E,0X09        ; MVI C,9
  184.     BYTE    0XCD            ; CALL NO12 (BDOS)
  185.     WORD    &NO12
  186.     BYTE    JMP            ; JMP ENDEM (QUIT)
  187.     WORD    &ENDEM
  188. ;
  189. ERRMSG    ==    CBOOT+0X7E
  190.     BYTE    "\r\n\nBIOS CALL NOT SUPPORTED!\r\n\n\7$"
  191. ;
  192. STK80    ==    WBOOT+0XFEF0
  193. ;
  194. ENDENV    ==    .            ; END OF ENVIRONMENT
  195. ;
  196.     LOC    Data#
  197. ;
  198. ;    +--------------------------------------------------+
  199. ;    | THIS IS THE EMULATOR CONTROL PROGRAM'S DATA AREA |
  200. ;    +--------------------------------------------------+
  201. ;
  202. BANNER:    BYTE    "\r\n---------------------------------------------"
  203.     BYTE    "\r\nEMUL           Version 2.20          12/07/85"
  204.     BYTE    "\r\nCP/M-80 emulator  for CP/M-86 and NEC V30 CPU"
  205.     BYTE    "\r\nCopyright 1985 S. Kluger. All Rights Reserved"
  206.     BYTE    "\r\n---------------------------------------------\r\n\n$"
  207. ;
  208. BADCPU:    BYTE    "\r\nNOT V20 OR V30 CPU???\r\n$"
  209. NOFIL:    BYTE    "ERROR:  $"
  210. NOFIL1:    BYTE    "  NOT FOUND!\r\n\7$"
  211. EMDONE:    BYTE    "\r\nEMUL: end of emulation\r\n$"
  212. ;
  213. DMABAS:    WORD    0            ; ENTRY DMA BASE
  214. DMAOFF:    WORD    0            ; ENTRY DMA OFFSET
  215. ;
  216.     RES    0X100
  217. STACK    ==    .
  218. ;
  219. ;    +----------------------------------------------------+
  220. ;    | THIS IS THE CONTROL PROGRAM. LOAD PROGRAM, PROCESS |
  221. ;    | COMMAND LINE AND THEN SEND CONTROL TO WORLD BELOW. |
  222. ;    +----------------------------------------------------+
  223. ;
  224.     LOC    Code#
  225. ;
  226. START:    MOV    AX,DS            ; GET DATA SEGMENT
  227.     MOV    SS,AX            ; SET UP STACK
  228.     MOV    SP,&STACK
  229.     CS MOV    NTRYDS,AX        ; SAVE ENTRY DS IN KNOWN LOCATION
  230.     MOV    CL,=52            ; GET DMA ADDRESS
  231.     PUSH    ES            ; PRESERVE 8080 PAGE
  232.     CALL    IBDOS
  233.     MOV    DMABAS,ES
  234.     MOV    DMAOFF,BX
  235.     POP    ES
  236.     MOV    DX,&BANNER        ; SAY WHO WE ARE
  237.     MOV    CL,=9
  238.     CALL    IBDOS
  239. ;
  240. ; MAKE SOME TESTS (CHECK IF THIS IS V20 OR V30)
  241. ;
  242.     MOV    CL,=0X21
  243.     MOV    AX,=2
  244.     SHR    AX,CL
  245.     TEST    AX,=1            ; NONZERO MEANS 80186/188
  246.     JZ    __MYB            ; SKIP IF "MAYBE"
  247. __CBAD:    MOV    DX,&BADCPU
  248.     JMP    ERROR
  249. ;
  250. __MYB:    XOR    AL,AL
  251.     MOV    AH,=0X99
  252.     BYTE    0X0F,0X28,0XC4        ; NEC INSTRUCTION "ROL4 AH"
  253.     OR    AL,AL            ; MUST HAVE CHANGED
  254.     JZ    __CBAD            ; NOT V20/30
  255. ;
  256. ; PREPARE 8080 ENVIRONMENT
  257. ;
  258.     MOV    CX,=0X8000        ; FIRST CLEAR RAM
  259.     MOV    DI,=0
  260.     XOR    AX,AX
  261.     REP STOS WORD
  262.     MOV    SI,&WBOOT        ; MOVE BASE PAGE PLUS DEFAULT PGM
  263.     MOV    DI,=0
  264.     MOV    CX,=(BEGENV-WBOOT)
  265.     REP MOVS BYTE
  266.     MOV    SI,&BEGENV        ; MOVE BDOS/BIOS AREA
  267.     MOV    DI,&BDOSE
  268.     MOV    CX,=(ENDENV-BEGENV)
  269.     REP MOVS BYTE
  270. ;
  271. ; NOW LOAD THE PROGRAM
  272. ;
  273.     MOV    CX,=0X7F        ; MOVE COMMAND LINE
  274.     MOV    SI,=0X80
  275.     MOV    DI,SI
  276.     REP MOVS BYTE
  277.     CMP    0X5D,=BYTE ' '        ; EMPTY FILENAME?
  278.     JNZ    __V
  279.     JMP    SETDMA            ; YES, GO RUN DEFAULT PROGRAM
  280. ;
  281. __V:    MOV    0X5C+9,=WORD 0X4F43    ; MAKE ".COM"
  282.     MOV    0X5C+11,=BYTE 'M'
  283.     MOV    DX,&0X5C        ; POINT TO FILENAME
  284.     MOV    CL,=15            ; OPEN FILE
  285.     CALL    IBDOS
  286.     INC    AL
  287.     JNZ    OO
  288.     MOV    DX,&NOFIL
  289.     MOV    CL,=9
  290.     CALL    IBDOS
  291.     MOV    SI,=0X5C        ; POINT TO FCB
  292.     MOV    AL,[SI]
  293.     INC    SI
  294.     OR    AL,AL
  295.     JZ    __NDV
  296.     ADD    AL,=0X40
  297.     CALL    PUTCH
  298.     MOV    AL,=':'
  299.     CALL    PUTCH
  300. __NDV:    MOV    CX,=11
  301. __DFN:    MOV    AL,[SI]
  302.     INC    SI
  303.     PUSHA
  304.     CALL    PUTCH
  305.     POPA
  306.     LOOP    __DFN
  307.     MOV    DX,&NOFIL1
  308. ERROR:    MOV    CL,=9
  309.     CALL    IBDOS
  310.     MOV    CL,=0
  311.     JMP    IBDOS
  312. ;
  313. OO:    MOV    DI,=0X100
  314. __RL:    MOV    SI,=0X80
  315.     MOV    CL,=20            ; READ A BLOCK
  316.     MOV    DX,=0X5C
  317.     CALL    IBDOS
  318.     OR    AL,AL
  319.     JNZ    LOADED
  320.     MOV    CX,=64
  321.     REP MOVS WORD
  322.     JMPS    __RL
  323. ;
  324. LOADED:    MOV    CL,=16            ; CLOSE THE FILE
  325.     MOV    DX,=0X5C
  326.     CALL    IBDOS
  327. ;
  328. ; SET UP FCBS
  329. ;
  330.     MOV    AX,ES
  331.     MOV    DS,AX
  332.     MOV    CX,=0X10
  333.     MOV    SI,&DFCB2-0X100
  334.     MOV    DI,&DFCB1-0X100
  335.     REP MOVS BYTE
  336.     MOV    BX,&DFCB2-0X100
  337.     MOV    [BX],=BYTE 0
  338.     MOV    CX,=11
  339. __F:    INC    BX
  340.     MOV    [BX],=BYTE ' '
  341.     LOOP    __F
  342.     MOV    BX,&DBUF-0X100
  343.     MOV    CL,[BX]
  344.     INC    CL
  345.     MOV    CH,=0
  346.     PUSH    CX
  347.     MOV    SI,&DBUF+2-0X100
  348.     MOV    DI,&DBUF+1-0X100
  349. __CLL:    CMP    CL,=0
  350.     JZ    BLCL
  351.     DEC    CL
  352.     CMP    [SI],=BYTE ' '
  353.     JZ    __FB
  354.     INC    SI
  355.     JMPS    __CLL
  356. ;
  357. __FB:    DEC    CL
  358.     MOV    [BX],CL
  359.     REP MOVS BYTE
  360.     POP    CX
  361. __ZL:    MOV    [DI],=BYTE 0
  362.     INC    DI
  363.     CMP    DI,=0X100
  364.     JZ    __ZZ
  365.     LOOP    __ZL
  366. __ZZ:    MOV    SI,=0X81        ; SOURCE POINTER
  367.     MOV    DI,=0X5C        ; DESTINATION POINTER
  368.     CALL    PFN            ; PARSE FN
  369.     JC    SETDMA            ; SKIP IF END OF LINE
  370.     MOV    DI,=0X6C        ; NEXT DESTINATION POINTER
  371.     CALL    PFN
  372.     JMPS    SETDMA
  373. ;
  374. BLCL:    MOV    [BX],=BYTE 0
  375. ;
  376. ; NOW SET UP DMA BUFFER
  377. ;
  378. SETDMA:    MOV    CL,=51            ; SET DMA BASE (OFFSET STILL 0X80)
  379.     MOV    DX,ES
  380.     CALL    IBDOS
  381. ;
  382. ; SET UP INTERRUPT VECTOR AND EXECUTE
  383. ;
  384.     XOR    AX,AX
  385.     MOV    DS,AX
  386.     MOV    0X3FC,=WORD ENTRY
  387.     MOV    0X3FE,ES
  388.     MOV    BDOSN*4,=WORD BDOSI
  389.     MOV    BDOSN*4+2,CS
  390.     PUSH    ES            ; GET THE 8080 SEGMENT
  391.     POP    DS            ; PUT INTO DATA SEG
  392. ;
  393.     BYTE    0X0F,0XFF,0XFF        ; BRKEM 0XFF
  394. ;
  395.     CS MOV    AX,NTRYDS        ; ENT ENTRY DATA SEGMENT BACK
  396.     MOV    DS,AX
  397.     MOV    CL,=51            ; RESET DMA BASE
  398.     MOV    DX,DMABAS
  399.     CALL    IBDOS
  400.     MOV    CL,=9
  401.     MOV    DX,&EMDONE
  402.     CALL    IBDOS
  403.     MOV    CL,=0            ; EXIT
  404. ;
  405. ; INTERNAL BDOS ENTRY POINT, SAVE ES
  406. ;
  407. IBDOS:    PUSH    ES
  408.     INT    0XE0
  409.     POP    ES
  410.     RET
  411. ;
  412. ; OUTPUT A CHARACTER (USED FOR FILENAME DISPLAY)
  413. ;
  414. PUTCH:    MOV    CL,=2
  415.     MOV    DL,AL
  416.     JMPS    IBDOS
  417. ;
  418. ; FILE NAME PARSER
  419. ; IN:  SI=SOURCE (NULL TERMINATED), DI=DESTINATION
  420. ; OUT: SI=POINTER TO NEXT NON-DELIMITER
  421. ;      IF CARRY SET, THEN END OF LINE
  422. ;
  423. PFN:    CALL    SKNB            ; SKIP TO NONBLANK
  424.     CMP    1[SI],=BYTE ':'        ; DRIVE?
  425.     JNZ    __NDR            ;   NO, SKIP
  426.     MOV    AL,[SI]
  427.     SUB    AL,=0X40        ; MAKE 1..16
  428.     CMP    AL,=16
  429.     JA    __EOL
  430.     MOV    [DI],AL
  431.     INC    SI
  432.     INC    SI
  433. __NDR:    INC    DI            ; POINT TO FILENAME PART
  434.     MOV    CL,=0
  435. __LP:    MOV    AL,[SI]            ; GET BYTE
  436.     CMP    AL,=' '            ; CHECK DELIM
  437.     JZ    __DL
  438.     CMP    AL,=0X5C
  439.     JZ    __DL
  440.     CMP    AL,=';'
  441.     JZ    __DL
  442.     CMP    AL,=0            ; EOL?
  443.     JZ    __EOL
  444.     CMP    AL,='.'
  445.     JZ    __PER
  446.     CMP    CL,=12
  447.     JZ    __SKP
  448.     MOV    [DI],AL
  449. __SKP:    INC    CL
  450.     INC    DI
  451. __SKP1:    INC    SI
  452.     JMPS    __LP
  453. ;
  454. __DL:    INC    DI
  455.     RET
  456. ;
  457. __PER:    CMP    CL,=8
  458.     JNZ    __N8
  459.     JMPS    __SKP1
  460. ;
  461. __N8:    INC    DI
  462.     INC    CL
  463.     JMPS    __PER
  464. ;
  465. __EOL:    STC
  466.     RET
  467. ;
  468. SKNB:    MOV    AL,[SI]
  469.     CMP    AL,=' '
  470.     JZ    __ISB
  471.     CMP    AL,=':'
  472.     JZ    __ISB
  473.     CMP    AL,=';'
  474.     JZ    __ISB
  475.     CMP    AL,=0X5C
  476.     JZ    __ISB
  477.     CMP    AL,='='
  478.     JNZ    __NB
  479. __ISB:    INC    SI
  480.     JMPS    SKNB
  481. ;
  482. __NB:    RET
  483. ;
  484. NTRYDS:    WORD    0            ; ENTRY DATA SEGMENT
  485. ;
  486. ; EMULATOR BDOS INTERRUPT
  487. ;
  488. BDOSI:    PUSH    BP            ; SAVE EMULATOR STACK
  489.     CALL    IBDOS
  490.     POP    BP
  491.     IRET
  492.     END
  493.    IF CARRY SET, THEN END OF LINE
  494. ;
  495. PFN:    CALL    SKNB            ; SKIP TO NONBLA