home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / src / kim-1 / kim.asm < prev    next >
Encoding:
Assembly Source File  |  1981-12-17  |  27.6 KB  |  941 lines

  1. ;- - - - - - - - - - - - - - kim.asm - - - - - - - - - - -
  2.  
  3. ; copyright mos technology, inc
  4.  
  5. ; date: oct 18, 1975 rev-d
  6.  
  7. ;************************ 6530-003 i.c. ******************
  8.  
  9. ; 6530-003 i.c. is an audio cassette tape recorder
  10.  
  11. ; extension of the basic kim monitor.  it features
  12.  
  13. ; two routines:
  14.  
  15. ;   loadt - load memory from audio tape
  16.  
  17. ;     id=00     ignore id
  18.  
  19. ;     id=ff     ignore id, use sa for start addr
  20.  
  21. ;     id=01-fe  use address on tape
  22.  
  23. ;
  24.  
  25. ;   dumpt - store memory onto audio tape
  26.  
  27. ;     id=00     should not be used
  28.  
  29. ;     id=ff     should not be used
  30.  
  31. ;     id=01-fe  normal id range
  32.  
  33. ;     sal       lsb starting address of program
  34.  
  35. ;     sah       msb
  36.  
  37. ;     eal       ending address of program
  38.  
  39. ;     eah       msb
  40.  
  41. ;
  42.  
  43.         *=    $1800
  44.  
  45. sad     =     $1740     6530 a data
  46.  
  47. padd    =     $1741     6530 a data direction
  48.  
  49. sbd     =     $1742     6530 b data
  50.  
  51. pbdd    =     $1743     6530 b data direction
  52.  
  53. clk1t   =     $1744     div by 1 time
  54.  
  55. clk8t   =     $1745     div by 8 time
  56.  
  57. clk64t  =     $1746     div by 64 time
  58.  
  59. clkkt   =     $1747     div by 1024 time
  60.  
  61. clkrdi  =     $1747     read time out bit
  62.  
  63. clkrdt  =     $1746     read time
  64.  
  65. ;       ** mpu reg.  savx area in page 0 **
  66.  
  67. pcl     =     $ef       program cnt low
  68.  
  69. pch     =     $f0       program cnt hi
  70.  
  71. preg    =     $f1       current status reg
  72.  
  73. spuser  =     $f2       current stack pointer
  74.  
  75. acc     =     $f3       accumulator
  76.  
  77. yreg    =     $f4       y index
  78.  
  79. xreg    =     $f5       x index
  80.  
  81. ;       ** kim fixed area in page 0  **
  82.  
  83. chkhi   =     $f6
  84.  
  85. chksum  =     $f7
  86.  
  87. inl     =     $f8       input buffer
  88.  
  89. inh     =     $f9       input buffer
  90.  
  91. pointl  =     $fa       lsb of open cell
  92.  
  93. pointh  =     $fb       msb of open cell
  94.  
  95. temp    =     $fc
  96.  
  97. tmpx    =     $fd
  98.  
  99. char    =     $fe
  100.  
  101. mode    =     $ff
  102.  
  103. ;       ** kim fixed area in page 23 **
  104.  
  105. chkl    =     $17e7
  106.  
  107. chkh    =     $17e8     chksum
  108.  
  109. savx    =     $17e9     (3-bytes)
  110.  
  111. veb     =     $17ec     volatile exec block (6-b)
  112.  
  113. cntl30  =     $17f2     tty delay
  114.  
  115. cnth30  =     $17f3     tty delay
  116.  
  117. timh    =     $17f4
  118.  
  119. sal     =     $17f5     low starting address
  120.  
  121. sah     =     $17f6     hi starting address
  122.  
  123. eal     =     $17f7     low ending address
  124.  
  125. eah     =     $17f8     hi ending address
  126.  
  127. id      =     $17f9     tape program id number
  128.  
  129. ;       ** interrupt vectors **
  130.  
  131. nmiv    =     $17fa     stop vector (stop=1c00)
  132.  
  133. rstv    =     $17fc     rst vector
  134.  
  135. irqv    =     $17fe     irq vector (brk=1c00)
  136.  
  137.  
  138.  
  139. ;
  140.  
  141. ;       ** dump memory to tape **
  142.  
  143. dumpt   lda   #$ad      load absolute inst            1800
  144.  
  145.         sta   veb   
  146.  
  147.         jsr   intveb
  148.  
  149.         lda   #$27      turn off datain pb5
  150.  
  151.         sta   sbd   
  152.  
  153.         lda   #$bf      convert pb7 to output
  154.  
  155.         sta   pbdd  
  156.  
  157.         ldx   #$64      100 chars 
  158.  
  159. dumpt1  lda   #$16      sync chars
  160.  
  161.         jsr   outcht
  162.  
  163.         dex         
  164.  
  165.         bne   dumpt1
  166.  
  167.         lda   #$2a      start char
  168.  
  169.         jsr   outcht
  170.  
  171.         lda   id        output id 
  172.  
  173.         jsr   outbt 
  174.  
  175.         lda   sal       output starting
  176.  
  177.         jsr   outbtc    address 
  178.  
  179.         lda   sah   
  180.  
  181.         jsr   outbtc
  182.  
  183. dumpt2  lda   veb+1     check for last
  184.  
  185.         cmp   eal       data byte
  186.  
  187.         lda   veb+2 
  188.  
  189.         sbc   eah   
  190.  
  191.         bcc   dumpt4
  192.  
  193.         lda   #'/       output end-of-data char
  194.  
  195.         jsr   outcht
  196.  
  197.         lda   chkl      last byte has been 
  198.  
  199.         jsr   outbt     output  now output
  200.  
  201.         lda   chkh      chksum
  202.  
  203.         jsr   outbt 
  204.  
  205.         ldx   #$02      2 chars
  206.  
  207. dumpt3  lda   #$04      eot char       
  208.  
  209.         jsr   outcht 
  210.  
  211.         dex          
  212.  
  213.         bne   dumpt3    
  214.  
  215.         lda   #$00      display 0000
  216.  
  217.         sta   pointl    for normal exit
  218.  
  219.         sta   pointh  
  220.  
  221.         jmp   start
  222.  
  223. dumpt4  jsr   veb       data byte output
  224.  
  225.         jsr   outbtc
  226.  
  227.         jsr   incveb
  228.  
  229.         jmp   dumpt2
  230.  
  231. ;
  232.  
  233. ;       ** load memory from tape **
  234.  
  235. ;
  236.  
  237. tab     .word load12      'load12' address            1871
  238.  
  239. ;
  240.  
  241. loadt   lda   #$8d      init volatile execution       1873
  242.  
  243.         sta   veb       block with sta abs.
  244.  
  245.         jsr   intveb
  246.  
  247.         lda   #$4c      jump type rtrn
  248.  
  249.         sta   veb+3
  250.  
  251.         lda   tab  
  252.  
  253.         sta   veb+4
  254.  
  255.         lda   tab+1
  256.  
  257.         sta   veb+5
  258.  
  259.         lda   #$07      reset pb5=0 (data-in)
  260.  
  261.         sta   sbd
  262.  
  263. sync    lda   #$ff      clear savx for sync char      1891
  264.  
  265.         sta   savx 
  266.  
  267. sync1   jsr   rdbit     get a bit        
  268.  
  269.         lsr   savx      shift bit into char
  270.  
  271.         ora   savx
  272.  
  273.         sta   savx
  274.  
  275.         lda   savx      get new char
  276.  
  277.         cmp   #$16      sync char
  278.  
  279.         bne   sync1
  280.  
  281.         ldx   #$0a      test for 10 sync chars
  282.  
  283. sync2   jsr   rdcht                      
  284.  
  285.         cmp   #$16  
  286.  
  287.         bne   sync      if not 10 char, re-sync
  288.  
  289.         dex     
  290.  
  291.         bne   sync2
  292.  
  293. loadt4  jsr   rdcht     look for start of
  294.  
  295.         cmp   #$2a      data char
  296.  
  297.         beq   load11
  298.  
  299.         cmp   #$16      if not , should be sync
  300.  
  301.         bne   sync
  302.  
  303.         beq   loadt4
  304.  
  305. load11  jsr   rdbyt     read id from tape
  306.  
  307.         cmp   id        compare with requested id
  308.  
  309.         beq   loadt5
  310.  
  311.         lda   id        default 00, read record
  312.  
  313.         cmp   #$00      anyway
  314.  
  315.         beq   loadt5
  316.  
  317.         cmp   #$ff      default ff, ignore sa on
  318.  
  319.         beq   loadt6    tape
  320.  
  321.         bne   loadt
  322.  
  323. loadt5  jsr   rdbyt     get sa from tape
  324.  
  325.         jsr   chkt
  326.  
  327.         sta   veb+1     savx in veb+1,2
  328.  
  329.         jsr   rdbyt
  330.  
  331.         jsr   chkt
  332.  
  333.         sta   veb+2
  334.  
  335.         jmp   loadt7
  336.  
  337. ;
  338.  
  339. loadt6  jsr   rdbyt     get sa but ignore             18ec
  340.  
  341.         jsr   chkt
  342.  
  343.         jsr   rdbyt
  344.  
  345.         jsr   chkt
  346.  
  347. loadt7  ldx   #$02      get 2 chars 
  348.  
  349. load13  jsr   rdcht     get char (x)
  350.  
  351.         cmp   #$2f      look for last char
  352.  
  353.         beq   loadt8
  354.  
  355.         jsr   packt     convert to hex
  356.  
  357.         bne   loadt9    y=1 non-hex char
  358.  
  359.         dex                         
  360.  
  361.         bne   load13
  362.  
  363.         jsr   chkt      compare checksum
  364.  
  365.         jmp   veb       savx data in memory
  366.  
  367. load12  jsr   incveb    incr data pointer
  368.  
  369.         jmp   loadt7
  370.  
  371. ;
  372.  
  373. loadt8  jsr   rdbyt     end of data, compare chksum   1915
  374.  
  375.         cmp   chkl
  376.  
  377.         bne   loadt9
  378.  
  379.         jsr   rdbyt
  380.  
  381.         cmp   chkh
  382.  
  383.         bne   loadt9
  384.  
  385.         lda   #$00      normal exit
  386.  
  387.         beq   load10
  388.  
  389. loadt9  lda   #$ff      error exit 
  390.  
  391. load10  sta   pointl               
  392.  
  393.         sta   pointh
  394.  
  395.         jmp   start
  396.  
  397. ;
  398.  
  399. ;       ** subroutines below **
  400.  
  401. intveb  lda   sal       move sa to veb+1,2            1932
  402.  
  403.         sta   veb+1
  404.  
  405.         lda   sah
  406.  
  407.         sta   veb+2
  408.  
  409.         lda   #$60      rts inst
  410.  
  411.         sta   veb+3
  412.  
  413.         lda   #$00      clear chksum area
  414.  
  415.         sta   chkl
  416.  
  417.         sta   chkh
  418.  
  419.         rts
  420.  
  421. ;       ** compute chksum for tape load **
  422.  
  423. chkt    tay                                           194c
  424.  
  425.         clc     
  426.  
  427.         adc   chkl
  428.  
  429.         sta   chkl
  430.  
  431.         lda   chkh
  432.  
  433.         adc   #$00
  434.  
  435.         sta   chkh
  436.  
  437.         tya       
  438.  
  439.         rts 
  440.  
  441. ;       ** output one byte **
  442.  
  443. outbtc  jsr   chkt      compare chksum                195e
  444.  
  445. outbt   tay             savx data byte
  446.  
  447.         lsr   a         shift off lsd
  448.  
  449.         lsr   a
  450.  
  451.         lsr   a
  452.  
  453.         lsr   a
  454.  
  455.         jsr   hexout    output msd
  456.  
  457.         tya 
  458.  
  459.         jsr   hexout    output lsd
  460.  
  461.         tya  
  462.  
  463.         rts 
  464.  
  465. ;       ** convert lsd of a to ascii, output to tape **
  466.  
  467. hexout  and   #$0f                                    196f
  468.  
  469.         cmp   #$0a      
  470.  
  471.         clc   
  472.  
  473.         bmi   hex1
  474.  
  475.         adc   #$07
  476.  
  477. hex1    adc   #$30
  478.  
  479. ;       ** output to tape one ascii char **
  480.  
  481. outcht  stx   savx                                    197a
  482.  
  483.         sty   savx+1
  484.  
  485.         ldy   #$08      start bit
  486.  
  487. cht1    jsr   one                  
  488.  
  489.         lsr   a         get data bit
  490.  
  491.         bcs   cht2 
  492.  
  493.         jsr   one       data bit=1
  494.  
  495.         jmp   cht3
  496.  
  497. cht2    jsr   zro       data bit=0 
  498.  
  499. cht3    jsr   zro                  
  500.  
  501.         dey
  502.  
  503.         bne   cht1
  504.  
  505.         ldx   savx
  506.  
  507.         ldy   savx+1
  508.  
  509.         rts
  510.  
  511. ;       ** output 1 to tape, 9 pulses, 138 us each **
  512.  
  513. one     ldx   #$09                                    199e
  514.  
  515.         pha             savx a
  516.  
  517. one1    bit   clkrdi    wait for time out             19a1
  518.  
  519.         bpl   one1
  520.  
  521.         lda   #126
  522.  
  523.         sta   clk1t
  524.  
  525.         lda   #$a7 
  526.  
  527.         sta   sbd       set pb7 = 1
  528.  
  529. one2    bit   clkrdi                                  19b0
  530.  
  531.         bpl   one2 
  532.  
  533.         lda   #126
  534.  
  535.         sta   clk1t
  536.  
  537.         lda   #$27 
  538.  
  539.         sta   sbd       reset pb7=0
  540.  
  541.         dex   
  542.  
  543.         bne   one1
  544.  
  545.         pla  
  546.  
  547.         rts  
  548.  
  549. ;       ** output 0 to tape, 6 pulses, 207 us each **
  550.  
  551. zro     ldx   #$06                                    19c4
  552.  
  553.         pha             savx a
  554.  
  555. zro1    bit   clkrdi                                  19c7
  556.  
  557.         bpl   zro1 
  558.  
  559.         lda   #$c3 
  560.  
  561.         sta   clk1t
  562.  
  563.         lda   #$a7 
  564.  
  565.         sta   sbd       set pb7=1
  566.  
  567. zro2    bit   clkrdi
  568.  
  569.         bpl   zro2 
  570.  
  571.         lda   #195 
  572.  
  573.         sta   clk1t
  574.  
  575.         lda   #$27 
  576.  
  577.         sta   sbd       reset pb7=0
  578.  
  579.         dex        
  580.  
  581.         bne   zro1
  582.  
  583.         pla             restore a
  584.  
  585.         rts
  586.  
  587. ;       ** sub to inc veb+1,2 **
  588.  
  589. incveb  inc   veb+1                                   19ea
  590.  
  591.         bne   incve1
  592.  
  593.         inc   veb+2
  594.  
  595. incve1  rts     
  596.  
  597. ;       ** sub to read byte from tape **
  598.  
  599. rdbyt   jsr   rdcht                                   19f3
  600.  
  601.         jsr   packt
  602.  
  603.         jsr   rdcht
  604.  
  605.         jsr   packt
  606.  
  607.         rts
  608.  
  609. ;       ** pack a=ascii into savx as hex data **
  610.  
  611. packt   cmp   #$30                                    1a00
  612.  
  613.         bmi   packt3
  614.  
  615.         cmp   #$47
  616.  
  617.         bpl   packt3
  618.  
  619.         cmp   #$40  
  620.  
  621.         bmi   packt1
  622.  
  623.         clc         
  624.  
  625.         adc   #$09  
  626.  
  627. packt1  rol   a
  628.  
  629.         rol   a
  630.  
  631.         rol   a
  632.  
  633.         rol   a
  634.  
  635.         ldy   #$04
  636.  
  637. packt2  rol   a
  638.  
  639.         rol   savx
  640.  
  641.         dey          
  642.  
  643.         bne   packt2
  644.  
  645.         lda   savx
  646.  
  647.         ldy   #$00      y=0 valid hex char
  648.  
  649.         rts
  650.  
  651. packt3  iny             y=1 not hex
  652.  
  653.         rts
  654.  
  655. ;       ** get 1 char from tape and return with 
  656.  
  657. ;          char in a.  use savx+1 to asm char  **
  658.  
  659. rdcht   stx   savx+2                                  1a24
  660.  
  661.         ldx   #$08      read 8 bits
  662.  
  663. rdcht1  jsr   rdbit     get next data bit
  664.  
  665.         lsr   savx+1    right shift char
  666.  
  667.         ora   savx+1    or in sign bit
  668.  
  669.         sta   savx+1    replace char
  670.  
  671.         dex          
  672.  
  673.         bne   rdcht1
  674.  
  675.         lda   savx+1    move char into a
  676.  
  677.         rol   a         shift off parity
  678.  
  679.         lsr   a
  680.  
  681.         ldx   savx+2
  682.  
  683.         rts
  684.  
  685. ;       ** this sub gets one bit from tape and
  686.  
  687. ;          returns it in sign of a  **
  688.  
  689. rdbit   bit   sbd       wait for end of start bit     1a41
  690.  
  691.         bpl   rdbit
  692.  
  693.         lda   clkrdt    get start bit time
  694.  
  695.         ldy   #$ff      a=256-t1    
  696.  
  697.         sty   clk64t    set up timer
  698.  
  699.         ldy   #$14  
  700.  
  701. rdbit3  dey             delay 100 micro sec
  702.  
  703.         bne   rdbit3
  704.  
  705. rdbit2  bit   sbd
  706.  
  707.         bmi   rdbit2    wait for next start bit
  708.  
  709.         sec   
  710.  
  711.         sbc   clkrdt    (256-t1)-(256-t2)=t2-t1
  712.  
  713.         ldy   #$ff
  714.  
  715.         sty   clk64t    set up timer for next bit
  716.  
  717.         ldy   #$07
  718.  
  719. rdbit4  dey             delay 50 microsec
  720.  
  721.         bne   rdbit4
  722.  
  723.         eor   #$ff      complement sign of a
  724.  
  725.         and   #$80      mask all except sign
  726.  
  727.         rts 
  728.  
  729. ;       ** pllcal output 166 microsec (6024 hz)
  730.  
  731. ;          pulse string 
  732.  
  733. pllcal  lda   #$27                                    1a6b
  734.  
  735.         sta   sbd       turn off datin pb5=1
  736.  
  737.         lda   #$bf      convert pb7 to output
  738.  
  739.         sta   pbdd
  740.  
  741. pll1    bit   clkrdi
  742.  
  743.         bpl   pll1  
  744.  
  745.         lda   #154      wait 166 microsec
  746.  
  747.         sta   clk1t
  748.  
  749.         lda   #$a7      output pb7=1
  750.  
  751.         sta   sbd
  752.  
  753. pll2    bit   clkrdi
  754.  
  755.         bpl   pll2 
  756.  
  757.         lda   #154
  758.  
  759.         sta   clk1t
  760.  
  761.         lda   #$27      pb7=0
  762.  
  763.         sta   sbd
  764.  
  765.         jmp   pll1
  766.  
  767. ;
  768.  
  769. ;       ** interrupts **
  770.  
  771.         *=    $1bfa
  772.  
  773. nmip27  .word pllcal
  774.  
  775. rstp27  .word pllcal
  776.  
  777. irqp27  .word pllcal
  778.  
  779. ;
  780.  
  781. ;******************* 6530-002 i.c. *****************
  782.  
  783. ;       ** copyright mos technology inc.
  784.  
  785. ;          date oct 13, 1975 rev e
  786.  
  787. ;
  788.  
  789. ;       ** kim **
  790.  
  791. ;         tty interface   6530-002
  792.  
  793. ;         keyboard interface,
  794.  
  795. ;         7-segment 6-digit display
  796.  
  797. ;
  798.  
  799. ;       tty comands:
  800.  
  801. ;         g    goexec
  802.  
  803. ;         cr   open next cell
  804.  
  805. ;         lf   open previous cell
  806.  
  807. ;         .    modify open cell
  808.  
  809. ;         sp   open new cell
  810.  
  811. ;         l    load (object format)
  812.  
  813. ;         q    dump from open cell addr to hi limit
  814.  
  815. ;         ro   rub out - return to start kim
  816.  
  817. ;               (all illegal chars are ignored)
  818.  
  819. ;
  820.  
  821. ;       keyboard commands:
  822.  
  823. ;         addr  sets mode to modify cell address
  824.  
  825. ;         data  sets mode to modify data in open cell
  826.  
  827. ;         step  increments to next cell
  828.  
  829. ;         rst   system reset
  830.  
  831. ;         run   goexec
  832.  
  833. ;         stop  $1c00 can be loaded into nmiv to use
  834.  
  835. ;         pc    display pc (program counter)
  836.  
  837. ;         
  838.  
  839.         *=      $1c00
  840.  
  841. save    sta   acc       kim entry via stop (nmi)      1c00
  842.  
  843.         pla             or brk (irq)
  844.  
  845.         sta   preg
  846.  
  847.         pla             kim entry via jsr (a lost)    1c05
  848.  
  849.         sta   pcl
  850.  
  851.         sta   pointl
  852.  
  853.         pla         
  854.  
  855.         sta   pch
  856.  
  857.         sta   pointh
  858.  
  859.         sty   yreg
  860.  
  861.         stx   xreg
  862.  
  863.         tsx   
  864.  
  865.         stx   spuser
  866.  
  867.         jsr   inits
  868.  
  869.         jmp   start
  870.  
  871. ;
  872.  
  873. nmit    jmp   (nmiv)    non-maskable interrupt trap   1c1c
  874.  
  875. irqt    jmp   (irqv)    interrupt trap                1c1f
  876.  
  877. rst     ldx   #$ff      kim entry via rst             1c22
  878.  
  879.         txs
  880.  
  881.         stx   spuser
  882.  
  883.         jsr   inits
  884.  
  885.         lda   #$ff      count start bit
  886.  
  887.         sta   cnth30    zero cnth30
  888.  
  889.         lda   #$01      mask hi order bits
  890.  
  891. det1    bit   sad       test                          1c31
  892.  
  893.         bne   start     keybd ssw test
  894.  
  895.         bmi   det1      start bit test
  896.  
  897.         lda   #$fc
  898.  
  899. det3    clc             this loop counts              1c3a
  900.  
  901.         adc   #$01      the start bit time
  902.  
  903.         bcc   det2
  904.  
  905.         inc   cnth30
  906.  
  907. det2    ldy   sad       check for end of start bit    1c42
  908.  
  909.         bpl   det3
  910.  
  911.         sta   cntl30
  912.  
  913.         ldx   #$08
  914.  
  915.         jsr   get5      get rest of the char, test char
  916.  
  917. ;       ** make tty/kb selection **
  918.  
  919. start   jsr   init1                                   1c4f
  920.  
  921.         lda   #$01
  922.  
  923.         bit   sad
  924.  
  925.         bne   ttykb
  926.  
  927.         jsr   crlf      prt cr lf
  928.  
  929.         ldx   #$0a      type out kim
  930.  
  931.         jsr   prtst
  932.  
  933.         jmp   show1
  934.  
  935. ;
  936.  
  937. clear   lda   #$00
  938.  
  939.         sta   inl       clear input buffer
  940.  
  941.         sta   inh
  942.  
  943. read    jsr   getch     get char
  944.  
  945.         cmp   #$01      
  946.  
  947.         beq   ttykb
  948.  
  949.         jsr   pack
  950.  
  951.         jmp   scan
  952.  
  953. ;       ** main routine for keyboard and display **
  954.  
  955. ttykb   jsr   scand     if a=0 no key                 1c77
  956.  
  957.         bne   start
  958.  
  959. ttykb1  lda   #$01
  960.  
  961.         bit   sad 
  962.  
  963.         beq   start
  964.  
  965.         jsr   scand
  966.  
  967.         beq   ttykb1
  968.  
  969.         jsr   scand
  970.  
  971.         beq   ttykb1
  972.  
  973.         jsr   getkey
  974.  
  975.         cmp   #$15  
  976.  
  977.         bpl   start
  978.  
  979.         cmp   #$14
  980.  
  981.         beq   pccmd     display pc
  982.  
  983.         cmp   #$10      addr mode=1
  984.  
  985.         beq   addrm
  986.  
  987.         cmp   #$11      data mode=1
  988.  
  989.         beq   datam
  990.  
  991.         cmp   #$12      step
  992.  
  993.         beq   step
  994.  
  995.         cmp   #$13      run
  996.  
  997.         beq   gov
  998.  
  999.         asl   a         shift char into high
  1000.  
  1001.         asl   a         order nibble
  1002.  
  1003.         asl   a
  1004.  
  1005.         asl   a
  1006.  
  1007.         sta   temp      store in temp
  1008.  
  1009.         ldx   #$04
  1010.  
  1011. data1   ldy   mode      test mode 1=addr
  1012.  
  1013.         bne   addr      mode=0 data
  1014.  
  1015.         lda   (pointl),y   get data
  1016.  
  1017.         asl   temp      shift char
  1018.  
  1019.         rol   a         shift data
  1020.  
  1021.         sta   (pointl),y  store out data
  1022.  
  1023.         jmp   data2
  1024.  
  1025. ;
  1026.  
  1027. addr    asl   a         shift char
  1028.  
  1029.         rol   pointl    shift addr
  1030.  
  1031.         rol   pointh    shift addr hi
  1032.  
  1033. data2   dex   
  1034.  
  1035.         bne   data1     do 4 times
  1036.  
  1037.         beq   datam2    exit here
  1038.  
  1039. addrm   lda   #$01
  1040.  
  1041.         bne   datam1
  1042.  
  1043. datam   lda   #$00 
  1044.  
  1045. datam1  sta   mode 
  1046.  
  1047. datam2  jmp   start
  1048.  
  1049. ;
  1050.  
  1051. step    jsr   incpt                                   1cd3
  1052.  
  1053.         jmp   start
  1054.  
  1055. ;
  1056.  
  1057. gov     jmp   goexec                                  1cd9
  1058.  
  1059. ;       ** display pc by moving pc to point **
  1060.  
  1061. pccmd   lda   pcl                                     1cdc
  1062.  
  1063.         sta   pointl
  1064.  
  1065.         lda   pch
  1066.  
  1067.         sta   pointh
  1068.  
  1069.         jmp   start
  1070.  
  1071. ;       ** load paper tape from tty **
  1072.  
  1073. load    jsr   getch     look for first char           1ce7
  1074.  
  1075.         cmp   #$3b      semicolon
  1076.  
  1077.         bne   load
  1078.  
  1079.         lda   #$00
  1080.  
  1081.         sta   chksum
  1082.  
  1083.         sta   chkhi
  1084.  
  1085.         jsr   getbyt    get byte count
  1086.  
  1087.         tax             save in x index
  1088.  
  1089.         jsr   chk       compute checksum
  1090.  
  1091.         jsr   getbyt    get address hi
  1092.  
  1093.         sta   pointh
  1094.  
  1095.         jsr   chk
  1096.  
  1097.         jsr   getbyt    get address lo
  1098.  
  1099.         sta   pointl
  1100.  
  1101.         jsr   chk
  1102.  
  1103.         txa             if cnt=0 dont
  1104.  
  1105.         beq   load3     get any data
  1106.  
  1107. load2   jsr   getbyt    get data
  1108.  
  1109.         sta   (pointl),y  store data
  1110.  
  1111.         jsr   chk
  1112.  
  1113.         jsr   incpt     next address
  1114.  
  1115.         dex    
  1116.  
  1117.         bne   load2
  1118.  
  1119.         inx             x=1 data rcd x=0 last rcd
  1120.  
  1121. load3   jsr   getbyt    compare chksum
  1122.  
  1123.         cmp   chkhi
  1124.  
  1125.         bne   loade1
  1126.  
  1127.         jsr   getbyt
  1128.  
  1129.         cmp   chksum
  1130.  
  1131.         bne   loader
  1132.  
  1133.         txa             x=0 last record
  1134.  
  1135.         bne   load
  1136.  
  1137.         ldx   #$0c      x-off kim
  1138.  
  1139. load8   lda   #$27
  1140.  
  1141.         sta   sbd       disable data in
  1142.  
  1143.         jsr   prtst
  1144.  
  1145.         jmp   start
  1146.  
  1147. ;
  1148.  
  1149. loade1  jsr   getbyt    dummy
  1150.  
  1151. loader  ldx   #$11      x-off err kim
  1152.  
  1153.         bne   load8
  1154.  
  1155. ;       ** dump to tty from open cell address to 
  1156.  
  1157. ;          limhl, limhh **
  1158.  
  1159. dump    lda   #$00                                    1d42
  1160.  
  1161.         sta   inl
  1162.  
  1163.         sta   inh       clear record count
  1164.  
  1165. dump0   lda   #$00
  1166.  
  1167.         sta   chkhi     clear chksum
  1168.  
  1169.         sta   chksum
  1170.  
  1171.         jsr   crlf      print cr lf
  1172.  
  1173.         lda   #$3b      print semicolon
  1174.  
  1175.         jsr   outch
  1176.  
  1177.         lda   pointl    test point gt or et
  1178.  
  1179.         cmp   eal       hi limit goto exit
  1180.  
  1181.         lda   pointh
  1182.  
  1183.         sbc   eah
  1184.  
  1185.         bcc   dump4
  1186.  
  1187.         lda   #$00      print last record
  1188.  
  1189.         jsr   prtbyt    0 bytes
  1190.  
  1191.         jsr   open
  1192.  
  1193.         jsr   prtpnt
  1194.  
  1195.         lda   chkhi     print chksum
  1196.  
  1197.         jsr   prtbyt    for last record
  1198.  
  1199.         lda   chksum
  1200.  
  1201.         jsr   prtbyt
  1202.  
  1203.         jmp   clear
  1204.  
  1205. ;
  1206.  
  1207. dump4   lda   #$18      print 24 byte count           1d7a
  1208.  
  1209.         tax             save as index
  1210.  
  1211.         jsr   prtbyt
  1212.  
  1213.         jsr   chk
  1214.  
  1215.         jsr   prtpnt
  1216.  
  1217. dump2   ldy   #$00      print 24 bytes
  1218.  
  1219.         lda   (pointl),y  get data
  1220.  
  1221.         jsr   prtbyt    print data
  1222.  
  1223.         jsr   chk       compute chksum
  1224.  
  1225.         jsr   incpt     increment point
  1226.  
  1227.         dex
  1228.  
  1229.         bne   dump2
  1230.  
  1231.         lda   chkhi     print chksum
  1232.  
  1233.         jsr   prtbyt
  1234.  
  1235.         lda   chksum
  1236.  
  1237.         jsr   prtbyt
  1238.  
  1239.         inc   inl       incr record count
  1240.  
  1241.         bne   dump3
  1242.  
  1243.         inc   inh
  1244.  
  1245. dump3   jmp   dump0
  1246.  
  1247. ;
  1248.  
  1249. space   jsr   open      open new cell                 1da9
  1250.  
  1251. show    jsr   crlf      print cr lf
  1252.  
  1253. show1   jsr   prtpnt
  1254.  
  1255.         jsr   outsp     print space
  1256.  
  1257.         ldy   #$00      print data specified
  1258.  
  1259.         lda   (pointl),y  by point ad=lda ext
  1260.  
  1261.         jsr   prtbyt
  1262.  
  1263.         jsr   outsp     print space
  1264.  
  1265.         jmp   clear
  1266.  
  1267. ;
  1268.  
  1269. rtrn    jsr   incpt     open next cell                1dc2
  1270.  
  1271.         jmp   show
  1272.  
  1273. ;
  1274.  
  1275. goexec  ldx   spuser                                  1dc8
  1276.  
  1277.         txs   
  1278.  
  1279.         lda   pointh    program runs from
  1280.  
  1281.         pha             open cell address
  1282.  
  1283.         lda   pointl
  1284.  
  1285.         pha      
  1286.  
  1287.         lda   preg
  1288.  
  1289.         pha       
  1290.  
  1291.         ldx   xreg      restore regs
  1292.  
  1293.         ldy   yreg
  1294.  
  1295.         lda   acc
  1296.  
  1297.         rti
  1298.  
  1299. ;
  1300.  
  1301. scan    cmp   #$20      open cell
  1302.  
  1303.         beq   space
  1304.  
  1305.         cmp   #$7f      rub out (kim)
  1306.  
  1307.         beq   stv
  1308.  
  1309.         cmp   #$0d      next cell
  1310.  
  1311.         beq   rtrn
  1312.  
  1313.         cmp   #$0a      prev cell
  1314.  
  1315.         beq   feed
  1316.  
  1317.         cmp   #'.       modify cell
  1318.  
  1319.         beq   modify
  1320.  
  1321.         cmp   #'g       go exec
  1322.  
  1323.         beq   goexec
  1324.  
  1325.         cmp   #'q       dump from open cell to hi limit
  1326.  
  1327.         beq   dumpv
  1328.  
  1329.         cmp   #'l       load tape
  1330.  
  1331.         beq   loadv
  1332.  
  1333.         jmp   read      ignore illegal char
  1334.  
  1335. ;
  1336.  
  1337. stv     jmp   start
  1338.  
  1339. dumpv   jmp   dump
  1340.  
  1341. loadv   jmp   load 
  1342.  
  1343. ;
  1344.  
  1345. feed    sec                                           1e07
  1346.  
  1347.         lda   pointl    dec double byte
  1348.  
  1349.         sbc   #$01      at pointl and pointh
  1350.  
  1351.         sta   pointl
  1352.  
  1353.         bcs   feed1
  1354.  
  1355.         dec   pointh
  1356.  
  1357. feed1   jmp   show
  1358.  
  1359. ;
  1360.  
  1361. modify  ldy   #$00      get contents of input buff 
  1362.  
  1363.         lda   inl       inl and store in loc
  1364.  
  1365.         sta   (pointl),y  specified by point
  1366.  
  1367.         jmp   rtrn 
  1368.  
  1369. ;
  1370.  
  1371. ;       ** subroutines follow **
  1372.  
  1373. prtpnt  lda   pointh    print pointl, pointh          1e1e
  1374.  
  1375.         jsr   prtbyt
  1376.  
  1377.         jsr   chk
  1378.  
  1379.         lda   pointl
  1380.  
  1381.         jsr   prtbyt
  1382.  
  1383.         jsr   chk
  1384.  
  1385.         rts
  1386.  
  1387. ;       **print string of ascii chars from top+x to top
  1388.  
  1389. crlf    ldx   #$07    
  1390.  
  1391. prtst   lda   top,x 
  1392.  
  1393.         jsr   outch
  1394.  
  1395.         dex 
  1396.  
  1397.         bpl   prtst     stop on index zero
  1398.  
  1399.         rts
  1400.  
  1401. ;       ** print 1 hex byte as 2 ascii chars **
  1402.  
  1403. prtbyt  sta   temp                                    1e3b
  1404.  
  1405.         lsr   a         shift char right 4 bits
  1406.  
  1407.         lsr   a
  1408.  
  1409.         lsr   a
  1410.  
  1411.         lsr   a
  1412.  
  1413.         jsr   hexta     convert to hex and print
  1414.  
  1415.         lda   temp      get other half
  1416.  
  1417.         jsr   hexta     convert to hex and print
  1418.  
  1419.         lda   temp      restore byte in a and return
  1420.  
  1421.         rts   
  1422.  
  1423. hexta   and   #$0f      mask hi 4 bits
  1424.  
  1425.         cmp   #$0a
  1426.  
  1427.         clc       
  1428.  
  1429.         bmi   hexta1
  1430.  
  1431.         adc   #$07      alpha hex
  1432.  
  1433. hexta1  adc   #$30      dec hex
  1434.  
  1435.         jmp   outch     print char
  1436.  
  1437. ;       ** get 1 char from tty, char in a
  1438.  
  1439. getch   stx   tmpx      save x reg     1e5a
  1440.  
  1441.         ldx   #$08      set up 8-bit count
  1442.  
  1443.         lda   #$01
  1444.  
  1445. get1    bit   sad
  1446.  
  1447.         bne   get6 
  1448.  
  1449.         bmi   get1      wait for start bit
  1450.  
  1451.         jsr   delay     delay 1 bit
  1452.  
  1453. get5    jsr   dehalf    delay 1/2 bit time
  1454.  
  1455. get2    lda   sad       get 8 bits
  1456.  
  1457.         and   #$80      mask off low order bits
  1458.  
  1459.         lsr   char      shift right char
  1460.  
  1461.         ora   char
  1462.  
  1463.         sta   char
  1464.  
  1465.         jsr   delay     delay 1 bit time
  1466.  
  1467.         dex  
  1468.  
  1469.         bne   get2      get next char
  1470.  
  1471.         jsr   dehalf    exit this routine
  1472.  
  1473.         ldx   tmpx
  1474.  
  1475.         lda   char
  1476.  
  1477.         rol   a shift off parity
  1478.  
  1479.         lsr   a
  1480.  
  1481. get6    rts   
  1482.  
  1483. ;       ** initialization for sigma **
  1484.  
  1485. inits   ldx   #$01      set kb mode to addr           1e88
  1486.  
  1487.         stx   mode
  1488.  
  1489. init1   ldx   #$00      
  1490.  
  1491.         stx   padd      for sigma use sadd
  1492.  
  1493.         ldx   #$3f
  1494.  
  1495.         stx   pbdd      for sigma use sbdd
  1496.  
  1497.         ldx   #$07      enable data in
  1498.  
  1499.         stx   sbd       output
  1500.  
  1501.         cld    
  1502.  
  1503.         sei    
  1504.  
  1505.         rts
  1506.  
  1507. ;       ** print one char in a **
  1508.  
  1509. outsp   lda   #$20      print space                   1e9e
  1510.  
  1511. outch   sta   char
  1512.  
  1513.         stx   tmpx
  1514.  
  1515.         jsr   delay     delay 10/11 bit code sync
  1516.  
  1517.         lda   sbd       start bit
  1518.  
  1519.         and   #$fe
  1520.  
  1521.         sta   sbd
  1522.  
  1523.         jsr   delay
  1524.  
  1525.         ldx   #$08 
  1526.  
  1527. out1    lda   sbd       data bit
  1528.  
  1529.         and   #$fe 
  1530.  
  1531.         lsr   char
  1532.  
  1533.         adc   #$00
  1534.  
  1535.         sta   sbd  
  1536.  
  1537.         jsr   delay
  1538.  
  1539.         dex  
  1540.  
  1541.         bne   out1
  1542.  
  1543.         lda   sbd       stop bit
  1544.  
  1545.         ora   #$01
  1546.  
  1547.         sta   sbd
  1548.  
  1549.         jsr   delay     stop bit
  1550.  
  1551.         ldx   tmpx      restore index
  1552.  
  1553.         rts
  1554.  
  1555. ;       ** delay 1 bit time **
  1556.  
  1557. delay   lda   cnth30                                  1ed4
  1558.  
  1559.         sta   timh
  1560.  
  1561.         lda   cntl30
  1562.  
  1563. de2     sec   
  1564.  
  1565. de4     sbc   #$01 
  1566.  
  1567.         bcs   de3  
  1568.  
  1569.         dec   timh
  1570.  
  1571. de3     ldy   timh
  1572.  
  1573.         bpl   de2
  1574.  
  1575.         rts
  1576.  
  1577. ;       ** delay 1/2 bit time **
  1578.  
  1579. dehalf  lda   cnth30                                  1eeb  
  1580.  
  1581.         sta   timh
  1582.  
  1583.         lda   cntl30
  1584.  
  1585.         lsr   a
  1586.  
  1587.         lsr   timh
  1588.  
  1589.         bcc   de2
  1590.  
  1591.         ora   #$80
  1592.  
  1593.         bcs   de4
  1594.  
  1595. ;       ** sub to determine if key is depressed or 
  1596.  
  1597. ;          condition of ssw key not depressed or
  1598.  
  1599. ;          tty mode  a=0
  1600.  
  1601. ;          key depressed or kb mode  a not zero
  1602.  
  1603. ak      ldy   #$03      3 rows
  1604.  
  1605.         ldx   #$01      digit 0
  1606.  
  1607. onekey  lda   #$ff
  1608.  
  1609. ak1     stx   sbd       output digit
  1610.  
  1611.         inx             get next digit
  1612.  
  1613.         inx 
  1614.  
  1615.         and   sad       input segments
  1616.  
  1617.         dey 
  1618.  
  1619.         bne   ak1
  1620.  
  1621.         ldy   #$07
  1622.  
  1623.         sty   sbd
  1624.  
  1625.         ora   #$80
  1626.  
  1627.         eor   #$ff
  1628.  
  1629.         rts 
  1630.  
  1631. ;       ** output to 7-segment display **
  1632.  
  1633. scand   ldy   #$00      get data                      1f19 
  1634.  
  1635.         lda   (pointl),y  specified by point
  1636.  
  1637.         sta   inh       set up display buffer
  1638.  
  1639.         lda   #$7f      change seg
  1640.  
  1641.         sta   padd      to output
  1642.  
  1643.         ldx   #$09      init digit number
  1644.  
  1645.         ldy   #$03      output 3 bytes
  1646.  
  1647. scand1  lda   inl,y     get byte
  1648.  
  1649.         lsr   a         get msd
  1650.  
  1651.         lsr   a
  1652.  
  1653.         lsr   a
  1654.  
  1655.         lsr   a
  1656.  
  1657.         jsr   convd     output char
  1658.  
  1659.         lda   inl,y     get byte again
  1660.  
  1661.         and   #$0f      get lsd
  1662.  
  1663.         jsr   convd     output char
  1664.  
  1665.         dey             set up for next byte
  1666.  
  1667.         bne   scand1
  1668.  
  1669.         stx   sbd       all digits off
  1670.  
  1671.         lda   #$00      change segment
  1672.  
  1673.         sta   padd      to inputs
  1674.  
  1675.         jmp   ak        get any key
  1676.  
  1677. ;       ** convert and display hex (used by scand only)**
  1678.  
  1679. convd   sty   temp
  1680.  
  1681.         tay             save y
  1682.  
  1683.         lda   table,y   use char as index
  1684.  
  1685.         ldy   #$00      lookup conversion
  1686.  
  1687.         sty   sad       turn off segments
  1688.  
  1689.         stx   sbd       output digit enable
  1690.  
  1691.         sta   sad       output segments
  1692.  
  1693.         ldy   #$7f      delay 500 cycles
  1694.  
  1695. convd1  dey   
  1696.  
  1697.         bne   convd1
  1698.  
  1699.         inx             get next digit number
  1700.  
  1701.         inx             add 2
  1702.  
  1703.         ldy   temp      restore y
  1704.  
  1705.         rts
  1706.  
  1707. ;       ** increment point **
  1708.  
  1709. incpt   inc   pointl
  1710.  
  1711.         bne   incpt2
  1712.  
  1713.         inc   pointh
  1714.  
  1715. incpt2  rts   
  1716.  
  1717. ;       ** get key from keypad a=keyvalue **
  1718.  
  1719. getkey  ldx   #$21      start at digit 0              1f6a 
  1720.  
  1721. getke5  ldy   #$01      get 1 row
  1722.  
  1723.         jsr   onekey
  1724.  
  1725.         bne   keyin     a=0 no key
  1726.  
  1727.         cpx   #$27      test for digit 2
  1728.  
  1729.         bne   getke5
  1730.  
  1731.         lda   #$15      15=nokey
  1732.  
  1733.         rts
  1734.  
  1735. keyin   ldy   #$ff      
  1736.  
  1737. keyin1  asl   a         shift left
  1738.  
  1739.         bcs   keyin2    until y=key no
  1740.  
  1741.         iny   
  1742.  
  1743.         bpl   keyin1
  1744.  
  1745. keyin2  txa  
  1746.  
  1747.         and   #$0f      mask msd
  1748.  
  1749.         lsr   a         divide by 2
  1750.  
  1751.         tax   
  1752.  
  1753.         tya   
  1754.  
  1755.         bpl   keyin4
  1756.  
  1757. keyin3  clc   
  1758.  
  1759.         adc   #$07      mult (x-1 times a
  1760.  
  1761. keyin4  dex   
  1762.  
  1763.         bne   keyin3
  1764.  
  1765.         rts
  1766.  
  1767. ;       ** compute checksum **
  1768.  
  1769. chk     clc   
  1770.  
  1771.         adc   chksum
  1772.  
  1773.         sta   chksum
  1774.  
  1775.         lda   chkhi
  1776.  
  1777.         adc   #$00
  1778.  
  1779.         sta   chkhi
  1780.  
  1781.         rts
  1782.  
  1783. ;       ** get 2 hex chars and pack into inl and inh **
  1784.  
  1785. getbyt  jsr   getch
  1786.  
  1787.         jsr   pack
  1788.  
  1789.         jsr   getch
  1790.  
  1791.         jsr   pack
  1792.  
  1793.         lda   inl
  1794.  
  1795.         rts
  1796.  
  1797. ;       ** shift char in a into inl and inh **
  1798.  
  1799. pack    cmp   #$30      check for hex  1fac
  1800.  
  1801.         bmi   updat2
  1802.  
  1803.         cmp   #$47      not hex exit
  1804.  
  1805.         bpl   updat2
  1806.  
  1807.         cmp   #$40      convert to hex
  1808.  
  1809.         bmi   update
  1810.  
  1811.         clc   
  1812.  
  1813.         adc   #$09
  1814.  
  1815. update  rol   a
  1816.  
  1817.         rol   a
  1818.  
  1819.         rol   a
  1820.  
  1821.         rol   a
  1822.  
  1823.         ldy   #$04      shift into i/o buffer
  1824.  
  1825. updat1  rol   a 
  1826.  
  1827.         rol   inl
  1828.  
  1829.         rol   inh
  1830.  
  1831.         dey   
  1832.  
  1833.         bne   updat1
  1834.  
  1835.         lda   #$00      a=0 if hex num
  1836.  
  1837. updat2  rts   
  1838.  
  1839. ;
  1840.  
  1841. open    lda   inl       move i/o buffer to point
  1842.  
  1843.         sta   pointl
  1844.  
  1845.         lda   inh       transfer inh- pointh
  1846.  
  1847.         sta   pointh
  1848.  
  1849.         rts
  1850.  
  1851. ;
  1852.  
  1853. ;       ** tables **
  1854.  
  1855. top     .dbyte $0000,$0000,$0000,$0a0d                1fd5
  1856.  
  1857.         .byte  'm,'i,'k,$20,$13         kim
  1858.  
  1859.         .byte  'r,'r,'e,$20,$13         err
  1860.  
  1861. table   .dbyte $bf86,$dbcf,$e6ed,$fd87 ;0-7           1fe7
  1862.  
  1863.         .dbyte $ffef,$f7fc,$b9de,$f9f1 ;8-f hex to 7-seg
  1864.  
  1865. ;
  1866.  
  1867. ;       ** interrupt vectors **
  1868.  
  1869.         *=    $1ffa
  1870.  
  1871. nmient  .word nmit
  1872.  
  1873. rstent  .word rst
  1874.  
  1875. irqent  .word irqt
  1876.  
  1877.         .end
  1878.  
  1879.  
  1880.  
  1881.