home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol040 / host.z80 < prev    next >
Text File  |  1984-04-29  |  9KB  |  448 lines

  1. ; HOST Program for AMD 96-4016 Z8000 Monitor
  2. ;
  3. ; Sourced March '80 by     Trevor Marshall
  4. ;            Elec Eng Dept
  5. ;            Uni W.A.
  6. ;
  7. ; This program was written for a Z80 CPU
  8. ; running a CDOS 2.17 Disk Operating System.
  9. ;
  10. ; It has been modified for 8080 CPU 
  11. ; but not fully tested with that CPU
  12. ;
  13. ; Most code is compatible with other CP/M
  14. ; systems, but will have to be tailored
  15. ; to the individual's hardware environment
  16. ;
  17. ; Although the AMD SYS 8/8 uses parallel
  18. ;  ports for handshaking the 96-4016 will also
  19. ;  support serial I/O and this method is
  20. ;  usually preferable.
  21. ; The AMD Monitor uses an 8 bit data word with
  22. ;  parity generated in software.
  23. ; If you cannot configure your HOST USART
  24. ;  to that format then you must null the 
  25. ;  parity generation with NOPs and the parity
  26. ;  checking may be defeated with a prior RET
  27. ; Note that the AMD SYS 8/8 appears to have a
  28. ;  CP/M compatible operating system
  29. ;
  30. BDOS:    EQU    5    ;CDOS system call addr
  31. RNEXT:    EQU    14H    ;Read next record
  32. WNEXT:    EQU    15H    ;Write next record
  33. FCREATE: EQU    16H    ;Create a file
  34. RESET:    EQU    0DH    ;Reset CDOS
  35. FOPEN:    EQU    0FH    ;Open a file
  36. FCLOSE:    EQU    10H    ;Close a file
  37. DMA:    EQU    1AH    ;Set disk buffer address
  38. FORMAT: EQU    86H    ;Format name to FCB
  39. NAK:    EQU    15H    ;CTL-U
  40. ENQ:    EQU    5    ;CTL-E
  41. ACK:    EQU    6    ;CTL-F
  42. SOH    EQU    1    ;CTL-A
  43. STX:    EQU    2    ;CTL-B    
  44. EOT:    EQU    4    ;CTL-D
  45. EOF:    EQU    1AH    ;End of file marker byte
  46. ;
  47. ;THE FOLLOWING EQUATES ARE HARDWARE DEPENDENT
  48. ;
  49. CSTATP: EQU    0F7H    ;Console driver status port
  50. CDATA:    EQU    0F6H    ;Console data port
  51. CRDA:    EQU    2    ;RDA bit
  52. CTBE:    EQU    1    ;TBE bit
  53. ;
  54.     ORG    100H
  55. ;
  56. START:    LD    SP,80H
  57.     LD    A,0
  58.     LD    (FLAG),A ;Clear the file opened flag
  59. ; Now output system prompt to console
  60.     LD    DE,MSG
  61.     LD    C,9    ;Print Buffered Line
  62.     CALL    BDOS
  63. ;
  64. MORE:    LD    SP,80H    ;Reset Stack Pointer
  65.     LD    A,0
  66.     LD    (CODE),A ;Clear the error code
  67.     CALL    DIALOG    ;Wait for an instruction
  68.     LD    A,(NEWCODE) ;2 locs to ease debugging
  69.     LD    (CURCODE),A    ;Save it
  70. ; Now decode the Function request type
  71.     CP    A,4
  72.     JP    Z,OPEN
  73.     CP    A,5
  74.     JP    Z,CLOSE
  75.     CP    A,6
  76.     JP      Z,CREATE
  77.     CP    A,7
  78.     JP    Z,READ
  79.     CP    A,8
  80.     JP    Z,WRITE
  81. ;
  82.     JP    N7    ;If not one of the above instrs
  83. ;
  84. ; S/R to set up FCB name in FCB block from BFFR data
  85. ;
  86. SETUP    LD    A,(REQBFFR) ;Fetch the drive (A - C)
  87.     SUB    A,40H    ;A = 01 IN FCB
  88.     LD    (REQBFFR+1),A ;Put drive # in FCB
  89.     LD    HL,REQBFFR+1 ;Point at start of legal code
  90.     LD    DE,FCB    ;Point at FCB area
  91.     LD    BC,12    ;# of bytes in name & drive
  92. ;    LDIR        ;Shift name to FCB
  93. ; implement the LDIR in 8080 code:
  94. L1:    LD    A,(HL)    ;***** THIS CODE HAS NOT
  95.     LD    (DE),A    ;   BEEN CHECKED******
  96.     INC    HL
  97.     INC    DE
  98.     DEC    BC
  99.     LD    A,C    ;Is BC = 0
  100.     OR    A,B
  101.     JP    NZ,L1
  102. ;
  103.     RET
  104. ;
  105. ;Now try to open file
  106. OPEN:    LD    C,RESET
  107.     CALL    BDOS    ;First log off all disks
  108.     CALL    SETUP   ;Set up FCB
  109.     LD    DE,FCB
  110.     LD    C,FOPEN
  111.     CALL    BDOS    ;Open file
  112. ; Any errors?
  113.     ADD    A,1    ;Is a = -1 ?
  114.     JP    Z,N7
  115. ; Opened successfully, now can process read or write
  116.     LD    A,0FFH
  117.     LD    (FLAG),A ;Set opened flag
  118.     CALL    TRNS    ;Acknowledge
  119.     JP    MORE    ;Get next instruction
  120. ;
  121. WRITE:    LD    A,(FLAG) ;Check file is created or open
  122.     CP    A,0
  123.     JP    Z,N5 ;no, send error code 3
  124. ; Now set the DMA address to BFFR
  125.     LD    C,DMA
  126.     LD    DE,BFFR
  127.     CALL    BDOS
  128. ;
  129.     LD    DE,FCB
  130.     LD    C,WNEXT
  131.     CALL    BDOS    ;Write the record
  132.     CP    A,1    ;entry error
  133.     JP    Z,N5    ; send code 3
  134.     CP    A,2
  135.     JP    Z,N7    ;Send code 1 if out of space
  136.     CP    0    ;OK
  137.     JP    NZ,N8    ;Send code 2 for other errors
  138. ; Must be OK,wait for next instruction
  139.     CALL    TRNS
  140.     JP    MORE
  141. ;
  142. CLOSE:    LD    A,(FLAG) ;Dont close an unopened file
  143.     CP    0
  144.     JP    Z,N5    ;not open
  145.     LD    C,FCLOSE
  146.     LD    DE,FCB
  147.     CALL    BDOS
  148.     CP    A,0FFH
  149.     JP    Z,N7    ;A=FF means not found
  150.     LD    A,0
  151.     LD    (FLAG),A ;Clear the open file flag
  152.     LD    (CODE),A ;Clr error flag
  153.     JP    N10
  154. N7:    LD    A,1    ;Send error code 1
  155.     JP    N6
  156. N8:    LD    A,2    ;Send error code 2
  157.     JP    N6
  158. N5:    LD    A,3    ;Send error code 3
  159. N6:    LD    (CODE),A ;File not open or created
  160. N10:    CALL    TRNS
  161. ; Omit the following for 8080 CP/M
  162. ;    LD    C,96H    ;Call to CDOS 2.17 to turn
  163. ;    CALL    BDOS    ; drive motors off
  164.     JP    MORE
  165. ;
  166. READ:    LD    A,(FLAG) ;Is file open ?
  167.     CP    0
  168.     JP    NZ,N2 ;Yes
  169.     LD    C,RESET    ;No,open it
  170.     CALL    BDOS
  171.     CALL    SETUP
  172.     LD    DE,FCB
  173.     LD    C,FOPEN
  174.     CALL    BDOS
  175.     ADD    A,1
  176.     JP    Z,N5   ;type 3 error, not found
  177.     LD    A,0FFH
  178.     LD    (FLAG),A ;Set open flag
  179. ; File opened now read record
  180. N2:    LD    C,DMA    ;set CDOS DMA addr to bffr
  181.     LD    DE,BFFR
  182.     CALL    BDOS
  183.     LD    C,RNEXT    ;read next record
  184.     LD    DE,FCB
  185.     CALL    BDOS
  186. ; Now process error codes
  187.     CP    0    ;1 = <EOF>
  188.     JP    Z,M1  
  189. ; Must be 1, End Of File
  190. ; Note that this error is only returned AFTER an
  191. ; abortive attempt to fetch the next sector, and
  192. ; <EOF> within data is transferred normally, so
  193. ; ASM will give errors unless a QUIT instruction
  194. ; is used to end the source file.
  195.     LD    A,1
  196.     LD    (CODE),A
  197.     CALL    TRNS    ;Dont send any data
  198.     JP    MORE
  199. M1:    CALL    SEND    ;Transmit normal data
  200.     JP    MORE
  201. ;
  202. CREATE:    LD    A,(FLAG) ;Is file open?
  203.     CP    0
  204.     JP    NZ,N5    ;Yes send error code 3
  205.     LD    C,RESET    ;Log off all disks
  206.     CALL    BDOS    ;Prior to directory operations
  207.     CALL    SETUP
  208. ; First check if a file already exists with this name
  209. ; Dont delete it,as it may be a mistaken command
  210.     LD    DE,FCB
  211.     LD    C,11H    ;Search Directory cmd
  212.     CALL    BDOS
  213.     CP    A,0FFH    
  214.     JP    Z,MI3    ;Entry was not found
  215.     LD    A,(HL)    ;Fetch the first directory byte
  216.     CP    A,0E5H    ;Is it erased
  217.     JP    NZ,N5    ;No, send error
  218. MI3:    LD    C,FCREATE
  219.     LD    DE,FCB
  220.     CALL    BDOS
  221.     CP    A,0FFH
  222.     JP    Z,N7    ;Send error code 1
  223.     CALL    TRNS
  224.     LD    A,0FFH
  225.     LD    (FLAG),A ;Set the open flag
  226.     JP    MORE
  227. ;
  228. ;
  229. ; S/R to accomplish I/O
  230. ; N.B. THESE WILL BE HARDWARE DEPENDENT
  231. CSTAT:    IN    A,CSTATP
  232.     AND    CRDA
  233.     RET    Z
  234.     LD    A,-1
  235.     RET
  236. ;
  237. CHIN:    CALL    CSTAT
  238.     JP    Z,CHIN
  239.     IN    A,CDATA
  240.     AND    7FH    ;Strip off parity bit
  241.     RET
  242. ;
  243. CRDY:    IN    A,CSTATP
  244.     AND    CTBE
  245.     RET    Z
  246.     LD    A,-1
  247.     RET
  248. ;
  249. COUT:    PUSH    AF
  250. C1:    CALL    CRDY
  251.     JP    Z,C1
  252.     POP    AF
  253.     OUT    CDATA,A
  254.     RET
  255. ;
  256. ;
  257. ; S/R DIALOG to talk to Z8000
  258. DIALOG: LD    HL,0FFFFH ;Load a delay value to HL
  259. ; We will decrement HL until 0, then switch the
  260. ; disk drive motors off
  261. DI1:    CALL    CSTAT
  262.     JP    NZ,DIA2 ;Have input,exit motor loop
  263.     DEC    HL
  264.     LD    A,L    ;No flag setting after DEC HL
  265.     OR    H
  266.     JP    NZ,DI1    ;Try the loop again
  267. ; Have now waited long enough, assume Z8000 done
  268. ;    LD    C,96H    ;Call to CDOS 2.17 to turn
  269. ;    CALL    BDOS    ; drive motors off
  270.     JP    DIA2
  271. KNACK:    LD    A,NAK
  272.     CALL    COUT
  273.     JP    DIALOG ;Service motors
  274. DIA2:    CALL    CHIN
  275.     CP    ENQ
  276.     JP    NZ,KNACK ;Only <ENQ> is valid
  277. ACKNL:    LD    A,ACK
  278.     CALL    COUT
  279. RECVE:    LD    HL,REQBFFR
  280.     CALL    CHIN
  281.     CP    SOH    ;Answer should be <SOH>
  282.     JP    NZ,FLUSH
  283.     CALL    CHIN    ;FUNCTION REQUEST CODE 
  284.     SUB    A,30H
  285.     LD    (NEWCODE),A
  286. ; We will just receive chars and store them in req bffr
  287. RECVA:    CALL    CHIN
  288.     CP    A,EOT
  289.     JP    Z,RECVB    ;Message ends with <EOT>
  290.     CP    A,STX
  291.     JP    Z,RECVA    ;Discard it
  292. ; Now process two hex bytes
  293.     SUB    30H    ;Pseudo-Hex format is used
  294. ; Cabt SLA C in 8080, so rewrite
  295.     SCF
  296.     CCF
  297.     RLA
  298.     SCF
  299.     CCF
  300.     RLA
  301.     SCF
  302.     CCF
  303.     RLA
  304.     SCF
  305.     CCF
  306.     RLA
  307.     LD    C,A    ;Save first hex digit
  308.     CALL    CHIN
  309. ;    SLA    C
  310. ;    SLA    C
  311. ;    SLA    C
  312. ;    SLA    C
  313.     SUB    A,30H
  314.     AND    A,0FH    ;Mask off upper nibble
  315.     ADD    A,C    ;Now have Hex digit
  316.     LD    (HL),A
  317.     INC    HL
  318.     LD    A,L
  319.     CP    REQBUFFEND AND 0FFH
  320.     JP    NZ,RECVA
  321.     LD    A,H
  322.     CP    REQBUFFEND SHR 8
  323.     JP    NZ,RECVA
  324.     LD    HL,BFFR    ;Now point at data buffer
  325.     JP    RECVA
  326. ;
  327. RECVB:    LD    A,ACK
  328.     CALL    COUT
  329.     RET
  330. ;
  331. ;FLUSH routine to discard all input characters
  332. ; up to the next <EOT> after an input error
  333. ;
  334. FLUSHB:    LD    A,NAK
  335.     CALL    COUT    ;Send a <NAK>
  336. FLUSH:    CALL    CHIN 
  337.     CP    EOT    ;EOT means end of input
  338.     JP    NZ,FLUSHB ;Continue to flush
  339.     JP    DIALOG    ;Try to fetch the data again
  340. ;
  341. ; S/R to transmit code,response & data in 96-4016 format
  342. ;
  343. SEND:   LD    A,ENQ    
  344.     CALL    COUT    ;Ask permission to send
  345. SENDA:     CALL    CHIN
  346.     CP    A,ACK    ;Must reply with <ACK>
  347.     JP    NZ,SEND  
  348. SENDB:     LD    A,SOH
  349.     CALL    COUT
  350.     LD    A,(CURCODE)
  351.     ADD    A,30H
  352.     CALL    COUT    ;Transmit the Function Code
  353.     LD    A,STX
  354.     CALL    COUT
  355.     LD    A,'0'    ;Error codes, first is zero
  356.     CALL    COUT
  357.     LD    A,(CODE) ;Second code byte
  358.     ADD    '0'
  359.     CALL    COUT
  360. ; Now transmit text
  361.     LD    HL,BFFR
  362. LP4:    LD    A,(HL)
  363.     LD    C,A    ;Save it
  364.     AND    A,0F0H
  365. ; Cant SRA A in 8080,
  366. ;    SRA    A
  367. ;    SRA    A
  368. ;    SRA    A
  369. ;    SRA    A
  370.     SCF
  371.     CCF
  372.     RRA
  373.     SCF
  374.     CCF
  375.     RRA
  376.     SCF
  377.     CCF
  378.     RRA
  379.     SCF
  380.     CCF
  381.     RRA
  382.     ADD    A,'0'    ;Get in Pseudo-Hex 
  383.     CALL    COUT
  384.     LD    A,C
  385.     AND    A,0FH
  386.     ADD    '0'
  387.     CALL    COUT
  388.     INC    HL
  389.     LD    A,L
  390.     CP    [BUFFEND AND 0FFH]
  391.     JP    NZ,LP4
  392.     LD    A,H    ;L was equal,test H
  393.     CP    A,[BUFFEND SHR 8]
  394.     JP    NZ,LP4
  395. ;Now have finished buffer
  396. J4:    LD    A,EOT
  397.     CALL    COUT
  398. ; Now wait for <ACK>
  399.     CALL    CHIN
  400.     CP    ACK
  401.     RET    Z
  402.     JP    SEND  
  403. ;
  404. ;
  405. ; S/R to transmit code and response only to 96-4016
  406. ;
  407. TRNS:    LD    A,ENQ    
  408.     CALL    COUT    ;Ask permission to send
  409. TRNSA:    CALL    CHIN
  410.     CP    A,ACK    ;Must reply with <ACK>
  411.     JP    NZ,TRNS
  412. TRNSB:    LD    A,SOH
  413.     CALL    COUT
  414.     LD    A,(CURCODE)
  415.     ADD    A,30H
  416.     CALL    COUT    ;Transmit the Function Code
  417.     LD    A,STX
  418.     CALL    COUT
  419.     LD    A,'0'    ;Error codes, first is zero
  420.     CALL    COUT
  421.     LD    A,(CODE) ;Second code byte
  422.     ADD    '0'
  423.     CALL    COUT
  424.     LD    A,EOT
  425.     CALL    COUT
  426. ; Now wait for <ACK>
  427.     CALL    CHIN
  428.     CP    ACK
  429.     RET    Z
  430.     JP    TRNS
  431. ;
  432. MSG:    DB    0DH,0AH,'Z8000 HOST Communication Program'
  433.     DB    ' between CDOS and AMD 96-4016',0DH,0AH
  434.     DB    0DH,0AH,'       '
  435.     DB    'Contact Trevor Marshall for operating'
  436.     DB    ' proceedures.',0DH,0AH,'$'
  437. REQBFFR DS    13
  438. REQBUFFEND EQU    $
  439. BFFR:    DS    128
  440. BUFFEND EQU     $
  441. CURCODE DS    1    ;Current operation code
  442. NEWCODE DS    1    ;New operation code
  443. FCB:    DS    33    ;FCB area
  444. CODE    DS    1    ;Operation status code
  445. FLAG    DS    1    ;0 means file is NOT OPEN
  446.     NOP
  447.     END     START
  448.