home *** CD-ROM | disk | FTP | other *** search
/ messroms.de / 2007-01-13_www.messroms.de.zip / KIM1 / kim-1_rom_source.zip / KIM.ASM < prev    next >
Assembly Source File  |  1981-12-17  |  28KB  |  941 lines

  1. ;- - - - - - - - - - - - - - KIM.ASM - - - - - - - - - - -
  2. ; COPYRIGHT MOS TECHNOLOGY, INC
  3. ; DATE: OCT 18, 1975 REV-D
  4. ;************************ 6530-003 I.C. ******************
  5. ; 6530-003 I.C. IS AN AUDIO CASSETTE TAPE RECORDER
  6. ; EXTENSION OF THE BASIC KIM MONITOR.  IT FEATURES
  7. ; TWO ROUTINES:
  8. ;   LOADT - LOAD MEMORY FROM AUDIO TAPE
  9. ;     ID=00     IGNORE ID
  10. ;     ID=FF     IGNORE ID, USE SA FOR START ADDR
  11. ;     ID=01-FE  USE ADDRESS ON TAPE
  12. ;
  13. ;   DUMPT - STORE MEMORY ONTO AUDIO TAPE
  14. ;     ID=00     SHOULD NOT BE USED
  15. ;     ID=FF     SHOULD NOT BE USED
  16. ;     ID=01-FE  NORMAL ID RANGE
  17. ;     SAL       LSB STARTING ADDRESS OF PROGRAM
  18. ;     SAH       MSB
  19. ;     EAL       ENDING ADDRESS OF PROGRAM
  20. ;     EAH       MSB
  21. ;
  22.         *=    $1800
  23. SAD     =     $1740     6530 A DATA
  24. PADD    =     $1741     6530 A DATA DIRECTION
  25. SBD     =     $1742     6530 B DATA
  26. PBDD    =     $1743     6530 B DATA DIRECTION
  27. CLK1T   =     $1744     DIV BY 1 TIME
  28. CLK8T   =     $1745     DIV BY 8 TIME
  29. CLK64T  =     $1746     DIV BY 64 TIME
  30. CLKKT   =     $1747     DIV BY 1024 TIME
  31. CLKRDI  =     $1747     READ TIME OUT BIT
  32. CLKRDT  =     $1746     READ TIME
  33. ;       ** MPU REG.  SAVX AREA IN PAGE 0 **
  34. PCL     =     $EF       PROGRAM CNT LOW
  35. PCH     =     $F0       PROGRAM CNT HI
  36. PREG    =     $F1       CURRENT STATUS REG
  37. SPUSER  =     $F2       CURRENT STACK POINTER
  38. ACC     =     $F3       ACCUMULATOR
  39. YREG    =     $F4       Y INDEX
  40. XREG    =     $F5       X INDEX
  41. ;       ** KIM FIXED AREA IN PAGE 0  **
  42. CHKHI   =     $F6
  43. CHKSUM  =     $F7
  44. INL     =     $F8       INPUT BUFFER
  45. INH     =     $F9       INPUT BUFFER
  46. POINTL  =     $FA       LSB OF OPEN CELL
  47. POINTH  =     $FB       MSB OF OPEN CELL
  48. TEMP    =     $FC
  49. TMPX    =     $FD
  50. CHAR    =     $FE
  51. MODE    =     $FF
  52. ;       ** KIM FIXED AREA IN PAGE 23 **
  53. CHKL    =     $17E7
  54. CHKH    =     $17E8     CHKSUM
  55. SAVX    =     $17E9     (3-BYTES)
  56. VEB     =     $17EC     VOLATILE EXEC BLOCK (6-B)
  57. CNTL30  =     $17F2     TTY DELAY
  58. CNTH30  =     $17F3     TTY DELAY
  59. TIMH    =     $17F4
  60. SAL     =     $17F5     LOW STARTING ADDRESS
  61. SAH     =     $17F6     HI STARTING ADDRESS
  62. EAL     =     $17F7     LOW ENDING ADDRESS
  63. EAH     =     $17F8     HI ENDING ADDRESS
  64. ID      =     $17F9     TAPE PROGRAM ID NUMBER
  65. ;       ** INTERRUPT VECTORS **
  66. NMIV    =     $17FA     STOP VECTOR (STOP=1C00)
  67. RSTV    =     $17FC     RST VECTOR
  68. IRQV    =     $17FE     IRQ VECTOR (BRK=1C00)
  69.  
  70. ;
  71. ;       ** DUMP MEMORY TO TAPE **
  72. DUMPT   LDA   #$AD      LOAD ABSOLUTE INST            1800
  73.         STA   VEB   
  74.         JSR   INTVEB
  75.         LDA   #$27      TURN OFF DATAIN PB5
  76.         STA   SBD   
  77.         LDA   #$BF      CONVERT PB7 TO OUTPUT
  78.         STA   PBDD  
  79.         LDX   #$64      100 CHARS 
  80. DUMPT1  LDA   #$16      SYNC CHARS
  81.         JSR   OUTCHT
  82.         DEX         
  83.         BNE   DUMPT1
  84.         LDA   #$2A      START CHAR
  85.         JSR   OUTCHT
  86.         LDA   ID        OUTPUT ID 
  87.         JSR   OUTBT 
  88.         LDA   SAL       OUTPUT STARTING
  89.         JSR   OUTBTC    ADDRESS 
  90.         LDA   SAH   
  91.         JSR   OUTBTC
  92. DUMPT2  LDA   VEB+1     CHECK FOR LAST
  93.         CMP   EAL       DATA BYTE
  94.         LDA   VEB+2 
  95.         SBC   EAH   
  96.         BCC   DUMPT4
  97.         LDA   #'/       OUTPUT END-OF-DATA CHAR
  98.         JSR   OUTCHT
  99.         LDA   CHKL      LAST BYTE HAS BEEN 
  100.         JSR   OUTBT     OUTPUT  NOW OUTPUT
  101.         LDA   CHKH      CHKSUM
  102.         JSR   OUTBT 
  103.         LDX   #$02      2 CHARS
  104. DUMPT3  LDA   #$04      EOT CHAR       
  105.         JSR   OUTCHT 
  106.         DEX          
  107.         BNE   DUMPT3    
  108.         LDA   #$00      DISPLAY 0000
  109.         STA   POINTL    FOR NORMAL EXIT
  110.         STA   POINTH  
  111.         JMP   START
  112. DUMPT4  JSR   VEB       DATA BYTE OUTPUT
  113.         JSR   OUTBTC
  114.         JSR   INCVEB
  115.         JMP   DUMPT2
  116. ;
  117. ;       ** LOAD MEMORY FROM TAPE **
  118. ;
  119. TAB     .WORD LOAD12      'LOAD12' ADDRESS            1871
  120. ;
  121. LOADT   LDA   #$8D      INIT VOLATILE EXECUTION       1873
  122.         STA   VEB       BLOCK WITH STA ABS.
  123.         JSR   INTVEB
  124.         LDA   #$4C      JUMP TYPE RTRN
  125.         STA   VEB+3
  126.         LDA   TAB  
  127.         STA   VEB+4
  128.         LDA   TAB+1
  129.         STA   VEB+5
  130.         LDA   #$07      RESET PB5=0 (DATA-IN)
  131.         STA   SBD
  132. SYNC    LDA   #$FF      CLEAR SAVX FOR SYNC CHAR      1891
  133.         STA   SAVX 
  134. SYNC1   JSR   RDBIT     GET A BIT        
  135.         LSR   SAVX      SHIFT BIT INTO CHAR
  136.         ORA   SAVX
  137.         STA   SAVX
  138.         LDA   SAVX      GET NEW CHAR
  139.         CMP   #$16      SYNC CHAR
  140.         BNE   SYNC1
  141.         LDX   #$0A      TEST FOR 10 SYNC CHARS
  142. SYNC2   JSR   RDCHT                      
  143.         CMP   #$16  
  144.         BNE   SYNC      IF NOT 10 CHAR, RE-SYNC
  145.         DEX     
  146.         BNE   SYNC2
  147. LOADT4  JSR   RDCHT     LOOK FOR START OF
  148.         CMP   #$2A      DATA CHAR
  149.         BEQ   LOAD11
  150.         CMP   #$16      IF NOT , SHOULD BE SYNC
  151.         BNE   SYNC
  152.         BEQ   LOADT4
  153. LOAD11  JSR   RDBYT     READ ID FROM TAPE
  154.         CMP   ID        COMPARE WITH REQUESTED ID
  155.         BEQ   LOADT5
  156.         LDA   ID        DEFAULT 00, READ RECORD
  157.         CMP   #$00      ANYWAY
  158.         BEQ   LOADT5
  159.         CMP   #$FF      DEFAULT FF, IGNORE SA ON
  160.         BEQ   LOADT6    TAPE
  161.         BNE   LOADT
  162. LOADT5  JSR   RDBYT     GET SA FROM TAPE
  163.         JSR   CHKT
  164.         STA   VEB+1     SAVX IN VEB+1,2
  165.         JSR   RDBYT
  166.         JSR   CHKT
  167.         STA   VEB+2
  168.         JMP   LOADT7
  169. ;
  170. LOADT6  JSR   RDBYT     GET SA BUT IGNORE             18EC
  171.         JSR   CHKT
  172.         JSR   RDBYT
  173.         JSR   CHKT
  174. LOADT7  LDX   #$02      GET 2 CHARS 
  175. LOAD13  JSR   RDCHT     GET CHAR (X)
  176.         CMP   #$2F      LOOK FOR LAST CHAR
  177.         BEQ   LOADT8
  178.         JSR   PACKT     CONVERT TO HEX
  179.         BNE   LOADT9    Y=1 NON-HEX CHAR
  180.         DEX                         
  181.         BNE   LOAD13
  182.         JSR   CHKT      COMPARE CHECKSUM
  183.         JMP   VEB       SAVX DATA IN MEMORY
  184. LOAD12  JSR   INCVEB    INCR DATA POINTER
  185.         JMP   LOADT7
  186. ;
  187. LOADT8  JSR   RDBYT     END OF DATA, COMPARE CHKSUM   1915
  188.         CMP   CHKL
  189.         BNE   LOADT9
  190.         JSR   RDBYT
  191.         CMP   CHKH
  192.         BNE   LOADT9
  193.         LDA   #$00      NORMAL EXIT
  194.         BEQ   LOAD10
  195. LOADT9  LDA   #$FF      ERROR EXIT 
  196. LOAD10  STA   POINTL               
  197.         STA   POINTH
  198.         JMP   START
  199. ;
  200. ;       ** SUBROUTINES BELOW **
  201. INTVEB  LDA   SAL       MOVE SA TO VEB+1,2            1932
  202.         STA   VEB+1
  203.         LDA   SAH
  204.         STA   VEB+2
  205.         LDA   #$60      RTS INST
  206.         STA   VEB+3
  207.         LDA   #$00      CLEAR CHKSUM AREA
  208.         STA   CHKL
  209.         STA   CHKH
  210.         RTS
  211. ;       ** COMPUTE CHKSUM FOR TAPE LOAD **
  212. CHKT    TAY                                           194C
  213.         CLC     
  214.         ADC   CHKL
  215.         STA   CHKL
  216.         LDA   CHKH
  217.         ADC   #$00
  218.         STA   CHKH
  219.         TYA       
  220.         RTS 
  221. ;       ** OUTPUT ONE BYTE **
  222. OUTBTC  JSR   CHKT      COMPARE CHKSUM                195E
  223. OUTBT   TAY             SAVX DATA BYTE
  224.         LSR   A         SHIFT OFF LSD
  225.         LSR   A
  226.         LSR   A
  227.         LSR   A
  228.         JSR   HEXOUT    OUTPUT MSD
  229.         TYA 
  230.         JSR   HEXOUT    OUTPUT LSD
  231.         TYA  
  232.         RTS 
  233. ;       ** CONVERT LSD OF A TO ASCII, OUTPUT TO TAPE **
  234. HEXOUT  AND   #$0F                                    196F
  235.         CMP   #$0A      
  236.         CLC   
  237.         BMI   HEX1
  238.         ADC   #$07
  239. HEX1    ADC   #$30
  240. ;       ** OUTPUT TO TAPE ONE ASCII CHAR **
  241. OUTCHT  STX   SAVX                                    197A
  242.         STY   SAVX+1
  243.         LDY   #$08      START BIT
  244. CHT1    JSR   ONE                  
  245.         LSR   A         GET DATA BIT
  246.         BCS   CHT2 
  247.         JSR   ONE       DATA BIT=1
  248.         JMP   CHT3
  249. CHT2    JSR   ZRO       DATA BIT=0 
  250. CHT3    JSR   ZRO                  
  251.         DEY
  252.         BNE   CHT1
  253.         LDX   SAVX
  254.         LDY   SAVX+1
  255.         RTS
  256. ;       ** OUTPUT 1 TO TAPE, 9 PULSES, 138 US EACH **
  257. ONE     LDX   #$09                                    199E
  258.         PHA             SAVX A
  259. ONE1    BIT   CLKRDI    WAIT FOR TIME OUT             19A1
  260.         BPL   ONE1
  261.         LDA   #126
  262.         STA   CLK1T
  263.         LDA   #$A7 
  264.         STA   SBD       SET PB7 = 1
  265. ONE2    BIT   CLKRDI                                  19B0
  266.         BPL   ONE2 
  267.         LDA   #126
  268.         STA   CLK1T
  269.         LDA   #$27 
  270.         STA   SBD       RESET PB7=0
  271.         DEX   
  272.         BNE   ONE1
  273.         PLA  
  274.         RTS  
  275. ;       ** OUTPUT 0 TO TAPE, 6 PULSES, 207 US EACH **
  276. ZRO     LDX   #$06                                    19C4
  277.         PHA             SAVX A
  278. ZRO1    BIT   CLKRDI                                  19C7
  279.         BPL   ZRO1 
  280.         LDA   #$C3 
  281.         STA   CLK1T
  282.         LDA   #$A7 
  283.         STA   SBD       SET PB7=1
  284. ZRO2    BIT   CLKRDI
  285.         BPL   ZRO2 
  286.         LDA   #195 
  287.         STA   CLK1T
  288.         LDA   #$27 
  289.         STA   SBD       RESET PB7=0
  290.         DEX        
  291.         BNE   ZRO1
  292.         PLA             RESTORE A
  293.         RTS
  294. ;       ** SUB TO INC VEB+1,2 **
  295. INCVEB  INC   VEB+1                                   19EA
  296.         BNE   INCVE1
  297.         INC   VEB+2
  298. INCVE1  RTS     
  299. ;       ** SUB TO READ BYTE FROM TAPE **
  300. RDBYT   JSR   RDCHT                                   19F3
  301.         JSR   PACKT
  302.         JSR   RDCHT
  303.         JSR   PACKT
  304.         RTS
  305. ;       ** PACK A=ASCII INTO SAVX AS HEX DATA **
  306. PACKT   CMP   #$30                                    1A00
  307.         BMI   PACKT3
  308.         CMP   #$47
  309.         BPL   PACKT3
  310.         CMP   #$40  
  311.         BMI   PACKT1
  312.         CLC         
  313.         ADC   #$09  
  314. PACKT1  ROL   A
  315.         ROL   A
  316.         ROL   A
  317.         ROL   A
  318.         LDY   #$04
  319. PACKT2  ROL   A
  320.         ROL   SAVX
  321.         DEY          
  322.         BNE   PACKT2
  323.         LDA   SAVX
  324.         LDY   #$00      Y=0 VALID HEX CHAR
  325.         RTS
  326. PACKT3  INY             Y=1 NOT HEX
  327.         RTS
  328. ;       ** GET 1 CHAR FROM TAPE AND RETURN WITH 
  329. ;          CHAR IN A.  USE SAVX+1 TO ASM CHAR  **
  330. RDCHT   STX   SAVX+2                                  1A24
  331.         LDX   #$08      READ 8 BITS
  332. RDCHT1  JSR   RDBIT     GET NEXT DATA BIT
  333.         LSR   SAVX+1    RIGHT SHIFT CHAR
  334.         ORA   SAVX+1    OR IN SIGN BIT
  335.         STA   SAVX+1    REPLACE CHAR
  336.         DEX          
  337.         BNE   RDCHT1
  338.         LDA   SAVX+1    MOVE CHAR INTO A
  339.         ROL   A         SHIFT OFF PARITY
  340.         LSR   A
  341.         LDX   SAVX+2
  342.         RTS
  343. ;       ** THIS SUB GETS ONE BIT FROM TAPE AND
  344. ;          RETURNS IT IN SIGN OF A  **
  345. RDBIT   BIT   SBD       WAIT FOR END OF START BIT     1A41
  346.         BPL   RDBIT
  347.         LDA   CLKRDT    GET START BIT TIME
  348.         LDY   #$FF      A=256-T1    
  349.         STY   CLK64T    SET UP TIMER
  350.         LDY   #$14  
  351. RDBIT3  DEY             DELAY 100 MICRO SEC
  352.         BNE   RDBIT3
  353. RDBIT2  BIT   SBD
  354.         BMI   RDBIT2    WAIT FOR NEXT START BIT
  355.         SEC   
  356.         SBC   CLKRDT    (256-T1)-(256-T2)=T2-T1
  357.         LDY   #$FF
  358.         STY   CLK64T    SET UP TIMER FOR NEXT BIT
  359.         LDY   #$07
  360. RDBIT4  DEY             DELAY 50 MICROSEC
  361.         BNE   RDBIT4
  362.         EOR   #$FF      COMPLEMENT SIGN OF A
  363.         AND   #$80      MASK ALL EXCEPT SIGN
  364.         RTS 
  365. ;       ** PLLCAL OUTPUT 166 MICROSEC (6024 HZ)
  366. ;          PULSE STRING 
  367. PLLCAL  LDA   #$27                                    1A6B
  368.         STA   SBD       TURN OFF DATIN PB5=1
  369.         LDA   #$BF      CONVERT PB7 TO OUTPUT
  370.         STA   PBDD
  371. PLL1    BIT   CLKRDI
  372.         BPL   PLL1  
  373.         LDA   #154      WAIT 166 MICROSEC
  374.         STA   CLK1T
  375.         LDA   #$A7      OUTPUT PB7=1
  376.         STA   SBD
  377. PLL2    BIT   CLKRDI
  378.         BPL   PLL2 
  379.         LDA   #154
  380.         STA   CLK1T
  381.         LDA   #$27      PB7=0
  382.         STA   SBD
  383.         JMP   PLL1
  384. ;
  385. ;       ** INTERRUPTS **
  386.         *=    $1BFA
  387. NMIP27  .WORD PLLCAL
  388. RSTP27  .WORD PLLCAL
  389. IRQP27  .WORD PLLCAL
  390. ;
  391. ;******************* 6530-002 I.C. *****************
  392. ;       ** COPYRIGHT MOS TECHNOLOGY INC.
  393. ;          DATE OCT 13, 1975 REV E
  394. ;
  395. ;       ** KIM **
  396. ;         TTY INTERFACE   6530-002
  397. ;         KEYBOARD INTERFACE,
  398. ;         7-SEGMENT 6-DIGIT DISPLAY
  399. ;
  400. ;       TTY COMANDS:
  401. ;         G    GOEXEC
  402. ;         CR   OPEN NEXT CELL
  403. ;         LF   OPEN PREVIOUS CELL
  404. ;         .    MODIFY OPEN CELL
  405. ;         SP   OPEN NEW CELL
  406. ;         L    LOAD (OBJECT FORMAT)
  407. ;         Q    DUMP FROM OPEN CELL ADDR TO HI LIMIT
  408. ;         RO   RUB OUT - RETURN TO START KIM
  409. ;               (ALL ILLEGAL CHARS ARE IGNORED)
  410. ;
  411. ;       KEYBOARD COMMANDS:
  412. ;         ADDR  SETS MODE TO MODIFY CELL ADDRESS
  413. ;         DATA  SETS MODE TO MODIFY DATA IN OPEN CELL
  414. ;         STEP  INCREMENTS TO NEXT CELL
  415. ;         RST   SYSTEM RESET
  416. ;         RUN   GOEXEC
  417. ;         STOP  $1C00 CAN BE LOADED INTO NMIV TO USE
  418. ;         PC    DISPLAY PC (PROGRAM COUNTER)
  419. ;         
  420.         *=      $1C00
  421. SAVE    STA   ACC       KIM ENTRY VIA STOP (NMI)      1C00
  422.         PLA             OR BRK (IRQ)
  423.         STA   PREG
  424.         PLA             KIM ENTRY VIA JSR (A LOST)    1C05
  425.         STA   PCL
  426.         STA   POINTL
  427.         PLA         
  428.         STA   PCH
  429.         STA   POINTH
  430.         STY   YREG
  431.         STX   XREG
  432.         TSX   
  433.         STX   SPUSER
  434.         JSR   INITS
  435.         JMP   START
  436. ;
  437. NMIT    JMP   (NMIV)    NON-MASKABLE INTERRUPT TRAP   1C1C
  438. IRQT    JMP   (IRQV)    INTERRUPT TRAP                1C1F
  439. RST     LDX   #$FF      KIM ENTRY VIA RST             1C22
  440.         TXS
  441.         STX   SPUSER
  442.         JSR   INITS
  443.         LDA   #$FF      COUNT START BIT
  444.         STA   CNTH30    ZERO CNTH30
  445.         LDA   #$01      MASK HI ORDER BITS
  446. DET1    BIT   SAD       TEST                          1C31
  447.         BNE   START     KEYBD SSW TEST
  448.         BMI   DET1      START BIT TEST
  449.         LDA   #$FC
  450. DET3    CLC             THIS LOOP COUNTS              1C3A
  451.         ADC   #$01      THE START BIT TIME
  452.         BCC   DET2
  453.         INC   CNTH30
  454. DET2    LDY   SAD       CHECK FOR END OF START BIT    1C42
  455.         BPL   DET3
  456.         STA   CNTL30
  457.         LDX   #$08
  458.         JSR   GET5      GET REST OF THE CHAR, TEST CHAR
  459. ;       ** MAKE TTY/KB SELECTION **
  460. START   JSR   INIT1                                   1C4F
  461.         LDA   #$01
  462.         BIT   SAD
  463.         BNE   TTYKB
  464.         JSR   CRLF      PRT CR LF
  465.         LDX   #$0A      TYPE OUT KIM
  466.         JSR   PRTST
  467.         JMP   SHOW1
  468. ;
  469. CLEAR   LDA   #$00
  470.         STA   INL       CLEAR INPUT BUFFER
  471.         STA   INH
  472. READ    JSR   GETCH     GET CHAR
  473.         CMP   #$01      
  474.         BEQ   TTYKB
  475.         JSR   PACK
  476.         JMP   SCAN
  477. ;       ** MAIN ROUTINE FOR KEYBOARD AND DISPLAY **
  478. TTYKB   JSR   SCAND     IF A=0 NO KEY                 1C77
  479.         BNE   START
  480. TTYKB1  LDA   #$01
  481.         BIT   SAD 
  482.         BEQ   START
  483.         JSR   SCAND
  484.         BEQ   TTYKB1
  485.         JSR   SCAND
  486.         BEQ   TTYKB1
  487.         JSR   GETKEY
  488.         CMP   #$15  
  489.         BPL   START
  490.         CMP   #$14
  491.         BEQ   PCCMD     DISPLAY PC
  492.         CMP   #$10      ADDR MODE=1
  493.         BEQ   ADDRM
  494.         CMP   #$11      DATA MODE=1
  495.         BEQ   DATAM
  496.         CMP   #$12      STEP
  497.         BEQ   STEP
  498.         CMP   #$13      RUN
  499.         BEQ   GOV
  500.         ASL   A         SHIFT CHAR INTO HIGH
  501.         ASL   A         ORDER NIBBLE
  502.         ASL   A
  503.         ASL   A
  504.         STA   TEMP      STORE IN TEMP
  505.         LDX   #$04
  506. DATA1   LDY   MODE      TEST MODE 1=ADDR
  507.         BNE   ADDR      MODE=0 DATA
  508.         LDA   (POINTL),Y   GET DATA
  509.         ASL   TEMP      SHIFT CHAR
  510.         ROL   A         SHIFT DATA
  511.         STA   (POINTL),Y  STORE OUT DATA
  512.         JMP   DATA2
  513. ;
  514. ADDR    ASL   A         SHIFT CHAR
  515.         ROL   POINTL    SHIFT ADDR
  516.         ROL   POINTH    SHIFT ADDR HI
  517. DATA2   DEX   
  518.         BNE   DATA1     DO 4 TIMES
  519.         BEQ   DATAM2    EXIT HERE
  520. ADDRM   LDA   #$01
  521.         BNE   DATAM1
  522. DATAM   LDA   #$00 
  523. DATAM1  STA   MODE 
  524. DATAM2  JMP   START
  525. ;
  526. STEP    JSR   INCPT                                   1CD3
  527.         JMP   START
  528. ;
  529. GOV     JMP   GOEXEC                                  1CD9
  530. ;       ** DISPLAY PC BY MOVING PC TO POINT **
  531. PCCMD   LDA   PCL                                     1CDC
  532.         STA   POINTL
  533.         LDA   PCH
  534.         STA   POINTH
  535.         JMP   START
  536. ;       ** LOAD PAPER TAPE FROM TTY **
  537. LOAD    JSR   GETCH     LOOK FOR FIRST CHAR           1CE7
  538.         CMP   #$3B      SEMICOLON
  539.         BNE   LOAD
  540.         LDA   #$00
  541.         STA   CHKSUM
  542.         STA   CHKHI
  543.         JSR   GETBYT    GET BYTE COUNT
  544.         TAX             SAVE IN X INDEX
  545.         JSR   CHK       COMPUTE CHECKSUM
  546.         JSR   GETBYT    GET ADDRESS HI
  547.         STA   POINTH
  548.         JSR   CHK
  549.         JSR   GETBYT    GET ADDRESS LO
  550.         STA   POINTL
  551.         JSR   CHK
  552.         TXA             IF CNT=0 DONT
  553.         BEQ   LOAD3     GET ANY DATA
  554. LOAD2   JSR   GETBYT    GET DATA
  555.         STA   (POINTL),Y  STORE DATA
  556.         JSR   CHK
  557.         JSR   INCPT     NEXT ADDRESS
  558.         DEX    
  559.         BNE   LOAD2
  560.         INX             X=1 DATA RCD X=0 LAST RCD
  561. LOAD3   JSR   GETBYT    COMPARE CHKSUM
  562.         CMP   CHKHI
  563.         BNE   LOADE1
  564.         JSR   GETBYT
  565.         CMP   CHKSUM
  566.         BNE   LOADER
  567.         TXA             X=0 LAST RECORD
  568.         BNE   LOAD
  569.         LDX   #$0C      X-OFF KIM
  570. LOAD8   LDA   #$27
  571.         STA   SBD       DISABLE DATA IN
  572.         JSR   PRTST
  573.         JMP   START
  574. ;
  575. LOADE1  JSR   GETBYT    DUMMY
  576. LOADER  LDX   #$11      X-OFF ERR KIM
  577.         BNE   LOAD8
  578. ;       ** DUMP TO TTY FROM OPEN CELL ADDRESS TO 
  579. ;          LIMHL, LIMHH **
  580. DUMP    LDA   #$00                                    1D42
  581.         STA   INL
  582.         STA   INH       CLEAR RECORD COUNT
  583. DUMP0   LDA   #$00
  584.         STA   CHKHI     CLEAR CHKSUM
  585.         STA   CHKSUM
  586.         JSR   CRLF      PRINT CR LF
  587.         LDA   #$3B      PRINT SEMICOLON
  588.         JSR   OUTCH
  589.         LDA   POINTL    TEST POINT GT OR ET
  590.         CMP   EAL       HI LIMIT GOTO EXIT
  591.         LDA   POINTH
  592.         SBC   EAH
  593.         BCC   DUMP4
  594.         LDA   #$00      PRINT LAST RECORD
  595.         JSR   PRTBYT    0 BYTES
  596.         JSR   OPEN
  597.         JSR   PRTPNT
  598.         LDA   CHKHI     PRINT CHKSUM
  599.         JSR   PRTBYT    FOR LAST RECORD
  600.         LDA   CHKSUM
  601.         JSR   PRTBYT
  602.         JMP   CLEAR
  603. ;
  604. DUMP4   LDA   #$18      PRINT 24 BYTE COUNT           1D7A
  605.         TAX             SAVE AS INDEX
  606.         JSR   PRTBYT
  607.         JSR   CHK
  608.         JSR   PRTPNT
  609. DUMP2   LDY   #$00      PRINT 24 BYTES
  610.         LDA   (POINTL),Y  GET DATA
  611.         JSR   PRTBYT    PRINT DATA
  612.         JSR   CHK       COMPUTE CHKSUM
  613.         JSR   INCPT     INCREMENT POINT
  614.         DEX
  615.         BNE   DUMP2
  616.         LDA   CHKHI     PRINT CHKSUM
  617.         JSR   PRTBYT
  618.         LDA   CHKSUM
  619.         JSR   PRTBYT
  620.         INC   INL       INCR RECORD COUNT
  621.         BNE   DUMP3
  622.         INC   INH
  623. DUMP3   JMP   DUMP0
  624. ;
  625. SPACE   JSR   OPEN      OPEN NEW CELL                 1DA9
  626. SHOW    JSR   CRLF      PRINT CR LF
  627. SHOW1   JSR   PRTPNT
  628.         JSR   OUTSP     PRINT SPACE
  629.         LDY   #$00      PRINT DATA SPECIFIED
  630.         LDA   (POINTL),Y  BY POINT AD=LDA EXT
  631.         JSR   PRTBYT
  632.         JSR   OUTSP     PRINT SPACE
  633.         JMP   CLEAR
  634. ;
  635. RTRN    JSR   INCPT     OPEN NEXT CELL                1DC2
  636.         JMP   SHOW
  637. ;
  638. GOEXEC  LDX   SPUSER                                  1DC8
  639.         TXS   
  640.         LDA   POINTH    PROGRAM RUNS FROM
  641.         PHA             OPEN CELL ADDRESS
  642.         LDA   POINTL
  643.         PHA      
  644.         LDA   PREG
  645.         PHA       
  646.         LDX   XREG      RESTORE REGS
  647.         LDY   YREG
  648.         LDA   ACC
  649.         RTI
  650. ;
  651. SCAN    CMP   #$20      OPEN CELL
  652.         BEQ   SPACE
  653.         CMP   #$7F      RUB OUT (KIM)
  654.         BEQ   STV
  655.         CMP   #$0D      NEXT CELL
  656.         BEQ   RTRN
  657.         CMP   #$0A      PREV CELL
  658.         BEQ   FEED
  659.         CMP   #'.       MODIFY CELL
  660.         BEQ   MODIFY
  661.         CMP   #'G       GO EXEC
  662.         BEQ   GOEXEC
  663.         CMP   #'Q       DUMP FROM OPEN CELL TO HI LIMIT
  664.         BEQ   DUMPV
  665.         CMP   #'L       LOAD TAPE
  666.         BEQ   LOADV
  667.         JMP   READ      IGNORE ILLEGAL CHAR
  668. ;
  669. STV     JMP   START
  670. DUMPV   JMP   DUMP
  671. LOADV   JMP   LOAD 
  672. ;
  673. FEED    SEC                                           1E07
  674.         LDA   POINTL    DEC DOUBLE BYTE
  675.         SBC   #$01      AT POINTL AND POINTH
  676.         STA   POINTL
  677.         BCS   FEED1
  678.         DEC   POINTH
  679. FEED1   JMP   SHOW
  680. ;
  681. MODIFY  LDY   #$00      GET CONTENTS OF INPUT BUFF 
  682.         LDA   INL       INL AND STORE IN LOC
  683.         STA   (POINTL),Y  SPECIFIED BY POINT
  684.         JMP   RTRN 
  685. ;
  686. ;       ** SUBROUTINES FOLLOW **
  687. PRTPNT  LDA   POINTH    PRINT POINTL, POINTH          1E1E
  688.         JSR   PRTBYT
  689.         JSR   CHK
  690.         LDA   POINTL
  691.         JSR   PRTBYT
  692.         JSR   CHK
  693.         RTS
  694. ;       **PRINT STRING OF ASCII CHARS FROM TOP+X TO TOP
  695. CRLF    LDX   #$07    
  696. PRTST   LDA   TOP,X 
  697.         JSR   OUTCH
  698.         DEX 
  699.         BPL   PRTST     STOP ON INDEX ZERO
  700.         RTS
  701. ;       ** PRINT 1 HEX BYTE AS 2 ASCII CHARS **
  702. PRTBYT  STA   TEMP                                    1E3B
  703.         LSR   A         SHIFT CHAR RIGHT 4 BITS
  704.         LSR   A
  705.         LSR   A
  706.         LSR   A
  707.         JSR   HEXTA     CONVERT TO HEX AND PRINT
  708.         LDA   TEMP      GET OTHER HALF
  709.         JSR   HEXTA     CONVERT TO HEX AND PRINT
  710.         LDA   TEMP      RESTORE BYTE IN A AND RETURN
  711.         RTS   
  712. HEXTA   AND   #$0F      MASK HI 4 BITS
  713.         CMP   #$0A
  714.         CLC       
  715.         BMI   HEXTA1
  716.         ADC   #$07      ALPHA HEX
  717. HEXTA1  ADC   #$30      DEC HEX
  718.         JMP   OUTCH     PRINT CHAR
  719. ;       ** GET 1 CHAR FROM TTY, CHAR IN A
  720. GETCH   STX   TMPX      SAVE X REG     1E5A
  721.         LDX   #$08      SET UP 8-BIT COUNT
  722.         LDA   #$01
  723. GET1    BIT   SAD
  724.         BNE   GET6 
  725.         BMI   GET1      WAIT FOR START BIT
  726.         JSR   DELAY     DELAY 1 BIT
  727. GET5    JSR   DEHALF    DELAY 1/2 BIT TIME
  728. GET2    LDA   SAD       GET 8 BITS
  729.         AND   #$80      MASK OFF LOW ORDER BITS
  730.         LSR   CHAR      SHIFT RIGHT CHAR
  731.         ORA   CHAR
  732.         STA   CHAR
  733.         JSR   DELAY     DELAY 1 BIT TIME
  734.         DEX  
  735.         BNE   GET2      GET NEXT CHAR
  736.         JSR   DEHALF    EXIT THIS ROUTINE
  737.         LDX   TMPX
  738.         LDA   CHAR
  739.         ROL   A SHIFT OFF PARITY
  740.         LSR   A
  741. GET6    RTS   
  742. ;       ** INITIALIZATION FOR SIGMA **
  743. INITS   LDX   #$01      SET KB MODE TO ADDR           1E88
  744.         STX   MODE
  745. INIT1   LDX   #$00      
  746.         STX   PADD      FOR SIGMA USE SADD
  747.         LDX   #$3F
  748.         STX   PBDD      FOR SIGMA USE SBDD
  749.         LDX   #$07      ENABLE DATA IN
  750.         STX   SBD       OUTPUT
  751.         CLD    
  752.         SEI    
  753.         RTS
  754. ;       ** PRINT ONE CHAR IN A **
  755. OUTSP   LDA   #$20      PRINT SPACE                   1E9E
  756. OUTCH   STA   CHAR
  757.         STX   TMPX
  758.         JSR   DELAY     DELAY 10/11 BIT CODE SYNC
  759.         LDA   SBD       START BIT
  760.         AND   #$FE
  761.         STA   SBD
  762.         JSR   DELAY
  763.         LDX   #$08 
  764. OUT1    LDA   SBD       DATA BIT
  765.         AND   #$FE 
  766.         LSR   CHAR
  767.         ADC   #$00
  768.         STA   SBD  
  769.         JSR   DELAY
  770.         DEX  
  771.         BNE   OUT1
  772.         LDA   SBD       STOP BIT
  773.         ORA   #$01
  774.         STA   SBD
  775.         JSR   DELAY     STOP BIT
  776.         LDX   TMPX      RESTORE INDEX
  777.         RTS
  778. ;       ** DELAY 1 BIT TIME **
  779. DELAY   LDA   CNTH30                                  1ED4
  780.         STA   TIMH
  781.         LDA   CNTL30
  782. DE2     SEC   
  783. DE4     SBC   #$01 
  784.         BCS   DE3  
  785.         DEC   TIMH
  786. DE3     LDY   TIMH
  787.         BPL   DE2
  788.         RTS
  789. ;       ** DELAY 1/2 BIT TIME **
  790. DEHALF  LDA   CNTH30                                  1EEB  
  791.         STA   TIMH
  792.         LDA   CNTL30
  793.         LSR   A
  794.         LSR   TIMH
  795.         BCC   DE2
  796.         ORA   #$80
  797.         BCS   DE4
  798. ;       ** SUB TO DETERMINE IF KEY IS DEPRESSED OR 
  799. ;          CONDITION OF SSW KEY NOT DEPRESSED OR
  800. ;          TTY MODE  A=0
  801. ;          KEY DEPRESSED OR KB MODE  A NOT ZERO
  802. AK      LDY   #$03      3 ROWS
  803.         LDX   #$01      DIGIT 0
  804. ONEKEY  LDA   #$FF
  805. AK1     STX   SBD       OUTPUT DIGIT
  806.         INX             GET NEXT DIGIT
  807.         INX 
  808.         AND   SAD       INPUT SEGMENTS
  809.         DEY 
  810.         BNE   AK1
  811.         LDY   #$07
  812.         STY   SBD
  813.         ORA   #$80
  814.         EOR   #$FF
  815.         RTS 
  816. ;       ** OUTPUT TO 7-SEGMENT DISPLAY **
  817. SCAND   LDY   #$00      GET DATA                      1F19 
  818.         LDA   (POINTL),Y  SPECIFIED BY POINT
  819.         STA   INH       SET UP DISPLAY BUFFER
  820.         LDA   #$7F      CHANGE SEG
  821.         STA   PADD      TO OUTPUT
  822.         LDX   #$09      INIT DIGIT NUMBER
  823.         LDY   #$03      OUTPUT 3 BYTES
  824. SCAND1  LDA   INL,Y     GET BYTE
  825.         LSR   A         GET MSD
  826.         LSR   A
  827.         LSR   A
  828.         LSR   A
  829.         JSR   CONVD     OUTPUT CHAR
  830.         LDA   INL,Y     GET BYTE AGAIN
  831.         AND   #$0F      GET LSD
  832.         JSR   CONVD     OUTPUT CHAR
  833.         DEY             SET UP FOR NEXT BYTE
  834.         BNE   SCAND1
  835.         STX   SBD       ALL DIGITS OFF
  836.         LDA   #$00      CHANGE SEGMENT
  837.         STA   PADD      TO INPUTS
  838.         JMP   AK        GET ANY KEY
  839. ;       ** CONVERT AND DISPLAY HEX (USED BY SCAND ONLY)**
  840. CONVD   STY   TEMP
  841.         TAY             SAVE Y
  842.         LDA   TABLE,Y   USE CHAR AS INDEX
  843.         LDY   #$00      LOOKUP CONVERSION
  844.         STY   SAD       TURN OFF SEGMENTS
  845.         STX   SBD       OUTPUT DIGIT ENABLE
  846.         STA   SAD       OUTPUT SEGMENTS
  847.         LDY   #$7F      DELAY 500 CYCLES
  848. CONVD1  DEY   
  849.         BNE   CONVD1
  850.         INX             GET NEXT DIGIT NUMBER
  851.         INX             ADD 2
  852.         LDY   TEMP      RESTORE Y
  853.         RTS
  854. ;       ** INCREMENT POINT **
  855. INCPT   INC   POINTL
  856.         BNE   INCPT2
  857.         INC   POINTH
  858. INCPT2  RTS   
  859. ;       ** GET KEY FROM KEYPAD A=KEYVALUE **
  860. GETKEY  LDX   #$21      START AT DIGIT 0              1F6A 
  861. GETKE5  LDY   #$01      GET 1 ROW
  862.         JSR   ONEKEY
  863.         BNE   KEYIN     A=0 NO KEY
  864.         CPX   #$27      TEST FOR DIGIT 2
  865.         BNE   GETKE5
  866.         LDA   #$15      15=NOKEY
  867.         RTS
  868. KEYIN   LDY   #$FF      
  869. KEYIN1  ASL   A         SHIFT LEFT
  870.         BCS   KEYIN2    UNTIL Y=KEY NO
  871.         INY   
  872.         BPL   KEYIN1
  873. KEYIN2  TXA  
  874.         AND   #$0F      MASK MSD
  875.         LSR   A         DIVIDE BY 2
  876.         TAX   
  877.         TYA   
  878.         BPL   KEYIN4
  879. KEYIN3  CLC   
  880.         ADC   #$07      MULT (X-1 TIMES A
  881. KEYIN4  DEX   
  882.         BNE   KEYIN3
  883.         RTS
  884. ;       ** COMPUTE CHECKSUM **
  885. CHK     CLC   
  886.         ADC   CHKSUM
  887.         STA   CHKSUM
  888.         LDA   CHKHI
  889.         ADC   #$00
  890.         STA   CHKHI
  891.         RTS
  892. ;       ** GET 2 HEX CHARS AND PACK INTO INL AND INH **
  893. GETBYT  JSR   GETCH
  894.         JSR   PACK
  895.         JSR   GETCH
  896.         JSR   PACK
  897.         LDA   INL
  898.         RTS
  899. ;       ** SHIFT CHAR IN A INTO INL AND INH **
  900. PACK    CMP   #$30      CHECK FOR HEX  1FAC
  901.         BMI   UPDAT2
  902.         CMP   #$47      NOT HEX EXIT
  903.         BPL   UPDAT2
  904.         CMP   #$40      CONVERT TO HEX
  905.         BMI   UPDATE
  906.         CLC   
  907.         ADC   #$09
  908. UPDATE  ROL   A
  909.         ROL   A
  910.         ROL   A
  911.         ROL   A
  912.         LDY   #$04      SHIFT INTO I/O BUFFER
  913. UPDAT1  ROL   A 
  914.         ROL   INL
  915.         ROL   INH
  916.         DEY   
  917.         BNE   UPDAT1
  918.         LDA   #$00      A=0 IF HEX NUM
  919. UPDAT2  RTS   
  920. ;
  921. OPEN    LDA   INL       MOVE I/O BUFFER TO POINT
  922.         STA   POINTL
  923.         LDA   INH       TRANSFER INH- POINTH
  924.         STA   POINTH
  925.         RTS
  926. ;
  927. ;       ** TABLES **
  928. TOP     .DBYTE $0000,$0000,$0000,$0A0D                1FD5
  929.         .BYTE  'M,'I,'K,$20,$13         KIM
  930.         .BYTE  'R,'R,'E,$20,$13         ERR
  931. TABLE   .DBYTE $BF86,$DBCF,$E6ED,$FD87 ;0-7           1FE7
  932.         .DBYTE $FFEF,$F7FC,$B9DE,$F9F1 ;8-F HEX TO 7-SEG
  933. ;
  934. ;       ** INTERRUPT VECTORS **
  935.         *=    $1FFA
  936. NMIENT  .WORD NMIT
  937. RSTENT  .WORD RST
  938. IRQENT  .WORD IRQT
  939.         .END
  940.  
  941.