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 / CPM / MODEMS / MODEM7 / M7ATR1.AQM / M7ATR1.ASM
Assembly Source File  |  2000-06-30  |  25KB  |  863 lines

  1. ; M7ATR1.ASM -- ATR8000 overlay file for MDM7xx. 08/29/84
  2. ;
  3. ; You will want to look this file over carefully. There are a number of
  4. ; options that you can use to configure the program to suit your taste.
  5. ; This file adapts the ATR8000 computers to MDM7xx.
  6. ;
  7. ; Much of the information contained here is not in the MDM7xx.ASM file.
  8. ;
  9. ; Edit this file for your preferences then follow the "TO USE:" example
  10. ; shown below.
  11. ;
  12. ; Use the "SET" command to change the baudrate when desired.  It starts
  13. ; out at 300 baud when the program is first called up.
  14. ;
  15. ;
  16. ;       TO USE: First edit this file filling in answers for your own
  17. ;               equipment.  Then assemble with MAC.COM or equivalent
  18. ;               assembler.  Then use DDT to overlay the the results
  19. ;               of this program to the original .COM file:
  20. ;
  21. ;               A>DDT MDM740.COM
  22. ;               DDT VERS 2.2
  23. ;               NEXT  PC
  24. ;               4A00 0100
  25. ;               -IM7ATR1.HEX            (note the "I" command)
  26. ;               -R                      ("R" loads in the .HEX file)
  27. ;               NEXT  PC
  28. ;               4A00 0000
  29. ;               -G0                     (return to CP/M)
  30. ;               A>SAVE 73 MDM7xx.COM    (now have a modified .COM file)
  31. ;
  32. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  33. ;
  34. ;
  35. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  36. ;
  37.                 MACLIB  Z80
  38. BELL:           EQU     07H             ;bell
  39. CR:             EQU     0DH             ;carriage return
  40. ESC:            EQU     1BH             ;escape
  41. LF:             EQU     0AH             ;linefeed
  42. ;
  43. YES:            EQU     0FFH
  44. NO:             EQU     0
  45. ;
  46. ;
  47. PORT:           EQU     00H             ;This beast no serial ports
  48. MODCTL1:        EQU     PORT            ;Modem control port
  49. MODDATP:        EQU     PORT            ;Modem data port
  50. MODCTL2:        EQU     PORT            ;Modem status port
  51. MODRCVB:        EQU     01H             ;These bits are emulated by
  52. MODRCVR:        EQU     01H             ; some really hoky code
  53. MODSNDB:        EQU     02H             ;
  54. MODSNDR:        EQU     02H             ;
  55. ;
  56.                 ORG     100H
  57. ;
  58. ;
  59. ; Change the clock speed to suit your system
  60. ;
  61.                 DS      3       ;(for  "JMP   START" instruction)
  62. ;
  63. PMMIMODEM:      DB      NO      ;yes=PMMI S-100 Modem                   103H
  64. SMARTMODEM:     DB      NO      ;yes=HAYES Smartmodem, no=non-PMMI      104H
  65. TOUCHPULSE:     DB      'P'     ;T=touch, P=pulse (Smartmodem-only)     105H
  66. CLOCK:          DB      40      ;clock speed in MHz x10, 25.5 MHz max.  106H
  67.                                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  68. MSPEED:         DB      1       ;0=110 1=300 2=450 3=600 4=710 5=1200   107H
  69.                                 ;6=2400 7=4800 8=9600 9=19200 default
  70. BYTDLY:         DB      5       ;0=0 delay  1=10ms  5=50 ms - 9=90 ms   108H
  71.                                 ;default time to send character in ter-
  72.                                 ;minal mode file transfer for slow BBS.
  73. CRDLY:          DB      5       ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  74.                                 ;default time for extra wait after CRLF
  75.                                 ;in terminal mode file transfer
  76. NOOFCOL:        DB      5       ;number of DIR columns shown            10AH
  77. SETUPTST:       DB      YES     ;yes=user-added Setup routine           10BH
  78. SCRNTEST:       DB      YES     ;Cursor control routine                 10CH
  79. ACKNAK:         DB      YES     ;yes=resend a record after any non-ACK  10DH
  80.                                 ;no=resend a record after a valid NAK
  81. BAKUPBYTE:      DB      NO      ;yes=change any file same name to .BAK  10EH
  82. CRCDFLT:        DB      YES     ;yes=default to CRC checking            10FH
  83. TOGGLECRC:      DB      YES     ;yes=allow toggling of CRC to Checksum  110H
  84. CONVBKSP:       DB      NO      ;yes=convert backspace to rub           111H
  85. TOGGLEBK:       DB      YES     ;yes=allow toggling of bksp to rub      112H
  86. ADDLF:          DB      NO      ;no=no LF after CR to send file in      113H
  87.                                 ;terminal mode (added by remote echo)
  88. TOGGLELF:       DB      YES     ;yes=allow toggling of LF after CR      114H
  89. TRANLOGON:      DB      NO      ;yes=allow transmission of logon        115H
  90.                                 ;write logon sequence at location LOGON
  91. SAVCCP:         DB      NO      ;yes=do not overwrite CCP               116H
  92. ; SAVCCP must be NO. If it is YES, MDM7xx returns via a RET
  93. ; This causes me mucho grief since I modify the BIOS. If I do not
  94. ; restore the BIOS, all you know what breaks loose. JAM
  95. LOCONEXTCHR:    DB      NO      ;yes=local command if EXTCHR precedes   117H
  96.                                 ;no=external command if EXTCHR precedes
  97. TOGGLELOC:      DB      YES     ;yes=allow toggling of LOCONEXTCHR      118H
  98. LSTTST:         DB      YES     ;yes=printer available on printer port  119H
  99. XOFFTST:        DB      NO      ;yes=check for XOFF from remote while   11AH
  100.                                 ;sending a file in terminal mode
  101. XONWAIT:        DB      NO      ;yes=wait for XON after CR while        11BH
  102.                                 ;sending a file in terminal mode
  103. TOGXOFF:        DB      YES     ;yes=allow toggling of XOFF checking    11CH
  104. IGNORCTL:       DB      NO      ;yes=CTL-chars above M not displayed    11DH
  105. ; I set IGNORCTL to NO since I use this program with an ascii to 3270
  106. ; SNA protocol converter which uses control characters to position
  107. ; the cursor on my screen.
  108. EXTRA1:         DB      0       ;for future expansion                   11EH
  109. EXTRA2:         DB      0       ;for future expansion                   11FH
  110. BRKCHR:         DB      '@'-40H ;@ = Send a 300 ms. break tone          120H
  111. NOCONNCT:       DB      'N'-40H ;N = Disconnect from the phone line     121H
  112. LOGCHR:         DB      'L'-40H ;L = Send logon                         122H
  113. LSTCHR:         DB      'P'-40H ;P = Toggle printer                     123H
  114. UNSAVE:         DB      'R'-40H ;R = Close input text buffer            124H
  115. TRANCHR:        DB      'T'-40H ;T = Transmit file to remote            125H
  116. SAVECHR:        DB      'Y'-40H ;Y = Open input text buffer             126H
  117. EXTCHR:         DB      '^'-40H ;^ = Send next character                127H
  118. ;
  119. ;
  120.                 DS      2               ;                               128H
  121. IN$MODCTL1:     JMP     MSTAT           ;CHANNEL 0, RESET INTERRUPTS    12AH
  122.                 DS      7
  123. ;
  124. OUT$MODDATP:    JMP     OTDATP          ;out modem data port 134H
  125.                 DS      7
  126. IN$MODDATP:     JMP     INDATP          ;in modem data port             13EH
  127.                 DS      7
  128. ANI$MODRCVB:    ANI     MODRCVB ! RET   ;bit to test for receive ready  148H
  129. CPI$MODRCVR:    CPI     MODRCVR ! RET   ;value of receive bit when rdy  14BH
  130. ANI$MODSNDB:    ANI     MODSNDB ! RET   ;bit to test for send ready     14EH
  131. CPI$MODSNDR:    CPI     MODSNDR ! RET   ;value of send bit when ready   151H
  132.                 DS      6               ;                               154H
  133. OUT$MODCTL1:    RET ! NOP ! NOP         ;out modem control port         15AH
  134. OUT$MODCTL2:    RET ! NOP ! NOP         ;out modem status port          15DH
  135. ;
  136. ;
  137. LOGONPTR:       DW      LOGON           ;for user message.              160H
  138.                 DS      6               ;                               162H
  139. JMP$GOODBYE:    JMP     GOODBYE         ;                               168H
  140. JMP$INITMOD:    JMP     IOINIT          ;go to user written routine     16BH
  141.                 RET  !  NOP  !  NOP     ;(by-passes PMMI routine)       16EH
  142.                 RET  !  NOP  !  NOP     ;(by-passes PMMI routine)       171H
  143.                 RET  !  NOP  !  NOP     ;(by-passes PMMI routine)       174H
  144. JMP$SETUPR:     JMP     SETCMD          ;                               177H
  145. JMP$SPCLMENU:   JMP     SPCLMENU        ;                               17AH
  146. JMP$SYSVER:     JMP     SYSVER          ;                               17DH
  147. JMP$BREAK:      JMP     SENDBRK         ;                               180H
  148. ;
  149. ;
  150. ; Do not change the following six lines.
  151. ;
  152. JMP$ILPRT:      DS      3               ;                               183H
  153. JMP$INBUF       DS      3               ;                               186H
  154. JMP$INLNCOMP:   DS      3               ;                               189H
  155. JMP$INMODEM     DS      3               ;                               18CH
  156. JMP$NXTSCRN:    DS      3               ;                               18FH
  157. JMP$TIMER:      DS      3               ;                               192H
  158. ;
  159. ;
  160. ; Clear sequences -- CLREOS is clear to end of screen, CLRSCRN is clear
  161. ; entire screen.  Last entry must be 0.  Any other 0's act as NOP's.
  162. ;
  163. CLREOS:         CALL    JMP$ILPRT       ;                               195H
  164.                 DB      1BH,59H,0,0,0   ; 198H
  165.                 RET                     ;                               19DH
  166. ;
  167. CLRSCRN:        CALL    JMP$ILPRT       ;                               19EH
  168.                 DB      1AH,0,0,0,0     ;                               1A1H
  169.                 RET                     ;                               1A6H
  170. ;
  171. ;
  172. SYSVER:         CALL    JMP$ILPRT       ;                               1A7H
  173.                 DB      'ATR8000 Version (Tested with TVI914D)',CR,LF
  174.                 DB      CR,LF,0
  175.                 RET
  176. ;.....
  177. ;
  178. ;
  179. ;-----------------------------------------------------------------------
  180. ;
  181. ; NOTE:  You can change the SYSVER message to be longer or shorter.  The
  182. ;        end of your last routine should terminate by 0400H (601 bytes
  183. ;        available after start of SYSVER) if using the Hayes Smartmodem
  184. ;        or by address 0C00H (2659 bytes) otherwise.
  185. ;
  186. ;-----------------------------------------------------------------------
  187. ;
  188. ; You can put in a message at this location which can be called up with
  189. ; CTL-O if TRANLOGON has been set TRUE.  You can put in several lines if
  190. ; desired.  End with a 0.
  191. ;
  192. ;
  193. LOGON:          DB      'This is an ATR8000 by SWP, Inc',CR,LF,0
  194. ;.....
  195. ;
  196. ;
  197. ; This routine allows a 300 ms. break tone to be sent to reset some
  198. ; time-shar computers.
  199. ;
  200. SENDBRK:  MVI   A,0
  201.           OUT   SEROUT         ;SET SERIAL LATCH TO 0
  202.           JMP   GOODBYE1
  203. ;.....
  204. ;
  205. ;
  206. ; This routine sends a 300 ms. break tone and sets DTR low for the same
  207. ; length of time to disconnect some modems such as the Bell 212A, etc.
  208. ;
  209. GOODBYE:  MVI   A,0
  210.           OUT   SEROUT          ;SET SERIAL LATCH TO 0
  211. GOODBYE1: MVI   B,3             ;WAIT FOR 300 MS.
  212.           CALL  JMP$TIMER
  213.           MVI   A,1             ; TURN ON IDLE
  214.           OUT   SEROUT
  215.           RET
  216. ;
  217. ; The following routine can be used as an auxiliary menu for notes of
  218. ; interest to a particular computer, etc.  If using the Hayes Smartmodem
  219. ; this is unavailable without a special address change.
  220. ;
  221. SPCLMENU: RET
  222. ;
  223. ;-----------------------------------------------------------------------
  224. ;
  225. ;
  226. ;      ... OUTPUT CHARACTER TO MODEM FROM ACC ...
  227. ;
  228. OTDATP  EQU     $
  229.        JMP     OTDAT2
  230. OTDAT2:PUSH    PSW
  231.        PUSH    H
  232.        LXI     H,OTDAT3
  233.        SHLD    OTDATP+1         ;PATCH JUMP AT ENTRY TO THIS ROUTINE
  234.        LXI     H,0
  235.        SHLD    CPSNDR         ;PATCH XOR/RET AT START OF READY ROUTINE
  236.        IN      TRKREG
  237.        OUT     DATREG
  238.        MVI     A,00010000B
  239.        OUT     CMDREG         ;DUMMY SEEK TO MAKE 179X UNLOAD HEADS
  240.        XRA     A
  241.        OUT     LATCH           ;THEN TURN OFF ALL DRIVE CTL BITS
  242.        POP     H
  243.        POP     PSW
  244. OTDAT3:PUSH    PSW
  245.        PUSH    H
  246. ;jam   CALL    PCHECK          ;SET PARITY BIT AS SPECIFIED BY INIT
  247.        STA     TXDATA
  248.        DI
  249.        LDA     DMODE
  250.        OUT     CTC3
  251.        LDA     DBAUD
  252.        OUT     CTC3
  253.        LXI     H,TXSTART
  254.        SHLD    CTCVEC+6
  255.        EI
  256.        POP     H
  257.        POP     PSW
  258.        RET
  259. ;
  260. ;
  261. ;
  262. CPSNDR:
  263.        XRA     A               ;INDICATE ALWAYS READY TO SEND
  264.        RET                     ;UNTIL OVERLAYED BY 2 NOPS LATER
  265.        LDA     CTCVEC+6
  266.        SUI     LOW TXWAIT
  267.        RET                     ;ACC=0 IF MODEM TX NOT BUSY
  268. ;
  269. ;
  270. ;
  271. ;      ... INPUT CHARACTER FROM MODEM TO ACC ...
  272. ;
  273. INDATP:
  274.        PUSH    H
  275.        LXI     H,FETCH
  276.        LDA     STASH
  277.        SUB     M
  278.        JRZ     INDAT2        ;EXIT IF TRYING TO READ EMPTY FIFO
  279.        MOV     A,M          ;LOAD A WITH FIFO OUTPUT POINTER
  280.        INR     M            ;THEN BUMP POINTER MODULO 256
  281.        LXI     H,FIFO
  282.        MOV     L,A
  283.        MOV     A,M          ;THEN LOAD ACC WITH CHARACTER
  284.        LXI     H,PARAMS
  285. ;      BIT     1,M          ;TEST IF PARITY IS ENABLED
  286. ;      JRZ     INDAT2
  287. ;      RES     7,A             ;STRIP PARITY IF NEEDED
  288. INDAT2:POP     H
  289.        RET
  290. ;
  291. ;
  292. ;
  293. CPRCVR:
  294.        PUSH    H
  295.        LXI     H,FETCH
  296.        LDA     STASH
  297.        SUB     M
  298.        POP     H
  299.        JRZ     CPRCV1
  300.        XRA     A               ;ACC=0 IF CHARACTER AVAILABLE
  301.        RET
  302. ;
  303. CPRCV1:DCR     A
  304.        RET                     ;ACC=255 IF NO CHARACTER
  305. ;
  306. ;
  307. ;
  308. FLUSH:
  309.        DI
  310.        XRA     A
  311.        STA     STASH
  312.        STA     FETCH
  313.        EI
  314.        RET
  315. ;
  316. ;
  317. ;
  318. ;
  319. PCHECK:
  320.        LXI     H,PARAMS       ;PREPARE TO DERRIVE PARITY BIT FOR TX
  321.        BIT     1,M
  322.        RZ                      ;EXIT WITH A UNCHANGED IF PARITY OFF
  323.        ANI     01111111B       ;ELSE CLEAR BIT 7 AND DETERMINE PARITY
  324.        JPO     PCHK2
  325.        SETB     7,A             ;MAKE BIT RIGHT FOR ODD PARITY
  326. PCHK2: BIT     0,M
  327.        RNZ                     ;EXIT IF ODD PARITY IS SELECTED
  328.        XRI     10000000B       ;ELSE FILP BIT FOR EVEN PARITY
  329.        RET
  330. ;
  331. ;
  332. ;
  333. ;
  334. ;
  335. ;      COLD START INITIALIZATION FOR MODEM7
  336. ;
  337. IOINIT:
  338.        LBCD    PARAMS
  339.        CALL    COMMINIT
  340. ;
  341. ;      PATCH MONITOR DISKIO ENTRY POINT FOR SERIAL I/O REININT
  342. ;
  343.        LHLD    MONITOR+15+1
  344.        SHLD    DSKJMP+1
  345.        LXI     H,DISKIO
  346.        SHLD    MONITOR+15+1
  347. ;
  348. ;      PATCH CP/M WARMSTART VECTOR TO UNDO DISKIO PATCH
  349. ;
  350.        LHLD    0001H
  351.        INX     H
  352.        MOV     E,M
  353.        MVI     M,LOW GOBACK
  354.        INX     H
  355.        MOV     D,M
  356.        MVI     M,HIGH GOBACK
  357.        SDED    WARM            ;STORE FOR EVENTUAL EXIT FROM MODEM7
  358.        RET
  359. ;
  360. ;
  361. PARAMS:  DB    10100000B
  362.        DB    52
  363. ;
  364. ;
  365. ;
  366. COMMINIT:
  367.        MOV     A,C
  368.        ANI     00100000B       ;USE BIT 5 OF C AS CTC PRESCALE BIT
  369.        ORI     10000111B
  370.        STA     DMODE           ;STORE DATA BIT CONTROL BYTE
  371.        ORI     00001000B
  372.        STA     SMODE           ;STORE START BIT CONTROL BYTE
  373.        DI
  374.        OUT     CTC2            ;RESET CTC2 AND PROGRAM FOR MODE
  375.        MOV     A,B             ;BAUDRATE MODULUS IS PASSED IN B
  376.        STA     DBAUD           ;STORE NUMBER AS DATA BIT TIME CONST
  377.        SRLR A
  378.        STA     SBAUD           ;STORE 1/2 OF THAT FOR START BIT DELAY
  379.        OUT     CTC2
  380.        LXI     H,SBIT         ;VECTOR TO 'SBIT' TO INIT RECEIVE IRQ
  381.        SHLD    CTCVEC+4
  382.        LXI     H,CTCVEC+4
  383.        LXI     D,STASH
  384.        EXX                     ;SET POINTERS IN ALTERNATE HL AND DE
  385.        XRA     A
  386.        STA     STASH
  387.        STA     FETCH           ;RESET FIFO ENTRY/EXIT POINTERS
  388.        EI
  389.        LXI     H,OTDAT2
  390.        SHLD    OTDATP+1       ;SETUP SO XMIT WILL INITIALIZE ITSELF
  391.        LXI     H,0C9AFH
  392.        SHLD    CPSNDR         ;STUFF CODE FOR 'XOR A' AND 'RET'
  393.        RET
  394. ;
  395. ;
  396. ;
  397. ;
  398. GOBACK:
  399.        LHLD    DSKJMP+1
  400.        SHLD    MONITOR+15+1      ;REPAIR DISKIO ENTRY POINT PATCH
  401.        LHLD    0001H
  402.        INX     H
  403.        LDED    WARM
  404.        MOV     M,E
  405.        INX     H
  406.        MOV     M,D          ;REPAIR WARMSTART VECTOR IN BIOS
  407.        DI
  408.        MVI     A,00000011B
  409.        OUT     CTC2            ;RESET CTC2 INTERRUPT
  410.        EI
  411.        JMP     0               ;JUMP TO WARMSTART AGAIN
  412. ;
  413. ;
  414. WARM:  DW    0               ;ADDRESS OF BIOS WARMSTART RTN
  415. ;
  416. ;
  417. ;
  418. ;
  419. DISKIO:
  420.        LHLD    CTCVEC+6
  421.        LXI     D,TXWAIT
  422.        ORA     A
  423.        DSBC    D
  424.        JRC     DISKIO        ;LOOP TILL VECTOR => 'TXWAIT'
  425. DSKJMP:CALL    0               ;CALL MONITOR DISK HANDLER
  426.        LBCD    PARAMS
  427.        CALL    COMMINIT        ;THEN RESTART THE MODEM INTERRUPTS
  428.        RET
  429. ;
  430. ;
  431. ;
  432. ;
  433. ;
  434. ;
  435. ;
  436. ;
  437. ;
  438. SELECT:
  439.        LDX     L,2
  440.        LDX     H,3
  441.        CALL    PMSG            ;DISPLAY TITLE MESSAGE
  442.        PUSHIX
  443.        POP     H
  444.        LXI     DE,6
  445.        DAD     D               ;POINT TO START OF VALUES POINTERS
  446.        LDX     E,0
  447.        DAD     D
  448.        DAD     D               ;INDEX TO POINTER(CURRENT_VAL)
  449.        MOV     A,M
  450.        INX     H
  451.        MOV     H,M
  452.        MOV     L,A
  453.        CALL    PMSG            ;DISPLAY CURRENT VALUE MESSAGE
  454.        CALL    CONIN           ;WAIT FOR RESPONSE
  455.        CPI     CR
  456.        JRZ     SELX            ;JUMP OUT OF LOOP IF <CR>
  457.        INRX    0               ;INCREMENT CURRENT_VAL
  458.        LDX     A,0
  459.        CMPX    1               ;COMPARE TO MAXIMUM_VAL
  460.        JRC     SEL2
  461.        MVIX    0,0             ;RESET TO ZERO IF > MAX
  462. SEL2:  CALL    JMP$ILPRT
  463.        DB    CR,0            ;DO CARRIAGE RETURN WITHOUT LF
  464.        JR      SELECT          ;OVERPRINT WITH NEW DISPLAY LINE
  465. ;
  466. ;
  467. SELX:  CALL    JMP$ILPRT
  468.        DB    CR,LF,0         ;DO LINEFEED AFTER ENTERING <CR>
  469.        LDX     L,4
  470.        LDX     H,5
  471.        LDX     C,0
  472.        MVI     B,0
  473.        DAD     B               ;INDEX INTO TABLE OF INIT CONSTANTS
  474.        MOV     A,M
  475.  
  476.        RET                     ;RETURN VALUE IN ACC
  477. ;
  478. ;
  479. ;
  480. PMSG:
  481.        MOV     A,M
  482.        INX     H
  483.        ORA     A
  484.        RZ
  485.        CALL    CONOUT
  486.        JR      PMSG
  487. ;
  488. ;
  489. CONIN  PUSH  B
  490.        PUSH  D
  491.        PUSH  H
  492.        MVI   C,01H
  493.        CALL  0005H
  494. CONRET POP     H
  495.        POP     D
  496.        POP     B
  497.        RET
  498. CONOUT PUSH    B
  499.        PUSH    D
  500.        PUSH    H
  501.        MVI     C,02H
  502.        MOV     E,A
  503.        CALL    0005H
  504.        JR      CONRET
  505. ;
  506. ;
  507. BAUDTAB:
  508.        DB    1,10
  509.        DW    BTITLE
  510.        DW    BVARS
  511.        DW    B110
  512.        DW    B300
  513.        DW    B450
  514.        DW    B600
  515.        DW    B710
  516.        DW    B1200
  517.        DW    B2400
  518.        DW    B4800
  519.        DW    B9600
  520.        DW    B192
  521. BTITLE:        DB    'BAUDRATE = ',0
  522. B110   DB    ' 110',0
  523. B300:  DB    ' 300',0
  524. B450:  DB    ' 450',0
  525. B600:  DB    ' 600',0
  526. B710:  DB    ' 710',0
  527. B1200: DB    '1200',0
  528. B2400: DB    '2400',0
  529. B4800: DB    '4800',0
  530. B9600: DB    '9600',0
  531. B192:  DB    '19.2',0
  532. BVARS: DB    142
  533.        DB    52
  534.        DB    35
  535.        DB    26
  536.        DB    22
  537.        DB    13
  538.        DB    104
  539.        DB    52
  540.        DB    26
  541.        DB    13
  542. ;
  543. ;
  544. ;
  545. ZWASTE DS      (($ AND 0FF00H)+100H)-$
  546. FIFO:  DS      256
  547. ;
  548. ;
  549. ;
  550. ;********************************************************
  551. ;*                                                     *
  552. ;*                                                     *
  553. ;********************************************************
  554. ;
  555. ;
  556. ;      .. I/O PORT EQUATES ..
  557. ;
  558. SERIN  EQU     50H             ;RS232 SERIAL INPUT
  559. SEROUT EQU     51H             ;RS232 SERIAL OUTPUT
  560. CTC0   EQU     80H             ;ZILOG COUNTER/TIMER
  561. CTC1   EQU     81H
  562. CTC2   EQU     82H
  563. CTC3   EQU     83H
  564. CMDREG EQU     40H
  565. TRKREG EQU     41H
  566. DATREG EQU     43H
  567. LATCH  EQU     30H
  568. ;
  569. MONITOR        EQU     0F000H
  570. CTCVEC EQU     0FF10H
  571. ;
  572. ;
  573. ;
  574. ;
  575. ;      ... INTERRUPT FOR SERIAL INPUT START BIT ...
  576. ;
  577. SBIT:
  578.        EXAF
  579.        EXX
  580.        MVI     A,10100111B
  581. DMODE  EQU     $-1             ;CTC CNTRL WORD FOR DATA BIT INTERRUPT
  582.        OUT     CTC2            ;START BAUDRATE INTERRUPT
  583.        MVI     A,52
  584. DBAUD  EQU     $-1             ;COUNT MODULUS FOR DATA BAUDRATE
  585.        OUT     CTC2            ;PROGRAM BAUDRATE DIVIDE RATIO
  586.        MVI     C,01111111B
  587.        MVI     M,LOW DBIT
  588.        EXAF
  589.        EXX
  590.        EI
  591.        RETI
  592. ;
  593. ;
  594. ;
  595. ;      ... INTERRUPT FOR SERIAL INPUT DATA BITS ...
  596. ;
  597. DBIT:
  598.        EXAF
  599.        EXX
  600.        IN      SERIN           ;READ RS232 INPUT DATA PORT
  601.        RAL
  602.        RARR    C               ;CONVERT DATA STREAM INTO PARALLEL
  603.        JRC     DBIT2           ;JUMP IF NOT LAST BIT IN WORD
  604.        MOV     A,C
  605.        STA     FIFO
  606. STASH  EQU     $-2             ;FIFO INPUT POINTER STORED HERE
  607.        MVI     M,LOW XBIT
  608. DBIT2: EXAF
  609.        EXX
  610.        EI
  611.        RETI                    ;TAKES 69 CYCLES (87 ON LAST BIT)
  612. ;
  613. ;
  614. ;
  615. ;
  616. ;      ... INTERRUPT FOR SERIAL INPUT STOP BIT ...
  617. ;
  618. XBIT:
  619.        EXAF
  620.        EXX
  621.        MVI     A,10101111B
  622. SMODE  EQU     $-1             ;CTC MODE FOR START BIT INTERRUPT
  623.        OUT     CTC2            ;ENABLE INTERRUPT FROM START BIT AGAIN
  624.        MVI     A,52/2
  625. SBAUD  EQU     $-1             ;MODULUS FOR 1/2 BAUD TIME
  626.        OUT     CTC2
  627.        LDAX    D       ;DE POINTS TO FIFO ENTRY POINTER
  628.        INR     A
  629.        CPI     LOW FIFO
  630. FETCH  EQU     $-1             ;FIFO EXIT POINTER STORED HERE
  631.        JRZ     XBIT2
  632.        STAX    D               ;STORE UPDATED FIFO ENTRY POINTER
  633. XBIT2: MVI     M,LOW SBIT
  634.        EXAF
  635.        EXX
  636.        EI
  637.        RETI
  638. ;
  639. ;
  640. ;
  641. ;
  642. ;      ... HIGH SPEED SERIAL TRANSMIT INTERRUPT ROUTINES ...
  643. ;
  644. ;
  645. ;
  646. ;
  647. TXSTART:
  648.        EXAF
  649.        EXX
  650.        XRA     A
  651.        OUT     SEROUT
  652.        MVI     B,0
  653. TXDATA EQU     $-1             ;BYTE TO TRANSMIT STORED HERE
  654.        MVI     A,LOW TXBIT1
  655.        STA     CTCVEC+6
  656.        EXAF
  657.        EXX
  658.        EI
  659.        RETI
  660. ;
  661. ;
  662. ;
  663. TXBIT1:
  664.        EXAF
  665.        EXX
  666.        MOV     A,B
  667.        OUT     SEROUT
  668.        RARR B
  669.        MVI     A,LOW TXBIT2
  670.        STA     CTCVEC+6
  671.        EXAF
  672.        EXX
  673.        EI
  674.        RETI
  675. ;
  676. ;
  677. ;
  678. TXBIT2:
  679.        EXAF
  680.        EXX
  681.        MOV     A,B
  682.        OUT     SEROUT
  683.        RARR B
  684.        MVI     A,LOW TXBIT3
  685.        STA     CTCVEC+6
  686.        EXAF
  687.        EXX
  688.        EI
  689.        RETI
  690. ;
  691. ;
  692. ;
  693. TXBIT3:
  694.        EXAF
  695.        EXX
  696.        MOV     A,B
  697.        OUT     SEROUT
  698.        RARR B
  699.        MVI     A,LOW TXBIT4
  700.        STA     CTCVEC+6
  701.        EXAF
  702.        EXX
  703.        EI
  704.        RETI
  705. ;
  706. ;
  707. ;
  708. TXBIT4:
  709.        EXAF
  710.        EXX
  711.        MOV     A,B
  712.        OUT     SEROUT
  713.        RARR B
  714.        MVI     A,LOW TXBIT5
  715.        STA     CTCVEC+6
  716.        EXAF
  717.        EXX
  718.        EI
  719.        RETI
  720. ;
  721. ;
  722. ;
  723. TXBIT5:
  724.        EXAF
  725.        EXX
  726.        MOV     A,B
  727.        OUT     SEROUT
  728.        RARR B
  729.        MVI     A,LOW TXBIT6
  730.        STA     CTCVEC+6
  731.        EXAF
  732.        EXX
  733.        EI
  734.        RETI
  735. ;
  736. ;
  737. ;
  738. TXBIT6:
  739.        EXAF
  740.        EXX
  741.        MOV     A,B
  742.        OUT     SEROUT
  743.        RARR B
  744.        MVI     A,LOW TXBIT7
  745.        STA     CTCVEC+6
  746.        EXAF
  747.        EXX
  748.        EI
  749.        RETI
  750. ;
  751. ;
  752. ;
  753. TXBIT7:
  754.        EXAF
  755.        EXX
  756.        MOV     A,B
  757.        OUT     SEROUT
  758.        RARR B
  759.        MVI     A,LOW TXBIT8
  760.        STA     CTCVEC+6
  761.        EXAF
  762.        EXX
  763.        EI
  764.        RETI
  765. ;
  766. ;
  767. ;
  768. TXBIT8:
  769.        EXAF
  770.        EXX
  771.        MOV     A,B
  772.        OUT     SEROUT
  773.        MVI     A,LOW TXSTOP
  774.        STA     CTCVEC+6
  775.        EXAF
  776.        EXX
  777.        EI
  778.        RETI
  779. ;
  780. ;
  781. ;
  782. TXSTOP:
  783.        EXAF
  784.        MVI     A,1
  785.        OUT     SEROUT
  786.        MVI     A,LOW TXWAIT
  787.        STA     CTCVEC+6
  788.        EXAF
  789.        EI
  790.        RETI
  791. ;
  792. ;
  793. ;
  794. TXWAIT:
  795.        EXAF
  796.        MVI     A,00000001B
  797.        OUT     CTC3
  798.        EXAF
  799.        EI
  800.        RETI
  801. MSTAT:
  802.        CALL  CPSNDR
  803.        MVI   A,0
  804.        JRNZ  NOSEND
  805.        MVI   A,MODSNDB
  806. NOSEND:
  807.        PUSH  PSW
  808.        CALL  CPRCVR
  809.        CMA
  810.        ANI   MODRCVB
  811. NOREC:
  812.        XTHL
  813.        ORA   H
  814.        POP   H
  815.        RET
  816. ;
  817. ;      ... SET BAUDRATE/PARITY COMMAND FOR MODEM7 ...
  818. ;
  819. SETCMD:
  820.        CALL    JMP$ILPRT
  821.        DB    CR,LF
  822.        DB    'PRESS <CR> TO SELECT BAUD/PARITY SHOWN'
  823.        DB    CR,LF
  824.        DB    'OR ANY OTHER KEY TO DISPLAY NEXT VALUE'
  825.        DB    CR,LF,LF,0
  826.        LXIX    BAUDTAB
  827.        CALL    SELECT
  828.        PUSH    PSW             ;SAVE BAUDRATE DIVIDE CONSTANT
  829.        LXIX    PARTAB
  830.        CALL    SELECT
  831.        POP     B
  832.        MOV     C,A             ;B=CTC TIME CONST, C=CTC INIT BYTE
  833.        LDA     BAUDTAB
  834.        STA     MSPEED
  835.        CPI     6
  836.        JRNC    SETC2           ;JUMP IF BAUDRATE > 1200
  837.        SETB     5,C             ;ELSE SELECT PRESCALE BY 256
  838. SETC2: SBCD    PARAMS
  839.        CALL    COMMINIT
  840.        CALL    JMP$ILPRT
  841.        DB    CR,LF,0
  842.        RET                     ;LEAP BACK INTO MODEM7 KLUDGE
  843. PARTAB:
  844.        DB    0,3
  845.        DW    PTITLE
  846.        DW    PVARS
  847.        DW    PNONE
  848.        DW    PODD
  849.        DW    PEVEN
  850. PTITLE:        DB    '  PARITY = ',0
  851. PNONE: DB    'NONE',0
  852. PODD:  DB    ' ODD',0
  853. PEVEN: DB    'EVEN',0
  854. PVARS: DB    10000000B
  855.        DB    10000011B
  856.        DB    10000010B
  857. ;
  858. ; NOTE:  MUST TERMINATE PRIOR TO 0400H (with Smartmodem)
  859. ;                                0C00H (without Smartmodem)
  860. ;
  861. ZZZLAST EQU  $
  862.        END
  863.