home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / c / tr2ker.asm < prev    next >
Assembly Source File  |  2020-01-01  |  72KB  |  1,880 lines

  1. <<< trsdata.mac >>>
  2.         subttl  data segment
  3.         dseg
  4.         ;
  5.         ;       state symbols
  6.         ;
  7.         _a      equ     1       ;abort
  8.         _c      equ     2       ;complete
  9.         _r      equ     3       ;receive init
  10.         _rf     equ     4       ;receive file header
  11.         _rd     equ     5       ;receive data
  12.         _s      equ     6       ;send init
  13.         _sf     equ     7       ;send file header
  14.         _sd     equ     8       ;send data
  15.         _se     equ     9       ;send end-of-file
  16.         _sb     equ     10      ;send break transmission
  17.         _o      equ     11      ;open file (pre send init)
  18.         _end    equ     255
  19. ;
  20.         public  fcb,filbuf,recptr,recbuf,paraml,lrecl
  21.         public  create,byte,word,screen,rftab,rdtab
  22.         public  slen,spaket,rlen,rpaket,sinit
  23.         public  rinit,port,baud,wdlen,baudtb,lab,parsetb
  24.         public  parity,stop,oldstk,scrtch,cmdlin,high
  25.         public  state,n,r,init,ssvc,rsvc,csvc,altsvc
  26.         public  nsvc,stack,stjump,rtype
  27.         extrn   abort,exit,r_init,r_file,r_data
  28.         extrn   rf_f,rf_b,rf_x,rd_d,rd_z
  29.         extrn   s_open,s_file,s_data,s_eof,s_break,s_init
  30.         public  filnam,crp,cbp,work
  31.         extrn   eof,sets,setr,setb,setf,setp,setc,setw,seter
  32.         extrn   setl
  33.         ;
  34.         ;       fcb and others file related matters
  35.         ;
  36.         filnam: ds      30      ;will hold filename for send
  37.         fcb:    ds      60      ;file control block
  38.         filbuf: ds      512     ;file buffer
  39.         crp:
  40.         recptr: db      0       ;
  41.         recbuf: ds      256     ;record buffer
  42.         paraml: dw      filbuf  ;parameter list for file svc's
  43.                 dw      recbuf
  44.                 dw      eof     ;send end of file routine
  45.                 db      'W'     ;read/write
  46.         lrecl:  db      1       ;default is 1
  47.                 db      'F'     ;always fixed record length
  48.         create: db      2       ;default is create
  49.                 db      0       ;user attrib = 0
  50.         ;
  51.         ;       packet buffers
  52.         ;
  53.         cbp:
  54.         slen:   db      0       ;send buffer length (all included)
  55.         spaket: ds      100     ;send packet
  56.         rlen:   db      0       ;receive buffer length
  57.         rpaket: dw      0       ;receive packet store
  58.         rtype:  ds      100     ;here is where we store type
  59.         ;
  60.         ;       the send init exchange
  61.         ;
  62.         sinit:  db      13      ;will contain the send init received
  63.                 db      13,13,13,13,13,13,13,13,13,13,13
  64.         maxlen  equ     94      ;maximum packet length
  65.         tout    equ     10      ;time out
  66.         quote   equ     '#'
  67.         cr      equ     13      ;carriage return (eol)
  68.         rinit:                  ;the send-init we will send
  69.                 db      maxlen+32
  70.                 db      tout+32
  71.                 db      0+32
  72.                 db      64
  73.                 db      cr+32   ;eol
  74.                 db      quote
  75.                 db      'N'
  76.                 db      '1'
  77.                 db      ' '
  78.                 db      32
  79.         ;       telecomm buffers
  80.         ;
  81.         port:   db      'A'             ;default is A
  82.         baud:   db      8               ;baud rate (9600)
  83.         wdlen:  db      8               ;8 bits' byte
  84.         parity: db      'N'             ;none
  85.         stop:   db      1
  86.                 db      0               ;end
  87.         ;
  88.         ;       misc
  89.         ;
  90.         oldstk: dw      0               ;save stack here on entry
  91.         scrtch: dw      0               ;last+1 byte of pgm on entry
  92.         cmdlin: dw      0               ;address of command line
  93.         byte:   db      0               ;scratch byte
  94.         word:   dw      0               ;scratch word
  95.         work:                           ;work space for parser
  96.                 db      '0','0','0','0','0'
  97.         screen: db      0               ;flag for typing on screen
  98.         ;
  99.         high:   dw      0               ;high memory
  100.         state:  db      3               ;current state of automaton
  101.         n:      db      0               ;current packet number
  102.         r:      db      0               ;current retry count
  103.         init:   db      0               ;do comm init on entry if != 0
  104.         ;
  105.         ;       svc for comm operations
  106.         ;
  107.         ssvc:   db      97              ;send on channel A
  108.         rsvc:   db      96              ;receive on channel A
  109.         csvc:   db      100             ;control on channel A
  110.         altsvc: db      0,99,98,101     ;same for channel B
  111.         nsvc:   db      4               ;number of bytes to move
  112.         ;
  113.         ;       stack
  114.         ;
  115.                 ds      400             ;lots of space
  116.         stack:
  117.         stjump: db      _a              ;main jump table
  118.                 dw      abort
  119.                 db      _c
  120.                 dw      exit
  121.                 db      _r
  122.                 dw      r_init
  123.                 db      _rf
  124.                 dw      r_file
  125.                 db      _rd
  126.                 dw      r_data
  127.                 db      _o
  128.                 dw      s_open
  129.                 db      _s
  130.                 dw      s_init
  131.                 db      _sf
  132.                 dw      s_file
  133.                 db      _sd
  134.                 dw      s_data
  135.                 db      _se
  136.                 dw      s_eof
  137.                 db      _sb
  138.                 dw      s_break
  139.                 db      _end            ;end of table
  140.  
  141.         rftab:  db      _a
  142.                 dw      abort
  143.                 db      'F'
  144.                 dw      rf_f
  145.                 db      'B'
  146.                 dw      rf_b
  147.                 db      'X'
  148.                 dw      rf_x
  149.                 db      _end
  150.  
  151.         rdtab:  db      _a
  152.                 dw      abort
  153.                 db      'D'
  154.                 dw      rd_d
  155.                 db      'Z'
  156.                 dw      rd_z
  157.                 db      _end
  158.         ;
  159.         baudtb:
  160.                 db      '110 ',1
  161.                 db      '150 ',2
  162.                 db      '300 ',3
  163.                 db      '600 ',4
  164.                 db      '1200',5
  165.                 db      '2400',6
  166.                 db      '4800',7
  167.                 db      '9600',8
  168.                 db      13                      ;end of table
  169.         lab:
  170.                 dw      l1,l2,0
  171.         l1:
  172.                 db      3,'{}',13
  173.         l2:
  174.                 db      1,'/'
  175.         parsetb:
  176.                 db      0
  177.                 dw      seter
  178.                 db      'W'
  179.                 dw      setw
  180.                 db      'S'
  181.                 dw      sets
  182.                 db      'R'
  183.                 dw      setr
  184.                 db      'F'
  185.                 dw      setf
  186.                 db      'P'
  187.                 dw      setp
  188.                 db      'B'
  189.                 dw      setb
  190.                 db      'C'
  191.                 dw      setc
  192.                 db      'L'
  193.                 dw      setl
  194.                 db      _end
  195.                 end
  196. <<< trsmain.mac >>>
  197.         subttl  kmain/mac main parser and initialization routin
  198.         cseg
  199.         extrn   oldstk,scrtch,high,cmdlin,stack,stjump,lab
  200.         extrn   rftab,rdtab,rtype,abort,parity,port,fcb,baud
  201.         extrn   wdlen,baudtb,parsetb,byte,initcm,init,state
  202.         public  mjump,rdjump,rfjump,sets,setr,setf,setb,setp,setc
  203.         public  setw,seter,setl
  204.         extrn   lrecl,filnam,paraml,work
  205.         ;
  206.         ;       macros
  207.         ;
  208.         ;       prmes   to display a message stored by mssg
  209.         ;       call    prmes   lab
  210.         ;
  211.         prmes   macro   lab
  212.         .xlist
  213.         extrn   m_&lab,l_&lab
  214.         push    hl
  215.         push    bc
  216.         ld      hl,m_&lab
  217.         ld      bc,(l_&lab)
  218.         ld      c,13
  219.         ld      a,9
  220.         rst     8
  221.         pop     bc
  222.         pop     hl
  223.         .list
  224.         endm
  225.         ;
  226.         ;       jumptb  jump according to a jump table
  227.         ;       call    jumptb  table,code
  228.         ;       where   table is the address of the table
  229.         ;               and code is a one-byte code
  230.         ;
  231.         jumptb  macro   table,code
  232.         .xlist
  233.         local   $1
  234.         ld      hl,table
  235.         ld      bc,(code)
  236.         ld      b,c
  237.         ld      a,28            ;lookup call
  238.         rst     8               ;dos
  239.         jr      z,$1            ;no error
  240.         ld      hl,table+1      ;get abort address (first entry)
  241.         $1:
  242.         jp      (hl)
  243.         .list
  244.         endm
  245.         ;
  246.         ;       main entry save usefull registers
  247.         ;
  248.         start:
  249.                 ld      (oldstk),sp     ;save stack
  250.                 ld      (scrtch),bc     ;first byte after pgm
  251.                 ld      (high),de       ;high memory
  252.                 ld      (cmdlin),hl     ;command line
  253.                 ld      sp,stack        ;new stack
  254.         ;
  255.         ;       main parsing routine
  256.         ;               will respond to the following syntax :
  257.         ;               KERMIT {S,F=file,B=baud,P=par,W=word,C=channel}
  258.         ;                       update {L=lrecl} 85.09.19
  259.         ;
  260.         iparse:
  261.                 ld      e,0             ;init for first call nxtfld
  262.                 ld      hl,(cmdlin)     ;get command line
  263.                 ld      c,(hl)          ;maximum length to parse
  264.                 inc     hl              ;points to first byte
  265.         i0:
  266.                 ld      a,(hl)          ;get first byte
  267.                 cp      ' '             ;white space ?
  268.                 jr      z,i1            ;yes, now find {
  269.                 dec     c               ;decrement length to parse
  270.                 inc     hl              ;update pointer
  271.                 ld      a,c             ;length in a
  272.                 cp      0               ;is it null ?
  273.                 jr      nz,i0           ;no, go on
  274.                 jp      go              ;yes, no parse to be done
  275.         i1:
  276.                 dec     c               ;decrement length to parse
  277.                 inc     hl              ;update pointer
  278.                 ld      a,c             ;get length in a
  279.                 cp      0               ;is it null ?
  280.                 jp      z,go            ;nothing to parse
  281.                 ld      a,(hl)          ;get byte in a
  282.                 cp      ' '             ;is it another null ?
  283.                 jp      z,i1            ;yes, get one more
  284.                 cp      '{'             ;is it valid start ?
  285.                 jp      nz,seter        ;no good
  286.                 dec     c               ;decrement length
  287.                 inc     hl              ;update pointer
  288.                 ld      a,c             ;get length in a
  289.                 cp      0               ;is it null ?
  290.                 jp      z,seter         ;no good
  291.         parse:
  292.                 call    nxtfld          ;get next field
  293.                 jp      nz,go           ;go !
  294.                 ld      a,b             ;length of field
  295.                 cp      0               ;is it null ?
  296.                 jp      z,seter         ;disaster ...
  297.                 call    handler         ;work with this parameter
  298.                 ld      a,c             ;length left to parse
  299.                 or      a               ;is it null ?
  300.                 jp      nz,parse        ;no, do it again
  301.                 ld      a,0FFH          ;terminator ?
  302.                 cp      d               ;in register D
  303.                 jp      z,seter         ;yes and parse is incomplete
  304.                 jp      go              ;go !
  305.         handler:
  306.                 ld      a,(hl)          ;get first caracter of field
  307.                 ld      (byte),a        ;in byte
  308.                 push    hl              ;save
  309.                 push    bc
  310.                 jumptb  parsetb,byte    ;jump accordingly
  311.         sets:
  312.                 pop     bc
  313.                 pop     hl
  314.                 ld      a,11            ;open pseudo-state
  315.                 ld      (state),a       ;set send state
  316.                 ld      a,'R'           ;read only
  317.                 ld      (paraml+6),a    ;put fcb in read state
  318.                 ld      a,0             ;do not create
  319.                 ld      (paraml+9),a    ;and do not create
  320.                 ret
  321.         setr:
  322.                 pop     bc
  323.                 pop     hl
  324.                 ld      a,3
  325.                 ld      (state),a       ;set receive state
  326.                 ret
  327.         setf:
  328.                 pop     bc
  329.                 pop     hl
  330.                 call    nxtfld          ;get next field
  331.                 push    hl              ;save
  332.                 push    de
  333.                 push    bc
  334.                 push    hl              ;i will need it twice
  335.                 ld      a,b             ;get length in a
  336.                 cp      0               ;is it null ?
  337.                 jp      z,f0            ;yes error
  338.                 cp      30              ;greater than 30
  339.                 jp      nc,f0           ;yes, error
  340.                 ld      de,fcb          ;where filaname should be
  341.                 ld      c,b             ;with length in BC
  342.                 ld      b,0
  343.                 ldir                    ;move from hl to de
  344.                 ex      de,hl           ;end of filnam in hl
  345.                 ld      (hl),13         ;put in a CR
  346.                 ld      (filnam),a      ;get filename length in place
  347.                 ld      de,filnam       ;to filenam
  348.                 inc     de              ;plus one (first byte is len)
  349.                 pop     hl              ;from here
  350.                 ld      c,a             ;length in bc
  351.                 ld      b,0
  352.                 ldir                    ;move from param list to filnam
  353.                 ex      de,hl           ;hl points to end
  354.                 ld      (hl),13         ;put in a CR
  355.                 pop     bc              ;restore
  356.                 pop     de
  357.                 pop     hl
  358.                 ret
  359.         f0:
  360.                 prmes   e4              ;not valid filename
  361.                 jp      abort           ;end in disaster
  362.         setp:
  363.                 pop     bc
  364.                 pop     hl
  365.                 call    nxtfld          ;get next field
  366.                 ld      a,(hl)          ;get first byte in a
  367.                 cp      'O'             ;is it odd
  368.                 jr      nz,p0           ;no ...
  369.                 ld      (parity),a      ;set in comm buffer
  370.                 ld      (init),a        ;init flag
  371.                 ret
  372.         p0:
  373.                 cp      'E'             ;is it even ?
  374.                 jr      nz,p1           ;no ...
  375.                 ld      (parity),a      ;set in comm buffer
  376.                 ld      (init),a        ;init flag
  377.                 ret
  378.         p1:
  379.                 cp      'N'             ;is it none ?
  380.                 jr      nz,p2           ;no, error
  381.                 ld      (parity),a      ;set in comm buffer
  382.                 ld      (init),a        ;init flag
  383.                 ret
  384.         p2:
  385.                 prmes   e5              ;invalid parity
  386.                 jp      abort           ;end in disaster
  387.         setb:
  388.                 pop     bc
  389.                 pop     hl
  390.                 call    nxtfld          ;get next field
  391.                 push    hl              ;save
  392.                 push    de
  393.                 push    bc
  394.                 ex      de,hl           ;de=compare string
  395.                 ld      hl,baudtb       ;baud rate table
  396.                 ld      a,49            ;svc scan
  397.                 rst     8               ;dos
  398.                 jr      nz,b0           ;not found
  399.                 inc     hl              ;increment to code
  400.                 inc     hl
  401.                 inc     hl
  402.                 inc     hl
  403.                 ld      a,(hl)          ;get code in a
  404.                 ld      (baud),a        ;in comm buffer
  405.                 ld      (init),a        ;init flag
  406.                 pop     bc              ;restore
  407.                 pop     de
  408.                 pop     hl
  409.                 ret
  410.         b0:
  411.                 prmes   e6              ;unsupported baud rate
  412.                 jp      abort           ;in disaster
  413.         setw:
  414.                 pop     bc
  415.                 pop     hl
  416.                 call    nxtfld          ;get next field
  417.                 ld      a,(hl)          ;first byte in a
  418.                 cp      '7'             ;is it 7
  419.                 jr      nz,w0           ;no, try 8
  420.                 sub     '0'             ;convert to binary
  421.                 ld      (wdlen),a       ;in comm buffer
  422.                 ld      (init),a        ;set init flag
  423.                 ret
  424.         w0:
  425.                 cp      '8'             ;is it 8
  426.                 jr      nz,w1           ;no, error
  427.                 ld      (wdlen),a       ;in comm buffer
  428.                 ld      (init),a        ;init flag
  429.                 ret
  430.         w1:
  431.                 prmes   e7              ;bad word length
  432.                 jp      abort           ;disaster
  433.         setc:
  434.                 pop     bc
  435.                 pop     hl
  436.                 call    nxtfld          ;get next field
  437.                 ld      a,(hl)          ;first byte in a
  438.                 cp      'A'             ;is it cnannel A ?
  439.                 jr      nz,c0           ;no, try B
  440.                 ld      (port),a        ;in comm buffer
  441.                 ld      (init),a        ;init flag
  442.                 ret
  443.         c0:
  444.                 cp      'B'             ;is it B
  445.                 jr      nz,c1           ;no, error
  446.                 ld      (port),a        ;in comm buffer
  447.                 ld      (init),a        ;init flag
  448.                 ret
  449.         c1:
  450.                 prmes   e8              ;invalid channel
  451.                 jp      abort           ;disaster
  452.         seter:
  453.                 pop     bc
  454.                 pop     hl
  455.                 prmes   e9              ;invalid parameter
  456.                 prmes   u0              ;usage is...
  457.                 jp      abort           ;disaster
  458.         setl:
  459.                 pop     bc              ;restore
  460.                 pop     hl
  461.                 call    nxtfld          ;get record length
  462.                 push    hl              ;save
  463.                 push    bc
  464.                 push    de
  465.                 ld      de,work         ;to store value and padd
  466.                 ld      a,b             ;get length
  467.                 cp      6               ;maximum lebgth + 1
  468.                 jp      nc,seter        ;no good ... bye
  469.         l0:
  470.                 cp      5               ;maximum length
  471.                 jr      z,l1            ;finished moving
  472.                 inc     a               ;increase length
  473.                 inc     de              ;and pointer
  474.                 jr      l0
  475.         l1:
  476.                 ld      c,b             ;get length in bc
  477.                 ld      b,0
  478.                 ldir                    ;move to work+(5-bc)
  479.                 ld      hl,work         ;get hl to point correctly
  480.                 ld      b,1             ;code to convert to bin
  481.                 ld      a,21            ;BINDEC svc
  482.                 rst     8               ;dos
  483.                 ld      a,e             ;get binary value
  484.                 ld      (lrecl),a       ;save in fcb
  485.                 pop     de              ;restore
  486.                 pop     bc
  487.                 pop     hl
  488.                 ret
  489.         nxtfld:
  490.                 ld      d,0             ;initialize de to e
  491.                 add     hl,de           ;add to hl - where to start
  492.                 ld      de,lab          ;list address block
  493.                 ld      a,46            ;parse svc
  494.                 rst     8               ;dos
  495.                 ret
  496.         go:
  497.                 call    initcm          ;initialize comm channel
  498.                 prmes   00              ;now say hello
  499.         ;       here is the main jump, every routine ends here
  500.         ;
  501.         mjump:
  502.                 jumptb  stjump,state
  503.          ;
  504.         ;
  505.         ;
  506.         ;       and this is the main receive file jump
  507.         ;
  508.         rfjump:
  509.                 jumptb  rftab,rtype
  510.         ;
  511.         ;       and the main receive data jump
  512.         ;
  513.         rdjump:
  514.                 jumptb  rdtab,rtype
  515.         ;
  516.                 end     start
  517. <<< trsmssg.mac >>>
  518.         subttl  messages (because the assembler is too dumb)
  519.         dseg
  520.         ;
  521.         ;
  522.         ;mssg   to reserve space for a message and it's length
  523.         ;       syntax  mssg    lab,<message>
  524.         ;       where lab is a maximum of four bytes
  525.         ;
  526.         mssg    macro   lab,mess
  527.         .xlist          ;do not list expansion
  528.         public  m_&lab,l_&lab
  529.         m_&lab:
  530.         db      '&mess'
  531.         l_&lab: db      0
  532.                 db      $-m_&lab
  533.         .list
  534.         endm
  535.         ;
  536.         ;       the message that should appear
  537.         ;
  538.         mssg    00,<Kermit (trsdos II, version 1.2)>
  539.         mssg    a0,<aborting due to fatal error>
  540.         mssg    u0,<KERMIT {(S,R),F=filename,B=baud,P=par,L=lrecl,C=channel}>
  541.         mssg    e0,<Kermit exit>
  542.         mssg    db0,<jumping from mjump>
  543.         mssg    db1,<jumping from rfjump>
  544.         mssg    db2,<jumping from rdjump>
  545.         mssg    db3,<entering receive-init>
  546.         mssg    db4,<entering receive-file>
  547.         mssg    db5,<entering receive-data>
  548.         mssg    db6,<entering rpack>
  549.         mssg    db7,<entering spack>
  550.         mssg    db8,<exiting timer call>
  551.         mssg    db9,<entering rp1>
  552.         mssg    db10,<entering rp2>
  553.         mssg    db11,<entering rp3>
  554.         mssg    db12,<entering rp4>
  555.         mssg    db13,<entering rp5>
  556.         mssg    db14,<entering rp6>
  557.         mssg    e3,<invalid word length>
  558.         mssg    e4,<invalid filename>
  559.         mssg    e5,<invalid parity>
  560.         mssg    e6,<unsupported baud rate>
  561.         mssg    e7,<invalid word length>
  562.         mssg    e8,<invalid channel>
  563.         mssg    e9,<invalid parameter>
  564.         end
  565. <<< trsrecv.mac >>>
  566.         title   krecv/mac reception unit
  567.         cseg
  568.         ;
  569.         ;
  570.         extrn   recptr,recbuf,rplus,mjump,rfjump,rdjump
  571.         extrn   spaket,rpaket,screen
  572.         extrn   rplus,sinit,state,byte,n,r
  573.         extrn   rpack,spack,abort,acsum,flush
  574.         extrn   fcb,writnx,open,rinit,close
  575.         extrn   lrecl
  576.         public  r_init,r_file,rf_b,rf_x,rf_f
  577.         public  r_data,rd_z,rd_d
  578.         ;
  579.         len     equ     0
  580.         seq     equ     1
  581.         type    equ     2
  582.         data    equ     3
  583.         quote   equ     '#'
  584.         _a      equ     1
  585.         _c      equ     2
  586.         _r      equ     3
  587.         _rf     equ     4
  588.         _rd     equ     5
  589.         ;
  590.         ;
  591.         subttl  macros used in this module
  592.         ;
  593.         ;prmes  to display messages
  594.         ;
  595.         prmes   macro   lab
  596.         .xlist
  597.         extrn   m_&lab,l_&lab
  598.         push    hl
  599.         push    bc
  600.         ld      hl,m_&lab
  601.         ld      bc,(l_&lab)
  602.         ld      c,13
  603.         ld      a,9
  604.         rst     8
  605.         pop     bc
  606.         pop     hl
  607.         .list
  608.         endm
  609.         ;movb
  610.         ;
  611.         movb    macro   value,loc
  612.         .xlist
  613.         push    af
  614.         ld      a,value
  615.         ld      (loc),a
  616.         pop     af
  617.         .list
  618.         endm
  619.         ;
  620.         ;blmov
  621.         ;
  622.         blmov   macro   source,dest,len
  623.         .xlist
  624.         local   $1,$2
  625.         push    hl
  626.         push    bc
  627.         push    de
  628.         ld      hl,source
  629.         ld      de,dest
  630.         ld      a,(len)
  631.         cp      0
  632.         jr      nz,$1
  633.         ld      b,1
  634.         ld      c,0
  635.         jp      $2
  636.         $1:
  637.         ld      b,0
  638.         ld      c,a
  639.         $2:
  640.         ldir
  641.         pop     de
  642.         pop     bc
  643.         pop     hl
  644.         .list
  645.         endm
  646.         ;
  647.         ;fack   to format an ack paket
  648.         ;
  649.         f_ack   macro
  650.         .xlist
  651.         ld      (iy+len),3
  652.         ld      a,(n)
  653.         add     a,' '
  654.         ld      (iy+seq),a
  655.         ld      (iy+type),'Y'
  656.         ld      hl,spaket
  657.         call    acsum
  658.         .list
  659.         endm
  660.         ;
  661.         ;nplus
  662.         ;
  663.         nplus   macro
  664.         .xlist
  665.         ld      hl,n
  666.         inc     (hl)
  667.         res     6,(hl)          ;not over 63
  668.         .list
  669.         endm
  670.         ;
  671.         subttl  receive initialize
  672.          ;
  673.         ;       receive init
  674.         ;
  675.         r_init:
  676.                 movb    0,n             ;set packet count to 0
  677.                 movb    0,r             ;and retry count to 0
  678.                 ld      ix,rpaket       ;ix will always point there
  679.                 call    flush           ;flush comm port
  680.                 call    rpack           ;and get a packet
  681.                 jp      c,rplus         ;no good, nack, r+
  682.                 ld      a,(ix+type)     ;get packet type
  683.                 cp      'S'             ;is it a send ?
  684.                 jp      nz,abort        ;nope, no good
  685.                 movb    10,byte         ;will move 10 bytes
  686.                 blmov   rpaket+data,sinit,byte
  687.                                         ;to send init buffer
  688.                 ld      hl,sinit+4      ;address of eol
  689.                 res     5,(hl)          ;sub 32 to get real eol
  690.                                         ;and prepare to ack
  691.                                         ;with our parameters
  692.                 ld      iy,spaket       ;iy will always point there
  693.                 ld      (iy+len),12     ;length
  694.                 ld      (iy+type),'Y'   ;ack
  695.                 ld      a,(n)           ;current packet number
  696.                 add     a,32            ;make printable
  697.                 ld      (iy+seq),a      ;save in ack packet
  698.                 blmov   rinit,spaket+data,byte
  699.                                         ;all the info
  700.                 ld      hl,spaket       ;hl points to send packet
  701.                 call    acsum           ;add checksum
  702.                 call    spack           ;and pray it gets there
  703.                 nplus                   ;increment n
  704.                 movb    0,r             ;set retry count to 0
  705.                 movb    _rf,state       ;to receive file
  706.                 jp      mjump           ;back
  707.         subttl  receive file
  708.         page
  709.         ;
  710.         ;       receive file
  711.         ;
  712.         r_file:
  713.                 call    rpack           ;get a packet
  714.                 jp      c,rplus         ;no good
  715.                 ld      a,(n)           ;packet number expected
  716.                 add     a,' '           ;make printable
  717.                 cp      (ix+seq)        ;equal to received packet
  718.                 jp      z,rfgood        ;yes
  719.                 call    spack           ;re-ack, it was lost
  720.                 jp      rplus           ;increment r, nak
  721.         rfgood:
  722.                 jp      rfjump
  723.                                         ;jump according to table
  724.         rf_b:
  725.                 ;case(break)
  726.                 f_ack                   ;format ack
  727.                 call    spack           ;and send it
  728.                 nplus
  729.                 movb    _c,state        ;set state to complete
  730.                 jp      mjump           ;and back
  731.          rf_x:
  732.                 ;case(type on screen)
  733.                 movb    1,screen        ;set flag on
  734.                 movb    _rd,state       ;set state to receive data
  735.                 f_ack                   ;format ack
  736.                 call    spack           ;and send it
  737.                 nplus                   ;increment packet count
  738.                 jp      mjump           ;and back
  739.          rf_f:
  740.                 ;case(file header)
  741.                 ld      a,(ix+len)      ;get lenght
  742.                 sub     ' '+3           ;minus seq,type, chksum
  743.                 ld      (ix+len),a      ;store back
  744.                 blmov   rpaket+data,fcb,rpaket
  745.                                         ;move filename to fcb
  746.                 ld      hl,fcb          ;start of filename
  747.                 ld      c,a             ;length
  748.                 ld      b,0             ;bc = length
  749.                 ld      a,'.'           ;to scan for dot
  750.                 cpir                    ;found dot
  751.                 dec     hl              ;adjust pointer
  752.                 ld      (hl),'/'        ;replace by '/'
  753.                 ld      a,0             ;clr a
  754.                 cp      c               ;c = 0 ?
  755.                 jp      z,r_f0          ;yes, put in cr
  756.                 ld      hl,fcb          ;first byte of filename
  757.                 ld      a,(rpaket)      ;length of filename
  758.                 add     a,l             ;add low byte to length
  759.                 ld      l,a             ;store back low byte
  760.                 ld      a,0             ;clear a
  761.                 adc     a,h             ;add high byte to carry
  762.                 ld      h,a             ;put back in h
  763.         r_f0:   ld      (hl),13         ;put in a carriage return
  764.                 call    open            ;and open file
  765.                 f_ack                   ;format an ack
  766.                 call    spack           ;and send it
  767.                 nplus                   ;increment packet count
  768.                 movb    _rd,state       ;set state to receive data
  769.                 jp      mjump           ;and back
  770.          subttl  receive data
  771.         page
  772.         ;
  773.         ;       receive data
  774.         ;
  775.         r_data:
  776.                 call    rpack           ;get a packet
  777.                 jp      c,rplus         ;no good
  778.                 ld      a,(n)           ;get expected packet count
  779.                 add     a,' '           ;make printable
  780.                 cp      (ix+seq)        ;equal to received ?
  781.                 jp      z,rdgood        ;yes, all ok
  782.                 call    spack           ;re-ack, it was lost
  783.                 jp      rplus           ;update retry count
  784.          rdgood:
  785.                 jp      rdjump
  786.          rd_z:
  787.                 ;case(end of file)
  788.                 call    writnx          ;flush buffer
  789.                 call    close           ;close file
  790.                 f_ack                   ;format an ack
  791.                 call    spack           ;and send it
  792.                 nplus                   ;increment packet count
  793.                 movb    _rf,state       ;set state to receive file
  794.                 jp      mjump           ;and back
  795.          rd_d:
  796.                 ;case(data)
  797.                 ld      hl,rpaket+data  ;start of data
  798.                 ld      a,(rpaket)      ;total length
  799.                 sub     ' '+3           ;convert to numeric
  800.                 cp      0               ;is it null ?
  801.                 jp      z,rd_d2         ;yes, finish
  802.                 ld      bc,(recptr)     ;pointer inside recbuf
  803.                 ld      b,0             ;turn off high byte
  804.                 push    hl              ;save temporarily
  805.                 ld      hl,recbuf       ;record address
  806.                 add     hl,bc           ;plus length
  807.                 ex      de,hl           ;pointer in de
  808.                 pop     hl              ;restore hl
  809.                 ;at this point :
  810.                 ;       hl = rpaket
  811.                 ;       de = inside recbuf
  812.                 ;       a = length of packet
  813.         rd_d1:
  814.                 push    af              ;save temporarily
  815.                 ld      a,(hl)          ;get current byte
  816.                 cp      quote           ;is it a quote ?
  817.                 jr      nz,rd_d3        ;no, go on
  818.                 inc     hl              ;point to next byte
  819.                 pop     af              ;restore a
  820.                 dec     a               ;decrement counter
  821.                 push    af              ;and save again
  822.                 ld      a,(hl)          ;get next byte
  823.                 cp      quote           ;is it a quote ?
  824.                 jr      z,rd_d3         ;yes, don't touch
  825.                 cp      quote or 128    ;quote and eight bit
  826.                 jr      z,rd_d3         ;yes don't touch either
  827.                 xor     64              ;uncontrollify
  828.                 ld      (hl),a          ;store back
  829.         rd_d3:  pop     af              ;restore
  830.                 ldi                     ;from rapket to recbuf
  831.                 dec     a               ;paket length minus one
  832.                 ld      bc,(recptr)     ;pointer inside recbuf
  833.                 inc     c               ;is incremented
  834.                 movb    c,recptr        ;and stored back
  835.                 push    af              ;save a
  836.                 ld      a,(lrecl)       ;get logical record length
  837.                 cp      c               ;compare to len(recbuf)
  838.                 jp      nz,rd_d0        ;no, do not update yet
  839.                 call    writnx          ;write next record
  840.                 movb    0,recptr        ;set pointer back to zero
  841.                 ld      de,recbuf       ;reset pointer to record buffer
  842.         rd_d0:
  843.                 pop     af              ;restore a
  844.                 cp      0               ;is packet empty ?
  845.                 jp      nz,rd_d1        ;no, get one more byte
  846.         rd_d2:
  847.                 f_ack                   ;format an ack
  848.                 call    spack           ;and send it
  849.                 nplus                   ;update packet counter
  850.                 jp      mjump           ;and back
  851.                 end
  852. <<< trssend.mac >>>
  853.         title   ksend/mac   sending unit
  854.         cseg
  855.         ;
  856.         ;
  857.         extrn   recptr,recbuf,rplus,mjump
  858.         extrn   spaket,rpaket,screen
  859.         extrn   rplus,sinit,state,byte,n,r
  860.         extrn   rpack,spack,abort,acsum,flush
  861.         extrn   fcb,writnx,open,rinit,close
  862.         extrn   lrecl,readnx,buffil,filnam,tstack
  863.         public  s_init,s_file,s_open,s_break
  864.         public  s_data,s_eof
  865.         ;
  866.         len     equ     0
  867.         seq     equ     1
  868.         type    equ     2
  869.         data    equ     3
  870.         quote   equ     '#'
  871.         _a      equ     1
  872.         _c      equ     2
  873.         _r      equ     3
  874.         _rf     equ     4
  875.         _rd     equ     5
  876.         _s      equ     6
  877.         _sf     equ     7
  878.         _sd     equ     8
  879.         _se     equ     9
  880.         _sb     equ     10
  881.         _o      equ     11
  882.         ;
  883.         ;
  884.         subttl  macros used in this module
  885.         ;
  886.         ;prmes  to display messages
  887.         ;
  888.         prmes   macro   lab
  889.         .xlist
  890.         extrn   m_&lab,l_&lab
  891.         push    hl
  892.         push    bc
  893.         ld      hl,m_&lab
  894.         ld      bc,(l_&lab)
  895.         ld      c,13
  896.         ld      a,9
  897.         rst     8
  898.         pop     bc
  899.         pop     hl
  900.         .list
  901.         endm
  902.         ;movb
  903.         ;
  904.         movb    macro   value,loc
  905.         .xlist
  906.         push    af
  907.         ld      a,value
  908.         ld      (loc),a
  909.         pop     af
  910.         .list
  911.         endm
  912.         ;
  913.         ;blmov
  914.         ;
  915.         blmov   macro   source,dest,len
  916.         .xlist
  917.         local   $1,$2
  918.         push    hl
  919.         push    bc
  920.         push    de
  921.         ld      hl,source
  922.         ld      de,dest
  923.         ld      a,(len)
  924.         cp      0
  925.         jr      nz,$1
  926.         ld      b,1
  927.         ld      c,0
  928.         jp      $2
  929.         $1:
  930.         ld      b,0
  931.         ld      c,a
  932.         $2:
  933.         ldir
  934.         pop     de
  935.         pop     bc
  936.         pop     hl
  937.         .list
  938.         endm
  939.         ;
  940.         ;fack   to format an ack paket
  941.         ;
  942.         f_ack   macro
  943.         .xlist
  944.         ld      (iy+len),3
  945.         ld      a,(n)
  946.         add     a,' '
  947.         ld      (iy+seq),a
  948.         ld      (iy+type),'Y'
  949.         ld      hl,spaket
  950.         call    acsum
  951.         .list
  952.         endm
  953.         ;
  954.         ;nplus
  955.         ;
  956.         nplus   macro
  957.         .xlist
  958.         ld      hl,n
  959.         inc     (hl)
  960.         res     6,(hl)
  961.         movb    0,r
  962.         .list
  963.         endm
  964.         ;
  965.         subttl  open file (pseudo-state, precedes send_init)
  966.         page
  967.         ;
  968.         ;       open file
  969.         ;
  970.         s_open:
  971.                 call    open            ;open file (assume fcb set)
  972.                 movb    _s,state        ;state = send_init
  973.                 movb    0,n             ;packet number to 0
  974.                 movb    0,r             ;reset retry count
  975.                 call    flush           ;clear comm buffers
  976.                 jp      mjump           ;and back
  977.         subttl  send initialisation routine
  978.         page
  979.         ;
  980.         ;       send init parameters
  981.         ;
  982.         s_init:
  983.                 ld      ix,rpaket
  984.                 ld      iy,spaket
  985.                 ld      (iy+len),12     ;length of init packet
  986.                 ld      (iy+type),'S'   ;type send init
  987.                 ld      a,(n)           ;current packet number
  988.                 add     a,' '           ;make printable
  989.                 ld      (iy+seq),a      ;into packet
  990.                 movb    12,byte         ;number of bytes to move
  991.                 blmov   rinit,spaket+data,byte
  992.                 ld      hl,spaket       ;to point correctly
  993.                 call    acsum           ;compute checksum
  994.                 call    spack           ;and send packet
  995.                 ld      a,(hl)          ;get paket length and fix it
  996.                 sub     ' '             ;because there might be a retry
  997.                 ld      (hl),a          ;save back
  998.                 call    rpack           ;get answer
  999.                 jp      c,rplus         ;no good
  1000.                 call    tstack          ;was it a good ack ?
  1001.                 jp      c,rplus         ;no, send it again
  1002.                 blmov   rpaket+data,sinit,byte
  1003.                                         ;move parameters to keep
  1004.                 ld      hl,sinit+4      ;address of eol
  1005.                 res     5,(hl)          ;sub 32 to get real eol
  1006.                 ld      hl,sinit        ;maxlen to send
  1007.                 res     5,(hl)          ;sub 32
  1008.                 nplus                   ;increment packet count
  1009.                 movb    _sf,state       ;state = send file header
  1010.                 jp      mjump           ;and back
  1011.         subttl  send file header information
  1012.         page
  1013.         ;
  1014.         ;       send file header
  1015.         ;
  1016.         s_file:
  1017.                 ld      hl,filnam+1     ;where the filame start
  1018.                 ld      a,(filnam)      ;it's length
  1019.                 ld      b,a             ;store len in b
  1020.                 ld      a,'/'           ;byte to look for
  1021.         s1:
  1022.                 cp      (hl)            ;is this a '/' ?
  1023.                 jp      z,s2            ;yes change it t '.'
  1024.                 inc     hl              ;advance pointer
  1025.                 djnz    s1              ;and check next byte
  1026.                 jp      s3              ;there was no '/'
  1027.         s2:
  1028.                 ld      a,'.'           ;a dot to normalize filename
  1029.                 ld      (hl),a          ;in place
  1030.         s3:
  1031.                 ld      (iy+type),'F'   ;of type file header
  1032.                 ld      a,(n)           ;get packet count
  1033.                 add     a,' '           ;make printable
  1034.                 ld      (iy+seq),a      ;insert in spacket
  1035.                 blmov   filnam+1,spaket+data,filnam
  1036.                                         ;put in filename
  1037.                 ld      a,(filnam)      ;get filename length
  1038.                 add     a,3             ;add len,seq,type
  1039.                 ld      (iy+len),a      ;set in spacket
  1040.                 ld      hl,spaket       ;hl to point correctly
  1041.                 call    acsum           ;compute checksum
  1042.                 call    spack           ;send it
  1043.                 ld      a,(hl)          ;get paket length and fix it
  1044.                 sub     ' '             ;because there might be a retry
  1045.                 ld      (hl),a          ;save back in spaket
  1046.                 call    rpack           ;get answer
  1047.                 jp      c,rplus         ;no good
  1048.                 call    tstack          ;was it a good ack ?
  1049.                 jp      c,rplus         ;no
  1050.                 nplus                   ;update packet count
  1051.  
  1052.                 call    buffil          ;get a bufferfull
  1053.                 jp      c,s_eof         ;it was the end of file
  1054.                 movb    _sd,state       ;state = send_data
  1055.                 jp      mjump           ;return
  1056.         subttl  send data from file
  1057.         page
  1058.         ;
  1059.         ;       send data
  1060.         ;
  1061.         s_data:
  1062.                 ld      (iy+type),'D'   ;data packet
  1063.                 ld      a,(n)           ;packet number
  1064.                 add     a,' '           ;make printable
  1065.                 ld      (iy+seq),a      ;into packet
  1066.                 ld      hl,spaket       ;hl point correctly
  1067.                 call    acsum           ;compute checksum
  1068.                 call    spack           ;send it
  1069.                 ld      a,(hl)          ;get length to fix it in case
  1070.                 sub     ' '             ; of a bad ack
  1071.                 ld      (hl),a          ;save back in spaket
  1072.                 call    rpack           ;get answer
  1073.                 jp      c,rplus         ;no good
  1074.                 call    tstack          ;a good ack ?
  1075.                 jp      c,rplus         ;nope...
  1076.                 nplus                   ;yes, update packet count
  1077.                 call    buffil          ;get next packet ready
  1078.                 jp      c,s_eof         ;we reach the eof
  1079.                 jp      mjump           ;and back
  1080.         subttl  send end of file
  1081.         page
  1082.         ;
  1083.         ;       send end of file
  1084.         ;
  1085.         s_eof:
  1086.                 movb    _se,state       ;might not be done
  1087.                 ld      (iy+type),'Z'   ;eof in spacket
  1088.                 ld      (iy+len),3      ;length
  1089.                 ld      a,(n)           ;packet number
  1090.                 add     a,' '           ;make printable
  1091.                 ld      (iy+seq),a      ;into packet
  1092.                 ld      hl,spaket       ;to point correctly
  1093.                 call    acsum           ;compute checksum
  1094.                 call    spack           ;send packet
  1095.                 ld      a,(hl)          ;get paket length
  1096.                 sub     ' '             ;and fix it
  1097.                 ld      (hl),a          ;back in spaket
  1098.                 call    rpack           ;get answer
  1099.                 jp      c,rplus         ;no good
  1100.                 call    tstack          ;test for good ack
  1101.                 jp      c,rplus         ;no good
  1102.                 nplus                   ;good, update packet count
  1103.                 movb    _sb,state       ;state = break transmission
  1104.                 jp      mjump           ;and back
  1105.         subttl  send break transmission
  1106.         page
  1107.         ;
  1108.         ;       send break transmission
  1109.         ;
  1110.         s_break:
  1111.                 ld      (iy+type),'B'   ;in spaket, set type
  1112.                 ld      (iy+len),3      ;and length
  1113.                 ld      a,(n)           ;current packet number
  1114.                 add     a,' '           ;make printable
  1115.                 ld      (iy+seq),a      ;store in spaket
  1116.                 ld      hl,spaket       ;hl to point correctly
  1117.                 call    acsum           ;compute checksum
  1118.                 call    spack           ;send packet
  1119.                 ld      a,(hl)          ;get paket length and fix it
  1120.                 sub     ' '             ;there might be a retry
  1121.                 ld      (hl),a          ;save back in spaket
  1122.                 call    rpack           ;get answer
  1123.                 jp      c,rplus         ;no good
  1124.                 call    tstack          ;check if correct ack
  1125.                 jp      c,rplus         ;no, send again
  1126.                 movb    _c,state        ;complete
  1127.                 jp      mjump           ;FIN...
  1128.                 end
  1129. <<< trsutil.mac >>>
  1130.         subttl  kutil/mac utilities and other odd routines
  1131.         extrn   rlen,slen,csvc,rsvc,ssvc,r,n,mjump
  1132.         extrn   spaket,rpaket,byte,recptr,sinit
  1133.         extrn   fcb,lrecl,filbuf,recbuf,lrecl,paraml
  1134.         public  flush,rplus,abort,exit,acsum,spack
  1135.         public  open,close,writnx,readnx,kill
  1136.         public  rpack,initcm
  1137.         extrn   init,port,altsvc,nsvc
  1138.         ;
  1139.         ;       useful symbole
  1140.         ;
  1141.         soh     equ     1
  1142.         tout    equ     10
  1143.         len     equ     0
  1144.         seq     equ     1
  1145.         type    equ     2
  1146.         data    equ     3
  1147.         dfport  equ     'A'
  1148.         ;
  1149.         ;
  1150.         ;timer  to interrupt a given routine after a number of seconds
  1151.         ;       syntax  timer   routin,seconds
  1152.         ;               where   routin is the interrupt handler
  1153.         ;
  1154.         timer   macro   routin,second
  1155.         push    hl
  1156.         push    bc
  1157.         ld      hl,routin       ;routine to jump to
  1158.         ld      bc,second       ;number of seconds
  1159.         svc     25              ;timer call
  1160.         pop     bc
  1161.         pop     hl
  1162.         endm
  1163.         ;
  1164.         ;svc    to make a trsdos supervisor call
  1165.         ;       syntax  svc code
  1166.         ;       where   code is the trsdos code
  1167.         ;
  1168.         svc     macro   code
  1169.         ld      a,code
  1170.         rst     8
  1171.         endm
  1172.         ;
  1173.         ;
  1174.         ;prmes  to print messages on the screen
  1175.         ;       syntax  prmes  lab
  1176.         ;       where   lab if the label as defined with mssg
  1177.         ;
  1178.         prmes   macro   lab
  1179.         .xlist
  1180.         extrn   m_&lab,l_&lab
  1181.         push    hl
  1182.         push    bc
  1183.         ld      hl,m_&lab       ;get address of message
  1184.         ld      bc,(l_&lab)     ;and length
  1185.         ld      c,13            ;add a CR at end of ttyout
  1186.         svc     9               ;call dos
  1187.         pop     bc
  1188.         pop     hl
  1189.         .list
  1190.         endm
  1191.         ;
  1192.         ;blmov  to move a block of text
  1193.         ;       syntax  blmov source,destination,length
  1194.         ;               if length is 0 then assume 256
  1195.         ;
  1196.         blmov   macro   source,dest,len
  1197.         .xlist
  1198.         local   $1,$2
  1199.         push    hl
  1200.         push    bc
  1201.         push    de
  1202.         ld      hl,source       ;address of source
  1203.         ld      de,dest         ;address of destination
  1204.         ld      a,(len)         ;get length
  1205.         cp      0               ;is it zero ?
  1206.         jr      nz,$1
  1207.         ld      b,1             ;then set bc = 256
  1208.         ld      c,0             ;(b=1 ; c=0)
  1209.         jp      $2              ;go to start move
  1210.         $1:
  1211.         ld      b,0
  1212.         ld      c,a             ;bc = length
  1213.         $2:
  1214.         ldir                    ;move and check if bc=0
  1215.         pop     de
  1216.         pop     bc
  1217.         pop     hl
  1218.         .list
  1219.         endm
  1220.         ;
  1221.         ;readnx to read next record sequentially
  1222.         ;       Returs with the record in recbuf
  1223.         ;       And, at eof, will jump to sendeof
  1224.         ;       (This macro will not save redisters)
  1225.         ;
  1226.         readnx:
  1227.         ld      de,fcb          ;file control block
  1228.         svc     34              ;read next svc
  1229.         jp      nz,abort        ;bad read, abort
  1230.         ld      a,(lrecl)       ;get logacal record length
  1231.         cp      0               ;is it 256 ?
  1232.         jp      nz,read0        ;no, all is ok
  1233.         blmov   filbuf,recbuf,lrecl     ;move to recbuf
  1234.         read0:
  1235.         ret
  1236.         ;
  1237.         ;open   open a file according to fcb and paramlist
  1238.         ;
  1239.         open:
  1240.         push    hl
  1241.         push    de
  1242.         ld      de,fcb          ;file control block
  1243.         ld      hl,paraml       ;parameter list
  1244.         svc     40              ;open call
  1245.         jp      nz,abort        ;file not found
  1246.                                 ;or file cannot create
  1247.         pop     de
  1248.         pop     hl
  1249.         ret
  1250.         ;
  1251.         ;kill kill a file using current fcb
  1252.         ;
  1253.         kill:
  1254.         push    de
  1255.         ld      de,fcb          ;file control block
  1256.         svc     41              ;kill call
  1257.         jp      nz,abort        ;no good (password ?)
  1258.         pop     de
  1259.         ret
  1260.         ;
  1261.         ;close  file using current fcb
  1262.         ;
  1263.         close:
  1264.         push    de
  1265.         ld      de,fcb
  1266.         svc     42
  1267.         jp      nz,abort
  1268.         xor     a               ;clr a
  1269.         ld      (recptr),a      ;reset pointer to 0
  1270.         pop     de
  1271.         ret
  1272.         ;
  1273.         ;writnx write next sequential record
  1274.         ;
  1275.         writnx:
  1276.         ld      a,(lrecl)       ;get logical record length
  1277.         cp      0               ;is it 256 ?
  1278.         jp      nz,writ0        ;no, go on
  1279.         blmov   recbuf,filbuf,lrecl     ;get to filbuf
  1280.         writ0:
  1281.         push    de
  1282.         ld      de,fcb          ;file control block
  1283.         svc     43              ;write call
  1284.         jp      nz,abort        ;no good
  1285.         pop     de
  1286.         ret
  1287.         ;
  1288.         ;delay  in seconds
  1289.         ;
  1290.         delay   macro   sec
  1291.         .xlist
  1292.         local   $1
  1293.         push    bc
  1294.         ld      bc,0            ;set for 426 milisecs
  1295.         push    hl
  1296.         ld      l,sec           ;number of seconds
  1297.         $1:
  1298.         svc     6               ;call for delay
  1299.         svc     6               ;2 * 426 milisecs = 1 s.
  1300.         dec     l               ;sec--
  1301.         xor     a               ;a = 0
  1302.         cp      l               ;sec = 0 ?
  1303.         jr      nz,$1           ;no, play it again sam
  1304.         pop     hl
  1305.         pop     de
  1306.         .list
  1307.         endm
  1308.         ;
  1309.         ;jumptb jump according to a given table and a one byte code
  1310.         ;
  1311.         ;       syntax jumptb   table,code
  1312.         ;
  1313.         jumptb  macro   table,code
  1314.         .xlist
  1315.         local   $1
  1316.         ld      hl,table        ;get jump table address
  1317.         ld      bc,(code)       ;and code (note that c is messed up)
  1318.         ld      a,c
  1319.         ld      b,a
  1320.         svc     28              ;lookup call
  1321.         jr      z,$1            ;found
  1322.         ld      hl,table+1      ;get abort address
  1323.         $1:
  1324.         jp      (hl)            ;bye ...
  1325.         .list
  1326.         endm
  1327.         ;
  1328.         ;initcm initalise comm channel A or B
  1329.         ;       and set up correct svc communication calls
  1330.         ;
  1331.         initcm:
  1332.         ld      a,(init)        ;get initial code
  1333.         cp      0               ;should we init ?
  1334.         jr      z,i1            ;no, go set up svc
  1335.         ;
  1336.         ld      hl,port         ;get port paramlist
  1337.         ld      b,0             ;turn off port
  1338.         svc     55              ;dos call
  1339.         ld      b,1             ;turn on
  1340.         svc     55              ;dos call
  1341.         i1:
  1342.         ld      a,(port)        ;get channel A or B
  1343.         cp      dfport          ;is this default ?
  1344.         jr      z,i2            ;yes, all ok
  1345.         blmov   altsvc,init,nsvc;set up alternate svc's
  1346.         i2:
  1347.         ret
  1348.         ;
  1349.         ;xmitb  transmit a byte that is pointed to by hl
  1350.         ;
  1351.         xmitb   macro
  1352.         .xlist
  1353.         local   $1
  1354.         $1:
  1355.         ld      a,(ssvc)        ;get transmit svc
  1356.         ld      b,(hl)          ;and byte to transmit
  1357.         rst     8               ;dos call
  1358.         jr      nz,$1           ;assume busy, try again
  1359.         .list
  1360.         endm
  1361.         ;
  1362.         ;rcvb  receive byte and return it in a
  1363.         ;
  1364.         rcvb    macro
  1365.         .xlist
  1366.         local   $1
  1367.         push    bc
  1368.         $1:
  1369.         ld      a,(rsvc)        ;get receive svc
  1370.         rst     8               ;dos call
  1371.         jr      nz,$1           ;try it again
  1372.         ld      a,b             ;store (might not be good)
  1373.         pop     bc
  1374.         .list
  1375.         endm
  1376.  
  1377.         ;
  1378.         ;nplus  to increment the packet number count
  1379.         ;
  1380.         nplus   macro
  1381.         ld      hl,n
  1382.         inc     (hl)
  1383.         endm
  1384.         ;
  1385.         ;dec3   decrement three times a register or register pair
  1386.         ;
  1387.         dec3    macro   reg
  1388.         dec     reg
  1389.         dec     reg
  1390.         dec     reg
  1391.         endm
  1392.         ;
  1393.         ;addbc  to add a to bc in checksum computation
  1394.         ;
  1395.         addbc   macro
  1396.         .xlist
  1397.         add     a,c             ;c=c+1 (there might be a carry)
  1398.         ld      c,a             ;back in c
  1399.         ld      a,0             ;not xor a because we need the carry
  1400.         adc     a,b             ;add the carry to b
  1401.         ld      b,a             ;back in b
  1402.         .list
  1403.         endm                    ;bc=bc+a
  1404.         ;
  1405.         ;f_ack  to format ack using current n
  1406.         ;
  1407.         f_ack   macro
  1408.         .xlist
  1409.         ld      (iy+len),3      ;length=3
  1410.         ld      a,(n)           ;current packet count
  1411.         add     a,' '           ;make printable
  1412.         ld      (iy+seq),a      ;put n in packet
  1413.         ld      (iy+type),'Y'   ;type = ack
  1414.         ld      hl,spaket       ;hl points to send packet
  1415.         call    acsum           ;and add the checksum
  1416.         .list
  1417.         endm
  1418.         ;
  1419.         ;movb   to move a byte to memory
  1420.         ;
  1421.         movb    macro   value,loc
  1422.         .xlist
  1423.                 push    af      ;save
  1424.                 ld      a,value ;get byte
  1425.                 ld      (loc),a ;save
  1426.                 pop     af      ;restore
  1427.         .list
  1428.                 endm
  1429.         subttl  rpack - receive packet routine
  1430.         page
  1431.         ;
  1432.         ;       rpack   receive packet routine
  1433.         ;       call    rpack
  1434.         ;               will discard soh on reception
  1435.         ;               and will return with carry set
  1436.         ;               if timout occured or cheksum wrong
  1437.         ;
  1438.         rpack:
  1439.                 timer   rp0,tout        ;set timer handler
  1440.         rp1:
  1441.                 ld      hl,rpaket       ;set up hl
  1442.                 rcvb                    ;get a byte
  1443.                 cp      soh             ;is it a soh ?
  1444.                 jr      nz,rp1          ;no, not yet, start over
  1445.                 ld      b,0             ;for checksum bc=0
  1446.                 ld      c,0             ;*****************
  1447.         rp2:    ;len
  1448.                 rcvb                    ;get a byte
  1449.                 cp      soh             ;is it a soh ?
  1450.                 jp      z,rp1           ;yes, re-sync
  1451.                 ld      (hl),a          ;save in rpaket
  1452.                 addbc                   ;add to bc for checksum
  1453.                 ld      a,(hl)          ;get back byte
  1454.                 inc     hl              ;point to next byte
  1455.                 sub     ' '+3           ;convert to numeric
  1456.                 ld      (rlen),a        ;and save
  1457.         rp3:    ;packet number
  1458.                 rcvb                    ;get a byte
  1459.                 cp      soh             ;soh ?
  1460.                 jp      z,rp1           ;yes, re-sync
  1461.                 ld      (hl),a          ;save in rpaket
  1462.                 inc     hl              ;update counter
  1463.                 addbc                   ;add to bc for checksum
  1464.         rp4:    ;type of packet
  1465.                 rcvb                    ;get a byte
  1466.                 cp      soh             ;soh ?
  1467.                 jp      z,rp1           ;yes, re-sync
  1468.                 ld      (hl),a          ;save in rapket
  1469.                 inc     hl              ;update pointer
  1470.                 addbc                   ;add to bc for checksum
  1471.                 ld      a,(rlen)        ;get data length
  1472.                 cp      0               ;is it null ?
  1473.                 jp      z,rp6           ;yes, get checksum now
  1474.         rp5:    ;data field
  1475.                 rcvb                    ;get a byte
  1476.                 cp      soh             ;soh ?
  1477.                 jp      z,rp1           ;yes, re-sync
  1478.                 ld      (hl),a          ;save
  1479.                 inc     hl              ;update counter
  1480.                 addbc                   ;add to bc for checksum
  1481.                 ld      a,(rlen)        ;get length of packet
  1482.                 dec     a               ;decrement
  1483.                 ld      (rlen),a        ;ans store back
  1484.                 cp      0               ;is it null ?
  1485.                 jp      nz,rp5          ;no, get one more byte
  1486.         rp6:    ;checksum
  1487.                 rcvb                    ;get a byte
  1488.                 cp      soh             ;soh ???
  1489.                 jp      z,rp1           ;yes, re-sync
  1490.                 sub     ' '             ;convert to numeric
  1491.                 ld      (byte),a        ;save received checksum
  1492.                 ld      a,c             ;get low byte
  1493.                 and     300O            ;only two high bits
  1494.                 rlca                    ;rotale left
  1495.                 rlca                    ;twice
  1496.                 add     a,c             ;add back to low byte
  1497.                 and     077O            ;only six bits
  1498.                 ld      c,a             ;computed checksum
  1499.                 ld      a,(byte)        ;received checksum
  1500.                 cp      c               ;equal ?
  1501.                 jp      nz,rp0          ;no good
  1502.                 timer   0,0             ;terminate timout handler
  1503.                 scf                     ;ser carry to 1
  1504.                 ccf                     ;back to 0
  1505.                 ret                     ;and return
  1506.         rp0:    timer   0,0             ;terminate timout handler
  1507.                 scf                     ;set carry flag
  1508.                 ret
  1509.                 ;
  1510.                 ;
  1511.         subttl  flush - to reset communication port
  1512.         page
  1513.         ;
  1514.         ;       flush   to reset internal communication buffer
  1515.         ;               (mostly to get rid of stacked up naks)
  1516.         flush:
  1517.                 push    bc              ;save
  1518.                 ld      b,6             ;code to reset buffer
  1519.                 ld      a,(csvc)        ;control svc
  1520.                 rst     8               ;dos call
  1521.                 pop     bc              ;restore
  1522.                 ret
  1523.         ;
  1524.         subttl  rplus - to increment retry count
  1525.         page
  1526.         ;       rplus   increment retry count and jump back
  1527.         ;
  1528.         rplus:
  1529.                 ld      a,(r)           ;get retry count
  1530.                 inc     a               ;increment it
  1531.                 cp      tout            ;to maximum ?
  1532.                 jp      z,abort         ;yes abort
  1533.                 ld      (r),a           ;save back
  1534.                 jp      mjump           ;and go back
  1535.         ;
  1536.         subttl  abort - end in disaster sending an error packet
  1537.         page
  1538.         ;       abort   end transmission and die...
  1539.         ;
  1540.         abort:
  1541.                 prmes   a0              ;aborting ...
  1542.                 ld      (iy+len),3      ;length = 3
  1543.                 ld      a,(n)           ;get current packet seq
  1544.                 cp      0               ;are we at beginning ?
  1545.                 jp      z,ab0           ;yes, do not send error pak
  1546.                 add     a,' '           ;make printable
  1547.                 ld      (iy+seq),a      ;and store
  1548.                 ld      (iy+type),'E'   ;type error packet
  1549.                 ld      hl,spaket       ;set up hl
  1550.                 call    acsum           ;compute checksum
  1551.                 call    spack           ;and send packet
  1552.         ab0:
  1553.         exit:   prmes   e0              ;end of job
  1554.                 rst     0               ;bye !
  1555.         ;
  1556.         subttl  acsum - add checksum to a packet
  1557.         page
  1558.         ;       acsum   compute and store checksum (hl)
  1559.         ;
  1560.         acsum:
  1561.                 push    hl              ;save
  1562.                 push    bc              ;save
  1563.                 ld      b,0             ;initialize bc to 0
  1564.                 ld      c,0             ;******************
  1565.                 ld      a,(hl)          ;get length
  1566.                 ld      (slen),a        ;save it
  1567.                 add     a,' '           ;make printable
  1568.                 ld      (hl),a          ;store back in packet
  1569.         ac0:
  1570.                 ld      a,(hl)          ;get a byte
  1571.                 addbc                   ;add to bc for checksum
  1572.                 inc     hl              ;increment pointer
  1573.                 ld      a,(slen)        ;get length
  1574.                 dec     a               ;decrement it
  1575.                 ld      (slen),a        ;save it back
  1576.                 cp      0               ;are we at end ?
  1577.                 jp      nz,ac0          ;no, get one more byte
  1578.                 ld      a,c             ;get low byte of sum
  1579.                 and     300O            ;only 2 high bits
  1580.                 rlca                    ;rotate left
  1581.                 rlca                    ;twice
  1582.                 add     a,c             ;add it back to low byte
  1583.                 and     077O            ;mask off 2 high bits
  1584.                 add     a,' '           ;and make pintable
  1585.                 ld      (hl),a          ;store in packet
  1586.                 pop     bc              ;restore
  1587.                 pop     hl              ;restore
  1588.                 ret
  1589.         ;
  1590.         subttl  spack - send a packet already formatted
  1591.         page
  1592.         ;       spack   send a packet already formatted
  1593.         ;
  1594.         spack:
  1595.                 push    hl              ;save
  1596.                 ld      a,(spaket)      ;get length
  1597.                 sub     31              ;real length
  1598.                 ld      (slen),a        ;save it
  1599.                 movb    soh,byte        ;store a soh
  1600.                 ld      hl,byte         ;set up hl
  1601.                 xmitb                   ;transmit (hl)=soh
  1602.                 ld      hl,spaket       ;packet address
  1603.                 ld      a,(slen)        ;and length
  1604.         sp1:
  1605.                 push    af              ;save
  1606.                 xmitb                   ;transmit (hl)
  1607.                 pop     af              ;restore a
  1608.                 dec     a               ;decrement length of packet
  1609.                 inc     hl              ;update pointer
  1610.                 cp      0               ;are we at end ?
  1611.                 jp      nz,sp1          ;no, one more byte
  1612.                 ;now send eol
  1613.                 ld      hl,sinit+4      ;where eol is stored
  1614.                 xmitb                   ;send it
  1615.                 pop     hl              ;restore
  1616.                 ret
  1617.         ;
  1618.         ;
  1619.                 end
  1620.  
  1621. <<< trsutil2.mac >>>
  1622.         subttl  kutil2/mac utilities and other odd routines
  1623.         extrn   rlen,slen,csvc,rsvc,ssvc,r,n,mjump
  1624.         extrn   spaket,rpaket,byte,recptr,sinit
  1625.         extrn   fcb,lrecl,filbuf,recbuf,lrecl,paraml
  1626.         extrn   readnx,crp,cbp,word
  1627.         public  tstack,buffil,eof
  1628.         ;
  1629.         ;       useful symbols
  1630.         ;
  1631.         soh     equ     1
  1632.         tout    equ     10
  1633.         len     equ     0
  1634.         seq     equ     1
  1635.         type    equ     2
  1636.         data    equ     3
  1637.         dfport  equ     'A'
  1638.         ;
  1639.         ;
  1640.         ;
  1641.         ;svc    to make a trsdos supervisor call
  1642.         ;       syntax  svc code
  1643.         ;       where   code is the trsdos code
  1644.         ;
  1645.         svc     macro   code
  1646.         ld      a,code
  1647.         rst     8
  1648.         endm
  1649.         ;
  1650.         ;
  1651.         ;prmes  to print messages on the screen
  1652.         ;       syntax  prmes  lab
  1653.         ;       where   lab if the label as defined with mssg
  1654.         ;
  1655.         prmes   macro   lab
  1656.         .xlist
  1657.         extrn   m_&lab,l_&lab
  1658.         push    hl
  1659.         push    bc
  1660.         ld      hl,m_&lab       ;get address of message
  1661.         ld      bc,(l_&lab)     ;and length
  1662.         ld      c,13            ;add a CR at end of ttyout
  1663.         svc     9               ;call dos
  1664.         pop     bc
  1665.         pop     hl
  1666.         .list
  1667.         endm
  1668.         ;
  1669.         ;blmov  to move a block of text
  1670.         ;       syntax  blmov source,destination,length
  1671.         ;               if length is 0 then assume 256
  1672.         ;
  1673.         blmov   macro   source,dest,len
  1674.         .xlist
  1675.         local   $1,$2
  1676.         push    hl
  1677.         push    bc
  1678.         push    de
  1679.         ld      hl,source       ;address of source
  1680.         ld      de,dest         ;address of destination
  1681.         ld      a,(len)         ;get length
  1682.         cp      0               ;is it zero ?
  1683.         jr      nz,$1
  1684.         ld      b,1             ;then set bc = 256
  1685.         ld      c,0             ;(b=1 ; c=0)
  1686.         jp      $2              ;go to start move
  1687.         $1:
  1688.         ld      b,0
  1689.         ld      c,a             ;bc = length
  1690.         $2:
  1691.         ldir                    ;move and check if bc=0
  1692.         pop     de
  1693.         pop     bc
  1694.         pop     hl
  1695.         .list
  1696.         endm
  1697.         movb    macro   value,loc
  1698.         .xlist
  1699.         push    af
  1700.         ld      a,value
  1701.         ld      (loc),a
  1702.         pop     af
  1703.         .list
  1704.         endm
  1705.         ;
  1706.         ;
  1707.         ;       tstack  to test a received packet for a good ack
  1708.         ;
  1709.         tstack:
  1710.                 ld      a,(n)           ;cirrent packet count
  1711.                 add     a,' '           ;make printable
  1712.                 cp      (ix+seq)        ;equal to seq received ?
  1713.                 jp      nz,plus1        ;no, test n+1
  1714.                 ld      a,(ix+type)     ;get packet type
  1715.                 cp      'Y'             ;is an ack ?
  1716.                 jp      nz,nogood       ;no return error code
  1717.         $1:
  1718.                 scf
  1719.                 ccf
  1720.                 ret                     ;return no error
  1721.         plus1:
  1722.                 inc     a               ;increment packet count
  1723.                 cp      (ix+seq)        ;equal to received ?
  1724.                 jp      z,$1            ;yes, all ok
  1725.         nogood:
  1726.                 scf                     ;set carry
  1727.                 ret
  1728.         ;
  1729.         ;       buffil  to fill a send packet data field from
  1730.         ;               record buffer
  1731.         ;
  1732.         buffil:
  1733.                 movb    3,cbp           ;initialize buffer pointer
  1734.         b5:
  1735.                 ld      a,(cbp)         ;get buffer pointer
  1736.                 inc     a               ;it might be one less
  1737.                 ld      hl,sinit        ;maxlen to send
  1738.                 cp      (hl)            ;equal to max or max-1 ?
  1739.                 jp      c,b0            ;no, there is room
  1740.         b4:
  1741.                 ld      a,(cbp)         ;buffer pointer
  1742.                 ld      (iy+len),a      ;in packet
  1743.                 scf
  1744.                 ccf
  1745.                 ret                     ;return all ok
  1746.         b0:
  1747.                 xor     a               ;clear a
  1748.                 ld      hl,crp          ;record pointer address
  1749.                 cp      (hl)            ;buffer empty ?
  1750.                 jp      nz,b1           ;no
  1751.                 call    readnx          ;get something (EOF...)
  1752.                 jp      nc,b1           ;not end of file yet
  1753.                 ld      a,(cbp)         ;spaket pointer
  1754.                 ld      (iy+len),a      ;put in place
  1755.                 cp      3               ;is this the start ?
  1756.                 jp      nz,b13          ;not yet, return normally
  1757.                 scf                     ;flag to never return here
  1758.         b13:    ret
  1759.         b1:
  1760.                 ld      a,(cbp)         ;buffer pointer
  1761.                 ld      b,a             ;save in b
  1762.                 ld      a,(sinit)       ;maxlen to send
  1763.                 sub     b               ;a=SA=mxl-cbp
  1764.                 ld      (byte),a        ;save in byte
  1765.                 ld      a,(crp)         ;record pointer
  1766.                 ld      b,a             ;save in b
  1767.                 ld      a,(lrecl)       ;record length
  1768.                 sub     b               ;a=BA=lrecl-crp
  1769.                 ld      hl,byte         ;get byte address
  1770.                 cp      (hl)            ;BA > SA ?
  1771.                 jp      nc,b2           ;go move SA bytes
  1772.                 ld      (byte),a        ;save BA in byte
  1773.         b2:
  1774.                 ld      hl,spaket       ;packet address
  1775.                 ld      a,(cbp)         ;current pointer
  1776.                 add     a,l             ;add to low byte
  1777.                 ld      l,a             ;save back
  1778.                 ld      a,0             ;clear a keeping carry
  1779.                 adc     a,h             ;add carry to high byte
  1780.                 ld      h,a             ;save back
  1781.                 ex      de,hl           ;save in DE
  1782.                 ld      hl,recbuf       ;record address
  1783.                 ld      a,(crp)         ;record pointer
  1784.                 add     a,l             ;add to low byte
  1785.                 ld      l,a             ;save back
  1786.                 ld      a,0             ;clear a keeping carry
  1787.                 adc     a,h             ;add to high byte
  1788.                 ld      h,a             ;save back
  1789.                 ;
  1790.                 ; here we move from recbuf to spaket
  1791.                 ; making sure the control caracters are quoted,
  1792.                 ; and uncontrollified (same thing for del),
  1793.                 ; and that the quote caracter is itself quoted.
  1794.                 ;
  1795.                 movb    0,word          ;this will be the count from recbuf
  1796.                 movb    0,word+1        ;and the count of quote bytes
  1797.         b9:
  1798.                 ld      a,31            ;limit of control char.
  1799.                 ld      b,(hl)          ;get character in b to
  1800.                 res     7,b             ; reset seventh bit
  1801.                 cp      b               ;compare 31 to byte to send
  1802.                 jp      c,b6            ;this is not a control char.
  1803.         b8:
  1804.                 ld      a,(sinit+5)     ;get the quote byte
  1805.                 ld      (de),a          ;move in spaket
  1806.                 inc     de              ;update spaket pointer
  1807.                 push    hl              ;save
  1808.                 ld      hl,word+1       ;points to quote count
  1809.                 inc     (hl)            ;update count
  1810.                 pop     hl              ;restore
  1811.                 ld      a,64            ;to uncontrollify
  1812.                 xor     (hl)            ;the byte to send
  1813.                 ld      (hl),a          ;and put it back in recbuf
  1814.                 jp      b7              ;go send it
  1815.         b6:
  1816.                 ld      a,127           ;del byte
  1817.                 cp      b               ;is this it ?
  1818.                 jp      z,b8            ;yes go uncontrollify it
  1819.                 ;
  1820.                 ld      a,(sinit+5)     ;quote byte
  1821.                 cp      (hl)            ;is this what we are sending ?
  1822.                 jp      nz,b7           ;no, go on
  1823.                 ld      (de),a          ;yes put it in spaket
  1824.                 inc     de              ;and update pointer
  1825.                 push    hl              ;save
  1826.                 ld      hl,word+1       ;get quote count address
  1827.                 inc     (hl)            ;and update it
  1828.                 pop     hl              ;restore hl
  1829.         b7:
  1830.                 ldi                     ;move the byte in spaket
  1831.                 push    hl              ;save
  1832.                 ld      hl,word         ;count address
  1833.                 inc     (hl)            ;update it
  1834.                 ld      a,(hl)          ;get count of bytes from recbuf
  1835.                 ld      hl,word+1       ;and count of quote bytes
  1836.                 add     a,(hl)          ;add them to get real count
  1837.                 ld      hl,byte         ;address of max to moved
  1838.                 inc     a               ;increment real count
  1839.                                         ; to get to max-1 or max
  1840.                 cp      (hl)            ;compare count+1 to max
  1841.                 jp      nc,b10          ;this is it, finish.
  1842.                 pop     hl              ;restore
  1843.                 jp      b9              ;one more time...
  1844.         b10:
  1845.                 ld      a,(word)        ;real count moved from recbuf
  1846.                 ld      (byte),a        ;put where we need it
  1847.                 pop     hl              ;restore to recbuf
  1848.         b11:
  1849.                 ;
  1850.                 ; at this point we have moved up to (byte) bytes
  1851.                 ; maby less if there was only one control character
  1852.                 ; Most of those bytes come from recbuf plus some
  1853.                 ; instances of the quote byte.
  1854.                 ;
  1855.                 ld      a,(word)        ;number of bytes moved
  1856.                 ld      hl,word+1       ;address of quote count
  1857.                 add     a,(hl)          ;a = total count
  1858.                 ld      hl,cbp          ;buffer pointer
  1859.                 add     a,(hl)          ;increment
  1860.                 ld      (hl),a          ;save back in cbp
  1861.                 ld      hl,crp          ;record pointer
  1862.                 ld      a,(word)        ;get back bytes moved from rec
  1863.                 add     a,(hl)          ;fix pointer
  1864.                 ld      (hl),a          ;save back in cbp
  1865.                 ld      a,(lrecl)       ;record length
  1866.                 cp      (hl)            ;equal to record pointer ?
  1867.                 jp      nz,b3           ;no, go on
  1868.                 movb    0,crp           ;yes, reset crp
  1869.         b3:
  1870.                 jp      b5              ;one more time
  1871.          ;
  1872.         ;       eof     this routine will be accessed automatically
  1873.         ;               from a read of eof by trsdos.
  1874.         ;               Might be accessed twice ...
  1875.         ;
  1876.         eof:
  1877.                 scf                     ;set carry
  1878.                 ret
  1879.                 end
  1880.