home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol157 / ataribus.lbr / ATARIFN.CQM / ATARIFN.CSM
Text File  |  1985-03-13  |  10KB  |  481 lines

  1.     title    'ATARIFN: ATARI-CPM interface "C" functions'
  2.  
  3. ;************************************************
  4. ;    ATARIFN.CSM - 9/17/83
  5. ; Provides BDS "C" functions to interface to
  6. ; the ATARI over the S100 interface board.
  7. ;
  8. ;GENERIC, EASILY PATCHABLE VERSION FOR BDS C V1.5
  9. ;
  10. ;  Functions ending with '$' are internal functions
  11. ;dealing with the I/O ports directly which must be
  12. ;patched for different systems.
  13. ;
  14. ;************************************************
  15.  
  16.     include    <BDS.LIB>
  17.     include    "ATARI.LIB"
  18.  
  19.     function atarifnver
  20. ;************************************************
  21. ;    char *atarifnver()
  22. ; Returns address of ATARIFN version string
  23. ; SHOULD BE UPDATED WHENEVER THIS FILE IS ALTERED
  24. ;
  25.     lxi    h,ver
  26.     ret
  27.  
  28. ver:    db    '9/17/83'
  29.     db 0
  30.  
  31.     endfunc
  32.  
  33.     function ainit
  34. ;************************************************
  35. ;    ainit ()
  36. ; Initializes ATARI-S100 interface ports.
  37. ; Must be called at least once.
  38. ; No results
  39. ; $$$ must be patched $$$
  40. ;
  41.     xra    a    ;reset 2661
  42.     out    acmd
  43.     mvi    a,4Eh    ;1 stop bit, no parity, 8 bits
  44.     out    amode
  45.     mvi    a,7Eh    ;16X clock, 19,200 baud (ok Bob??)
  46.     out    amode
  47.     mvi    a,15h    ;reset flags, enable xmit & rcv
  48.     out    acmd
  49.     in    adata    ;clean any junk
  50.     ret
  51.  
  52.     ds    20    ;*extra space*
  53.  
  54.     endfunc
  55.  
  56.  
  57.     function getcf
  58.     external cmdf$,inch$,gotch$
  59. ;************************************************
  60. ;    int getcf (buf)
  61. ;    char *buf
  62. ; Waits for next valid command frame on ATARIBUS
  63. ; and returns it in "buf". If key is pressed on
  64. ; console then will abort and return -1 else
  65. ; returns 0. Does not input console char.
  66. ;
  67. ; *NOTE*: DOES DIRECT CALL TO CPM BIOS CONSOLE
  68. ; STATUS ROUTINE, MUST BE CHANGED IF RUN IN A
  69. ; NON-CPM SYSTEM.
  70. ;
  71.     call    ma1toh        ;get buffer addr
  72.     shld    buf        ;save
  73.     push    b        ;save stack frame
  74.     lda    base+2h        ;$$$ get bios page
  75.     sta    csts+2        ;$$$ to our vector
  76.  
  77. cflp:
  78. ;first wait for CMD- line to be false
  79. wlo:    lxi    d,1200        ;timeout count (aprx 20msec @ 4mhz)
  80. wlolp:    call    cmdf$        ;line drop yet?
  81.     jz    drop        ;yep..go drop junk chars
  82.     dcx    d        ;timeout?
  83.     mov    a,d
  84.     ora    e
  85.     jnz    wlolp        ;nope
  86. ;timeout, check for key pressed abort
  87.     call    csts
  88.     jz    wlo        ;no key, keep waiting
  89. ;key pressed, abort with error
  90. abort:    lxi    h,-1        ;return value
  91.     pop    b        ;stack frame
  92.     ret
  93. ;CMD- line is false, clean out junk chars from serial port
  94. drop:    call    inch$
  95.     call    inch$
  96. ;now wait for CMD- line to go TRUE
  97. whi:    lxi    d,1200        ;timeout count (aprx 20msec @ 4mhz)
  98. whilp:    call    cmdf$        ;start of command frame?
  99.     jnz    getdf        ;yep
  100.     dcx    d        ;timeout?
  101.     mov    a,d
  102.     ora    e
  103.     jnz    whilp        ;nope
  104. ;timeout, check for key pressed abort
  105.     call    csts
  106.     jz    whi        ;no key, keep waiting
  107.     jmp    abort        ;key pressed, return error
  108. ;now get command frame data to buffer with checksum
  109. getdf:    lhld    buf        ;buffer adr
  110.     lxi    b,0400h        ;B=length, C=checksum
  111. cmdlp:    call    inch        ;get next char
  112.     mov    m,a        ;stuff in buffer
  113.     inx    h
  114.     add    c        ;update checksum
  115.     aci    0        ;include carry
  116.     mov    c,a
  117.     dcr    b
  118.     jnz    cmdlp        ;get 4 chars
  119. ;now get checksum
  120.     call    inch        ;checksum to A
  121.     cmp    c        ;match?
  122.     jnz    cflp        ;no..ignore the frame
  123. ;valid command frame, wait for CMD- line to drop
  124.     lxi    d,1200        ;timeout count (aprx 20msec @ 4mhz)
  125. wdrop:    call    cmdf$        ;line drop yet?
  126.     jnz    dropto        ;no
  127. ;return 0 to caller
  128.     lxi    h,0
  129.     pop    b
  130.     ret
  131. ;check for timeout
  132. dropto:    dcx    d        ;timeout?
  133.     mov    a,d
  134.     ora    e
  135.     jnz    wdrop        ;nope
  136.     jmp    cflp        ;oops, timeout..drop command
  137.  
  138. ;local sub
  139. ;>>>>> wait for next char.  If char not received within around
  140. ; 50 msec then wait for CMD- line to drop and restart command
  141. ; wait loop.
  142. inch:    lxi    d,3000        ;timeout count, (@ 4mhz)
  143. inchlp:    call    gotch$        ;char received?
  144.     jnz    inch$        ;yep..return char in A
  145.     dcx    d        ;timeout yet?
  146.     mov    a,d
  147.     ora    e
  148.     jnz    inchlp        ;nope
  149. ;timeout, restart the whole process
  150.     pop    d        ;drop return
  151.     jmp    cflp
  152.  
  153. ; vector to BIOS console status routine
  154. csts:    call    0006h        ;BIOS console status
  155.     ora    a        ;set flags
  156.     ret
  157. ;
  158. buf:    ds    2        ;buffer addr
  159.  
  160.     endfunc
  161.  
  162.  
  163.     function getdf
  164.     external gotch$,inch$,outrdy$,outch$
  165. ;************************************************
  166. ;    int getdf (buf,len)
  167. ;    char *buf
  168. ;    int len
  169. ; Receives data frame of length "len" from
  170. ; ATARIBUS and places it in "buf" which should
  171. ; be at least "len" chars long. If the data frame
  172. ; is valid (checksum ok, no timeout) then sends ACK
  173. ; to ATARI and returns 0, else sends NAK to ATARI
  174. ; and returns -1.
  175. ;
  176.     call    ma1toh        ;buffer address
  177.     push    h        ;save
  178.     call    ma3toh        ;frame length
  179.     pop    d        ;buf adr again
  180.     push    b        ;save stack frame
  181.     xra    a        ;checksum & carry = 0
  182.     sta    cksum
  183. ; loop to get data frame
  184. dflp:    call    gch        ;get char
  185.     stax    d        ;into buffer
  186.     inx    d
  187.     mov    c,a        ;update checksum
  188.     lda    cksum
  189.     add    c
  190.     aci    0
  191.     sta    cksum
  192.     dcx    h        ;all done?
  193.     mov    a,h
  194.     ora    l
  195.     jnz    dflp        ;not yet waldo
  196. ; got the data frame, get and check the checksum
  197. cksmlp:    call    gch        ;get checksum
  198.     mov    c,a
  199.     lda    cksum        ;get ours
  200.     cmp    c        ;match?
  201.     jnz    err        ;no..THEY goofed (of course)
  202. ; good frame and good checksum, return honky dorey
  203.     mvi    c,ACK        ;char to send
  204.     lxi    h,0        ;return value
  205. ; delay a bit then send char in C to ATARI
  206. ; and return value in HL to caller
  207. return:    mvi    b,0        ;delay at least 850 us
  208. rlp:    nop
  209.     nop
  210.     nop
  211.     dcr    b
  212.     jnz    rlp
  213. ; send char in C to ATARI
  214. sendlp:    call    outrdy$        ;ok to send?
  215.     jz    sendlp        ;not yet
  216.     mov    a,c        ;sho'nuf
  217.     call    outch$
  218.     pop    b        ;stack frame
  219.     ret
  220.  
  221. ;local sub
  222. ;>>>>> get next char from bus, return to main pgm with error if
  223. ; get a timeout (max wait around 50 msec)
  224. gch:    lxi    b,3000        ;timeout count (@ 4mhz)
  225. gchlp:    call    gotch$        ;get char?
  226.     jnz    inch$        ;yep..return char in A
  227.     dcx    b
  228.     mov    a,b
  229.     ora    c
  230.     jnz    gchlp        ;no timeout
  231. ;>>>>> timeout, drop return address, send NAK and return error
  232.     pop    b
  233. err:    mvi    c,NAK        ;send NAK
  234.     lxi    h,-1        ;return value
  235.     jmp    return
  236.  
  237. cksum:    ds    1        ;checksum byte
  238.  
  239.     endfunc
  240.  
  241.  
  242.     function putdf
  243.     external outch$,outrdy$
  244. ;************************************************
  245. ;    putdf (buf,len)
  246. ;    char *buf
  247. ;    int len
  248. ; Sends data frame to ATARI "len" chars long
  249. ; starting at address "buf". No results.
  250. ;
  251.     call    ma1toh        ;buffer address
  252.     push    h        ;save
  253.     call    ma3toh        ;frame length
  254.     pop    d        ;buf addr again
  255.     push    b        ;save stack frame
  256.     mvi    b,0        ;checksum = 0
  257. ; loop to send data frame
  258. dflp:    call    outrdy$        ;ok to send?
  259.     jz    dflp        ;nope
  260.     ldax    d        ;get buffer char
  261.     inx    d
  262.     call    outch$        ;send it
  263.     add    b        ;update checksum
  264.     aci    0        ;include carry
  265.     mov    b,a
  266.     dcx    h        ;all done?
  267.     mov    a,l
  268.     ora    h
  269.     jnz    dflp        ;not yet clone
  270. ; send the checksum
  271. cklp:    call    outrdy$        ;ok to send?
  272.     jz    cklp        ;alas..no
  273.     mov    a,b
  274.     call    outch$
  275.  
  276.     pop    b        ;stack frame
  277.     ret
  278.     endfunc
  279.  
  280.  
  281.     function agetch
  282.     external gotch$,inch$
  283. ;************************************************
  284. ;    int agetch ()
  285. ; Returns next char from ATARIBUS or -1 if
  286. ; timed out
  287. ;
  288.     lxi    d,0        ;timeout count
  289. getlp:    call    gotch$        ;char there?
  290.     jnz    gotch        ;yep
  291.     dcx    d
  292.     mov    a,d
  293.     ora    e
  294.     jnz    getlp        ;no timeout
  295. ; timed out, return -1
  296.     lxi    h,-1
  297.     ret
  298. ; got the char, return it
  299. gotch:    call    inch$        ;get char
  300.     mov    l,a
  301.     mvi    h,0        ;return in HL
  302.     ret
  303.     endfunc
  304.  
  305.  
  306.     function aputch
  307.     external outrdy$,outch$
  308. ;************************************************
  309. ;    aputch (c)
  310. ;    char c
  311. ; Outputs character in "c" to ATARIBUS.
  312. ; No result
  313. ;
  314. putlp:    call    outrdy$        ;ok to send?
  315.     jz    putlp        ;nope
  316.     call    ma1toh        ;get char
  317.     call    outch$
  318.     ret
  319.     endfunc
  320.  
  321.  
  322.     function aputack
  323.     external outrdy$,outch$
  324. ;************************************************
  325. ;    aputack ()
  326. ;Output an ACK character to ATARIBUS.
  327. ; No result
  328. ;
  329. putlp:    call    outrdy$        ;ok to send?
  330.     jz    putlp        ;uh uh
  331.     mvi    a,ACK        ;send the ack
  332.     call    outch$
  333.     ret
  334.     endfunc
  335.  
  336.  
  337.     function aputcmpl
  338.     external outrdy$,outch$
  339. ;************************************************
  340. ;    aputcmpl ()
  341. ; Output an OPERATION COMPLETE character to ATARIBUS.
  342. ; No result
  343. ;
  344. putlp:    call    outrdy$        ;ok to send?
  345.     jz    putlp        ;uh uh
  346.     mvi    a,CMPL        ;send the complete
  347.     call    outch$
  348.     ret
  349.     endfunc
  350.  
  351.  
  352.     function aputerr
  353.     external outrdy$,outch$
  354. ;************************************************
  355. ;    aputerr ()
  356. ; Output an OPERATION ERROR character to ATARIBUS.
  357. ; No result
  358. ;
  359. putlp:    call    outrdy$        ;ok to send?
  360.     jz    putlp        ;uh uh
  361.     mvi    a,ERR        ;send the error char
  362.     call    outch$
  363.     ret
  364.     endfunc
  365.  
  366.  
  367.     function aputnak
  368.     external outrdy$,outch$
  369. ;************************************************
  370. ;    aputnak ()
  371. ; Output a NEGATIVE ACKNOWLEDGEMENT character
  372. ; to ATARIBUS. No result.
  373. ;
  374. putlp:    call    outrdy$        ;ok to send?
  375.     jz    putlp        ;uh uh
  376.     mvi    a,NAK        ;send the nak char
  377.     call    outch$
  378.     ret
  379.     endfunc
  380.  
  381.  
  382. ;***************************************************
  383. ;
  384. ;  SYSTEM DEPENDENT ROUTINES
  385. ;
  386. ; All the following functions must be changed for
  387. ;different systems and may only alter register A
  388. ;and possibly the flag bits.
  389. ;
  390. ;NOTE that the "ainit" function at the top of this
  391. ; file must alse be changed!
  392. ;
  393. ;***************************************************
  394.  
  395.     function cmdf$
  396. ;***************************************************
  397. ; Return Z flag = 0 if CMD- line is asserted (TRUE)
  398. ; else return Z flag = 1.
  399. ;
  400.     in    acstat        ;CMD status port
  401.     ani    ACMDFB        ;set Z flag
  402.     ret
  403. ;
  404.     ds    11        ;*extra space*
  405. ;
  406.     endfunc cmdf$
  407.  
  408.  
  409.     function gotch$
  410. ;***************************************************
  411. ; Return Z flag = 0 if char has been received else
  412. ; return Z flag = 1.
  413. ;
  414.     in    astat        ;data status port
  415.     ani    ARCVDB        ;set Z flag
  416.     ret
  417. ;
  418.     ds    11        ;*extra space*
  419. ;
  420.     endfunc gotch$
  421.  
  422.  
  423.     function inch$
  424. ;***************************************************
  425. ; Return received data char in A reg.
  426. ;
  427.     in    adata
  428.     ret
  429. ;
  430.     ds    13        ;*extra space*
  431. ;
  432.     endfunc inch$
  433.  
  434.  
  435.     function outrdy$
  436. ;***************************************************
  437. ; Return Z flag = 0 if it's ok to output a character
  438. ; else return Z flag = 1.
  439. ;
  440.     in    astat        ;data status
  441.     ani    AXRDYB        ;set Z flag
  442.     ret
  443. ;
  444.     ds    11        ;*extra space*
  445. ;
  446.     endfunc outrdy$
  447.  
  448.  
  449.     function outch$
  450. ;***************************************************
  451. ; Output char from A reg to ATARI interface port
  452. ;
  453.     out    adata
  454.     ret
  455. ;
  456.     ds    13        ;*extra space*
  457. ;
  458.     endfunc    outch$
  459.  
  460.  
  461.     function cls
  462.     external puts
  463. ;***************************************************
  464. ; Clear the terminal screen.
  465. ;
  466. ;FOLLOWING INSTRUCTION MUST BE FIRST SO THAT
  467. ;'ASINSTAL' CAN PICK UP THE STRING ADDRESS:
  468.     lxi    h,clrstr    ;address of string
  469. ;
  470.     push    h
  471.     call    puts        ;output string
  472.     pop    d        ;drop arg
  473.     ret
  474. ;
  475.     ds    7        ;*extra space*
  476. ;
  477. clrstr:    db    1Ah,0        ;string to clear screen
  478.     db    0,0,0,0,0,0    ;*extra space*
  479. ;
  480.     endfunc    cls
  481.