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 / ENTERPRS / CPM / UTILS / S / Z80SIM.ARC / Z80.A86 < prev    next >
Text File  |  1991-11-16  |  10KB  |  533 lines

  1.     PAGEWIDTH 96
  2.     TITLE    'CP/M-80 EMULATOR FOR CP/M-86'
  3. ;        *** Z80.A86 ***        VERSION 1.2    09/25/84
  4. ;
  5. ;    WRITTEN BY PAT HESTER    08/12/83
  6. ;    MODIFIED BY BILL EARNEST FOR CP/M-86
  7. ;    LAST EDIT 9/25/84
  8. ;    09/25/84 ADD REL JMPS, REG EXCHGS FOR Z80
  9. ;    09/22/84 ADD INTERNAL REPARSE WHICH CPM-86 HASNT
  10. ;    09/18/84 CUT .CMD FILE SIZE FOR FASTER LOADING (WDE)
  11. ;    09/17/84 FLAG USAGE FIXED, MP/M FUNCTS REPLACED SO
  12. ;    CAN BE RUN UNDER CP/M-86. WILL NOW RUN WM.COM OK (WDE)
  13. ;
  14. ;    GENCMD Z80 EXTRA[MC00]
  15. ;
  16. ;    INVOCATION:
  17. ;        Z80 filename<.typ>    (typ defaults to .COM)
  18. ;
  19. ;    **** 8080 OP CODES ARE ALLOWED ***
  20. ;    **** A FEW Z-80 INSTR. ARE SUPPORTED (NOT MANY) ****
  21. ;    **** PROGRAMS MUST USE STRICT CP/M CALLS THRU 0 AND 5 ****
  22. ;    **** THE BIOS JUMP TABLE MUST NOT BE ACCESSED ****
  23. ;    **** EXCEPT FOR CONIN, CONOU, CONST, LIST ****
  24. ;    **** NO GAME PLAYING WITHIN CP/M ****
  25. ;
  26. ;    REGISTER USAGE:
  27. ;        SI    Z80 INSTRUCTION POINTER
  28. ;
  29. BDOS        EQU    0E0H        ;BDOS INTERRUPT VECTOR
  30. BDOS_LIST    EQU    5        ;LIST OUTPUT
  31. BDOS_DIRECT    EQU    6        ;DIRECT CONSOLE I/O
  32. BDOS_PRINT    EQU    9        ;PRINT STRING
  33. BDOS_INPUT    EQU    10        ;READ CONSOLE BUFFER
  34. BDOS_OPENF    EQU    15        ;OPEN FILE
  35. BDOS_CLOSEF    EQU    16        ;CLOSE FILE
  36. BDOS_READ_NEXT    EQU    20        ;READ SEQUENTIAL
  37. BDOS_GET_DISK    EQU    25        ;RETURN CURRENT DISK NUMBER
  38. BDOS_DMA_OFFSET    EQU    26        ;SET DMA OFFSET
  39. BDOS_DMA_BASE    EQU    51        ;SET DMA BASE
  40. BDOS_TERMINATE    EQU    0        ;TERMINATE PROCESS
  41. ;BDOS_PARSE    EQU    152        ;PARSE FILE NAME
  42. ;
  43. CR        EQU    0DH        ;CARRAIGE RETURN
  44. LF        EQU    0AH        ;LINE FEED
  45. BEL        EQU    07H        ;RING BELL
  46. ;
  47. ZJMP        EQU    0C3H        ;Z80 JUMP OP CODE
  48. ZJZ        EQU    0CAH        ;Z80 JUMP ON ZERO
  49. ZRET        EQU    0C9H        ;Z80 RETURN CODE
  50. ZCALL        EQU    0CDH        ;Z80 CALL OP CODE
  51. ZLDCNN        EQU    0EH        ;Z80 LD C,nn OP CODE
  52. ZLDENN        EQU    01EH        ;Z80 LD E,nn OP CODE
  53. ZLDEC        EQU    059H        ;Z80 LD E,C OP CODE
  54. ZORA        EQU    0B7H        ;Z80 ORA A CODE
  55.  
  56.     CSEG
  57.     CALL    INITIALIZE        ;SET UP CP/M-80 AREAS, ETC
  58.     CALL    LOAD_Z80        ;LOAD Z80 PROGRAM INTO ESEG
  59.     JC    EXIT
  60.     CALL    RUN_Z80            ;EMULATION
  61. EXIT:
  62.     MOV    DX,OFFSET MSG_TERMINATE
  63.     CALL    PRINT
  64.     MOV    DL,0            ;RELEASE MEMORY
  65.     MOV    CL,BDOS_TERMINATE
  66.     INT    BDOS            ;TERMINATE PROCESS
  67. ;
  68. INITIALIZE:
  69.     PUSH    ES
  70.     MOV    CL,BDOS_GET_DISK
  71.     INT    BDOS
  72.     MOV    Z80_DISK,AL        ;Z80 CURRENT DISK
  73.     POP    ES
  74.     MOV    SI,OFFSET BIOSIMG
  75.     MOV    DI,OFFSET Z80_BIOSV
  76.     MOV    CX,OFFSET BIOIMGE-OFFSET BIOSIMG
  77.     REP MOVSB    ;SETUP BIOS VECTORS IN USER SPACE
  78. ;
  79.     MOV    SI,OFFSET TBUF+1
  80.     MOV    DI,OFFSET Z80_TAIL
  81. BNKLP:    LODS    AL
  82.     OR    AL,AL
  83.     JZ    HELP
  84.     CMP    AL,' '
  85.     JE    BNKLP
  86. EATLP:    LODS    AL
  87.     OR    AL,AL
  88.     JZ    INIDUN
  89.     CMP    AL,' '
  90.     JNE    EATLP
  91.     MOV    BL,-1
  92.     DEC    SI
  93.     PUSH    SI
  94. TAILLP:    LODS    AL
  95.     STOS    AL
  96.     INC    BL    ;COUNT BYTE
  97.     OR    AL,AL    ;TEST BYTE
  98.     JNZ    TAILLP
  99.     MOV    Z80_DMA,BL    ;TAIL SIZE
  100.     POP    SI
  101.     MOV    DI,OFFSET Z80_FCB
  102.     CALL    GETFN
  103.     MOV    DI,OFFSET Z80_FCB+16
  104.     CALL    GETFN
  105. INIDUN:    RET
  106. ;
  107. HELP:
  108.     MOV    DX,OFFSET HLP_MSG
  109.     CALL    PRINT1
  110.     POP    AX    ;ADJUST STACK FOR INIT RETURN
  111.     JMP    EXIT
  112. ;
  113. GETFN:
  114.     call    nitf
  115.     call    gstart
  116.     jnz    ntblnk
  117.     ret
  118. ntblnk:    call    getdrv
  119.     call    getps
  120.     RET
  121. ;
  122. nitf:    push    di
  123.     xor    al,al
  124.     stos    al
  125.     mov    al,' '
  126.     mov    cx,11
  127.     rep stos    al
  128.     xor    al,al
  129.     mov    cx,4
  130.     rep stos    al
  131.     pop    di
  132.     ret
  133. ;
  134. gstart:    call    getch
  135.     jz    isdelm
  136.     dec    si
  137.     ret
  138. isdelm:    cmp    al,';'
  139.     jne    ntsemic
  140.     ret
  141. ntsemic:    or    al,al
  142.     jnz    gstart
  143.     ret
  144. ;
  145. getch:    lods    al
  146.     cmp    al,'.'
  147.     jne    t1
  148.     ret
  149. t1:    cmp    al,','
  150.     jne    t2
  151.     ret
  152. t2:    cmp    al,';'
  153.     jne    t2a
  154.     ret
  155. t2a:    cmp    al,' '
  156.     jne    t3
  157.     ret
  158. t3:    cmp    al,':'
  159.     jne    t4
  160.     ret
  161. t4:    cmp    al,'='
  162.     jne    t5
  163.     ret
  164. t5:    cmp    al,'<'
  165.     jne    t6
  166.     ret
  167. t6:    cmp    al,'>'
  168.     jne    t7
  169.     ret
  170. t7:    or    al,al
  171.     ret
  172. ;
  173. getdrv:
  174.     inc    si
  175.     lods    al
  176.     dec    si
  177.     dec    si
  178.     cmp    al,':'
  179.     jnz    gdret
  180.     lods    al
  181.     sub    al,'@'
  182.     stos    al
  183.     inc    si
  184.     ret
  185. gdret:    inc    di
  186.     ret
  187. ;
  188. getps:
  189.     mov    cx,8
  190.     call    getnam
  191.     cmp    al,'.'    ;dot terminator?
  192.     jnz    gtpret
  193. ftpont:    cmp    cl,0
  194.     jz    getft
  195.     inc    di
  196.     dec    cl
  197.     jmps    ftpont
  198. getft:    mov    cx,3
  199.     call    getnam
  200. gtpret:    ret
  201. ;
  202. getnam:    call    getch
  203.     jnz    gnl1
  204.     ret
  205. gnl1:    cmp    al,'*'
  206.     jz    ambig
  207.     stos    al
  208.     dec    cl
  209.     jnz    getnam
  210.     jmps    getdel
  211. ambig:    mov    al,'?'
  212. qfill:    rep stos al
  213. getdel:    call    getch
  214.     jnz    getdel
  215.     ret
  216. ;
  217. LOAD_Z80:
  218.     PUSH    ES
  219.     mov    al,fcbt1
  220.     cmp    al,' '
  221.     jne    typset
  222.     mov    fcbt1,'C'
  223.     mov    fcbt2,'MO'
  224. typset:    MOV    CL,BDOS_OPENF
  225.     MOV    DX,OFFSET FCB
  226.     INT    BDOS            ;OPEN Z80 PROGRAM FILE
  227.     INC    AL            ;0FFH=ERROR
  228.     POP    ES
  229.     JZ    LOAD_ERROR 
  230.     PUSH    ES
  231.     MOV    CL,BDOS_DMA_BASE
  232.     MOV    DX,ES            ;DMA BASE AT ESEG ORIGIN
  233.     INT    BDOS            ;SET IT
  234.     MOV    DX,OFFSET Z80_TPA    ;BEGIN LOAD THE FILE AT 0100H
  235. LOAD_LOOP:
  236.     PUSH    DX
  237.     MOV    CL,BDOS_DMA_OFFSET
  238.     INT    BDOS            ;DMA NOW POINTS TO NEXT 128 BYTE BLOCK
  239.     MOV    CL,BDOS_READ_NEXT
  240.     MOV    DX,OFFSET FCB
  241.     INT    BDOS            ;READ NEXT RECORD
  242.     OR    AL,AL            ;0 INDICATES READ OK
  243.     JNZ    LOAD_EXIT        ;END OF FILE
  244.     POP    DX
  245.     ADD    DX,128            ;POINT TO NEXT BLOCK
  246.     JMP    LOAD_LOOP
  247. LOAD_EXIT:
  248.     POP    DX            ;RESTORE STACK
  249.     MOV    CL,BDOS_CLOSEF
  250.     MOV    DX,OFFSET FCB
  251.     INT    BDOS            ;CLOSE IT UP
  252.     MOV    DX,OFFSET Z80_DMA    ;SET DEFAULT DMA
  253.     MOV    CL,BDOS_DMA_OFFSET
  254.     INT    BDOS
  255.     POP    ES
  256.     CLC                ;RESET ERROR
  257.     RET
  258. LOAD_ERROR:
  259.     MOV    DX,OFFSET MSG_NO_FILE
  260.     CALL    PRINT
  261.     POP    ES
  262.     STC                ;SET ERROR
  263.     RET
  264.  
  265. RUN_Z80:
  266.     MOV    SI,0100H        ;INITIALIZE Z80 IP TO BASE OF TPA
  267. ;    PUSHF
  268. RUN_LOOP:
  269.     CMP    SI,0C000H        ;TOP OF Z80 MEMORY
  270.     JNB    Z80_RANGE_ERROR        ;JUMP OUT OF RANGE
  271.     CMP    SI,0BFF8H        ;BDOS CALL VECTOR
  272.     JE    Z80_BDOS_CALL
  273. Z80_OK:
  274.     MOV    DI,ES:[SI]        ;DI[L] CONTAINS Z80 INSTRUCTION
  275.     AND    DI,00FFH        ;REMOVE HIGH ORDER BYTE
  276.     SAL    DI,1            ;MULTIPLY BY 2 FOR JUMP OFFSET
  277.     INC    SI            ;BUMP Z80 INSTRUCTION ADDRESS
  278.     MOV    BX,ES:[SI]        ;WORD AFTER OP CODE
  279.     MOV    CX,JTABLE[DI]        ;CX IS ADDRESS OF OP ROUTINE
  280. ;    POPF
  281. ;    PUSH    ES
  282. ;    LAHF
  283.     SAHF
  284.     CALL    CX            ;EXECUTE INSTRUCTION
  285. ;    POP    ES
  286. ;    PUSHF
  287.     LAHF
  288.     JMP    RUN_LOOP        ;NEXT PLEASE
  289. Z80_BDOS_CALL:
  290.     PUSH    AX
  291.     MOV    CH,0
  292.     MOV    CL,Z_C
  293.     MOV    DX,Z_DE
  294.     PUSH    SI
  295.     PUSH    DS
  296.     PUSH    ES
  297.     PUSH    ES
  298.     POP    DS
  299.     INT    BDOS
  300.     POP    ES
  301.     POP    DS
  302.     MOV    Z_HL,BX
  303.     MOV    Z_A,AL
  304.     MOV    Z_DE,DX
  305.     POP    SI
  306.     CALL    Z80_RET
  307.     POP    AX
  308.     JMP    RUN_LOOP
  309. Z80_RANGE_ERROR:
  310.     CMP    SI,0FFFFH
  311.     JE    Z80_END            ;BOOT
  312.     PUSH    ES
  313.     MOV    DX,OFFSET MSG_RANGE_ERROR
  314.     CALL    PRINT
  315.     POP    ES
  316. Z80_END:
  317. ;    POPF
  318.     RET
  319. ;
  320. JTABLE:
  321.     NOLIST
  322.     INCLUDE    JUMPADDR.Z80        ;JUMP ADDRESS TABLE
  323.     LIST
  324. EDTBL:
  325.     NOLIST
  326.     INCLUDE EDADDR.Z80
  327.     LIST
  328. CBTBL:
  329.     NOLIST
  330.     INCLUDE CBADDR.Z80
  331.     LIST
  332. ;
  333.     INCLUDE    CODE8086.Z80        ;8086 INSTS. FOR Z80 OP CODES
  334.     INCLUDE CODECB.Z80
  335.     INCLUDE CODEED.Z80
  336. PRINT:
  337.     PUSH    ES
  338.     PUSH    DX
  339.     MOV    DX,OFFSET MSG_Z80
  340.     CALL    PRINT1
  341.     POP    DX
  342.     CALL    PRINT1
  343.     MOV    DX,OFFSET MSG_CR_LF
  344.     CALL    PRINT1
  345.     POP    ES
  346.     RET
  347. ;
  348. PRINT1:    MOV    CL,BDOS_PRINT
  349.     INT    BDOS
  350.     RET
  351.  
  352.     DSEG
  353.     ORG    05CH
  354. FCB:
  355.     rb    9
  356. fcbt1    rb    1
  357. fcbt2    rw    1
  358.     ORG    06CH
  359. FCB2:
  360.     ORG    080H
  361. TBUF:
  362.     ORG    0100H            ;PAST UDA
  363. Z_REGISTERS:            ;PRIMARY REGISTER SET
  364. Z_C        RB    1        ;REGISTER C
  365. Z_B        RB    1        ;REGISTER B
  366. Z_E        RB    1        ;REGISTER E
  367. Z_D        RB    1        ;REGISTER D
  368. Z_L        RB    1        ;REGISTER L
  369. Z_H        RB    1        ;REGISTER H
  370. Z_F        RB    1        ;REGISTER F...Z80 CONTROL FLAGS
  371. Z_A        RB    1        ;REGISTER A
  372.     ORG    0100H
  373. Z_BC        RW    1        ;REGISTER BC
  374. Z_DE        RW    1        ;REGISTER DE
  375. Z_HL        RW    1        ;REGISTER HL
  376. Z_AF        RW    1        ;REGISTER AF
  377. Z_SP        DW    0BFF0H        ;Z80 STACK POINTER
  378. ;
  379. Z_ALTR        RW    3
  380. Z_ALTA        RW    1
  381. Z_X        RW    1
  382. Z_Y        RW    1
  383. Z_TEMP        RW    3    ;SCRATCH FOR SWAP
  384.  
  385. MSG_NO_FILE    DB    'NO Z80 FILE$'
  386. MSG_TERMINATE    DB    'EXITING TO CP/M-86$'
  387. MSG_RANGE_ERROR    DB    'BRANCH OUTSIDE ADDRESS SPACE$'
  388. MSG_Z80_OP    DB    'Z80 OP CODE DETECTED, ONLY 8080 ALLOWED$'
  389. MSG_Z80        DB    CR,LF,'z80-->$'
  390. MSG_CR_LF    DB    CR,LF,'$'
  391. HLP_MSG    DB    'Syntax: Z80 cmd <parameters>',cr,lf
  392.     DB    'Where cmd is 8080 file (default .COM)',cr,lf
  393.     DB    'and <parameters> are the normal arguments.',cr,lf,'$'
  394. ;    START OF HI RAM IMAGE
  395. BIOSIMG: 
  396.     DB    ZJMP
  397.     DW    0FFFFH            ;JP COLDBOOT
  398.     DB    ZJMP
  399.     DW    0FFFFH            ;JP WARMBOOT
  400.     DB    ZJMP
  401.     DW    OFFSET ZBIOS1        ;JP CONST
  402.     DB    ZJMP
  403.     DW    OFFSET ZBIOS2        ;JP CONIN
  404.     DB    ZJMP
  405.     DW    OFFSET ZBIOS3        ;JP CONOUT
  406.     DB    ZJMP
  407.     DW    OFFSET ZBIOS4        ;JP LIST
  408.     DB    ZJMP
  409.     DW    0FFFEH        ;JP PUNCH (NG)
  410.     DB    ZJMP
  411.     DW    0FFFEH        ;JP READER (NG)
  412.     DB    ZJMP
  413.     DW    0FFFEH        ;JP HOME (NG)
  414.     DB    ZJMP
  415.     DW    0FFFEH        ;JP SELDSK (NG)
  416.     DB    ZJMP
  417.     DW    0FFFEH        ;JP SETTRK (NG)
  418.     DB    ZJMP
  419.     DW    0FFFEH        ;JP SETSEC (NG)
  420.     DB    ZJMP
  421.     DW    0FFFEH        ;JP SETDMA (NG)
  422.     DB    ZJMP
  423.     DW    0FFFEH        ;JP READ (NG)
  424.     DB    ZJMP
  425.     DW    0FFFEH        ;JP WRITE (NG)
  426.     DB    ZJMP
  427.     DW    0FFFEH        ;JP LISTST (NG)
  428.     DB    ZJMP
  429.     DW    0FFFEH        ;JP SECTTRANS (NG)
  430. ;
  431.     DB    ZLDCNN,BDOS_DIRECT    ;LD C,BDOS_DIRECT (RAW I/O)
  432.     DB    ZLDENN,0FEH        ;LD E,BDOS_GET_STATUS
  433.     DB    ZCALL
  434.     DW    0BFF8H            ;JP BDOS
  435.     DB    ZRET
  436. ;
  437.     DB    ZLDCNN,BDOS_DIRECT    ;LD C,BDOS_DIRECT (RAW I/O)
  438.     DB    ZLDENN,0FFH        ;LD E,BDOS_INPUT_CHAR
  439.     DB    ZCALL
  440.     DW    0BFF8H            ;JP BDOS
  441.     DB    ZORA            ; ORA A
  442.     DB    ZJZ
  443.     DW    OFFSET ZBIOS2
  444.     DB    ZRET
  445. ;
  446.     DB    ZLDEC            ;LD E,C
  447.     DB    ZLDCNN,BDOS_DIRECT    ;RAW I/O
  448.     DB    ZCALL
  449.     DW    0BFF8H            ;JP BDOS
  450.     DB    ZRET
  451. ;
  452.     DB    ZLDEC            ;LD E,C
  453.     DB    ZLDCNN,BDOS_LIST    ;LD C,OUTPUT
  454.     DB    ZCALL
  455.     DW    0BFF8H            ;JP BDOS
  456.     DB    ZRET
  457. ;
  458.     RB    155
  459.     DW    0FFFFH        ;FORCE REBOOT
  460.     RB    14
  461. BIOIMGE:
  462. ;
  463.     ESEG
  464. Z80_BOOT    DB    0C3H        ;JP BOOT
  465.         DW    0BF03H        ;0FFFFH RETURNS TO 8086
  466. Z80_IOBYTE    DB    0        ;IOBYTE
  467. Z80_DISK    DB    0        ;CURRENT DISK
  468. Z80_BDOS    DB    0C3H        ;JMP BDOS
  469.         DW    0BFF8H        ;SET FOR 48K TPA
  470.     ORG    05CH            ;Z80 FCB
  471. Z80_FCB:
  472.     DB    0,'        ','   ',0,0,0,0    ;ONLY ONE VALID
  473.     DB    0,'        ','   ',0,0,0,0    ;NOT PARSED
  474.     ORG    080H
  475. Z80_BUF:
  476. Z80_DMA    DB    0
  477. Z80_TAIL:
  478.  
  479.     ORG    0100H            ;BEGINNING OF Z80 TPA
  480. Z80_TPA:
  481.     ORG    0BF00H            ;BIOS JUMP TABLE
  482. Z80_BIOSV:
  483.     RB    1 
  484.     RW    1
  485.     RB    1 
  486.     RW    1
  487.     RB    1 
  488.     RW    1
  489.     RB    1 
  490.     RW    1
  491.     RB    1 
  492.     RW    1
  493.     RB    1 
  494.     RW    1
  495.     RB    1 
  496.     RW    1
  497.     RB    1 
  498.     RW    1
  499.     RB    1 
  500.     RW    1
  501.     RB    1 
  502.     RW    1
  503.     RB    1 
  504.     RW    1
  505.     RB    1 
  506.     RW    1
  507.     RB    1 
  508.     RW    1
  509.     RB    1 
  510.     RW    1
  511.     RB    1 
  512.     RW    1
  513.     RB    1 
  514.     RW    1
  515.     RB    1 
  516.     RW    1
  517.  
  518.  ZBIOS1:                    ;GET CONSOLE STATUS
  519.     RB    8
  520. ZBIOS2:                    ;GET ONE CHARACTER
  521.     RB    12
  522. ZBIOS3:                    ;SEND ONE CHARACTER
  523.     RB    7
  524. ZBIOS4:                    ;ONE CHAR TO LIST
  525.     RB    7
  526. ;
  527.     ORG    0BFF0H
  528.     RW    1 ;
  529.     ORG    0BFFFH
  530.     RB    1        ;MAKE SURE MP/M-86 DOES
  531.  
  532.     END
  533.