; ; DEC 3 - OSWORD calls to us. ; markso ; Mark start of block. LDA sonrow ; Start-of-name STA sobrow ; Start-of-block ; LDA sonofs ; offset STA sobofs JMP swexit ; ; ; ; gosob ; Return to block start LDA sobrow STA currow ; LDA sobofs STA curofs JMP swexit ; ; ; ; markeo ; Mark end of block LDA sonrow STA eobrow ; End-of-block ; LDA sonofs STA eobofs ; JMP swexit ; ; ; ; mark00 ; Mark start of name LDA currow ; Current row STA sonrow ; LDA curofs STA sonofs ; JMP swexit ; ; ; ; ; ; ; ; movehe ; Point rolling headers ; to address given. ; An address of 0 means No Header. LDYIM 1 bufctr LDAIY &F0 STAAY head00-1 ; Transfer address bytes INY CPYIM 3 ; [1,2] BNE bufctr ; JMP swexit ; ; ; ; selcha ; Select TV channel LDYIM 1 LDAIY &F0 ; CurrentlyA1 0,2,3 locsel ; Enters from *BBC1 etc EOR oldctr ANDIM 3 ; <<=== New hardware? EOR oldctr ; STA oldctr ; Always save a copy STA ctrlre ; when setting hardware. ; Wipe full etc. bits in all active CBS... LdaIM 1 STA TSbuff+1 ; Clear TSbuff init. page LdxIM 0 blastt ; You can tell Im getting pissed off with this, can't you... Txa Pha LdaAX ctrlbl+inuse RolA BPL missed Jsr zapf00 ;(X) missed pla Clc AdcIM CBlen TAX CmpIM nopage*CBlen Bne blastt LdaIM &FF LdxIM 7 cw StaAX magptr DEX Bpl cw JMP swexit ; ; ; ; rdchan ; Read software copy ; of current channel no. LDYIM 1 LDA oldctr ; [0,1,2,3] ANDIM 3 STAIY &F0 ; JMP swexit ; ; ; ; rdprev ; What was language ; before starting ; TELETEXT? LDYIM 1 LDA prevla STAIY &F0 INY LDA prevfs STAIY &F0 JMP swexit ; ; ; ; ; nonswe STA zp0 PLA TAX PLA TAY LDA zp0 RTS ;***************************************** loadpa ; Transfer from internal ; buffer to 40*24 page image ; in memory. LDA &F0 ; F(0,1) points to request block CLC ADCIM 1 ; of form [command, addr] STA zp0 ; Put addr into ZP(0,1) LDA &F1 ; andA1 transfer it to DMA zp(0) ADCIM 0 STA zp1 JSR initdm ; Set up address for transfer LDA &EF PHA LDA &F0 PHA LDA &F1 PHA PHP CLI ; Takes some time, so allow ints. ; (Don't need F0 etc, so don't save) LDX select ; Currently select page ; ****FIX - put it in **** LDAAX ctrlbl STA zp0 LDAAX ctrlbl+1 STA zp1 ; SetA1 ZP(0) to point to the page buffer JSR wait BIT &FF BMI load08 ; Wait for the page to arrive. LDXIM 24 ; 24 Lines to be sent ; LDAIM 0 STA scratc ; Rather dubious ; double height counter. ; (Fortunately, this bit works OK.) load00 LDYIM pagehe LDAIY zp0 ; If it is &FF, ; the line wasn't transmitted. BPL load02 ; jump if present ; LDYIM 40 ; Clear down an absent ; line to 40 spaces LDAIM " " load01 JSR prodby ; Write to memory :OR: tube. ; (Via DMAzp(0,1)) DEY BNE load01 ; BEQ load07 ; (Unconditional) ; load02 ; Write (or send) a proper line LDYIM pagehe+pageju ; load03 LDAIY zp0 ; Get byte from page buffer ORAIM &80 ; Set top bit to ; get control codes ; through teletext. JSR prodby ; **** SAVES X,Y **** CMPIM &8D ; Is it double height? BNE load04 ; Yes, so... INC scratc ; set a flag. load04 INY ; Next character in this row. CPYIM pagehe+pageju+40 ; (50) End of line? BNE load03 ; <<<=== End loop on columns ; load07 ; Line now sent (in one form or the other) DEX ; Next row. BNE notunl ; If finished, ; leap out and unlock the page load08 PLP PLA STA &F1 PLA STA &F0 PLA STA &EF Jmp unlock notunl ; LDA scratc ; Was there any double height? ; (note implicit assumption that there ; wasn't any on the last row... - YUGH) BEQ load05 ; No. => contin ; Yes => ... ; EORIM &80 ; Flip bit to indicate 2nd pass STA scratc BMI load00 ; -> 2nd pass ; LDAIM 0 STA scratc ; Finished. ; LDAIM 2 ; Go on two lines ; because of double height BNE load06 ; JMP ... ; load05 LDAIM 1 ; set pointer for next ; row in page buffer load06 ; (A=2) JSR multby ; ADD (40 + pageju)*no of lines to zp(0,1) JMP load00 ; <<<<==== end loop on lines ; ; ; ; checkr ; Has a new copy of my page arrived? LDX select LDAAX ctrlbl+upda00 ROLA BPL failed LDAAX ctrlbl+hold ORAIM flagbi STAAX ctrlbl+hold ; LDAAX ctrlbl+incons ; Empty or partially upda00? ROLA BMI Notrea ; LDAAX ctrlbl+upda00 ROLA BPL Notrea ; Not upda00? ; LDAAX ctrlbl+upda00 ANDIM TIM01 STAAX ctrlbl+upda00 ; clear UPDATED LDAAX ctrlbl+full ROLA BPL failed ; internal error if upda00 but not full... recover... LDYIM 1 LDAIM &FF STAIY &F0 JMP swexit Notrea LDAAX ctrlbl+hold ANDIM TIM01 STAAX ctrlbl+hold ; clear HOLD failed LDYIM 1 LDAIM 0 STAIY &F0 JMP swexit ; unlo00 Jsr unlo01 ldaAX ctrlbl+full AndIM TIM01 StaAX ctrlbl+full Jmp swexit ; unlock Jsr unlo01 Jmp swexit ; ; unlo01 ; (was held to read from as data stream) LDX select LDAAX ctrlbl+upda00 ANDIM TIM01 STAAX ctrlbl+upda00 LDAAX ctrlbl+incons ; ********************************** PHA ANDIM TIM01 ; SHOULD ZAP FULL IF WAS INCONSISTENT!!! STAAX ctrlbl+incons PLA ROLA BPL unlnoz LDAAX ctrlbl+full ANDIM TIM01 STAAX ctrlbl+full unlnoz ; TEMP???????? DONT ZAP FULL-BIT FOR TERM0 LDAAX ctrlbl+hold ANDIM TIM01 STAAX ctrlbl+hold Rts ; Mwait ; May possibly add JSR unlo01, and wipe FULL bit if bug-fix required. LdaIM :MSB: (OpenWa-1) PHA LDAIM :LSB: (OpenWa-1) PHA LDAIM 0 PHA PHA PHA JMP OSWsl1 ; DROP THROUGH. WHAT WE NEED ; IS TO CHECK THE DIFFERENT HEAD-CHAIN/NEXT-CHAIN CALLS ; AND PERFORM APPROPRIATE ACTIONS... ; OpenWa JSR initbg LDA &EF PHA LDA &F0 PHA LDA &F1 PHA PHP CLI JSR waitcr PLP PLA STA &F1 PLA STA &F0 PLA STA &EF JMP swexit ; clrhol LDAAX ctrlbl+hold ANDIM TIM01 STAAX ctrlbl+hold wait ; Wait for page to be ready BIT &FF BMI waites LDX select LDAAX ctrlbl+full ROLA BPL wait LDAAX ctrlbl+hold ORAIM flagbi STAAX ctrlbl+hold waitrd BIT &FF BMI waites LDAAX ctrlbl+incons ROLA BMI waitrd LDAAX ctrlbl+full ROLA BPL clrhol waites RTS ; ***Internal routine *** clrh01 Lda CRCsig Bne clrh02 JMP ACCEPT clrh02 CmpIM 2 Bne CRCnob Jsr dobrk = &CA = "Bad checksum on page" BRK CRCnob JSR zapf00 ; Wipe down completely and refetch LdaAX ctrlbl+5 OraIM &80 ; Set wild bit StaAX ctrlbl+5 LdaAX ctrlbl+6 OraIM &80 StaAX ctrlbl+6 LdaAX ctrlbl+7 OraIM &80 StaAX ctrlbl+7 LdaAX ctrlbl+8 OraIM &80 StaAX ctrlbl+8 Lda commle BPL clrh00 TXA PHA JSR stri02 = 13 = 10 = "Bad data. Retrying..." = 13 = 10 = 0 PLA TAX clrh00 LDAAX ctrlbl+hold ANDIM TIM01 STAAX ctrlbl+hold waitcr ; Wait for page to be ready BIT &FF BMI wait00 LDX select LDAAX ctrlbl+full ROLA BPL waitcr LDAAX ctrlbl+hold ORAIM flagbi STAAX ctrlbl+hold wait01 BIT &FF BMI wait00 LDAAX ctrlbl+incons ROLA BMI wait01 LDAAX ctrlbl+full ROLA BPL clrh00 LDAAX ctrlbl+crcpre ROLA BPL gotocl LDAAX ctrlbl+crcok ROLA BMI ACCEPT gotocl JMP clrh01 ACCEPT LdaAX ctrlbl+5 AndIM &7F ; Wipe wild bits for re-fetch on *DISK StaAX ctrlbl+5 LdaAX ctrlbl+6 AndIM &7F ; Wipe wild bits for re-fetch on *DISK StaAX ctrlbl+6 LdaAX ctrlbl+7 AndIM &7F StaAX ctrlbl+7 LdaAX ctrlbl+8 AndIM &7F StaAX ctrlbl+8 wait00 RTS ; ; ; ; ; ; ; ;\ ; ; multby ; MultiplyA1 A by (40+pageju) and add to zp(0) ; andA1 add to ZP(0) LDYIM 4 ; *****Must preserve X ***** mult1 ASLA ; <<<=== Only for 48!!! DEY BNE mult1 PHA BCC mult2 LDAIM 2 ADC zp1 STA zp1 mult2 LDYIM 3 mult3 CLC PLA PHA ADC zp0 STA zp0 LDA zp1 ADCIM 0 STA zp1 DEY BNE mult3 PLA RTS ; ; LNK DEC4A