diff options
Diffstat (limited to 'docs/os12/mdfs.net/Docs/Comp/BBC/OS1-20/C735')
-rw-r--r-- | docs/os12/mdfs.net/Docs/Comp/BBC/OS1-20/C735 | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/docs/os12/mdfs.net/Docs/Comp/BBC/OS1-20/C735 b/docs/os12/mdfs.net/Docs/Comp/BBC/OS1-20/C735 new file mode 100644 index 0000000..badc60f --- /dev/null +++ b/docs/os12/mdfs.net/Docs/Comp/BBC/OS1-20/C735 @@ -0,0 +1 @@ +*************************************************************************
* *
* OSWORD 9 - READ A PIXEL *
* =POINT(X,Y) *
* *
*************************************************************************
;on entry &EF=A=9
; &F0=X=low byte of parameter block address
; &F1=Y=high byte of parameter block address
; PARAMETER BLOCK
; 0,1=X coordinate
; 2,3=Y coordinate
;on exit, result in BLOCK+4
; =&FF if point was of screen or logical colour of point if on screen
;
C735 LDY #&03 ;Y=3 to point to hi byte of Y coordinate
C737 LDA (&F0),Y ;get it
C739 STA &0328,Y ;store it
C73C DEY ;point to next byte
C73D BPL &C737 ;transfer till Y=&FF lo byte of X coordinate in &328
C73F LDA #&28 ;
C741 JSR &D839 ;check window boundaries
C744 LDY #&04 ;Y=4
C746 BNE &C750 ;jump to C750
*************************************************************************
* *
* OSWORD 11 - READ PALLETTE *
* *
*************************************************************************
;on entry &EF=A=11
; &F0=X=low byte of parameter block address
; &F1=Y=high byte of parameter block address
; PARAMETER BLOCK
; 0=logical colour to read
;on exit, result in BLOCK
; 0=logical colour
; 1=physical colour
; 2=red colour component \
; 3=green colour component } when set using analogue colours
; 4=blue colour component /
C748 AND &0360 ;number of logical colours less 1
C74B TAX ;put it in X
C74C LDA &036F,X ;colour pallette
C74F INY ;increment Y to point to byte 1
C750 STA (&F0),Y ;store data
C752 LDA #&00 ;issue 0s
C754 CPY #&04 ;to next bytes until Y=4
C756 BNE &C74F ;
C758 RTS ;and exit
*************************************************************************
* *
* VDU 12 - CLEAR TEXT SCREEN *
* CLS *
* *
*************************************************************************
;
C759 JSR &C588 ;A=0 if text cursor A=&20 if graphics cursor
C75C BNE &C7BD ;if graphics cursor &C7BD
C75E LDA &D0 ;VDU status byte
C760 AND #&08 ;check if software scrolling (text window set)
C762 BNE &C767 ;if so C767
C764 JMP &CBC1 ;initialise screen display and home cursor
C767 LDX &030B ;top of text window
C76A STX &0319 ;current text line
C76D JSR &CEAC ;clear a line
C770 LDX &0319 ;current text line
C773 CPX &0309 ;bottom margin
C776 INX ;X=X+1
C777 BCC &C76A ;if X at compare is less than bottom margin clear next
*************************************************************************
* *
* VDU 30 - HOME CURSOR *
* *
*************************************************************************
C779 JSR &C588 ;A=0 if text cursor A=&20 if graphics cursor
C77C BEQ &C781 ;if text cursor C781
C77E JMP &CFA6 ;home graphic cursor if graphic
C781 STA &0323 ;store 0 in last two parameters
C784 STA &0322 ;
*************************************************************************
* *
* VDU 31 - POSITION TEXT CURSOR *
* TAB(X,Y) *
* *
* 2 parameters *
* *
*************************************************************************
;0322 = supplied X coordinate
;0323 = supplied Y coordinate
C787 JSR &C588 ;A=0 if text cursor A=&20 if graphics cursor
C78A BNE &C758 ;exit
C78C JSR &C7A8 ;exchange text column/line with workspace 0328/9
C78F CLC ;clear carry
C790 LDA &0322 ;get X coordinate
C793 ADC &0308 ;add to text window left
C796 STA &0318 ;store as text column
C799 LDA &0323 ;get Y coordinate
C79C CLC ;
C79D ADC &030B ;add top of text window
C7A0 STA &0319 ;current text line
C7A3 JSR &CEE8 ;set up screen address
C7A6 BCC &C732 ;set cursor position if C=0 (point on screen)
C7A8 LDX #&18 ;else point to workspace
C7AA LDY #&28 ;and line/column to restore old values
C7AC JMP &CDDE ;exchange &300/1+X with &300/1+Y
*************************************************************************
* *
* VDU 13 - CARRIAGE RETURN *
* *
*************************************************************************
C7AF JSR &C588 ;A=0 if text cursor A=&20 if graphics cursor
C7B2 BEQ &C7B7 ;if text C7B7
C7B4 JMP &CFAD ;else set graphics cursor to left hand columm
C7B7 JSR &CE6E ;set text column to left hand column
C7BA JMP &C6AF ;set up cursor and display address
C7BD JSR &CFA6 ;home graphic cursor
*************************************************************************
* *
* VDU 16 - CLEAR GRAPHICS SCREEN *
* CLG *
* *
*************************************************************************
C7C0 LDA &0361 ;pixels per byte
C7C3 BEQ &C7F8 ;if 0 current mode has no graphics so exit
C7C5 LDX &035A ;Background graphics colour
C7C8 LDY &035C ;background graphics plot mode (GCOL n)
C7CB JSR &D0B3 ;set graphics byte mask in &D4/5
C7CE LDX #&00 ;graphics window
C7D0 LDY #&28 ;workspace
C7D2 JSR &D47C ;set(300/7+Y) from (300/7+X)
C7D5 SEC ;set carry
C7D6 LDA &0306 ;graphics window top lo.
C7D9 SBC &0302 ;graphics window bottom lo
C7DC TAY ;Y=difference
C7DD INY ;increment
C7DE STY &0330 ;and store in workspace (this is line count)
C7E1 LDX #&2C ;
C7E3 LDY #&28 ;
C7E5 JSR &D6A6 ;clear line
C7E8 LDA &032E ;decrement window height in pixels
C7EB BNE &C7F0 ;
C7ED DEC &032F ;
C7F0 DEC &032E ;
C7F3 DEC &0330 ;decrement line count
C7F6 BNE &C7E1 ;if <>0 then do it again
C7F8 RTS ;exit
*************************************************************************
* *
* VDU 17 - DEFINE TEXT COLOUR *
* COLOUR n *
* *
* 1 parameter *
* *
*************************************************************************
;parameter in &0323
C7F9 LDY #&00 ;Y=0
C7FB BEQ &C7FF ;jump to C7FF
*************************************************************************
* *
* VDU 18 - DEFINE GRAPHICS COLOUR *
* GCOL k,c *
* *
* 2 parameters *
* *
*************************************************************************
;parameters in 323,322
C7FD LDY #&02 ;Y=2
C7FF LDA &0323 ;get last parameter
C802 BPL &C805 ;if +ve it's foreground colour so C805
C804 INY ;else Y=Y+1
C805 AND &0360 ;number of logical colours less 1
C808 STA &DA ;store it
C80A LDA &0360 ;number of logical colours less 1
C80D BEQ &C82B ;if none exit
C80F AND #&07 ;else limit to an available colour and clear M
C811 CLC ;clear carry
C812 ADC &DA ;Add last parameter to get pointer to table
C814 TAX ;pointer into X
C815 LDA &C423,X ;get plot options from table
C818 STA &0357,Y ; colour Y=0=text fgnd 1= text bkgnd 2=graphics fg etc
C81B CPY #&02 ;If Y>1
C81D BCS &C82C ;then its graphics so C82C else
C81F LDA &0357 ;foreground text colour
C822 EOR #&FF ;invert
C824 STA &D3 ;text colour byte to be orred or EORed into memory
C826 EOR &0358 ;background text colour
C829 STA &D2 ;text colour byte to be orred or EORed into memory
C82B RTS ;and exit
;
C82C LDA &0322 ;get first parameter
C82F STA &0359,Y ;text colour Y=0=foreground 1=background etc.
C832 RTS ;exit
;
C833 LDA #&20 ;
C835 STA &0358 ;background text colour
C838 RTS ;
*************************************************************************
* *
* VDU 20 - RESTORE DEFAULT COLOURS *
* *
*************************************************************************
;
C839 LDX #&05 ;X=5
C83B LDA #&00 ;A=0
C83D STA &0357,X ;zero all colours
C840 DEX ;
C841 BPL &C83D ;until X=&FF
C843 LDX &0360 ;number of logical colours less 1
C846 BEQ &C833 ;if none its MODE 7 so C833
C848 LDA #&FF ;A=&FF
C84A CPX #&0F ;if not mode 2 (16 colours)
C84C BNE &C850 ;goto C850
C84E LDA #&3F ;else A=&3F
C850 STA &0357 ;foreground text colour
C853 STA &0359 ;foreground graphics colour
C856 EOR #&FF ;invert A
C858 STA &D2 ;text colour byte to be orred or EORed into memory
C85A STA &D3 ;text colour byte to be orred or EORed into memory
C85C STX &031F ;set first parameter of 5
C85F CPX #&03 ;if there are 4 colours
C861 BEQ &C874 ;goto C874
C863 BCC &C885 ;if less there are 2 colours goto C885
;else there are 16 colours
C865 STX &0320 ;set second parameter
C868 JSR &C892 ;do VDU 19 etc
C86B DEC &0320 ;decrement first parameter
C86E DEC &031F ;and last parameter
C871 BPL &C868 ;
C873 RTS ;
;
********* 4 colour mode *************************************************
C874 LDX #&07 ;X=7
C876 STX &0320 ;set first parameter
C879 JSR &C892 ;and do VDU 19
C87C LSR &0320 ;
C87F DEC &031F ;
C882 BPL &C879 ;
C884 RTS ;exit
;********* 2 colour mode ************************************************
C885 LDX #&07 ;X=7
C887 JSR &C88F ;execute VDU 19
C88A LDX #&00 ;X=0
C88C STX &031F ;store it as
C88F STX &0320 ;both parameters
*************************************************************************
* *
* VDU 19 - DEFINE COLOURS *
* [COLOUR l,p] *
* [COLOUR l,r,g,b] *
* *
* 5 parameters *
* *
*************************************************************************
;&31F=first parameter logical colour
;&320=second physical colour
C892 PHP ;push processor flags
C893 SEI ;disable interrupts
C894 LDA &031F ;get first parameter and
C897 AND &0360 ;number of logical colours less 1
C89A TAX ;toi make legal X=A
C89B LDA &0320 ;A=second parameter
C89E AND #&0F ;make legal
C8A0 STA &036F,X ;colour pallette
C8A3 TAY ;Y=A
C8A4 LDA &0360 ;number of logical colours less 1
C8A7 STA &FA ;store it
C8A9 CMP #&03 ;is it 4 colour mode??
C8AB PHP ;save flags
C8AC TXA ;A=X
C8AD ROR ;rotate A into &FA
C8AE ROR &FA ;
C8B0 BCS &C8AD ;
C8B2 ASL &FA ;
C8B4 TYA ;A=Y
C8B5 ORA &FA ;
C8B7 TAX ;
C8B8 LDY #&00 ;Y=0
C8BA PLP ;check flags
C8BB PHP ;
C8BC BNE &C8CC ;if A<>3 earlier C8CC
C8BE AND #&60 ;else A=&60 to test bits 5 and 6
C8C0 BEQ &C8CB ;if not set C8CB
C8C2 CMP #&60 ;else if both set
C8C4 BEQ &C8CB ;C8CB
C8C6 TXA ;A=X
C8C7 EOR #&60 ;invert
C8C9 BNE &C8CC ;and if not 0 C8CC
C8CB TXA ;X=A
C8CC JSR &EA11 ;call Osbyte 155 pass data to pallette register
C8CF TYA ;
C8D0 SEC ;
C8D1 ADC &0360 ;number of logical colours less 1
C8D4 TAY ;
C8D5 TXA ;
C8D6 ADC #&10 ;
C8D8 TAX ;
C8D9 CPY #&10 ;if Y<16 do it again
C8DB BCC &C8BA ;
C8DD PLP ;pull flags twice
C8DE PLP ;
C8DF RTS ;and exit
*************************************************************************
* *
* OSWORD 12 - WRITE PALLETTE *
* *
*************************************************************************
;on entry X=&F0:Y=&F1:YX points to parameter block
;byte 0 = logical colour; byte 1 physical colour; bytes 2-4=0
C8E0 PHP ;push flags
C8E1 AND &0360 ;and with number of logical colours less 1
C8E4 TAX ;X=A
C8E5 INY ;Y=Y+1
C8E6 LDA (&F0),Y ;get phsical colour
C8E8 JMP &C89E ;do VDU19 with parameters in X and A
*************************************************************************
* *
* VDU 22 - SELECT MODE *
* MODE n *
* *
* 1 parameter *
* *
*************************************************************************
;parameter in &323
C8EB LDA &0323 ;get parameter
C8EE JMP &CB33 ;goto CB33
*************************************************************************
* *
* VDU 23 - DEFINE CHARACTERS *
* *
* 9 parameters *
* *
*************************************************************************
;parameters are:-
;31B character to define
;31C to 323 definition
C8F1 LDA &031B ;get character to define
C8F4 CMP #&20 ;is it ' '
C8F6 BCC &C93F ;if less then it is a control instruction, goto C93F
C8F8 PHA ;else save parameter
C8F9 LSR ;A=A/32
C8FA LSR ;
C8FB LSR ;
C8FC LSR ;
C8FD LSR ;
C8FE TAX ;X=A
C8FF LDA &C40D,X ;get font flag mask from table (A=&80/2^X)
C902 BIT &0367 ;font flag
C905 BNE &C927 ;and if A<>0 C927 storage area is established already
C907 ORA &0367 ;or with font flag to set bit found to be 0
C90A STA &0367 ;font flag
C90D TXA ;get back A
C90E AND #&03 ;And 3 to clear all but bits 0 and 1
C910 CLC ;clear carry
C911 ADC #&BF ;add &BF (A=&C0,&C1,&C2) to select a character page
C913 STA &DF ;store it
C915 LDA &0367,X ;get font location byte (normally &0C)
C918 STA &DD ;store it
C91A LDY #&00 ;Y=0 so (&DE) holds (&C000 -&C2FF)
C91C STY &DC ;
C91E STY &DE ;
C920 LDA (&DE),Y ;transfer page to storage area
C922 STA (&DC),Y ;
C924 DEY ;
C925 BNE &C920 ;
C927 PLA ;get back A
C928 JSR &D03E ;set up character definition pointers
C92B LDY #&07 ;Y=7
C92D LDA &031C,Y ;transfer definition parameters
C930 STA (&DE),Y ;to RAM definition
C932 DEY ;
C933 BPL &C92D ;
C935 RTS ;and exit
;
C936 PLA ;Pull A
C937 RTS ;and exit
;
************ VDU EXTENSION **********************************************
C938 LDA &031F ;A=fifth VDU parameter
C93B CLC ;clear carry
C93C JMP (&0226) ;jump via VDUV vector
********** VDU control commands *****************************************
C93F CMP #&01 ;is A=1
C941 BCC &C958 ;if less (0) then set CRT register directly
C943 BNE &C93C ;if not 1 jump to VDUV for VDU extension
********** turn cursor on/off *******************************************
C945 JSR &C588 ;A=0 if text cursor, A=&20 if graphics cursor
C948 BNE &C937 ;if graphics exit
C94A LDA #&20 ;A=&20 - preload to turn cursor off
C94C LDY &031C ;Y=second VDU parameter
C94F BEQ &C954 ;if 0, jump to C954 to turn cursor off
C951 LDA &035F ;get last setting of CRT controller register
;for cursor on
C954 LDY #&0A ;Y=10 - cursor control register number
C956 BNE &C985 ;jump to C985, Y=register, Y=value
********** set CRT controller *******************************************
C958 LDA &031D ;get third
C95B LDY &031C ;and second parameter
C95E CPY #&07 ;is Y=7
C960 BCC &C985 ;if less C985
C962 BNE &C967 ;else if >7 C967
C964 ADC &0290 ;else ADD screen vertical display adjustment
C967 CPY #&08 ;If Y<>8
C969 BNE &C972 ;C972
C96B ORA #&00 ;if bit 7 set
C96D BMI &C972 ;C972
C96F EOR &0291 ;else EOR with interlace toggle
C972 CPY #&0A ;Y=10??
C974 BNE &C985 ;if not C985
C976 STA &035F ;last setting of CRT controller register
C979 TAY ;Y=A
C97A LDA &D0 ;VDU status byte
C97C AND #&20 ;check bit 5 printing at graphics cursor??
C97E PHP ;push flags
C97F TYA ;Y=A
C980 LDY #&0A ;Y=10
C982 PLP ;pull flags
C983 BNE &C98B ;if graphics in use then C98B
C985 STY &FE00 ;else set CRTC address register
C988 STA &FE01 ;and poke new value to register Y
C98B RTS ;exit
*************************************************************************
* *
* VDU 25 - PLOT *
* PLOT k,x,y *
* *
* 5 parameters *
* *
*************************************************************************
;
C98C LDX &0361 ;pixels per byte
C98F BEQ &C938 ;if no graphics available go to VDU Extension
C991 JMP &D060 ;else enter Plot routine at D060
********** adjust screen RAM addresses **********************************
C994 LDX &0350 ;window area start address lo
C997 LDA &0351 ;window area start address hi
C99A JSR &CCF8 ;subtract bytes per character row from this
C99D BCS &C9B3 ;if no wraparound needed C9B3
C99F ADC &0354 ;screen RAM size hi byte to wrap around
C9A2 BCC &C9B3 ;
C9A4 LDX &0350 ;window area start address lo
C9A7 LDA &0351 ;window area start address hi
C9AA JSR &CAD4 ;add bytes per char. row
C9AD BPL &C9B3 ;
C9AF SEC ;wrap around i other direction
C9B0 SBC &0354 ;screen RAM size hi byte
C9B3 STA &0351 ;window area start address hi
C9B6 STX &0350 ;window area start address lo
C9B9 LDY #&0C ;Y=12
C9BB BNE &CA0E ;jump to CA0E
*************************************************************************
* *
* VDU 26 - SET DEFAULT WINDOWS *
* *
*************************************************************************
C9BD LDA #&00 ;A=0
C9BF LDX #&2C ;X=&2C
C9C1 STA &0300,X ;clear all windows
C9C4 DEX ;
C9C5 BPL &C9C1 ;until X=&FF
C9C7 LDX &0355 ;screen mode
C9CA LDY C3EF,X ;text window right hand margin maximum
C9CD STY &030A ;text window right
C9D0 JSR &CA88 ;calculate number of bytes in a line
C9D3 LDY &C3E7,X ;text window bottom margin maximum
C9D6 STY &0309 ;bottom margin
C9D9 LDY #&03 ;Y=3
C9DB STY &0323 ;set as last parameter
C9DE INY ;increment Y
C9DF STY &0321 ;set parameters
C9E2 DEC &0322 ;
C9E5 DEC &0320 ;
C9E8 JSR &CA39 ;and do VDU 24
C9EB LDA #&F7 ;
C9ED JSR &C5A8 ;clear bit 3 of &D0
C9F0 LDX &0350 ;window area start address lo
C9F3 LDA &0351 ;window area start address hi
C9F6 STX &034A ;text cursor 6845 address
C9F9 STA &034B ;text cursor 6845 address
C9FC BPL &CA02 ;set cursor position
C9FE SEC ;
C9FF SBC &0354 ;screen RAM size hi byte
**************** set cursor position ************************************
CA02 STX &D8 ;set &D8/9 from X/A
CA04 STA &D9 ;
CA06 LDX &034A ;text cursor 6845 address
CA09 LDA &034B ;text cursor 6845 address
CA0C LDY #&0E ;Y=15
CA0E PHA ;Push A
CA0F LDA &0355 ;screen mode
CA12 CMP #&07 ;is it mode 7?
CA14 PLA ;get back A
CA15 BCS &CA27 ;if mode 7 selected CA27
CA17 STX &DA ;else store X
CA19 LSR ;divide X/A by 8
CA1A ROR &DA ;
CA1C LSR ;
CA1D ROR &DA ;
CA1F LSR ;
CA20 ROR &DA ;
CA22 LDX &DA ;
CA24 JMP &CA2B ;goto CA2B
CA27 SBC #&74 ;mode 7 subtract &74
CA29 EOR #&20 ;EOR with &20
CA2B STY &FE00 ;write to CRTC address file register
CA2E STA &FE01 ;and to relevant address (register 14)
CA31 INY ;Increment Y
CA32 STY &FE00 ;write to CRTC address file register
CA35 STX &FE01 ;and to relevant address (register 15)
CA38 RTS ;and RETURN
\ No newline at end of file |