;
;   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