# Disassembly of Multiface 2 screen file

This is a documented disassembly of the screen file produced by the Multiface 2.

It is advisable that you understand the CRTC and the Gate Array so that you can fully understand the comments in this dissassembly.

    Load address: &4000
    Length:       &408C
    Execution:    &8000

    ;; *** START OF FILE ***
    ;;****************************************************************************
    4000  defs 16384          ;screen data (uncompressed)

    ;; ** EXECUTE HERE **

    8000  DI                  ;disable interrupts

    ;;****************************************************************************
    ;; ** COPY SCREEN DATA TO VISIBLE SCREEN **

    8001  LD    HL,&4000      ;address of screen data
    8004  LD    DE,&C000      ;screen address
    8007  PUSH  HL
    8008  POP   BC            ;BC=&4000=Length of data
    8009  LDIR                ;** copy screen data to screen **

    ;;****************************************************************************
    ;; ** INITIALISE COLOUR PALLETTE **

    800B  LD    HL,&8067      ;location of colour pallette in multiface screen file
    800E  PUSH  HL
    800F  LD    BC,17         ;16 colours + border colour
    8012  PUSH  BC
    8013  LD    DE,(&8089)    ;DE = address where firmware keeps colour palette in
                              ; hardware colour format
                              ;colours stored in this order: border, colour 0,colour 2......colour 15

                              ;CPC464  = &B1D9 (first set), &B1EA (second set)
                              ;CPC664  = ?????
                              ;CPC6128 = &B7D4 (first set), &B7E5 (second set)
    			  ;464PLUS = &B7D4 (first set), &B7E5 (second set)
    			  ;6128PLUS= &B7D4 (first set), &B7E5 (second set)

    8017  LDIR                ;copy for first set of colours

                              ;DE = address where firmware keeps colour palette in
                              ;     hardware colours + 17

    8019  POP   BC            ;BC = 17
    801A  POP   HL            ;HL = &8067
    801B  LDIR                ;copy to second set of colours

    ;;****************************************************************************
    ;; ** SET CRTC DATA
                              ;HL = &8067 + 17 = &8078 = address of CRTC data

    801D  EX    DE,HL         ;DE = address of CRTC data
    801E  CALL  &8034         ;setup CRTC registers

    ;;****************************************************************************
    ;; ** SET SCREEN MODE

    8021  LD    B,&7F         ;Gate Array
                              ;DE = address of CRTC data + 16 = &8088
    8023  EX    DE,HL
    8024  LD    C,(HL)        ;get rom selection and mode data for Gate Array
    8025  OUT   (C),C

    8027  LD    A,C
    8028  AND   %00000011     ;keep mode information

    802A  EXX                 ;B' = &7F
                              ;C' = &89
    802B  RES   0,C           ;clear mode information in C'
    802D  RES   1,C
                              ;C' = C' AND %11111100
    802F  OR    C
    8030  LD    C,A           ;combine mode and keep rom selection
    8031  EXX

    8032  EI                  ;interrupts back mr.CPU
    8033  RET                 ;and back to basic

                              ;NOTE: On return to basic:
                              ;     - the operating system will set the colours at the next VSYNC
                              ;     - the operating system will set the mode

    ;;******************************************************************************
    ;; ** CALL HERE TO SETUP CRTC **

    8034  LD    HL,&BCBD       ;H = &BC (CRTC Register select)
                               ;L = &BD (CRTC Register data)
    8037  LD    B,16           ;no of CRTC registers
    8039  JR    &803E          ;..routine to send data to CRTC

    ;;******************************************************************************
    ;; ** CALL HERE TO SETUP COLOURS **
    ;; ** THIS IS NOT USED BY THIS CODE BUT IS PRESENT IN THE FILE **

    803B  LD    HL,&7F7F       ;H= &7F (Gate Array)
                               ;L= &7F (Gate Array)

    ;;******************************************************************************
    ;; ** THIS ROUTINE CAN BE USED TO INITIALISE THE CRTC AND GATE ARRAY **
    ;;
    ;; HL = &BCBD (for CRTC)/&7F7F (for Gate Array)
    ;; DE = address of CRTC register data/address of Gate Array colour information
    ;; B  = number of registers/number of pens

    803E  LD    C,&00         ;first pen/first CRTC register

    8040  PUSH  BC
    8041  LD    B,H           ;B=&BC/&7F = CRTC register select/Gate Array pen select
    8042  OUT   (C),C         ;send pen number to Gate Array/CRTC register select

    8044  LD    A,(DE)        ;get Gate Array pen colour/get CRTC register data
    8045  INC   DE
    8046  LD    B,L           ;B=&BD/&7F = CRTC register data/Gate Array

    8047  RL    B             ;transfer bit 7 of port address into carry
    8049  LD    B,L           ;B=port address
    804A  JR    C,&8050       ;if B=&7F then carry=0
                              ;if B=&BC then carry=1

    804C  AND   &1F           ;make sure colour is in hardware colour range
                              ;(0..31)
    804E  OR    &40           ;%01000000+colour
    8050  OUT   (C),A         ;send register data to CRTC/send colour to Gate Array

    8052  POP   BC
    8053  INC   C             ;C = CRTC register count/pen count
    8054  DJNZ  &8040         ;..next register/next pen please....
    8056  RET                 ;...all done, so exit.

    ;;****************************************************************************
    ;; ** CRTC register data **
    ;; - register data for a standard size screen (25 tall,40 wide)
    ;; - THIS IS NOT USED BY THE CODE BUT IS PRESENT IN THE FILE

    8057  defs 16

    ;;****************************************************************************
    ;; ** Gate Array colour information
    ;; - colour information for screen that was saved

    8067  defs 17

    ;;****************************************************************************
    ;; ** CRTC register data **
    ;; - register data for size of the screen that was saved

    8078  defs 16

    ;;****************************************************************************
    ;; ** Gate Array mode and rom selection **
    ;; - mode for screen that was saved

    8088  defb &89

    ;;****************************************************************************
    ;; ** Memory address used by basic to store palette **
    ;; - this is dependant on the machine that the screen was saved on....
    ;;   this value will be different for a CPC464 and a CPC664

    8089  defw &B7D4          ;address where firmware keeps the colour pallette
                              ;in hardware colour form

    808C  defw 0000           ;not used

    ;; *** END OF FILE ***