.TITLE KERMIT-65 Mountain Hardware CPS card .SBTTL 6502 version - Alan Thomson ; Version 1.0 ; Supports only the serial part of the card ; Does not use interrupts ; Based on the KERMIT Protocol. ; $Header: appcps.m65,v 1.5 90/10/15 14:19:59 medin Locked $ .SBTTL Define start address for assembly .=$1003 ; Start assembly at hex 1003 .SBTTL Revision History ; ; Edit # Description ; ------ ----------- ; ;$Log: appcps.m65,v $ Revision 1.5 90/10/15 14:19:59 medin new org for 3.87 of $7f00 version 1.4 ;Revision 1.4 88/12/22 09:25:02 medin ;use the time constant for the wait routine ;Revision 1.3 88/01/15 08:42:03 medin ;New origin for 3.81 ;Revision 1.2 87/06/29 11:02:31 medin ; Change wait rtn to use apple rom rtn, change org for 3.78 ;Revision 1.1 87/06/29 09:26:27 medin ;Initial revision ; ; ; Vector for com cards starts here ; location $1003 for data ; location $1020 for routine jumps ; location $1040 for main routines ; sscdbd: .blkb 1 ;contains baud index(ala super serial card) used by init ; 6 - 300 baud ; 7 - 600 ; etc .blkb 1 crdnam: .word herld ; null terminated string of who we are kersli: .blkb 1 ; com slot $n0 kerins: .blkb 1 ; force initialization flag-when 0 endker: .blkb 2 ; address of end of main kermit flowfg: .blkb 1 ; flow flag for xon/xoff controll b7=1 yes tl0end .word endcom ;[1.2] end of this routine timect .blkb 1 ;[1.3] 1 ms delay via rom wait rtn .=$1020 ; future expansion tlinit: jmp tl2int ; initialize com card tl0cmd: jmp tl2cmd ; command for ACIA in A ; ; 0 - hang up ; $0b - set baud ; $0c - set break on the line ; $91 - xon ; $93 - xoff ; ; routine will return false(0) if unable tl0cp: jmp tl2cp ; check for input ch ready-0 false tl0gpc: jmp tl2gpc ; get input ch tl0ppc: jmp tl2ppc ; put output character tl0exi: jmp tl2exi ; reset card and restore initialized .=$1040 ; futures ;[1.1]wait: .blkb 3 ; wait routine-a reg contains milliseconds wait: .blkb 3 ;[1.1] wait routine-use apple rom rtn 220=125ms,206=108ms,25=2ms prstr: .blkb 3 ; print string x=lsb,y=msb x&y->null terminated string rdkey: .blkb 3 ; read keyboard prcrlf: .blkb 3 ; print cr and lf telcnc: .blkb 3 ; check for keyboard character telspa: .blkb 3 ; set character parity ;[1.1] .=$6c00 ; place to start com card assembly .=$7f00 ;[1.4][1.2] place to start com card assembly start = . ;need a label at begining data = $C0FA ;data port mode = $C0FA ;mode reg status = $C0FB ;status port command = $C0FB ;command port control = $C0FE ;control port initbd = $35 ; Baud init (300 baud) framing = $4E ; Framing init (8bit, no par. , 1 stop, 16x) rcvst = $C2 ; status bit for input ready xmitst = $C1 ; status for output ready xmitcmd = $27 ; transmit command pinptr: .byte ; input buffer pointer inptr: .byte ; input buffer pointer for get poutpt .byte ; output buffer pointer outptr .byte ; " " " for put kwrk01 .byte ;[1.3] scrlo = $0 ; sets control bit low scrhi = $80 ; sets control bit high irqsva = $45 ;place dos saves a reg hctrlq = $91 ;^Q with high bit on hctrls = $93 ;^S " ctrlq = $11 ; ^Q ctrls = $13 ; ^S dirq = $3fe ; interupt address herld nasc 1 ;tell who we are bad nasc <*****ERROR***** COM ROUTINES ASSEMBLED TOO LOW IN MEMORY> 1 ; ; CPS serial interface support ; chkwst lda #xmitcmd ;Wait for vacant transmit reg. jsr setcmd ;set transmit command chk1 lda status ;get status reg and #xmitst ;mask unwanted bits cmp #xmitst ;is transmit reg clear? bne chk1 ;no it isn't, go back rts ;yes it is setcmd pha ;save acc lda #scrhi ;set bit v1 sta control ;set control for command access pla ;recover acc v2 sta command ;write command lda #scrlo ;unset bit v3 sta control ;reset control reg rts tl2int: lda #start^ cmp endker+1 ;are we loaded above main beq dontno ;cant tell yet bcc trble ;yes we are in trouble bcs setnm ;ok dontno lda #start\ ;well lets check 16 bits cmp endker beq setnm ;whee just exactly right bcs setnm ;ok trble ldx #bad\ ;got to tell someone ldy #bad^ jsr prstr ;print the message jsr prcrlf ;and terminate it properly setnm: lda kerins bne tl2prr ; already initialized lda #0 ; clear pointers etc sta pinptr ; buffer starts at 0 sta inptr ; buffer starts at 0 sta poutpt ; " sta outptr ; " lda kersli ;now for the slot $n0 lsr a ;rotate acc 4bits lsr a lsr a lsr a and #$0f ;isolate bottom bits ora #$c0 ;create address jsr setslot ;and store in relevant locs lda #scrhi ;set bit v4 sta control ;set control for mode access lda #framing v5 sta mode ;write framing lda sscdbd ;get baud code cmp #$0a ;is it 9 or less? bmi baudx ;yes it is sec ;no it isnt bcs baudy ;always taken baudx clc baudy lda #initbd ;get baud initialisation and #$f0 ;drop baud ora sscdbd ;add new baud sbc #$0 ;reduce by 1 if baud code <=9 v6 sta mode ;set baud rate lda #scrlo ;unset bit v7 sta control ;reset control lda #xmitcmd ;set for transmit jsr setcmd ;and set lda #$01 sta kerins ;set init done reg tl2prr rts ;return tl2cp: lda status ; Try for a character and #rcvst ; mask out bits cmp #rcvst ; is receive reg full? bne tl2cp7 ; no we dont have a ch v8 lda data ; yes get ch ldy pinptr ; where to put it in buf sta inbuf,y ; save it inc pinptr ; ready for next ch bit flowfg ; how about flow control bpl tl2cp7 ; no lda inbuf,y ; get input ch and #$7f ; drop parity etc ; bvc tl2cp4 ; yes,how about ^S received?, no cmp #ctrlq ; is this continue(start up outputing) bne tl2cp4 ; no, check for ^S lda flowfg ; tattle about the continue and #$bf ; sta flowfg ; dec pinptr ; forget about this character tl2cp2 ldy outptr ; see if any to output cpy poutpt ; well? beq tl2cp7 ; no more we have put all tl2cp3 jsr chkwst ; check status for output lda outbuf,y ; output ch v9 sta data ; bye inc outptr ; ready for next jmp tl2cp2 ; tl2cp4 cmp #ctrls ; is this stop? bne tl2cp7 ; no lda #$40 ; yes, tattle ora flowfg ; sta flowfg ; now everyone knows dec pinptr ; forget about the ^S character tl2cp7: lda pinptr cmp inptr rts ;return with false(0) or true(non 0) tl2gpc: ldx inptr ; get where it is in buf lda inbuf,x ; get the ch inc inptr ; ready for next get tl2rtc: rts ; and return tl2ppc: pha ; Hold the byte to send tl2pp1: lda #xmitcmd ; load command jsr setcmd ; send it v10 lda status ; Get the status byte and #xmitst ; Isolate the bits we want cmp #xmitst ;is it empty bne tl2pp2 ; Transmit register is NOT empty, try again bit flowfg ; flow control? bpl tl2pp0 ; no bvc tl2pp0 ; should we stop outputing?,no ldy poutpt ; yes, save this ch in buffer pla ; sta outbuf,y ; inc poutpt ; tell how many rts ; thats all tl2pp0 ; pla ; Fetch the data byte off the stack v11 sta data ; Stuff it at the proper loc to send it rts ; and return tl2pp2: jsr tl2cp ; see if there is an input ch jmp tl2pp1 ;and try again tl2exi: lda #0 ;tell we did this sta kerins ;just in case init gets called exit9: rts tl2cmd: ;find out what command beq tl2rts ;its drop line and we cant cmp #$0c beq break ;its a break command cmp #$0b beq baud ;its a set baud command cmp #hctrlq beq tl2sac ;its a xon command cmp #hctrls beq tl2sac ;its a xoff command tl2fls: lda #0 ;unknown command tl2rts: rts ;que passo ? return false(0) tl2sac: ldx flowfg ;do we have flow control bpl tl2fls ;no return false and #$7f ;drop high bit and send the ch jsr telspa ;set parity jsr tl2ppc ;output the ch lda #1 ;set true return rts baud: lda #scrhi ;set bit v12 sta control ;set control for mode access lda #framing v13 sta mode ;write framing lda sscdbd ;get baud code cmp #$0a ;is it 9 or less? bmi baudx1 ;yes it is sec ;no it isnt bcs baudy1 ;always taken baudx1 clc baudy1 lda #initbd ;get baud initialisation and #$f0 ;drop baud ora sscdbd ;add new baud sbc #$0 ;reduce by 1 if baud code <=9 v14 sta mode ;set baud rate lda #scrlo ;unset bit v15 sta control ;reset control lda #xmitcmd jsr setcmd ;set for transmit lda #xmitst rts ;return true(non 0) break: lda #scrhi ; set bit v16 sta control ; select command reg v17 lda command ; get current command pha ; lda #$08 ; v18 sta command ; start the break ;[1.1] lda #233 ; for 233 millseconds ;[1.1] jsr wait ; the y reg is not clobered ;[1.3] lda #220 ;[1.1] 125ms lda #233 ;[1.3] 233 ms sta kwrk01 ;[1.3] 1 ms at a time break3 lda timect ;[1.3] jsr wait ;[1.1] dec kwrk01 ;[1.3] bne break3 ;[1.3] ; lda #206 ;[1.1] 108ms ; jsr wait ;[1.1] for a grand total of 233ms pla ; restore command v19 sta command ; rewrite lda #scrlo ; unset bit v20 sta control ; do it lda #1 ;return true rts ; setslot sta tl2cp+2 ;Stores correct ioslot in the various sta chk1+2 ;io instructions sta v1+2 sta v2+2 sta v3+2 sta v4+2 sta v5+2 sta v6+2 sta v7+2 sta v8+2 sta v9+2 sta v10+2 sta v11+2 sta v12+2 sta v13+2 sta v14+2 sta v15+2 sta v16+2 sta v17+2 sta v18+2 sta v19+2 sta v20+2 rts inbuf .blkb 256 ;input buffer outbuf .blkb 256 ;output " endcom ;[1.2]