home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / schematics / kim-1 / kim.asm < prev    next >
Assembly Source File  |  1997-10-19  |  34KB  |  1,136 lines

  1. ;
  2. ; lAST UPDATE: 19 oCTOBER 1997
  3. ;
  4. ;
  5. ; tHE SOURCECODE IS COPIED FROM 'kim-1 manual' RELEASED BY mos tECHNOLOGIES
  6. ; AND THIS MEANS THAT SOMEONE PROBABLY HAS THE COPYRIGHTS OF IT. uNTIL 
  7. ; SOMEONE CLEARS THE MESS AROUND 'WHO OWNS WHAT FROM cOMMODORE', LEAVE THIS
  8. ; REMARK IN THE SOURCECODE AS A SIGN OF ACKNOWLEDGEMENT AND RESPECT IN CASE
  9. ; YOU INTEND TO USE IT FOR YOUR OWN PURPOSES.
  10. ;
  11. ;
  12. ; i HAVE CHECKED THE src LINE BY LINE AND ADDED SOME COMMENT OF MY OWN. aT 
  13. ; THIS MOMENT IT DOES NOT MEAN THAT IT IS WITHOUT FAULTS. i ONLY WILL BE 
  14. ; SURE ABOUT THAT UNTIL i HAVE COMPILED THE src AND FOUND NO DIFFERENCES
  15. ; WITH THE ORIGINAL bin.
  16. ;
  17. ;
  18. ; tHE src CAN BE ASSEMBLED WITH MY OWN PROGRAMMED ASSEMBLER. tHIS ASSEMBLER
  19. ; FOR THE pc IS AVAILABLE AS FREEWARE, INCLUDING SOURCECODE FOR tURBO pASCAL.
  20. ;
  21. ;
  22. ; sOURCODE OF THE kim-1
  23. ;
  24. .EQ pcl          = $ef               ; PROGRAMCOUNTER LOW
  25. .EQ pch          = $f0               ; PROGRAMCOUNTER HIGH
  26. .EQ preg         = $f1               ; STATUSREGISTER
  27. .EQ spuser       = $f2               ; STACKPOINTER
  28.  
  29. .EQ acc          = $f3
  30. .EQ yreg         = $f4
  31. .EQ xreg         = $f5
  32. .EQ chkhi        = $f6
  33. .EQ chksum       = $f7
  34.  
  35. .EQ inl          = $f8               ; INPUTBUFFER LOW
  36. .EQ inh          = $f9               ; INPUTBUFFER HIGH
  37. .EQ pointl       = $fa               ; ADDRESSl ON DISPLAY
  38. .EQ pointh       = $fb               ; ADDRESSh ON DISPLAY
  39. .EQ temp         = $fc
  40. .EQ tmpx         = $fd
  41. .EQ char         = $fe
  42. .EQ mode         = $ff
  43.  
  44. .EQ inl_a        = $00f8             ; inl AS ABSOLUTE ADDRESS
  45. ;
  46. .EQ chkl         = $17e7
  47. .EQ chkh         = chkl+1
  48. .EQ savx         = chkl+2
  49. .EQ veb          = chkl+5
  50. .EQ cntl30       = chkl+11
  51. .EQ cnth30       = chkl+12
  52. .EQ timh         = chkl+13
  53. .EQ sal          = chkl+14
  54. .EQ sah          = chkl+15
  55. .EQ eal          = chkl+16
  56. .EQ eah          = chkl+17
  57. .EQ id           = chkl+18
  58. .EQ nmiv         = chkl+19           ; nmi-VECTOR
  59. .EQ rstv         = chkl+21           ; reset-VECTOR
  60. .EQ irqv         = chkl+23           ; irq-VECTOR
  61. ;
  62. .EQ sad          = $1740
  63. .EQ padd         = sad+1
  64. .EQ sbd          = sad+2
  65. .EQ pbdd         = sad+3
  66. .EQ clk1t        = sad+4
  67. .EQ clk8t        = sad+5
  68. .EQ clk64t       = sad+6
  69. .EQ clkrdt       = sad+7             ; rEAD TIME
  70. .EQ clkkt        = sad+7
  71. .EQ clkrdi       = sad+7
  72. .EQ clkrdi       = sad+7             ; rEAD TIME OUT BIT
  73.  
  74. ;
  75. ;
  76. .BA $1800
  77. ;
  78. ; dUMP MEMORY ON TAPE
  79. dumpt            LDA  #$ad           ; LOAD ABSOLUTE INST
  80.                  STA  veb
  81.                  JSR  intveb
  82. ;
  83.                  LDA  #$27           ; TURN OFF DATAINPUT pb5
  84.                  STA  sbd
  85.                  LDA  #$bf           ; pb7 := OUTPUT
  86.                  STA  pbdd
  87. ;
  88.                  LDX  #100           ; 100 CHARACTERS
  89. dumpt1           LDA  #$16           ; SYNC CHARS
  90.                  JSR  outcht
  91.                  DEX
  92.                  BNE  dumpt1
  93. ;
  94.                  LDA  #$2a           ; START CHAR
  95.                  JSR  outcht
  96. ;
  97.                  LDA  id             ; OUTPUT id
  98.                  JSR  outbt
  99. ;
  100.                  LDA  sal            ; OUTPUT START ADDRESS
  101.                  JSR  outbtc
  102.                  LDA  sah
  103.                  JSR  outbtc
  104. ;
  105. dumpt2           LDA  veb+1          ; COMPARE FOR LAST DATA BYTE
  106.                  CMP  eal
  107.                  LDA  veb+2
  108.                  SBC  eah
  109.                  BCC  dumpt4
  110. ;
  111.                  LDA  #$2f           ; OUTPUT eNDoFdATA-CHAR
  112.                  JSR  outcht
  113.                  LDA  chkl           ; OUTPUT CHECKSUM
  114.                  JSR  outbt
  115.                  LDA  chkh
  116.                  JSR  outbt
  117. ;
  118.                  LDX  #2             ; 2 CHARS
  119. dumpt3           LDA  #4             ; eot-CHAR
  120.                  JSR  outcht
  121.                  DEX
  122.                  BNE  dumpt3
  123. ;                
  124.                  LDA  #0             ; DISPLAY 0000
  125.                  STA  pointl
  126.                  STA  pointh
  127.                  JMP  start
  128. ;
  129. dumpt4           JSR  veb            ; OUTPUT DATA BYTE
  130.                  JSR  outbtc
  131.                  JSR  incveb
  132.                  JMP  dumpt2
  133. ;
  134. ; lOAD FROM TAPE INTO MEMORY
  135. tab              .WO  load12
  136. loadt            LDA  #$8d           ; INITIALISE VOLATILE EXECUTION
  137.                  STA  veb            ; BLOCK WITH STA ABS
  138.                  JSR  intveb
  139. ;
  140.                  LDA  #$4c           ; CODE FOR jmp
  141.                  STA  veb+3
  142.                  LDA  tab
  143.                  STA  veb+4
  144.                  LDA  tab+1
  145.                  STA  veb+5
  146. ;
  147. ; RESULT: JMP load12 (= $190f)
  148. ;
  149.                  LDA  #7             ; RESET pb5
  150.                  STA  sbd
  151. ;
  152. sync             LDA  #$ff           ; CLEAR savx FOR sync-AREA
  153.                  STA  savx
  154. ;
  155. sync1            JSR  rdbit          ; GET A BIT
  156.                  LSR  savx
  157.                  ORA  savx
  158.                  STA  savx
  159.                  LDA  savx           ; GET NEW CHAR
  160.                  CMP  #$16           ; sync-CHAR?
  161.                  BNE  sync1
  162. ;
  163.                  LDX  #10            ; TEST FOR 10 sync-CHAR
  164. sync2            JSR  rdcht
  165.                  CMP  #$16           ; sync-CHAR?
  166.                  BNE  sync
  167.  
  168.                  DEX
  169.                  BNE  sync2
  170.  
  171. loadt4           JSR  rdcht          ; LOOK FOR START OF
  172.                  CMP  #$2a           ;   START CHAR
  173.                  BEQ  load11         ; YES ->
  174.  
  175.                  CMP  #$16           ; sync-CHAR?
  176.                  BNE  sync           ; NO ->
  177.  
  178.                  BEQ  loadt4         ; ALWAYS ->
  179. ;
  180. load11           JSR  rdbyt          ; READ id
  181.                  CMP  id             ; REQUESTED id?
  182.                  BEQ  loadt5         ; YES ->
  183.  
  184.                  LDA  id
  185.                  CMP  #0             ; IGNORE id?
  186.                  BEQ  loadt5         ; YES ->
  187.  
  188.                  CMP  #$ff           ; IGNORE START ADDRESS?
  189.                  BEQ  loadt6         ; YES ->
  190.  
  191.                  BNE  loadt          ; NEXT PROGRAM, ALWAYS ->
  192. ;
  193. loadt5           JSR  rdbyt          ; GET sa FROM TAPE
  194.                  JSR  chkt
  195.                  STA  veb+1
  196.                  JSR  rdbyt
  197.                  JSR  chkt
  198.                  STA  veb+2
  199.                  JMP  loadt7
  200. ;
  201. loadt6           JSR  rdbyt          ; GET sa FROM TAPE
  202.                  JSR  chkt           ;    BUT IGNORE
  203.                  JSR  rdbyt
  204.                  JSR  chkt
  205. ;
  206. loadt7           LDX  #2
  207. load13           JSR  rdcht
  208.                  CMP  #$2f           ; LAST CHAR?
  209.                  BEQ  loadt5         ; YES ->
  210.  
  211.                  JSR  packt          ; CONVERT TO HEX
  212.                  BNE  loadt9         ; y=1, NON-HEX CHAR
  213.  
  214.                  DEX                 ; 2 CHARS?
  215.                  BNE  load13         ; NO -> NEXT ONE
  216.  
  217.                  JSR  chkt           ; COMPUTE CHECKSUM
  218.                  JMP  veb
  219. ;
  220. load12           JSR  incveb         ; INCREMENT DATAPOINTER
  221.                  JMP  loadt7
  222. ;
  223. loadt8           JSR  rdbyt          ; eod COMPARE CHECKSUM
  224.                  CMP  chkl
  225.                  BNE  loadt9
  226.  
  227.                  JSR  rdbyt
  228.                  CMP  chkh
  229.                  BNE  loadt9
  230.  
  231.                  LDA  #0
  232.                  BEQ  load10         ; NORMAL EXIT, ALWAYS ->
  233. ;
  234. loadt9           LDA  #$ff           ; ERROR EXIT
  235. load10           STA  pointl
  236.                  STA  pointh
  237.                  JMP  start          ; DISPLAY VALUES
  238. ;
  239. ; mOVE START ADDRESS TO veb+1,2
  240. intveb           LDA  sal
  241.                  STA  veb+1
  242.                  LDA  sah
  243.                  STA  veb+2
  244.                  LDA  #$60           ; CODE FOR rts
  245.                  STA  veb+3
  246.                  LDA  #0
  247.                  STA  chkl
  248.                  STA  chkh
  249.                  RTS
  250. ;
  251. ; cOMPUTE CHECKSUM FOR TAPE LOAD
  252. chkt             TAY
  253.                  CLC
  254.                  ADC  chkl
  255.                  STA  chkl
  256.                  LDA  chkh
  257.                  ADC  #0
  258.                  STA  chkh
  259.                  TYA
  260.                  RTS
  261. ;
  262. ; oUTPUT ONE BYTE
  263. outbtc           JSR  chkt
  264. outbt            TAY
  265.                  LSR
  266.                  LSR
  267.                  LSR
  268.                  LSR
  269.                  JSR  hexout         ; OUTPUT msd
  270.                  TYA
  271.                  JSR  hexout         ; OUTPUT lsd
  272.                  TYA
  273.                  RTS
  274. ;
  275. ; cONVERT lsd OF a TO ascii
  276. hexout           AND  #$0f
  277.                  CMP  #10
  278.                  CLC
  279.                  BMI  hex1
  280.  
  281.                  ADC  #7
  282. hex1             ADC  #$30
  283. ;
  284. ; oUTPUT TO TAPE 1 ascii
  285. outcht           STX  savx
  286.                  STY  savx+1
  287.                  LDY  #8             ; STARTBIT
  288. cht1             JSR  one
  289.                  LSR                 ; GET DATA BIT
  290.                  BCS  cht2
  291.  
  292.                  JSR  one
  293.                  JMP  cht3
  294.  
  295. cht2             JSR  zro
  296. cht3             JSR  zro
  297.                  DEY                 ; ALL BITS?
  298.                  BNE  cht1           ; NO ->
  299.                  LDX  savx
  300.                  LDY  savx+1
  301.                  RTS
  302. ;
  303. ; oUTPUT A 1 TO TAPE: 9 PULSES OF 138 US EACH
  304. one              LDX  #9
  305.                  PHA
  306. one1             BIT  clkrdi         ; WAIT FOR TIMEOUT
  307.                  BPL  one1
  308.  
  309.                  LDA  #126
  310.                  STA  clk1t
  311.                  LDA  #$a7
  312.                  STA  sbd            ; pb7 := 1
  313. one2             BIT  clkrdi         ; WAIT FOR TIMEOUT
  314.                  BPL  one2
  315.  
  316.                  LDA  #126
  317.                  STA  clk1t
  318.                  LDA  #$27
  319.                  STA  sbd            ; pb7 := 0
  320.                  DEX                 ; ALL PULSES?
  321.                  BNE  one1           ; NO ->
  322.  
  323.                  PLA
  324.                  RTS
  325. ;
  326. ; oUTPUT A 0 TO TAPE: 6 PULSES OF 207 US EACH
  327. zro              LDX  #6
  328.                  PHA
  329. zro1             BIT  clkrdi         ; WAIT FOR TIMEOUT
  330.                  BPL  zro1
  331.  
  332.                  LDA  #195
  333.                  STA  clk1t
  334.                  LDA  #$a7
  335.                  STA  sbd            ; pb7 := 1
  336. zro2             BIT  clkrdi         ; WAIT FOR TIMEOUT
  337.                  BPL  zro2
  338.  
  339.                  LDA  #195
  340.                  STA  clk1t
  341.                  LDA  #$27
  342.                  STA  sbd            ; pb7 := 0
  343.                  DEX                 ; ALL PULSES?
  344.                  BNE  zro1           ; NO ->
  345.  
  346.                  PLA
  347.                  RTS
  348. ;
  349. ; iNCREMENT veb+1,2
  350. incveb           INC  veb+1
  351.                  BNE  incve1
  352.  
  353.                  INC  veb+2
  354. incve1           RTS
  355. ;
  356. ; rEAD BYTE FROM TAPE
  357. rdbyt            JSR  rdcht
  358.                  JSR  packt
  359. rdbyt2           JSR  rdcht
  360.                  JSR  packt
  361.                  RTS
  362. ;
  363. ; pACK ascii IN a AS HEX DATA
  364. packt            CMP  #$30           ; ascii ?
  365.                  BMI  packt3         ; NO ->
  366.  
  367.                  CMP  #$47
  368.                  BPL  packt3         ; NO ->
  369.  
  370.                  CMP  #$40           ; > '9' ?
  371.                  BMI  packt1         ; NO ->
  372.  
  373.                  CLC
  374.                  ADC  #9
  375. packt1           ROL
  376.                  ROL
  377.                  ROL
  378.                  ROL
  379.                  LDY  #4
  380. packt2           ROL
  381.                  ROL  savx
  382.                  DEY
  383.                  BNE  packt2
  384.  
  385.                  LDA  savx
  386. ;
  387. ; aT THIS POINT y ALREADY IS 0 (= VALID HEX CHAR)
  388.                  LDY  #0             ; SET THE ZERO-FLAG
  389.                  RTS
  390. ;
  391. ; y=0 AT THIS POINT, DONE IN LABEL rdbit4 
  392. packt3           INY                 ; y:=1 = INVALID HEX CHAR
  393.                  RTS
  394. ;
  395. ; gET 1 CHAR FROM TAPE IN a
  396. rdcht            STX  savx+2
  397.                  LDX  #8             ; READ 8 BITS
  398. rdcht1           JSR  rdbit
  399.                  LSR  savx+1
  400.                  ORA  savx+1
  401.                  STA  savx+1
  402.                  DEX
  403.                  BNE  rdcht1
  404. ;
  405.                  LDA  savx+1
  406.                  ROL
  407.                  LSR
  408.                  LDX  savx+2
  409.                  RTS
  410. ;
  411. ; gET 1 BIT FROM TAPE AND RETURN IT IN BIT 7 OF a
  412. rdbit            BIT  sbd            ; WAIT FOR END OF STARTBIT
  413.                  BPL  rdbit
  414.  
  415.                  LDA  clkrdt         ; GET START BIT TIME
  416.                  LDY  #$ff           ; a := 256 - t1
  417.                  STY  clk64t
  418. ;
  419.                  LDY  #$14
  420. rdbit3           DEY                 ; DELAY 100 US
  421.                  BNE  rdbit3
  422.  
  423. rdbit2           BIT  sbd
  424.                  BMI  rdbit2         ; WAIT FOR NEXT START BIT
  425. ;
  426.                  SEC
  427.                  SBC  clkrdt
  428.                  LDY  #$ff           
  429.                  STY  clk64t
  430. ;
  431.                  LDY  #7
  432. rdbit4           DEY                 ; DELAY 50 US
  433.                  BNE  rdbit4
  434. ;
  435.                  EOR  #$ff           ; COMPLEMENT SIGN
  436.                  AND  #$80           ; MASK SIGN
  437.                  RTS
  438. ;
  439. ; OUTPUT 166 US PULSE STRING FOR TESTING PURPOSES
  440. ;   nO DOCUMENTATION FOUND ABOUT THIS. i THINK IT IS USED TO
  441. ;   CALIBRATE THE 565
  442. pllcall          LDA  #$27
  443.                  STA  sbd            ; TURN OFF DATIN pb5=1
  444.                  LDA  #$bf
  445.                  STA  pbdd
  446. ;
  447. pll1             BIT  clkrdi
  448.                  BPL  pll1
  449.  
  450.                  LDA  #154           ; WAIT 166 US
  451.                  STA  clk1t
  452.                  LDA  #$a7           ; OUTPUT pb7=1
  453.                  STA  sbd
  454. ;
  455. pll2             BIT  clkrdi
  456.                  BPL  pll2
  457.                  LDA  #154
  458.                  STA  clk1t
  459.                  LDA  #$27           ; OUTPUT pb7=0
  460.                  STA  sbd
  461.                  JMP  pll1
  462. ;
  463. .BA $1bfa
  464. nmip27           .WO  pllcall
  465. rstp27           .WO  pllcall
  466. irqp27           .WO  pllcall
  467. ;
  468. ;
  469. ;
  470. ; kim-ENTRY VIA nmi OR irq
  471. save             STA  acc
  472.                  PLA
  473.                  STA  preg
  474. ;
  475. ; kim-ENTRY VIA jsr
  476. savea            PLA
  477.                  STA  pcl
  478.                  STA  pointl
  479.                  PLA
  480.                  STA  pch
  481.                  STA  pointh
  482. ;
  483. saveb            STY  yreg
  484.                  STX  xreg
  485.                  TSX
  486.                  STX  spuser
  487.                  JSR  inits
  488.                  JMP  start
  489. ;
  490. ; nmi AND irq ARE CALLED VIA ram-VECTOR. tHIS ENABLES THE PROGRAMMER
  491. ; TO INSERT HIS OWN ROUTINES.
  492. ; cOMMENT: IS NOT INITIALISED ANYWHERE, SO ANY ACCIDENTAL nmi OR irq 
  493. ;          CAN LEAD TO DISASTER !
  494. nmit             JMP  (nmiv)
  495. irqt             JMP  (irqv)
  496. ;
  497. ; tHE kim STARTS HERE AFTER A RESET
  498. reset            LDX  #$ff
  499.                  TXS                 ; SET STACK
  500.                  STX  spuser
  501.                  JSR  inits
  502. ;
  503. ; dETERMINE CHARACTERS PER SECOND
  504. detcps           LDA  #$ff           ; COUNT STARTBIT
  505.                  STA  cnth30         ; ZERO cnth30
  506. ;
  507. ; tEST FIRST KEYBOARD OR TELEPRINTER
  508.                  LDA  #1             ; MASK BIT 0
  509. det1             BIT  sad            ; TEST FOR TELEPRINTER
  510.                  BNE  start          ; NO ->
  511.  
  512.                  BMI  det1           ; NO STARTBIT, WAIT FOR IT ->
  513.  
  514.                  LDA  #$fc
  515. det3             CLC                 ; THIS LOOP COUNTS STARTBIT TIME
  516.                  ADC  #1             ; a=0 ?
  517.                  BCC  det2           ; NO ->
  518.  
  519.                  INC  cnth30
  520.  
  521. det2             LDY  sad            ; CHECK FOR END OF STARTBIT
  522.                  BPL  det3           ; NO ->
  523.  
  524.                  STA  cntl30
  525.                  LDX  #8
  526.                  JSR  get5           ; GET REST OF CHAR
  527. ;
  528. ; mAKE tty/kb SELECTION
  529. start            JSR  init1
  530.                  LDA  #1             ; READ JUMPER
  531.                  BIT  sad            ; tty ?
  532.                  BNE  ttykb          ; NO -> KEYBOARD/DISPLAY-ROUTINE
  533.  
  534.                  JSR  crlf           ; PRINT RETURN/LINEFEED
  535.                  LDX  #$0a
  536.                  JSR  prtst          ; PRINT 'kim'
  537.                  JMP  show1
  538. ;
  539. ;
  540. clear            LDA  #0
  541.                  STA  inl            ; CLEAR INPUTBUFFER
  542.                  STA  inh
  543. ;
  544. read             JSR  getch          ; GET CHAR FROM tty
  545.                  CMP  #1             ; 1 HAS NO MEANING FOR tty
  546.                  BEQ  ttykb          ; 1 = kb-MODE ->
  547.  
  548.                  JSR  pack           
  549.                  JMP  scan
  550. ;
  551. ; mAIN ROUTINE FOR KEYBOARD AND DISPLAY
  552. ttykb            JSR  scand          ; WAIT UNTIL no KEY PRESSED
  553.                  BNE  start          ; IF PRESSED, WAIT AGAIN ->
  554. ttykb1           LDA  #1             ; CHECK kb/tty MODE
  555.                  BIT  sad            ; tty?
  556.                  BEQ  start          ; YES ->
  557.  
  558.                  JSR  scand          ; wAIT FOR KEY...
  559.                  BEQ  ttykb1         ; NO KEY ->
  560.  
  561.                  JSR  scand          ; DEBOUNCE KEY
  562.                  BEQ  ttykb1         ; NO KEY ->
  563. ;
  564. getk             JSR  getkey
  565.                  CMP  #$15           ; >= $15 = ILLEGAL
  566.                  BPL  start          ; YES ->
  567.  
  568.                  CMP  #$14
  569.                  BEQ  pccmd          ; DISPLAY pROGRAM cOUNTER
  570.  
  571.                  CMP  #$10
  572.                  BEQ  addrm          ; ADDRESMODE
  573.  
  574.                  CMP  #$11
  575.                  BEQ  datam          ; DATAMODE
  576.  
  577.                  CMP  #$12
  578.                  BEQ  step           ; STEP
  579.  
  580.                  CMP  #$13
  581.                  BEQ  gov            ; EXECUTE PROGRAM
  582. ;
  583. ; oNE OF THE HEXIDECIMAL BUTTONS HAS BEEN PUSHED
  584. data             ASL                 ; MOVE lsb KEY NUMBER TO msb
  585.                  ASL  
  586.                  ASL  
  587.                  ASL  
  588.                  STA  temp           ; STORE FOR DATAMODE
  589.                  LDX  #4
  590.  
  591. data1            LDY  mode           ; PART OF ADDRESS?
  592.                  BNE  addr           ; YES ->
  593.  
  594.                  LDA  (pointl),y     ; GET DATA
  595.                  ASL  temp
  596.                  ROL                 ; msb-temp = msb-KEY -> a
  597.                  STA  (pointl),y     ; STORE NEW DATA
  598.                  JMP  data2
  599.  
  600. addr             ASL                 ; temp NOT NEEDED HERE
  601.                  ROL  pointl         ; msb-KEY -> pointl
  602.                  ROL  pointh         ; pointl -> pointh
  603.  
  604. data2            DEX                 ; 4 TIMES = COMPLETE NIBBLE?
  605.                  BNE  data1          ; NO ->
  606.  
  607.                  BEQ  datam2         ; -> ALWAYS
  608. ;
  609. ; sWITCH TO ADDRESS MODE
  610. addrm            LDA  #1
  611.                  BNE  datam1         ; -> ALWAYS
  612. ;
  613. ; sWITCH TO DATA MODE
  614. datam            LDA  #0
  615. datam1           STA  mode
  616. datam2           JMP  start
  617. ;
  618. ; iNCREMENT ADDRESS ON DISPLAY
  619. step             JSR  incpt
  620.                  JMP  start
  621. ;
  622. gov              JMP  goexec
  623. ;
  624. ; dISPLAY pc BY MOVING IT TO point
  625. pccmd            LDA  pcl
  626.                  STA  pointl
  627.                  LDA  pch
  628.                  STA  pointh
  629.                  JMP  start
  630. ;
  631. ; lOAD PAPERTAPE FROM tty
  632. load             JSR  getch
  633.                  CMP  #$3b           ; ":", SEMICOLON?
  634.                  BNE  load           ; nO -> AGAIN
  635.  
  636. loads            LDA  #0
  637.                  STA  chksum
  638.                  STA  chkhi
  639. ;
  640.                  JSR  getbyt         ; GET BYTE cnt
  641.                  TAX
  642.                  JSR  chk            ; cOMPUTE CHECKSUM
  643. ;
  644.                  JSR  getbyt         ; GET ADDRESS hi
  645.                  STA  pointh
  646.                  JSR  chk            ; cOMPUTE CHECKSUM
  647. ;
  648.                  JSR  getbyt         ; GET ADDRESS lo
  649.                  STA  pointl
  650.                  JSR  chk            ; cOMPUTE CHECKSUM
  651. ;
  652.                  TXA                 ; cnt = 0 ?
  653.                  BEQ  load3
  654. ;
  655. load2            JSR  getbyt         ; GET data
  656.                  STA  (pointl),Y     ; STORE DATA
  657.                  JSR  chk
  658.                  JSR  incpt
  659.                  DEX
  660.                  BNE  load2
  661.  
  662.                  INX                 ; x=1 = DATA RECORD
  663.                                      ; x=0 = LAST RECORD
  664. ;
  665. load3            JSR  getbyt         ; COMPARE CHECKSUM
  666.                  CMP  chkhi
  667.                  BNE  loade1
  668.  
  669.                  JSR  getbyt
  670.                  CMP  chksum
  671.                  BNE  loader
  672. ;
  673.                  TXA                 ; x=0 = LAST RECORD
  674.                  BNE  load
  675. ;
  676. load7            LDX  #$0c           ; x-off kim
  677. load8            LDA  #$27
  678.                  STA  sbd            ; DISABLE DATA IN
  679.                  JSR  prtst
  680.                  JMP  start
  681. ;
  682. loade1           JSR  getbyt         ; DUMMY
  683. loader           LDX  #$11           ; x-off ERROR kim
  684.                  BNE  load8          ; ALWAYS ->
  685. ;
  686. ; dUMP TO tty FROM OPEN CELL ADDRESS TO limhl, limhh
  687. dump             LDA  #0
  688.                  STA  inl
  689.                  STA  inh            ; CLEAR RECORD COUNT
  690. dump0            LDA  #0
  691.                  STA  chkhi          ; CLEAR CHECKSUM
  692.                  STA  chksum
  693. ;
  694. dump1            JSR  crlf
  695.                  LDA  #$3b           ; ":"
  696.                  JSR  outch
  697. ;
  698. ; cHECK IF pointl/h >= eal/h
  699.                  LDA  pointl
  700.                  CMP  eal
  701.                  LDA  pointh
  702.                  SBC  eah
  703.                  BCC  dump4          ; NO ->
  704. ;
  705.                  LDA  #0             ; PRINT LAST RECORD
  706.                  JSR  prtbyt         ; 0 BYTES
  707.                  JSR  open
  708.                  JSR  prtpnt
  709. ;
  710.                  LDA  chkhi          ; PRINT CHECKSUM
  711.                  JSR  prtpnt         ;  FOR LAST RECORD
  712.                  LDA  chksum
  713.                  JSR  prtbyt
  714.                  JSR  chk
  715.                  JMP  clear
  716. ;
  717. dump4            LDA  #$18           ; PRINT 24 BYTES
  718.                  TAX                 ; SAVE AS INDEX
  719.                  JSR  prtbyt
  720.                  JSR  chk
  721.                  JSR  prtpnt
  722. ;
  723. dump2            LDY  #0
  724.                  LDA  (pointl),Y
  725.                  JSR  prtbyt         ; PRINT DATA
  726.                  JSR  chk
  727.                  JSR  incpt
  728.                  DEX                 ; pRINTED EVERYTHING?
  729.                  BNE  dump2          ; nO ->
  730. ;
  731.                  LDA  chkhi
  732.                  JSR  prtbyt         ; PRINT CHECKSUM
  733.                  LDA  chksum
  734.                  JSR  prtbyt
  735.                  INC  inl            ; INCREMENT RECOURD COUNTER
  736.                  BNE  dump3
  737.  
  738.                  INC  inh
  739. dump3            JMP  dump0
  740. ;
  741. space            JSR  open           ; OPEN NEW CELL
  742. show             JSR  crlf
  743. show1            JSR  prtpnt
  744.                  JSR  outsp          ; PRINT SPACE
  745.                  LDY  #0
  746.                  LDA  (pointl),Y     ; PRINT DATA
  747.                  JSR  prtbyt
  748.                  JSR  outsp          ; PRINT SPACE
  749.                  JMP  clear
  750. ;
  751. rtrn             JSR  incpt          ; NEXT ADDRESS
  752.                  JMP  show
  753.  
  754. ; sTART A PROGRAM AT DISPLAYED ADDRESS. rti IS USED AS A COMFORTABLE
  755. ;  WAY TO DEFINE ALL FLAGS IN ONE MOVE.
  756. goexec           LDX  spuser         ; USER USER DEFINED STACK
  757.                  TXS
  758.                  LDA  pointh         ; PROGRAM RUNS FROM
  759.                  PHA                 ;   DISPLAYED ADDRESS
  760.                  LDA  pointl
  761.                  PHA
  762.                  LDA  preg           ; USER DEFINED fLAG REGISTER
  763.                  PHA
  764.                  LDX  xreg
  765.                  LDY  yreg
  766.                  LDA  acc
  767.                  RTI                 ; START PROGRAM 
  768. ;
  769. ; tAKE CARE IF tty-INPUT
  770. scan             CMP  #$20           ; OPEN NEW CELL
  771.                  BEQ  space
  772.  
  773.                  CMP  #$7f           ; RUB OUT, RESTART kim
  774.                  BEQ  stv
  775.  
  776.                  CMP  #$0d           ; NEXT CELL
  777.                  BEQ  rtrn
  778.  
  779.                  CMP  #$0a           ; PREV CELL
  780.                  BEQ  feed
  781.  
  782.                  CMP  #$2e           ; "." = MODIFY CELL
  783.                  BEQ  modify
  784.  
  785.                  CMP  #$47           ; "g" = EXEC PROGRAM
  786.                  BEQ  goexec
  787.  
  788.                  CMP  #$51           ; "q" = DUMP FROM OPEN CELL
  789.                  BEQ  dumpv          ;   TO hi LIMIT
  790.  
  791.                  CMP  #$4c           ; "l" = LOAD TAPE
  792.                  BEQ  loadv
  793.  
  794.                  JMP  read           ; IGNORE ILLEGAL char
  795. ;
  796. stv              JMP  start
  797. dumpv            JMP  dump
  798. loadv            JMP  load
  799. ;
  800. feed             SEC
  801.                  LDA  pointl         ; DECREMENT pointl/h
  802.                  SBC  #1
  803.                  STA  pointl
  804.                  BCS  feed1
  805.  
  806.                  DEC  pointh
  807. feed1            JMP  show
  808. ;
  809. modify           LDY  #0             ; GET CONTENTS OF INPUT BUFFER
  810.                  LDA  inl            ;  inl AND STORE IN LOCATION
  811.                  STA  (pointl),Y     ;  SPECIFIED BY point
  812.                  JMP  rtrn
  813. ;
  814. ; sUBROUTINE TO PRINT point = ADDRESS
  815. prtpnt           LDA  pointh
  816.                  JSR  prtbyt
  817.                  JSR  chk
  818.                  LDA  pointl
  819.                  JSR  prtbyt
  820.                  JSR  chk
  821.                  RTS
  822. ;
  823. ; pRINT ascii-STRING FROM top+x TO top
  824. crlf             LDX  #7             ; OUTPUT <return> AND <lf>
  825. prtst            LDA  top,X
  826.                  JSR  outch
  827.                  DEX                 ; EVERYTHING?
  828.                  BPL  prtst          ; NO ->
  829.  
  830. prt1             RTS
  831. ;
  832. ; pRINT 1 HEX BYTE AS 2 ascii CHARS
  833. prtbyt           STA  temp           ; SAVE a
  834.                  LSR                 ; SHIFT a 4 TIMES
  835.                  LSR
  836.                  LSR
  837.                  LSR
  838.                  JSR  hexta          ; CONVERT BIT 4..7 TO hex AND PRINT
  839.                  LDA  temp
  840.                  JSR  hexta          ; CONVERT BIT 0..7 TO hex AND PRINT
  841.                  LDA  temp           ; RESTORE a
  842.                  RTS
  843. ;
  844. hexta            AND  #$0f           ; MASK BIT 0..4
  845.                  CMP  #$0a           ; > 10 ?
  846.                  CLC
  847.                  BMI  hexta1         ; NO ->
  848.  
  849.                  ADC  #7             ; a..f
  850. hexta1           ADC  #$30           ; CONVERT TO ascii-CHAR...
  851.                  JMP  outch          ;   ...AND PRINT IT
  852. ;
  853. ; gET CHAR FROM tty IN a
  854. getch            STX  tmpx
  855.                  LDX  #8             ; COUNT 8 BITS
  856.                  LDA  #1
  857. get1             BIT  sad            ; CHECK IF tty-MODE
  858.                  BNE  get6           ; NO ->
  859.  
  860. ; pa7 IS INPUT tty
  861.                  BMI  get1           ; WAIT FOR STARTBIT
  862.  
  863.                  JSR  delay          ; DELAY 1  BIT
  864. ;
  865. ; bY DELAYING ANOTHER HALF BIT TIME, YOU READ THE BIT IN THE MIDDLE
  866. ; OF EVERY BIT.
  867. get5             JSR  dehalf         ; DELAY 1/2 BIT     TIME 
  868. get2             LDA  sad
  869.                  AND  #$80           ; MASK BIT 7
  870.                  LSR  char           ; SHIFT LAST RESULT
  871.                  ORA  char           ; or IT WITH NEW BIT
  872.                  STA  char           ; AND STORE IT AGAIN
  873.                  JSR  delay
  874.                  DEX
  875.                  BNE  get2           ; NEXT BIT
  876.  
  877.                  JSR  dehalf         ; WHY ????
  878. ;
  879.                  LDX  tmpx
  880.                  LDA  char
  881.                  ROL                 ; SHIFT OFF STOPBIT
  882.                  LSR
  883. get6             RTS
  884. ;
  885. ; iNITIALIZATION 6530                $1e88
  886. inits            LDX  #1             ; SET DISPLAY TO ADDRESS MODE
  887.                  STX  mode
  888. ;
  889. init1            LDx  #0
  890.                  STX  padd           ; pa0..pa7 = INPUT
  891.                  LDx  #$3f
  892.                  STX  pbdd           ; pb0..pb5 = OUTPUT
  893.                                      ; pb6, pb7 = INPUT
  894.                  LDX  #7             ; ENABLE 74145 OUTPUT 3 TO
  895.                  STX  sbd            ;           CHECK kb/tty-MODE
  896.                  CLD
  897.                  SEI
  898.                  RTS
  899. ;
  900. ; oUTPUT CHAR IN a TO tty                 $1e9e
  901. outsp            LDA  #" "           ; PRINT SPACE
  902. outch            STA  char
  903.                  STX  tmpx
  904.                  JSR  delay
  905.                  LDA  sbd
  906.                  AND  #$fe           ; SEND STARTBIT
  907.                  STA  sbd            ; pb0 = 0 -> tty := (h)
  908.                  JSR  delay
  909. ;
  910.                  LDX  #8             ; SEND CHARACTER
  911. out1             LDA  sbd
  912.                  AND  #$fe           ; CLEAR BIT 0
  913.                  LSR  char           ; SHIFT BYTE 
  914.                  ADC  #0             ; ADD cARRY = FORMER BIT 0
  915.                  STA  sbd            ; OUTPUT BIT
  916.                  JSR  delay
  917.                  DEX                 ; ALL BITS?
  918.                  BNE  out1           ; NO ->
  919.  
  920.                  LDA  sbd
  921.                  ORA  #1
  922.                  STA  sbd            ; STOP BIT
  923.                  JSR  delay
  924.                  LDX  tmpx
  925.                  RTS
  926. ;
  927. ; dELAY 1 BIT TIME AS DETERMINED BY detcps
  928. delay            LDA  cnth30
  929.                  STA  timh
  930.                  LDA  cntl30
  931. de2              SEC
  932. de4              SBC  #1
  933.                  BCS  de3            ; a<>$ff ->
  934.  
  935.                  DEC  timh
  936. de3              LDY  timh           ; timh > 0 ?
  937.                  BPL  de2            ; YES ->
  938.  
  939.                  RTS
  940. ;
  941. ; dELAY HALF A BIT TIME
  942. dehalf           LDA  cnth30
  943.                  STA  timh
  944.                  LDA  cntl30
  945.                  LSR
  946.                  LSR  timh
  947.                  BCC  de2
  948.  
  949.                  ORA  #$80
  950.                  BCS  de4            ; ALWAYS ->
  951. ; wHY NOT:
  952. ;     LSR  timh
  953. ;     ROR
  954. ;     JMP  de2
  955. ; ????
  956. ;
  957. ;
  958. ; dETERMINE IF KEY IS DEPRESSED: no -> a=0, yes -> a>0
  959. ak               LDY  #3             ; 3 ROWS
  960.                  LDx  #1             ; SELECT 74145 OUTPUT 0
  961.  
  962. onekey           LDA  #$ff           ; INITIAL VALUE
  963. ;
  964. aka              STX  sbd            ; ENABLE OUTPUT = SELECT ROW
  965.                  INX
  966.                  INX                 ; PREPARE FOR NEXT ROW
  967.                  AND  sad            ; a := a && (pa0..pa7)
  968.                  DEY                 ; ALL ROWS?
  969.                  BNE  aka            ; NO ->
  970.  
  971.                  LDY  #7
  972.                  STY  sbd            ; SELECT 74145 OUTPUT 3 (NOT USED)
  973. ;
  974.                  ORA  #$80           ; MASK BIT 7 OF a
  975.                  EOR  #$ff           ; IF a STILL IS $ff -> a := 0
  976.                  RTS
  977. ;
  978. ; oUTPUT TO 7-SEGMENT-DISPLAY
  979. scand            LDY  #0             ; pointl/pointh = ADDRESS ON DISPLAY
  980.                  LDA  (pointl),y     ; GET DATA FROM THIS ADDRESS
  981.                  STA  inh            ; STORE IN inh = 
  982. scands           LDA  #$7f           ; pa0..pa6 := OUTPUT
  983.                  STA  padd
  984.  
  985.                  LDx  #9             ; sTART WITH DISPLAY AT OUTPUT 4
  986.                  LDY  #3             ; 3 BYTES TO BE SHOWN
  987. ;
  988. scand1           LDA  inl_a,Y        ; GET BYTE
  989.                  LSR                 ; GET msd BY SHIFTING a
  990.                  LSR
  991.                  LSR
  992.                  LSR
  993.                  JSR  convd
  994.                  LDA  inl_a,Y        ; GET BYTE AGAIN
  995.                  AND  #$0f           ; GET lsd
  996.                  JSR  convd
  997.                  DEY                 ; ALL ?
  998.                  BNE  scand1         ; NO ->
  999.  
  1000.                  STY  sbd            ; ALL DIGITS OFF
  1001.                  LDA  #0
  1002.                  STA  padd           ; pa0..pa7 := INPUT
  1003.                  JMP  ak
  1004. ;
  1005. ; cONVERT DIGIT INTO 7-SEGMENT-VALUE
  1006. convd            STY  temp
  1007.                  TAY
  1008.                  LDA  table,y
  1009.                  LDY  #0
  1010.                  STY  sad            ; TURN OFF SEGMENTS
  1011.                  STX  sbd            ; SELECT 7-S-DISPLAY
  1012.                  STA  sad            ; OUTPUT CODE ON DISPLAY
  1013.  
  1014.                  LDY  #$7f           ; DELAY {$7e}500 CYCLES
  1015. convd1           DEY
  1016.                  BNE  convd1
  1017.  
  1018.                  INX                 ; NEXT DISPLAY
  1019.                  INX
  1020.                  LDY  temp
  1021.                  RTS
  1022. ;
  1023. ; iNCREMENT point = ADDRESS ON DISPLAY
  1024. incpt            INC  pointl
  1025.                  BNE  incpt2
  1026.  
  1027.                  INC  pointh
  1028. incpt2           RTS
  1029. ;
  1030. ; gET KEY FROM KEYBOARD IN a
  1031. getkey           LDX  #$21           ; ROW 0 / DISABLE INPUT tty
  1032. getke5           LDY  #1             ; ONLY ONE ROW IN THE TIME
  1033.                  JSR  onekey         ; KEY?
  1034.                  BNE  keyin          ; YES ->
  1035.  
  1036.                  CPX  #$27           ; LAST ROW?
  1037.                  BNE  getke5         ; NO, NEXT ONE ->
  1038.  
  1039.                  LDA  #$15           ; 15 = NO KEY
  1040.                  RTS
  1041. ;
  1042. keyin            LDY  #$ff           ; y := KEY NUMBER
  1043. keyin1           ASL                 ; SHIFT a UNTIL
  1044.                  BCS  keyin2         ;      BIT = 1 ->
  1045. ;
  1046. ; cOMMENT: BIT 7 IS ALWAYS 0 SO cARRY IS ALWAYS 0 THE FIRST TIME
  1047. ;            AND ALLOWING y TO BECOME 0 (KEY $ff DOES NOT EXIST)
  1048.                  INY  
  1049.                  BPL  keyin1         ; ALWAYS ->
  1050.  
  1051. keyin2           TXA
  1052.                  AND  #$0f           ; STRIP BIT4..7
  1053.                  LSR                 ; a := ROW+1
  1054.                  TAX                 ; x := ACTUAL ROW+1
  1055.                  TYA
  1056.                  BPL  keyin4         ; ALWAYS, BECAUSE y<7 -> 
  1057.  
  1058. ;
  1059. ; aDD 7 TO a FOR EVERY ROW ABOVE 0 TO GET ACTUAL KEY NUMBER
  1060. keyin3           CLC
  1061.                  ADC  #7             ; ADD (x-1) TIMES 7 TO a
  1062. keyin4           DEX                 ; COUNTDOWN TO 0
  1063.                  BNE  keyin3         
  1064.  
  1065.                  RTS                 ; a IS ALWAYS < 21 EG. < $15
  1066. ;
  1067. ; cOMPUTE CHECKSUM
  1068. chk              CLC
  1069.                  ADC  chksum
  1070.                  STA  chksum
  1071.                  LDA  chkhi
  1072.                  ADC  #0
  1073.                  STA  chkhi
  1074.                  RTS
  1075. ;
  1076. ; gET 2 HEX-CHARS AND PACK INTO inl AND inh
  1077. ;   nON HEX CHAR WILL BE LOADED AS NEARSEST HEX EQUIVALENT
  1078. getbyt           JSR  getch
  1079.                  JSR  pack
  1080.                  LSR  getch
  1081.                  JSR  pack
  1082.                  LDA  inl
  1083.                  RTS
  1084. ;
  1085. ; sHIFT CHAR IN a INTO inl AND inh
  1086. pack             CMP  #$30           ; IS HEX?
  1087.                  BMI  updat2         ; < = NO  ->
  1088.  
  1089.                  CMP  #$47
  1090.                  BPL  updat2         ; > = NO ->
  1091.  
  1092. hexnum           CMP  #$40           ; a..f ?
  1093.                  BMI  update         ; NO ->
  1094.  
  1095. hexalp           CLC
  1096.                  ADC  #9
  1097. update           ROL                 ; SHIFT TO BIT 4..7
  1098.                  ROL
  1099.                  ROL
  1100.                  ROL
  1101.                  LDY  #4             ; SHIFT INTO inl/inh
  1102. updat1           ROL
  1103.                  ROL  inl
  1104.                  ROL  inh
  1105.                  DEY                 ; 4 TIMES?
  1106.                  BNE  updat1         ; NO ->
  1107.  
  1108.                  LDA  #0             ; IF HEX NUMBER -> a := 0
  1109. updat2           RTS
  1110. ;
  1111. open             LDA  inl            ; MOVE i/o-BUFFER TO point
  1112.                  STA  pointl
  1113.                  LDA  inh
  1114.                  STA  pointh
  1115.                  RTS
  1116. ;
  1117. ; tABELS
  1118. top              .BY  0, 0, 0, 0, 0, 0, 10, 13
  1119.                  .TX  "mik"
  1120.                  .BY  " ", $13
  1121.                  .TX  "rre "
  1122.                  .BY  $13
  1123.  
  1124. ; hEX -> 7-SEGMENT     0    1    2    3    4    5    6    7
  1125. table            .BY  $bf, $86, $db, $cf, $e6, $ed, $fd, $87
  1126. ;                      8    9    a    b    c    d    e    f
  1127.                  .BY  $ff, $ef, $f7, $fc, $b9, $de, $f9, $f1
  1128. ;
  1129. ; cOMMENT: IF EVERYTHING IS COMPILED RIGHT, NEXT VECTORS SHOULD
  1130. ;          START AT $fffa
  1131. nmient           .WO  nmit
  1132. rstent           .WO  reset
  1133. irqent           .WO  irqt
  1134. .EN
  1135.