09 .OPT NO LIST›10 ; Cassette 60317-60438›20 ; In old source, SIO is SIOINT›30 ; and SIOMAIN is SIO. Labels›40 ; here are per Mapping The Atari›50 ; Also SENDEN is DOSENDE›60 ; " ISRODEN is XSEROUT›70 ; " ISRSIR is XSERIN›80 ; " ISRTD is XSEROC›90 .PAGE "SIO"›0100 LIST ›0110 .LOCAL ›059740 SIO LDA #$3C Turn off tape›059742 STA PACTL motor›059745 LDA #$3C Raise not Cmd›059747 STA PBCTL line›059750 LDA #3 Setup Pokey:›059752 STA SSKCTL Enable Kbd scan,›059755 STA SOUNDR debounce and i/o›059757 STA SKCTL noise off›059760 RTS ›059761 SIOMAIN TSX SIO main routine›059762 STX STACKP›059765 LDA #1 Flag time›059767 STA CRITIC critical i/o›059769 LDA DDEVIC›059772 CMP #$60 Cassette?›059774 BNE ?NOTCST No›059776 JMP ?CASENT Yes, go›059777 ;›059779 ?NOTCST LDA #0 Flag not›059781 STA CASFLG tape›059784 LDA #1 Set device›059786 STA DRETRY retries›059787 ;›059789 ?COMMND LDA #13 Send cmd frm›059791 STA CRETRY set retries›059792 ;›059793 ; Send command frame›059794 ?COMFRM LDA #$28 Set 19.2kbaud›059796 STA AUDF3›059799 LDA #0›059801 STA AUDF4›059804 CLC ›059805 LDA DDEVIC Setup cmd›059808 ADC DUNIT frame›059811 ADC #$FF less 1›059813 STA CDEVIC as bus i.d.›059816 LDA DCOMND›059819 STA CCOMND bus command›059822 LDA DAUX1›059825 STA CAUX1 and aux bytes›059828 LDA DAUX2›059831 STA CAUX2›059834 CLC Point to›059835 LDA # CDEVIC›059845 STA BUFRHI›059847 STA BFENHI›059849 LDA #$34 Lower not›059851 STA PBCTL command line›059854 JSR ?SENDIN Send cmd frame›059857 LDA ERRFLG Check bus err›059860 BNE ?BADCOM Go if any›059862 TYA Go if Ack›059863 BNE ?ACKREC received›059864 ;›059865 ?BADCOM DEC CRETRY Got err›059868 BPL ?COMFRM Go if any left›059870 JMP ?DERR1 To return code›059871 ;›059873 ?ACKREC LDA DSTATS If Ack›059876 BPL ?WATCOM go wait for›059877 ; complete if no data to send›059878 LDA #13 Send data frame›059880 STA CRETRY Set retries›059883 JSR ?LDPNTR set buffr ptrs›059886 JSR ?SENDIN send data›059889 BEQ ?DERR1 Go if bad›059890 ; Wait for completion›059891 ?WATCOM JSR ?STTMOT Put time›059894 LDA #0 out in x,y›059896 STA ERRFLG Clear errflg›059899 JSR ?WAITER Set timer/wait›059902 BEQ ?DERR Go if timeout›059903 ;›059904 BIT DSTATS›059907 BVS ?MODATA Go if more data›059908 ;›059909 LDA ERRFLG›059912 BNE ?DERR1 Branch if error›059913 ;›059914 BEQ ?RETURN Else exit›059915 ; Receive a data frame›059916 ?MODATA JSR ?LDPNTR set ptrs›059919 JSR ?RECEIV›059920 ;›059922 ?DERR LDA ERRFLG Go if no›059925 BEQ ?NOTERR error preceeded›059926 ; data›059927 LDA TSTAT Get temp status›059930 STA STATUS store in real›059931 ;›059932 ?NOTERR LDA STATUS›059934 CMP #1›059936 BEQ ?RETURN Go if success›059937 ;›059938 ?DERR1 DEC DRETRY Go if out of›059941 BMI ?RETURN device retries›059943 JMP ?COMMND else redo cmd›059944 ;›059945 ; Complete sio op›059946 ?RETURN JSR ?SENDDS Kill Pokey›059949 LDA #0 ints & reenable›059951 STA CRITIC stage 2 vblank›059953 LDY STATUS Return status in›059955 STY DSTATS y and dcb and›059958 RTS leave flag valid›059959 ?WAIT LDA #0 Wait for ACK›059961 STA ERRFLG or completion›059964 CLC ›059965 LDA # TEMP›059975 STA BUFRHI›059977 STA BFENHI›059979 LDA #$FF Set no cksum›059981 STA NOCKSUM follows data fg›059983 JSR ?RECEIV Go get byte›059986 LDY #$FF Assume success›059988 LDA STATUS›059990 CMP #1›059992 BNE ?NWOK Go if bad›059993 ;›059994 LDA TEMP›059997 CMP #'A Ack?›059999 BEQ ?GOOD›060000 ;›060001 CMP #'C Complete?›060003 BEQ ?GOOD›060004 ;›060005 CMP #'E Error?›060007 BNE ?NOTDER Go if dev did›060008 ; not return error code›060009 LDA #144 Else error 144›060011 STA STATUS›060013 BNE ?NWOK›060014 ;›060015 ?NOTDER LDA #139 NAK error 139›060017 STA STATUS›060018 ;›060019 ?NWOK LDA STATUS›060021 CMP #138 Timeout?›060023 BEQ ?BAD Yes, go›060024 ;›060025 LDA #$FF Flag some error›060027 STA ERRFLG Return with›060030 BNE ?GOOD y<>0›060031 ;›060032 ?BAD LDY #0 y=0 if timeout›060033 ;›060034 ?GOOD LDA STATUS›060036 STA TSTAT›060039 RTS ›060040 ?SEND LDA #1 Send buffer to›060042 STA STATUS serial bus›060044 JSR DOSENDE Enable send›060047 LDY #0›060049 STY CHKSUM Clear chksum›060051 STY CHKSNT and sent flag›060053 STY XMTDON and xmit done›060055 LDA (BUFRLO),Y Load first›060057 STA SEROUT byte and›060060 STA CHKSUM start checksum›060061 ;›060062 ?NOTDON LDA BRKKEY›060063 ;›060064 BNE ?NTBRK0›060066 JMP ?BROKE Go if Break key›060067 ;›060069 ?NTBRK0 LDA XMTDON Loop til›060071 BEQ ?NOTDON xmission done›060072 ;›060073 JSR ?SENDDS Disable sending›060076 RTS ›060077 XSEROUT TYA Process serial›060078 PHA output ready irq›060079 INC BUFRLO Bump buffer ptr›060081 BNE ?NOWRP0›060082 ;›060083 INC BUFRHI›060084 ;›060085 ?NOWRP0 LDA BUFRLO Check if›060087 CMP BFENLO past end›060089 LDA BUFRHI›060091 SBC BFENHI›060093 BCC ?NOTEND Branch if not›060094 ;›060095 LDA CHKSNT Go if chksum›060097 BNE ?RELONE sent›060098 ;›060099 LDA CHKSUM Send checksum›060101 STA SEROUT›060104 LDA #$FF›060106 STA CHKSNT›060108 BNE ?CHKDON›060109 ;›060110 ?RELONE LDA POKMSK Enable›060112 ORA #$08 transmit done›060114 STA POKMSK interrupt›060116 STA IRQEN›060117 ;›060119 ?CHKDON PLA Exit interrupt›060120 TAY ›060121 PLA ›060122 RTI ›060123 ?NOTEND LDY #0 Send next byte›060125 LDA (BUFRLO),Y from buffer›060127 STA SEROUT›060130 CLC ›060131 ADC CHKSUM Add to csum›060133 ADC #0›060135 STA CHKSUM›060137 JMP ?CHKDON Return›060138 ;›060139 ; Process serial output comp›060140 XSEROC LDA CHKSNT Go if csum›060142 BEQ ?FOOEY not yet sent›060143 ;›060144 STA XMTDON Else flag done›060146 LDA POKMSK Disable xmit›060148 AND #$F7 done interrupt›060150 STA POKMSK›060152 STA IRQEN›060153 ;›060155 ?FOOEY PLA ›060156 RTI ›060157 ?RECEIV LDA #0 Receive subrtn›060159 LDY CASFLG›060162 BNE ?NOCLR Go if cassette›060163 ;›060164 STA CHKSUM Clear cksum,›060165 ;›060166 ?NOCLR STA BUFRFL full flag,›060168 STA RECVDN and done flag›060170 LDA #1›060172 STA STATUS Default good›060174 JSR ?RECVEN Enable receive›060177 LDA #$3C Command frame hi›060179 STA PBCTL to pia›060180 ;›060182 ?CHKTIM LDA BRKKEY›060184 BNE ?NTBRK1›060185 ;›060186 JMP ?BROKE Go if Break key›060187 ;›060189 ?NTBRK1 LDA TIMFLG If timeout›060192 BEQ ?TOUT go set error›060193 ;›060194 LDA RECVDN Done?›060196 BEQ ?CHKTIM›060197 ;›060198 RTS Yes, exit›060199 ?TOUT LDA #138 Timeout›060201 STA STATUS›060203 RTS ›060204 XSERIN TYA Process serial›060205 PHA input ready irq›060206 LDA SKSTAT›060209 STA SKREST Reset status reg›060212 BMI ?NTFRAM Go if no framerr›060213 ;›060214 LDY #140 Framing error›060216 STY STATUS›060217 ;›060218 ?NTFRAM AND #$20 Go if no›060220 BNE ?NTOVRN overrun error›060221 ;›060222 LDY #142 Data frame›060224 STY STATUS overrun›060225 ;›060226 ?NTOVRN LDA BUFRFL Go if bffr›060228 BEQ ?NOTYET not filled›060229 ;›060230 LDA SERIN Else, byte is›060233 CMP CHKSUM checksum›060235 BEQ ?SRETRN Branch if match›060236 ;›060237 LDY #143 Checksum err›060239 STY STATUS›060240 ;›060241 ?SRETRN LDA #$FF Flag receive›060243 STA RECVDN done›060244 ;›060245 ?SUSUAL PLA ›060246 TAY ›060247 PLA ›060248 RTI ›060249 ?NOTYET LDA SERIN›060252 LDY #0 Store input in›060254 STA (BUFRLO),Y buffer›060256 CLC ›060257 ADC CHKSUM Add to csum›060259 ADC #0›060261 STA CHKSUM›060262 ;›060263 INC BUFRLO Bump buffer›060265 BNE ?NTWRP1›060266 ;›060267 INC BUFRHI›060268 ;›060269 ?NTWRP1 LDA BUFRLO›060271 CMP BFENLO›060273 LDA BUFRHI›060275 SBC BFENHI›060277 BCC ?SUSUAL Go if end bffr›060278 ;›060279 LDA NOCKSUM Go if a csum›060281 BEQ ?GOON will follow data›060282 ;›060283 LDA #0›060285 STA NOCKSUM Clear flag›060287 BEQ ?SRETRN Go always›060288 ;›060289 ?GOON LDA #$FF Set buffer›060291 STA BUFRFL full flag›060293 BNE ?SUSUAL Go always›060294 ;›060295 ?LDPNTR CLC Set buffer›060296 LDA DBUFLO pointers›060299 STA BUFRLO and end+1›060301 ADC DBYTLO›060304 STA BFENLO›060306 LDA DBUFHI›060309 STA BUFRHI›060311 ADC DBYTHI›060314 STA BFENHI›060316 RTS ›060317 ?CASENT LDA DSTATS Taoe i/o›060320 BPL ?CASRED Go if input›060321 ; Write a record›060322 LDA #$CC Set 600 baud›060324 STA AUDF3›060327 LDA #5›060329 STA AUDF4›060332 JSR DOSENDE Enable mark tone›060333 ;›060335 LDX PALNTS Mod for pal/ntsc›060336 ;›060337 LDY NTSC.PAL+4,X Short gap›060340 LDA DAUX2›060343 BMI ?SRTIR0 Go if short ok›060344 ;›060345 LDY NTSC.PAL,X Else long gap›060346 ;›060348 ?SRTIR0 LDX #0›060350 JSR ?SETVBX Set write time›060353 LDA #$34›060355 STA PACTL Motor on›060356 ;›060358 ?TIMIT LDA TIMFLG Loop til›060361 BNE ?TIMIT done›060362 ;›060363 JSR ?LDPNTR Set buffr ptrs›060366 JSR ?SEND Send buffer›060369 JMP ?CRETRN Exit›060370 ;›060372 ?CASRED LDA #$FF Receive tape›060374 STA CASFLG set flag›060375 ;›060377 LDX PALNTS›060379 LDY NTSC.PAL+6,X Short irg›060382 LDA DAUX2›060385 BMI ?SRTIR1 Go if ok›060386 ;›060387 LDY NTSC.PAL+2,X Else long›060388 ;›060390 ?SRTIR1 LDX #0 Set timeout›060392 JSR ?SETVBX for read›060395 LDA #$34›060397 STA PACTL Motor on›060398 ;›060400 ?TIMIT1 LDA TIMFLG Loop til›060403 BNE ?TIMIT1 done›060404 ;›060405 JSR ?LDPNTR set ptrs›060408 JSR ?STTMOT set timeout›060411 JSR ?SETVBX in y,x; exec›060414 JSR ?BEGIN set baud rate›060417 JSR ?RECEIV receive block›060418 ;›060420 ?CRETRN LDA DAUX2›060423 BMI ?SRTIR2 Go if short irg›060425 LDA #$3C Else turn off›060427 STA PACTL motor›060428 ;›060430 ?SRTIR2 JMP ?RETURN›060431 ;›060433 ?CLRTMFG LDA #0 Timer expiration›060435 STA TIMFLG for cdtimer1›060438 RTS ›060439 DOSENDE LDA #7 Enable sio send›060441 AND SSKCTL save kbd/pot›060444 ORA #$20 set tx mode›060446 LDY DDEVIC›060449 CPY #$60›060451 BNE ?NOTCAS Go if not tape›060452 ;›060453 ORA #8 Set fsk o/p bit›060455 LDY #7›060457 STY AUDF2 Set low tone›060460 LDY #5›060462 STY AUDF1 and high tone›060463 ;›060465 ?NOTCAS STA SSKCTL Set mask›060468 STA SKCTL and actual›060469 ;›060471 LDA #$C7 disable ser›060473 AND POKMSK ints›060475 ORA #$10 enable seror›060477 JMP ?CONTIN›060478 ;›060480 ?RECVEN LDA #7 Enable sio rx›060482 AND SSKCTL›060485 ORA #$10 set rx asynch›060487 STA SSKCTL›060490 STA SKCTL›060493 STA SKREST reset port/kbd›060496 LDA #$C7 kill old ints›060498 AND POKMSK›060500 ORA #$20 enable serin›060501 ;›060502 ?CONTIN STA POKMSK Set up send›060504 STA IRQEN or receive›060507 LDA #$28 clock ch3 with 4›060509 STA AUDCTL @ 1.79 mhz›060512 LDX #6 pure tone no vol›060514 LDA #$A8›060516 LDY SOUNDR quiet i/o?›060518 BNE ?NOISE1 no, noise on›060520 LDA #$A0 kill noise›060521 ;›060522 ?NOISE1 STA AUDC1,X Into all›060525 DEX four audc regs›060526 DEX ›060527 BPL ?NOISE1›060528 ;›060529 LDA #$A0 no noise in›060531 STA AUDC3 audc3›060534 LDY DDEVIC›060537 CPY #$60 cassette?›060539 BEQ ?CAS31 yes go›060540 ;›060541 STA AUDC1 no noise in›060544 STA AUDC2 ch1/2 for disk›060545 ;›060547 ?CAS31 RTS ›060548 ?SENDDS NOP Disable send›060549 LDA #$C7 or receive›060551 AND POKMSK›060553 STA POKMSK›060555 STA IRQEN›060558 LDX #6›060560 LDA #0›060561 ;›060562 ?ZERIT STA AUDC1,X kill all›060565 DEX audio vol›060566 DEX ›060567 BPL ?ZERIT›060568 ;›060569 RTS ›060570 ?STTMOT LDA DTIMLO Set device›060573 ROR A timeout in x,y›060574 ROR A high 6 bits in x›060575 TAY low 2 in y›060576 AND #$3F mask 2 hi bits›060578 TAX x=msb timeout›060579 TYA ›060580 ROR A›060581 AND #$C0 keep only 2 hi›060583 TAY bits, y=lsb›060584 RTS ›060585 .WORD XSERIN sio Not ref›060587 .WORD XSEROUT interrupt›060589 .WORD XSEROC handlers›060590 ;›060591 ?SENDIN LDX #1 Send to›060592 ;›060593 ?DELAY0 LDY #$FF intelligent›060594 ;›060595 ?DELAY1 DEY device›060596 BNE ?DELAY1 delay a bit›060597 ;›060598 DEX then send›060599 BNE ?DELAY0 buffer to›060600 ;›060601 JSR ?SEND serial bus›060602 ;›060604 LDY #2 set ack timeout›060606 LDX #0›060607 ;›060608 ?WAITER JSR ?SETVBX Set timer›060611 JSR ?WAIT await response›060614 TYA err if y=0›060615 RTS ›060616 ?COMPUT STA TIMER2 Compute›060619 STY TIMER2+1 baud rate›060622 JSR ?ADJUST adjust Vcount›060623 ;›060625 STA TIMER2›060628 LDA TIMER1›060631 JSR ?ADJUST›060634 STA TIMER1›060637 LDA TIMER2 Find Vcount›060640 SEC difference›060641 SBC TIMER1›060644 STA TEMP1›060647 LDA TIMER2+1›060650 SEC ›060651 SBC TIMER1+1›060654 TAY ›060655 LDX PALNTS›060657 LDA #0›060659 SEC ›060660 SBC NTSC.PAL+8,X›060661 ;›060663 ?HITIMR CLC multiply›060664 ADC NTSC.PAL+8,X›060667 DEY ›060668 BPL ?HITIMR›060669 ;›060670 CLC total Vcount›060671 ADC TEMP1 difference›060672 ;›060674 ?FINDX TAY label not ref›060675 LSR A from 800›060676 LSR A›060677 LSR A›060678 ASL A›060679 SEC ›060680 SBC #22 adj table index›060682 TAX div by 4›060683 TYA ›060684 AND #7 get 3 low bits›060686 TAY ›060687 LDA #-11›060688 ;›060689 ?DOINTP CLC accumulate›060690 ADC #11 interpolation›060692 DEY constant›060693 BPL ?DOINTP›060694 ;›060695 ?ENINTP LDY #0 lbl not ref (800)›060697 SEC adjust interpol.›060698 SBC #7 const›060700 BPL ?PLUS›060701 ;›060702 DEY ›060703 ?PLUS CLC add const to lsb›060704 ADC TPFV,X freq table val›060707 STA CBAUDL›060710 TYA ›060711 ADC TPFV+1,X carry to msb›060714 STA CBAUDH›060717 RTS ›060718 ?ADJUST CMP #$7C Adjust Vcount›060720 BMI ?ADJ1 value›060721 ;›060722 SEC ›060723 SBC #$7C›060725 RTS ›060726 ?ADJ1 CLC ›060727 LDX PALNTS›060729 ADC NTSC.PAL+10,X›060732 RTS ›060733 ?BEGIN LDA BRKKEY Set initial›060735 BNE ?NTBRK2 baud rate›060736 ;›060737 JMP ?BROKE›060738 ;›060740 ?NTBRK2 SEI ›060741 LDA TIMFLG go if not timed›060744 BNE ?OKTIM1 out›060745 ;›060746 BEQ ?TOUT1 Else glitch›060747 ;›060748 ?OKTIM1 LDA SKSTAT Read serial›060751 AND #$10 port›060753 BNE ?BEGIN Start bit?›060754 ;›060755 STA SAVIO Save data in›060758 LDX VCOUNT Read count›060761 LDY RTCLOK+2›060763 STX TIMER1 Save initial›060766 STY TIMER1+1 timer value›060769 LDX #1›060771 STX TEMP3›060774 LDY #$0A›060775 ;›060776 ?60776 LDA BRKKEY›060778 BEQ ?BROKE›060779 ;›060780 LDA TIMFLG›060783 BNE ?60789›060784 ;›060785 ?TOUT1 CLI ›060786 JMP ?TOUT›060787 ;›060789 ?60789 LDA SKSTAT›060792 AND #$10›060794 CMP SAVIO›060797 BEQ ?60776›060798 ;›060799 STA SAVIO›060802 DEY ›060803 BNE ?60776›060804 ;›060805 DEC TEMP3›060808 BMI ?60822›060809 ;›060810 LDA VCOUNT›060813 LDY RTCLOK+2›060815 JSR ?COMPUT›060818 LDY #9›060820 BNE ?60776›060821 ;›060822 ?60822 LDA CBAUDL›060825 STA AUDF3 audf3›060828 LDA CBAUDH›060831 STA AUDF4 audf4›060834 LDA #0›060836 STA SKCTL›060839 LDA SSKCTL›060842 STA SKCTL›060845 LDA #$55›060847 STA (BUFRLO),Y›060849 INY ›060850 STA (BUFRLO),Y›060852 LDA #$AA›060854 STA CHKSUM›060856 CLC ›060857 LDA BUFRLO›060859 ADC #2›060861 STA BUFRLO›060863 LDA BUFRHI›060865 ADC #0›060867 STA BUFRHI›060869 CLI ›060870 RTS ›060871 ?BROKE JSR ?SENDDS Process›060874 LDA #$3C BREAK key›060876 STA PACTL›060879 LDA #$3C›060881 STA PBCTL›060884 LDA #128 Break abort›060886 STA STATUS›060888 LDX STACKP Restore stack›060891 TXS to entry condit.›060892 DEC BRKKEY›060894 CLI ›060895 JMP ?RETURN›060896 ;›060898 ?SETVBX LDA # ?CLRTMFG address›060905 STA CDTMA1+1›060908 LDA #1 y and x preset›060910 SEI by caller›060911 JSR SETVBV set cdtimer1?›060914 LDA #1›060916 STA TIMFLG›060919 CLI ›060920 RTS ›060921 TPFV .WORD $03E8›060923 .WORD $0443 Pokey›060925 .WORD $049E›060927 .WORD $04F9 frequency›060929 .WORD $0554›060931 .WORD $05AF values›060933 .WORD $060A›060935 .WORD $0665›060937 .WORD $06C0›060939 .WORD $071A›060941 .WORD $0775›060943 .WORD $07D0›