diff --git a/kernal/clall.s b/kernal/clall.s new file mode 100644 index 0000000..2356ec9 --- /dev/null +++ b/kernal/clall.s @@ -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 + diff --git a/kernal/close.s b/kernal/close.s new file mode 100644 index 0000000..4bbf71c --- /dev/null +++ b/kernal/close.s @@ -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 diff --git a/kernal/crap.s b/kernal/crap.s new file mode 100644 index 0000000..06e1ad0 --- /dev/null +++ b/kernal/crap.s @@ -0,0 +1 @@ +.segment "CRAP" diff --git a/kernal/cunlsn.s b/kernal/cunlsn.s new file mode 100644 index 0000000..a04a9c2 --- /dev/null +++ b/kernal/cunlsn.s @@ -0,0 +1,4 @@ + .segment "CUNLSN" +cunlsn jsr unlsn + clc + rts diff --git a/kernal/declare.s b/kernal/declare.s new file mode 100644 index 0000000..bf4c8b9 --- /dev/null +++ b/kernal/declare.s @@ -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 diff --git a/kernal/editor.1.s b/kernal/editor.1.s new file mode 100644 index 0000000..28fad60 --- /dev/null +++ b/kernal/editor.1.s @@ -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 + 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 + 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 ? + 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 diff --git a/kernal/editor.2.s b/kernal/editor.2.s new file mode 100644 index 0000000..fcad60c --- /dev/null +++ b/kernal/editor.2.s @@ -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 ;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+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 diff --git a/kernal/editor.3.s b/kernal/editor.3.s new file mode 100644 index 0000000..c8e9106 --- /dev/null +++ b/kernal/editor.3.s @@ -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 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 + 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 + 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 + jmp i0020 +i0010 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 diff --git a/kernal/irqfile.s b/kernal/irqfile.s new file mode 100644 index 0000000..edbaabd --- /dev/null +++ b/kernal/irqfile.s @@ -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*** diff --git a/kernal/kernal.s b/kernal/kernal.s new file mode 100644 index 0000000..d2fb83d --- /dev/null +++ b/kernal/kernal.s @@ -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" diff --git a/kernal/load.s b/kernal/load.s new file mode 100644 index 0000000..9ae5699 --- /dev/null +++ b/kernal/load.s @@ -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 + diff --git a/kernal/messages.s b/kernal/messages.s new file mode 100644 index 0000000..c5a41c5 --- /dev/null +++ b/kernal/messages.s @@ -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 + diff --git a/kernal/nbasin.s b/kernal/nbasin.s new file mode 100644 index 0000000..46439ef --- /dev/null +++ b/kernal/nbasin.s @@ -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 + diff --git a/kernal/nbsout.s b/kernal/nbsout.s new file mode 100644 index 0000000..c55ad8c --- /dev/null +++ b/kernal/nbsout.s @@ -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 diff --git a/kernal/ngetin.s b/kernal/ngetin.s new file mode 100644 index 0000000..d09b4c6 --- /dev/null +++ b/kernal/ngetin.s @@ -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 diff --git a/kernal/nmi.s b/kernal/nmi.s new file mode 100644 index 0000000..06b7098 --- /dev/null +++ b/kernal/nmi.s @@ -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 diff --git a/kernal/open.s b/kernal/open.s new file mode 100644 index 0000000..1d40cb1 --- /dev/null +++ b/kernal/open.s @@ -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 diff --git a/kernal/openchannel.s b/kernal/openchannel.s new file mode 100644 index 0000000..f8a08ed --- /dev/null +++ b/kernal/openchannel.s @@ -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 + diff --git a/kernal/patches.s b/kernal/patches.s new file mode 100644 index 0000000..61adae8 --- /dev/null +++ b/kernal/patches.s @@ -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 + diff --git a/kernal/save.s b/kernal/save.s new file mode 100644 index 0000000..06bd0f0 --- /dev/null +++ b/kernal/save.s @@ -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 ' +; +saving lda msgflg +; bpl sv115 ;no print + ldy #ms11-ms1 ;'saving' + jsr msg + jmp outfn ; + diff --git a/kernal/serial4.0.s b/kernal/serial4.0.s new file mode 100644 index 0000000..c26e30b --- /dev/null +++ b/kernal/serial4.0.s @@ -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 +;****************************** + diff --git a/kernal/time.s b/kernal/time.s new file mode 100644 index 0000000..4559c34 --- /dev/null +++ b/kernal/time.s @@ -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 diff --git a/kernal/vectors.s b/kernal/vectors.s new file mode 100644 index 0000000..94436fa --- /dev/null +++ b/kernal/vectors.s @@ -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 + diff --git a/kernal/wozmon.s b/kernal/wozmon.s new file mode 100644 index 0000000..2ed189e --- /dev/null +++ b/kernal/wozmon.s @@ -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 *************************************** +