$MLC F 100 10 3000
300 CALL CLEAR
310 PRINT "1: TEST FOR TI-99"
320 PRINT "2: TEST FOR TI 99 + F18A"
330 PRINT
340 INPUT "Your choice :":C
350 IF C=1 THEN C=47::GOTO 400
360 IF C=2 THEN C=59::GOTO 400
370 GOTO 300
400 CALL LINK("MULTIC",C)
410 CALL CLEAR
420 PRINT "Back to Basic, THAT's ALL!"
430 PRINT::GOTO 310
$MULTIC 0
    XPATTERN 2          ; move pattern table to address >1000
    GETPARAM 1 T        ; T=47 or 59
    COMPARE T 47
    IF=
        MULTICOLOR          ; multicolor mode 64*48
        LET S 1536          ; size of pattern table
        LET D 24
    ELSE
        XREGENABLE
        MULTICOLOR L30      ; multicolor mode 64*60 on the F18A
        SLOCATE 29 250 1    ; to mark end of sprite list
        LET S 2048
        LET D 30
    ENDIF
    LET M &h1000        ; base address for patterns

;--------------------------
; First demo: MCPLOT
; plot random pixels with symetry
;--------------------------

    FILLTABLE M S 0  ; clear all patterns!
    REPEAT
        RND         ; RND always returns the value in Z
        AND Z 31
        LET X Z     ; X position = RND from 0 to 31
        RND
        DIV Z D
        LET Y Z     ; Y position = RND from 0 to 23/29
        RND
        AND Z 15    ; Z color = RND from 0 to 15
        MCPLOT (X,Y) Z   ; up left
        LET A 63
        SUB A X
        MCPLOT (A,Y) Z   ; up right
        LET B T
        SUB B Y
        MCPLOT (X,B) Z   ; down left
        MCPLOT (A,B) Z   ; down right
        KEY 0
    UNTIL>=

;---------------------------
; Second demo: one little line to verify correct plotting
;---------------------------

    FILLTABLE M S &h22      ; fill screen with color 3 (2+1), green
    FOR I 0 15
        MCPLOT (I,I) I      ; plots a diagonal in 16 colors
        KEYNEW 0            ; wait between each plot
    NEXT

;----------------------------
; Third demo: MCDRAWTO
; fill screen with color lines
;----------------------------

    FILLTABLE M S 0         ; clear screen
    CLEAR C                 ; first color is zero
    REPEAT
        FOR Y 0 T               ; 48/60 lines
            MCPLOT (0,0) C      ; plot up left
            MCDRAWTO (63,Y) C   ; draw to a pixel on the last column
            INC C               ; next color
            AND C &h000F        ; cycle in 0-15 only
        NEXT
        FOR Y 1 T               ; 47/59 lines
            MCPLOT (63,T) C     ; plot down right
            MCDRAWTO (0,Y) C    ; draw to a pixel on the first column
            INC C
            AND C &h000F  
        NEXT
        KEY 0                   ; wait until key
    UNTIL>=

;---------------------------
; last demo: SINE curve
;---------------------------

    FILLTABLE M S 0
    MCPLOT (0,D) 1
    MCDRAWTO (63,D) 1           ; X axis in black
    MCPLOT (32,0) 1
    MCDRAWTO (32,T) 1           ; Y axis in black
    FARRAY 0                    ; special zone, reserve some floats
    FLOAT 1                     ; R0 = 1
    FATN                        ; R0 = ATN(1) = PI/4
    FMOVE 0 1                   ; R1 = PI/4
    FLOAT 8                     ; R0 = 8
    FDIV                        ; R0 = PI/4 / 8 = PI/32
    FMOVE 0 2                   ; saves PI/32 in R2
    FLOAT T
    FMOVE 0 1                   ; R1 = 47 or 59
    FLOAT -2
    FDIV                        ; R0 = -47/2 or -59/2
    FMOVE 0 3                   ; saves in R3
    LET Q 2
    REPEAT
        RND
        AND Z 15
        LET C Z
        SELECT C
        CASE 0                  ; don't want the transparent color
            INC C
        CASE 7                  ; nor the blue background
            INC C
        ENDSELECT
        MCPLOT (0,D) C         ; first pixel
        FOR X 1 63
            FLOAT X             ; R0 = X
            FMOVE 2 1           ; R1 = PI/32
            FMUL                ; R0 = X*PI/32 (if 0<X<63 then 0<R0<2PI)
            FSIN                ; R0=Y=SIN(X) in radians
            FMOVE 0 1
            FLOAT 1
            FSUB                ; Y-1
            FMOVE 3 1
            FMUL                ; -47/2*(Y-1) or -59/2*(Y-1) turns value -1<Y<1 into 0<Y<47 or 59 for plotting
            INTEGER Y           ; get Y in integer
            MCDRAWTO (X,Y) C    ; and plots
        NEXT
        KEY 0
    UNTIL>=
            
;---------------------------
; return to XBASIC
;---------------------------

    COMPARE T 59
    IF=
        SLOCATE 29 210 1    ; back to standard end of sprite list
    ENDIF

    XPATTERN 0              ; patterns back to address zero
    TEXT32                  ; mode TEXT 32*24
$$
$END