home *** CD-ROM | disk | FTP | other *** search
- ;- - - - - - - - - - - - - - kim.asm - - - - - - - - - - -
-
- ; copyright mos technology, inc
-
- ; date: oct 18, 1975 rev-d
-
- ;************************ 6530-003 i.c. ******************
-
- ; 6530-003 i.c. is an audio cassette tape recorder
-
- ; extension of the basic kim monitor. it features
-
- ; two routines:
-
- ; loadt - load memory from audio tape
-
- ; id=00 ignore id
-
- ; id=ff ignore id, use sa for start addr
-
- ; id=01-fe use address on tape
-
- ;
-
- ; dumpt - store memory onto audio tape
-
- ; id=00 should not be used
-
- ; id=ff should not be used
-
- ; id=01-fe normal id range
-
- ; sal lsb starting address of program
-
- ; sah msb
-
- ; eal ending address of program
-
- ; eah msb
-
- ;
-
- *= $1800
-
- sad = $1740 6530 a data
-
- padd = $1741 6530 a data direction
-
- sbd = $1742 6530 b data
-
- pbdd = $1743 6530 b data direction
-
- clk1t = $1744 div by 1 time
-
- clk8t = $1745 div by 8 time
-
- clk64t = $1746 div by 64 time
-
- clkkt = $1747 div by 1024 time
-
- clkrdi = $1747 read time out bit
-
- clkrdt = $1746 read time
-
- ; ** mpu reg. savx area in page 0 **
-
- pcl = $ef program cnt low
-
- pch = $f0 program cnt hi
-
- preg = $f1 current status reg
-
- spuser = $f2 current stack pointer
-
- acc = $f3 accumulator
-
- yreg = $f4 y index
-
- xreg = $f5 x index
-
- ; ** kim fixed area in page 0 **
-
- chkhi = $f6
-
- chksum = $f7
-
- inl = $f8 input buffer
-
- inh = $f9 input buffer
-
- pointl = $fa lsb of open cell
-
- pointh = $fb msb of open cell
-
- temp = $fc
-
- tmpx = $fd
-
- char = $fe
-
- mode = $ff
-
- ; ** kim fixed area in page 23 **
-
- chkl = $17e7
-
- chkh = $17e8 chksum
-
- savx = $17e9 (3-bytes)
-
- veb = $17ec volatile exec block (6-b)
-
- cntl30 = $17f2 tty delay
-
- cnth30 = $17f3 tty delay
-
- timh = $17f4
-
- sal = $17f5 low starting address
-
- sah = $17f6 hi starting address
-
- eal = $17f7 low ending address
-
- eah = $17f8 hi ending address
-
- id = $17f9 tape program id number
-
- ; ** interrupt vectors **
-
- nmiv = $17fa stop vector (stop=1c00)
-
- rstv = $17fc rst vector
-
- irqv = $17fe irq vector (brk=1c00)
-
-
-
- ;
-
- ; ** dump memory to tape **
-
- dumpt lda #$ad load absolute inst 1800
-
- sta veb
-
- jsr intveb
-
- lda #$27 turn off datain pb5
-
- sta sbd
-
- lda #$bf convert pb7 to output
-
- sta pbdd
-
- ldx #$64 100 chars
-
- dumpt1 lda #$16 sync chars
-
- jsr outcht
-
- dex
-
- bne dumpt1
-
- lda #$2a start char
-
- jsr outcht
-
- lda id output id
-
- jsr outbt
-
- lda sal output starting
-
- jsr outbtc address
-
- lda sah
-
- jsr outbtc
-
- dumpt2 lda veb+1 check for last
-
- cmp eal data byte
-
- lda veb+2
-
- sbc eah
-
- bcc dumpt4
-
- lda #'/ output end-of-data char
-
- jsr outcht
-
- lda chkl last byte has been
-
- jsr outbt output now output
-
- lda chkh chksum
-
- jsr outbt
-
- ldx #$02 2 chars
-
- dumpt3 lda #$04 eot char
-
- jsr outcht
-
- dex
-
- bne dumpt3
-
- lda #$00 display 0000
-
- sta pointl for normal exit
-
- sta pointh
-
- jmp start
-
- dumpt4 jsr veb data byte output
-
- jsr outbtc
-
- jsr incveb
-
- jmp dumpt2
-
- ;
-
- ; ** load memory from tape **
-
- ;
-
- tab .word load12 'load12' address 1871
-
- ;
-
- loadt lda #$8d init volatile execution 1873
-
- sta veb block with sta abs.
-
- jsr intveb
-
- lda #$4c jump type rtrn
-
- sta veb+3
-
- lda tab
-
- sta veb+4
-
- lda tab+1
-
- sta veb+5
-
- lda #$07 reset pb5=0 (data-in)
-
- sta sbd
-
- sync lda #$ff clear savx for sync char 1891
-
- sta savx
-
- sync1 jsr rdbit get a bit
-
- lsr savx shift bit into char
-
- ora savx
-
- sta savx
-
- lda savx get new char
-
- cmp #$16 sync char
-
- bne sync1
-
- ldx #$0a test for 10 sync chars
-
- sync2 jsr rdcht
-
- cmp #$16
-
- bne sync if not 10 char, re-sync
-
- dex
-
- bne sync2
-
- loadt4 jsr rdcht look for start of
-
- cmp #$2a data char
-
- beq load11
-
- cmp #$16 if not , should be sync
-
- bne sync
-
- beq loadt4
-
- load11 jsr rdbyt read id from tape
-
- cmp id compare with requested id
-
- beq loadt5
-
- lda id default 00, read record
-
- cmp #$00 anyway
-
- beq loadt5
-
- cmp #$ff default ff, ignore sa on
-
- beq loadt6 tape
-
- bne loadt
-
- loadt5 jsr rdbyt get sa from tape
-
- jsr chkt
-
- sta veb+1 savx in veb+1,2
-
- jsr rdbyt
-
- jsr chkt
-
- sta veb+2
-
- jmp loadt7
-
- ;
-
- loadt6 jsr rdbyt get sa but ignore 18ec
-
- jsr chkt
-
- jsr rdbyt
-
- jsr chkt
-
- loadt7 ldx #$02 get 2 chars
-
- load13 jsr rdcht get char (x)
-
- cmp #$2f look for last char
-
- beq loadt8
-
- jsr packt convert to hex
-
- bne loadt9 y=1 non-hex char
-
- dex
-
- bne load13
-
- jsr chkt compare checksum
-
- jmp veb savx data in memory
-
- load12 jsr incveb incr data pointer
-
- jmp loadt7
-
- ;
-
- loadt8 jsr rdbyt end of data, compare chksum 1915
-
- cmp chkl
-
- bne loadt9
-
- jsr rdbyt
-
- cmp chkh
-
- bne loadt9
-
- lda #$00 normal exit
-
- beq load10
-
- loadt9 lda #$ff error exit
-
- load10 sta pointl
-
- sta pointh
-
- jmp start
-
- ;
-
- ; ** subroutines below **
-
- intveb lda sal move sa to veb+1,2 1932
-
- sta veb+1
-
- lda sah
-
- sta veb+2
-
- lda #$60 rts inst
-
- sta veb+3
-
- lda #$00 clear chksum area
-
- sta chkl
-
- sta chkh
-
- rts
-
- ; ** compute chksum for tape load **
-
- chkt tay 194c
-
- clc
-
- adc chkl
-
- sta chkl
-
- lda chkh
-
- adc #$00
-
- sta chkh
-
- tya
-
- rts
-
- ; ** output one byte **
-
- outbtc jsr chkt compare chksum 195e
-
- outbt tay savx data byte
-
- lsr a shift off lsd
-
- lsr a
-
- lsr a
-
- lsr a
-
- jsr hexout output msd
-
- tya
-
- jsr hexout output lsd
-
- tya
-
- rts
-
- ; ** convert lsd of a to ascii, output to tape **
-
- hexout and #$0f 196f
-
- cmp #$0a
-
- clc
-
- bmi hex1
-
- adc #$07
-
- hex1 adc #$30
-
- ; ** output to tape one ascii char **
-
- outcht stx savx 197a
-
- sty savx+1
-
- ldy #$08 start bit
-
- cht1 jsr one
-
- lsr a get data bit
-
- bcs cht2
-
- jsr one data bit=1
-
- jmp cht3
-
- cht2 jsr zro data bit=0
-
- cht3 jsr zro
-
- dey
-
- bne cht1
-
- ldx savx
-
- ldy savx+1
-
- rts
-
- ; ** output 1 to tape, 9 pulses, 138 us each **
-
- one ldx #$09 199e
-
- pha savx a
-
- one1 bit clkrdi wait for time out 19a1
-
- bpl one1
-
- lda #126
-
- sta clk1t
-
- lda #$a7
-
- sta sbd set pb7 = 1
-
- one2 bit clkrdi 19b0
-
- bpl one2
-
- lda #126
-
- sta clk1t
-
- lda #$27
-
- sta sbd reset pb7=0
-
- dex
-
- bne one1
-
- pla
-
- rts
-
- ; ** output 0 to tape, 6 pulses, 207 us each **
-
- zro ldx #$06 19c4
-
- pha savx a
-
- zro1 bit clkrdi 19c7
-
- bpl zro1
-
- lda #$c3
-
- sta clk1t
-
- lda #$a7
-
- sta sbd set pb7=1
-
- zro2 bit clkrdi
-
- bpl zro2
-
- lda #195
-
- sta clk1t
-
- lda #$27
-
- sta sbd reset pb7=0
-
- dex
-
- bne zro1
-
- pla restore a
-
- rts
-
- ; ** sub to inc veb+1,2 **
-
- incveb inc veb+1 19ea
-
- bne incve1
-
- inc veb+2
-
- incve1 rts
-
- ; ** sub to read byte from tape **
-
- rdbyt jsr rdcht 19f3
-
- jsr packt
-
- jsr rdcht
-
- jsr packt
-
- rts
-
- ; ** pack a=ascii into savx as hex data **
-
- packt cmp #$30 1a00
-
- bmi packt3
-
- cmp #$47
-
- bpl packt3
-
- cmp #$40
-
- bmi packt1
-
- clc
-
- adc #$09
-
- packt1 rol a
-
- rol a
-
- rol a
-
- rol a
-
- ldy #$04
-
- packt2 rol a
-
- rol savx
-
- dey
-
- bne packt2
-
- lda savx
-
- ldy #$00 y=0 valid hex char
-
- rts
-
- packt3 iny y=1 not hex
-
- rts
-
- ; ** get 1 char from tape and return with
-
- ; char in a. use savx+1 to asm char **
-
- rdcht stx savx+2 1a24
-
- ldx #$08 read 8 bits
-
- rdcht1 jsr rdbit get next data bit
-
- lsr savx+1 right shift char
-
- ora savx+1 or in sign bit
-
- sta savx+1 replace char
-
- dex
-
- bne rdcht1
-
- lda savx+1 move char into a
-
- rol a shift off parity
-
- lsr a
-
- ldx savx+2
-
- rts
-
- ; ** this sub gets one bit from tape and
-
- ; returns it in sign of a **
-
- rdbit bit sbd wait for end of start bit 1a41
-
- bpl rdbit
-
- lda clkrdt get start bit time
-
- ldy #$ff a=256-t1
-
- sty clk64t set up timer
-
- ldy #$14
-
- rdbit3 dey delay 100 micro sec
-
- bne rdbit3
-
- rdbit2 bit sbd
-
- bmi rdbit2 wait for next start bit
-
- sec
-
- sbc clkrdt (256-t1)-(256-t2)=t2-t1
-
- ldy #$ff
-
- sty clk64t set up timer for next bit
-
- ldy #$07
-
- rdbit4 dey delay 50 microsec
-
- bne rdbit4
-
- eor #$ff complement sign of a
-
- and #$80 mask all except sign
-
- rts
-
- ; ** pllcal output 166 microsec (6024 hz)
-
- ; pulse string
-
- pllcal lda #$27 1a6b
-
- sta sbd turn off datin pb5=1
-
- lda #$bf convert pb7 to output
-
- sta pbdd
-
- pll1 bit clkrdi
-
- bpl pll1
-
- lda #154 wait 166 microsec
-
- sta clk1t
-
- lda #$a7 output pb7=1
-
- sta sbd
-
- pll2 bit clkrdi
-
- bpl pll2
-
- lda #154
-
- sta clk1t
-
- lda #$27 pb7=0
-
- sta sbd
-
- jmp pll1
-
- ;
-
- ; ** interrupts **
-
- *= $1bfa
-
- nmip27 .word pllcal
-
- rstp27 .word pllcal
-
- irqp27 .word pllcal
-
- ;
-
- ;******************* 6530-002 i.c. *****************
-
- ; ** copyright mos technology inc.
-
- ; date oct 13, 1975 rev e
-
- ;
-
- ; ** kim **
-
- ; tty interface 6530-002
-
- ; keyboard interface,
-
- ; 7-segment 6-digit display
-
- ;
-
- ; tty comands:
-
- ; g goexec
-
- ; cr open next cell
-
- ; lf open previous cell
-
- ; . modify open cell
-
- ; sp open new cell
-
- ; l load (object format)
-
- ; q dump from open cell addr to hi limit
-
- ; ro rub out - return to start kim
-
- ; (all illegal chars are ignored)
-
- ;
-
- ; keyboard commands:
-
- ; addr sets mode to modify cell address
-
- ; data sets mode to modify data in open cell
-
- ; step increments to next cell
-
- ; rst system reset
-
- ; run goexec
-
- ; stop $1c00 can be loaded into nmiv to use
-
- ; pc display pc (program counter)
-
- ;
-
- *= $1c00
-
- save sta acc kim entry via stop (nmi) 1c00
-
- pla or brk (irq)
-
- sta preg
-
- pla kim entry via jsr (a lost) 1c05
-
- sta pcl
-
- sta pointl
-
- pla
-
- sta pch
-
- sta pointh
-
- sty yreg
-
- stx xreg
-
- tsx
-
- stx spuser
-
- jsr inits
-
- jmp start
-
- ;
-
- nmit jmp (nmiv) non-maskable interrupt trap 1c1c
-
- irqt jmp (irqv) interrupt trap 1c1f
-
- rst ldx #$ff kim entry via rst 1c22
-
- txs
-
- stx spuser
-
- jsr inits
-
- lda #$ff count start bit
-
- sta cnth30 zero cnth30
-
- lda #$01 mask hi order bits
-
- det1 bit sad test 1c31
-
- bne start keybd ssw test
-
- bmi det1 start bit test
-
- lda #$fc
-
- det3 clc this loop counts 1c3a
-
- adc #$01 the start bit time
-
- bcc det2
-
- inc cnth30
-
- det2 ldy sad check for end of start bit 1c42
-
- bpl det3
-
- sta cntl30
-
- ldx #$08
-
- jsr get5 get rest of the char, test char
-
- ; ** make tty/kb selection **
-
- start jsr init1 1c4f
-
- lda #$01
-
- bit sad
-
- bne ttykb
-
- jsr crlf prt cr lf
-
- ldx #$0a type out kim
-
- jsr prtst
-
- jmp show1
-
- ;
-
- clear lda #$00
-
- sta inl clear input buffer
-
- sta inh
-
- read jsr getch get char
-
- cmp #$01
-
- beq ttykb
-
- jsr pack
-
- jmp scan
-
- ; ** main routine for keyboard and display **
-
- ttykb jsr scand if a=0 no key 1c77
-
- bne start
-
- ttykb1 lda #$01
-
- bit sad
-
- beq start
-
- jsr scand
-
- beq ttykb1
-
- jsr scand
-
- beq ttykb1
-
- jsr getkey
-
- cmp #$15
-
- bpl start
-
- cmp #$14
-
- beq pccmd display pc
-
- cmp #$10 addr mode=1
-
- beq addrm
-
- cmp #$11 data mode=1
-
- beq datam
-
- cmp #$12 step
-
- beq step
-
- cmp #$13 run
-
- beq gov
-
- asl a shift char into high
-
- asl a order nibble
-
- asl a
-
- asl a
-
- sta temp store in temp
-
- ldx #$04
-
- data1 ldy mode test mode 1=addr
-
- bne addr mode=0 data
-
- lda (pointl),y get data
-
- asl temp shift char
-
- rol a shift data
-
- sta (pointl),y store out data
-
- jmp data2
-
- ;
-
- addr asl a shift char
-
- rol pointl shift addr
-
- rol pointh shift addr hi
-
- data2 dex
-
- bne data1 do 4 times
-
- beq datam2 exit here
-
- addrm lda #$01
-
- bne datam1
-
- datam lda #$00
-
- datam1 sta mode
-
- datam2 jmp start
-
- ;
-
- step jsr incpt 1cd3
-
- jmp start
-
- ;
-
- gov jmp goexec 1cd9
-
- ; ** display pc by moving pc to point **
-
- pccmd lda pcl 1cdc
-
- sta pointl
-
- lda pch
-
- sta pointh
-
- jmp start
-
- ; ** load paper tape from tty **
-
- load jsr getch look for first char 1ce7
-
- cmp #$3b semicolon
-
- bne load
-
- lda #$00
-
- sta chksum
-
- sta chkhi
-
- jsr getbyt get byte count
-
- tax save in x index
-
- jsr chk compute checksum
-
- jsr getbyt get address hi
-
- sta pointh
-
- jsr chk
-
- jsr getbyt get address lo
-
- sta pointl
-
- jsr chk
-
- txa if cnt=0 dont
-
- beq load3 get any data
-
- load2 jsr getbyt get data
-
- sta (pointl),y store data
-
- jsr chk
-
- jsr incpt next address
-
- dex
-
- bne load2
-
- inx x=1 data rcd x=0 last rcd
-
- load3 jsr getbyt compare chksum
-
- cmp chkhi
-
- bne loade1
-
- jsr getbyt
-
- cmp chksum
-
- bne loader
-
- txa x=0 last record
-
- bne load
-
- ldx #$0c x-off kim
-
- load8 lda #$27
-
- sta sbd disable data in
-
- jsr prtst
-
- jmp start
-
- ;
-
- loade1 jsr getbyt dummy
-
- loader ldx #$11 x-off err kim
-
- bne load8
-
- ; ** dump to tty from open cell address to
-
- ; limhl, limhh **
-
- dump lda #$00 1d42
-
- sta inl
-
- sta inh clear record count
-
- dump0 lda #$00
-
- sta chkhi clear chksum
-
- sta chksum
-
- jsr crlf print cr lf
-
- lda #$3b print semicolon
-
- jsr outch
-
- lda pointl test point gt or et
-
- cmp eal hi limit goto exit
-
- lda pointh
-
- sbc eah
-
- bcc dump4
-
- lda #$00 print last record
-
- jsr prtbyt 0 bytes
-
- jsr open
-
- jsr prtpnt
-
- lda chkhi print chksum
-
- jsr prtbyt for last record
-
- lda chksum
-
- jsr prtbyt
-
- jmp clear
-
- ;
-
- dump4 lda #$18 print 24 byte count 1d7a
-
- tax save as index
-
- jsr prtbyt
-
- jsr chk
-
- jsr prtpnt
-
- dump2 ldy #$00 print 24 bytes
-
- lda (pointl),y get data
-
- jsr prtbyt print data
-
- jsr chk compute chksum
-
- jsr incpt increment point
-
- dex
-
- bne dump2
-
- lda chkhi print chksum
-
- jsr prtbyt
-
- lda chksum
-
- jsr prtbyt
-
- inc inl incr record count
-
- bne dump3
-
- inc inh
-
- dump3 jmp dump0
-
- ;
-
- space jsr open open new cell 1da9
-
- show jsr crlf print cr lf
-
- show1 jsr prtpnt
-
- jsr outsp print space
-
- ldy #$00 print data specified
-
- lda (pointl),y by point ad=lda ext
-
- jsr prtbyt
-
- jsr outsp print space
-
- jmp clear
-
- ;
-
- rtrn jsr incpt open next cell 1dc2
-
- jmp show
-
- ;
-
- goexec ldx spuser 1dc8
-
- txs
-
- lda pointh program runs from
-
- pha open cell address
-
- lda pointl
-
- pha
-
- lda preg
-
- pha
-
- ldx xreg restore regs
-
- ldy yreg
-
- lda acc
-
- rti
-
- ;
-
- scan cmp #$20 open cell
-
- beq space
-
- cmp #$7f rub out (kim)
-
- beq stv
-
- cmp #$0d next cell
-
- beq rtrn
-
- cmp #$0a prev cell
-
- beq feed
-
- cmp #'. modify cell
-
- beq modify
-
- cmp #'g go exec
-
- beq goexec
-
- cmp #'q dump from open cell to hi limit
-
- beq dumpv
-
- cmp #'l load tape
-
- beq loadv
-
- jmp read ignore illegal char
-
- ;
-
- stv jmp start
-
- dumpv jmp dump
-
- loadv jmp load
-
- ;
-
- feed sec 1e07
-
- lda pointl dec double byte
-
- sbc #$01 at pointl and pointh
-
- sta pointl
-
- bcs feed1
-
- dec pointh
-
- feed1 jmp show
-
- ;
-
- modify ldy #$00 get contents of input buff
-
- lda inl inl and store in loc
-
- sta (pointl),y specified by point
-
- jmp rtrn
-
- ;
-
- ; ** subroutines follow **
-
- prtpnt lda pointh print pointl, pointh 1e1e
-
- jsr prtbyt
-
- jsr chk
-
- lda pointl
-
- jsr prtbyt
-
- jsr chk
-
- rts
-
- ; **print string of ascii chars from top+x to top
-
- crlf ldx #$07
-
- prtst lda top,x
-
- jsr outch
-
- dex
-
- bpl prtst stop on index zero
-
- rts
-
- ; ** print 1 hex byte as 2 ascii chars **
-
- prtbyt sta temp 1e3b
-
- lsr a shift char right 4 bits
-
- lsr a
-
- lsr a
-
- lsr a
-
- jsr hexta convert to hex and print
-
- lda temp get other half
-
- jsr hexta convert to hex and print
-
- lda temp restore byte in a and return
-
- rts
-
- hexta and #$0f mask hi 4 bits
-
- cmp #$0a
-
- clc
-
- bmi hexta1
-
- adc #$07 alpha hex
-
- hexta1 adc #$30 dec hex
-
- jmp outch print char
-
- ; ** get 1 char from tty, char in a
-
- getch stx tmpx save x reg 1e5a
-
- ldx #$08 set up 8-bit count
-
- lda #$01
-
- get1 bit sad
-
- bne get6
-
- bmi get1 wait for start bit
-
- jsr delay delay 1 bit
-
- get5 jsr dehalf delay 1/2 bit time
-
- get2 lda sad get 8 bits
-
- and #$80 mask off low order bits
-
- lsr char shift right char
-
- ora char
-
- sta char
-
- jsr delay delay 1 bit time
-
- dex
-
- bne get2 get next char
-
- jsr dehalf exit this routine
-
- ldx tmpx
-
- lda char
-
- rol a shift off parity
-
- lsr a
-
- get6 rts
-
- ; ** initialization for sigma **
-
- inits ldx #$01 set kb mode to addr 1e88
-
- stx mode
-
- init1 ldx #$00
-
- stx padd for sigma use sadd
-
- ldx #$3f
-
- stx pbdd for sigma use sbdd
-
- ldx #$07 enable data in
-
- stx sbd output
-
- cld
-
- sei
-
- rts
-
- ; ** print one char in a **
-
- outsp lda #$20 print space 1e9e
-
- outch sta char
-
- stx tmpx
-
- jsr delay delay 10/11 bit code sync
-
- lda sbd start bit
-
- and #$fe
-
- sta sbd
-
- jsr delay
-
- ldx #$08
-
- out1 lda sbd data bit
-
- and #$fe
-
- lsr char
-
- adc #$00
-
- sta sbd
-
- jsr delay
-
- dex
-
- bne out1
-
- lda sbd stop bit
-
- ora #$01
-
- sta sbd
-
- jsr delay stop bit
-
- ldx tmpx restore index
-
- rts
-
- ; ** delay 1 bit time **
-
- delay lda cnth30 1ed4
-
- sta timh
-
- lda cntl30
-
- de2 sec
-
- de4 sbc #$01
-
- bcs de3
-
- dec timh
-
- de3 ldy timh
-
- bpl de2
-
- rts
-
- ; ** delay 1/2 bit time **
-
- dehalf lda cnth30 1eeb
-
- sta timh
-
- lda cntl30
-
- lsr a
-
- lsr timh
-
- bcc de2
-
- ora #$80
-
- bcs de4
-
- ; ** sub to determine if key is depressed or
-
- ; condition of ssw key not depressed or
-
- ; tty mode a=0
-
- ; key depressed or kb mode a not zero
-
- ak ldy #$03 3 rows
-
- ldx #$01 digit 0
-
- onekey lda #$ff
-
- ak1 stx sbd output digit
-
- inx get next digit
-
- inx
-
- and sad input segments
-
- dey
-
- bne ak1
-
- ldy #$07
-
- sty sbd
-
- ora #$80
-
- eor #$ff
-
- rts
-
- ; ** output to 7-segment display **
-
- scand ldy #$00 get data 1f19
-
- lda (pointl),y specified by point
-
- sta inh set up display buffer
-
- lda #$7f change seg
-
- sta padd to output
-
- ldx #$09 init digit number
-
- ldy #$03 output 3 bytes
-
- scand1 lda inl,y get byte
-
- lsr a get msd
-
- lsr a
-
- lsr a
-
- lsr a
-
- jsr convd output char
-
- lda inl,y get byte again
-
- and #$0f get lsd
-
- jsr convd output char
-
- dey set up for next byte
-
- bne scand1
-
- stx sbd all digits off
-
- lda #$00 change segment
-
- sta padd to inputs
-
- jmp ak get any key
-
- ; ** convert and display hex (used by scand only)**
-
- convd sty temp
-
- tay save y
-
- lda table,y use char as index
-
- ldy #$00 lookup conversion
-
- sty sad turn off segments
-
- stx sbd output digit enable
-
- sta sad output segments
-
- ldy #$7f delay 500 cycles
-
- convd1 dey
-
- bne convd1
-
- inx get next digit number
-
- inx add 2
-
- ldy temp restore y
-
- rts
-
- ; ** increment point **
-
- incpt inc pointl
-
- bne incpt2
-
- inc pointh
-
- incpt2 rts
-
- ; ** get key from keypad a=keyvalue **
-
- getkey ldx #$21 start at digit 0 1f6a
-
- getke5 ldy #$01 get 1 row
-
- jsr onekey
-
- bne keyin a=0 no key
-
- cpx #$27 test for digit 2
-
- bne getke5
-
- lda #$15 15=nokey
-
- rts
-
- keyin ldy #$ff
-
- keyin1 asl a shift left
-
- bcs keyin2 until y=key no
-
- iny
-
- bpl keyin1
-
- keyin2 txa
-
- and #$0f mask msd
-
- lsr a divide by 2
-
- tax
-
- tya
-
- bpl keyin4
-
- keyin3 clc
-
- adc #$07 mult (x-1 times a
-
- keyin4 dex
-
- bne keyin3
-
- rts
-
- ; ** compute checksum **
-
- chk clc
-
- adc chksum
-
- sta chksum
-
- lda chkhi
-
- adc #$00
-
- sta chkhi
-
- rts
-
- ; ** get 2 hex chars and pack into inl and inh **
-
- getbyt jsr getch
-
- jsr pack
-
- jsr getch
-
- jsr pack
-
- lda inl
-
- rts
-
- ; ** shift char in a into inl and inh **
-
- pack cmp #$30 check for hex 1fac
-
- bmi updat2
-
- cmp #$47 not hex exit
-
- bpl updat2
-
- cmp #$40 convert to hex
-
- bmi update
-
- clc
-
- adc #$09
-
- update rol a
-
- rol a
-
- rol a
-
- rol a
-
- ldy #$04 shift into i/o buffer
-
- updat1 rol a
-
- rol inl
-
- rol inh
-
- dey
-
- bne updat1
-
- lda #$00 a=0 if hex num
-
- updat2 rts
-
- ;
-
- open lda inl move i/o buffer to point
-
- sta pointl
-
- lda inh transfer inh- pointh
-
- sta pointh
-
- rts
-
- ;
-
- ; ** tables **
-
- top .dbyte $0000,$0000,$0000,$0a0d 1fd5
-
- .byte 'm,'i,'k,$20,$13 kim
-
- .byte 'r,'r,'e,$20,$13 err
-
- table .dbyte $bf86,$dbcf,$e6ed,$fd87 ;0-7 1fe7
-
- .dbyte $ffef,$f7fc,$b9de,$f9f1 ;8-f hex to 7-seg
-
- ;
-
- ; ** interrupt vectors **
-
- *= $1ffa
-
- nmient .word nmit
-
- rstent .word rst
-
- irqent .word irqt
-
- .end
-
-
-
-