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 / ENTERPRS / CPM / UTILS / A / C128NEW2.ZIP / I2C8-1.ASM < prev    next >
Assembly Source File  |  1989-10-07  |  15KB  |  461 lines

  1.  
  2. ; I2C8-1.ASM - Commodore C128 overlay for IMP - 12/12/85
  3. ;
  4. ; This Commodore C128 overlay for IMP supports the Commodore 1670 modem,
  5. ; the Hayes Smartmodem 1200 or any similar modem using the Hayes "AT"
  6. ; command set, the Prometheus 1200 modem or any Racal-Vadic autodial
  7. ; modem.
  8. ;
  9. ; NOTE: Modems for the Commodore C128 plug into the "user's port".  The
  10. ;    Commodore 1670 modem plugs in directly.  Other brands of modems
  11. ;    can be used, but an adapter interface is needed to convert that
  12. ;    port to a RS232 type connector.  This is called a 1011A adapter
  13. ;    by Commodore.  The Omni-Tronics firm makes such an adapter which
  14. ;    comes with a RS-232 cable to plug into the modem.
  15. ;
  16. ;        The Commodore 1670 does not support DTR
  17. ;        so if using that modem, be sure to use:
  18. ;    
  19. ;            NODTR  EQU  YES
  20. ;
  21. ;        in the equates below.  This substitutes
  22. ;        the "pause +++ pause ATH0" command for
  23. ;        dropping DTR.  If using a modem that
  24. ;        does support DTR, you can instead use:
  25. ;
  26. ;            NODTR  EQU  NO
  27. ;
  28. ;        since dropping DTR for 1/2 second is far
  29. ;        faster than the "pause +++ pause ATH0".
  30. ;        Also not all external modems support the
  31. ;        Hayes AT commands, etc.  The DTR/+++ is
  32. ;        used to remotely disconnect the modem
  33. ;        from the telephone line.
  34. ;
  35. ; NOTE:    The times quoted for file transfer will likely be less than what
  36. ;    will be observed when using the C128 computer.  This is mostly
  37. ;    due to the way the information is sent to the disk and then ver-
  38. ;    ified.  As a result, it takes around 7-8 seconds to dump only 4k
  39. ;    to the Commodore 1571 disk system.  (Most disk systems take only
  40. ;    5-6 seconds to dump 16k.)  Consequently, this Commodore overlay
  41. ;    has a line at the very end which sets byte 0BFFH to dump every
  42. ;    4k (32 record intervals), so it will finish prior to a 10-second
  43. ;    time-out error.  (The 1541 disks are slower yet and that byte
  44. ;    may need to be changed to dump at 2k intervals if using the 1541
  45. ;    disk drive, to prevent timeout errors.)
  46. ;
  47. ;    The printer command has been disabled - due to the way the 1200
  48. ;    bps modem "bit-banging" has been implemented into the Commodore
  49. ;    C128, the printer can not be used at the same time the modem is
  50. ;    being used.
  51. ;
  52. ;    IMPORTANT:  IF YOU GOT THE "I2NM-n.ASM" FILE FOR CHANG-
  53. ;            ING THE PHONE NUMBER LIBRARY, AT THIS TIME
  54. ;            GO CHANGE THE LABEL "XFRSIZE" FROM 16 TO 4
  55. ;            SO IF/WHEN YOU USE THAT PROGRAM, IT WILL SET
  56. ;            THE 0BFF BYTE CORRECTLY FOR THE COMMODORE
  57. ;            TO DUMP TO DISK EACH 4K.  (IF YOU DO THAT
  58. ;            WHILE READING THIS, YOU WON'T FORGET IT.)
  59. ;
  60. ;                    - Notes by Irv Hoff W6FFC
  61. ;
  62. ;-----------------------------------------------------------------------
  63. ;
  64. ; You will want to look this file over carefully. There are a number of
  65. ; options that you can use to configure the program to suit your taste.
  66. ; This file adapts the Commodore C128 (with external modem) to IMP.COM.
  67. ;
  68. ; Edit this file for your preferences then follow the "TO USE:" example
  69. ; shown below.
  70. ;
  71. ; Many terminals will clear the screen with a CTL-Z.  If yours does, put
  72. ; a 1AH at CLEAR: (010AH).  Many terminals use two characters, the first
  73. ; normally an ESC.  For example, ESC *.  In this case put '*' at CLEAR:
  74. ; (The ESC will automatically be typed with no CTL-character present.)
  75. ; If you don't know what your terminal uses, put a 0 at CLEAR: and IMP
  76. ; will scroll up 24 blank lines to clear the CRT for things like MENU,
  77. ; looking at the function key table, typing CTL-Z in command mode, etc.
  78. ;
  79. ; Use the "SET" command to change the baudrate when desired.  The value
  80. ; at MSPEED controls the baudrate when the program is first called up.
  81. ;
  82. ;    NOTE:  The Commodore C128 does not have an authentic serial
  83. ;        port and thus can only run 1200 bps maximum speed.
  84. ;
  85. ;    TO USE: First edit this file filling in answers for your own
  86. ;        equipment.  Then assemble with ASM.COM or equivalent
  87. ;        assembler.  Then use MLOAD to merge into the main file:
  88. ;
  89. ;        MLOAD IMP.COM=IMP.COM,I2C8-x.HEX
  90. ;
  91. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  92. ;
  93. ; 12/12/85  Written to work with IMP, based on work done for MDM740 for
  94. ;        the C128 by Von Ertwine.  - Irv Hoff
  95. ;
  96. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  97. ;
  98. ;
  99. YES    EQU    0FFH        ; Some assemblers cannot use NOT NO or
  100. NO    EQU    0        ;   0FFFFH for "YES", notably ASM.COM.
  101. ;
  102. ;
  103. ; C128 data
  104. ;
  105. PORT    EQU    6
  106. MEMRY    EQU    0FD4EH
  107. MDCTL1    EQU    MEMRY+1
  108. SNDDAT    EQU    MEMRY+2
  109. RCVDAT    EQU    MEMRY+3
  110. MDRCV    EQU    01H        ; Modem receive ready
  111. MDSNDB    EQU    80H        ; bit to test for send
  112. MDSNDR    EQU    00H        ; value when send ready
  113. MDTXE    EQU    00H
  114. ;
  115. ;
  116. ;-----------------------------------------------------------------------
  117. ;
  118. ESC    EQU    '['-40H    ; ^[ = Escape
  119. BELL    EQU    'G'-40H    ; ^G = Bell character
  120. LF    EQU    'J'-40H    ; ^J = Linefeed
  121. NEXTRY    EQU    'K'-40H    ; ^K = Try next phone number, abort this try
  122. CR    EQU    'M'-40H    ; ^M = Carriage return
  123. CLEARSC    EQU    'Z'-40H    ; ^Z = Clears screen, command mode only
  124. EOFCHAR    EQU    'Z'-40H    ; ^Z = End of file
  125. ;
  126. ;
  127. ;-----------------------------------------------------------------------
  128. ;
  129. ;
  130.     ORG    0100H
  131. ;
  132. ;
  133.     DS    3        ; Skip the data area below
  134. ;
  135. ;
  136. ; These routines and equates are at the beginning of the program so
  137. ; they can be patched by a monitor or overlay file without re-assembling
  138. ; the program.
  139. ;
  140. MSPEED:     DB    5    ; 0=110 1=300 2=450 3=600 4=710 5=1200        103H
  141.             ; 6=2400 7=4800 8=9600 9=19200 default
  142. HS2400:     DB    NO    ; Yes=2400 bps highest speed            104H
  143. HS1200:     DB    YES    ; Yes=1200 bps highest speed            105H
  144. RACAL:     DB    NO    ; Yes=Racal-Vadic 1200V or 2400V or 2400PA    106H
  145. PROMODM: DB    NO    ; Yes=Prometheus ProModem 1200 bps        107H
  146. RESVD1:     DB    NO    ; Reserved for special modems            108H
  147. RESVD2:     DB    NO    ; Reserved for special modems            109H
  148. ;
  149. ;
  150. CLEAR:     DB    1AH    ; Clear screen character (ESC not needed)    10AH
  151. CLOCK:     DB    12    ; Special clock speed, set for C128 at 1200 bps 10BH
  152.             ; 20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  153. BYTDLY:     DB    2    ; 0=0 delay  1=10ms  5=50 ms - 9=90 ms        10CH
  154.             ;   default time to send character in ter-
  155.             ;   minal mode file transfer for slow BBS
  156. CRDLY:     DB    2    ; 0=0 delay 1=100 ms 5=500 ms - 9=900 ms    10DH
  157.             ;   default time for extra wait after CRLF
  158.             ;   in terminal mode file transfer
  159. NOFCOL:     DB    5    ; Number of directory columns shown        10EH
  160. TCHPUL:     DB    'T'    ; T=tone, P=Pulse (Hayes 2400 modems)        10FH
  161. ;.....
  162. ;
  163. ;
  164. ADDLFD:     DB    NO    ; Yes=add LF after CR to send file in terminal    110H
  165.             ;   mode (normally added by remote echo)
  166. CONVRUB: DB    YES    ; Yes=convert rub to backspace            111H
  167. CRCDFLT: DB    YES    ; Yes=default to CRC checking            112H
  168. IGNRCTL: DB    NO    ; Yes=CTL-chars above ^M not displayed        113H
  169. ;.....
  170. ;
  171. ;
  172. EXTCHR:     DB    '['-40H    ; ESC = preceeds local control character    114H
  173. EXITCHR: DB    'E'    ; Exit character                115H
  174. FILESND: DB    'F'    ; Send file when in terminal mode        116H
  175. NOCONCT: DB    'N'    ; Disconnect from phone line            117H
  176. LOGCHR:     DB    'L'    ; Send logon                    118H
  177. LSTCHR:     DB    NO    ; Toggle printer (unavailable to C128 users)    119H
  178. UNSAVCH: DB    'R'    ; Close input text buffer            11AH
  179. SAVECHR: DB    'Y'    ; Open input text buffer            11BH
  180. CLEARS:     DB    'Z'    ; Clears screen, terminal mode            11CH
  181. SPARE1:     DB    0    ; For future development            11DH
  182. NODTR:     DB    YES    ; Yes if no DTR and need +++ to disconnect    11EH
  183. ;.....
  184. ;
  185. ;
  186. ; Handles in/out ports for data and status
  187. ;
  188. I$MDCTL1: LDA    MDCTL1        ; Get status byte to A-reg.        11FH
  189.       RET            ;                    121H
  190.       DB    0,0,0,0,0,0    ; Spares if needed            122H
  191. ;
  192. I$MDTXE:  LDA    MDCTL1        ; (Needed for SIO or DART register 1    129H
  193.       RET            ;                    12BH
  194.       DB    0,0,0,0,0,0    ;                    12CH
  195. ;
  196. I$MDDATP: LDA    RCVDAT        ; Get the character            133H
  197.       JMP    GETDAT        ;                    136H
  198.       DB    0,0,0,0        ;                    139H
  199. ;
  200. O$MDDATP: STA    SNDDAT        ; Output the character            13DH
  201.       JMP    OUTDAT        ;                    140H
  202.       DB    0,0,0,0        ; Spares if needed            143H
  203. ;.....
  204. ;
  205. ;
  206. A$MDRCV:  ANI    MDRCV        ;                    147H
  207.       RET            ;                    149H
  208. ;
  209. C$MDRCV:  CPI    MDRCV        ;                    14AH
  210.       RET            ;                    14CH
  211. ;
  212. A$MDSND:  ANI    MDSNDB        ;                    14DH
  213.       RET            ;                    14FH
  214. ;
  215. C$MDSND:  CPI    MDSNDR        ;                    150H
  216.       RET            ;                    152H
  217. ;
  218. A$MDTXE:  ANI    MDTXE        ;                    153H
  219.       RET            ;                    155H
  220. ;
  221. C$MDTXE:  CPI    MDTXE        ;                    156H
  222.       RET            ;                    158H
  223. ;.....
  224. ;
  225. ;
  226. ; Special exit vector, used by some computers to reset interrupt vectors
  227. ;
  228. J$EXITVEC:JMP    SET300        ; Put C128 back to 300 baud clock    159H
  229. ;.....
  230. ;
  231. ;
  232. ; Jump vectors needed by each overlay
  233. ;
  234. J$GOODBYE:JMP    GOODBYE        ; Disconnects modem by dropping DTR    15CH
  235. J$INITMOD:JMP    INITMOD        ; Initializes modem, autosets baudrate    15FH
  236. J$STUPR:  JMP    STUPR        ; SET routine to change baudrate    162H
  237. J$SYSVR:  JMP    SYSVR        ; Signon message            165H
  238. ;.....
  239. ;
  240. ;
  241. ; "AT" command strings, can be replaced in individual overlay if needed
  242. ;
  243. J$STRNGA: JMP    SPLSTR        ; 1200 bps "AT" string            168H
  244. J$STRNG1: DS    3        ; 2400 bps "AT" string            16BH
  245. ;
  246. ;
  247. ; Next fourteen lines should not be changed by user overlay as these go
  248. ; to specific locations in the main program, not in the overlay.
  249. ;
  250. ;
  251. J$CMDSPL: DS    3        ; Allows entry of baudrate on CMD line    16EH
  252. J$CRLF:      DS    3        ; Turns up one new line on display    171H
  253. J$DIAL:      DS    3        ; Start of dialing routine        174H
  254. J$DSCONT: DS    3        ; Terminates modem use            177H
  255. J$GOLST:  DS    3        ; Printer routine, needed by Apple //e    17AH
  256. J$ILPRT:  DS    3        ; Prints an inline string, 0 to end    17DH
  257. J$INBUF:  DS    3        ; Stores a keybd string for comparison    180H
  258. J$INLNCP: DS    3        ; Inline "compare strings" routine    183H
  259. J$INMDM:  DS    3        ; Max .1 sec wait for modem character    186H
  260. J$RCVRSP: DS    3        ; For 3801 I/O use (TV-803)        189H
  261. J$SNDCHR: DS    3        ; Sends a character to the modem    18CH
  262. J$SNDSTR: DS    3        ; Sends a string to the modem, $ to end 18FH
  263. J$TIMER:  DS    3        ; .1 second timer (amount in 'B' reg.)    192H
  264. J$NEW1:      DB    0,0,0        ; For future needs            195H
  265. J$NEW2:      DB    0,0,0        ; For future needs            198H
  266. ;.....
  267. ;
  268. ;
  269. ; For 2400 bps auto-stepdown units
  270. ;
  271. MANUAL:      DB    0        ; For manual selection flag        19BH
  272. J$300:      JMP    OK300        ; Sets baudrate to 300 baud        19CH
  273. J$1200:      JMP    OK1200        ; Sets baudrate to 1200 bps        19FH
  274. J$2400:      JMP    OK2400        ; Sets baudrate to 2400 bps        1A2H
  275. ;.....
  276. ;
  277. ;
  278. LOGPTR:      DW    LOGON        ; Pointer to display LOGON message    1A5H
  279. ;
  280. SYSVR:      CALL    J$ILPRT        ; Display the following line        1A7H
  281.       DB    'Commodore C128 Version' ;                1AAH
  282.       DB    CR,LF,0
  283.       RET
  284. ;.....
  285. ;
  286. ;
  287. ;-----------------------------------------------------------------------
  288. ;
  289. ; NOTE:  You can change the SYSVER message to be longer or shorter.  The
  290. ;     end of your last routine should terminate by 0400H (601 bytes
  291. ;     available after start of SYSVER).
  292. ;
  293. ;-----------------------------------------------------------------------
  294. ;
  295. ; You can put in a message at this location which can be called up with
  296. ; (special character-L).  You can put in several lines.  End with a 0.
  297. ;
  298. LOGON:    DB    'C128 running CP/M 3.0',CR,LF,0
  299. ;
  300. ;-----------------------------------------------------------------------
  301. ;
  302. ;
  303. ; This routine sets DTR low for 300 ms to disonnect the phone
  304. ;
  305. GOODBYE:MVI    B,'S'-40H    ; X-off to stop host if needed
  306.     CALL    J$SNDCHR
  307.     MVI    B,1        ; Wait a moment to let it react
  308.     CALL    J$TIMER
  309.     LXI    B,0DD01H    ; Dataport B
  310.     DB    0EDH,78H    ; Input A (Z80 instruction)
  311.     ANI    0F9H
  312.     DB    0EDH,79H    ; Output the new value, to disconnect
  313.     MVI    B,3        ; For 300 ms.
  314.     CALL    J$TIMER
  315.     LXI    B,0DD01H    ; Reset back to normal
  316.     DB    0EDH,78H
  317.     ORI    6
  318.     DB    0EDH,79H
  319.     RET
  320. ;.....
  321. ;
  322. ;
  323. ; Sets 8251 to 8 bits, DTR, RCV and TX ready
  324. ;
  325. INITMOD:MVI    A,1        ; Set to 8 bits, no parity
  326.     STA    MEMRY        ; Configure byte in BIOS
  327.     LDA    MSPEED        ; Get the selected value
  328.     CPI    1        ; 300 bps
  329.     JZ    OK300
  330.     CPI    5        ; 1200 bps
  331.     JZ    OK1200
  332.     JMP    STUPR1        ; Else ask what is wanted
  333. ;.....
  334. ;
  335. ;
  336. ; Initialize the port, baudrate is now in the B-reg. find where it goes
  337. ; and put it there.
  338. ;
  339. INIT1:    PUSH    B        ; Temporarily store the baudrate value
  340.     LHLD    0000H+1        ; Get BIOS address
  341.     LXI    D,57        ; CP/M JMP device table
  342.     DAD    D        ; Index into BIOS
  343.     CALL    INIT2        ; Jumps to address now in HL
  344.                 ; returns with HL=char device tbl start
  345.     LXI    D,PORT*8+7    ; Offset to RS232 baud rate
  346.     DAD    D        ; Point to RS232 baud rate byte
  347.                 ;   Byte now in HL
  348.     POP    B        ; Get the baudrate value back
  349.     MOV    M,B        ; Store the requested baud rate
  350. ;
  351. ;
  352. ; Have now stored desired baudrate, find the address in BIOS where the
  353. ; port will be initialized, put the correct port into the 'C' register
  354. ; and then initialize that port to baud rate just set, finished.
  355. ;
  356.     LHLD    0000H+1        ; Get BIOS address
  357.     LXI    D,60        ; CP/M init address
  358.     DAD    D        ; Index into BIOS
  359.     MVI    C,PORT        ; Tell it what port to initialize
  360. ;
  361. ;
  362. ; Jumps to HL address, performs that routine, then returns to original
  363. ; area that called this area.
  364. ;
  365. INIT2:    PCHL            ; Jump to that routine then return
  366. ;.....
  367. ;
  368. ;
  369. ; We found there was a character, got it, but have to manually reset the
  370. ; flag to zero saying we did get the character.
  371. ;
  372. GETDAT:    PUSH    H        ; Save the current address just in case
  373.     LXI    H,MDCTL1    ; Address of status byte
  374.     DB    0CBH,86H    ; Reset the 0 bit of the HL status byte
  375.     POP    H        ; Restore the original address
  376.     RET            ; Return with the character
  377. ;.....
  378. ;
  379. ;
  380. ; Output character has been stored in the BIOS memory location, now set
  381. ; the flag showing there is a charcter ready.
  382. ;
  383. OUTDAT:    PUSH    H        ; Save any current address, if needed
  384.     LXI    H,MDCTL1    ; Address of the status byte
  385.     DB    0CBH,0FEH    ; Set bit 7 of the HL status byte
  386.     POP    H        ; Get the original address back
  387.     RET            ; All done
  388. ;.....
  389. ;
  390. ;
  391. STUPR:    CALL    J$CMDSPL    ; Gives us CMDBUF+6
  392.     JNC    STUPR2
  393. ;
  394. STUPR1:    CALL    J$ILPRT
  395.     DB    'Input Baud Rate (300, or 1200): ',0
  396.     LXI    D,BAUDBUF    ; Point to new input buffer
  397.     CALL    J$INBUF
  398.     CALL    J$CRLF
  399.     LXI    D,BAUDBUF+2
  400. ;
  401. STUPR2:    CALL    J$INLNCP    ; Compare BAUDBUF+2 with chars. below
  402.     DB    '300',0
  403.     JNC    OK300        ; Go if got match
  404.     CALL    J$INLNCP
  405.     DB    '1200',0
  406.     JNC    OK1200
  407.     CALL    J$ILPRT        ; All matches failed, tell operator
  408.     DB    '++ Incorrect entry ++',CR,LF,BELL,CR,LF,0
  409.     JMP    STUPR1        ; Try again
  410. ;
  411. OK300:    MVI    A,1        ; MSPEED 300 baud value
  412.     MVI    B,BD300        ; Get 300 baud parameters in 'HL'
  413.     JMP    LOADBD        ; Go load them
  414. ;
  415. OK1200:    MVI    A,5
  416.     MVI    B,BD1200
  417.     JMP    LOADBD
  418. ;
  419. OK2400:    JMP    OK1200        ; C128 does not support 2400 bps
  420. ;
  421. LOADBD:    STA    MSPEED        ; Change time-to-send to match baudrate
  422.     JMP    INIT1
  423. ;.....
  424. ;
  425. ;
  426. ; TABLE OF BAUDRATE PARAMETERS
  427. ;
  428. BD300    EQU    6        ; Divisor for 300 baud
  429. BD1200    EQU    8        ; Divisor for 1200 bps
  430. ;
  431. BAUDBUF:DB    10,0,0,0,0,0
  432.     DB    0,0,0,0,0,0
  433. ;.....
  434. ;
  435. ;
  436. SET300:    MVI    B,BD300
  437.     JMP    INIT1
  438. ;.....
  439. ;
  440. ;
  441. ; Initialization string - the '#' character is a 100 ms. delay, at least
  442. ; four should be used after a CR following a commnd.
  443. ;
  444. SPLSTR:    DB    'A#T#V#0#',CR,'####','A#T#E#1#Q#0#X#1',CR,'####','$'
  445. ;
  446. ;
  447. ; This sets the size of the disk dump.  Most Commodore systems write to
  448. ; disk so slowly that 4k is a good figure to use to insure finishing
  449. ; prior to a 10-second timeout at the other end (which causes them to
  450. ; resend the last transmission again, etc.)
  451. ;
  452.     ORG    0BFFH
  453. ;
  454.     DB    20H        ; 20h=4k, 40h=8k, 80h=16k disk dumps
  455. ;.....
  456. ;
  457. ;
  458. ; NOTE: Must terminate by 0400H
  459. ;
  460.     END
  461.