home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / appleii / appacc.m65 < prev    next >
Text File  |  2020-01-01  |  9KB  |  349 lines

  1. ;*BM
  2. ;    $Header: appacc.m65,v 1.8 88/12/22 09:17:48 medin Locked $
  3. ;********************************
  4. ;*                              *
  5. ;*  APPLE COMMUNICATIONS CARD   *
  6. ;*     DRIVER FOR KERMIT 3      *
  7. ;*                              *
  8. ;*   VERSION MODIFICATIONS BY   *
  9. ;*         I. CHUANG            *
  10. ;*                              *
  11. ;*    LAST DATE: 29/JULY/86     *
  12. ;*                              *
  13. ;$Log:    appacc.m65,v $
  14. ;Revision 1.8  88/12/22  09:17:48  medin
  15. ; Use the time count for the wait routine
  16.  
  17. ;Revision 1.7  88/03/28  13:24:16  medin
  18. ; Correct bug in flow control.
  19.  
  20. ;Revision 1.6  88/01/15  08:42:57  medin
  21. ;New origin for 3.81
  22.  
  23. ;Revision 1.5  87/06/29  10:47:49  medin
  24. ; Change wait rtn to use apple rom wait, change org for 3.78.
  25.  
  26. ;Revision 1.4  87/05/13  18:08:21  medin
  27. ; Change org to correspond with 3.76
  28.  
  29. ;Revision 1.3  87/02/20  23:50:42  medin
  30. ; Put version in the hearld so we can keep track of the com drivers
  31. ;also. Thanks Rhoda.
  32.  
  33. ;DONT FORGET TO UPDATE THE VERSION
  34. ;Revision 1.2  86/12/22  10:49:26  medin
  35. ; New initialization from Ike. The acc now initializes itself internally
  36. ;and doesnt require the "IN#?" to start the card up. Thanks to Ike for the
  37. ;latest and for Rhoda for testing it.
  38.  
  39. ;Revision 1.1  86/10/28  10:35:15  medin
  40. ;Initial revision
  41.  
  42. ;********************************
  43.  
  44.  ORG $1003 ; START DEFINITIONS AT $1003
  45.  
  46. ;*   VECTOR FOR COM CARDS STARTS HERE
  47. ;*       LOCATION $1003 FOR DATA
  48. ;*       LOCATION $1020 FOR ROUTINE JUMPS
  49. ;*       LOCATION $1040 FOR MAIN ROUTINES
  50.  
  51. SSCDBD .blkb 1 ;CONT BAUD INDEX(ALA SUPER SERIAL CARD) USED BY
  52.  
  53. ;*             INIT
  54. ;*             6 - 300 BAUD
  55. ;*             7 - 600
  56. ;*             ECT.
  57.  
  58.  .blkb 1
  59. CRDNAM .word HERLD
  60. KERSLI .blkb 1 ; COM SLOT $N0
  61. KERINS .blkb 1 ; FORCE INITIALIZATION FLAG-WHEN 0
  62. ENDKER .blkb 2 ; ADDRESS OF END OF MAIN KERMIT
  63. FLOWFG .blkb 1 ;FLOW CTRL (XON/OFF) FLG TRUE WHEN HI BIT SET
  64. tl0end    .word    endcom    ;[1.6] end of this routine
  65. timect    .blkb    1    ;[1.8] 1 ms delay via rom wait rtn
  66.  ORG SSCDBD+29 ;FUTURE EXPANSION
  67.  JMP TL2INT ; INITIALIZE COM CARD
  68.  JMP TL2CMD ; COMMAND FOR ACIA IN A
  69.  
  70. ;*    0 - HANG UP
  71. ;*    $0B - SET BAUD
  72. ;*    $0C - SET BREAK ON THE LINE
  73. ;*    $91 - XON
  74. ;*    $93 - XOFF
  75. ;*    ROUTINE WILL RETURN FALSE(0) IF UNABLE
  76.  
  77.  JMP TL2CP ; CHECK FOR INPUT CH READY-0 FALSE
  78.  JMP TL2GPC ; GET INPUT CH
  79.  JMP TL2PPC ; PUT OUTPUT CHARACTER
  80.  JMP TL2EXI ; RESET CARD AND RESTORE INITIALIZED
  81.  
  82.  ORG SSCDBD+29+32 ; FUTURES
  83. ;[1.5]WAIT .blkb 3 ; WAIT ROUTINE-A REG CONTAINS MILLISECONDS
  84. WAIT .blkb 3 ; WAIT ROUTINE-apple rom rtn 220=125ms,198=100ms,25=2ms ...
  85. PRSTR .blkb 3 ; PRINT STRING-X=LSB,Y=MSB OF NULL TERMINATED STRING
  86. URDKEY .blkb 3 ; READ KEYBOARD
  87. PRCRLF .blkb 3 ; PRINT CR AND LF
  88. TELCNC .blkb 3 ;CHECK FOR KEYBOARD CHARACTER
  89. TELSPA .blkb 3 ;SET CHARACTER PARITY
  90.  
  91. ;********************************
  92. ;* MAIN CODE STARTS HERE
  93.  
  94.  ORG $7f00    ;[1.9]
  95. START = *
  96.  
  97. CR = $D ; <CR>
  98. APINC1 = $3 ; FIRST INIT CHAR FOR 6850 ACIA
  99. APINC2 = $11 ; SECOND INIT (8-BITS)
  100. HCTRLQ = $91 ;^Q WITH HIGH BIT SET
  101. HCTRLS = $93 ;^S  "
  102. HCTRLZ = $9A ;^Z  "
  103. CTRLQ = $11 ; ^Q
  104. CTRLS = $13 ; ^S
  105. CSWL = $36
  106. CSWH = $37
  107. INITKR0 = $15
  108. MSTRINI = $03         ; initialize the acia control register
  109.  
  110. IRQL = $3FE
  111. IRQH = $3FF
  112. RDKEY = $FD0C ; READ A CH FROM CURRENT INPUT DEVICE
  113. COUT = $FDED ; PRINT A CH TO CURRENT OUTPUT DEVICE
  114. SETIO2 = $FE93 ; PLACE FOR PR#0
  115. KR0PCH = $C08F ; BASE FOR PORT CHAR LOCATION
  116. KR0PST = $C08E ; BASE FOR PORT STROBE LOCATIONS
  117. KBD = $C000 ; KEYBOARD CHARACTER INPUT LOCATION
  118.  
  119. TEMP .byte 00 ; WORK SPACE FOR DIAL
  120. PINPTR .byte 00 ; INPUT BUFFER POINTER
  121. INPTR .byte 00 ; INPUT BUFFER POINTER FOR GET
  122. POUTPT .byte 00 ; OUTPUT BUFFER POINTER
  123. OUTPTR .byte 00 ; " "  " FOR PUT
  124. KSLI .byte 00 ; COM SLOT $0N
  125. DCH:CR .byte 00 ; SAVE AREA FOR CONTROL REGISTER
  126. kwrk01    .byte    1    ;[1.8]
  127.  
  128. ;********************************
  129. ;* NOW THE ASCII MESSAGES
  130.  
  131. HERLD nasc <APPLE COMM CARD V1.9> 1
  132. BAD nasc <*****ERROR***** COM ROUTINES ASSEMBLED TOO LOW IN MEMORY> 1
  133. DIALM2 nasc <AWAITING CARRIER....(ANY KEY ABORTS)> 1
  134. DIALM3 nasc <CONNECTED.> 1
  135.  
  136. ;********************************
  137. ;* MAIN INIT: CHECK LOAD LOC OK
  138.  
  139. TL2INT LDA #START^
  140.  CMP ENDKER+1 ;ARE WE LOADED ABOVE MAIN
  141.  BEQ DONTNO ;CANT TELL YET
  142.  BCC TRBLE ;YES WE ARE IN TROUBLE
  143.  BCS SETNM ;OK
  144. DONTNO LDA #START\ ;WELL LETS CHECK 16 BITS
  145.  CMP ENDKER
  146.  BEQ SETNM ;WHEE JUST EXACTLY RIGHT
  147.  BCS SETNM ;OK
  148. TRBLE LDX #BAD\ ;GOT TO TELL SOMEONE
  149.  LDY #BAD^
  150.  JSR PRSTR ;PRINT THE MESSAGE
  151.  JSR PRCRLF ;AND TERMINATE IT PROPERLY
  152.  JMP $3D0
  153.  
  154. ;********************************
  155. ;* SET THE INTERRUPT VECTOR
  156.  
  157. SETNM LDA #IRQHND
  158.  STA IRQL
  159.  LDA #IRQHND^
  160.  STA IRQH
  161.  lda    KERSLI ; CALCULATE $0N FROM $N0
  162.  LSR A
  163.  LSR A
  164.  LSR A
  165.  LSR A
  166.  STA KSLI ; NOW WE HAVE $0SLOT
  167. ;        TAX        ; slot index to x reg
  168.         ldx    KERSLI        ; get proper slot format
  169.         LDA    #MSTRINI    ; load the new master init code
  170.         STA    KR0PST,X    ; send it
  171.         LDA    #INITKR0    ; get the operating code
  172.         STA    KR0PST,X    ; send it
  173.  
  174. ;********************************
  175. ;* CHECK FOR CARRIER
  176.  
  177.  LDX KERSLI ; GET DEVICE SLOT
  178.  LDA KR0PCH,X ; ACCESS DATA
  179.  LDA KR0PST,X ; NOW FOR THE STATUS
  180.  AND #4 ; DO WE HAVE A CARRIER?
  181.  BNE DOINIT ; YES,CARRY ON
  182.  LDA #INITKR0
  183.  STA DCH:CR
  184.  STA KR0PST,X
  185.  LDA #1 ; GIVE TRUE RETURN
  186.  RTS ; ONLY WAY TO REACH THIS
  187.  
  188. ;********************************
  189. ;* NO CARRIER FOUND, SO DO INIT
  190.  
  191. DOINIT LDX #DIALM2\ ; NOW FOR THE WAITING MSG
  192.  LDY #DIALM2^
  193.  JSR PRSTR ; PRINT IT
  194.  LDX KERSLI ; THE SLOT AGAIN
  195.  LDY KSLI ; SLOT*16
  196.  LDA #INITKR0
  197.  STA DCH:CR
  198.  STA KR0PST,X
  199. TLINI8 BIT KBD ; DO WE HAVE A CH FROM THE KEYBOARD
  200.  BPL TLINI7 ; NO, TRY FOR CARRIER
  201.  JSR RDKEY ; LETS DO THIS RIGHT
  202.  LDA #0 ; GIVE A FALSE RETURN (0)
  203.  RTS ;GIVE A FALSE RETURN (0)
  204. TLINI7 LDA KR0PCH,X ; THE DATA
  205.  LDA KR0PST,X ; AND NOW THE STATUS
  206.  AND #4 ; CARRIER?
  207.  BNE TLINI8 ; NOT YET TRY AGAIN
  208.  JSR PRCRLF ;
  209.  LDX #DIALM3\ ; TELL WE GOT CARRIER
  210.  LDY #DIALM3^
  211.  JSR PRSTR ;
  212.  JSR PRCRLF ;
  213.  LDA #0 ;START THE BUFFER AT 0
  214.  STA PINPTR
  215.  STA INPTR
  216.  STA POUTPT ; "
  217.  STA OUTPTR ; "
  218.  LDA #1 ; GIVE A TRUE RETURN (NON 0)
  219.  RTS ; FINALLY
  220.  
  221. TL2CP
  222.  LDX KERSLI ; OFFSET INTO I/O LOCATIONS
  223. TL0CP1 LDA KR0PST,X ; TRY FOR A CHARACTER
  224.  AND #$01 ; CHECK FOR RECEIVE REGISTER FULL
  225.  BEQ TL0CP7
  226.  LDA KR0PCH,X ; GET CH
  227.  LDY PINPTR ; GET PLACE TO STORE
  228.  STA INBUF,Y ; IN BUF
  229.  INC PINPTR ; READY FOR NEXT
  230.  BIT FLOWFG ; HOW ABOUT FLOW CONTROL
  231.  BPL TL0CP7 ; NO
  232.  LDA INBUF,Y ; GET INPUT CH
  233.  AND #$7F ; DROP PARITY ETC
  234. ; BVC TL2CP4 ; YES,HOW ABOUT ^S RECEIVED?, NO
  235.  CMP #CTRLQ ; IS THIS CONTINUE(START UP OUTPUTING)
  236.  BNE TL2CP4 ; NO, CHECK FOR ^S
  237.  LDA FLOWFG ; TATTLE ABOUT THE CONTINUE
  238.  AND #$BF ;
  239.  STA FLOWFG ;
  240.  DEC PINPTR ; FORGET ABOUT THIS CHARACTER
  241. TL2CP2 LDY OUTPTR ; SEE IF ANY TO OUTPUT
  242.  CPY POUTPT ; WELL?
  243.  BEQ TL0CP7 ; NO MORE WE HAVE PUT ALL
  244. TL2CP3 LDA KR0PST,X ; CHECK STATUS FOR OUTPUT
  245.  AND #$10 ; READY?
  246.  BEQ TL2CP3 ; NO, SPIN
  247.  LDA OUTBUF,Y ; OUTPUT CH
  248.  STA KR0PCH,X ; BYE
  249.  INC OUTPTR ; READY FOR NEXT
  250.  JMP TL2CP2 ;
  251. TL2CP4 CMP #CTRLS ; IS THIS STOP?
  252.  BNE TL0CP7 ; NO
  253.  LDA #$40 ; YES, TATTLE
  254.  ORA FLOWFG ;
  255.  STA FLOWFG ; NOW EVERYONE KNOWS
  256.  DEC PINPTR ; FORGET ABOUT THE ^S CHARACTER
  257. TL0CP7
  258.  LDA PINPTR
  259.  CMP INPTR
  260. ;*; NO CHARACTER, RETURN FALSE(ZERO)
  261. ;*; SUCCESSFUL RETURN, RETURN TRUE(NON 0)
  262.  RTS ; ..
  263.  
  264. TL2GPC
  265.  LDX INPTR ;GET WHERE THE CH IS
  266.  LDA INBUF,X ;GET CH
  267.  INC INPTR
  268. TL0RTC RTS ; AND RETURN
  269.  
  270. TL2PPC
  271.  PHA ; HOLD THE BYTE TO SEND
  272.  LDX KERSLI ; GET I/O LOCATION OFFSET
  273. TL0PP1 LDA KR0PST,X ; GET THE STATUS BYTE
  274.  AND #$02 ; ISOLATE THE FLAG WE WANT (TRE)
  275.  BEQ TL0PP2 ; TRANSMIT REGISTER IS NOT EMPTY, TRY AGAIN
  276.  BIT FLOWFG ; FLOW CONTROL?
  277.  BPL TL2PP0 ; NO
  278.  BVC TL2PP0 ; SHOULD WE STOP OUTPUTING?,NO
  279.  LDY POUTPT ; YES, SAVE THIS CH IN BUFFER
  280.  PLA
  281.  STA OUTBUF,Y ;
  282.  INC POUTPT ; TELL HOW MANY
  283.  RTS ; THATS ALL
  284. TL2PP0 ;
  285.  PLA ; FETCH THE DATA BYTE OFF THE STACK
  286.  STA KR0PCH,X ; STUFF IT AT THE PROPER LOC TO SEND IT
  287.  RTS ; AND RETURN
  288. TL0PP2 JSR TL0CP1 ;GO CHECK FOR AN INPUT CH
  289.  JMP TL0PP1 ;TRY OUTPUT AGAIN
  290.  
  291. TL2EXI
  292. EXIT9 RTS
  293.  
  294. TL2CMD ;FIND OUT WHAT COMMAND
  295.  BEQ TL0DRP ;ITS D
  296.  CMP #$0C
  297.  BEQ BREAK
  298.  CMP #$B
  299.  BEQ TL2RTS
  300.  CMP #HCTRLQ
  301.  BEQ TL2SAC
  302.  CMP #HCTRLS
  303.  BEQ TL2SAC
  304. TL2FLS LDA #0
  305. TL2RTS RTS
  306. TL2SAC    ;[1.7] LDA FLOWFG ; DO WE HAVE FLOW CONTROL?
  307.     ;[1.7] BPL TL2FLS ; NO RETURN FALSE
  308.  AND #$7F
  309.  JSR TELSPA ; SET PARITY
  310.  JSR TL2PPC ; OUTPUT CHAR
  311.  LDA #1
  312.  RTS ; TRUE RETURN
  313. TL0DRP LDX KERSLI
  314. ;*STA KR0PCC,X ; SHUT IT DOWN
  315.  LDA #1
  316.  RTS
  317. BREAK LDY KERSLI ; GET SLOT*16
  318.  LDA DCH:CR ; GET SAVED CTRL REG
  319.  ORA #$60 ; SET BREAK FLAG
  320.  STA KR0PST,Y
  321. ;[1.5] LDA #233 ; WAIT FOR 233 MS
  322. ;[1.8]    lda    #220    ;[1.5] wait 125 ms
  323.     lda    #233    ;[1.8] wait 233 ms
  324.     sta    kwrk01    ;[1.8]
  325. break3    lda    timect    ;[1.8] 1 ms at a time
  326.  JSR WAIT
  327.     dec    kwrk01    ;[1.8]
  328.     bne    break3    ;[1.8]
  329. ;[1.8]    lda    #206    ;[1.5] wait 108 ms for a total of 233ms
  330. ;[1.8]    jsr    WAIT    ;[1.5]
  331.  LDA DCH:CR ; GET SAVED CTRL REG AGAIN
  332.  AND #$9F
  333.  LDY KERSLI
  334.  STA KR0PST,Y ; STOP BREAK SIGNAL
  335.  RTS
  336.  
  337. ;********************************
  338. ;* IRQ HANDLER
  339.  
  340. IRQHND LDA $45
  341.  RTI
  342.  
  343. ;********************************
  344. ;* BUFFERS
  345.  
  346. INBUF .blkb 256 ; INPUT BUFFER
  347. OUTBUF .blkb 256 ; OUTPUT BUFFER
  348. endcom            ;[1.6]
  349.