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 / BEEHIVE / COMMS / IMP-ICE.ARC / ICEMODM.A65 < prev    next >
Text File  |  1990-09-20  |  22KB  |  1,118 lines

  1.     .WIDTH    96
  2. ;************************************
  3. ;ROUTINE: ICEMODEM.A65
  4. ;PURP:    PCPI STARCARD CHARACTER DRIVER FOR AUTOMATIC
  5. ;    ICE MODEM WITH HAYES COMPATIBLE DIALING
  6. ;MAY 1987. KCM Lau
  7. ;************************************
  8.  
  9. FALSE    .EQU    0        ;ASSEMBLY TIME FALSE
  10. TRUE    .EQU    NOT FALSE    
  11.  
  12. BASEP0:    .QUERY    "ENTER BASE OF PAGE 0: "
  13. PAGE0W0: .EQU    BASEP0        ;WORD 0 OF PAGE 0
  14. PAGE0W1: .EQU    PAGE0W0+2    ;WORD 1 OF PAGE 0
  15. LENP0:    .EQU    4        ;4 BYTES OF PAGE 0
  16.  
  17. ;HEADER FOR RELOCATION
  18. TOP:
  19.     .WORD    0        ;IF THIS WORD IS 0 THEN
  20.                 ;   RELOCATABLE DRIVER
  21.                 ;   AND A RELOCATING BIT MAP IS EXPECTED
  22.                 ;ELSE
  23.                 ;   THE DRIVER STORED WHERE INDICATED
  24.     .WORD    ((BOTTOM-TOP)+0FFH) AND 0FF00H ;LENGTH OF THIS CODE
  25.                 ;         TO NEXT PAGE BOUNDRY
  26.     .BYTE    LENP0        ;THIS IS THE NUMBER OF PAGE 0 BYTES
  27.                 ; REQUIRED. IF ITS NO ZERO THEN A RELOCATING
  28.                 ; BIT MAP IS EXPECTED FOR PAGE 0
  29.     .BYTE    0        ;TAG FIELD
  30.     .WORD    12H        ;DEVICE NUMBER (12 = CHARACTER DEVICE 2)
  31.     .WORD    1        ;NUMBER OF DEVICES THIS DRIVER WILL SERVICE
  32.     .WORD    INITENTRY    ;INIT ENTRY POINT
  33.     .WORD    INENTRY        ;INPUT ENTRY POINT
  34.     .WORD    OUTENTRY    ;OUTPUT ENTRY POINT
  35.     .WORD    OTHERENTRY    ;OTHER ENTRY POINT
  36.     .WORD    POLLENTRY    ;POLL ENTRY POINT
  37.     .WORD    1        ;VERSION NUMBER
  38. NAME:    .BYTE    15,"AUTOICE MODEM  " ;NAME OF DRIVER (MUST BE 15 BYTES PLUS
  39.                     ; THE LENGTH BYTE)
  40.  
  41. ;SYSTEM EQUATES
  42. OPG0BASE    .EQU    80H
  43. SYSP1        .EQU    OPG0BASE+2
  44. CP65        .EQU    0B000H
  45. POLLROUTINE     .EQU    CP65+3
  46. RD1Z80BYTE    .EQU    CP65+9
  47. WR1Z80BYTE    .EQU    CP65+12
  48. AZ80SLOT    .EQU    CP65+46
  49. AWCMDCNT    .EQU    CP65+68
  50. ARESETIFLGS    .EQU    CP65+120
  51. SNDNAMECMD    .EQU    15
  52.  
  53. FASTPOLL    .EQU    TRUE    ;Customise for system
  54. TM1SEC        .EQU    24    ;Time count for 1 sec
  55. SIGNON        .BYTE    "Automatic Ice card modem driver installed",13,10,0
  56.  
  57. ;------ SIO ---------
  58. ; Serial drivers for Automatic Ice Card Modem. Ken Lau. May 87.
  59. ; Main routines : INITSER, SERIN, SEROUT, SEROUTX, POLLSIO, SISTATUS, SOSTATUS
  60. ; Support routines: CLRQ, ADDQ, POPQ, QSTATUS
  61. ;
  62. ; Card equates
  63. ICEUNZ    .EQU    0C2C3H    ;Unzap
  64. ;
  65. ; Card vectors. To be patched.
  66. ICEINIT    JMP    0C2A0H
  67. ICESTAT    JMP    0C251H
  68. ICERD    JMP    0C26FH
  69. ICEWR    JMP    0C2D0H
  70. ;
  71. ; Action : initialize serial ports
  72. ;
  73. INITSER    BIT    INITSFT
  74.     BPL    INITSE1    ;--> Not first time
  75.     LDA    0C20DH    ;Patch card entry vectors
  76.     STA    ICEINIT+1
  77.     LDA    0C210H
  78.     STA    ICESTAT+1
  79.     LDA    0C20EH
  80.     STA    ICERD+1
  81.     LDA    0C20FH
  82.     STA    ICEWR+1
  83.     LDA    #0    ;First time = false
  84.     STA    INITSFT
  85. INITSE1    JSR    ICEINIT    ;Initialize card
  86.     JSR    INITZAP
  87.     JSR    CLRQ    ;Clear queue
  88.     RTS
  89.  
  90. ;Set card to dumb mode
  91. INITZAP    JSR    ICEUNZ    ;Unzap
  92.     LDA    #81H    ;^A
  93.     JSR    SEROUT
  94.     LDA    #DAH    ;Z
  95.     JSR    SEROUT
  96.     LDA    #8DH    ;CR
  97.     JMP    SEROUT
  98. ;
  99. ; Action : send a byte. Queue incoming bytes
  100. ; Entry  : [A] = byte
  101. ; Exit   : [A][X][Y] destroyed
  102. ;
  103. SEROUT    JSR    POLLSIO
  104.     BIT    SOCHFL    ;Wait SOCH empty
  105.     BMI    SEROUT
  106.     STA    SOCH    ;Store char to be send in SOCH
  107.     LDA    #0FFH    ;Indicate SOCH filled
  108.     STA    SOCHFL
  109.     JMP    POLLSIO    ;If ready send byte (else let polling do it later)
  110. ;
  111. ; Let through special characters (^A)
  112. SEROUTX    PHA
  113.     JSR    ICEUNZ    ;Unzap
  114.     PLA
  115.     PHA
  116.     JSR    SEROUT
  117.     PLA
  118.     AND    #7FH    ;If CR then revert to dumb mode
  119.     CMP    #0DH
  120.     BEQ    INITZAP
  121.     RTS
  122. ;
  123. ; Action : get last byte received
  124. ;
  125. SERIN    JSR    POLLSIO
  126.     JSR    POPQ
  127.     BCS    SERIN
  128.     RTS
  129. ;
  130. ; Action : queue any incoming serial bytes if present,
  131. ;       send ser out chars waiting in SOCH
  132. ; Exit   : all regs preserved except flags
  133. ;
  134. POLLSIO    PHA        ;Save regs
  135.     STX    POLLSI8
  136.     STY    POLLSI9
  137.     LDA    05FAH
  138.     CMP    #0E2H    ;Hungup value?
  139.     BEQ    POLLSI1
  140.     LDA    #1    ;Check if byte received
  141.     JSR    ICESTAT
  142.     BCS    POLLSI3
  143. POLLSI1    LDA    SOCHFL    ;SOCH filled?
  144.     BMI    POLLSI4    ;--> yes
  145. POLLSI2    LDY    POLLSI9    ;Restore regs
  146.     LDX    POLLSI8
  147.     PLA
  148.     RTS
  149.  
  150. POLLSI3    JSR    ICERD    ;Receive byte to queue
  151.     JSR    ADDQ
  152.     JMP    POLLSI1
  153.  
  154. POLLSI4    LDA    #0    ;Card write status ready?
  155.     JSR    ICESTAT
  156.     BCC    POLLSI2    ;--> No
  157.     LDA    SOCH
  158.     JSR    ICEWR    ;Send SOCH
  159.     LDA    #0    ;SOCH filled = false
  160.     STA    SOCHFL
  161.     JMP    POLLSI2
  162. ;
  163. ; Action : check if byte avail
  164. ; Exit   : if avail then NE, Carry set, [A] = 0FFh
  165. ;
  166. SISTATUS JSR    POLLSIO
  167.     JSR    QSTATUS
  168.     BNE    SISTAT1    ;branch if ser in avail
  169.     CLC
  170.     RTS
  171.  
  172. SISTAT1    LDA    #0FFH
  173.     SEC
  174.     RTS
  175. ;
  176. ; Action : check if ready for serial out
  177. ; Exit   : if ready then [A] = 0FFh, NE, Carry set
  178. ;
  179. SOSTATUS JSR    POLLSIO
  180.     LDA    SOCHFL    ;SOCH filled?
  181.     BNE    SOSTAT1    ;--> Yes, not ready
  182.     LDA    #0FFH
  183.     SEC
  184.     RTS
  185.  
  186. SOSTAT1    LDA    #0
  187.     CLC
  188.     RTS
  189. ;
  190. ; Action : routines to handle 256 byte queue (FIFO)
  191. ; Exit   : [X] corrupted
  192. ;
  193. CLRQ    LDA    #0    ;clear queue
  194.     STA    FIRSTPTR
  195.     STA    NEXTPTR
  196.     RTS
  197. ;
  198. ADDQ    LDX    NEXTPTR    ;add byte to queue
  199.     STA    QUEUE,X
  200.     INX
  201.     STX    NEXTPTR
  202.     CPX    FIRSTPTR
  203.     BNE    ADDQQ
  204.     INC    FIRSTPTR
  205. ADDQQ    RTS
  206. ;
  207. POPQ    LDX    FIRSTPTR    ;get byte from queue
  208.     CPX    NEXTPTR
  209.     BEQ    POPQQ
  210.     LDA    QUEUE,X
  211.     INC    FIRSTPTR
  212.     CLC
  213. POPQQ    RTS        ;carry set if queue empty
  214. ;
  215. QSTATUS    LDA    FIRSTPTR    ;if queue empty [A]=0 and EQ set
  216.     EOR    NEXTPTR
  217.     RTS
  218. ;
  219. ; Variables
  220. ;
  221. RBIT    .BYTE    0
  222. RTIME    .BYTE    0
  223. RDATA    .BYTE    0
  224. SBIT    .BYTE    0
  225. STIME    .BYTE    0
  226. SDATA    .BYTE    0
  227. POLLSI8    .BYTE    0
  228. POLLSI9    .BYTE    0
  229. INITSFT    .BYTE    0FFH    ;True for first time
  230. SOCH    .BYTE    0    ;Serial out char
  231. SOCHFL    .BYTE    0    ;True if SOCH has valid contents
  232. ;
  233. FIRSTPTR .BYTE    0
  234. NEXTPTR    .BYTE    0
  235. QUEUE    .BLOCK    256
  236. ;
  237. ;------ END SIO -----
  238. ;-------- DIAL --------
  239. ; Dialing routine. Apr 87. Ken Lau
  240. ; Main routines: HANGUP, PICKUP, DIALBEG, DIALDIG, DIALEND, DIALST
  241. ;
  242.  
  243. ;Send string at call addr until 0 (ctrl chars allowed thru)
  244. SNDSTR    PLA
  245.     STA    SNDSTR3+1
  246.     PLA
  247.     STA    SNDSTR3+2
  248.     BNE    SNDSTR2
  249. SNDSTR1    JSR    SEROUTX        ;send byte
  250. SNDSTR2    INC    SNDSTR3+1
  251.     BNE    SNDSTR3
  252.     INC    SNDSTR3+2
  253. SNDSTR3    LDA    0FFFFH        ;to be patched
  254.     BNE    SNDSTR1
  255.     LDA    SNDSTR3+2
  256.     PHA
  257.     LDA    SNDSTR3+1
  258.     PHA
  259.     RTS
  260.  
  261. ;Pick up phone (on line)
  262. PICKUP    RTS
  263.  
  264. ;Hang up phone (off line)
  265. HANGUP    JSR    SNDSTR
  266.     .BYTE    81H,C8H,8DH,0    ;^AH<CR>
  267.     RTS
  268.  
  269. ;Prepare to accept dial digits via DIALDIG routine
  270. DIALBEG    JSR    SNDSTR
  271.     .BYTE    81H,C4H,0    ;^AD
  272.     RTS
  273.  
  274. ;Dial digit in [A]. [XY] preserved
  275. DIALDIG    CMP    #10    ;check for 0..9
  276.     BCS    DIALDIQ
  277.     ADC    #0B0H    ;convert to ascii digit
  278.     JSR    SEROUT
  279. DIALDIQ    RTS
  280.  
  281. ;Finish dialing
  282. DIALEND    LDA    #8DH    ;<CR>
  283.     JMP    SEROUT
  284. ;
  285. ;Return dial status. If still waiting then carry clear else code in [A]:
  286. ;(3=no carrier, 1=300 or 75 bps connect, 5=1200 bps connect)
  287. DIALST    LDA    2042
  288.     CMP    #51
  289.     BEQ    DIALST2    ;--> 300 bps
  290.     CMP    #72
  291.     BEQ    DIALST3    ;--> 75/1200 bps
  292.     CMP    #61
  293.     BEQ    DIALST3    ;--> 1200/75 bps
  294.     LDA    #3    ;no carrier
  295.     SEC
  296.     RTS
  297.  
  298. DIALST2    LDA    #1
  299.     SEC
  300.     RTS
  301.  
  302. DIALST3    LDA    #5
  303.     SEC
  304.     RTS
  305.  
  306. ;-------- END DIAL --------
  307.  
  308. ;*************************************
  309. ;ROUTINE: INITENTRY
  310. ;PURP:    INITIALIZE
  311. ;ENTRY:    NONE
  312. ;USED:    ALL
  313. ;*************************************
  314.  
  315. INITENTRY: JSR    INITSER
  316.     BIT    FIRSTTIME    ;if firsttime then patch vectors
  317.     BPL    INIT2
  318.     PHP            ;disable intr
  319.     SEI
  320.     LDA    #0FFh        ;call init on reset
  321.     LDX    TOP+6
  322.     STA    ARESETIFLGS,X
  323.  
  324.     .IF    FASTPOLL
  325.     LDA    #1        ;number of checks of Z80 between polling
  326.     STA    AWCMDCNT
  327.     LDA    POLLROUTINE+1    ;redirect POLLROUTINE
  328.     STA    OLDPOLL+1
  329.     LDA    POLLROUTINE+2
  330.     STA    OLDPOLL+2
  331.     LDA    NPOLLADDR
  332.     STA    POLLROUTINE+1
  333.     LDA    NPOLLADDR+1
  334.     STA    POLLROUTINE+2
  335.     LDA    NRD1Z80ADDR    ;redirect RD1Z80BYTE
  336.     STA    RD1Z80BYTE+1
  337.     LDA    NRD1Z80ADDR+1
  338.     STA    RD1Z80BYTE+2
  339.     LDA    NWR1Z80ADDR    ;redirect WR1Z80BYTE
  340.     STA    WR1Z80BYTE+1
  341.     LDA    NWR1Z80ADDR+1
  342.     STA    WR1Z80BYTE+2
  343.     .ENDC
  344.  
  345.     LDY    #84H+(8*3)    ;find vector to video out
  346.     LDA    (SYSP1),Y
  347.     STA    INITVD
  348.     INY
  349.     LDA    (SYSP1),Y
  350.     STA    INITVD+1
  351.     LDX    #0        ;reset string pointer
  352.     STX    MESIND
  353.     JMP    INIT3
  354.  
  355. INIT4    .BYTE    20H        ;JSR
  356. INITVD    .WORD    0FF69H        ;patched to video out
  357.     INC    MESIND
  358. INIT3    LDX    MESIND
  359.     LDA    SIGNON,X
  360.     BNE    INIT4        ;print until 0
  361.  
  362.     LDA    #0        ;FIRSTTIME := false
  363.     STA    FIRSTTIME
  364.     PLP            ;restore intr
  365. INIT2:    JMP    EXZ        ;reset AT modes and flags
  366.  
  367. FIRSTTIME .BYTE    0FFh        ;true
  368.  
  369.     .IF    FASTPOLL
  370. ;Replacement routine for POLLROUTINE
  371. NPOLLADDR .WORD    NEWPOLL
  372. NEWPOLL    JSR    POLLSIO
  373. OLDPOLL    JSR    0FF58h    ;patch to old pollentry
  374.     JMP    POLLSIO
  375.  
  376. ;Replacement routine for RD1Z80BYTE
  377. NRD1Z80ADDR .WORD NEWRD1Z80
  378. NEWRD1Z80 LDX    AZ80SLOT
  379. NEWRD1ZA JSR    POLLSIO
  380.     LDA    0C083h,X
  381.     BPL    NEWRD1ZA
  382.     LDA    0C080h,X
  383.     RTS
  384.  
  385. ;Replacemnt routine for WR1Z80BYTE
  386. NWR1Z80ADDR .WORD NEWWR1Z80
  387. NEWWR1Z80 LDX    AZ80SLOT
  388.     TAY
  389. NEWWRZA JSR    POLLSIO
  390.     LDA    0C082h,X
  391.     BMI    NEWWRZA
  392.     TYA
  393.     STA    0C081h,X
  394.     RTS
  395.  
  396.     .ENDC
  397.  
  398. ;***********************************
  399. ;ROUTINE: INENTRY:
  400. ;PURP:    INPUT A CHARACTER
  401. ;ENTRY:    Y = n0
  402. ;    X = Cn
  403. ;    WHERE n IS THE SLOT NUMBER
  404. ;EXIT:    A = CHARACTER
  405. ;USED:    ALL
  406. ;***********************************
  407.  
  408. INENTRY    JSR    POLLENTRY
  409.     JSR    INSTAT    ;wait for byte avail
  410.     BEQ    INENTRY
  411.     JMP    SERIN    ;read it
  412.  
  413. ;***********************************
  414. ;ROUTINE: OUTENTRY
  415. ;PURP:    OUTPUT A CHARACTER TO THE DEVICE
  416. ;ENTRY:    A = CHARACTER
  417. ;    Y = n0
  418. ;    X = Cn
  419. ;    WHERE n  IS THE SLOT NUMBER 
  420. ;EXIT:    NONE
  421. ;USED:    ALL
  422. ;************************************
  423.  
  424. OUTENTRY .BYTE    4CH    ;JMP
  425. OUTVEC    .WORD    CHKA    ;To be patched
  426.  
  427. ;Set output vector from table using [A] as index. [AX] used.
  428. SETOVEC    ASL    A
  429.     TAX
  430.     LDA    OVECTBL,X
  431.     STA    OUTVEC
  432.     LDA    OVECTBL+1,X
  433.     STA    OUTVEC+1
  434.     RTS
  435.  
  436. OVECTBL    .WORD    CHKA    ;#0 Check for 1st char of 'AT'
  437.     .WORD    CHKAT    ;#1 Check for 2nd char of 'AT'
  438.     .WORD    ATMODE    ;#2 Store AT command line and execute it
  439.     .WORD    OUTNRM    ;#3 Usual output. Checks for 1st + of +++
  440.     .WORD    OUTPLB    ;#4 Check for 2nd + of +++
  441.     .WORD    OUTPLC    ;#5 Check for 3rd + of +++
  442.     .WORD    OUTPLD    ;#6 Check for 1 sec guard time after +++
  443.  
  444. ;Change to mode 0 and reset timer
  445. SETOV0    LDA    #0
  446. SETOV0A    JSR    SETOVEC
  447.     LDA    #TM1SEC
  448.     STA    TIMER
  449.     RTS
  450.  
  451. ;Change to mode 1 and reset timer
  452. SETOV1    LDA    #1
  453.     JMP    SETOV0A
  454.  
  455. ;Change to mode 3 and reset timer
  456. SETOV3    LDA    #3
  457.     JMP    SETOV0A
  458.  
  459. ;Change to mode 6 and reset timer
  460. SETOV6    LDA    #6
  461.     JMP    SETOV0A
  462.  
  463. ;Usual output routine. Checks for +++
  464. OUTNRM    CMP    #2BH    ;'+' ?
  465.     BEQ    OUTNRM2
  466.     CMP    #0ABH
  467.     BEQ    OUTNRM2
  468. OUTNRM1    JSR    SEROUT    ;Send char
  469.     LDA    #TM1SEC    ;Reset timer to 1 sec
  470.     STA    TIMER
  471.     RTS
  472.  
  473. OUTNRM2    LDX    TIMER    ;Timer=0 ?
  474.     BNE    OUTNRM1
  475.     STA    PLUSCH1    ;Save 1st '+'
  476.     LDA    #4    ;Change mode to check for 2nd +
  477.     JMP    SETOVEC
  478.  
  479. ;Check for 2nd +
  480. OUTPLB    CMP    #2BH    ;'+' ?
  481.     BEQ    OUTPLB1
  482.     CMP    #0ABH
  483.     BEQ    OUTPLB1
  484.     PHA        ;Send '+' <this char> and revert to normal mode
  485.     LDA    PLUSCH1
  486.     JMP    OUTPLD1
  487.  
  488. OUTPLB1    STA    PLUSCH2    ;Save 2nd '+'
  489.     LDA    #5    ;Change mode to check for 3rd +
  490.     JMP    SETOVEC
  491.  
  492. ;Check for 3rd +
  493. OUTPLC    CMP    #2BH    ;'+'?
  494.     BEQ    OUTPLC1
  495.     CMP    #0ABH
  496.     BEQ    OUTPLC1
  497.     PHA        ;Send '++' <this char> and revert to normal mode
  498.     LDA    PLUSCH1
  499.     JSR    SEROUT
  500.     LDA    PLUSCH2
  501.     JMP    OUTPLD1
  502.  
  503. OUTPLC1    STA    PLUSCH3    ;Save 3rd '+'
  504.     JMP    SETOV6    ;Change mode to check for 1 sec guard time
  505.  
  506. ;Check for 1 sec guard time after +++
  507. OUTPLD    LDX    TIMER    ;1 sec timeout?
  508.     BEQ    OUTPLD2    ;--> yes, check for 'A' of 'AT'
  509. OUTPLD3    PHA
  510.     LDA    PLUSCH1    ;Send last 3 '+++'
  511.     JSR    SEROUT
  512.     LDA    PLUSCH2
  513.     JSR    SEROUT
  514.     LDA    PLUSCH3
  515. OUTPLD1    JSR    SEROUT
  516.     PLA        ;Send this char
  517.     JSR    SEROUT
  518.     JMP    SETOV3
  519.  
  520. OUTPLD2    CMP    #41H    ;Check for 'A' of '+++AT'
  521.     BEQ    CHKA
  522.     CMP    #0C1H
  523.     BEQ    CHKA
  524.     PHA
  525.     LDA    PLUSCH1    ;Send last 3 '+++'
  526.     JSR    SEROUT
  527.     LDA    PLUSCH2
  528.     JSR    SEROUT
  529.     LDA    PLUSCH3
  530.     JSR    SEROUT
  531.     LDA    #3    ;Change to mode 3
  532.     JSR    SETOVEC
  533.     PLA
  534.     JMP    OUTENTRY ;Send this char (check for +++ though)
  535.  
  536. ;Check for 1st letter of 'AT' after reset
  537. CHKA    TAY        ;Save char --> Y
  538.     AND    #7FH
  539.     CMP    #41H    ;'A'
  540.     BEQ    CHKA1
  541.     LDA    #3    ;Set vector to OUTNRM
  542.     JSR    SETOVEC
  543.     TYA        ;Restore char and transmit it (check for +++ though)
  544.     JMP    OUTENTRY
  545.  
  546. CHKA1    STY    LINE    ;Save 'A'
  547.     JMP    SETOV1    ;Set output vector to CHKAT
  548.  
  549. ;Check for 2nd letter of 'AT'
  550. CHKAT    STA    LINE+1    ;Save char
  551.     AND    #7FH
  552.     CMP    #54H    ;'T'
  553.     BEQ    CHKAT1
  554.     CMP    #2FH    ;'/'
  555.     BEQ    CHKAT2
  556.     LDA    #3    ;Set output vector to OUTNRM
  557.     JSR    SETOVEC
  558.     LDA    LINE    ;Transmit previous 'A'
  559.     JSR    SEROUT
  560.     LDA    LINE+1    ;Transmit this char (check for +++ though)
  561.     JMP    OUTENTRY
  562.  
  563. CHKAT1    LDA    #2    ;Set output vector to ATMODE
  564.     JSR    SETOVEC
  565.     LDX    #2    ;Set line length
  566.     STX    LNLEN
  567.     LDA    EFL    ;Echo AT if E1
  568.     BEQ    CHKATQ
  569.     LDA    LINE
  570.     JSR    ADDQ
  571.     LDA    LINE+1
  572.     JSR    ADDQ
  573. CHKATQ    RTS
  574.  
  575. CHKAT2    JMP    EXLN    ;Re-execute previous command line
  576.  
  577. ;Store chars in command line buffer until CR (then execute it)
  578. ATMODE    LDX    LNLEN    ;Append char to buffer. Update length unless full
  579.     CMP    #8    ;BS?
  580.     BEQ    AT3
  581.     STA    LINE,X
  582.     CPX    #40
  583.     BCS    AT1
  584.     INX
  585. AT1    STX    LNLEN
  586.     AND    #7FH
  587.     LDX    EFL    ;Echo to queue for E1
  588.     BEQ    AT2
  589.     JSR    ADDQ
  590. AT2    CMP    #0DH    ;CR?
  591.     BEQ    AT4
  592. ATQ    RTS
  593.  
  594. ;BS handling
  595. AT3    CPX    #3    ;Can't backspace over 'AT'
  596.     BCC    ATQ
  597.     DEX
  598.     JMP    AT1
  599.  
  600. ;CR handling
  601. AT4    LDX    EFL    ;Echo LF after CR for E1
  602.     BEQ    EXLN
  603.     LDA    #0AH
  604.     JSR    ADDQ    ;Fall thru to EXLN
  605.  
  606. ;Executes command line in buffer
  607. EXLN    LDX    #2    ;Resets buf index to start reading
  608.     STX    LNIND
  609.     LDA    #0    ;Assume OK response will be given
  610.     STA    RESPONS
  611. EXLN1    JSR    GETCH    ;Fetch non-space char
  612.     BCS    EXLN2    ;--> end of line
  613.     CMP    #13
  614.     BEQ    EXLN2    ;--> end of line
  615.     JSR    EXBR    ;Execute letter command
  616.     JMP    EXLN1
  617.  
  618. EXLN2    JSR    SETOV0    ;Reset to mode 0 (CHKA)
  619.     LDA    QFL    ;Q0=send modem responses
  620.     BNE    EXLNQ
  621.     JSR    ADDQRE    ;Add response to queue
  622. EXLNQ    RTS
  623.  
  624. ;Add response to queue
  625. ADDQRE    LDA    RESPONS
  626.     CMP    #255    ;Response 255 is no response
  627.     BEQ    ADDQREQ
  628.     LDX    VFL    ;V0=single digit response
  629.     BNE    ADDQRE1
  630.     CLC
  631.     ADC    #30H
  632.     STA    RTBL0
  633.     LDY    RTBL0AD
  634.     LDX    RTBL0AD+1
  635.     JMP    RQ
  636.  
  637. ADDQREQ    RTS
  638.  
  639. ADDQRE1    ASL    A
  640.     ASL    A
  641.     ASL    A
  642.     ASL    A
  643.     CLC
  644.     ADC    RTBL1AD
  645.     TAY
  646.     LDA    #0
  647.     ADC    RTBL1AD+1
  648.     TAX
  649.  
  650. ;Add string (terminating with 0) pointed to by XY to queue.
  651. RQ    STY    RQADR
  652.     STX    RQADR+1
  653.     LDX    #0
  654.     STX    RIND
  655. RQ1    LDX    RIND
  656.     .BYTE    0BDH    ;LD ABS,X
  657. RQADR    .WORD    RTBL0    ;Patched on entry to RQ
  658.     CMP    #0
  659.     BEQ    RQQ
  660.     INX
  661.     STX    RIND
  662.     JSR    ADDQ
  663.     JMP    RQ1
  664. RQQ    RTS
  665.  
  666. ;Response string table
  667. RTBL0AD    .WORD    RTBL0
  668. RTBL0    .BYTE    "0",13,0
  669.  
  670. RTBL1AD    .WORD    RTBL1
  671. RTBL1    .BYTE    "OK",13,10,0,"           "    ;0
  672.     .BYTE    "CONNECT",13,10,0,"      "    ;1
  673.     .BYTE    "RING",13,10,0,"         "    ;2
  674.     .BYTE    "NO CARRIER",13,10,0,"   "    ;3
  675.     .BYTE    "ERROR",13,10,0,"        "    ;4
  676.     .BYTE    "CONNECT 1200",13,10,0," "     ;5
  677.     .BYTE    "NO DIALTONE",13,10,0,"  "    ;6
  678.     .BYTE    "BUSY",13,10,0,"         "    ;7
  679.     .BYTE    "RESPONSE 8",13,10,0,"   "    ;8
  680.     .BYTE    "RESPONSE 9",13,10,0,"   "    ;9
  681.     .BYTE    "CONNECT 2400",13,10,0," "    ;10
  682.     .BYTE    "RINGING",13,10,0,"      "    ;11
  683.  
  684. ;Executes a letter command and its parms
  685. EXBR    LDX    #EXTBL2 - EXTBL    ;Search for letter in table
  686. EXBR1    CMP    EXTBL,X
  687.     BEQ    EXBR2
  688.     DEX
  689.     DEX
  690.     DEX
  691.     BPL    EXBR1
  692.     RTS
  693.  
  694. EXBR2    LDA    EXTBL+1,X    ;Jump to addr given by table
  695.     STA    EXVEC
  696.     LDA    EXTBL+2,X
  697.     STA    EXVEC+1
  698.     .BYTE    4CH    ;JMP
  699. EXVEC    .WORD    0FF69H    ;To be patched
  700.  
  701. EXTBL    .BYTE    5AH    ;'Z'
  702.     .WORD    EXZ
  703.     .BYTE    45H    ;'E'
  704.     .WORD    EXE
  705.     .BYTE    51H    ;'Q'
  706.     .WORD    EXQ
  707.     .BYTE    56H    ;'V'
  708.     .WORD    EXV
  709.     .BYTE    58H    ;'X'
  710.     .WORD    EXX
  711.     .BYTE    44H    ;'D'
  712.     .WORD    EXD
  713.     .BYTE    48H    ;'H'
  714.     .WORD    EXH
  715.     .BYTE    53H    ;'S'
  716.     .WORD    EXS
  717. EXTBL2    .BYTE    2AH    ;'*'
  718.     .WORD    ASTER
  719.  
  720. ;Reset AT flags and modes
  721. EXZ    LDX    #S18-EFL    ;zero flags and regs
  722.     LDA    #0
  723. EXZ1    STA    EFL,X
  724.     DEX
  725.     BPL    EXZ1
  726.     LDA    #1        ;Set defaults E1 V1
  727.     STA    EFL
  728.     STA    VFL
  729.     JSR    SETOV0        ;reset vectors
  730.     LDA    #0
  731.     JSR    SETPVEC
  732.     LDA    #0
  733.     JMP    SETISV
  734.  
  735. ;Echo command. E1=echo
  736. EXE    JSR    GETNUM
  737.     STA    EFL
  738.     RTS
  739.  
  740. ;Send responses command. Q0=send responses
  741. EXQ    JSR    GETNUM
  742.     STA    QFL
  743.     RTS
  744.  
  745. ;Send digit responses command. V1=digit responses
  746. EXV    JSR    GETNUM
  747.     STA    VFL
  748.     RTS
  749.  
  750. ;Extended responses set command. E1=extended set
  751. EXX    JSR    GETNUM
  752.     STA    XFL
  753.     RTS
  754.  
  755. ;Dial command
  756. EXD    JSR    DIALBEG
  757. EXD1    JSR    GETCH    ;get dial sub-command/digit
  758.     BCS    EXD3    ;--> end of line
  759.     CMP    #0DH
  760.     BEQ    EXD3    ;--> end of line
  761.     JSR    CHKNUM
  762.     BCC    EXD2    ;--> digit
  763. ;
  764. ;Put compares here to check for dial options. Presently ignored.
  765. ;
  766.     JMP    EXD1
  767.  
  768. EXD2    SEC        ;eval and dial digit
  769.     SBC    #30H
  770.     JSR    DIALDIG
  771.     JMP    EXD1    ;back to dial sub-command loop
  772.  
  773. EXD3    JSR    DIALEND
  774.     LDA    #255    ;no response
  775.     STA    RESPONS
  776.     LDA    #1    ;poll mode 1 (echo CR, pause, then wait for carrier)
  777.     JMP    SETPVEC
  778.  
  779. ;Set register command. Eg. S0=0
  780. EXS    JSR    GETNUM
  781.     BCS    EXSQ
  782.     STA    REGNUM
  783.     JSR    GETCH
  784.     BCS    EXSQ
  785.     CMP    3DH    ;'='
  786.     BNE    EXSQ
  787.     JSR    GETNUM
  788.     LDX    REGNUM
  789.     STA    S0,X
  790. EXSQ    RTS
  791.  
  792. REGNUM    .BYTE    0
  793.  
  794. ;Hangup/pickup handling
  795. EXH    JSR    GETNUM
  796.     CMP    #0
  797.     BEQ    EXH0    ;H0 --> hangup
  798.     CMP    #1
  799.     BEQ    EXH1    ;H1 --> pickup
  800.     RTS    
  801.  
  802. EXH0    JMP    HANGUP
  803. EXH1    JMP    PICKUP
  804.  
  805. ;Echo rest of line with CR to SEROUTX (card commands if valid)
  806. ASTER    LDX    LNIND
  807.     CPX    LNLEN
  808.     BCS    ASTER1    ;--> past end of line
  809.     LDA    LINE,X
  810.     INX
  811.     STX    LNIND
  812.     JSR    SEROUTX    ;Echo
  813.     JMP    ASTER
  814.  
  815. ASTER1    RTS
  816.  
  817. ;Get next non-space char from line buffer but DON'T advance over it
  818. ;Exit: A=char, X=used (LNIND), Carry=set when past end of line
  819. SEECH    LDX    LNIND
  820.     CPX    LNLEN
  821.     BCS    SEECHQ    ;--> past end of line
  822.     LDA    LINE,X
  823.     AND    #7FH
  824.     CMP    #20H
  825.     BNE    SEECH1
  826.     INX
  827.     STX    LNIND
  828.     JMP    SEECH
  829.  
  830. SEECH1    CLC
  831. SEECHQ    RTS
  832.  
  833. ;Get next non-space char from line buffer and advance over it
  834. ;Exit: A=char, X=used, Carry=set when past end of line
  835. GETCH    JSR    SEECH
  836.     BCS    GETCHQ
  837.     INX
  838.     STX    LNIND
  839. GETCHQ    RTS
  840.  
  841. ;Read and eval number from line buffer
  842. ;Exit: A=number or 0 if not present, Carry=set when past end of line
  843. GETNUM    LDA    #0
  844.     STA    NUM1
  845. GETNUM1    JSR    SEECH
  846.     BCS    GETNUM3    ;--> past end of line
  847.     JSR    CHKNUM
  848.     BCS    GETNUM2    ;--> not a numeric char
  849.     JSR    GETCH    ;advance over digit
  850.     SEC
  851.     SBC    #30H
  852.     STA    NUM2
  853.     LDA    NUM1    ;NUM1 := NUM1 * 10 + NUM2
  854.     ASL    A
  855.     ASL    A
  856.     CLC
  857.     ADC    NUM1
  858.     ASL    A
  859.     CLC
  860.     ADC    NUM2
  861.     STA    NUM1
  862.     JMP    GETNUM1
  863.  
  864. GETNUM2    CLC
  865. GETNUM3    LDA    NUM1
  866.     RTS
  867.  
  868. NUM1    .BYTE    0
  869. NUM2    .BYTE    0
  870.  
  871. ;Checks whether ascii char in A is a numeric digit. Carry clear if so
  872. CHKNUM    CMP    #30H    ;'0'
  873.     BCC    CHKNUM1
  874.     CMP    #3AH    ;'9'+1
  875.     RTS        ;Return with carry clear/set
  876.  
  877. CHKNUM1    SEC
  878.     RTS
  879.  
  880. ;***********************************
  881. ;ROUTINE: OTHERENTRY
  882. ;PURP:    HANDLE OTHER COMMANDS
  883. ;ENTRY:    A = OTHER COMMAND
  884. ;    X = N0
  885. ;    Y = CN
  886. ;EXIT:    A = ERROR CODE
  887. ;USED:    ALL
  888. ;***********************************
  889.  
  890. OTHERENTRY:
  891.     CMP    #0
  892.     BEQ    OUTSTAT        ;BRANCH IF OUTPUT STATUS COMMAND
  893.     CMP    #1
  894.     BEQ    INSTAT        ;BRANCH IF INTPUT STATUS COMMAND
  895.     CMP    #2
  896.     BEQ    VIDEOON        ;BRANCH IF VIDEO ON COMMAND
  897.     CMP    #3
  898.     BEQ    APLEON        ;BRANCH IF APPLE ON COMMAND
  899.     CMP    #4
  900.     BEQ    WIDTH        ;BRANCH IF WIDTH COMMAND
  901.     CMP    #SNDNAMECMD
  902.     BEQ    SENDNAME    ;BRANCH IF SEND NAME COMMAND
  903.  
  904.     ;ERROR BAD COMMAND
  905.     LDA    #0FFH        ;ELSE ERROR
  906.     RTS
  907.  
  908.  
  909. OUTSTAT:
  910.     JMP    SOSTATUS    ;TEST IF THE DEVICE IS READY TO SEND ANOTHER CHARACTER
  911.  
  912. INSTAT:    .BYTE    4CH        ;JMP
  913. ISVEC    .WORD    SISTATUS    ;to be patched
  914.  
  915. ;Set INSTAT mode [A]
  916. SETISV    ASL    A
  917.     TAX
  918.     LDA    ISVTBL,X
  919.     STA    ISVEC
  920.     LDA    ISVTBL+1,X
  921.     STA    ISVEC+1
  922.     RTS
  923.  
  924. ISVTBL    .WORD    SISTATUS    ;#0 Test for input byte avail (normal)
  925.     .WORD    NOTRDY        ;#1 Always return no byte avail
  926.  
  927. NOTRDY    LDA    #0
  928.     CLC
  929.     RTS
  930.  
  931. VIDEOON:
  932.     JMP    INITENTRY    ;DO SOMETHING TO TURN ON YOUR VIDEO
  933.  
  934. APLEON:
  935.     ;DO SOMETHING TO TURN ON THE APPLE VIDEO ON
  936.     ; THIS IS PROBABLY NOTHING UNLESS THIS IS A CONSOLE DEVICE
  937.     RTS
  938.  
  939. WIDTH:
  940.     ;RETURN THE WIDTH OF THIS DEVICE
  941.     LDA    #80    ;80 COLUMNS ?
  942.     RTS
  943.  
  944.  
  945. SENDNAME:
  946.     ;SEND THE NAME COMMAND
  947.     LDA    NAME        ;GET LENGTH
  948.     STA    CNT        ;SAVE AS COUNT
  949.     JSR    WR1Z80BYTE    ;SEND IT TO HOST
  950.     LDA    #1
  951.     STA    IDX
  952.  
  953. $LP:    LDX    IDX
  954.     LDA    NAME,X        ;GET NEXT CHARACTER
  955.     JSR    WR1Z80BYTE
  956.     INC    IDX
  957.     DEC    CNT
  958.     BNE    $LP        ;CONTINUE UNTIL ALL BYTES ARE SENT
  959.     LDA    #0
  960.     RTS
  961.  
  962. ;***********************************
  963. ;ROUTINE: POLLENTRY
  964. ;PURP:    HANDLE POLLING, THIS ENTRY POINT
  965. ;    IS CALLED PERIODICALY WHILE THE APPLE IS
  966. ;    WAITING FOR A COMMAND FROM THE Z-80. THIS
  967. ;    CODE SHOULD BE VERY SHORT AS THE Z-80 IS
  968. ;    IGNORED WHILE THIS CODE IS BEING EXECUTED
  969. ;ENTRY:    NONE
  970. ;EXIT:    NONE
  971. ;USED:    ALL
  972. ;***********************************
  973.  
  974. POLLENTRY
  975.     .BYTE    4CH    ;JMP
  976. POLLVEC    .WORD    POLLSIO    ;To be patched
  977.  
  978. ;Set POLL vector. Entry: A=mode. Exit: AX used
  979. SETPVEC    ASL    A
  980.     TAX
  981.     LDA    PVECTBL,X
  982.     STA    POLLVEC
  983.     LDA    PVECTBL+1,X
  984.     STA    POLLVEC+1
  985.     RTS
  986.  
  987. PVECTBL    .WORD    POLLNRM    ;#0 Usual
  988.     .WORD    CHKDL1    ;#1 When queue is empty, change to #2
  989.     .WORD    CHKPAU    ;#2 Pause 3 secs (and ignore input)
  990.     .WORD    CHKDL2    ;#3 Check for carrier for 30 seconds
  991.  
  992. ;Usual poll routine
  993. POLLNRM    JSR    POLLSIO
  994.     LDA    TIMER    ;If timer > 0 then dec it
  995.     BNE    POLLNR1
  996.     RTS
  997.  
  998. POLLNR1    DEC    TIMER
  999.     RTS
  1000.  
  1001. ;When queue is empty, change to poll mode #2 and instat mode #1
  1002. CHKDL1    JSR    SISTATUS ;Wait till queue is empty
  1003.     BEQ    CHKDL1A
  1004.     RTS
  1005.  
  1006. CHKDL1A    LDA    #2    ;Change to mode #2
  1007.     JSR    SETPVEC
  1008.     LDA    #1    ;set instat mode #1 (ignore input)
  1009.     JSR    SETISV
  1010.     LDA    #3    ;3 sec pause
  1011.     STA    CHKTM2
  1012.     LDA    #TM1SEC
  1013.     STA    CHKTM1
  1014.     RTS
  1015.  
  1016. ;Pause for 3 seconds (mode #2) then change to poll mode #3
  1017. CHKPAU    DEC    CHKTM1
  1018.     BEQ    CHKPAU1
  1019.     RTS
  1020.  
  1021. CHKPAU1    LDA    #TM1SEC
  1022.     STA    CHKTM1
  1023.     DEC    CHKTM2
  1024.     BEQ    CHKPAU2
  1025.     RTS
  1026.  
  1027. CHKPAU2    LDA    #3    ;Change to poll mode 3
  1028.     JSR    SETPVEC
  1029.     LDA    #30    ;30 sec timeout
  1030.     STA    CHKTM2
  1031.     LDA    #TM1SEC    ;Reset 1 sec timeout
  1032.     STA    CHKTM1
  1033.     JSR    CLRQ    ;Clear queue
  1034.  
  1035. ;Check for carrier (#3). If detected, give response and reset to POLL mode #0
  1036. CHKDL2    JSR    DIALST
  1037.     BCS    CHKD7    ;--> modem response
  1038.     DEC    CHKTM1
  1039.     BEQ    CHKD4    ;--> 1 sec timeout
  1040. CHKD3    LDA    #0    ;No byte avail
  1041.     RTS
  1042.  
  1043. CHKD4    LDA    #TM1SEC    ;Reset 1 sec timeout
  1044.     STA    CHKTM1
  1045.     DEC    CHKTM2
  1046.     BEQ    CHKD6    ;--> 30 sec timeout
  1047.     LDA    CHKTM2    ;send CR every 8 secs
  1048.     AND    #07H
  1049.     BNE    CHKD3
  1050.     LDA    #0DH
  1051.     JSR    SEROUT
  1052.     JMP    CHKD3
  1053.  
  1054. ;Full timeout
  1055. CHKD6    LDA    #3    ;NO CARRIER response
  1056.     JMP    CHKD8
  1057.  
  1058. ;Modem response
  1059. CHKD7    NOP        ;CONNECT or NO CARRIER response
  1060.  
  1061. CHKD8    STA    RESPONS
  1062.     LDA    QFL    ;Q0=send modem responses
  1063.     BNE    CHKD9
  1064.     JSR    CLRQ
  1065.     JSR    ADDQRE    ;Add response to queue
  1066. CHKD9    LDA    #0    ;Reset poll mode
  1067.     JSR    SETPVEC
  1068.     LDA    #0    ;Reset instat mode
  1069.     JSR    SETISV
  1070.     JMP    SISTATUS
  1071.  
  1072. CHKTM1    .BYTE    TM1SEC    ;11.7 msec/unit counter
  1073. CHKTM2    .BYTE    0    ;1 sec/unit counter
  1074. TIMER    .BYTE    TM1SEC
  1075.  
  1076. ;AT REGS/FLAGS
  1077. EFL    .BYTE    0    ;1=echo
  1078. QFL    .BYTE    0    ;0=send responses
  1079. VFL    .BYTE    0    ;1=send single digit responses
  1080. XFL    .BYTE    0    ;1=extended response set
  1081. S0    .BYTE    0
  1082. S1    .BYTE    0
  1083. S2    .BYTE    0
  1084. S3    .BYTE    0
  1085. S4    .BYTE    0
  1086. S5    .BYTE    0
  1087. S6    .BYTE    0
  1088. S7    .BYTE    0
  1089. S8    .BYTE    0
  1090. S9    .BYTE    0
  1091. S10    .BYTE    0
  1092. S11    .BYTE    0
  1093. S12    .BYTE    0
  1094. S13    .BYTE    0
  1095. S14    .BYTE    0
  1096. S15    .BYTE    0
  1097. S16    .BYTE    0
  1098. S17    .BYTE    0
  1099. S18    .BYTE    0
  1100.  
  1101. ;VARIABLES
  1102. RESPONS    .BYTE    0
  1103. RIND    .BYTE    0
  1104. LNLEN    .BYTE    0
  1105. LNIND    .BYTE    0
  1106. LINE    .BLOCK    40
  1107. PLUSCH1    .BYTE    2CH    ;Holds +++
  1108. PLUSCH2    .BYTE    2CH
  1109. PLUSCH3    .BYTE    2CH
  1110.  
  1111. ;TEMPORARY DATA
  1112. IDX:    .BLOCK    1    ;TEMPORARY
  1113. CNT:    .BLOCK    1    ;TEMPORARY
  1114. MESIND:    .BLOCK    1
  1115.  
  1116. BOTTOM:    
  1117.     .END
  1118. PLUSCH