Upload files to "kernal"

This commit is contained in:
2026-05-07 10:03:27 +12:00
parent 5fd7765f53
commit b978b7a496
26 changed files with 3587 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
.segment "NBASIN"
;***************************************
;* clall -- close all logical files *
;* deletes all table entries and*
;* restores default i/o channels *
;* and clears ieee port devices *
;*************************************
;
nclall lda #0
sta ldtnd ;forget all files
;********************************************
;* clrch -- clear channels *
;* unlisten or untalk ieee devices, but *
;* leave others alone. default channels *
;* are restored. *
;********************************************
;
nclrch ldx #3
cpx dflto ;is output channel ieee?
bcs jx750 ;no...
;
jsr unlsn ;yes...unlisten it
;
jx750 cpx dfltn ;is input channel ieee?
bcs clall2 ;no...
;
jsr untlk ;yes...untalk it
;
;restore default values
;
;
clall2 stx dflto ;output chan=3=screen
lda #0
sta dfltn ;input chan=0=keyboard
rts
+111
View File
@@ -0,0 +1,111 @@
.segment "CLOSE"
;***************************************
;* close -- close logical file *
;* *
;* the logical file number of the*
;* file to be closed is passed in .a.*
;* keyboard, screen, and files not *
;* open pass straight through. tape *
;* files open for write are closed by*
;* dumping the last buffer and *
;* conditionally writing an end of *
;* tape block.serial files are closed*
;* by sending a close file command if*
;* a secondary address was specified *
;* in its open command. *
;***************************************
;
nclose jsr jltlk ;look file up
beq jx050 ;open...
clc ;else return
rts
;
jx050 jsr jz100 ;extract table data
txa ;save table index
pha
;
lda fa ;check device number
beq jx150 ;is keyboard...done
cmp #3
beq jx150 ;is screen...done
bcs jx120 ;is serial...process
cmp #2 ;rs232?
;
; rs-232 close
;
; remove file from tables
pla
jsr jxrmv
;
jsr cln232 ;clean up rs232 for close
;
; deallocate buffers
;
jsr gettop ;get memsiz
lda ribuf+1 ;check input allocation
beq cls010 ;not...allocated
iny
cls010 lda robuf+1 ;check output allocation
beq cls020
iny
cls020 lda #00 ;deallocate
sta ribuf+1
sta robuf+1
; flag top of memory change
jmp memtcf ;go set new top
;
;
;close an serial file
;
jx120 jsr clsei
;
;entry to remove a give logical file
;from table of logical, primary,
;and secondary addresses
;
jx150 pla ;get table index off stack
;
; jxrmv - entry to use as an rs-232 subroutine
;
jxrmv tax
dec ldtnd
cpx ldtnd ;is deleted file at end?
beq jx170 ;yes...done
;
;delete entry in middle by moving
;last entry to that position.
;
ldy ldtnd
lda lat,y
sta lat,x
lda fat,y
sta fat,x
lda sat,y
sta sat,x
;
jx170 clc ;close exit
jx175 rts
;lookup tablized logical file data
;
lookup lda #0
sta status
txa
jltlk ldx ldtnd
jx600 dex
bmi jz101
cmp lat,x
bne jx600
rts
;routine to fetch table entries
;
jz100 lda lat,x
sta la
lda fat,x
sta fa
lda sat,x
sta sa
jz101 rts
; rsr 5/12/82 - modify for cln232
+1
View File
@@ -0,0 +1 @@
.segment "CRAP"
+4
View File
@@ -0,0 +1,4 @@
.segment "CUNLSN"
cunlsn jsr unlsn
clc
rts
+272
View File
@@ -0,0 +1,272 @@
;declare 6510 ports
d6510 = 0 ;6510 data direction register
r6510 = 1 ;6510 data register
.segment "ZPKERNAL" : zeropage
status .res 1 ;i/o operation status byte
; crfac .res 2 ;correction factor (unused)
stkey .res 1 ;stop key flag
svxt .res 1 ;temporary
verck .res 1 ;load or verify flag
c3p0 .res 1 ;ieee buffered char flag
bsour .res 1 ;char buffer for ieee
syno .res 1 ;cassette sync #
xsav .res 1 ;temp for basin
ldtnd .res 1 ;index to logical file
dfltn .res 1 ;default input device #
dflto .res 1 ;default output device #
prty .res 1 ;cassette parity
dpsw .res 1 ;cassette dipole switch
msgflg .res 1 ;os message flag
ptr1 ;cassette error pass1
t1 .res 1 ;temporary 1
tmpc
ptr2 ;cassette error pass2
t2 .res 1 ;temporary 2
time .res 3 ;24 hour clock in 1/60th seconds
r2d2 ;serial bus usage
pcntr .res 1 ;cassette stuff
; ptch .res 1 (unused)
bsour1 ;temp used by serial routine
firt .res 1
count ;temp used by serial routine
cntdn .res 1 ;cassette sync countdown
bufpt .res 1 ;cassette buffer pointer
inbit ;rs-232 rcvr input bit storage
shcnl .res 1 ;cassette short count
bitci ;rs-232 rcvr bit count in
rer .res 1 ;cassette read error
rinone ;rs-232 rcvr flag for start bit check
rez .res 1 ;cassete reading zeroes
ridata ;rs-232 rcvr byte buffer
rdflg .res 1 ;cassette read mode
riprty ;rs-232 rcvr parity storage
shcnh .res 1 ;cassette short cnt
sal .res 1
sah .res 1
eal .res 1
eah .res 1
cmp0 .res 1
temp .res 1
tape1 .res 2 ;address of tape buffer #1y.
bitts ;rs-232 trns bit count
snsw1 .res 1
nxtbit ;rs-232 trns next bit to be sent
diff .res 1
rodata ;rs-232 trns byte buffer
prp .res 1
fnlen .res 1 ;length current file n str
la .res 1 ;current file logical addr
sa .res 1 ;current file 2nd addr
fa .res 1 ;current file primary addr
fnadr .res 2 ;addr current file name str
roprty ;rs-232 trns parity buffer
ochar .res 1
fsblk .res 1 ;cassette read block count
mych .res 1
cas1 .res 1 ;cassette manual/controlled switch
tmp0
stal .res 1
stah .res 1
memuss ;cassette load temps (2 bytes)
tmp2 .res 2
;
;variables for screen editor
;
lstx .res 1 ;key scan index
; sfst .res 1 ;keyboard shift flag (unused)
ndx .res 1 ;index to keyboard q
rvs .res 1 ;rvs field on flag
indx .res 1
lsxp .res 1 ;x pos at start
lstp .res 1
sfdx .res 1 ;shift mode on print
blnsw .res 1 ;cursor blink enab
blnct .res 1 ;count to toggle cur
gdbln .res 1 ;char before cursor
blnon .res 1 ;on/off blink flag
crsw .res 1 ;input vs get flag
pnt .res 2 ;pointer to row
; point .res 1 (unused)
pntr .res 1 ;pointer to column
qtsw .res 1 ;quote switch
lnmx .res 1 ;40/80 max positon
tblx .res 1
data .res 1
insrt .res 1 ;insert mode flag
ldtb1 .res 26 ;line flags+endspace
user .res 2 ;screen editor color ip
keytab .res 2 ;keyscan table indirect
;rs-232 z-page
ribuf .res 2 ;rs-232 input buffer pointer
robuf .res 2 ;rs-232 output buffer pointer
frekzp .res 4 ;free kernal zero page 9/24/80
baszpt .res 1 ;location ($00ff) used by basic
.segment "STACK"
bad .res 1
.segment "KVAR"
buf .res 89 ;basic/monitor buffer
; tables for open files
;
lat .res 10 ;logical file numbers
fat .res 10 ;primary device numbers
sat .res 10 ;secondary addresses
; system storage
;
keyd .res 10 ;irq keyboard buffer
memstr .res 2 ;start of memory
memsiz .res 2 ;top of memory
timout .res 1 ;ieee timeout flag
; screen editor storage
;
color .res 1 ;activ color nybble
gdcol .res 1 ;original color before cursor
hibase .res 1 ;base location of screen (top)
xmax .res 1
rptflg .res 1 ;key repeat flag
kount .res 1
delay .res 1
shflag .res 1 ;shift flag byte
lstshf .res 1 ;last shift pattern
keylog .res 2 ;indirect for keyboard table setup
mode .res 1 ;0-pet mode, 1-cattacanna
autodn .res 1 ;auto scroll down flag(=0 on,<>0 off)
; rs-232 storage
;
m51ctr .res 1 ;6551 control register
m51cdr .res 1 ;6551 command register
m51ajb .res 2 ;non standard (bittime/2-100)
rsstat .res 1 ; rs-232 status register
bitnum .res 1 ;number of bits to send (fast response)
baudof .res 2 ;baud rate full bit time (created by open)
;
; reciever storage
;
; inbit .res 1 ;input bit storage
; bitci .res 1 ;bit count in
; rinone .res 1 ;flag for start bit check
; ridata .res 1 ;byte in buffer
; riprty .res 1 ;byte in parity storage
ridbe .res 1 ;input buffer index to end
ridbs .res 1 ;input buffer pointer to start
;
; transmitter storage
;
; bitts .res 1 ;# of bits to be sent
; nxtbit .res 1 ;next bit to be sent
; roprty .res 1 ;parity of byte sent
; rodata .res 1 ;byte buffer out
rodbs .res 1 ;output buffer index to start
rodbe .res 1 ;output buffer index to end
;
irqtmp .res 2 ;holds irq during tape ops
;
; temp space for vic-40 variables ****
;
enabl .res 1 ;rs-232 enables (replaces ier)
caston .res 1 ;tod sense during cassettes
kika26 .res 1 ;temp storage for cassette read routine
stupid .res 1 ;temp d1irq indicator for cassette read
lintmp .res 1 ;temporary for line index
palnts .res 1 ;pal vs ntsc flag 0=ntsc 1=pal
.segment "KVECTORS";rem kernal/os indirects(20)
cinv .res 2 ;irq ram vector
cbinv .res 2 ;brk instr ram vector
nminv .res 2 ;nmi ram vector
iopen .res 2 ;indirects for code
iclose .res 2 ; conforms to kernal spec 8/19/80
ichkin .res 2
ickout .res 2
iclrch .res 2
ibasin .res 2
ibsout .res 2
istop .res 2
igetin .res 2
iclall .res 2
usrcmd .res 2
iload .res 2
isave .res 2 ;savesp
tbuffr =$033C ;cassette data buffer
vicscn =$0400
; i/o devices
;
vicreg =$d000
sidreg =$d400
viccol =$d800 ;vic color nybbles
cia1 =$dc00 ;device1 6526 (page1 irq)
d1pra =cia1+0
colm =d1pra ;keyboard matrix
d1prb =cia1+1
rows =d1prb ;keyboard matrix
d1ddra =cia1+2
d1ddrb =cia1+3
d1t1l =cia1+4
d1t1h =cia1+5
d1t2l =cia1+6
d1t2h =cia1+7
d1tod1 =cia1+8
d1tods =cia1+9
d1todm =cia1+10
d1todh =cia1+11
d1sdr =cia1+12
d1icr =cia1+13
d1cra =cia1+14
d1crb =cia1+15
cia2 =$dd00 ;device2 6526 (page2 nmi)
d2pra =cia2+0
d2prb =cia2+1
d2ddra =cia2+2
d2ddrb =cia2+3
d2t1l =cia2+4
d2t1h =cia2+5
d2t2l =cia2+6
d2t2h =cia2+7
d2tod1 =cia2+8
d2tods =cia2+9
d2todm =cia2+10
d2todh =cia2+11
d2sdr =cia2+12
d2icr =cia2+13
d2cra =cia2+14
d2crb =cia2+15
timrb =$19 ;6526 crb enable one-shot tb
;tape block types
;
eot =5 ;end of tape
blf =1 ;basic load file
bdf =2 ;basic data file
plf =3 ;fixed program type
bdfh =4 ;basic data file header
bufsz =192 ;buffer size
;
;screen editor constants
;
llen =40 ;single line 40 columns
llen2 =80 ;double line = 80 columns
nlines =25 ;25 rows on screen
white =$01 ;white screen color
blue =$06 ;blue char color
cr =$d ;carriage return
;rsr 8/3/80 add & change z-page
;rsr 8/11/80 add memuss & plf type
;rsr 8/22/80 add rs-232 routines
;rsr 8/24/80 add open variables
;rsr 8/29/80 add baud space move rs232 to z-page
;rsr 9/2/80 add screen editor vars&con 
;rsr 12/7/81 modify for vic-40
+615
View File
@@ -0,0 +1,615 @@
.segment "EDITOR"
maxchr=80
nwrap=2 ;max number of physical lines per logical line
;
;undefined function entry
;
; undefd ldx #0
; undef2 lda unmsg,x
; jsr prt
; inx
; cpx #unmsg2-unmsg
; bne undef2
; sec
; rts
;
; unmsg .byt $d,'?advanced function not available',$d
; unmsg2
;
;return address of 6526
;
iobase ldx #<d1pra
ldy #>d1pra
rts
;
;return max rows,cols of screen
;
scrorg ldx #llen
ldy #nlines
rts
;
;read/plot cursor position
;
plot bcs plot10
stx tblx
sty pntr
jsr stupt
plot10 ldx tblx
ldy pntr
rts
;initialize i/o
;
cint
;
; establish screen memory
;
jsr panic ;set up vic
;
lda #0 ;make sure we're in pet mode
sta mode
sta blnon ;we dont have a good char from the screen yet
lda #<shflog ;set shift logic indirects
sta keylog
lda #>shflog
sta keylog+1
lda #10
sta xmax ;maximum type ahead buffer size
sta delay
lda #$13 ;init color to light blue<<<<<<<<<< changed to green
sta color
lda #4
sta kount ;delay between key repeats
lda #$c
sta blnct
sta blnsw
clsr lda hibase ;fill hi byte ptr table
ora #$80
tay
lda #0
tax
lps1 sty ldtb1,x
clc
adc #llen
bcc lps2
iny ;carry bump hi byte
lps2 inx
cpx #nlines+1 ;done # of lines?
bne lps1 ;no...
lda #$ff ;tag end of line table
sta ldtb1,x
ldx #nlines-1 ;clear from the bottom line up
clear1 jsr clrln ;see scroll routines
dex
bpl clear1
;home function
;
nxtd ldy #0
sty pntr ;left column
sty tblx ;top line
;
;move cursor to tblx,pntr
;
stupt
ldx tblx ;get curent line index
lda pntr ;get character pointer
fndstr ldy ldtb1,x ;find begining of line
bmi stok ;branch if start found
clc
adc #llen ;adjust pointer
sta pntr
dex
bpl fndstr
;
stok jsr setpnt ;set up pnt indirect 901227-03**********
;
lda #llen-1
inx
fndend ldy ldtb1,x
bmi stdone
clc
adc #llen
inx
bpl fndend
stdone
sta lnmx
jmp scolor ;make color pointer follow 901227-03**********
; this is a patch for input logic 901227-03**********
; fixes input"xxxxxxx-40-xxxxx";a$ problem
;
finput cpx lsxp ;check if on same line
beq finpux ;yes..return to send
jmp findst ;check if we wrapped down...
finpux rts
nop ;keep the space the same...
;panic nmi entry
;
vpan jsr panic ;fix vic screen
jmp nxtd ;home cursor
panic lda #3 ;reset default i/o
sta dflto
lda #0
sta dfltn
;init vic
;
initv ldx #47 ;load all vic regs ***
px4 lda tvic-1,x
sta vicreg-1,x
dex
bne px4
rts
;
;remove character from queue
;
lp2 ldy keyd
ldx #0
lp1 lda keyd+1,x
sta keyd,x
inx
cpx ndx
bne lp1
dec ndx
tya
cli
clc ;good return
rts
;
loop4 jsr prt
loop3
lda ndx
sta blnsw
sta autodn ;turn on auto scroll down
beq loop3
sei
lda blnon
beq lp21
lda gdbln
ldx gdcol ;restore original color
ldy #0
sty blnon
jsr dspp
;lp21 subroutine for shift-runstop, removed load from tape function, now jumps to wozmon
lp21 jsr lp2
cmp #$83 ;run key?
bne lp22
nop
nop
jmp WOZMON_ENTRY
lp23 lda runtb-1,x
sta keyd-1,x
dex
bne lp23
beq loop3
lp22 cmp #$d
bne loop4
ldy lnmx
sty crsw
clp5 lda (pnt),y
cmp #' '
bne clp6
dey
bne clp5
clp6 iny
sty indx
ldy #0
sty autodn ;turn off auto scroll down
sty pntr
sty qtsw
lda lsxp
bmi lop5
ldx tblx
jsr finput ;check for same line as start 901227-03**********
cpx lsxp
bne lop5
lda lstp
sta pntr
cmp indx
bcc lop5
bcs clp2
;input a line until carriage return
;
loop5 tya
pha
txa
pha
lda crsw
beq loop3
lop5 ldy pntr
lda (pnt),y
notone
sta data
lop51 and #$3f
asl data
bit data
bpl lop54
ora #$80
lop54 bcc lop52
ldx qtsw
bne lop53
lop52 bvs lop53
ora #$40
lop53 inc pntr
jsr qtswc
cpy indx
bne clp1
clp2 lda #0
sta crsw
lda #$d
ldx dfltn ;fix gets from screen
cpx #3 ;is it the screen?
beq clp2a
ldx dflto
cpx #3
beq clp21
clp2a jsr prt
clp21 lda #$d
clp1 sta data
pla
tax
pla
tay
lda data
cmp #$de ;is it <pi> ?
bne clp7
lda #$ff
clp7 clc
rts
qtswc cmp #$22
bne qtswl
lda qtsw
eor #$1
sta qtsw
lda #$22
qtswl rts
nxt33 ora #$40
nxt3 ldx rvs
beq nvs
nc3 ora #$80
nvs ldx insrt
beq nvs1
dec insrt
nvs1 ldx color ;put color on screen
jsr dspp
jsr wlogic ;check for wraparound
loop2 pla
tay
lda insrt
beq lop2
lsr qtsw
lop2 pla
tax
pla
clc ;good return
cli
rts
wlogic
jsr chkdwn ;maybe we should we increment tblx
inc pntr ;bump charcter pointer
lda lnmx ;
cmp pntr ;if lnmx is less than pntr
bcs wlgrts ;branch if lnmx>=pntr
cmp #maxchr-1 ;past max characters
beq wlog10 ;branch if so
lda autodn ;should we auto scroll down?
beq wlog20 ;branch if not
jmp bmt1 ;else decide which way to scroll
wlog20
ldx tblx ;see if we should scroll down
cpx #nlines
bcc wlog30 ;branch if not
jsr scrol ;else do the scrol up
dec tblx ;and adjust curent line#
ldx tblx
wlog30 asl ldtb1,x ;wrap the line
lsr ldtb1,x
inx ;index to next lline
lda ldtb1,x ;get high order byte of address
ora #$80 ;make it a non-continuation line
sta ldtb1,x ;and put it back
dex ;get back to current line
lda lnmx ;continue the bytes taken out
clc
adc #llen
sta lnmx
findst
lda ldtb1,x ;is this the first line?
bmi finx ;branch if so
dex ;else backup 1
bne findst
finx
jmp setpnt ;make sure pnt is right
wlog10 dec tblx
jsr nxln
lda #0
sta pntr ;point to first byte
wlgrts rts
bkln ldx tblx
bne bkln1
stx pntr
pla
pla
bne loop2
;
bkln1 dex
stx tblx
jsr stupt
ldy lnmx
sty pntr
rts
;print routine
;
prt pha
sta data
txa
pha
tya
pha
lda #0
sta crsw
ldy pntr
lda data
bpl *+5
jmp nxtx
cmp #$d
bne njt1
jmp nxt1
njt1 cmp #' '
bcc ntcn
cmp #$60 ;lower case?
bcc njt8 ;no...
and #$df ;yes...make screen lower
bne njt9 ;always
njt8 and #$3f
njt9 jsr qtswc
jmp nxt3
ntcn ldx insrt
beq cnc3x
jmp nc3
cnc3x cmp #$14
bne ntcn1
tya
bne bak1up
jsr bkln
jmp bk2
bak1up jsr chkbak ;should we dec tblx
dey
sty pntr
bk1 jsr scolor ;fix color ptrs
bk15 iny
lda (pnt),y
dey
sta (pnt),y
iny
lda (user),y
dey
sta (user),y
iny
cpy lnmx
bne bk15
bk2 lda #' '
sta (pnt),y
lda color
sta (user),y
bpl jpl3
ntcn1 ldx qtsw
beq nc3w
cnc3 jmp nc3
nc3w cmp #$12
bne nc1
sta rvs
nc1 cmp #$13
bne nc2
jsr nxtd
nc2 cmp #$1d
bne ncx2
iny
jsr chkdwn
sty pntr
dey
cpy lnmx
bcc ncz2
dec tblx
jsr nxln
ldy #0
jpl4 sty pntr
ncz2 jmp loop2
ncx2 cmp #$11
bne colr1
clc
tya
adc #llen
tay
inc tblx
cmp lnmx
bcc jpl4
beq jpl4
dec tblx
curs10 sbc #llen
bcc gotdwn
sta pntr
bne curs10
gotdwn jsr nxln
jpl3 jmp loop2
colr1 jsr chkcol ;check for a color
jmp lower ;was jmp loop2
;check color
;
;shifted keys
;
nxtx
keepit
and #$7f
cmp #$7f
bne nxtx1
lda #$5e
nxtx1
nxtxa
cmp #$20 ;is it a function key
bcc uhuh
jmp nxt33
uhuh
cmp #$d
bne up5
jmp nxt1
up5 ldx qtsw
bne up6
cmp #$14
bne up9
ldy lnmx
lda (pnt),y
cmp #' '
bne ins3
cpy pntr
bne ins1
ins3 cpy #maxchr-1
beq insext ;exit if line too long
jsr newlin ;scroll down 1
ins1 ldy lnmx
jsr scolor
ins2 dey
lda (pnt),y
iny
sta (pnt),y
dey
lda (user),y
iny
sta (user),y
dey
cpy pntr
bne ins2
lda #$20
sta (pnt),y
lda color
sta (user),y
inc insrt
insext jmp loop2
up9 ldx insrt
beq up2
up6 ora #$40
jmp nc3
up2 cmp #$11
bne nxt2
ldx tblx
beq jpl2
dec tblx
lda pntr
sec
sbc #llen
bcc upalin
sta pntr
bpl jpl2
upalin jsr stupt
bne jpl2
nxt2 cmp #$12
bne nxt6
lda #0
sta rvs
nxt6 cmp #$1d
bne nxt61
tya
beq bakbak
jsr chkbak
dey
sty pntr
jmp loop2
bakbak jsr bkln
jmp loop2
nxt61 cmp #$13
bne sccl
jsr clsr
jpl2 jmp loop2
sccl
ora #$80 ;make it upper case
jsr chkcol ;try for color
jmp upper ;was jmp loop2
;
nxln lsr lsxp
ldx tblx
nxln2 inx
cpx #nlines ;off bottom?
bne nxln1 ;no...
jsr scrol ;yes...scroll
nxln1 lda ldtb1,x ;double line?
bpl nxln2 ;yes...scroll again
stx tblx
jmp stupt
nxt1
ldx #0
stx insrt
stx rvs
stx qtsw
stx pntr
jsr nxln
jpl5 jmp loop2
;
;
; check for a decrement tblx
;
chkbak ldx #nwrap
lda #0
chklup cmp pntr
beq back
clc
adc #llen
dex
bne chklup
rts
;
back dec tblx
rts
;
; check for increment tblx
;
chkdwn ldx #nwrap
lda #llen-1
dwnchk cmp pntr
beq dnline
clc
adc #llen
dex
bne dwnchk
rts
;
dnline ldx tblx
cpx #nlines
beq dwnbye
inc tblx
;
dwnbye rts
chkcol
ldx #15 ;there's 15 colors
chk1a cmp coltab,x
beq chk1b
dex
bpl chk1a
rts
;
chk1b
stx color ;change the color
rts
coltab
;blk,wht,red,cyan,magenta,grn,blue,yellow
.byt $90,$05,$1c,$9f,$9c,$1e,$1f,$9e
.byt $81,$95,$96,$97,$98,$99,$9a,$9b
; rsr modify for vic-40 system
; rsr 12/31/81 add 8 more colors
+407
View File
@@ -0,0 +1,407 @@
;screen scroll routine
;
scrol lda sal
pha
lda sah
pha
lda eal
pha
lda eah
pha
;
; s c r o l l u p
;
scro0 ldx #$ff
dec tblx
dec lsxp
dec lintmp
scr10 inx ;goto next line
jsr setpnt ;point to 'to' line
cpx #nlines-1 ;done?
bcs scr41 ;branch if so
;
lda ldtb2+1,x ;setup from pntr
sta sal
lda ldtb1+1,x
jsr scrlin ;scroll this line up1
bmi scr10
;
scr41
jsr clrln
;
ldx #0 ;scroll hi byte pointers
scrl5 lda ldtb1,x
and #$7f
ldy ldtb1+1,x
bpl scrl3
ora #$80
scrl3 sta ldtb1,x
inx
cpx #nlines-1
bne scrl5
;
lda ldtb1+nlines-1
ora #$80
sta ldtb1+nlines-1
lda ldtb1 ;double line?
bpl scro0 ;yes...scroll again
;
inc tblx
inc lintmp
lda #$7f ;check for control key
sta colm ;drop line 2 on port b
lda rows
cmp #$fb ;slow scroll key?(control)
php ;save status. restore port b
lda #$7f ;for stop key check
sta colm
plp
bne mlp42
;
ldy #0
mlp4 nop ;delay
dex
bne mlp4
dey
bne mlp4
sty ndx ;clear key queue buffer
;
mlp42 ldx tblx
;
pulind pla ;restore old indirects
sta eah
pla
sta eal
pla
sta sah
pla
sta sal
rts
newlin
ldx tblx
bmt1 inx
; cpx #nlines ;exceded the number of lines ???
; beq bmt2 ;vic-40 code
lda ldtb1,x ;find last display line of this line
bpl bmt1 ;table end mark=>$ff will abort...also
bmt2 stx lintmp ;found it
;generate a new line
cpx #nlines-1 ;is one line from bottom?
beq newlx ;yes...just clear last
bcc newlx ;<nlines...insert line
jsr scrol ;scroll everything
ldx lintmp
dex
dec tblx
jmp wlog30
newlx lda sal
pha
lda sah
pha
lda eal
pha
lda eah
pha
ldx #nlines
scd10 dex
jsr setpnt ;set up to addr
cpx lintmp
bcc scr40
beq scr40 ;branch if finished
lda ldtb2-1,x ;set from addr
sta sal
lda ldtb1-1,x
jsr scrlin ;scroll this line down
bmi scd10
scr40
jsr clrln
ldx #nlines-2
scrd21
cpx lintmp ;done?
bcc scrd22 ;branch if so
lda ldtb1+1,x
and #$7f
ldy ldtb1,x ;was it continued
bpl scrd19 ;branch if so
ora #$80
scrd19 sta ldtb1+1,x
dex
bne scrd21
scrd22
ldx lintmp
jsr wlog30
;
jmp pulind ;go pul old indirects and return
;
; scroll line from sal to pnt
; and colors from eal to user
;
scrlin
and #$03 ;clear any garbage stuff
ora hibase ;put in hiorder bits
sta sal+1
jsr tofrom ;color to & from addrs
ldy #llen-1
scd20
lda (sal),y
sta (pnt),y
lda (eal),y
sta (user),y
dey
bpl scd20
rts
;
; do color to and from addresses
; from character to and from adrs
;
tofrom
jsr scolor
lda sal ;character from
sta eal ;make color from
lda sal+1
and #$03
ora #>viccol
sta eal+1
rts
;
; set up pnt and y
; from .x
;
setpnt lda ldtb2,x
sta pnt
lda ldtb1,x
and #$03
ora hibase
sta pnt+1
rts
;
; clear the line pointed to by .x
;
clrln ldy #llen-1
jsr setpnt
jsr scolor
clr10 jsr cpatch ;reversed order from 901227-02
lda #$20 ;store a space
sta (pnt),y ;to display
dey
bpl clr10
rts
nop
;
;put a char on the screen
;
dspp tay ;save char
lda #2
sta blnct ;blink cursor
jsr scolor ;set color ptr
tya ;restore color
dspp2 ldy pntr ;get column
sta (pnt),y ;char to screen
txa
sta (user),y ;color to screen
rts
scolor lda pnt ;generate color ptr
sta user
lda pnt+1
and #$03
ora #>viccol ;vic color ram
sta user+1
rts
key jsr $ffea ;update jiffy clock
lda blnsw ;blinking crsr ?
bne key4 ;no
dec blnct ;time to blink ?
bne key4 ;no
lda #20 ;reset blink counter
repdo sta blnct
ldy pntr ;cursor position
lsr blnon ;carry set if original char
ldx gdcol ;get char original color
lda (pnt),y ;get character
bcs key5 ;branch if not needed
;
inc blnon ;set to 1
sta gdbln ;save original char
jsr scolor
lda (user),y ;get original color
sta gdcol ;save it
ldx color ;blink in this color
lda gdbln ;with original character
;
key5 eor #$80 ;blink it
jsr dspp2 ;display it
;
key4 lda r6510 ;get cassette switches
and #$10 ;is switch down ?
beq key3 ;branch if so
;
ldy #0
sty cas1 ;cassette off switch
;
lda r6510
ora #$20
bne kl24 ;branch if motor is off
;
key3 lda cas1
bne kl2
;
lda r6510
and #%011111 ;turn motor on
;
kl24
; sta r6510
nop
nop
;
kl2 jsr scnkey ;scan keyboard
;
kprend lda d1icr ;clear interupt flags
pla ;restore registers
tay
pla
tax
pla
rti ;exit from irq routines
; ****** general keyboard scan ******
;
scnkey lda #$00
sta shflag
ldy #64 ;last key index
sty sfdx ;null key found
sta colm ;raise all lines
ldx rows ;check for a key down
cpx #$ff ;no keys down?
beq scnout ;branch if none
tay ;.a=0 ldy #0
lda #<mode1
sta keytab
lda #>mode1
sta keytab+1
lda #$fe ;start with 1st column
sta colm
scn20 ldx #8 ;8 row keyboard
pha ;save column output info
scn22 lda rows
cmp rows ;debounce keyboard
bne scn22
scn30 lsr a ;look for key down
bcs ckit ;none
pha
lda (keytab),y ;get char code
cmp #$05
bcs spck2 ;if not special key go on
cmp #$03 ;could it be a stop key?
beq spck2 ;branch if so
ora shflag
sta shflag ;put shift bit in flag byte
bpl ckut
spck2
sty sfdx ;save key number
ckut pla
ckit iny
cpy #65
bcs ckit1 ;branch if finished
dex
bne scn30
sec
pla ;reload column info
rol a
sta colm ;next column on keyboard
bne scn20 ;always branch
ckit1 pla ;dump column output...all done
jmp (keylog) ;evaluate shift functions
rekey ldy sfdx ;get key index
lda (keytab),y ;get char code
tax ;save the char
cpy lstx ;same as prev char index?
beq rpt10 ;yes
ldy #$10 ;no - reset delay before repeat
sty delay
bne ckit2 ;always
rpt10 and #$7f ;unshift it
bit rptflg ;check for repeat disable
bmi rpt20 ;yes
bvs scnrts
cmp #$7f ;no keys ?
scnout beq ckit2 ;yes - get out
cmp #$14 ;an inst/del key ?
beq rpt20 ;yes - repeat it
cmp #$20 ;a space key ?
beq rpt20 ;yes
cmp #$1d ;a crsr left/right ?
beq rpt20 ;yes
cmp #$11 ;a crsr up/dwn ?
bne scnrts ;no - exit
rpt20 ldy delay ;time to repeat ?
beq rpt40 ;yes
dec delay
bne scnrts
rpt40 dec kount ;time for next repeat ?
bne scnrts ;no
ldy #4 ;yes - reset ctr
sty kount
ldy ndx ;no repeat if queue full
dey
bpl scnrts
ckit2
ldy sfdx ;get index of key
sty lstx ;save this index to key found
ldy shflag ;update shift status
sty lstshf
ckit3 cpx #$ff ;a null key or no key ?
beq scnrts ;branch if so
txa ;need x as index so...
ldx ndx ;get # of chars in key queue
cpx xmax ;irq buffer full ?
bcs scnrts ;yes - no more insert
putque
sta keyd,x ;put raw data here
inx
stx ndx ;update key queue count
scnrts lda #$7f ;setup pb7 for stop key sense
sta colm
rts
;
; shift logic
;
shflog
lda shflag
cmp #$03 ;commodore shift combination?
bne keylg2 ;branch if not
cmp lstshf ;did i do this already
beq scnrts ;branch if so
lda mode
bmi shfout ;dont shift if its minus
switch lda vicreg+24 ;**********************************:
eor #$02 ;turn on other case
sta vicreg+24 ;point the vic there
jmp shfout
;
keylg2
asl a
cmp #$08 ;was it a control key
bcc nctrl ;branch if not
lda #6 ;else use table #4
;
nctrl
notkat
tax
lda keycod,x
sta keytab
lda keycod+1,x
sta keytab+1
shfout
jmp rekey
; rsr 12/08/81 modify for vic-40
; rsr 2/18/82 modify for 6526 input pad sense
; rsr 3/11/82 fix keyboard debounce, repair file
; rsr 3/11/82 modify for commodore 64
+200
View File
@@ -0,0 +1,200 @@
keycod ;keyboard mode 'dispatch'
.word mode1
.word mode2
.word mode3
.word contrl ;control keys
;
; cottaconna mode
;
;.word mode1 ;pet mode1
;.word mode2 ;pet mode2
;.word cctta3 ;dummy word
;.word contrl
;
; extended katakana mode
;
;.word cctta2 ;katakana characters
;.word cctta3 ;limited graphics
;.word cctta3 ;dummy
;.word contrl
mode1
;del,3,5,7,9,+,yen sign,1
.byt $14,$0d,$1d,$88,$85,$86,$87,$11
;return,w,r,y,i,p,*,left arrow
.byt $33,$57,$41,$34,$5a,$53,$45,$01
;rt crsr,a,d,g,j,l,;,ctrl
.byt $35,$52,$44,$36,$43,$46,$54,$58
;f4,4,6,8,0,-,home,2
.byt $37,$59,$47,$38,$42,$48,$55,$56
;f1,z,c,b,m,.,r.shiftt,space
.byt $39,$49,$4a,$30,$4d,$4b,$4f,$4e
;f2,s,f,h,k,:,=,com.key
.byt $2b,$50,$4c,$2d,$2e,$3a,$40,$2c
;f3,e,t,u,o,@,exp,q
.byt $5c,$2a,$3b,$13,$01,$3d,$5e,$2f
;crsr dwn,l.shift,x,v,n,,,/,stop
.byt $31,$5f,$04,$32,$20,$02,$51,$03
.byt $ff ;end of table null
mode2 ;shift
;ins,%,',),+,yen,!
.byt $94,$8d,$9d,$8c,$89,$8a,$8b,$91
;sreturn,w,r,y,i,p,*,sleft arrow
.byt $23,$d7,$c1,$24,$da,$d3,$c5,$01
;lf.crsr,a,d,g,j,l,;,ctrl
.byt $25,$d2,$c4,$26,$c3,$c6,$d4,$d8
;,$,&,(, ,"
.byt $27,$d9,$c7,$28,$c2,$c8,$d5,$d6
;f5,z,c,b,m,.,r.shift,sspace
.byt $29,$c9,$ca,$30,$cd,$cb,$cf,$ce
;f6,s,f,h,k,:,=,scom.key
.byt $db,$d0,$cc,$dd,$3e,$5b,$ba,$3c
;f7,e,t,u,o,@,pi,g
.byt $a9,$c0,$5d,$93,$01,$3d,$de,$3f
;crsr dwn,l.shift,x,v,n,,,/,run
.byt $21,$5f,$04,$22,$a0,$02,$d1,$83
.byt $ff ;end of table null
;
mode3 ;left window grahpics
;ins,c10,c12,c14,9,+,pound sign,c8
.byt $94,$8d,$9d,$8c,$89,$8a,$8b,$91
;return,w,r,y,i,p,*,lft.arrow
.byt $96,$b3,$b0,$97,$ad,$ae,$b1,$01
;lf.crsr,a,d,g,j,l,;,ctrl
.byt $98,$b2,$ac,$99,$bc,$bb,$a3,$bd
;f8,c11,c13,c15,0,-,home,c9
.byt $9a,$b7,$a5,$9b,$bf,$b4,$b8,$be
;f2,z,c,b,m,.,r.shift,space
.byt $29,$a2,$b5,$30,$a7,$a1,$b9,$aa
;f4,s,f,h,k,:,=,com.key
.byt $a6,$af,$b6,$dc,$3e,$5b,$a4,$3c
;f6,e,t,u,o,@,pi,q
.byt $a8,$df,$5d,$93,$01,$3d,$de,$3f
;crsr.up,l.shift,x,v,n,,,/,stop
.byt $81,$5f,$04,$95,$a0,$02,$ab,$83
.byt $ff ;end of table null
;cctta2 ;was cctta2 in japanese version
lower
cmp #$0e ;does he want lower case?
bne upper ;branch if not
lda vicreg+24 ;else set vic to point to lower case
ora #$02
bne ulset ;jmp
upper
cmp #$8e ;does he want upper case
bne lock ;branch if not
lda vicreg+24 ;make sure vic point to upper/pet set
and #$ff-$02
ulset sta vicreg+24
outhre jmp loop2
lock
cmp #8 ;does he want to lock in this mode?
bne unlock ;branch if not
lda #$80 ;else set lock switch on
ora mode ;don't hurt anything - just in case
bmi lexit
unlock
cmp #9 ;does he want to unlock the keyboard?
bne outhre ;branch if not
lda #$7f ;clear the lock switch
and mode ;dont hurt anything
lexit sta mode
jmp loop2 ;get out
;cctta3
;.byt $04,$ff,$ff,$ff,$ff,$ff,$e2,$9d
;run-k24-k31
;.byt $83,$01,$ff,$ff,$ff,$ff,$ff,$91
;k32-k39.f5
;.byt $a0,$ff,$ff,$ff,$ff,$ee,$01,$89
;co.key,k40-k47.f6
;.byt $02,$ff,$ff,$ff,$ff,$e1,$fd,$8a
;k48-k55
;.byt $ff,$ff,$ff,$ff,$ff,$b0,$e0,$8b
;k56-k63
;.byt $f2,$f4,$f6,$ff,$f0,$ed,$93,$8c
;.byt $ff ;end of table null
contrl
;null,red,purple,blue,rvs ,null,null,black
.byt $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
;null, w ,reverse, y , i , p ,null,music
.byt $1c,$17,$01,$9f,$1a,$13,$05,$ff
.byt $9c,$12,$04,$1e,$03,$06,$14,$18
;null,cyan,green,yellow,rvs off,null,null,white
.byt $1f,$19,$07,$9e,$02,$08,$15,$16
.byt $12,$09,$0a,$92,$0d,$0b,$0f,$0e
.byt $ff,$10,$0c,$ff,$ff,$1b,$00,$ff
.byt $1c,$ff,$1d,$ff,$ff,$1f,$1e,$ff
.byt $90,$06,$ff,$05,$ff,$ff,$11,$ff
.byt $ff ;end of table null
tvic
.byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;sprites (0-16)
.byt $9b,55,0,0,0,$08,0,$14,$0f,0,0,0,0,0,0 ;data (17-31)
; .byt 14,6,1,2,3,4,0,1,2,3,4,5,6,7 ;32-46 - change 1st two bytes of this line for border and background colour
.byt 11,0,1,2,3,4,0,1,2,3,4,5,6,7
;
runtb .byt "LOAD",$d,"RUN",$d
;
linz0 = vicscn
linz1 = linz0+llen
linz2 = linz1+llen
linz3 = linz2+llen
linz4 = linz3+llen
linz5 = linz4+llen
linz6 = linz5+llen
linz7 = linz6+llen
linz8 = linz7+llen
linz9 = linz8+llen
linz10 = linz9+llen
linz11 = linz10+llen
linz12 = linz11+llen
linz13 = linz12+llen
linz14 = linz13+llen
linz15 = linz14+llen
linz16 = linz15+llen
linz17 = linz16+llen
linz18 = linz17+llen
linz19 = linz18+llen
linz20 = linz19+llen
linz21 = linz20+llen
linz22 = linz21+llen
linz23 = linz22+llen
linz24 = linz23+llen
;****** screen lines lo byte table ******
;
ldtb2
.byte <linz0
.byte <linz1
.byte <linz2
.byte <linz3
.byte <linz4
.byte <linz5
.byte <linz6
.byte <linz7
.byte <linz8
.byte <linz9
.byte <linz10
.byte <linz11
.byte <linz12
.byte <linz13
.byte <linz14
.byte <linz15
.byte <linz16
.byte <linz17
.byte <linz18
.byte <linz19
.byte <linz20
.byte <linz21
.byte <linz22
.byte <linz23
.byte <linz24
; rsr 12/08/81 modify for vic-40 keyscan
; rsr 2/17/81 modify for the stinking 6526r2 chip
; rsr 3/11/82 modify for commodore 64
; rsr 3/28/82 modify for new pla
+63
View File
@@ -0,0 +1,63 @@
.segment "ERROR"
;***************************************
;* stop -- check stop key flag and *
;* return z flag set if flag true. *
;* also closes active channels and *
;* flushes keyboard queue. *
;* also returns key downs from last *
;* keyboard row in .a. *
;***************************************
nstop lda stkey ;value of last row
cmp #$7f ;check stop key position
bne stop2 ;not down
php
jsr clrch ;clear channels
sta ndx ;flush queue
plp
stop2 rts
;************************************
;* *
;* error handler *
;* *
;* prints kernal error message if *
;* bit 6 of msgflg set. returns *
;* with error # in .a and carry. *
;* *
;************************************
;
error1 lda #1 ;too many files
.byt $2c
error2 lda #2 ;file open
.byt $2c
error3 lda #3 ;file not open
.byt $2c
error4 lda #4 ;file not found
.byt $2c
error5 lda #5 ;device not present
.byt $2c
error6 lda #6 ;not input file
.byt $2c
error7 lda #7 ;not output file
.byt $2c
error8 lda #8 ;missing file name
.byt $2c
error9 lda #9 ;bad device #
;
pha ;error number on stack
jsr clrch ;restore i/o channels
;
ldy #ms1-ms1
bit msgflg ;are we printing error?
bvc erexit ;no...
;
jsr msg ;print "cbm i/o error #"
pla
pha
ora #$30 ;make error # ascii
jsr bsout ;print it
;
erexit pla
sec
rts
+244
View File
@@ -0,0 +1,244 @@
.segment "INIT"
; start - system reset
; will goto rom at $8000...
; if locs $8004-$8008
; = 'cbm80'
; ^^^ > these have msb set
; kernal expects...
; $8000- .word initilize (hard start)
; $8002- .word panic (warm start)
; ... else basic system used
; ******************testing only***************
; use auto disk/cassette load when developed...
;
start ldx #$ff
sei
txs
cld
jsr a0int ;test for $a0 rom in
bne start1
jmp ($8000) ; go init as $a000 rom wants
start1 stx vicreg+22 ;set up refresh (.x=<5)
jsr ioinit ;go initilize i/o devices
jsr ramtas ;go ram test and set
jsr restor ;go set up os vectors
;
jsr pcint ;go initilize screen newxxx
cli ;interrupts okay now
jmp ($a000) ;go to basic system
; a0int - test for an $8000 rom
; returns z - $8000 in
;
a0int ldx #tbla0e-tbla0r ;check for $8000
a0in1 lda tbla0r-1,x
cmp $8004-1,x
bne a0in2
dex
bne a0in1
a0in2 rts
;
tbla0r .byt $c3,$c2,$cd,"80" ;..cbm80..
tbla0e
; restor - set kernal indirects and vectors (system)
;
restor ldx #<vectss
ldy #>vectss
clc
;
; vector - set kernal indirect and vectors (user)
;
vector stx tmp2
sty tmp2+1
ldy #vectse-vectss-1
movos1 lda cinv,y ;get from storage
bcs movos2 ;c...want storage to user
lda (tmp2),y ;...want user to storage
movos2 sta (tmp2),y ;put in user
sta cinv,y ;put in storage
dey
bpl movos1
rts
;
vectss .word key,timb,nnmi
.word nopen,nclose,nchkin
.word nckout,nclrch,nbasin
.word nbsout,nstop,ngetin
.word nclall,timb ;goto break on a usrcmd jmp
.word nload,nsave
vectse
; ramtas - memory size check and set
;
ramtas lda #0 ;zero low memory
tay ;start at 0002
ramtz0 sta $0002,y ;zero page
sta $0200,y ;user buffers and vars
sta $0300,y ;system space and user space
iny
bne ramtz0
;
;allocate tape buffers
;
ldx #<tbuffr
ldy #>tbuffr
stx tape1
sty tape1+1
;
; set top of memory
;
ramtbt
tay ;move $00 to .y
lda #3 ;set high inital index
sta tmp0+1
;
ramtz1 inc tmp0+1 ;move index thru memory
ramtz2 lda (tmp0),y ;get present data
tax ;save in .x
lda #$55 ;do a $55,$aa test
sta (tmp0),y
cmp (tmp0),y
bne size
rol a
sta (tmp0),y
cmp (tmp0),y
bne size
txa ;restore old data
sta (tmp0),y
iny
bne ramtz2
beq ramtz1
;
size tya ;set top of memory
tax
ldy tmp0+1
clc
jsr settop
lda #$08 ;set bottom of memory
sta memstr+1 ;always at $0800
lda #$04 ;screen always at $400
sta hibase ;set base of screen
rts
bsit .word wrtz,wrtn,key,read ;table of indirects for cassette irq's
; ioinit - initilize io devices
;
ioinit lda #$7f ;kill interrupts
sta d1icr
sta d2icr
sta d1pra ;turn on stop key
lda #%00001000 ;shut off timers
sta d1cra
sta d2cra
sta d1crb
sta d2crb
; configure ports
ldx #$00 ;set up keyboard inputs
stx d1ddrb ;keyboard inputs
stx d2ddrb ;user port (no rs-232)
stx sidreg+24 ;turn off sid
dex
stx d1ddra ;keyboard outputs
lda #%00000111 ;set serial/va14/15 (clkhi)
sta d2pra
lda #%00111111 ;set serial in/out, va14/15out
sta d2ddra
;
; set up the 6510 lines
;
lda #%00111111 ;motor on, hiram lowram charen high
sta r6510
lda #%00111111 ;mtr out,sw in,wr out,control out
sta d6510
;
;jsr clkhi ;clkhi to release serial devices ^
;
iokeys lda palnts ;pal or ntsc
beq i0010 ;ntsc
lda #<sixtyp
sta d1t1l
lda #>sixtyp
jmp i0020
i0010 lda #<sixty ;keyboard scan irq's
sta d1t1l
lda #>sixty
i0020 sta d1t1h
jmp piokey
; lda #$81 ;enable t1 irq's
; sta d1icr
; lda d1cra
; and #$80 ;save only tod bit
; ora #%00010001 ;enable timer1
; sta d1cra
; jmp clklo ;release the clock line
;
; sixty hertz value
;
sixty = 17045 ; ntsc
sixtyp = 16421 ; pal
setnam sta fnlen
stx fnadr
sty fnadr+1
rts
setlfs sta la
stx fa
sty sa
rts
readss lda fa ;see which devices' to read
cmp #2 ;is it rs-232?
bne readst ;no...read serial/cass
lda rsstat ;yes...get rs-232 up
pha
lda #00 ;clear rs232 status when read
sta rsstat
pla
rts
setmsg sta msgflg
readst lda status
udst ora status
sta status
rts
settmo sta timout
rts
memtop bcc settop
;
;carry set--read top of memory
;
gettop ldx memsiz
ldy memsiz+1
;
;carry clear--set top of memory
;
settop stx memsiz
sty memsiz+1
rts
;manage bottom of memory
;
membot bcc setbot
;
;carry set--read bottom of memory
;
ldx memstr
ldy memstr+1
;
;carry clear--set bottom of memory
;
setbot stx memstr
sty memstr+1
rts
; rsr 8/5/80 change io structure
; rsr 8/15/80 add memory test
; rsr 8/21/80 change i/o for mod
; rsr 8/25/80 change i/o for mod2
; rsr 8/29/80 change ramtest for hardware mistake
; rsr 9/22/80 change so ram hang rs232 status read
; rsr 5/12/82 change start1 order to remove disk problem
+41
View File
@@ -0,0 +1,41 @@
.segment "IRQFILE"
; simirq - simulate an irq (for cassette read)
; enter by a jsr simirq
;
simirq php
pla ;fix the break flag
and #$ef
pha
; puls - checks for real irq's or breaks
;
puls pha
txa
pha
tya
pha
tsx
lda $104,x ;get old p status
and #$10 ;break flag?
beq puls1 ;...no
jmp (cbinv) ;...yes...break instr
puls1 jmp (cinv) ;...irq
; pcint - add universal to cinit
;
pcint jsr cint
p0010 lda vicreg+18 ;check raster compare for zero
bne p0010 ;if it's zero then check value
lda vicreg+25 ;get raster irq value
and #$01
sta palnts ;place in pal/ntsc indicator
jmp iokeys
;
; piokey - add universal to iokeys
;
piokey lda #$81 ;enable t1 irq's
sta d1icr
lda d1cra
and #$80 ;save only tod bit
ora #%00010001 ;enable timer1
sta d1cra
jmp clklo ;release the clock line***901227-03***
+27
View File
@@ -0,0 +1,27 @@
.feature labels_without_colons, pc_assignment
.include "declare.s"
.include "editor.1.s"
.include "editor.2.s"
.include "editor.3.s"
.include "serial4.0.s"
.include "messages.s"
.include "clall.s"
.include "ngetin.s"
.include "nbasin.s"
.include "nbsout.s"
.include "openchannel.s"
.include "close.s"
.include "open.s"
.include "load.s"
.include "save.s"
.include "cunlsn.s"
.include "time.s"
.include "errorhandler.s"
.include "crap.s"
.include "init.s"
.include "nmi.s"
.include "irqfile.s"
.include "patches.s"
.include "vectors.s"
.include "wozmon.s"
+180
View File
@@ -0,0 +1,180 @@
.segment "LOAD"
;**********************************
;* load ram function *
;* *
;* loads from cassette 1 or 2, or *
;* serial bus devices >=4 to 31 *
;* as determined by contents of *
;* variable fa. verify flag in .a *
;* *
;* alt load if sa=0, normal sa=1 *
;* .x , .y load address if sa=0 *
;* .a=0 performs load,<> is verify*
;* *
;* high load return in x,y. *
;* *
;**********************************
loadsp stx memuss ;.x has low alt start
sty memuss+1
load jmp (iload) ;monitor load entry
;
nload sta verck ;store verify flag
lda #0
sta status
;
lda fa ;check device number
bne ld20
;
ld10 jmp error9 ;bad device #-keyboard
;
ld20 cmp #3
beq ld10 ;disallow screen load
bcc ld10 ;handle tapes different
;
;load from cbm ieee device
;
ldy fnlen ;must have file name
bne ld25 ;yes...ok
;
jmp error8 ;missing file name
;
ld25 ldx sa ;save sa in .x
jsr luking ;tell user looking
lda #$60 ;special load command
sta sa
jsr openi ;open the file
;
lda fa
jsr talk ;establish the channel
lda sa
jsr tksa ;tell it to load
;
jsr acptr ;get first byte
sta eal
;
lda status ;test status for error
lsr a
lsr a
bcs ld90 ;file not found...
jsr acptr
sta eah
;
txa ;find out old sa
bne ld30 ;sa<>0 use disk address
lda memuss ;else load where user wants
sta eal
lda memuss+1
sta eah
ld30 jsr loding ;tell user loading
;
ld40 lda #$fd ;mask off timeout
and status
sta status
;
jsr stop ;stop key?
bne ld45 ;no...
;
jmp break ;stop key pressed
;
ld45 jsr acptr ;get byte off ieee
tax
lda status ;was there a timeout?
lsr a
lsr a
bcs ld40 ;yes...try again
txa
ldy verck ;performing verify?
beq ld50 ;no...load
ldy #0
cmp (eal),y ;verify it
beq ld60 ;o.k....
; lda #sperr ;no good...verify error
nop
jsr udst ;update status
.byt $2c ;skip next store
;
ld50 sta (eal),y
ld60 inc eal ;increment store addr
bne ld64
inc eah
ld64 bit status ;eoi?
bvc ld40 ;no...continue load
;
jsr untlk ;close channel
jsr clsei ;close the file
bcc ld180 ;branch always
;
ld90 jmp error4 ;file not found
;
;load from tape
;
;carry set by cpx's
lda (tape1),y
ldy #1
sbc (tape1),y
tax ;low to .x
ldy #4
lda (tape1),y
ldy #2
sbc (tape1),y
tay ;high to .y
;
clc ;ea = sta+(tapea-tapesta)
txa
adc memuss ;
sta eal
tya
adc memuss+1
sta eah
lda memuss ;set up starting address
sta stal
lda memuss+1
sta stah
jsr loding ;tell user loading
;
ld180 clc ;good exit
;
; set up end load address
;
ldx eal
ldy eah
;
ld190 rts
;subroutine to print to console:
;
;searching [for name]
;
luking lda msgflg ;supposed to print?
bpl ld115 ;...no
ldy #ms5-ms1 ;"searching"
jsr msg
lda fnlen
beq ld115
ldy #ms6-ms1 ;"for"
jsr msg
;subroutine to output file name
;
outfn ldy fnlen ;is there a name?
beq ld115 ;no...done
ldy #0
ld110 lda (fnadr),y
jsr bsout
iny
cpy fnlen
bne ld110
;
ld115 rts
;subroutine to print:
;
;loading/verifing
;
loding ldy #ms10-ms1 ;assume 'loading'
lda verck ;check flag
beq ld410 ;are doing load
ldy #ms21-ms1 ;are 'verifying'
ld410 jmp spmsg
+29
View File
@@ -0,0 +1,29 @@
.segment "MESSAGES"
ms1 .byt $d,"I/O ERROR ",$a3
ms5 .byt $d,"SEARCHING",$a0
ms6 .byt "FOR",$a0
;ms7 .byt $d,"PRESS PLAY ON TAP",$c5
;ms8 .byt "PRESS RECORD & PLAY ON TAP",$c5
ms10 .byt $d,"LOADIN",$c7
ms11 .byt $d,"SAVING",$a0
ms21 .byt $d,"VERIFYIN",$c7
ms17 .byt $d,"FOUND",$a0
ms18 .byt $d,"OK",$8d
; ms34 .byt $d,"MONITOR",$8d
; ms36 .byt $d,"BREA",$cb
;print message to screen only if
;output enabled
;
spmsg bit msgflg ;printing messages?
bpl msg10 ;no...
msg lda ms1,y
php
and #$7f
jsr bsout
iny
plp
bpl msg
msg10 clc
rts
+46
View File
@@ -0,0 +1,46 @@
.segment "NBASIN"
;***************************************
;* basin-- input character from channel*
;* input differs from get on device*
;* #0 function which is keyboard. the *
;* screen editor makes ready an entire *
;* line which is passed char by char *
;* up to the carriage return. other *
;* devices are: *
;* 0 -- keyboard *
;* 1 -- cassette #1 *
;* 2 -- rs232 *
;* 3 -- screen *
;* 4-31 -- serial bus *
;***************************************
;
nbasin lda dfltn ;check device
bne bn10 ;is not keyboard...
;
;input from keyboard
;
lda pntr ;save current...
sta lstp ;... cursor column
lda tblx ;save current...
sta lsxp ;... line number
jmp loop5 ;blink cursor until return
;
bn10 cmp #3 ;is input from screen?
bne bn20 ;no...
;
sta crsw ;fake a carriage return
lda lnmx ;say we ended...
sta indx ;...up on this line
jmp loop5 ;pick up characters
;
bn20 bcs bn30 ;devices >3
cmp #2 ;rs232?
;input from serial bus
bn30 lda status ;status from last
beq bn35 ;was good
bn31 lda #$d ;bad...all done
bn32 clc ;valid data
bn33 rts
;
bn35 jmp acptr ;good...handshake
+63
View File
@@ -0,0 +1,63 @@
.segment "NBSOUT"
;***************************************
;* bsout -- out character to channel *
;* determined by variable dflto: *
;* 0 -- invalid *
;* 1 -- cassette #1 *
;* 2 -- rs232 *
;* 3 -- screen *
;* 4-31 -- serial bus *
;***************************************
;
nbsout pha ;preserve .a
lda dflto ;check device
cmp #3 ;is it the screen?
;print to crt
;
pla ;restore data
jmp prt ;print on crt
;
;
;print to serial bus
;
pla
jmp ciout
bcs rstor ;abort on stop key
;
;reset buffer pointer
;
iny ;make .y=1
sty bufpt ;bufpt=1
;
;
;print to crt
;
pla ;restore data
jmp prt ;print on crt
;
;
;print to serial bus
;
pla
jmp ciout
bcs rstor ;abort on stop key
;
;reset buffer pointer
;
iny ;make .y=1
sty bufpt ;bufpt=1
;
;restore .x and .y
;
rstoa clc ;good return
rstor pla
tay
pla
tax
lda t1 ;get .a for return
bcc rstor1 ;no error
lda #00 ;stop error if c-set
rstor1 rts
read rts
wrtn rts
wrtz rts
+26
View File
@@ -0,0 +1,26 @@
.segment "NGETIN"
;***************************************
;* getin -- get character from channel *
;* channel is determined by dfltn.*
;* if device is 0, keyboard queue is *
;* examined and a character removed if *
;* available. if queue is empty, z *
;* flag is returned set. devices 1-31 *
;* advance to basin. *
;***************************************
;
ngetin lda dfltn ;check device
bne gn10 ;not keyboard
;
lda ndx ;queue index
beq gn20 ;nobody there...exit
;
sei
jmp lp2 ;go remove a character
;
;gn10 cmp #2 ;is it rs-232
; bne bn10 ;no...use basin
gn10 jmp bn10
;
gn20 clc ;good return
rts
+87
View File
@@ -0,0 +1,87 @@
.segment "NMI"
nmi sei ;no irq's allowed...
jmp (nminv) ;...could mess up cassettes
nnmi pha
txa
pha
tya
pha
nnmi10 lda #$7f ;disable all nmi's
sta d2icr
ldy d2icr ;check if real nmi...
bmi nnmi20 ;no...rs232/other
;
nnmi18 jsr a0int ;check if $a0 in...no .y
bne nnmi19 ;...no
jmp ($8002) ;...yes
;
; check for stop key down
;
nnmi19
jsr ud60 ;no .y
jsr stop ;no .y
bne nnmi20 ;no stop key...test for rs232
;
; timb - where system goes on a brk instruction
;
timb jsr restor ;restore system indirects
jsr ioinit ;restore i/o for basic
jsr cint ;restore screen for basic
jmp ($a002) ;...no, so basic warm start
; disable nmi's untill ready
; save on stack
;
nnmi20 tya ;.y saved through restore
and enabl ;show only enables
tax ;save in .x for latter
;
; t1 nmi check - transmitt a bit
;
and #$01 ;check for t1
beq nnmi30 ;no...
;
lda d2pra
and #$ff-$04 ;fix for current i/o
ora nxtbit ;load data and...
sta d2pra ;...send it
;
lda enabl ;restore nmi's
sta d2icr ;ready for next...
;
; because of 6526 icr structure...
; handle another nmi as a subroutine
;
txa ;test for another nmi
and #$12 ;test for t2 or flag
beq nnmi25
and #$02 ;check for t2
;
jmp nnmi25 ;...then continue output
;
nnmi25 jmp nmirti
;
; t2 nmi check - recieve a bit
;
nnmi30 txa
and #$02 ;mask to t2
beq nnmi40 ;no...
;
jmp nmirti
; flag nmi handler - recieve a start bit
;
nnmi40 txa ;check for edge
and #$10 ;on flag...
beq nmirti ;no...
;
nmirti lda enabl ;restore nmi's
sta d2icr
prend pla ;because of missing screen editor
tay
pla
tax
pla
rti
+246
View File
@@ -0,0 +1,246 @@
.segment "OPEN"
;***********************************
;* *
;* open function *
;* *
;* creates an entry in the logical *
;* files tables consisting of *
;* logical file number--la, device *
;* number--fa, and secondary cmd-- *
;* sa. *
;* *
;* a file name descriptor, fnadr & *
;* fnlen are passed to this routine*
;* *
;***********************************
;
nopen ldx la ;check file #
bne op98 ;is not the keyboard
;
jmp error6 ;not input file...
;
op98 jsr lookup ;see if in table
bne op100 ;not found...o.k.
;
jmp error2 ;file open
;
op100 ldx ldtnd ;logical device table end
cpx #10 ;maximum # of open files
bcc op110 ;less than 10...o.k.
;
jmp error1 ;too many files
;
op110 inc ldtnd ;new file
lda la
sta lat,x ;store logical file #
lda sa
ora #$60 ;make sa an serial command
sta sa
sta sat,x ;store command #
lda fa
sta fat,x ;store device #
;
;perform device specific open tasks
;
beq op175 ;is keyboard...done.
cmp #3
beq op175 ;is screen...done.
; bcc op150 ;are cassettes 1 & 2
;
jsr openi ;is on serial...open it
bcc op175 ;branch always...done
;
;perform tape open stuff
;
;op150 cmp #2
; jmp opn232
;
;op155 lda sa
and #$f ;mask off command
;
;op160 jmp error4 ;file not found
;
;op170
; beq op180 ;stop key pressed
; bcc op171 ;all o.k.
; bcs op160 ;file not found...
;
;open cassette tape for write
;
;
;finish open for tape read/write
;
;op171 lda #bufsz-1 ;assume force read
;
; ldy sa
; cpy #$60 ;open for read?
; beq op172
;
;set pointers for buffering data
;
; ldy #0
; lda #bdf ;type flag for block
; sta (tape1),y ;to begin of buffer
; tya
;
;op172 sta bufpt ;point to data
op175 clc ;flag good open
op180 rts ;exit in peace
openi lda sa
bmi op175 ;no sa...done
;
ldy fnlen
beq op175 ;no file name...done
;
lda #0 ;clear the serial status
sta status
;
lda fa
jsr listn ;device la to listen
;
lda sa
ora #$f0
jsr secnd
;
lda status ;anybody home?
bpl op35 ;yes...continue
;
;this routine is called by other
;kernal routines which are called
;directly by os. kill return
;address to return to os.
;
pla
pla
jmp error5 ;device not present
;
op35 lda fnlen
beq op45 ;no name...done sequence
;
;send file name over serial
;
ldy #0
op40 lda (fnadr),y
jsr ciout
iny
cpy fnlen
bne op40
;
op45 jmp cunlsn ;jsr unlsn: clc: rts
; opn232 - open an rs-232 or parallel port file
;
; variables initilized
; bitnum - # of bits to be sent calc from m51ctr
; baudof - baud rate full
; rsstat - rs-232 status reg
; m51ctr - 6551 control reg
; m51cdr - 6551 command reg
; m51ajb - user baud rate (clock/baud/2-100)
; enabl - 6526 nmi enables (1-nmi bit on)
;
;opn232 jsr cln232 ;set up rs232, .y=0 on return
;
; pass prams to m51regs
;
; sty rsstat ;clear status
;
;opn020 cpy fnlen ;check if at end of filename
; beq opn025 ;yes...
;
; lda (fnadr),y ;move data
; sta m51ctr,y ;to m51regs
; iny
; cpy #4 ;only 4 possible prams
; bne opn020
;
; calc # of bits
;
;opn025 jsr bitcnt
; stx bitnum
;
; calc baud rate
;
; lda m51ctr
; and #$0f
; beq opn028
;
; calculate start-test rate...
; different than original release 901227-01
;
; asl a ;get offset into tables
; tax
; lda palnts ;get tv standard
; bne opn026
; ldy baudo-1,x ;ntsc standard
; lda baudo-2,x
; jmp opn027
;
;opn026 ldy baudop-1,x ;pal standard
; lda baudop-2,x
opn027 sty m51ajb+1 ;hold start rate in m51ajb
sta m51ajb
opn028 lda m51ajb ;calculate baud rate
asl
rts
;
; check for 3/x line response
;
opn030 lda m51cdr ;bit 0 of m51cdr
lsr a
bcc opn050 ;...3 line
;
; check for x line proper states
;
lda d2prb
asl a
bcs opn050
; jsr ckdsrx ;change from jmp to prevent system
;
; set up buffer pointers (dbe=dbs)
;
opn050 lda ridbe
sta ridbs
lda rodbe
sta rodbs
;
; allocate buffers
;
opn055 jsr gettop ;get memsiz
lda ribuf+1 ;in allocation...
bne opn060 ;already
dey ;there goes 256 bytes
sty ribuf+1
stx ribuf
opn060 lda robuf+1 ;out allocation...
bne memtcf ;alreay
dey ;there goes 256 bytes
sty robuf+1
stx robuf
memtcf sec ;signal top of memory change
lda #$f0
jmp settop ;top changed
;
; cln232 - clean up 232 system for open/close
; set up ddrb and cb2 for rs-232
;
cln232 lda #$7f ;clear nmi's
sta d2icr
lda #%00000110 ;ddrb
sta d2ddrb
sta d2prb ;dtr,rts high
lda #$04 ;output high pa2
ora d2pra
sta d2pra
ldy #00
sty enabl ;clear enabls
rts
; rsr 8/25/80 - add rs-232 code
; rsr 8/26/80 - top of memory handler
; rsr 8/29/80 - add filename to m51regs
; rsr 9/02/80 - fix ordering of rs-232 routines
; rsr 12/11/81 - modify for vic-40 i/o
; rsr 2/08/82 - clear status in openi
; rsr 5/12/82 - compact rs232 open/close code
+135
View File
@@ -0,0 +1,135 @@
.segment "OPENC"
;***************************************
;* chkin -- open channel for input *
;* *
;* the number of the logical file to be*
;* opened for input is passed in .x. *
;* chkin searches the logical file *
;* to look up device and command info. *
;* errors are reported if the device *
;* was not opened for input ,(e.g. *
;* cassette write file), or the logical*
;* file has no reference in the tables.*
;* device 0, (keyboard), and device 3 *
;* (screen), require no table entries *
;* and are handled separate. *
;***************************************
;
nchkin jsr lookup ;see if file known
beq jx310 ;yup...
;
jmp error3 ;no...file not open
;
jx310 jsr jz100 ;extract file info
;
lda fa
beq jx320 ;is keyboard...done.
;
;could be screen, keyboard, or serial
;
cmp #3
beq jx320 ;is screen...done.
bcs jx330 ;is serial...address it
cmp #2 ;rs232?
bne jx315 ;no...
;
; jmp cki232
;
;some extra checks for tape
;
jx315 ldx sa
cpx #$60 ;is command a read?
beq jx320 ;yes...o.k....done
;
jmp error6 ;not input file
;
jx320 sta dfltn ;all input come from here
;
clc ;good exit
rts
;
;an serial device has to be a talker
;
jx330 tax ;device # for dflto
jsr talk ;tell him to talk
;
lda sa ;a second?
bpl jx340 ;yes...send it
jsr tkatn ;no...let go
jmp jx350
;
jx340 jsr tksa ;send second
;
jx350 txa
bit status ;did he listen?
bpl jx320 ;yes
;
jmp error5 ;device not present
;***************************************
;* chkout -- open channel for output *
;* *
;* the number of the logical file to be*
;* opened for output is passed in .x. *
;* chkout searches the logical file *
;* to look up device and command info. *
;* errors are reported if the device *
;* was not opened for input ,(e.g. *
;* keyboard), or the logical file has *
;* reference in the tables. *
;* device 0, (keyboard), and device 3 *
;* (screen), require no table entries *
;* and are handled separate. *
;***************************************
;
nckout jsr lookup ;is file in table?
beq ck5 ;yes...
;
jmp error3 ;no...file not open
;
ck5 jsr jz100 ;extract table info
;
lda fa ;is it keyboard?
bne ck10 ;no...something else.
;
ck20 jmp error7 ;yes...not output file
;
;could be screen,serial,or tapes
;
ck10 cmp #3
beq ck30 ;is screen...done
bcs ck40 ;is serial...address it
; cmp #2 ;rs232?
; bne ck15
;
; jmp cko232
;
;
;special tape channel handling
;
ck15 ldx sa
cpx #$60 ;is command read?
beq ck20 ;yes...error
;
ck30 sta dflto ;all output goes here
;
clc ;good exit
rts
;
ck40 tax ;save device for dflto
jsr listn ;tell him to listen
;
lda sa ;is there a second?
bpl ck50 ;yes...
;
jsr scatn ;no...release lines
bne ck60 ;branch always
;
ck50 jsr secnd ;send second...
;
ck60 txa
bit status ;did he listen?
bpl ck30 ;yes...finish up
;
jmp error5 ;no...device not present
+29
View File
@@ -0,0 +1,29 @@
.segment "KPATCH"
; unused patch area
.res 28, $aa
; prtyp - rs232 parity patch...added 901227-03
;
prtyp sta rinone ;good receiver start...disable flag
lda #1 ;set parity to 1 always
sta riprty
rts
; cpatch - fix to clear line...modified 901227-03
; prevents white character flash...
cpatch ;always clear to current foregnd color
lda color
sta (user),y
rts
; fpatch - tape filename timeout
;
fpatch adc #2 ;time is (8 to 13 sec of display)
fpat00 ldy stkey ;check for key down on last row...
iny
bne fpat01 ;key...exit loop
cmp time+1 ;watch timer
bne fpat00
fpat01 rts
+81
View File
@@ -0,0 +1,81 @@
.segment "SAVE"
;***********************************
;* save *
;* *
;* saves to cassette 1 or 2, or *
;* ieee devices 4>=n>=31 as select-*
;* ed by variable fa. *
;* *
;*start of save is indirect at .a *
;*end of save is .x,.y *
;***********************************
savesp stx eal
sty eah
tax ;set up start
lda $00,x
sta stal
lda $01,x
sta stah
;
save jmp (isave)
nsave lda fa ;***monitor entry
bne sv20
;
sv10 jmp error9 ;bad device #
;
sv20 cmp #3
beq sv10
bcc sv10
lda #$61
sta sa
ldy fnlen
bne sv25
jmp error8 ;missing file name
;
sv25 jsr openi
jsr saving
lda fa
jsr listn
lda sa
jsr secnd
ldy #0
lda sal
jsr ciout
lda sah
jsr ciout
;
sv30 jsr unlsn
lda (sal),y
jsr ciout
jsr stop
bne sv30
;
break jsr clsei
lda #0
sec
rts
;
clsei bit sa
bmi clsei2
lda fa
jsr listn
lda sa
and #$ef
ora #$e0
jsr secnd
;
clsei2 clc
rts
;
;sv115 rts
;subroutine to output:
;'saving <file name>'
;
saving lda msgflg
; bpl sv115 ;no print
ldy #ms11-ms1 ;'saving'
jsr msg
jmp outfn ;<file name>
+310
View File
@@ -0,0 +1,310 @@
.segment "SERIAL"
;command serial bus device to talk
;
talk ora #$40 ;make a talk adr
.byt $2c ;skip two bytes
;command serial bus device to listen
;
listn ora #$20 ;make a listen adr
; jsr rsp232 ;protect self from rs232 nmi's
list1 pha
;
;
bit c3p0 ;character left in buf?
bpl list2 ;no...
;
;send buffered character
;
sec ;set eoi flag
ror r2d2
;
jsr isour ;send last character
;
lsr c3p0 ;buffer clear flag
lsr r2d2 ;clear eoi flag
;
;
list2 pla ;talk/listen address
sta bsour
sei
jsr datahi
cmp #$3f ;clkhi only on unlisten
bne list5
jsr clkhi
;
list5 lda d2pra ;assert attention
ora #$08
sta d2pra
;
isoura sei
jsr clklo ;set clock line low
jsr datahi
jsr w1ms ;delay 1 ms
isour sei ;no irq's allowed
jsr datahi ;make sure data is released
jsr debpia ;data should be low
bcs nodev
jsr clkhi ;clock line high
bit r2d2 ;eoi flag test
bpl noeoi
; do the eoi
isr02 jsr debpia ;wait for data to go high
bcc isr02
;
isr03 jsr debpia ;wait for data to go low
bcs isr03
;
noeoi jsr debpia ;wait for data high
bcc noeoi
jsr clklo ;set clock low
;
; set to send data
;
lda #$08 ;count 8 bits
sta count
;
isr01
lda d2pra ;debounce the bus
cmp d2pra
bne isr01
asl a ;set the flags
bcc frmerr ;data must be hi
;
ror bsour ;next bit into carry
bcs isrhi
jsr datalo
bne isrclk
isrhi jsr datahi
isrclk jsr clkhi ;clock hi
nop
nop
nop
nop
lda d2pra
and #$ff-$20 ;data high
ora #$10 ;clock low
sta d2pra
dec count
bne isr01
lda #$04 ;set timer for 1ms
sta d1t2h
lda #timrb ;trigger timer
sta d1crb
lda d1icr ;clear the timer flags<<<<<<<<<<<<<
isr04 lda d1icr
and #$02
bne frmerr
jsr debpia
bcs isr04
cli ;let irq's continue
rts
;
nodev ;device not present error
lda #$80
.byt $2c
frmerr ;framing error
lda #$03
csberr jsr udst ;commodore serial buss error entry
cli ;irq's were off...turn on
clc ;make sure no kernal error returned
bcc dlabye ;turn atn off ,release all lines
;
;send secondary address after listen
;
secnd sta bsour ;buffer character
jsr isoura ;send it
;release attention after listen
;
scatn lda d2pra
and #$ff-$08
sta d2pra ;release attention
rts
;talk second address
;
tksa sta bsour ;buffer character
jsr isoura ;send second addr
tkatn ;shift over to listener
sei ;no irq's here
jsr datalo ;data line low
jsr scatn
jsr clkhi ;clock line high jsr/rts
tkatn1 jsr debpia ;wait for clock to go low
bmi tkatn1
cli ;irq's okay now
rts
;buffered output to serial bus
;
ciout bit c3p0 ;buffered char?
bmi ci2 ;yes...send last
;
sec ;no...
ror c3p0 ;set buffered char flag
bne ci4 ;branch always
;
ci2 pha ;save current char
jsr isour ;send last char
pla ;restore current char
ci4 sta bsour ;buffer current char
clc ;carry-good exit
rts
;send untalk command on serial bus
;
untlk sei
jsr clklo
lda d2pra ;pull atn
ora #$08
sta d2pra
lda #$5f ;untalk command
.byt $2c ;skip two bytes
;send unlisten command on serial bus
;
unlsn lda #$3f ;unlisten command
jsr list1 ;send it
;
; release all lines
dlabye jsr scatn ;always release atn
; delay then release clock and data
;
dladlh txa ;delay approx 60 us
ldx #10
dlad00 dex
bne dlad00
tax
jsr clkhi
jmp datahi
;input a byte from serial bus
;
acptr
sei ;no irq allowed
lda #$00 ;set eoi/error flag
sta count
jsr clkhi ;make sure clock line is released
acp00a jsr debpia ;wait for clock high
bpl acp00a
;
eoiacp
lda #$01 ;set timer 2 for 256us
sta d1t2h
lda #timrb
sta d1crb
jsr datahi ;data line high (makes timming more like vic-20
lda d1icr ;clear the timer flags<<<<<<<<<<<<
acp00 lda d1icr
and #$02 ;check the timer
bne acp00b ;ran out.....
jsr debpia ;check the clock line
bmi acp00 ;no not yet
bpl acp01 ;yes.....
;
acp00b lda count ;check for error (twice thru timeouts)
beq acp00c
lda #2
jmp csberr ; st = 2 read timeout
;
; timer ran out do an eoi thing
;
acp00c jsr datalo ;data line low
jsr clkhi ; delay and then set datahi (fix for 40us c64)
lda #$40
jsr udst ;or an eoi bit into status
inc count ;go around again for error check on eoi
bne eoiacp
;
; do the byte transfer
;
acp01 lda #08 ;set up counter
sta count
;
acp03 lda d2pra ;wait for clock high
cmp d2pra ;debounce
bne acp03
asl a ;shift data into carry
bpl acp03 ;clock still low...
ror bsour1 ;rotate data in
;
acp03a lda d2pra ;wait for clock low
cmp d2pra ;debounce
bne acp03a
asl a
bmi acp03a
dec count
bne acp03 ;more bits.....
;...exit...
jsr datalo ;data low
bit status ;check for eoi
bvc acp04 ;none...
;
jsr dladlh ;delay then set data high
;
acp04 lda bsour1
cli ;irq is ok
clc ;good exit
rts
;
clkhi ;set clock line high (inverted)
lda d2pra
and #$ff-$10
sta d2pra
rts
;
clklo ;set clock line low (inverted)
lda d2pra
ora #$10
sta d2pra
rts
;
;
datahi ;set data line high (inverted)
lda d2pra
and #$ff-$20
sta d2pra
rts
;
datalo ;set data line low (inverted)
lda d2pra
ora #$20
sta d2pra
rts
;
debpia lda d2pra ;debounce the pia
cmp d2pra
bne debpia
asl a ;shift the data bit into the carry...
rts ;...and the clock into neg flag
;
w1ms ;delay 1ms using loop
txa ;save .x
ldx #200-16 ;1000us-(1000/500*8=#40us holds)
w1ms1 dex ;5us loop
bne w1ms1
tax ;restore .x
rts
;*******************************
;written 8/11/80 bob fairbairn
;test serial0.6 8/12/80 rjf
;change i/o structure 8/21/80 rjf
;more i/o changes 8/24/80 rjf
;final release into kernal 8/26/80 rjf
;some clean up 9/8/80 rsr
;add irq protect on isour and tkatn 9/22/80 rsr
;fix untalk 10/7/80 rsr
;modify for vic-40 i/o system 12/08/81 rsr
;add sei to (untlk,isoura,list2) 12/14/81 rsr
;modify for 6526 flags fix errs 12/31/81 rsr
;modify for commodore 64 i/o 3/11/82 rsr
;change acptr eoi for better response 3/28/82 rsr
;change wait 1 ms routine for less code 4/8/82 rsr
;******************************
+78
View File
@@ -0,0 +1,78 @@
.segment "TIME"
;***********************************
;* *
;* time *
;* *
;*consists of three functions: *
;* (1) udtim-- update time. usually*
;* called every 60th second. *
;* (2) settim-- set time. .y=msd, *
;* .x=next significant,.a=lsd *
;* (3) rdtim-- read time. .y=msd, *
;* .x=next significant,.a=lsd *
;* *
;***********************************
;interrupts are coming from the 6526 timers
;
udtim ldx #0 ;pre-load for later
;
;here we proceed with an increment
;of the time register.
;
ud20 inc time+2
bne ud30
inc time+1
bne ud30
inc time
;
;here we check for roll-over 23:59:59
;and reset the clock to zero if true
;
ud30 sec
lda time+2
sbc #$01
lda time+1
sbc #$1a
lda time
sbc #$4f
bcc ud60
;
;time has rolled--zero register
;
stx time
stx time+1
stx time+2
;
;set stop key flag here
;
ud60 lda rows ;wait for it to settle
cmp rows
bne ud60 ;still bouncing
tax ;set flags...
bmi ud80 ;no stop key...exit stop key=$7f
ldx #$ff-$42 ;check for a shift key (c64 keyboard)
stx colm
ud70 ldx rows ;wait to settle...
cpx rows
bne ud70
sta colm ;!!!!!watch out...stop key .a=$7f...same as colms was...
inx ;any key down aborts
bne ud90 ;leave same as before...
ud80 sta stkey ;save for other routines
ud90 rts
rdtim sei ;keep time from rolling
lda time+2 ;get lsd
ldx time+1 ;get next most sig.
ldy time ;get msd
settim sei ;keep time from changing
sta time+2 ;store lsd
stx time+1 ;next most significant
sty time ;store msd
cli
rts
; rsr 8/21/80 remove crfac change stop
; rsr 3/29/82 add shit key check for commodore 64
+55
View File
@@ -0,0 +1,55 @@
.segment "JMPTBL"
;KERNAL revision
.byte 3
jmp pcint
jmp ioinit
jmp ramtas
jmp restor ;restore vectors to initial system
jmp vector ;change vectors for user
jmp setmsg ;control o.s. messages
jmp secnd ;send sa after listen
jmp tksa ;send sa after talk
jmp memtop ;set/read top of memory
jmp membot ;set/read bottom of memory
jmp scnkey ;scan keyboard
jmp settmo ;set timeout in ieee
jmp acptr ;handshake ieee byte in
jmp ciout ;handshake ieee byte out
jmp untlk ;send untalk out ieee
jmp unlsn ;send unlisten out ieee
jmp listn ;send listen out ieee
jmp talk ;send talk out ieee
jmp readss ;return i/o status byte
jmp setlfs ;set la, fa, sa
jmp setnam ;set length and fn adr
open jmp (iopen) ;open logical file
close jmp (iclose) ;close logical file
chkin jmp (ichkin) ;open channel in
ckout jmp (ickout) ;open channel out
clrch jmp (iclrch) ;close i/o channel
basin jmp (ibasin) ;input from channel
bsout jmp (ibsout) ;output to channel
jmp loadsp ;load from file
jmp savesp ;save to file
jmp settim ;set internal clock
jmp rdtim ;read internal clock
stop jmp (istop) ;scan stop key
getin jmp (igetin) ;get char from q
clall jmp (iclall) ;close all files
jmp udtim ;increment clock
jscrog jmp scrorg ;screen org
jplot jmp plot ;read/set x,y coord
jiobas jmp iobase ;return i/o base
;signature
.byte "RRBY"
.segment "VECTORS"
.word nmi ;program defineable
.word start ;initialization code
.word puls ;interrupt handler
+200
View File
@@ -0,0 +1,200 @@
; wozmon.asm
;
; Originally from Apple-1 Operation Manual, Steve Wozniak, 1976
; Revised 2024 May 8 for Commodore 64/VIC/128 by David R. Van Wagner davevw.com
; Imported to integrated KERNAL segment by insanity213 youtube.com/@retrotechinsanity
; * Using C64 KERNAL (instead of MC6520 and KBD/CRT)
; * extra processing for expected mark parity, software caps lock, and revised newline/carriage return processing
; * revised to expect terminal line edit mode instead of echo off character processing
; * revised to acme syntax
; * different zero page usage
; * changed l/h to wl/wh because vice didn't like that symbol
; * reverse toggle instead of spaces only on vic-20 (like HESMON) because too few columns
; zero page usage - tape stuff on vic-20, 64, 128. Needs to change for PET, TED, Plus/4, 16, etc.
.segment "WOZMON"
.export WOZMON_ENTRY
xaml=$a3
xamh=$a4
stl=$a5
sth=$a6
wl=$a7
wh=$a8
ysav=$a9
wm_mode=$aa
in=$200 ; same as Commodore uses, should be fine to copy from/to this, will probably use slightly less
;** C64, etc. support added by David R. Van Wagner davevw.com ***************************************
; Commodore KENRAL
CHROUT=$FFD2
CHRIN=$FFCF
;** C64 etc. support added by David R. Van Wagner davevw.com ***************************************
WOZMON_ENTRY:
cld
cli
jmp escape
;** C64, etc. support added by David R. Van Wagner davevw.com ***************************************
KBD_IN:
sty $22
jsr CHRIN ; note: full screen editor
ldy $22
rts
;** C64, etc. support added by David R. Van Wagner davevw.com ***************************************
notcr:
cmp #$DF ; underscore or Commodore back arrow (rub out?)
beq backspace
cmp #$83
beq escape
iny
bpl nextchar
escape:
lda #$25 ; prompt
jsr echo
getline:
lda #13
jsr echo
ldy #1
backspace:
dey
bmi getline
nextchar:
jsr KBD_IN
ora #$80
sta in, y
;jsr echo - needed only if terminal echo off, line editing off
cmp #$8D
bne notcr
ldy #$ff
lda #$00
tax
setstor:
asl
setmode:
sta wm_mode
blskip:
iny
nextitem:
lda in, y
cmp #$8D
beq getline
cmp #$AE ; period
bcc blskip
beq setmode
cmp #$BA ; colon
beq setstor
cmp #$D2 ; R
beq run
stx wl
stx wh
sty ysav
nexthex:
lda in, y
eor #$B0
cmp #$0A
bcc dig
adc #$88
cmp #$FA
bcc nothex
dig:
asl
asl
asl
asl
ldx #4
hexshift:
asl
rol wl
rol wh
dex
bne hexshift
iny
bne nexthex
nothex:
cpy ysav
beq escape
bit wm_mode
bvc notstor
lda wl
sta (stl, x)
inc stl
bne nextitem
inc sth
tonextitem:
jmp nextitem
run:
jmp (xaml)
notstor:
bmi xamnext
ldx #2
setadr:
lda wl-1,x
sta stl-1,x
sta xaml-1,x
dex
bne setadr
nxtprnt:
bne prdata
lda #13
jsr echo
lda xamh
jsr prbyte
lda xaml
jsr prbyte
lda #$BA ; colon
jsr echo
prdata:
lda #32
jsr echo
lda (xaml,x)
jsr prbyte
xamnext:
stx wm_mode
lda xaml
cmp wl
lda xamh
sbc wh
bcs tonextitem
inc xaml
bne mod8chk
inc xamh
mod8chk:
lda xaml
and #7
bpl nxtprnt ; should always branch
prbyte:
pha
lsr
lsr
lsr
lsr
jsr prhex
pla
prhex:
and #$0F
ora #$B0
cmp #$BA
bcc echo
adc #6
echo:
;** C64, etc. support added by David R. Van Wagner davevw.com ***************************************
and #$7f ; strip mark bit
cmp #32 ; space?
bne notspace
lda $FF80 ; Commodore ROM version
cmp #$16 ; VIC?
bne notvic
lda 199
eor #18 ; invert reverse state
sta 199
rts
notvic:
lda #32
notspace:
jmp CHROUT
;** C64, etc. support added by David R. Van Wagner davevw.com ***************************************