GophHub - zajo/appler/src/VIDEO.ASM


Raw File

    1	;  _____________________________________________
    2	; |                                             |
    3	; |  Project:   APPLER                          |
    4	; |  File:      VIDEO.ASM                       |
    5	; |  Compiler:  16-bit TASM (2.5)               |
    6	; |                                             |
    7	; |  Subject:   Screen Emulation                |
    8	; |                                             |
    9	; |  Author:    Alexander Patalenski            |
   10	; |_____________________________________________|
   11	
   12	;       This file is included in EMULATE.ASM
   13	
   14	;-------------- Video emulation entries ----------------------------------------
   15	
   16	                assume  CS:Emulate,DS:Apple,ES:Video,SS:Data
   17	
   18	                UseNextFreeSpace
   19	ResetVideo      Proc    far
   20	                ret
   21	ResetVideo      Endp
   22	                CheckAddress
   23	
   24	C05X            MACRO   Adr,Table,Mask
   25	                Local   l_r,l_w
   26	                UseNextFreeSpace
   27	Adr&r:          mov     al,C050
   28	                mov     ah,al
   29	IFE 0&Adr&h mod 2
   30	                and     al,Mask
   31	ELSE
   32	                or      al,Mask
   33	ENDIF
   34	                cmp     al,ah
   35	                je      l_r
   36	                mov     C050,al
   37	                cbw
   38	                mov     bx,ax
   39	                shl     bx,1
   40	                push    di
   41	                jmp     SS:Table[bx]
   42	l_r:            xor     bl,bl
   43	                jmp     di
   44	Adr&w:          mov     al,C050
   45	                mov     bh,al
   46	IFE 0&Adr&h mod 2
   47	                and     al,Mask
   48	ELSE
   49	                or      al,Mask
   50	ENDIF
   51	                cmp     al,bh
   52	                je      l_w
   53	                mov     C050,al
   54	                Save    ax
   55	                cbw
   56	                mov     bx,ax
   57	                shl     bx,1
   58	                call    SS:Table[bx]
   59	                Restore ax
   60	                sahf
   61	                DoNext
   62	l_w:            sahf
   63	                DoNext
   64	                CheckAddress
   65	                ENDM
   66	
   67	                C05X    C050,C050table,1110b
   68	                C05X    C051,C050table,0001b
   69	                C05X    C052,C052table,1101b
   70	                C05X    C053,C052table,0010b
   71	                C05X    C054,C054table,1011b
   72	                C05X    C055,C054table,0100b
   73	                C05X    C056,C056table,0111b
   74	                C05X    C057,C056table,1000b
   75	
   76	;-------------- Video emulation subroutines ------------------------------------
   77	
   78	SetTEXT         MACRO                           ;; Destroys DX
   79	                mov     ax,0001h
   80	                int     10h
   81	                mov     ax,0606h
   82	                mov     dx,3CEh
   83	                out     dx,ax
   84	                mov     cx,2000h
   85	                mov     ah,01h
   86	                int     10h
   87	                mov     bl,1
   88	                mov     ax,1003h
   89	                int     10h
   90	                mov     byte ptr SS:[TEXTchars+60h*2],0DBh
   91	                ENDM
   92	
   93	SetGR           MACRO                           ;; Destroys DX
   94	                mov     ax,0001h
   95	                int     10h
   96	                mov     ax,0606h
   97	                mov     dx,3CEh
   98	                out     dx,ax
   99	                mov     cx,2000h
  100	                mov     ah,01h
  101	                int     10h
  102	                mov     bl,0
  103	                mov     ax,1003h
  104	                int     10h
  105	                mov     byte ptr SS:[TEXTchars+60h*2],020h
  106	                ENDM
  107	
  108	SetPage         MACRO   VideoPage               ;; Destroys DX
  109	                mov     dx,Port3?4h
  110	                mov     ax,high(VideoPage)*100h+0Ch
  111	                out     dx,ax
  112	                jmp     short $+2
  113	                mov     ax,low(VideoPage)*100h+0Dh
  114	                out     dx,ax
  115			ENDM
  116	
  117	SetHGR          MACRO   Page
  118	                mov     ax,000Eh
  119	                int     10h
  120	                call    SetHGRpalette
  121			SetPage (Page-1)*4000h
  122			call    FillHGRpage
  123	                ENDM
  124	
  125	ShowTEXT        MACRO   Page                    ;; 1 or 2
  126	                Local   Lab1,Lab2,Lab3,Lab4
  127	                cld                             ;; Destroys DX, SI, DI
  128	                mov     si,Page*400h
  129	                xor     di,di
  130	                mov     cx,di
  131	                mov     dx,0800h+40
  132	
  133	Lab1:           mov     cl,dl
  134	Lab2:           lodsb
  135	                mov     bl,al
  136	                mov     bh,ch
  137	                shl     bx,1
  138	                mov     ax,SS:TEXTchars[bx]
  139	                stosw
  140	                loop    Lab2
  141	                add     di,-40*2 + 8*40*2
  142	                mov     cl,dl
  143	Lab3:           lodsb
  144	                mov     bl,al
  145	                mov     bh,ch
  146	                shl     bx,1
  147	                mov     ax,SS:TEXTchars[bx]
  148	                stosw
  149	                loop    Lab3
  150	                add     di,-40*2 + 8*40*2
  151	                mov     cl,dl
  152	Lab4:           lodsb
  153	                mov     bl,al
  154	                mov     bh,ch
  155	                shl     bx,1
  156	                mov     ax,SS:TEXTchars[bx]
  157	                stosw
  158	                loop    Lab4
  159	
  160	                add     si,8
  161	                add     di,-2*8*40*2
  162	                dec     dh
  163	                jnz     Lab1
  164			ENDM
  165	
  166	ShowGR          MACRO   Page                    ;; 1 or 2
  167	                Local   Lab1,Lab2,Lab3,Lab4
  168	                cld                             ;; Destroys DX, SI, DI
  169	                mov     si,Page*400h
  170	                xor     di,di
  171	                mov     bx,offset GRcolors
  172	                mov     dx,0800h + GRchar
  173	
  174	Lab1:           mov     cx,40
  175	Lab2:           lodsb
  176	                xlat    SS:[bx]
  177	                mov     ah,al
  178	                mov     al,dl
  179	                stosw
  180	                loop    Lab2
  181	                add     di,-40*2 + 8*40*2
  182	                mov     cx,40
  183	Lab3:           lodsb
  184	                xlat    SS:[bx]
  185	                mov     ah,al
  186	                mov     al,dl
  187	                stosw
  188	                loop    Lab3
  189	                add     di,-40*2 + 8*40*2
  190	                mov     cx,40
  191	Lab4:           lodsb
  192	                xlat    SS:[bx]
  193	                mov     ah,al
  194	                mov     al,dl
  195	                stosw
  196	                loop    Lab4
  197	
  198	                add     si,8
  199	                add     di,-2*8*40*2
  200	                dec     dh
  201	                jnz     Lab1
  202	                ENDM
  203	
  204	ShowHGR         MACRO
  205	                Save    bp                      ;; Destroys DX, SI, DI
  206	                mov     si,2000h
  207	                mov     bp,0
  208	                call    ShowHGRsub
  209	                mov     si,4000h
  210	                mov     bp,4000h
  211	                call    ShowHGRsub
  212	                Restore bp
  213			ENDM
  214	
  215	ShowGRmix       MACRO   Page                    ;; 1 or 2
  216	                Local   Lab0,Lab1,Lab2,Lab3,Lab4,Lab5
  217	                cld                             ;; Destroys DX, SI, DI
  218	                mov     si,Page*400h
  219	                xor     di,di
  220	                mov     dx,702h
  221	
  222	Lab0:           mov     bx,offset GRcolors
  223	Lab1:           mov     cx,40
  224	Lab2:           lodsb
  225	                xlat    SS:[bx]
  226	                mov     ah,al
  227	                mov     al,GRchar
  228	                stosw
  229	                loop    Lab2
  230	
  231	                add     di,-40*2 + 8*40*2
  232	                dec     dl
  233	                jz      Lab3
  234	                jns     Lab1
  235	
  236	                add     si,8
  237	                add     di,-3*8*40*2 + 40*2
  238	                sub     dx,01FFh-2
  239	                jns     Lab1
  240	                jmp     Lab5
  241	
  242	Lab3:           cmp     dh,3
  243	                ja      Lab1
  244	                mov     cx,40
  245	Lab4:           lodsb
  246	                mov     bl,al
  247	                mov     bh,ch
  248	                shl     bx,1
  249	                mov     ax,SS:TEXTchars[bx]
  250	                stosw
  251	                loop    Lab4
  252	
  253	                add     si,8
  254	                add     di,-2*8*40*2
  255	                sub     dx,100h-2
  256	                jns     Lab0
  257	Lab5:
  258			ENDM
  259	
  260	ShowHGRmix      MACRO
  261	                Save    bp
  262	                mov     si,2000h
  263	                mov     bp,0
  264	                call    ShowHgrMixSub
  265	                mov     si,4000h
  266	                mov     bp,4000h
  267	                call    ShowHgrMixSub
  268	                Restore bp
  269	                ENDM
  270	
  271	Show4TEXT       MACRO   Page                    ;; 1 or 2
  272	                Local   Lab1,Lab2,Lab3,Lab4
  273	                cld                             ;; Destroys DX, SI, DI
  274	                mov     bx,offset GRcolors
  275	                mov     dx,40
  276	                mov     di,20*40*2
  277	
  278	                mov     si,Page*400h+250h
  279	                mov     cx,dx
  280	Lab1:           lodsb
  281	                mov     bl,al
  282	                mov     bh,dh
  283	                shl     bx,1
  284	                mov     ax,SS:TEXTchars[bx]
  285	                stosw
  286	                loop    Lab1
  287	                mov     si,Page*400h+2D0h
  288	                mov     cx,dx
  289	Lab2:           lodsb
  290	                mov     bl,al
  291	                mov     bh,dh
  292	                shl     bx,1
  293	                mov     ax,SS:TEXTchars[bx]
  294	                stosw
  295	                loop    Lab2
  296	                mov     si,Page*400h+350h
  297	                mov     cx,dx
  298	Lab3:           lodsb
  299	                mov     bl,al
  300	                mov     bh,dh
  301	                shl     bx,1
  302	                mov     ax,SS:TEXTchars[bx]
  303	                stosw
  304	                loop    Lab3
  305	                mov     si,Page*400h+3D0h
  306	                mov     cx,dx
  307	Lab4:           lodsb
  308	                mov     bl,al
  309	                mov     bh,dh
  310	                shl     bx,1
  311	                mov     ax,SS:TEXTchars[bx]
  312	                stosw
  313	                loop    Lab4
  314			ENDM
  315	
  316	Show4GR         MACRO   Page                    ;; 1 or 2
  317	                Local   Lab1,Lab2,Lab3,Lab4
  318	                cld                             ;; Destroys DX, SI, DI
  319	                mov     bx,offset GRcolors
  320	                xor     cx,cx
  321	                mov     dx,40*100h + GRchar
  322	                mov     di,20*40*2
  323	
  324	                mov     si,Page*400h+250h
  325	                mov     cl,dh
  326	Lab1:           lodsb
  327	                xlat    SS:[bx]
  328	                mov     ah,al
  329	                mov     al,dl
  330	                stosw
  331	                loop    Lab1
  332	                mov     si,Page*400h+2D0h
  333	                mov     cl,dh
  334	Lab2:           lodsb
  335	                xlat    SS:[bx]
  336	                mov     ah,al
  337	                mov     al,dl
  338	                stosw
  339	                loop    Lab2
  340	                mov     si,Page*400h+350h
  341	                mov     cl,dh
  342	Lab3:           lodsb
  343	                xlat    SS:[bx]
  344	                mov     ah,al
  345	                mov     al,dl
  346	                stosw
  347	                loop    Lab3
  348	                mov     si,Page*400h+3D0h
  349	                mov     cl,dh
  350	Lab4:           lodsb
  351	                xlat    SS:[bx]
  352	                mov     ah,al
  353	                mov     al,dl
  354	                stosw
  355	                loop    Lab4
  356			ENDM
  357	
  358	Show4HGR        MACRO
  359	                Save    bp
  360	                mov     si,2000h
  361	                mov     bp,0
  362	                call    Show4HgrSub
  363	                mov     si,4000h
  364	                mov     bp,4000h
  365	                call    Show4HgrSub
  366	                Restore bp
  367	                ENDM
  368	
  369	Show4HgrText    MACRO
  370	                Save    bp
  371	                mov     si,400h
  372	                mov     bp,0
  373	                call    Show4HgrTextSub
  374	                mov     si,800h
  375	                mov     bp,4000h
  376	                call    Show4HgrTextSub
  377	                Restore bp
  378	                ENDM
  379	
  380	ShowGR12        MACRO   Page                    ;; 1 or 2
  381	                Local   Lab1,Lab2,Lab3,Lab4
  382	                cld                             ;; Destroys DX, SI, DI
  383	                mov     si,Page*400h
  384	                mov     di,1
  385	                mov     bx,offset GRcolors
  386	                xor     cx,cx
  387	                mov     dx,800h+40
  388	
  389	Lab1:           mov     cl,dl
  390	Lab2:           lodsb
  391	                xlat    SS:[bx]
  392	                stosb
  393	                inc     di
  394	                loop    Lab2
  395	                add     di,-40*2 + 8*40*2
  396	                mov     cl,dl
  397	Lab3:           lodsb
  398	                xlat    SS:[bx]
  399	                stosb
  400	                inc     di
  401	                loop    Lab3
  402	                add     di,-40*2 + 8*40*2
  403	                mov     cl,dl
  404	Lab4:           lodsb
  405	                xlat    SS:[bx]
  406	                stosb
  407	                inc     di
  408	                loop    Lab4
  409	
  410	                add     si,8
  411	                add     di,-2*8*40*2
  412	                dec     dh
  413	                jnz     Lab1
  414			ENDM
  415	
  416	ShowGRmix12     MACRO   Page                    ;; 1 or 2
  417	                Local   Lab0,Lab1,Lab2,Lab3,Lab4,Lab5
  418	                cld                             ;; Destroys DX, SI, DI
  419	                mov     si,Page*400h
  420	                xor     di,di
  421	                mov     dx,702h
  422	
  423	Lab0:           mov     bx,offset GRcolors
  424	Lab1:           mov     cx,40
  425	Lab2:           lodsb
  426	                xlat    SS:[bx]
  427	                inc     di
  428	                stosb
  429	                loop    Lab2
  430	
  431	                add     di,-40*2 + 8*40*2
  432	                dec     dl
  433	                jz      Lab3
  434	                jns     Lab1
  435	
  436	                add     si,8
  437	                add     di,-3*8*40*2 + 40*2
  438	                sub     dx,01FFh-2
  439	                jns     Lab1
  440	                jmp     Lab5
  441	
  442	Lab3:           cmp     dh,3
  443	                ja      Lab1
  444	                mov     cx,40
  445	Lab4:           lodsb
  446	                mov     bl,al
  447	                mov     bh,ch
  448	                shl     bx,1
  449	                mov     ax,SS:TEXTchars[bx]
  450	                stosw
  451	                loop    Lab4
  452	
  453	                add     si,8
  454	                add     di,-2*8*40*2
  455	                sub     dx,100h-2
  456	                jns     Lab0
  457	Lab5:
  458			ENDM
  459	
  460	
  461	;-------------------------------------------------------------------------------
  462	
  463	                UseNextFreeSpace
  464	C050_0:         Save    cx dx si
  465			SetTEXT
  466			ShowTEXT 1
  467	                mov     ax,TEXT_TextMode
  468	                mov     bx,ax
  469	                call    SetTextWMpage1
  470	                Restore cx dx si
  471	                mov     bl,0
  472	                ret
  473	                CheckAddress
  474	
  475	                UseNextFreeSpace
  476	C050_1:         Save    cx dx si
  477			SetTEXT
  478			ShowTEXT 2
  479	                mov     ax,TEXT_TextMode
  480	                mov     bx,ax
  481	                call    SetTextWMpage2
  482	                Restore cx dx si
  483	                mov     bl,0
  484	                ret
  485	                CheckAddress
  486	
  487	                UseNextFreeSpace
  488	C050_A:         Save    cx dx si
  489			SetTEXT
  490			ShowTEXT 1
  491	                mov     ax,HGR_NA
  492	                mov     bx,ax
  493	                call    SetHgrWMpage1
  494	                call    SetHgrWMpage2
  495	                mov     ax,TEXT_TextMode
  496	                mov     bx,ax
  497	                call    SetTextWMpage1
  498	                Restore cx dx si
  499	                mov     bl,0
  500	                ret
  501	                CheckAddress
  502	
  503	                UseNextFreeSpace
  504	C050_B:         Save    cx dx si
  505			SetTEXT
  506			ShowTEXT 2
  507	                mov     ax,HGR_NA
  508	                mov     bx,ax
  509	                call    SetHgrWMpage1
  510	                call    SetHgrWMpage2
  511	                mov     ax,TEXT_TextMode
  512	                mov     bx,ax
  513	                call    SetTextWMpage2
  514	                Restore cx dx si
  515	                mov     bl,0
  516	                ret
  517	                CheckAddress
  518	
  519	                UseNextFreeSpace
  520	C050_2:         Save    cx dx si
  521	                SetGR
  522			ShowGR  1
  523	                mov     ax,TEXT_GrMode
  524	                mov     bx,ax
  525	                call    SetTextWMpage1
  526	                Restore cx dx si
  527	                mov     bl,0
  528	                ret
  529	                CheckAddress
  530	
  531	                UseNextFreeSpace
  532	C050_3:         Save    cx dx si
  533			SetGR
  534			ShowGR  2
  535	                mov     ax,TEXT_GrMode
  536	                mov     bx,ax
  537	                call    SetTextWMpage2
  538	                Restore cx dx si
  539	                mov     bl,0
  540	                ret
  541	                CheckAddress
  542	
  543	                UseNextFreeSpace
  544	C050_4:         Save    cx dx si
  545	                SetGR
  546	                ShowGRmix 1
  547	                mov     ax,TEXT_GrMode
  548	                mov     bx,TEXT_MixedGrMode
  549	                call    SetTextWMpage1
  550	                Restore cx dx si
  551	                mov     bl,0
  552	                ret
  553	                CheckAddress
  554	
  555	                UseNextFreeSpace
  556	C050_5:         Save    cx dx si
  557			SetGR
  558	                ShowGRmix 2
  559	                mov     ax,TEXT_GrMode
  560	                mov     bx,TEXT_MixedGrMode
  561	                call    SetTextWMpage2
  562	                Restore cx dx si
  563	                mov     bl,0
  564	                ret
  565	                CheckAddress
  566	
  567	                UseNextFreeSpace
  568	C050_6:         Save    cx dx si
  569	                SetHGR  1
  570	                ShowHGR
  571	                mov     ax,TEXT_NA
  572	                mov     bx,ax
  573	                call    SetTextWMpage1
  574	                mov     ax,HGR_HgrMode
  575	                mov     bx,ax
  576	                call    SetHgrWMpage1
  577	                call    SetHgrWMpage2
  578	                Restore cx dx si
  579	                mov     bl,0
  580	                ret
  581	                CheckAddress
  582	
  583	                UseNextFreeSpace
  584	C050_7:         Save    cx dx si
  585			SetHGR  2
  586	                ShowHGR
  587	                mov     ax,TEXT_NA
  588	                mov     bx,ax
  589	                call    SetTextWMpage2
  590	                mov     ax,HGR_HgrMode
  591	                mov     bx,ax
  592	                call    SetHgrWMpage1
  593	                call    SetHgrWMpage2
  594	                Restore cx dx si
  595	                mov     bl,0
  596	                ret
  597	                CheckAddress
  598	
  599	                UseNextFreeSpace
  600	C050_8:         Save    cx dx si
  601			SetHGR  1
  602	                ShowHGRmix
  603	                mov     ax,TEXT_NA
  604	                mov     bx,TEXT_MixedHgrMode
  605	                call    SetTextWMpage1
  606	                call    Set4TextWMpage2
  607	                mov     ax,HGR_HgrMode
  608	                mov     bx,HGR_MixedMode
  609	                call    SetHgrWMpage1
  610	                call    SetHgrWMpage2
  611	                Restore cx dx si
  612	                mov     bl,0
  613	                ret
  614	                CheckAddress
  615	
  616	                UseNextFreeSpace
  617	C050_9:         Save    cx dx si
  618			SetHGR  2
  619	                ShowHGRmix
  620	                mov     ax,TEXT_NA
  621	                mov     bx,TEXT_MixedHgrMode
  622	                call    SetTextWMpage2
  623	                call    Set4TextWMpage1
  624	                mov     ax,HGR_HgrMode
  625	                mov     bx,HGR_MixedMode
  626	                call    SetHgrWMpage1
  627	                call    SetHgrWMpage2
  628	                Restore cx dx si
  629	
  630	C052_0:
  631	C052_1:         mov     bl,0
  632	                ret
  633	                CheckAddress
  634	
  635	                UseNextFreeSpace
  636	C052_2:         Save    cx dx si
  637	                Show4GR 1
  638	                mov     bx,TEXT_GrMode
  639	                call    Set4TextWMpage1
  640	                Restore cx dx si
  641	                mov     bl,0
  642	                ret
  643	                CheckAddress
  644	
  645	                UseNextFreeSpace
  646	C052_3:         Save    cx dx si
  647	                Show4GR 2
  648	                mov     bx,TEXT_GrMode
  649	                call    Set4TextWMpage2
  650	                Restore cx dx si
  651	                mov     bl,0
  652	                ret
  653	                CheckAddress
  654	
  655	                UseNextFreeSpace
  656	C052_4:         Save    cx dx si
  657	                Show4TEXT 1
  658	                mov     bx,TEXT_MixedGrMode
  659	                call    Set4TextWMpage1
  660	                Restore cx dx si
  661	                mov     bl,0
  662	                ret
  663	                CheckAddress
  664	
  665	                UseNextFreeSpace
  666	C052_5:         Save    cx dx si
  667	                Show4TEXT 2
  668	                mov     bx,TEXT_MixedGrMode
  669	                call    Set4TextWMpage2
  670	                Restore cx dx si
  671	                mov     bl,0
  672	                ret
  673	                CheckAddress
  674	
  675	                UseNextFreeSpace
  676	C052_6:         Save    cx dx si
  677	                Show4HGR
  678	                mov     bx,TEXT_NA
  679	                call    Set4TextWMpage1
  680	                call    Set4TextWMpage2
  681	                mov     bx,HGR_HgrMode
  682	                call    Set4HgrWMpage1
  683	                call    Set4HgrWMpage2
  684	                Restore cx dx si
  685	                mov     bl,0
  686	                ret
  687	                CheckAddress
  688	
  689	                UseNextFreeSpace
  690	C052_7:         Save    cx dx si
  691	                Show4HGR
  692	                mov     bx,TEXT_NA
  693	                call    Set4TextWMpage1
  694	                call    Set4TextWMpage2
  695	                mov     bx,HGR_HgrMode
  696	                call    Set4HgrWMpage1
  697	                call    Set4HgrWMpage2
  698	                Restore cx dx si
  699	                mov     bl,0
  700	                ret
  701	                CheckAddress
  702	
  703	                UseNextFreeSpace
  704	C052_8:         Save    cx dx si
  705	                Show4HgrText
  706	                mov     bx,HGR_MixedMode
  707	                call    Set4HgrWMpage1
  708	                call    Set4HgrWMpage2
  709	                mov     bx,TEXT_MixedHgrMode
  710	                call    Set4TextWMpage1
  711	                call    Set4TextWMpage2
  712	                Restore cx dx si
  713	                mov     bl,0
  714	                ret
  715	                CheckAddress
  716	
  717	                UseNextFreeSpace
  718	C052_9:         Save    cx dx si
  719	                Show4HgrText
  720	                mov     bx,HGR_MixedMode
  721	                call    Set4HgrWMpage1
  722	                call    Set4HgrWMpage2
  723	                mov     bx,TEXT_MixedHgrMode
  724	                call    Set4TextWMpage1
  725	                call    Set4TextWMpage2
  726	                Restore cx dx si
  727	                mov     bl,0
  728	                ret
  729	                CheckAddress
  730	
  731	
  732	                UseNextFreeSpace
  733	C054_0:         Save    cx dx si
  734			ShowTEXT 1
  735	                mov     ax,TEXT_NA
  736	                mov     bx,ax
  737	                call    SetTextWMpage2
  738	                mov     ax,TEXT_TextMode
  739	                mov     bx,ax
  740	                call    SetTextWMpage1
  741	                Restore cx dx si
  742	                mov     bl,0
  743	                ret
  744	                CheckAddress
  745	
  746	                UseNextFreeSpace
  747	C054_1:         Save    cx dx si
  748			ShowTEXT 2
  749	                mov     ax,TEXT_NA
  750	                mov     bx,ax
  751	                call    SetTextWMpage1
  752	                mov     ax,TEXT_TextMode
  753	                mov     bx,ax
  754	                call    SetTextWMpage2
  755	                Restore cx dx si
  756	                mov     bl,0
  757	                ret
  758	                CheckAddress
  759	
  760	                UseNextFreeSpace
  761	C054_2:         Save    cx dx si
  762	                ShowGR12 1
  763	                mov     ax,TEXT_NA
  764	                mov     bx,ax
  765	                call    SetTextWMpage2
  766	                mov     ax,TEXT_GrMode
  767	                mov     bx,ax
  768	                call    SetTextWMpage1
  769	                Restore cx dx si
  770	                mov     bl,0
  771	                ret
  772	                CheckAddress
  773	
  774	                UseNextFreeSpace
  775	C054_3:         Save    cx dx si
  776	                ShowGR12 2
  777	                mov     ax,TEXT_NA
  778	                mov     bx,ax
  779	                call    SetTextWMpage1
  780	                mov     ax,TEXT_GrMode
  781	                mov     bx,ax
  782	                call    SetTextWMpage2
  783	                Restore cx dx si
  784	                mov     bl,0
  785	                ret
  786	                CheckAddress
  787	
  788	                UseNextFreeSpace
  789	C054_4:         Save    cx dx si
  790	                ShowGRmix12 1
  791	                mov     ax,TEXT_NA
  792	                mov     bx,ax
  793	                call    SetTextWMpage2
  794	                mov     ax,TEXT_GrMode
  795	                mov     bx,TEXT_MixedGrMode
  796	                call    SetTextWMpage1
  797	                Restore cx dx si
  798	                mov     bl,0
  799	                ret
  800	                CheckAddress
  801	
  802	                UseNextFreeSpace
  803	C054_5:         Save    cx dx si
  804	                ShowGRmix12 2
  805	                mov     ax,TEXT_NA
  806	                mov     bx,ax
  807	                call    SetTextWMpage1
  808	                mov     ax,TEXT_GrMode
  809	                mov     bx,TEXT_MixedGrMode
  810	                call    SetTextWMpage2
  811	                Restore cx dx si
  812	                mov     bl,0
  813	                ret
  814	                CheckAddress
  815	
  816	                UseNextFreeSpace
  817	C054_6:         Save    cx dx si
  818			SetPage 0
  819	                Restore cx dx si
  820	                mov     bl,0
  821	                ret
  822	                CheckAddress
  823	
  824	                UseNextFreeSpace
  825	C054_7:         Save    cx dx si
  826			SetPage 4000h
  827	                Restore cx dx si
  828	                mov     bl,0
  829	                ret
  830	                CheckAddress
  831	
  832	                UseNextFreeSpace
  833	C054_8:         Save    cx dx si
  834	                SetPage 0
  835	                Restore cx dx si
  836	                mov     bl,0
  837	                ret
  838	                CheckAddress
  839	
  840	                UseNextFreeSpace
  841	C054_9:         Save    cx dx si
  842	                SetPage 4000h
  843	                Restore cx dx si
  844	
  845	C056_0:
  846	C056_1:         mov     bl,0
  847	                ret
  848	                CheckAddress
  849	
  850	                UseNextFreeSpace
  851	C056_2:         Save    cx dx si
  852			SetGR
  853			ShowGR  1
  854	                mov     ax,HGR_NA
  855	                mov     bx,ax
  856	                call    SetHgrWMpage1
  857	                call    SetHgrWMpage2
  858	                mov     ax,TEXT_GrMode
  859	                mov     bx,ax
  860	                call    SetTextWMpage1
  861	                Restore cx dx si
  862	                mov     bl,0
  863	                ret
  864	                CheckAddress
  865	
  866	                UseNextFreeSpace
  867	C056_3:         Save    cx dx si
  868			SetGR
  869			ShowGR  2
  870	                mov     ax,HGR_NA
  871	                mov     bx,ax
  872	                call    SetHgrWMpage1
  873	                call    SetHgrWMpage2
  874	                mov     ax,TEXT_GrMode
  875	                mov     bx,ax
  876	                call    SetTextWMpage2
  877	                Restore cx dx si
  878	                mov     bl,0
  879	                ret
  880	                CheckAddress
  881	
  882	                UseNextFreeSpace
  883	C056_4:         Save    cx dx si
  884			SetGR
  885	                ShowGRmix 1
  886	                mov     ax,HGR_NA
  887	                mov     bx,ax
  888	                call    SetHgrWMpage1
  889	                call    SetHgrWMpage2
  890	                mov     ax,TEXT_GrMode
  891	                mov     bx,TEXT_MixedGrMode
  892	                call    SetTextWMpage1
  893	                Restore cx dx si
  894	                mov     bl,0
  895	                ret
  896	                CheckAddress
  897	
  898	                UseNextFreeSpace
  899	C056_5:         Save    cx dx si
  900			SetGR
  901	                ShowGRmix 2
  902	                mov     ax,HGR_NA
  903	                mov     bx,ax
  904	                call    SetHgrWMpage1
  905	                call    SetHgrWMpage2
  906	                mov     ax,TEXT_GrMode
  907	                mov     bx,TEXT_MixedGrMode
  908	                call    SetTextWMpage2
  909	                Restore cx dx si
  910	                mov     bl,0
  911	                ret
  912	                CheckAddress
  913	
  914	                UseNextFreeSpace
  915	C056_6:         Save    cx dx si
  916			SetHGR  1
  917	                ShowHGR
  918	                mov     ax,TEXT_NA
  919	                mov     bx,ax
  920	                call    SetTextWMpage1
  921	                mov     ax,HGR_HgrMode
  922	                mov     bx,ax
  923	                call    SetHgrWMpage1
  924	                call    SetHgrWMpage2
  925	                Restore cx dx si
  926	                mov     bl,0
  927	                ret
  928	                CheckAddress
  929	
  930	                UseNextFreeSpace
  931	C056_7:         Save    cx dx si
  932			SetHGR  2
  933	                ShowHGR
  934	                mov     ax,TEXT_NA
  935	                mov     bx,ax
  936	                call    SetTextWMpage2
  937	                mov     ax,HGR_HgrMode
  938	                mov     bx,ax
  939	                call    SetHgrWMpage1
  940	                call    SetHgrWMpage2
  941	                Restore cx dx si
  942	                mov     bl,0
  943	                ret
  944	                CheckAddress
  945	
  946	                UseNextFreeSpace
  947	C056_8:         Save    cx dx si
  948			SetHGR  1
  949	                ShowHGRmix
  950	                mov     ax,TEXT_NA
  951	                mov     bx,TEXT_MixedHgrMode
  952	                call    SetTextWMpage1
  953	                call    Set4TextWMpage2
  954	                mov     ax,HGR_HgrMode
  955	                mov     bx,HGR_MixedMode
  956	                call    SetHgrWMpage1
  957	                call    SetHgrWMpage2
  958	                Restore cx dx si
  959	                mov     bl,0
  960	                ret
  961	                CheckAddress
  962	
  963	                UseNextFreeSpace
  964	C056_9:         Save    cx dx si
  965			SetHGR  2
  966	                ShowHGRmix
  967	                mov     ax,TEXT_NA
  968	                mov     bx,TEXT_MixedHgrMode
  969	                call    SetTextWMpage2
  970	                call    Set4TextWMpage1
  971	                mov     ax,HGR_HgrMode
  972	                mov     bx,HGR_MixedMode
  973	                call    SetHgrWMpage1
  974	                call    SetHgrWMpage2
  975	                Restore cx dx si
  976	                mov     bl,0
  977	                ret
  978	                CheckAddress
  979	
  980	;-------------------------------------------------------------------------------
  981	
  982	                UseNextFreeSpace
  983	MixedHgrMode1:  pushf
  984	                cli
  985	                shl     di,1
  986	                mov     ax,di
  987	                cmp     al,2*40*2
  988	                jb      MixedHgrMode10
  989	                mov     di,SS:HgrTextAdr[di-(1*400h+200h)*2]
  990	                xchg    bl,bh
  991	                shl     bx,1
  992	Temp            =       0
  993	                REPT    8
  994	                mov     ax,SS:HGRchars[bx][Temp*100h*2]
  995	                mov     ES:[di][Temp*40*2],ax
  996	Temp            =       Temp+1
  997	                ENDM
  998	                mov     bl,0
  999	MixedHgrMode10: popf
 1000	                DoNext
 1001	                CheckAddress
 1002	
 1003	                UseNextFreeSpace
 1004	MixedHgrMode2:  pushf
 1005	                cli
 1006	                shl     di,1
 1007	                mov     ax,di
 1008	                cmp     al,2*40*2
 1009	                jb      MixedHgrMode20
 1010	                mov     di,SS:HgrTextAdr[di-(2*400h+200h)*2]
 1011	                xchg    bl,bh
 1012	                shl     bx,1
 1013	Temp            =       0
 1014	                REPT    8
 1015	                mov     ax,SS:HGRchars[bx][Temp*100h*2]
 1016	                mov     ES:[di+4000h][Temp*40*2],ax
 1017	Temp            =       Temp+1
 1018	                ENDM
 1019	                mov     bl,0
 1020	MixedHgrMode20: popf
 1021	                DoNext
 1022	                CheckAddress
 1023	
 1024	                UseNextFreeSpace
 1025	SetHGRpalette   Proc    near
 1026	                Save    es
 1027	                mov     bx,0
 1028	                mov     cx,40h
 1029	                mov     dx,seg DACtable
 1030	                mov     es,dx
 1031	                mov     dx,offset DACtable
 1032	                mov     ax,1012h
 1033	                int     10h
 1034	                push    cs
 1035			pop     es
 1036			mov     dx,offset HGRpalettes
 1037	                mov     ax,1002h
 1038	                int     10h
 1039	                Restore es
 1040	                ret
 1041	
 1042	HGRpalettes     db      2 dup(0,101100b,0,001011b,0,100011b,0,010110b),0
 1043	SetHGRpalette   Endp
 1044	
 1045	
 1046	FillHGRpage     Proc    near
 1047			mov     di,0
 1048	                mov     dx,3C4h
 1049	                mov     ax,0402h                ; write to plane 2
 1050	                out     dx,ax
 1051			mov     byte ptr ES:[di], 00110011b
 1052	                mov     ax,0202h                ; write to plane 1
 1053	                out     dx,ax
 1054	                mov     byte ptr ES:[di], 01010101b
 1055	                mov     ax,0F02h                ; write to all planes
 1056	                out     dx,ax
 1057	                mov     dx,3CEh
 1058			mov     ax,0105h                ; write mode 1
 1059	                out     dx,ax
 1060	                mov     al,ES:[di]
 1061	                inc     di
 1062			cld
 1063			stosb
 1064	                mov     cx,8000h/2-1
 1065		rep     stosw
 1066	                mov     ax,0005h                ; write mode 0
 1067	                out     dx,ax
 1068	                mov     ax,0004h                ; read from plane 0
 1069			out     dx,ax
 1070	                mov     dx,3C4h
 1071	                mov     ax,0102h                ; write to plane 0
 1072	                out     dx,ax
 1073			ret
 1074	FillHGRpage     Endp
 1075	                CheckAddress
 1076	
 1077	
 1078	                UseNextFreeSpace
 1079	SetTextWMpage1  Proc    near
 1080	                mov     CS:TEXT_ModefyAdr[000h],ax
 1081	                mov     CS:TEXT_ModefyAdr[100h],ax
 1082	Set4TextWMpage1 label   near
 1083	                mov     CS:TEXT_ModefyAdr[200h],bx
 1084	                mov     CS:TEXT_ModefyAdr[300h],bx
 1085	                ret
 1086	SetTextWMpage1  Endp
 1087	
 1088	SetTextWMpage2  Proc    near
 1089	                mov     CS:TEXT_ModefyAdr[400h],ax
 1090	                mov     CS:TEXT_ModefyAdr[500h],ax
 1091	Set4TextWMpage2 label   near
 1092	                mov     CS:TEXT_ModefyAdr[600h],bx
 1093	                mov     CS:TEXT_ModefyAdr[700h],bx
 1094	                ret
 1095	SetTextWMpage2  Endp
 1096	                CheckAddress
 1097	
 1098	                UseNextFreeSpace
 1099	SetHgrWMpage1   Proc    near
 1100	Temp            =       0
 1101	        REPT    20h/4
 1102	                mov     CS:HGR_ModefyAdr[Temp],ax
 1103	                mov     CS:HGR_ModefyAdr[Temp+100h],ax
 1104	Temp            =       Temp+400h
 1105	        ENDM
 1106	Set4HgrWMpage1  label   near
 1107	Temp            =       200h
 1108	        REPT    20h/4
 1109	                mov     CS:HGR_ModefyAdr[Temp],bx
 1110	                mov     CS:HGR_ModefyAdr[Temp+100h],bx
 1111	Temp            =       Temp+400h
 1112	        ENDM
 1113	                ret
 1114	SetHgrWMpage1   Endp
 1115	                CheckAddress
 1116	
 1117	                UseNextFreeSpace
 1118	SetHgrWMpage2   Proc    near
 1119	Temp            =       2000h
 1120	        REPT    20h/4
 1121	                mov     CS:HGR_ModefyAdr[Temp],ax
 1122	                mov     CS:HGR_ModefyAdr[Temp+100h],ax
 1123	Temp            =       Temp+400h
 1124	        ENDM
 1125	Set4HgrWMpage2  label   near
 1126	Temp            =       2200h
 1127	        REPT    20h/4
 1128	                mov     CS:HGR_ModefyAdr[Temp],bx
 1129	                mov     CS:HGR_ModefyAdr[Temp+100h],bx
 1130	Temp            =       Temp+400h
 1131	        ENDM
 1132	                ret
 1133	SetHgrWMpage2   Endp
 1134	                CheckAddress
 1135	
 1136	;-------------------------------------------------------------------------------
 1137	
 1138	Peripher        segment public
 1139	                assume  CS:Peripher,DS:Nothing,ES:Nothing
 1140	
 1141	ShowHGRsub      Proc    far                     ; SI - 2000h or 4000h
 1142	                cld                             ; BP - 0 or 4000h
 1143	                mov     di,[HGRadr]
 1144	
 1145	ShowHGRsub1:    add     di,bp
 1146	                mov     dx,0200h+9
 1147	
 1148	ShowHGRsub2:    mov     al,0
 1149	
 1150	ShowHGRsub3:    mov     bh,0
 1151	                mov     bl,[si]
 1152	                inc     si
 1153			shl     bx,1
 1154	                mov     cx,HGRcolors[bx]
 1155			and     al,byte ptr HGRmasks[bx]+1
 1156	                or      al,ch
 1157	                stosb
 1158	
 1159			mov     bh,1
 1160	                mov     bl,[si]
 1161	                inc     si
 1162			shl     bx,1
 1163	                mov     ax,HGRcolors[bx]
 1164	                mov     ch,byte ptr HGRmasks[bx]+1
 1165	                and     cl,ch
 1166	                and     ch,ah
 1167	                xor     ah,ch
 1168	                or      ah,cl
 1169			xchg    al,ah
 1170	                stosw
 1171	
 1172			mov     bh,2
 1173	                mov     bl,[si]
 1174	                inc     si
 1175			shl     bx,1
 1176	                mov     ax,HGRcolors[bx]
 1177	                mov     cl,byte ptr HGRmasks[bx]+1
 1178	                and     ch,cl
 1179	                and     cl,ah
 1180	                xor     ah,cl
 1181	                or      ah,ch
 1182			xchg    al,ah
 1183	                stosw
 1184	
 1185			mov     bh,3
 1186	                mov     bl,[si]
 1187	                inc     si
 1188			shl     bx,1
 1189	                mov     ax,HGRcolors[bx]
 1190	                mov     ch,byte ptr HGRmasks[bx]+1
 1191	                and     cl,ch
 1192	                and     ch,ah
 1193	                xor     ah,ch
 1194	                or      ah,cl
 1195			xchg    al,ah
 1196	                stosw
 1197			mov     al,ch
 1198	
 1199	                dec     dl
 1200	                jns     ShowHGRsub3
 1201	
 1202	                add     di,-35*2 + 8*8*40*2
 1203	                sub     dx,01FFh-9
 1204	                jns     ShowHGRsub2
 1205	
 1206	                add     si,8
 1207	                mov     di,si
 1208	                and     di,1FFFh
 1209	                jz      ShowHGRsub4
 1210	                shl     di,1
 1211	                mov     di,HGRadr[di]
 1212			jmp     ShowHGRsub1
 1213	ShowHGRsub4:    ret
 1214	ShowHGRsub      Endp
 1215	
 1216	
 1217	ShowHgrMixSub   Proc    far                     ; SI - 2000h or 4000h
 1218	                Save    si bp                   ; BP - 0 or 4000h
 1219	                cld
 1220	                mov     di,[HGRadr]
 1221	
 1222	ShowHgrMixSub1: add     di,bp
 1223	                mov     dx,0200h+9
 1224	
 1225	ShowHgrMixSub2: mov     al,0
 1226	
 1227	ShowHgrMixSub3: mov     bh,0
 1228	                mov     bl,[si]
 1229	                inc     si
 1230	                shl     bx,1
 1231	                mov     cx,HGRcolors[bx]
 1232	                and     al,byte ptr HGRmasks[bx]+1
 1233	                or      al,ch
 1234	                stosb
 1235	
 1236	                mov     bh,1
 1237	                mov     bl,[si]
 1238	                inc     si
 1239	                shl     bx,1
 1240	                mov     ax,HGRcolors[bx]
 1241	                mov     ch,byte ptr HGRmasks[bx]+1
 1242	                and     cl,ch
 1243	                and     ch,ah
 1244	                xor     ah,ch
 1245	                or      ah,cl
 1246	                xchg    al,ah
 1247	                stosw
 1248	
 1249	                mov     bh,2
 1250	                mov     bl,[si]
 1251	                inc     si
 1252	                shl     bx,1
 1253	                mov     ax,HGRcolors[bx]
 1254	                mov     cl,byte ptr HGRmasks[bx]+1
 1255	                and     ch,cl
 1256	                and     cl,ah
 1257	                xor     ah,cl
 1258	                or      ah,ch
 1259	                xchg    al,ah
 1260	                stosw
 1261	
 1262	                mov     bh,3
 1263	                mov     bl,[si]
 1264	                inc     si
 1265	                shl     bx,1
 1266	                mov     ax,HGRcolors[bx]
 1267	                mov     ch,byte ptr HGRmasks[bx]+1
 1268	                and     cl,ch
 1269	                and     ch,ah
 1270	                xor     ah,ch
 1271	                or      ah,cl
 1272	                xchg    al,ah
 1273	                stosw
 1274	                mov     al,ch
 1275	
 1276	                dec     dl
 1277	                jns     ShowHgrMixSub3
 1278	
 1279	                add     di,-35*2 + 8*8*40*2
 1280	                sub     dx,01FFh-9
 1281	                js      ShowHgrMixSub5
 1282	                mov     ax,di
 1283	                sub     ax,bp
 1284	                cmp     ax,20*8*40*2
 1285	                jae     ShowHgrMixSub6
 1286	                jmp     ShowHgrMixSub2
 1287	
 1288	ShowHgrMixSub6: add     si,40
 1289	ShowHgrMixSub5: add     si,8
 1290	                mov     di,si
 1291	                and     di,1FFFh
 1292	                jz      ShowHgrMixSub4
 1293	                shl     di,1
 1294	                mov     di,HGRadr[di]
 1295	                jmp     ShowHgrMixSub1
 1296	ShowHgrMixSub4: Restore si bp
 1297	                shr     si,3
 1298	
 1299	Show4HgrTextSub label   far                     ; SI - 400h or 800h
 1300	                add     si,250h                 ; BP - 0 or 4000h
 1301	                lea     di,[bp+20*8*40*2]
 1302	                mov     dl,4
 1303	S4HT1:          mov     cx,40
 1304	S4HT2:          lodsb
 1305	                xor     ah,ah
 1306	                shl     ax,1
 1307	                mov     bx,ax
 1308	Temp            =       0
 1309	                REPT    8
 1310	                mov     ax,HGRchars[bx][Temp*100h*2]
 1311	                mov     ES:[di][Temp*40*2],ax
 1312	Temp            =       Temp+1
 1313	                ENDM
 1314	                add     di,2
 1315	                loop    S4HT2
 1316	                add     si,-40+80h
 1317	                add     di,-40*2+8*40*2
 1318	                dec     dl
 1319	                jnz     S4HT1
 1320	                ret
 1321	ShowHgrMixSub   Endp
 1322	
 1323	
 1324	Show4HgrSub     Proc    far                     ; SI - 2000h or 4000h
 1325	                add     si,250h                 ; BP - 0 or 4000h
 1326	                mov     di,HGRadr[250h*2]
 1327	                lea     di,[di+bp-(40*2-35*2)]
 1328	
 1329	Show4HgrSub1:   mov     dx,0700h+9
 1330	Show4HgrSub2:   mov     cx,40*2-35*2
 1331	                mov     al,0
 1332	        rep     stosb
 1333	                mov     bx,di
 1334	                sub     bx,bp
 1335	                cmp     bx,24*8*40*2
 1336	                jae     Show4HgrSub4
 1337	
 1338	Show4HgrSub3:   mov     bh,0
 1339	                mov     bl,[si]
 1340	                inc     si
 1341	                shl     bx,1
 1342	                mov     cx,HGRcolors[bx]
 1343	                and     al,byte ptr HGRmasks[bx]+1
 1344	                or      al,ch
 1345	                stosb
 1346	
 1347	                mov     bh,1
 1348	                mov     bl,[si]
 1349	                inc     si
 1350	                shl     bx,1
 1351	                mov     ax,HGRcolors[bx]
 1352	                mov     ch,byte ptr HGRmasks[bx]+1
 1353	                and     cl,ch
 1354	                and     ch,ah
 1355	                xor     ah,ch
 1356	                or      ah,cl
 1357	                xchg    al,ah
 1358	                stosw
 1359	
 1360	                mov     bh,2
 1361	                mov     bl,[si]
 1362	                inc     si
 1363	                shl     bx,1
 1364	                mov     ax,HGRcolors[bx]
 1365	                mov     cl,byte ptr HGRmasks[bx]+1
 1366	                and     ch,cl
 1367	                and     cl,ah
 1368	                xor     ah,cl
 1369	                or      ah,ch
 1370	                xchg    al,ah
 1371	                stosw
 1372	
 1373	                mov     bh,3
 1374	                mov     bl,[si]
 1375	                inc     si
 1376	                shl     bx,1
 1377	                mov     ax,HGRcolors[bx]
 1378	                mov     ch,byte ptr HGRmasks[bx]+1
 1379	                and     cl,ch
 1380	                and     ch,ah
 1381	                xor     ah,ch
 1382	                or      ah,cl
 1383	                xchg    al,ah
 1384	                stosw
 1385	                mov     al,ch
 1386	
 1387	                dec     dl
 1388	                jns     Show4HgrSub3
 1389	
 1390	                add     si,-40+400h
 1391	                sub     dx,01FFh-9
 1392	                js      Show4HgrSub5
 1393	                jmp     Show4HgrSub2
 1394	Show4HgrSub4:   ret
 1395	Show4HgrSub5:   add     si,-8*400h+80h
 1396	                jmp     Show4HgrSub1
 1397	Show4HgrSub     Endp
 1398	
 1399	Peripher        ends
 1400	
 1401	Data            segment stack 'stack'
 1402	
 1403	; 0/1 - TEXT Mode Page 1/2 (from  GR Mode)
 1404	; A/B - TEXT Mode Page 1/2 (from HGR Mode)
 1405	; 2/3 -   GR Mode Page 1/2
 1406	; 4/5 -   GR Mode Page 1/2, Mixed
 1407	; 6/7 -  HGR Mode Page 1/2
 1408	; 8/9 -  HGR Mode Page 1/2, Mixed
 1409			even
 1410	C050table       dw      C050_2,C050_0,C050_4,C050_0,C050_3,C050_1,C050_5,C050_1
 1411	                dw      C050_6,C050_A,C050_8,C050_A,C050_7,C050_B,C050_9,C050_B
 1412	C052table       dw      C052_2,C052_0,C052_4,C052_0,C052_3,C052_1,C052_5,C052_1
 1413	                dw      C052_6,C052_0,C052_8,C052_0,C052_7,C052_1,C052_9,C052_1
 1414	C054table       dw      C054_2,C054_0,C054_4,C054_0,C054_3,C054_1,C054_5,C054_1
 1415	                dw      C054_6,C054_0,C054_8,C054_0,C054_7,C054_1,C054_9,C054_1
 1416	C056table       dw      C056_2,C056_0,C056_4,C056_0,C056_3,C056_1,C056_5,C056_1
 1417	                dw      C056_6,C056_0,C056_8,C056_0,C056_7,C056_1,C056_9,C056_1
 1418	Data            ends
 1419	

Generated by GNU Enscript 1.6.6, and GophHub 1.3.