home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cpm / comm / zmodem / zmo-h89.zz0 / ZMO-H89.Z80
Text File  |  1988-12-15  |  13KB  |  632 lines

  1. ;-----------------------------------------------------------------------------
  2.  
  3. ;
  4.  
  5. ;hEATH-89 oVERLAY FOR zmp (z-mODEM pROGRAM)
  6.  
  7. ;       MODIFICATIONS BY hOWARD dUTTON
  8.  
  9. ;
  10.  
  11. ;nAMEzmo-h89.z80 
  12.  
  13. ;
  14.  
  15. ;dATED sEP 14, 1988
  16.  
  17. ;
  18.  
  19. ;wRITTEN BY -
  20.  
  21. ;  rON mURRAY, C/O z-nODE 62, 061-9-450-0200, pERTH, wESTERN aUSTRALIA.
  22.  
  23. ;
  24.  
  25. ;mODIFIED TO zmp V1.2 STANDARD RJM 15/9/88
  26.  
  27. ;mODIFIED TO zmp V1.3 STANDARD RJM 11/10/88
  28.  
  29. ;mODIFIED TO zmp V1.4 STANDARD RJM 20/11/88
  30.  
  31. ;
  32.  
  33. ;
  34.  
  35. ;-----------------------------------------------------------------------------
  36.  
  37. ;
  38.  
  39. ;
  40.  
  41. ;sYSTEM-DEPENDENT CODE OVERLAY FOR zmodem
  42.  
  43. ;
  44.  
  45. ;
  46.  
  47. ;
  48.  
  49. ;    iNSERT YOUR OWN CODE AS NECESSARY IN THIS FILE. cODE CONTAINED HEREIN
  50.  
  51. ; HAS BEEN WRITTEN IN z80 CODE FOR USE WITH m80 OR slr. aSSEMBLE AS FOLLOWS:
  52.  
  53. ;
  54.  
  55. ;slr zmo-XX01/H
  56.  
  57. ;mload zmp.com=zmodem.com,zmo-XX01.hex
  58.  
  59. ; OR
  60.  
  61. ;m80 =zmo-XX01.z80
  62.  
  63. ;relhex zmo-XX01
  64.  
  65. ;mload zmp.com=zmodem.com,zmo-XX01.hex
  66.  
  67. ;
  68.  
  69. ;
  70.  
  71. ;       (dON'T USE l80 WITHOUT CHANGING THE SOURCE FOR ASSEMBLY AS A
  72.  
  73. ;         CSEG FILE.)
  74.  
  75. ;
  76.  
  77. ;-----------------------------------------------------------------------------
  78.  
  79. ;
  80.  
  81. ;
  82.  
  83. ;    dON'T FORGET TO SET YOUR CLOCK SPEED AT THE CLKSPD VARIABLE.
  84.  
  85. ;
  86.  
  87. ;
  88.  
  89. ;    iF YOU FIND YOUR OVERLAY EXCEEDS THE MAXIMUM SIZE (CURRENTLY 0400H),
  90.  
  91. ; YOU WILL HAVE TO CONTACT ME FOR ANOTHER VERSION. iF TOO MANY PEOPLE NEED 
  92.  
  93. ; TO DO IT, WE HAVEN'T ALLOWED ENOUGH ROOM.
  94.  
  95. ;
  96.  
  97. ; rON mURRAY 15/8/88
  98.  
  99. ;
  100.  
  101. ;
  102.  
  103. ;
  104.  
  105. ;---------------------------------------------------------------------------
  106.  
  107.  
  108.  
  109. FALSEEQU0
  110.  
  111. TRUEEQUNOT FALSE
  112.  
  113.  
  114.  
  115. ;------------------------------------------------------------------------------
  116.  
  117.  
  118.  
  119. ; uSER-SET VARIABLES: 
  120.  
  121.  
  122.  
  123. CLKSPDEQU6; pROCESSOR CLOCK SPEED IN mhZ
  124.  
  125. DEBUGEQUFALSE; TO ALLOW DEBUGGING OF OVERLAY WITH z8e ETC.
  126.  
  127.  
  128.  
  129. ;sET THE FOLLOWING TWO EQUATES TO THE DRIVE AND USER AREA WHICH WILL CONTAIN
  130.  
  131. ;   zmp'S .ovr FILES, .cfg FILE, .fon FILE AND .hlp FILE. sET BOTH TO ZERO
  132.  
  133. ;   (NULL) TO LOCATE THEM ON THE DRIVE FROM WHICH zmp WAS INVOKED.
  134.  
  135.  
  136.  
  137. OVERDRIVEEQU'a'; dRIVE TO FIND OVERLAY FILES ON ('a'-'p')
  138.  
  139. OVERUSEREQU0; uSER AREA TO FIND FILES
  140.  
  141.  
  142.  
  143. ;------------------------------------------------------------------------------
  144.  
  145.  
  146.  
  147.  
  148.  
  149. ; not USER-SET VARIABLES
  150.  
  151.  
  152.  
  153. USERDEFEQU0145H; ORIGIN OF THIS OVERLAY
  154.  
  155. ; tHIS ADDRESS SHOULD NOT CHANGE WITH
  156.  
  157. ; SUBSEQUENT REVISIONS.
  158.  
  159. MSPEEDEQU03CH; LOCATION OF CURRENT BAUD RATE. 
  160.  
  161. OVSIZEEQU0400H; MAX SIZE OF THIS OVERLAY
  162.  
  163.  
  164.  
  165. .Z80; USE Z80 CODE
  166.  
  167. ASEG; ABSOLUTE
  168.  
  169.  
  170.  
  171.  IFDEBUG
  172.  
  173. ORG100H; SO YOU CAN DEBUG IT WITH CEBUG, ZSID, ETC
  174.  
  175.  ELSE
  176.  
  177. ORGUSERDEF
  178.  
  179.  ENDIF
  180.  
  181.  
  182.  
  183.  
  184.  
  185. MPORTEQU0D8H; THE MODEM PORT ON A H88-3 SERIAL CARD
  186.  
  187. CONPORTEQU0E0H; THE CONSOLE SERIAL PORT ON A h89
  188.  
  189.  
  190.  
  191. ESCEQU1BH
  192.  
  193. CTRLQEQU11H
  194.  
  195. CREQU0DH
  196.  
  197. LFEQU0AH
  198.  
  199. BDOSEQU5
  200.  
  201.  
  202.  
  203.  
  204.  
  205. CODEBGNEQU$
  206.  
  207.  
  208.  
  209. ;jUMP TABLE FOR THE OVERLAY: DO not CHANGE THIS
  210.  
  211. JUMP_TAB:
  212.  
  213. JPSCRNPR; SCREEN PRINT
  214.  
  215. JPMRD; MODEM READ WITH TIMEOUT
  216.  
  217. JPMCHIN; GET A CHARACTER FROM MODEM
  218.  
  219. JPMCHOUT; SEND A CHARACTER TO THE MODEM
  220.  
  221. JPMORDY; TEST FOR TX BUFFER EMPTY
  222.  
  223. JPMIRDY; TEST FOR CHARACTER RECEIVED
  224.  
  225. JPSNDBRK; SEND BREAK
  226.  
  227. JPCURSADD; CURSOR ADDRESSING
  228.  
  229. JPCLS; CLEAR SCREEN
  230.  
  231. JPINVON; INVERSE VIDEO ON
  232.  
  233. JPINVOFF; INVERSE VIDEO OFF
  234.  
  235. JPHIDE; HIDE CURSOR
  236.  
  237. JPSHOW; SHOW CURSOR
  238.  
  239. JPSAVECU; SAVE CURSOR POSITION
  240.  
  241. JPRESCU; RESTORE CURSOR POSITION
  242.  
  243. JPMINT; SERVICE MODEM INTERRUPT
  244.  
  245. JPINVEC; INITIALISE INTERRUPT VECTORS
  246.  
  247. JPDINVEC; DE-INITIALISE INTERRUPT VECTORS
  248.  
  249. JPMDMERR; TEST UART FLAGS FOR ERROR
  250.  
  251. JPDTRON; TURN dtr ON
  252.  
  253. JPDTROFF; TURN dtr off
  254.  
  255. JPINIT; INITIALISE UART
  256.  
  257. JPWAIT; WAIT SECONDS
  258.  
  259. JPMSWAIT; WAIT MILLISECONDS
  260.  
  261. JPUSERIN; USER-DEFINED ENTRY ROUTINE
  262.  
  263. JPUSEROUT; USER-DEFINED EXIT ROUTINE
  264.  
  265. JPGETVARS; GET SYSTEM VARIABLES
  266.  
  267.  
  268.  
  269. ; sPARE JUMPS FOR COMPATIBILITY WITH FUTURE VERSIONS
  270.  
  271. JPSPARE; SPARE FOR LATER USE
  272.  
  273. JPSPARE; SPARE FOR LATER USE
  274.  
  275. JPSPARE; SPARE FOR LATER USE
  276.  
  277. JPSPARE; SPARE FOR LATER USE
  278.  
  279. JPSPARE; SPARE FOR LATER USE
  280.  
  281. JPSPARE; SPARE FOR LATER USE
  282.  
  283.  
  284.  
  285. ;
  286.  
  287. ; mAIN CODE STARTS HERE
  288.  
  289. ;
  290.  
  291. ;sCREEN PRINT FUNCTION
  292.  
  293. SCRNPR:
  294.  
  295. ; <== iNSERT YOUR OWN CODE HERE
  296.  
  297. CALLPRINT
  298.  
  299. DB'tHIS FUNCTION NOT SUPPORTED.',CR,LF,0
  300.  
  301. ; <== eND OF YOUR OWN CODE
  302.  
  303. SPARE:
  304.  
  305. RET
  306.  
  307.  
  308.  
  309. ; uSER-DEFINED ENTRY ROUTINE: LEAVE EMPTY IF NOT NEEDED
  310.  
  311. USERIN:
  312.  
  313. RET
  314.  
  315.  
  316.  
  317. ; uSER-DEFINED EXIT ROUTINE: LEAVE EMPTY IF NOT NEEDED
  318.  
  319. USEROUT:
  320.  
  321. RET
  322.  
  323.  
  324.  
  325.  
  326.  
  327. ;gET A CHARACTER FROM THE MODEM: RETURN IN hl
  328.  
  329. MCHIN:
  330.  
  331. PUSHBC
  332.  
  333. INA,(MPORT)
  334.  
  335. LDL,A; PUT IN hl
  336.  
  337. LDH,0
  338.  
  339. ORA; SET/CLEAR z
  340.  
  341. POPBC
  342.  
  343. RET
  344.  
  345.  
  346.  
  347. ;sEND A CHARACTER TO THE MODEM
  348.  
  349. MCHOUT:
  350.  
  351. LDHL,2; GET THE CHARACTER
  352.  
  353. ADDHL,SP
  354.  
  355. LDA,(HL)
  356.  
  357. OUT(MPORT),A
  358.  
  359. RET; DONE
  360.  
  361.  
  362.  
  363. ;tEST FOR OUTPUT READY: RETURN true (1) IN hl IF OK
  364.  
  365. MORDY:
  366.  
  367. LDHL,0;
  368.  
  369. INA,(MPORT+5);
  370.  
  371. BIT5,A; BIT 5 IS SET IF UART IS READY FOR A CHAR
  372.  
  373. JPZ,MORDY1;
  374.  
  375. LDHL,1
  376.  
  377.  
  378.  
  379. MORDY1:LDA,L; SET/CLEAR z
  380.  
  381. ORA
  382.  
  383. RET
  384.  
  385.  
  386.  
  387. ;tEST FOR CHARACTER AT MODEM: RETURN true (1) IN hl IF SO
  388.  
  389. MIRDY:
  390.  
  391. LDHL,0;
  392.  
  393. INA,(MPORT+5);
  394.  
  395. BIT0,A; BIT 0 IS SET IF DATA IS READY
  396.  
  397. JPZ,MIRDY1;
  398.  
  399. LDHL,1
  400.  
  401.  
  402.  
  403. MIRDY1:LDA,L; SET/CLEAR z
  404.  
  405. ORA
  406.  
  407. RET
  408.  
  409.  
  410.  
  411. ;sEND A BREAK TO THE MODEM: LEAVE EMPTY IF YOUR SYSTEM CAN'T DO IT
  412.  
  413. SNDBRK:
  414.  
  415.  
  416.  
  417. INA,(MPORT+3);
  418.  
  419. SET6,A; SET BREAK BIT
  420.  
  421. OUT(MPORT+3),A;
  422.  
  423.  
  424.  
  425. PUSHAF
  426.  
  427. LDHL,300; WAIT 300 Ms
  428.  
  429. CALLWAITHLMS
  430.  
  431. POPAF
  432.  
  433.  
  434.  
  435. RES6,A; RESET BREAK BIT
  436.  
  437. OUT(MPORT+3),A;
  438.  
  439.  
  440.  
  441. RET
  442.  
  443. ;
  444.  
  445. ;tEST uart FLAGS FOR ERROR: RETURN true (1) IN hl IF ERROR.
  446.  
  447. MDMERR:
  448.  
  449. LDHL,0
  450.  
  451. INA,(MPORT+5); GET LINE STATUS
  452.  
  453. AND00001110b; MASK
  454.  
  455. JPZ,MDMER1; A SHOULD = 0 IF EVERYTHING IS OK
  456.  
  457. LDHL,1;
  458.  
  459.  
  460.  
  461. MDMER1:LDA,L; SET/CLEAR z
  462.  
  463. ORA
  464.  
  465. RET
  466.  
  467.  
  468.  
  469.  
  470.  
  471. ;tURN dtr on
  472.  
  473. DTRON:
  474.  
  475. INA,(MPORT+4);
  476.  
  477. SET0,A; SET THE dtr BIT
  478.  
  479. OUT(MPORT+4),A;
  480.  
  481.  
  482.  
  483. RET
  484.  
  485.  
  486.  
  487.  
  488.  
  489.  
  490.  
  491. ;tURN dtr off
  492.  
  493. DTROFF:
  494.  
  495. INA,(MPORT+4);
  496.  
  497. RES0,A; RESET THE dtr BIT
  498.  
  499. OUT(MPORT+4),A;
  500.  
  501.  
  502.  
  503. RET
  504.  
  505.  
  506.  
  507.  
  508.  
  509. ;iNITIALISE THE UART
  510.  
  511.  
  512.  
  513. INIT:LDHL,2; GET PARAMETERS
  514.  
  515. ADDHL,SP
  516.  
  517. EXDE,HL
  518.  
  519. CALLGETPARM; IN hl
  520.  
  521. LD(BRATE),HL; BAUD RATE
  522.  
  523. CALLGETPARM
  524.  
  525. LD(PARITY),HL; PARITY
  526.  
  527. CALLGETPARM
  528.  
  529. LD(DATA),HL; DATA BITS (binary 7 OR 8)
  530.  
  531. CALLGETPARM
  532.  
  533. LD(STOP),HL; STOP BITS (binary 1 OR 2)
  534.  
  535.  
  536.  
  537. ; GET THE 8250 READY FOR PROGRAMMING
  538.  
  539. LDA,0; CLEAR INTERRUPTS
  540.  
  541. OUT(MPORT+1),A;
  542.  
  543.  
  544.  
  545. LDA,00010000b; SET TO LOOP-BACK MODE
  546.  
  547. OUT(MPORT+4),A;
  548.  
  549.  
  550.  
  551. ; PROGRAM THE BAUD-RATE (IF IT'S VALID)
  552.  
  553. LDHL,(BRATE); CHECK TO SEE IF BAUD-RATE IS VALID
  554.  
  555. LDDE,12;
  556.  
  557. ORA; CLEAR CARRY
  558.  
  559. SBCHL,DE; HL=BRATE-12
  560.  
  561. JPP,PRB1; NEGITIVE IF BRATE IS 0..11
  562.  
  563.  
  564.  
  565. LDA,L;
  566.  
  567. LD(MSPEED),A; LET ZMP KNOW IT'S VALID
  568.  
  569.  
  570.  
  571. LDA,10000000b; SET DIVISOR LATCH ACCESS BIT
  572.  
  573. OUT(MPORT+3),A;
  574.  
  575.  
  576.  
  577. LDHL,(BRATE); COMPUTE OFFSET TO BAUD-RATE DIVISOR
  578.  
  579. ADDHL,HL;
  580.  
  581. EXDE,HL;
  582.  
  583. LDHL,BRTBL;
  584.  
  585. ADDHL,DE; hl NOW HAS ADDRESS OF DIVISOR
  586.  
  587. LDA,(HL); GET THE LOW-ORDER BYTE
  588.  
  589. OUT(MPORT),A;
  590.  
  591. INCHL;
  592.  
  593. LDA,(HL);
  594.  
  595. OUT(MPORT+1),A;
  596.  
  597.  
  598.  
  599. ; PROGRAM THE: TYPE OF PARITY / # DATA BITS / # STOP BITS
  600.  
  601. PRB1:LDB,0; SET THE lcr VALUE (IN b FOR NOW) TO 0
  602.  
  603. LDA,(PARITY); SET BITS IN b TO TYPE OF PARITY
  604.  
  605. CP'n';
  606.  
  607. JPZ,PARn;
  608.  
  609. CP'e';
  610.  
  611. JPZ,pARe ;
  612.  
  613. CP'o';
  614.  
  615. JPZ,pARo;
  616.  
  617. sKIP3:LDA,(dATA); SET BITS IN b TO # OF DATA BITS
  618.  
  619. CP7;
  620.  
  621. JPZ,DATA7;
  622.  
  623. CP8;
  624.  
  625. JPZ,DATA8;
  626.  
  627. sKIP4:LDA,(sTOP);
  628.  
  629. CP1;
  630.  
  631. JPZ,sTOP1;
  632.  
  633. CP2;
  634.  
  635. JPZ,sTOP2;
  636.  
  637. sKIP5:LDA,B; GET 'lcr' VALUE
  638.  
  639. OUT(MPORT+3),A; (ALSO DE-SELECTS DIVISOR ACCESS)
  640.  
  641.  
  642.  
  643. ; TAKE 8250 OUT OF LOOP-BACK MODE
  644.  
  645. INA,(MPORT); READ A CHAR
  646.  
  647. ADDHL,HL; WASTE SOME TIME
  648.  
  649. ADDHL,HL;
  650.  
  651. INA,(MPORT); READ ANOTHER CHAR
  652.  
  653. LDA,0;
  654.  
  655. OUT(MPORT+4),A; TAKE 8250 OUT OF LOOP-BACK MODE
  656.  
  657.  
  658.  
  659. RET
  660.  
  661.  
  662.  
  663. ; tYPES OF PARITY
  664.  
  665. pARn:
  666.  
  667. JPsKIP3
  668.  
  669. pARe:
  670.  
  671. SET3,B
  672.  
  673. SET4,B
  674.  
  675. JPsKIP3
  676.  
  677. pARo:
  678.  
  679. SET3,B
  680.  
  681. JPsKIP3
  682.  
  683. ; nUMBER OF DATA BITS
  684.  
  685. dATA7:
  686.  
  687. SET1,B
  688.  
  689. JPsKIP4
  690.  
  691. dATA8:
  692.  
  693. SET0,B
  694.  
  695. SET1,B
  696.  
  697. JPsKIP4
  698.  
  699. ; nUMBER OF STOP BITS
  700.  
  701. sTOP1:
  702.  
  703. JPsKIP5
  704.  
  705. sTOP2:
  706.  
  707. SET2,B
  708.  
  709. JPsKIP5
  710.  
  711.  
  712.  
  713. ; BAUD RATE DIVISOR TABLE FOR 8250
  714.  
  715. BRTBL:DW1047; 110     0
  716.  
  717. DW384; 300     1
  718.  
  719. DW256; 450     2
  720.  
  721. DW192; 600     3
  722.  
  723. DW162; 710     4
  724.  
  725. DW96; 1200    5
  726.  
  727. DW48; 2400    6
  728.  
  729. DW24; 4800    7
  730.  
  731. DW12; 9600    8
  732.  
  733. DW6; 19200   9
  734.  
  735. DW3; 38400  10
  736.  
  737. DW2; 57600  11
  738.  
  739.  
  740.  
  741. ;--------------------------------------------------------------------------
  742.  
  743.  
  744.  
  745. STOP:DW1; STOP BITS
  746.  
  747. PARITY:DW'n'; PARITY
  748.  
  749. DATA:DW8; DATA BITS
  750.  
  751. BRATE:DW5; BAUD RATE: 1200
  752.  
  753.  
  754.  
  755. ;--------------------------------------------------------------------------
  756.  
  757. ;vALUES OF BRATE FOR EACH BAUD RATE
  758.  
  759. ;
  760.  
  761. ; BAUD RATE    BRATE
  762.  
  763. ;
  764.  
  765. ;   110 0
  766.  
  767. ;   300 1
  768.  
  769. ;   450 2
  770.  
  771. ;   600 3
  772.  
  773. ;   710 4
  774.  
  775. ;  1200 5
  776.  
  777. ;  2400 6
  778.  
  779. ;  4800 7
  780.  
  781. ;  9600 8
  782.  
  783. ; 19200 9
  784.  
  785. ; 3840010
  786.  
  787. ; 57600         11
  788.  
  789. ;
  790.  
  791.  
  792.  
  793. ;****************************************************************************
  794.  
  795. ;vIDEO TERMINAL SEQUENCES: THESE ARE FOR THE h19
  796.  
  797. ;cURSOR ADDRESSING:
  798.  
  799. CURSADD:
  800.  
  801. LDHL,2; GET PARAMETERS
  802.  
  803. ADDHL,SP
  804.  
  805. EXDE,HL
  806.  
  807. CALLGETPARM; IN hl
  808.  
  809. LD(ROW),HL; ROW
  810.  
  811. CALLGETPARM
  812.  
  813. LD(COL),HL; COLUMN
  814.  
  815.  
  816.  
  817. ; USING VALUES IN ROW AND COL
  818.  
  819. CALLPRINT
  820.  
  821. DBESC,'y',0; h19 LEADIN
  822.  
  823. LDA,(ROW); ROW FIRST
  824.  
  825. ADDA,' '; ADD OFFSET
  826.  
  827. CALLCOUT
  828.  
  829. LDA,(COL); SANE FOR COLUMN
  830.  
  831. ADDA,' '
  832.  
  833. CALLCOUT
  834.  
  835.  
  836.  
  837. RET
  838.  
  839.  
  840.  
  841. ROW:DS2; ROW
  842.  
  843. COL:DS2; COLUMN
  844.  
  845.  
  846.  
  847.  
  848.  
  849. ;cLEAR SCREEN:
  850.  
  851. CLS:
  852.  
  853. CALLPRINT
  854.  
  855. DBESC,'e',0
  856.  
  857. RET
  858.  
  859.  
  860.  
  861. ;iNVERSE VIDEO ON:
  862.  
  863. INVON:
  864.  
  865. CALLPRINT
  866.  
  867. DBESC,'P',0
  868.  
  869. RET
  870.  
  871.  
  872.  
  873. ;iNVERSE VIDEO OFF:
  874.  
  875. INVOFF:
  876.  
  877. CALLPRINT
  878.  
  879. DBESC,'Q',0
  880.  
  881. RET
  882.  
  883.  
  884.  
  885. ;tURN OFF CURSOR:
  886.  
  887. HIDE:
  888.  
  889. CALLPRINT
  890.  
  891. DBESC,'X5',0
  892.  
  893. RET
  894.  
  895.  
  896.  
  897. ;tURN ON CURSOR:
  898.  
  899. SHOW:
  900.  
  901. CALLPRINT
  902.  
  903. DBESC,'Y5',0
  904.  
  905. RET
  906.  
  907.  
  908.  
  909. ;sAVE CURSOR POSITION:
  910.  
  911. SAVECU:
  912.  
  913. CALLPRINT
  914.  
  915. DBESC,'J',0
  916.  
  917. RET
  918.  
  919.  
  920.  
  921. ;rESTORE CURSOR POSITION:
  922.  
  923. RESCU:
  924.  
  925. CALLPRINT
  926.  
  927. DBESC,'K',0
  928.  
  929. RET
  930.  
  931.  
  932.  
  933. ;****************************************************************************
  934.  
  935.  
  936.  
  937. ;sERVICE MODEM INTERRUPT:
  938.  
  939. MINT:
  940.  
  941. RET; MY SYSTEM DOESN'T NEED THIS
  942.  
  943.  
  944.  
  945. ;iNITIALISE INTERRUPT VECTORS:
  946.  
  947. INVEC:
  948.  
  949. RET; DITTO
  950.  
  951.  
  952.  
  953. ;dE-INITIALISE INTERRUPT VECTORS:
  954.  
  955. DINVEC:
  956.  
  957. RET; DITTO
  958.  
  959.  
  960.  
  961. ;****************** eND OF USER-DEFINED CODE ********************************
  962.  
  963. ;dO NOT CHANGE ANYTHING BELOW HERE.
  964.  
  965.  
  966.  
  967. ;mODEM CHARACTER TEST FOR 100 MS
  968.  
  969. MRD:
  970.  
  971. PUSHBC; SAVE BC
  972.  
  973. LDBC,100; SET LIMIT
  974.  
  975. MRD1:
  976.  
  977. CALLMIRDY; CHAR AT MODEM?
  978.  
  979. JRNZ,MRD2; YES, EXIT
  980.  
  981. LDHL,1; ELSE WAIT 1MS
  982.  
  983. CALLWAITHLMS
  984.  
  985. DECBC; LOOP TILL DONE
  986.  
  987. LDA,B
  988.  
  989. ORC
  990.  
  991. JRNZ,MRD1
  992.  
  993. LDHL,0; NONE THERE, RESULT=0
  994.  
  995. XORA
  996.  
  997. MRD2:
  998.  
  999. POPBC
  1000.  
  1001. RET
  1002.  
  1003.  
  1004.  
  1005. ; iNLINE PRINT ROUTINE: DESTROYS a AND hl
  1006.  
  1007.  
  1008.  
  1009. PRINT:
  1010.  
  1011. EX(SP),HL; GET ADDRESS OF STRING
  1012.  
  1013. PLOOP:
  1014.  
  1015. LDA,(HL); GET NEXT
  1016.  
  1017. INCHL; BUMP POINTER
  1018.  
  1019. ORA; DONE IF ZERO
  1020.  
  1021. JRZ,PDONE
  1022.  
  1023. CALLCOUT; ELSE PRINT
  1024.  
  1025. JRPLOOP; AND LOOP
  1026.  
  1027. PDONE:
  1028.  
  1029. EX(SP),HL; RESTORE RETURN ADDRESS
  1030.  
  1031. RET; AND QUIT
  1032.  
  1033.  
  1034.  
  1035. ;
  1036.  
  1037. ;oUTPUT A CHARACTER IN a TO THE CONSOLE
  1038.  
  1039. ;
  1040.  
  1041. COUT:
  1042.  
  1043. PUSHBC; SAVE REGS
  1044.  
  1045. PUSHDE
  1046.  
  1047. PUSHHL
  1048.  
  1049. LDE,A; CHARACTER TO e
  1050.  
  1051. LDC,2
  1052.  
  1053. CALLBDOS; PRINT IT
  1054.  
  1055. POPHL
  1056.  
  1057. POPDE
  1058.  
  1059. POPBC
  1060.  
  1061. RET
  1062.  
  1063.  
  1064.  
  1065. ;wAIT(SECONDS)
  1066.  
  1067. WAIT:
  1068.  
  1069. LDHL,2
  1070.  
  1071. ADDHL,SP
  1072.  
  1073. EXDE,HL; GET DELAY SIZE
  1074.  
  1075. CALLGETPARM
  1076.  
  1077. ; FALL THRU TO..
  1078.  
  1079. ;wAIT SECONDS IN hl
  1080.  
  1081. WAITHS:
  1082.  
  1083. PUSHBC; SAVE BC
  1084.  
  1085. PUSHDE; DE
  1086.  
  1087. PUSHIX; AND IX
  1088.  
  1089. LDIX,0; THEN POINT IX TO 0
  1090.  
  1091. ; SO WE DON'T UPSET MEMORY-MAPPED I/O
  1092.  
  1093.  
  1094.  
  1095. ;cALCULATE VALUES FOR LOOP CONSTANTS. nEED TO HAVE TWO LOOPS TO AVOID
  1096.  
  1097. ;   16-BIT OVERFLOW WITH CLOCK SPEEDS ABOVE 9 mhZ.
  1098.  
  1099.  
  1100.  
  1101. OUTERVALEQU(CLKSPD / 10) + 1
  1102.  
  1103. INNERVALEQU(6667 / OUTERVAL) * CLKSPD
  1104.  
  1105.  
  1106.  
  1107. WAIT10:
  1108.  
  1109. LDB,OUTERVAL
  1110.  
  1111.  
  1112.  
  1113. WAIT11:
  1114.  
  1115. LDDE,INNERVAL
  1116.  
  1117.  
  1118.  
  1119. WAIT12:
  1120.  
  1121. BIT0,(IX); TIME-WASTERS
  1122.  
  1123. BIT0,(IX)
  1124.  
  1125. BIT0,(IX); 20 t-STATES EACH
  1126.  
  1127. BIT0,(IX)
  1128.  
  1129. BIT0,(IX)
  1130.  
  1131. BIT0,(IX)
  1132.  
  1133. DECDE
  1134.  
  1135. LDA,E
  1136.  
  1137. LDA,D
  1138.  
  1139. ORE
  1140.  
  1141. JRNZ,WAIT12; 150 t-STATES PER INNER LOOP
  1142.  
  1143. DJNZWAIT11; DECREMENT OUTER LOOP
  1144.  
  1145. DECHL; OK, DECREMENT COUNT IN HL
  1146.  
  1147. LDA,H
  1148.  
  1149. ORL
  1150.  
  1151. JRNZ,WAIT10
  1152.  
  1153. POPIX; DONE -- RESTORE IX
  1154.  
  1155. POPDE; DE
  1156.  
  1157. POPBC; AND BC
  1158.  
  1159. RET
  1160.  
  1161.  
  1162.  
  1163. ;wAIT MILLISECONDS
  1164.  
  1165. MSWAIT:
  1166.  
  1167. LDHL,2
  1168.  
  1169. ADDHL,SP
  1170.  
  1171. EXDE,HL; GET DELAY SIZE
  1172.  
  1173. CALLGETPARM
  1174.  
  1175. ; FALL THRU TO..
  1176.  
  1177. ;wAIT MILLISECONDS IN hl
  1178.  
  1179. WAITHLMS:
  1180.  
  1181. PUSHDE
  1182.  
  1183. W1MS0:
  1184.  
  1185. LDDE,39 * CLKSPD
  1186.  
  1187. W1MS1:
  1188.  
  1189. DECDE
  1190.  
  1191. LDA,D
  1192.  
  1193. ORE
  1194.  
  1195. JRNZ,W1MS1
  1196.  
  1197. DECHL
  1198.  
  1199. LDA,H
  1200.  
  1201. ORL
  1202.  
  1203. JRNZ,W1MS0
  1204.  
  1205. POPDE
  1206.  
  1207. RET
  1208.  
  1209.  
  1210.  
  1211. ;gET NEXT PARAMETER FROM (DE) INTO HL
  1212.  
  1213. GETPARM:
  1214.  
  1215. EXDE,HL; GET ADDRESS INTO HL
  1216.  
  1217. LDE,(HL); GET LO
  1218.  
  1219. INCHL
  1220.  
  1221. LDD,(HL); THEN HI
  1222.  
  1223. INCHL; BUMP FOR NEXT
  1224.  
  1225. EXDE,HL; RESULT IN HL, ADDRESS STILL IN DE
  1226.  
  1227. RET
  1228.  
  1229.  
  1230.  
  1231. ;gET ADDRESS OF USER-DEFINED VARIABLES
  1232.  
  1233.  
  1234.  
  1235. GETVARS:
  1236.  
  1237. LDHL,USERVARS
  1238.  
  1239. RET
  1240.  
  1241.  
  1242.  
  1243. USERVARS:
  1244.  
  1245. DWOVERDRIVE; .ovr ETC. DRIVE/USER
  1246.  
  1247. DWOVERUSER
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  IF($ - CODEBGN) GT OVSIZE
  1254.  
  1255. TOOBIG:JPERRVAL; oVERLAY TOO LARGE!
  1256.  
  1257.  ENDIF
  1258.  
  1259.  
  1260.  
  1261. END
  1262.  
  1263.