home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cpm / comm / zmodem / zmo-h805.zz0 / ZMO-H805.Z80
Text File  |  1989-04-26  |  19KB  |  743 lines

  1. titlesYSTEM-DEPENDENT INSTALLATION OVERLAY FOR zmp
  2.  
  3. subttlaUTHOR: rON mURRAY
  4.  
  5.  
  6.  
  7. ; sYSTEM-DEPENDENT INSTALLATION OVERLAY FOR zmp
  8.  
  9. ; aUTHOR: rON mURRAY
  10.  
  11.  
  12.  
  13. ;nAMEzmpovh89.z80
  14.  
  15.  
  16.  
  17. ;dATED nOV 11, 1988
  18.  
  19.  
  20.  
  21. ;wRITTEN BY - rON mURRAY, C/O z-nODE 62, 061-9-450-0200
  22.  
  23. ;     pERTH, wESTERN aUSTRALIA.
  24.  
  25.  
  26.  
  27. ;mODIFIED BY - tED mAY,  116b lAVAL sT., vANIER, oNT., cANADA
  28.  
  29. ;(613)741-0862
  30.  
  31. ;FOR THE h89-h19 TERMINAL
  32.  
  33. ;WITH A hAYS COMPATABLE 2400 BAUD MODEM
  34.  
  35. ;(us rOBOTICS cOURIER 2400)
  36.  
  37.  
  38.  
  39. ; 89/04/12 - mODIFIED TO zmp V1.5- gEORGE cONOVER
  40.  
  41. ;mODIFIED TO zmp V1.4 STANDARD rON mURRAY nOV 11, 88
  42.  
  43. ;mODIFIED TO zmp V1.3 STANDARD rON mURRAY oCT 11, 88
  44.  
  45. ;mODIFIED TO zmp V1.2 STANDARD rON mURRAY sEPT 15, 88
  46.  
  47. ;
  48.  
  49. ;-----------------------------------------------------------------------
  50.  
  51. ;
  52.  
  53. ;sYSTEM-DEPENDENT CODE OVERLAY FOR zmodem
  54.  
  55. ;
  56.  
  57. ;   iNSERT YOUR OWN CODE AS  NECESSARYIN  THIS  FILE.  cODE  CONTAINED
  58.  
  59. ; HEREIN  HAS BEEN WRITTEN IN z80 CODE FOR USE WITH m80 OR slr PROGRAMS.
  60.  
  61. ; aSSEMBLE AS FOLLOWS:
  62.  
  63.  
  64.  
  65. ;slr zmo-mh01/H
  66.  
  67. ;mload zmp.com=zmodem.com,zmo-mh01.hex
  68.  
  69. ;  OR
  70.  
  71. ;m80 =zmo-mh01.z80
  72.  
  73. ;relhex zmo-mh01
  74.  
  75. ;mload zmp.com=zmodem.com,zmo-mh01.hex
  76.  
  77.  
  78.  
  79.  
  80.  
  81. ; (dON'T USE l80 WITHOUT CHANGING THE SOURCE  FOR  ASSEMBLY  AS  A  cseg
  82.  
  83. ; FILE.)
  84.  
  85.  
  86.  
  87. ;-----------------------------------------------------------------------
  88.  
  89.  
  90.  
  91. ;    cODE CONTAINED HEREIN HAS BEEN WRITTEN IN z80 CODE FOR USE WITH m80.
  92.  
  93. ; oNCE ASSEMBLED, CONVERT TO HEX WITH relhex AND USE mload TO OVERLAY IT
  94.  
  95. ; OVER THE MAIN zmpx.com FILE TO PRODUCE YOUR VERY OWN zmp.com.
  96.  
  97.  
  98.  
  99. ;-----------------------------------------------------------------------
  100.  
  101.  
  102.  
  103. ; nOTES ON MODIFYING THIS FILE:
  104.  
  105.  
  106.  
  107. ;    hI-tECH c REQUIRES THAT FUNCTIONS DO NOT CHANGE EITHER INDEX REGISTER
  108.  
  109. ; (ix OR iy). iF YOUR OVERLAY REQUIRES EITHER OF THESE TO BE CHANGED, ENSURE
  110.  
  111. ; THEY ARE RESTORED TO THEIR ORIGINAL VALUES ON RETURN.
  112.  
  113. ;    sINCE COLLECTING PARAMETERS FROM c FUNCTIONS CAN BE TRICKY, ONLY CHANGE
  114.  
  115. ; THE PARTS MARKED 'iNSERT YOUR OWN CODE HERE'.  dO not MODIFY THE JUMP
  116.  
  117. ; TABLE AT THE START.  dO not MODIFY THE ENTRY/EXIT SECTIONS OF EACH
  118.  
  119. ; FUNCTION.  dO not PASS 'go'.  dO not COLLECT $200.
  120.  
  121. ;    aPART FROM DEFINING MODEM FUNCTIONS, THIS FILE ALSO DEFINES TERMINAL
  122.  
  123. ; CHARACTERISTICS.  mOST HAVE BEEN SET UP FOR adm-3a (WITH A FEW OF MY OWN
  124.  
  125. ; ADDITIONS).  mODIFY TO SUIT YOUR OWN TERMINAL.  aN INLINE PRINT ROUTINE
  126.  
  127. ; IS PROVIDED FOR PRINTING STRINGS IN THE USUAL WAY: USAGE IS
  128.  
  129.  
  130.  
  131. ;callprint
  132.  
  133. ;defb'REQUIRED STRING',0
  134.  
  135.  
  136.  
  137. ;    dON'T FORGET TO SET YOUR CLOCK SPEED AT THE CLKSPD VARIABLE.
  138.  
  139.  
  140.  
  141. ;    iF YOU FIND YOUR OVERLAY EXCEEDS THE MAXIMUM SIZE (CURRENTLY 0400H),
  142.  
  143. ; YOU WILL HAVE TO RE-COMPILE THE WHOLE THING.  gOOD LUCK.  yOU MIGHT TRY
  144.  
  145. ; INFORMING US IF YOU NEED TO DO THIS: IF TOO MANY PEOPLE NEED TO DO IT, WE
  146.  
  147. ; HAVEN'T ALLOWED ENOUGH ROOM.
  148.  
  149.  
  150.  
  151. ; rON mURRAY aUG 15, 88
  152.  
  153.  
  154.  
  155. ;-----------------------------------------------------------------------
  156.  
  157.  
  158.  
  159. noequ0
  160.  
  161. yesequnot no
  162.  
  163.  
  164.  
  165.  
  166.  
  167. clkspdequ2; pROCESSOR CLOCK SPEED IN mhZ
  168.  
  169. debugequno; tO ALLOW DEBUGGING OF OVERLAY WITH
  170.  
  171. ; z8e ETC.
  172.  
  173.  
  174.  
  175. ; sET THE FOLLOWING TWO EQUATES TO THE DRIVE AND USER AREA WHICH WILL
  176.  
  177. ; CONTAIN zmp'S .ovr FILES, .cfg FILE, .fon FILE AND .hlp FILE.  sET
  178.  
  179. ; BOTH TO ZERO (NULL) TO LOCATE THEM ON THE DRIVE FROM WHICH zmp WAS
  180.  
  181. ; INVOKED.
  182.  
  183.  
  184.  
  185. overdrive equ0; dRIVE TO FIND OVERLAY FILES ON ('a'-'p')
  186.  
  187. overuser equ0; uSER AREA TO FIND FILES
  188.  
  189.  
  190.  
  191. ;-----------------------------------------------------------------------
  192.  
  193.  
  194.  
  195. ; not USER-SET VARIABLES
  196.  
  197.  
  198.  
  199.  
  200.  
  201. userdefequ0145h; oRIGIN OF THIS OVERLAY.  tHIS ADDRESS
  202.  
  203. ; SHOULD NOT CHANGE WITH SUBSEQUENT
  204.  
  205. ; REVISIONS.
  206.  
  207. mspeedequ003ch; lOCATION OF CURRENT BAUD RATE.
  208.  
  209. ovsizeequ0400h; mAXIMUM SIZE OF THIS OVERLAY
  210.  
  211.  
  212.  
  213. .z80; USE Z80 CODE
  214.  
  215.  
  216.  
  217. aseg; ABSOLUTE
  218.  
  219.  
  220.  
  221.  ifdebug
  222.  
  223. org100h; sO YOU CAN DEBUG IT WITH cebug, zsid, ETC.
  224.  
  225.  else
  226.  
  227. orguserdef
  228.  
  229.  endif
  230.  
  231.  
  232.  
  233. escequ1bh
  234.  
  235. ctrlqequ11h
  236.  
  237. crequ0dh
  238.  
  239. lfequ0ah
  240.  
  241. bdosequ5
  242.  
  243.  
  244.  
  245. ; tHE FOLLOWING DEFINE THE h8/89 sio mODEM pORT ADDRESSES...
  246.  
  247.  
  248.  
  249. dportequ0d8h; dATA PORT (BASE PORT)
  250.  
  251. lspdivequdport; lsp BAUD RATE DIVISOR IF dlab SET
  252.  
  253. ienregequdport+1; iNTERUPT eNABLE REGISTER
  254.  
  255. mspdivequdport+1; msp BAUD RATE DIVISOR IF dlab SET
  256.  
  257. iidregequdport+2; iNTERRUPT IDENTIFICATION REGISTER (R/O)
  258.  
  259. lcportequdport+3; lINE cONTROL REGISTER
  260.  
  261. mcportequdport+4; mODEM cONTROL REGISTER
  262.  
  263. lsportequdport+5; lINE sTATUS REGISTER
  264.  
  265. msportequdport+6; mODEM sTATUS REGISTER
  266.  
  267.  
  268.  
  269. ; lINE cONTROL (lcport) BITS - - - - - - - - - - - - - - - - -
  270.  
  271.  
  272.  
  273. wls0equ00000001b; wORD LENGTH SELECT 0
  274.  
  275. wls1equ00000010b; wORD LENGTH SELECT 1
  276.  
  277. stbequ00000100b; sTOP BIT SELECT
  278.  
  279. penequ00001000b; pARITY eNABLE (0 FOR DISABLED)
  280.  
  281. pesequ00010000b; eVEN PARITY SELECT (0 FOR ODD)
  282.  
  283. speequ00100000b; sTICK PARITY
  284.  
  285. brksequ01000000b; bREAK SET (SET BREAK)
  286.  
  287. dlabequ10000000b; dIVISOR lATCH aCCESS bIT
  288.  
  289.  
  290.  
  291. ; mODEM cONTROL (mcport) BITS - - - - - - - - - - - - - - - - -
  292.  
  293.  
  294.  
  295. mcbaseequ00000000b; bASIC SETUP: NO dtr OR rts
  296.  
  297. dtrequ00000001b; dATA tERMINAL rEADY
  298.  
  299. rtsequ00000010b; rEQUEST tO sENT
  300.  
  301. out1 equ00000100b; aUX oUTPUT #1
  302.  
  303. out2 equ00001000b; aUX oUTPUT #2
  304.  
  305. tstlpequ00010000b; sETS 8250 tEST lOOP CONDITION
  306.  
  307.  
  308.  
  309. ; lINE sTATUS (lsport) BITS - - - - - - - - - - - - - - - - - -
  310.  
  311.  
  312.  
  313. davequ00000001b; dATA aVAILABLE (AND BIT TO TEST)
  314.  
  315. orunequ00000010b; oVERRUN eRROR (REC'D WAS CHAR OVERWRITTEN
  316.  
  317. rperrequ00000100b; pARITY eRROR
  318.  
  319. ferrequ00001000b; fRAMING eRROR (CHECKS FOR VALID STOP BIT)
  320.  
  321. brkdequ00010000b; bREAK dETECT
  322.  
  323. tbmtequ00100000b; tRANSMIT bUFFER eMPTY (AND BIT TO TEST)
  324.  
  325. tsreequ01000000b; tRANSMIT sHIFT rEGISTER eMPTY (R/O)
  326.  
  327.  
  328.  
  329. ; mODEM sTATUS (msport) BITS - - - - - - - - - - - - - - - - - -
  330.  
  331.  
  332.  
  333. dctsequ00000001b; dELTA cLEAR tO sEND
  334.  
  335. ddsrequ00000010b; dELTA dATA sET rEADY
  336.  
  337. teriequ00000100b; tRAILING eDGE rING iNDICATOR
  338.  
  339. drlsdequ00001000b; dELTA rECEIVE lINE sIGNAL dETECT
  340.  
  341. ctsequ00010000b; cLEAR tO sEND
  342.  
  343. dsrequ00100000b; dATA sET rEADY
  344.  
  345. rdetequ01000000b; rING dETECT
  346.  
  347. rlsdequ10000000b; cARRIER dETECT
  348.  
  349. resetequ00000001b; oUTPUT rESET cODE
  350.  
  351.  
  352.  
  353. ; bAUD RATE DIVISOR VALUES - - - - - - - - - - - - - - - - - - -
  354.  
  355.  
  356.  
  357. bd110equ1047; 110    BPS
  358.  
  359. bd300equ384; 300    BPS
  360.  
  361. bd450equ256; 450    BPS
  362.  
  363. bd600equ192; 600    BPS
  364.  
  365. bd710equ162; 710    BPS
  366.  
  367. bd1200equ96; 1200   BPS
  368.  
  369. bd2400equ48; 2400   BPS
  370.  
  371. bd4800equ24; 4800   BPS
  372.  
  373. bd9600equ12; 9600   BPS
  374.  
  375. bd19200equ6; 19,200 BPS
  376.  
  377. bd38400 equ3; 38,400 BPS
  378.  
  379. bd57600 equ2; 57,600 BPS
  380.  
  381.  
  382.  
  383. ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  384.  
  385.  
  386.  
  387. ;jUMP TABLE FOR THE OVERLAY: DO not CHANGE THIS
  388.  
  389. jumptab:
  390.  
  391. jpscrnpr; SCREEN PRINT
  392.  
  393. jpmrd; MODEM READ WITH TIMEOUT
  394.  
  395. jpmchin; GET A CHARACTER FROM MODEM
  396.  
  397. jpmchout; SEND A CHARACTER TO THE MODEM
  398.  
  399. jpmordy; TEST FOR TX BUFFER EMPTY
  400.  
  401. jpmirdy; TEST FOR CHARACTER RECEIVED
  402.  
  403. jpsndbrk; SEND BREAK
  404.  
  405. jpcursadd; CURSOR ADDRESSING
  406.  
  407. jpcls; CLEAR SCREEN
  408.  
  409. jpinvon; INVERSE VIDEO ON
  410.  
  411. jpinvoff; INVERSE VIDEO OFF
  412.  
  413. jphide; HIDE CURSOR
  414.  
  415. jpshow; SHOW CURSOR
  416.  
  417. jpsavecu; SAVE CURSOR POSITION
  418.  
  419. jprescu; RESTORE CURSOR POSITION
  420.  
  421. jpmint; SERVICE MODEM INTERRUPT
  422.  
  423. jpinvec; INITIALISE INTERRUPT VECTORS
  424.  
  425. jpdinvec; DE-INITIALISE INTERRUPT VECTORS
  426.  
  427. jpmdmerr; TEST UART FLAGS FOR ERROR
  428.  
  429. jpdtron; TURN dtr ON
  430.  
  431. jpdtroff; TURN dtr off
  432.  
  433. jpinit; INITIALISE UART
  434.  
  435. jpwait; WAIT SECONDS
  436.  
  437. jpmswait; WAIT MILLISECONDS
  438.  
  439. jpuserin; uSER-DEFINED ENTRY ROUTINE
  440.  
  441. jpuserout; uSER-DEFINED EXIT ROUTINE
  442.  
  443. jpgetvars; gET SYSTEM VARIABLES
  444.  
  445.   jpsetport; sET PORT (0 OR 1)
  446.  
  447. ;
  448.  
  449. ; sPARE JUMPS FOR COMPATIBILITY WITH FUTURE VERSIONS
  450.  
  451. ;
  452.  
  453. jpspare; sPARES FOR LATER USE
  454.  
  455. jpspare; sPARES FOR LATER USE
  456.  
  457. jpspare; sPARES FOR LATER USE
  458.  
  459. jpspare; SPARES FOR LATER USE
  460.  
  461. jpspare; SPARES FOR LATER USE
  462.  
  463. jpspare; SPARES FOR LATER USE
  464.  
  465.  
  466.  
  467.  
  468.  
  469. ; mAIN CODE STARTS HERE
  470.  
  471.  
  472.  
  473.  
  474.  
  475. versn:defb'===> vER. 1.5.1520.24.11.88.zmpovl <==='
  476.  
  477.  
  478.  
  479. ; sCREEN PRINT FUNCTION
  480.  
  481.  
  482.  
  483. scrnpr:
  484.  
  485. ; <== iNSERT YOUR OWN CODE HERE
  486.  
  487. callprint
  488.  
  489. db'tHIS FUNCTION NOT SUPPORTED.',cr,lf,0
  490.  
  491. ; <== eND OF YOUR OWN CODE
  492.  
  493. spare:ret
  494.  
  495.  
  496.  
  497. ; uSER-DEFINED ENTRY ROUTINE: LEAVE EMPTY IF NOT NEEDED
  498.  
  499.  
  500.  
  501. userin:ret
  502.  
  503.  
  504.  
  505. ; uSER-DEFINED EXIT ROUTINE: LEAVE EMPTY IF NOT NEEDED
  506.  
  507.  
  508.  
  509. userout:ret
  510.  
  511.  
  512.  
  513.  
  514.  
  515. ; gET A CHARACTER FROM THE MODEM: RETURN IN hl
  516.  
  517. ; (iT IS NOT NECESSARY TO TEST FOR STATUS)
  518.  
  519.  
  520.  
  521. mchin:
  522.  
  523. ; <== iNSERT YOUR OWN CODE HERE
  524.  
  525. ina,(dport); TO GET THE CHARACTER IN a
  526.  
  527. ; <== eND OF YOUR OWN CODE
  528.  
  529. ldl,a; PUT IN hl
  530.  
  531. ldh,0
  532.  
  533. ora; SET/CLEAR z
  534.  
  535. ret
  536.  
  537.  
  538.  
  539. ;sEND A CHARACTER TO THE MODEM
  540.  
  541.  
  542.  
  543. mchout:
  544.  
  545. ldhl,2; GET THE CHARACTER
  546.  
  547. addhl,sp
  548.  
  549. lda,(hl); IN a
  550.  
  551. ; <== iNSERT YOUR OWN CODE HERE
  552.  
  553. out(dport),a
  554.  
  555. ; <== eND OF YOUR OWN CODE
  556.  
  557. ret; DONE
  558.  
  559.  
  560.  
  561. ;tEST FOR OUTPUT READY: RETURN true (1) IN hl IF OK
  562.  
  563.  
  564.  
  565. mordy:
  566.  
  567. ; <== iNSERT YOUR OWN CODE HERE
  568.  
  569. ldhl,0; aSSUME THAT THE tRANSMIT bUFFER IS FULL
  570.  
  571. ina,(lsport); gET lINE sTATUS
  572.  
  573. andtbmt; iS THE tRANSMIT bUFFER eMPTY?
  574.  
  575. jrz,tb.busy; nO, SKIP
  576.  
  577. ldl,1; yES, hl = 1 (true)
  578.  
  579. tb.busy:; <== eND OF YOUR OWN CODE
  580.  
  581. lda,l; sET/CLEAR z
  582.  
  583. ora
  584.  
  585. ret
  586.  
  587.  
  588.  
  589. ;tEST FOR CHARACTER AT MODEM: RETURN true (1) IN hl IF SO
  590.  
  591.  
  592.  
  593. mirdy:
  594.  
  595. ; <== iNSERT YOUR OWN CODE HERE
  596.  
  597. ldhl,0; aSSUME THAT NO DATA IS AVAILABLE
  598.  
  599. ina,(lsport); gET lINE sTATUS
  600.  
  601. anddav; iS dATA aVAILABLE?
  602.  
  603. jrz,no.dav; nO, SKIP
  604.  
  605. ldl,1; yES, hl = 1 (true)
  606.  
  607. no.dav:; <== eND OF YOUR OWN CODE
  608.  
  609. lda,l; SET/CLEAR z
  610.  
  611. ora
  612.  
  613. ret
  614.  
  615.  
  616.  
  617. ;sEND A BREAK TO THE MODEM: LEAVE EMPTY IF YOUR SYSTEM CAN'T DO IT
  618.  
  619.  
  620.  
  621. sndbrk:
  622.  
  623. ; <== iNSERT YOUR OWN CODE HERE
  624.  
  625.  
  626.  
  627. ; tHIS ROUTINE SENDS A 300 MS bREAK tONE AND SETS dtr LOW FOR THE 
  628.  
  629. ; SAME LENGTH OF TIME TO DISCONNECT THE MODEM AT BOTH ENDS
  630.  
  631.  
  632.  
  633. xora; cLEAR REG a TO
  634.  
  635. out(mcport),a; sET dtr AND rts LOW
  636.  
  637. lda,brks; sET bREAK tONE
  638.  
  639. out(lcport),a; TO GO TO 'BREAK' LEVEL
  640.  
  641.  
  642.  
  643.  
  644.  
  645. ldhl,300; WAIT 300 MS
  646.  
  647. callwaithlms
  648.  
  649.  
  650.  
  651. dspequ$+1; iNLINE CODE MODIFICATION (DATA, STOP, PARITY)
  652.  
  653. lda,wls0+wls1; sET 8 DATA BITS, 1 STOP BIT, NO PARITY
  654.  
  655. out(lcport),a
  656.  
  657. lda,dtr; sET dtr FOR PROPER mODEM OUTPUT LEVEL
  658.  
  659. out(mcport),a
  660.  
  661. ; TO RESTORE
  662.  
  663. ; <== eND OF YOUR OWN CODE
  664.  
  665. ret
  666.  
  667.  
  668.  
  669. ;tEST uart FLAGS FOR ERROR: RETURN true (1) IN hl IF ERROR
  670.  
  671.  
  672.  
  673. mdmerr:
  674.  
  675. ; <== iNSERT YOUR OWN CODE HERE
  676.  
  677. ldhl,0; sET hl = false (0)
  678.  
  679. ; <== eND OF YOUR OWN CODE
  680.  
  681. lda,l; SET/CLEAR z
  682.  
  683. ora
  684.  
  685. ret
  686.  
  687.  
  688.  
  689. ;tURN dtr (AND OPTIONALLY rts) on.
  690.  
  691.  
  692.  
  693. dtron:
  694.  
  695. ; <== iNSERT YOUR OWN CODE HERE
  696.  
  697. lda,dtr; sET dtr
  698.  
  699. out(mcport),a
  700.  
  701. ; <== eND OF YOUR OWN CODE
  702.  
  703. ret
  704.  
  705.  
  706.  
  707. ;tURN dtr ( AND rts?) off
  708.  
  709.  
  710.  
  711. dtroff:
  712.  
  713. ; <== iNSERT YOUR OWN CODE HERE
  714.  
  715. xora; cLEAR REG a TO
  716.  
  717. out(mcport),a; sET dtr AND rts LOW
  718.  
  719. ; <== eND OF YOUR OWN CODE
  720.  
  721. ret
  722.  
  723.  
  724.  
  725. ;iNITIALISE THE uart
  726.  
  727.  
  728.  
  729. init:
  730.  
  731. ldhl,2; GET PARAMETERS
  732.  
  733. addhl,sp
  734.  
  735. exde,hl
  736.  
  737. callgetparm; IN hl
  738.  
  739. ld(brate),hl; BAUD RATE
  740.  
  741. callgetparm
  742.  
  743. ld(parity),hl; PARITY
  744.  
  745. callgetparm
  746.  
  747. ld(data),hl; DATA BITS
  748.  
  749. callgetparm
  750.  
  751. ld(stop),hl; STOP BITS
  752.  
  753. ; <== iNSERT YOUR OWN CODE HERE
  754.  
  755. di; dISABLE cpu iNTERRUPTS
  756.  
  757. lda,(brate); a = bAUD RATE NUMBER (SEE TABLE BELOW)
  758.  
  759. cp11+1; aLLOW SPEEDS TO 57,600 BPS
  760.  
  761. jrnc,badrate; sKIP IF INVALID BAUD RATE
  762.  
  763. ld(mspeed),a;  ELSE SAVE FOR CURRENT brate
  764.  
  765. lde,a
  766.  
  767. ldd,0; de = bAUD RATE NUMBER
  768.  
  769. ldhl,baud.rates; hl -> sTART OF BAUDRATE DIVISOR TABLE
  770.  
  771. addhl,de; aDD IT TWICE, EACH
  772.  
  773. addhl,de;  dIVISOR VALUE OCCUPIES TWO BYTES
  774.  
  775. lda,(hl); hl -> dESIRED DIVISOR VALUE, LOAD hl
  776.  
  777. inchl; INDIRECT THROUGH hl [(hlihl)]
  778.  
  779. ldh,(hl)
  780.  
  781. ldl,a; hl = dIVISOR VALUE
  782.  
  783. lda,d; a = 0
  784.  
  785. out(ienreg),a; dISABLE 8250 INTERRUPTS
  786.  
  787. lda,dlab; sET dlab SO WE CAN USE THE BAUD RATES
  788.  
  789. out(lcport),a;  DIVISORS
  790.  
  791. lda,l; a = lsp OF DIVISOR
  792.  
  793. out(lspdiv),a; wRITE DIVISOR'S "lsp"
  794.  
  795. lda,h; a = msp OF DIVISOR
  796.  
  797. out(mspdiv),a; wRITE DIVISOR'S "msp"
  798.  
  799. lda,(data); gET DATA BITS COUNT (7 OR 8)
  800.  
  801. cp7; iS IT 7 DATA BITS?
  802.  
  803. lda,10b; aSSUME IT IS
  804.  
  805. jrz,is7bits; yES, SKIP
  806.  
  807. lda,11b; nO, IS 8 DATA BITS, a = 11b
  808.  
  809. is7bits:
  810.  
  811. ldd,a; sAVE DATA BITS
  812.  
  813. lda,(stop); gET NUMBER OF DESIRED STOP BITS (1 OR 2)
  814.  
  815. cp1; wANT ONE STOP BIT?
  816.  
  817. lda,0; aSSUME SO
  818.  
  819. jrz,one.stop; yES, SKIP
  820.  
  821. lda,100b; nO, SET BIT 2 - 2 STOP BITS WANTED
  822.  
  823. one.stop:
  824.  
  825. ord; or IN DATA BITS INFO
  826.  
  827. ldd,a;  AND SAVE DATA BITS AND STOP BIT INFO
  828.  
  829. lda,(parity); gET DESIRED PARITY INDICATOR (n, e OR o)
  830.  
  831. lde,a;  AND SAVE IT FOR POSSIBLE LATER USE
  832.  
  833. cp'n'; wANT NO PARITY?
  834.  
  835. lda,d; aSSUME SO, a = DATA, STOP, AND PARITY (d,s,p)
  836.  
  837. jrz,have.bits; yES, SKIP
  838.  
  839. lda,e; gET BACK DESIRED PARITY INDICATOR
  840.  
  841. cp'e'; wANT eVEN PARITY?
  842.  
  843. lda,pen+pes; aSSUME SO, SET EVEN PARITY
  844.  
  845. ord;  AND or IN DATA BITS AND STOP BIT INFO
  846.  
  847. jrz,have.bits; yES, SKIP
  848.  
  849. lda,pen; nO, HAS TO BE oDD PARITY, SET IT
  850.  
  851. ord;  AND or IN DATA BITS AND STOP BIT INFO
  852.  
  853. have.bits:
  854.  
  855. ld(dsp),a; sET IT FOR RESETTING AFTER DISCONNECT
  856.  
  857. out(lcport),a; sET DESIRED WORD, STOP AND PARITY
  858.  
  859. lda,dtr; sET dtr FOR PROPER modem OPERATION
  860.  
  861. out(mcport),a
  862.  
  863. badrate:; sKIPS ABOVE TO HERE IF BAUD RATE BAD
  864.  
  865. ei; rESTORE cpu INTERRUPTS
  866.  
  867. ; USING VALUES BELOW
  868.  
  869. ; <== eND OF YOUR OWN CODE
  870.  
  871. ret
  872.  
  873.  
  874.  
  875. stop:defw1; sTOP BITS (WILL BE 1 OR 2)
  876.  
  877. parity:defw'n'; pARITY (WILL BE 'n', 'e' OR 'o')
  878.  
  879. data:defw8; dATA BITS (WILL BE 7 OR 8)
  880.  
  881. brate:defw6; bAUD RATE:
  882.  
  883.  
  884.  
  885. ;-----------------------------------------------------------------------
  886.  
  887.  
  888.  
  889. ; vALUES OF brate FOR EACH BAUD RATE
  890.  
  891.  
  892.  
  893. ; BAUD RATE    brate
  894.  
  895.  
  896.  
  897. ;   110  0
  898.  
  899. ;   300  1
  900.  
  901. ;   450  2
  902.  
  903. ;   600  3
  904.  
  905. ;   710  4
  906.  
  907. ;  1200  5
  908.  
  909. ;  2400  6
  910.  
  911. ;  4800  7
  912.  
  913. ;  9600  8
  914.  
  915. ; 19200  9
  916.  
  917. ; 38400 10
  918.  
  919. ; 57600 11
  920.  
  921.  
  922.  
  923. ;-----------------------------------------------------------------------
  924.  
  925.  
  926.  
  927. ; bAUD RATE DIVISOR TABLE
  928.  
  929.  
  930.  
  931. baud.rates:
  932.  
  933. defwbd110;  0 -    110 BAUD
  934.  
  935. defwbd300;  1 -    300
  936.  
  937. defwbd450;  2 -    450
  938.  
  939. defwbd600;  3 -    600
  940.  
  941. defwbd710;  4 -    710
  942.  
  943. defwbd1200;  5 -  1,200
  944.  
  945. defwbd2400;  6 -  2,400
  946.  
  947. defwbd4800;  7 -  4,800
  948.  
  949. defwbd9600;  8 -  9,600
  950.  
  951. defwbd19200;  9 - 19,200
  952.  
  953. defwbd38400; 10 - 38,400
  954.  
  955. defwbd57600; 11 - 57,600
  956.  
  957.  
  958.  
  959. ;
  960.  
  961. ; sET THE PORT. zmp SUPPLIES EITHER 0 OR 1 AS A PARAMETER.
  962.  
  963. ;
  964.  
  965. SETPORT:
  966.  
  967. LDHL,2; GET PORT NUMBER
  968.  
  969. ADDHL,SP
  970.  
  971. EXDE,HL
  972.  
  973. CALLGETPARM; IN hl (VALUES ARE 0 AND 1)
  974.  
  975.  
  976.  
  977. ; <== iNSERT YOUR OWN CODE HERE
  978.  
  979.  
  980.  
  981. ; <== eND OF YOUR OWN CODE
  982.  
  983. RET
  984.  
  985. ;****************************************************************************
  986.  
  987. ;vIDEO TERMINAL SEQUENCES: THESE ARE FOR adm-3a: mODIFY AS YOU WISH
  988.  
  989. ;cURSOR ADDRESSING: (MODIFIED FOR h19/89)
  990.  
  991.  
  992.  
  993. cursadd:
  994.  
  995. ldhl,2; GET PARAMETERS
  996.  
  997. addhl,sp
  998.  
  999. exde,hl
  1000.  
  1001. callgetparm; IN hl
  1002.  
  1003. ld(row),hl; ROW
  1004.  
  1005. callgetparm
  1006.  
  1007. ld(col),hl; COLUMN
  1008.  
  1009. ; <== iNSERT YOUR OWN CODE HERE
  1010.  
  1011. ; USING VALUES IN ROW AND COL
  1012.  
  1013. callprint
  1014.  
  1015. defbesc,'y',0; h19/89 LEADIN
  1016.  
  1017. lda,(row); ROW FIRST
  1018.  
  1019. adda,' '; ADD OFFSET
  1020.  
  1021. callcout
  1022.  
  1023. lda,(col); SANE FOR COLUMN
  1024.  
  1025. adda,' '
  1026.  
  1027. callcout
  1028.  
  1029. ; <== END OF YOUR OWN CODE
  1030.  
  1031. ret
  1032.  
  1033.  
  1034.  
  1035. row:defs2; ROW
  1036.  
  1037. col:defs2; COLUMN
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043. ;cLEAR SCREEN:
  1044.  
  1045.  
  1046.  
  1047. cls:
  1048.  
  1049. callprint
  1050.  
  1051. defbesc,'e',0
  1052.  
  1053. ret
  1054.  
  1055.  
  1056.  
  1057. ;iNVERSE VIDEO ON:
  1058.  
  1059.  
  1060.  
  1061. invon:
  1062.  
  1063. callprint
  1064.  
  1065. defbesc,'P',0
  1066.  
  1067. ret
  1068.  
  1069.  
  1070.  
  1071. ;iNVERSE VIDEO OFF:
  1072.  
  1073.  
  1074.  
  1075. invoff:
  1076.  
  1077. callprint
  1078.  
  1079. defbesc,'Q',0
  1080.  
  1081. ret
  1082.  
  1083.  
  1084.  
  1085. ;tURN OFF CURSOR:
  1086.  
  1087.  
  1088.  
  1089. hide:
  1090.  
  1091. callprint
  1092.  
  1093. defbesc,'X5',0
  1094.  
  1095. ret
  1096.  
  1097.  
  1098.  
  1099. ;tURN ON CURSOR:
  1100.  
  1101.  
  1102.  
  1103. show:
  1104.  
  1105. callprint
  1106.  
  1107. defbesc,'Y5',0
  1108.  
  1109. ret
  1110.  
  1111.  
  1112.  
  1113. ;sAVE CURSOR POSITION:
  1114.  
  1115.  
  1116.  
  1117. savecu:
  1118.  
  1119. callprint
  1120.  
  1121. defbesc,'J',0
  1122.  
  1123. ret
  1124.  
  1125.  
  1126.  
  1127. ;rESTORE CURSOR POSITION:
  1128.  
  1129.  
  1130.  
  1131. rescu:
  1132.  
  1133. callprint
  1134.  
  1135. defbesc,'K',0
  1136.  
  1137. ret
  1138.  
  1139.  
  1140.  
  1141. ;****************************************************************************
  1142.  
  1143.  
  1144.  
  1145. ;sERVICE MODEM INTERRUPT:
  1146.  
  1147.  
  1148.  
  1149. mint:
  1150.  
  1151. ret; MY SYSTEM DOESN'T NEED THIS
  1152.  
  1153.  
  1154.  
  1155. ;iNITIALISE INTERRUPT VECTORS:
  1156.  
  1157.  
  1158.  
  1159. invec:
  1160.  
  1161. ret; DITTO
  1162.  
  1163.  
  1164.  
  1165. ;dE-INITIALISE INTERRUPT VECTORS:
  1166.  
  1167.  
  1168.  
  1169. dinvec:
  1170.  
  1171. ret; DITTO
  1172.  
  1173.  
  1174.  
  1175. ;****************** eND OF USER-DEFINED CODE ********************************
  1176.  
  1177. ; dON'T CHANGE ANYTHING BELOW THIS POINT. wE NEEDED SOME ASSEMBLY LANGUAGE
  1178.  
  1179. ; STUFF FOR SPEED, AND THIS SEEMED LIKE A GOOD PLACE TO PUT IT.
  1180.  
  1181.  
  1182.  
  1183. ;mODEM CHARACTER TEST FOR 100 MS
  1184.  
  1185.  
  1186.  
  1187. mrd:
  1188.  
  1189. pushbc; SAVE BC
  1190.  
  1191. ldbc,100; SET LIMIT
  1192.  
  1193. mrd1:
  1194.  
  1195. callmirdy; CHAR AT MODEM?
  1196.  
  1197. jrnz,mrd2; YES, EXIT
  1198.  
  1199. ldhl,1; ELSE WAIT 1MS
  1200.  
  1201. callwaithlms
  1202.  
  1203. decbc; LOOP TILL DONE
  1204.  
  1205. lda,b
  1206.  
  1207. orc
  1208.  
  1209. jrnz,mrd1
  1210.  
  1211. ldhl,0; NONE THERE, RESULT=0
  1212.  
  1213. xora
  1214.  
  1215. mrd2:
  1216.  
  1217. popbc
  1218.  
  1219. ret
  1220.  
  1221.  
  1222.  
  1223. ; iNLINE PRINT ROUTINE: DESTROYS a
  1224.  
  1225.  
  1226.  
  1227. print:
  1228.  
  1229. ex(sp),hl; GET ADDRESS OF STRING
  1230.  
  1231. ploop:
  1232.  
  1233. lda,(hl); GET NEXT
  1234.  
  1235. inchl; BUMP POINTER
  1236.  
  1237. ora; DONE IF ZERO
  1238.  
  1239. jrz,pdone
  1240.  
  1241. callcout; ELSE PRINT
  1242.  
  1243. jrploop; AND LOOP
  1244.  
  1245. pdone:
  1246.  
  1247. ex(sp),hl; RESTORE RETURN ADDRESS
  1248.  
  1249. ret; AND QUIT
  1250.  
  1251.  
  1252.  
  1253. ;
  1254.  
  1255. ;oUTPUT A CHARACTER IN a TO THE CONSOLE
  1256.  
  1257. ;
  1258.  
  1259. cout:
  1260.  
  1261. pushbc; SAVE REGS
  1262.  
  1263. pushde
  1264.  
  1265. pushhl
  1266.  
  1267. lde,a; CHARACTER TO e
  1268.  
  1269. ldc,2
  1270.  
  1271. callbdos; PRINT IT
  1272.  
  1273. pophl
  1274.  
  1275. popde
  1276.  
  1277. popbc
  1278.  
  1279. ret
  1280.  
  1281.  
  1282.  
  1283. ;wAIT(SECONDS)
  1284.  
  1285.  
  1286.  
  1287. wait:
  1288.  
  1289. ldhl,2
  1290.  
  1291. addhl,sp
  1292.  
  1293. exde,hl; GET DELAY SIZE
  1294.  
  1295. callgetparm
  1296.  
  1297. ; FALL THRU TO..
  1298.  
  1299. ;wAIT SECONDS IN hl
  1300.  
  1301.  
  1302.  
  1303. waithls:
  1304.  
  1305. pushbc; sAVE bc
  1306.  
  1307. pushde; de
  1308.  
  1309. pushix; aND ix
  1310.  
  1311. ldix,0; tHEN POINT ix TO 0
  1312.  
  1313. ; sO WE DON'T UPSET MEMORY-MAPPED i/o
  1314.  
  1315. ;
  1316.  
  1317. ; cALCULATE VALUES FOR LOOP CONSTANTS. nEED TO HAVE TWO LOOPS TO AVOID
  1318.  
  1319. ; 16-BIT OVERFLOW WITH CLOCK SPEEDS ABOVE 9 mhZ.
  1320.  
  1321. ;
  1322.  
  1323. outerval equ(clkspd/10)+1
  1324.  
  1325. innerval equ(6667/outerval)*clkspd
  1326.  
  1327. ;
  1328.  
  1329. wait10:ldb,outerval
  1330.  
  1331. ;
  1332.  
  1333. wait11:ldde,innerval
  1334.  
  1335. ;
  1336.  
  1337. wait12:bit0,(ix); tIME-WASTERS
  1338.  
  1339. bit0,(ix)
  1340.  
  1341. bit0,(ix); 20 t-STATES EACH
  1342.  
  1343. bit0,(ix)
  1344.  
  1345. bit0,(ix)
  1346.  
  1347. bit0,(ix)
  1348.  
  1349. decde
  1350.  
  1351. lda,e
  1352.  
  1353. lda,d
  1354.  
  1355. ore
  1356.  
  1357. jrnz,wait12; 150 t-STATES PER INNER LOOP
  1358.  
  1359. djnzwait11; dECREMENT OUTER LOOP
  1360.  
  1361. dechl; oK, DECREMENT COUNT IN HL
  1362.  
  1363. lda,h
  1364.  
  1365. orl
  1366.  
  1367. jrnz,wait10
  1368.  
  1369. popix; dONE -- RESTORE IX
  1370.  
  1371. popde; dE
  1372.  
  1373. popbc; aND BC
  1374.  
  1375. ret
  1376.  
  1377.  
  1378.  
  1379. ;wAIT MILLISECONDS
  1380.  
  1381.  
  1382.  
  1383. mswait:
  1384.  
  1385. ldhl,2
  1386.  
  1387. addhl,sp
  1388.  
  1389. exde,hl; GET DELAY SIZE
  1390.  
  1391. callgetparm
  1392.  
  1393. ; FALL THRU TO..
  1394.  
  1395. ;wAIT MILLISECONDS IN hl
  1396.  
  1397.  
  1398.  
  1399. waithlms:
  1400.  
  1401. pushde
  1402.  
  1403. w1ms0:
  1404.  
  1405. ldde,39 * clkspd
  1406.  
  1407. w1ms1:
  1408.  
  1409. decde
  1410.  
  1411. lda,d
  1412.  
  1413. ore
  1414.  
  1415. jrnz,w1ms1
  1416.  
  1417. dechl
  1418.  
  1419. lda,h
  1420.  
  1421. orl
  1422.  
  1423. jrnz,w1ms0
  1424.  
  1425. popde
  1426.  
  1427. ret
  1428.  
  1429.  
  1430.  
  1431. ;gET NEXT PARAMETER FROM (DE) INTO HL
  1432.  
  1433.  
  1434.  
  1435. getparm:
  1436.  
  1437. exde,hl; GET ADDRESS INTO HL
  1438.  
  1439. lde,(hl); GET LO
  1440.  
  1441. inchl
  1442.  
  1443. ldd,(hl); THEN HI
  1444.  
  1445. inchl; BUMP FOR NEXT
  1446.  
  1447. exde,hl; RESULT IN HL, ADDRESS STILL IN DE
  1448.  
  1449. ret
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455. ; gET ADDRESS OF USER-DEFINED VARIABLES
  1456.  
  1457.  
  1458.  
  1459. getvars:
  1460.  
  1461. ldhl,uservars
  1462.  
  1463. ret
  1464.  
  1465.  
  1466.  
  1467. uservars:
  1468.  
  1469. defwoverdrive; ovr ETC. DRIVE/USER
  1470.  
  1471. defwoveruser
  1472.  
  1473.  
  1474.  
  1475.  if($ - jumptab) gt ovsize
  1476.  
  1477. toobig:jperrval; oVERLAY TOO LARGE!
  1478.  
  1479.  endif
  1480.  
  1481.  
  1482.  
  1483. end
  1484.  
  1485.