terug.gif
(***************************************************************************)
(*                                                                         *)
(* Acorn Atom Emulator v1.32 (c) by Wouter Ras, Delft, Oct 1997 - May 1998 *)
(* ----------------------------------------------------------------------- *)
(*                                                                         *)
(* This source code may be distributed freely within the following         *)
(* restrictions                                                            *)
(* 1. You may not charge for this program or for any part of it.           *)
(* 2. This copyright message may not be removed from it.                   *)
(* 3. You may use sections of code from this program in your applications, *)
(*    but you must acknowledge its use. I'd appreciate it if you'd let me  *)
(*    know, i.e. send me a copy of your work.                              *)
(*                                                                         *)
(* Please report any problems, questions, comments to me at this address:  *)
(* avio@casema.net                                                         *)
(*                                                                         *)
(* The latest version of the emulator can be downloaded from my Atom-page: *)
(* http://www.casema.net/~avio/atom.htm                                    *)
(*                                                                         *)
(***************************************************************************)
{$g+,f-,i-,r-,s-,m 16384,273500,273500}
PROGRAM ACORN_ATOM;
USES DOS,ATOMROM,FDC8271,LEENDERT;
CONST FOUTBUFSIZE  = $1000;
      MAXAANTFILES = 400;
TYPE STR2 = STRING[2];
     STR4 = STRING[4];
     STR8 = STRING[8];
     FILELISTTYPE  = ARRAY[0..PRED(MAXAANTFILES)] OF STR8;
     ATMFILEREC    = RECORD
                       ATMNAME   : ARRAY[$00..$0F] OF CHAR;
                       STARTADRS : WORD;
                       EXECADRS  : WORD;
                       DATASIZE  : WORD;
                     END;
     ATMFILETYPE   = ARRAY[0..PRED(MAXAANTFILES)] OF ATMFILEREC;
     FINBUFTYPE    = ARRAY[$0000..$FFF8] OF BYTE;
     FOUTBUFTYPE   = ARRAY[$0000..PRED(FOUTBUFSIZE)] OF BYTE;
     TEMPMOUSETYPE = RECORD
                       B_BFE0    : BYTE;
                       B_BFE1    : BYTE;
                       B_MOUSENR : BYTE;
                       MOUSEX    : WORD;
                       MOUSEY    : WORD;
                     END;
CONST NMI_VECTOR    = $FFFA;
      RES_VECTOR    = $FFFC; {reset}
      IRQ_VECTOR    = $FFFE;
      BRK_VECTOR    = $FFFE;
      STACKBASE     = $0100;
      CYCLESFLYBACK = +2040; {number of cycles during flyback}
      COUNTER       = $BFF4; {WORD: counter for checking F9, F12 etc.}
      IRQ_NMI       = $BFF6; {BYTE: NMI or IRQ request, see also FDC8271}
      INSTRCYCLES   = $BFF7; {BYTE: number of cycles for an instruction}
      PCCYCLES      = $BFF8; {WORD: number of cycles that the PC needs to execute an instruction}
      AANTCYCLES    = $BFFA; {WORD: keep track of the cycles}
      WACHTSCHULD   = $BFFC; {WORD: built-up debt, e.g. because of screenupdates}
      SCHAKELBYTE   = $BFFF; {BYTE: switchbyte for EPROM at A000h}
      LOADVEC       = $020C;
      SAVEVEC       = $020E;
      GETBYTEVEC    = $0214;
      PUTBYTEVEC    = $0216;
      FINDVEC       = $0218;
      FLIPFLOP      = $BF7F;
      STR8GROOTTE   = SIZEOF(STR8);
      ATMRECGROOTTE = SIZEOF(ATMFILEREC);
      HEXSTR        : ARRAY[$00..$0F] OF CHAR = '0123456789ABCDEF';
VAR ATOMMEM1        : POINTER;
    ATOMMEM2        : POINTER;
    ATOMMEM3        : POINTER;
    BOXNAMES        : ARRAY[0..15,0..15] OF CHAR;
    DISKIMAGES      : FILELISTTYPE;
    AANTALDISKIMAGES: INTEGER; {number of disk images}
    TAPEIMAGES      : FILELISTTYPE;
    AANTALTAPEIMAGES: INTEGER; {number of tape images}
    IMPFILES        : ATMFILETYPE;
    AANTALIMPFILES  : INTEGER; {number of importable files}
    ATOMFILES       : ATMFILETYPE;
    AANTALATOMFILES : INTEGER; {number of atom files in an image}
    ATOMMEMSEG      : WORD;
    IOPORT          : WORD; {soundblaster base i/o port}
    CHARDATA        : ARRAY[$00..$BF,$00..$0F] OF BYTE;
    MONOGRAPHTABLE  : ARRAY[$00..$FF,$00..$03] OF WORD;
    GREYGRAPHTABLE  : ARRAY[$00..$FF,$00..$03] OF WORD;
    COLORGRAPHTABLE : ARRAY[$00..$FF,$00..$03] OF WORD;
    TAPEIMAGENAME   : STRING[8];
    EXTROMFILE      : STRING[12];
    FOUTNAME        : STRING[16];
    IMAGEFOUTNAME   : STRING[8];
    CATSEARCH       : ARRAY[0..15] OF CHAR;
    FINBUF          : ^FINBUFTYPE;
    FINBUFPTR       : WORD;
    FINBUFOFS       : WORD;
    FINBUFSEG       : WORD;
    FINSIZE         : WORD;
    FOUTBUF         : ^FOUTBUFTYPE;
    FOUTBUFPTR      : WORD;
    FOUTBUFOFS      : WORD;
    FOUTBUFSEG      : WORD;
    FOUTOPEN        : BYTE;
    BMPHEADER       : ARRAY[$0000..$0075] OF BYTE;
    MOUSEBACKGROUND : ARRAY[0..7,0..7] OF WORD;
    MOUSEPOINTER    : ARRAY[0..7,0..7] OF WORD;
    TEMPMOUSEDAT    : TEMPMOUSETYPE;
{===========================================================================}
{A number of variables will be declared here as procedures. This was to only}
{way that I could think of to have  them reside in the CSEG and keeping them}
{global.  During  emulation the DS register  is pointing to  the Atom memory}
{segment, the ES register  is A000h, i.e. the  video bank; Reading/writing a}
{variable using the CS: prefix  takes much less time than swapping the DS or}
{ES registers all the time.                                                 }
{Every procedure with this purpose has the ASSEMBLER directive, meaning that}
{no stackframe is generated.  The RETN instruction (C3h) is generated at the}
{end of the proc. automatically and takes one byte (sometimes used as data).}
{===========================================================================}
{---[toets (english: key)]--------------------------------------------------}
PROCEDURE TOETS; ASSEMBLER;
ASM;
               DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
               DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
               DW    0
END;
{---[filenamebuf]-----------------------------------------------------------}
PROCEDURE FILENAMEBUF; ASSEMBLER;
ASM;
               DD    0,0,0,0
END;
{---[widertable]------------------------------------------------------------}
PROCEDURE WIDERTABLE; ASSEMBLER;
ASM;
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
END;
{---[wider1atable]----------------------------------------------------------}
PROCEDURE WIDER1aTABLE; ASSEMBLER;
ASM;
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
  DD    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
END;
{---[opcodes (used for disassembling)]--------------------------------------}
PROCEDURE OPCODES; ASSEMBLER;
{ first digit  = mnemonic                             }
{ second digit = 1 Accumulator  ³ 8 Absolute, Y       }
{                2 Immediate    ³ 9 Implied           }
{                3 Zero Page    ³10 Relative          }
{                4 Zero Page, X ³11 (Indirect, X)     }
{                5 Zero Page, Y ³12 (Indirect), Y     }
{                6 Absolute     ³13 Absolute Indirect }
{                7 Absolute, X  ³14 (Indirect)        }
{                               ³15 (Abs.Indirect, X) }
ASM;
               DB    11, 9, 35,11, 70, 9, 34, 9, 64, 3, 35, 3,  3, 3, 34, 9
               DB    37, 9, 35, 2,  3, 1, 34, 9, 64, 6, 35, 6,  3, 6, 34, 9
{10}           DB    10,10, 35,12, 35,14, 34, 9, 63, 3, 35, 4,  3, 4, 34, 9
               DB    14, 9, 35, 8, 25, 1, 66, 9, 63, 6, 35, 7,  3, 7, 34, 9
{20}           DB    29, 6,  2,11, 34, 3, 34, 9,  7, 3,  2, 3, 40, 3, 34, 9
               DB    39, 9,  2, 2, 40, 1, 34, 9,  7, 6,  2, 6, 40, 6, 34, 9
{30}           DB     8,10,  2,12,  2,14, 34, 9,  7, 4,  2, 4, 40, 4, 34, 9
               DB    45, 9,  2, 8, 21, 1, 67, 9,  7, 7,  2, 7, 40, 7, 34, 9
{40}           DB    42, 9, 24,11, 34, 3, 34, 9, 34, 3, 24, 3, 33, 3, 34, 9
               DB    36, 9, 24, 2, 33, 1, 34, 9, 28, 6, 24, 6, 33, 6, 34, 9
{50}           DB    12,10, 24,12, 24,14, 34, 9, 34, 3, 24, 4, 33, 4, 34, 9
               DB    16, 9, 24, 8, 59, 9, 34, 9, 34, 6, 24, 7, 33, 7, 34, 9
{60}           DB    43, 9,  1,11, 34, 3, 34, 9, 62, 3,  1, 3, 41, 3, 34, 9
               DB    38, 9,  1, 2, 41, 1, 34, 9, 28,13,  1, 6, 41, 6, 34, 9
{70}           DB    13,10,  1,12,  1,14, 34, 9, 62, 4,  1, 4, 41, 4, 34, 9
               DB    47, 9,  1, 8, 61, 9, 34, 9, 28,15,  1, 7, 41, 7, 34, 9
{80}           DB    57,10, 48,11, 34, 3, 34, 9, 50, 3, 48, 3, 49, 3, 34, 9
               DB    23, 9,  7, 2, 54, 9, 34, 9, 50, 6, 48, 6, 49, 6, 34, 9
{90}           DB     4,10, 48,12, 48,14, 34, 9, 50, 4, 48, 4, 49, 5, 34, 9
               DB    56, 9, 48, 8, 55, 9, 68, 9, 62, 6, 48, 7, 62, 7, 34, 9
{A0}           DB    32, 2, 30,11, 31, 2, 34, 9, 32, 3, 30, 3, 31, 3, 34, 9
               DB    52, 9, 30, 2, 51, 9, 34, 9, 32, 6, 30, 6, 31, 6, 34, 9
{B0}           DB     5,10, 30,12, 30,14, 34, 9, 32, 4, 30, 4, 31, 5, 34, 9
               DB    17, 9, 30, 8, 53, 9, 69, 9, 32, 7, 30, 7, 31, 8, 34, 9
{C0}           DB    20, 2, 18,11, 34, 3, 34, 9, 20, 3, 18, 3, 21, 3, 34, 9
               DB    27, 9, 18, 2, 22, 9, 34, 9, 20, 6, 18, 6, 21, 6, 34, 9
{D0}           DB     9,10, 18,12, 18,14, 34, 9, 34, 3, 18, 4, 21, 4, 34, 9
               DB    15, 9, 18, 8, 58, 9, 34, 9, 34, 6, 18, 7, 21, 7, 34, 9
{E0}           DB    19, 2, 44,11, 34, 3, 34, 9, 19, 3, 44, 3, 25, 3, 34, 9
               DB    26, 9, 44, 2, 34, 9, 65, 9, 19, 6, 44, 6, 25, 6, 34, 9
{F0}           DB     6,10, 44,12, 44,14, 34, 9, 34, 3, 44, 4, 25, 4, 34, 9
               DB    46, 9, 44, 8, 60, 9, 34, 9, 29,15, 44, 7, 25, 7, 34, 9
END;
{---[mnemonics]-------------------------------------------------------------}
PROCEDURE MNEMONICS; ASSEMBLER;
ASM;
               DB    '???','ADC','AND','ASL','BCC','BCS','BEQ','BIT','BMI','BNE'{ 0}
               DB    'BPL','BRK','BVC','BVS','CLC','CLD','CLI','CLV','CMP','CPX'{10}
               DB    'CPY','DEC','DEX','DEY','EOR','INC','INX','INY','JMP','JSR'{20}
               DB    'LDA','LDX','LDY','LSR','NOP','ORA','PHA','PHP','PLA','PLP'{30}
               DB    'ROL','ROR','RTI','RTS','SBC','SEC','SED','SEI','STA','STX'{40}
               DB    'STY','TAX','TAY','TSX','TXA','TXS','TYA','BRA','PHX','PHY'{50}
               DB    'PLX','PLY','STZ','TRB','TSB','SWA','TAS','TSA','TXY','TYX'{60}
               DB    'COP'                                                      {70}
END;
{---[decnum]----------------------------------------------------------------}
PROCEDURE DECNUM; ASSEMBLER;
ASM;
               DB    $00,$00,$00,$00,$00,$00
END;
{---[characters (need to be ROLled left 1 bit)]-----------------------------}
PROCEDURE CHARACTERS; ASSEMBLER;
ASM;
               DB    $0E,$11,$01,$0D,$15,$15,$0E {@}
               DB    $04,$0A,$11,$11,$1F,$11,$11 {A}
               DB    $1E,$09,$09,$0E,$09,$09,$1E {B}
               DB    $0E,$11,$10,$10,$10,$11,$0E {C}
               DB    $1E,$09,$09,$09,$09,$09,$1E {D}
               DB    $1F,$10,$10,$1C,$10,$10,$1F {E}
               DB    $1F,$10,$10,$1E,$10,$10,$10 {F}
               DB    $0F,$10,$10,$13,$11,$11,$0F {G}
               DB    $11,$11,$11,$1F,$11,$11,$11 {H}
               DB    $0E,$04,$04,$04,$04,$04,$0E {I}
               DB    $01,$01,$01,$01,$11,$11,$0E {J}
               DB    $11,$12,$14,$18,$14,$12,$11 {K}
               DB    $10,$10,$10,$10,$10,$10,$1F {L}
               DB    $11,$1B,$15,$15,$11,$11,$11 {M}
               DB    $11,$19,$15,$13,$11,$11,$11 {N}
               DB    $1F,$11,$11,$11,$11,$11,$1F {O}
               DB    $1E,$11,$11,$1E,$10,$10,$10 {P}
               DB    $0E,$11,$11,$11,$15,$12,$0D {Q}
               DB    $1E,$11,$11,$1E,$14,$12,$11 {R}
               DB    $0E,$11,$08,$04,$02,$11,$0E {S}
               DB    $1F,$04,$04,$04,$04,$04,$04 {T}
               DB    $11,$11,$11,$11,$11,$11,$0E {U}
               DB    $11,$11,$11,$11,$0A,$0A,$04 {V}
               DB    $11,$11,$11,$15,$15,$1B,$11 {W}
               DB    $11,$11,$0A,$04,$0A,$11,$11 {X}
               DB    $11,$11,$0A,$04,$04,$04,$04 {Y}
               DB    $1F,$01,$02,$04,$08,$10,$1F {Z}
               DB    $0E,$08,$08,$08,$08,$08,$0E {[}
               DB    $10,$10,$08,$04,$02,$01,$01 {\}
               DB    $0E,$02,$02,$02,$02,$02,$0E {]}
               DB    $04,$0E,$15,$04,$04,$04,$04 {^}
               DB    $00,$04,$08,$1F,$08,$04,$00 {<-}
               DB    $00,$00,$00,$00,$00,$00,$00 {space}
               DB    $04,$04,$04,$04,$04,$00,$04 {!}
               DB    $0A,$0A,$00,$00,$00,$00,$00 {"}
               DB    $0A,$0A,$1B,$00,$1B,$0A,$0A {#}
               DB    $04,$0F,$10,$0E,$01,$1E,$04 {"$"}
               DB    $19,$19,$02,$04,$08,$13,$13 {%}
               DB    $08,$14,$14,$08,$15,$12,$0D {&}
               DB    $06,$06,$06,$00,$00,$00,$00 {'}
               DB    $02,$04,$08,$08,$08,$04,$02 {(}
               DB    $08,$04,$02,$02,$02,$04,$08 {)}
               DB    $00,$04,$0E,$1F,$0E,$04,$00 {*}
               DB    $00,$04,$04,$1F,$04,$04,$00 {+}
               DB    $00,$00,$00,$06,$06,$02,$04 {,}
               DB    $00,$00,$00,$1F,$00,$00,$00 {-}
               DB    $00,$00,$00,$00,$00,$06,$06 {.}
               DB    $01,$01,$02,$04,$08,$10,$10 {/}
               DB    $0C,$12,$12,$12,$12,$12,$0C {0}
               DB    $04,$0C,$04,$04,$04,$04,$0E {1}
               DB    $0E,$11,$01,$0E,$10,$10,$1F {2}
               DB    $0E,$11,$01,$06,$01,$11,$0E {3}
               DB    $02,$06,$0A,$1F,$02,$02,$02 {4}
               DB    $1F,$10,$1E,$01,$01,$11,$0E {5}
               DB    $0E,$10,$10,$1E,$11,$11,$0E {6}
               DB    $1F,$01,$02,$04,$08,$10,$10 {7}
               DB    $0E,$11,$11,$0E,$11,$11,$0E {8}
               DB    $0E,$11,$11,$0F,$01,$01,$0E {9}
               DB    $00,$06,$06,$00,$06,$06,$00 {:}
               DB    $06,$06,$00,$06,$06,$02,$04 {;}
               DB    $02,$04,$08,$10,$08,$04,$02 {<}
               DB    $00,$00,$1F,$00,$1F,$00,$00 {=}
               DB    $10,$08,$04,$02,$04,$08,$10 {>}
               DB    $0C,$12,$02,$04,$04,$00,$04 {?}
END;
{---[mousecursors]----------------------------------------------------------}
PROCEDURE MOUSECURSORS; ASSEMBLER;
ASM;
{00h}          DB    11111111b
               DB    10000010b
               DB    10000100b
               DB    10000100b
               DB    10000010b
               DB    10110001b
               DB    11001010b
               DB    10000100b
{01h}          DB    11111100b
               DB    11111000b
               DB    11110000b
               DB    11111000b
               DB    11011100b
               DB    10001110b
               DB    00000111b
               DB    00000010b
{02h}          DB    00111100b
               DB    01010010b
               DB    10010001b
               DB    10010001b
               DB    10011101b
               DB    10000001b
               DB    01000010b
               DB    00111100b
{03h}          DB    11110000b
               DB    11000000b
               DB    10100000b
               DB    10010000b
               DB    00001000b
               DB    00000100b
               DB    00000000b
               DB    00000000b
{04h}          DB    00010000b
               DB    00101000b
               DB    01000100b
               DB    11000110b
               DB    01000100b
               DB    01000100b
               DB    01000100b
               DB    01111100b
{05h}          DB    01111100b
               DB    01000100b
               DB    01000100b
               DB    01000100b
               DB    11000110b
               DB    01000100b
               DB    00101000b
               DB    00010000b
{06h}          DB    00001000b
               DB    11111100b
               DB    10000010b
               DB    10000001b
               DB    10000010b
               DB    11111100b
               DB    00001000b
               DB    00000000b
{07h}          DB    00010000b
               DB    00111111b
               DB    01000001b
               DB    10000001b
               DB    01000001b
               DB    00111111b
               DB    00010000b
               DB    00000000b
{08h}          DB    00111100b
               DB    01000110b
               DB    10001101b
               DB    10001101b
               DB    10011001b
               DB    10011001b
               DB    01110010b
               DB    00111100b
{09h}          DB    00111000b
               DB    01000100b
               DB    01010100b
               DB    01110100b
               DB    00101000b
               DB    00111000b
               DB    00101000b
               DB    00111000b
{0Ah}          DB    01111100b
               DB    01000100b
               DB    01101100b
               DB    00101000b
               DB    00101000b
               DB    01101100b
               DB    01000100b
               DB    01111100b
{0Bh}          DB    00111000b
               DB    00101000b
               DB    11101110b
               DB    10000010b
               DB    11101110b
               DB    00101000b
               DB    00111000b
               DB    00000000b
{0Ch}          DB    01000000b
               DB    10100000b
               DB    10100000b
               DB    10111110b
               DB    10101011b
               DB    10000001b
               DB    11111111b
               DB    01111110b
{0Dh}          DB    01111110b
               DB    11111111b
               DB    10000001b
               DB    10101011b
               DB    10111110b
               DB    10100000b
               DB    10100000b
               DB    01000000b
{0Eh}          DB    01111110b
               DB    11000001b
               DB    11011110b
               DB    11001000b
               DB    11011000b
               DB    11001000b
               DB    11011000b
               DB    01110000b
{0Fh}          DB    01111110b
               DB    10000011b
               DB    01111011b
               DB    00010011b
               DB    00011011b
               DB    00010011b
               DB    00011011b
               DB    00001110b
{10h}          DB    01111110b
               DB    01111110b
               DB    00111100b
               DB    00011000b
               DB    00011000b
               DB    00100100b
               DB    01000010b
               DB    01111110b
{11h}          DB    01111110b
               DB    01100110b
               DB    00111100b
               DB    00011000b
               DB    00011000b
               DB    00100100b
               DB    01011010b
               DB    01111110b
{12h}          DB    01111110b
               DB    01000010b
               DB    00111100b
               DB    00011000b
               DB    00011000b
               DB    00100100b
               DB    01111110b
               DB    01111110b
{13h}          DB    01111110b
               DB    01000010b
               DB    00100100b
               DB    00011000b
               DB    00011000b
               DB    00111100b
               DB    01111110b
               DB    01111110b
{14h}          DB    11100000b
               DB    10011000b
               DB    01000110b
               DB    00110001b
               DB    01101011b
               DB    01010101b
               DB    00101001b
               DB    00011110b
{15h}          DB    00000111b
               DB    00011001b
               DB    01100010b
               DB    10001100b
               DB    11010110b
               DB    10101010b
               DB    10010100b
               DB    01111000b
{16h}          DB    00011110b
               DB    00101001b
               DB    01010101b
               DB    01101011b
               DB    00110001b
               DB    01000110b
               DB    10011000b
               DB    11100000b
{17h}          DB    01111000b
               DB    10010100b
               DB    10101010b
               DB    11010110b
               DB    10001100b
               DB    01100010b
               DB    00011001b
               DB    00000111b
{18h}          DB    01100110b
               DB    10011001b
               DB    10011001b
               DB    11011101b
               DB    11011101b
               DB    10011001b
               DB    10011001b
               DB    01100110b
{19h}          DB    01100110b
               DB    11111111b
               DB    11111111b
               DB    10011001b
               DB    10011001b
               DB    10011001b
               DB    10011001b
               DB    01100110b
{1Ah}          DB    01100110b
               DB    10011001b
               DB    10011001b
               DB    10111011b
               DB    10111011b
               DB    10011001b
               DB    10011001b
               DB    01100110b
{1Bh}          DB    01100110b
               DB    10011001b
               DB    10011001b
               DB    10011001b
               DB    10011001b
               DB    11111111b
               DB    11111111b
               DB    01100110b
{1Ch}          DB    11111111b
               DB    10000010b
               DB    10000100b
               DB    10001000b
               DB    10010000b
               DB    10100000b
               DB    11000000b
               DB    10000000b
{1Dh}          DB    10000000b
               DB    11000000b
               DB    10100000b
               DB    10010000b
               DB    10001000b
               DB    10000100b
               DB    10000010b
               DB    11111111b
{1Eh}          DB    00000001b
               DB    00000011b
               DB    00000101b
               DB    00001001b
               DB    00010001b
               DB    00100001b
               DB    01000001b
               DB    11111111b
{1Fh}          DB    11111111b
               DB    01000001b
               DB    00100001b
               DB    00010001b
               DB    00001001b
               DB    00000101b
               DB    00000011b
               DB    00000001b
END;
{---[keyscan]---------------------------------------------------------------}
PROCEDURE KEYSCAN; ASSEMBLER;
ASM;
               DB    $00,$04,$0C,$22,$10,$01,$00,$00 {0: ±,3,-,g,q,esc}
               DB    $00,$03,$33,$21,$19,$2C,$00,$00 {1: ±,2,<,f,p,z}
               DB    $80,$02,$27,$12,$18,$15,$00,$00 {2: up,1,+(;),e,o,y}
               DB    $81,$0B,$0D,$20,$31,$2D,$00,$00 {3: rt,0,:(=),d,n,x}
               DB    $3A,$0E,$0A,$2E,$32,$11,$00,$00 {4: lock,del,9,c,m,w}
               DB    $29,$0F,$09,$30,$26,$2F,$00,$00 {5: ~,copy(tab),8,b,l,v}
               DB    $1B,$1C,$08,$1E,$25,$16,$00,$00 {6: ],ret,7,a,k,u}
               DB    $2B,$00,$07,$28,$24,$14,$00,$00 {7: \,±,6,@('),j,t}
               DB    $1A,$00,$06,$35,$17,$1F,$00,$00 {8: [,±,5,/,i,s}
               DB    $39,$00,$05,$34,$23,$13,$00,$00 {9: space,±,4,>,h,r}
END;
{---[altkeyscan]------------------------------------------------------------}
PROCEDURE ALTKEYSCAN; ASSEMBLER;
ASM;
               DB    $00,$04,$0C,$22,$10,$01,$00,$00 {0: ±,3,-,g,q,esc}
               DB    $00,$03,$33,$21,$19,$2C,$00,$00 {1: ±,2,<,f,p,z}
               DB    $3A,$02,$27,$12,$18,$15,$00,$00 {2: up,1,+(;),e,o,y}
               DB    $0F,$0B,$0D,$20,$31,$2D,$00,$00 {3: rt,0,:(=),d,n,x}
               DB    $4B,$0E,$0A,$2E,$32,$11,$00,$00 {4: lock,del,9,c,m,w}
               DB    $29,$4D,$09,$30,$26,$2F,$00,$00 {5: ~,copy,8,b,l,v}
               DB    $1B,$1C,$08,$1E,$25,$16,$00,$00 {6: ],ret,7,a,k,u}
               DB    $2B,$00,$07,$28,$24,$14,$00,$00 {7: \,±,6,@('),j,t}
               DB    $1A,$00,$06,$35,$17,$1F,$00,$00 {8: [,±,5,/,i,s}
               DB    $39,$00,$05,$34,$23,$13,$00,$00 {9: space,±,4,>,h,r}
END;
{---[bioscode]--------------------------------------------------------------}
PROCEDURE BIOSCODE; ASSEMBLER;
ASM;
               DW    $FFFF,$1B1B,'!1','@2','#3','$4','%5','^6'       {00}
               DW    '&7','*8','(9',')0','_-','+=',$0808,$0909       {08}
               DW    'QQ','WW','EE','RR','TT','YY','UU','II'         {10}
               DW    'OO','PP','{[','}]',$0D0D,$FFFF,'AA','SS'       {18}
               DW    'DD','FF','GG','HH','JJ','KK','LL',':;'         {20}
               DW    '"''','~`',$FFFF,'|\','ZZ','XX','CC','VV'       {28}
               DW    'BB','NN','MM','<,','>.','?/',$FFFF,'**'        {30}
               DW    $FFFF,'  ',$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF  {38}
               DW    $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF {40}
               DW    $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF {48}
               DW    $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF {50}
               DW    $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF {58}
               DW    $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF {60}
               DW    $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF {68}
               DW    $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF {70}
               DW    $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF {78}
END;
{---[debugtxt]--------------------------------------------------------------}
PROCEDURE DEBUGTXT; ASSEMBLER;
ASM;
               DB    00000000b,00000000b,00000000b,00000000b
               DB    01111001b,11110111b,10010001b,00111000b
               DB    01000101b,00000100b,01010001b,01000100b
               DB    01000101b,00000100b,01010001b,01000000b
               DB    01000101b,11100111b,10010001b,01011100b
               DB    01000101b,00000100b,01010001b,01000100b
               DB    01000101b,00000100b,01010001b,01000100b
               DB    01111001b,11110111b,10001111b,00111000b
               DB    00000000b,00000000b,00000000b,00000000b
               DB    00001000b,10011100b,11110011b,11100000b
               DB    00001101b,10100010b,10001010b,00000000b
               DB    00001010b,10100010b,10001010b,00000000b
               DB    00001010b,10100010b,10001011b,11000000b
               DB    00001000b,10100010b,10001010b,00000000b
               DB    00001000b,10100010b,10001010b,00000000b
               DB    00001000b,10011100b,11110011b,11100000b
               DB    00000000b,00000000b,00000000b,00000000b
END;
{---[emulcolors]------------------------------------------------------------}
PROCEDURE EMULCOLORS; ASSEMBLER;
ASM;
               DB    $00,$00,$00 {00h: backgr}
               DB    $00,$2A,$00 {01h: foregr}
               DB    $00,$15,$00 {02h: greysb}
               DB    $00,$2A,$00 {03h: color0}
               DB    $3F,$3F,$2A {04h: color1}
               DB    $00,$00,$00 {05h: color2}
               DB    $0A,$0A,$0A {06h: color3}
               DB    $00,$00,$00 {07h: randkleur}
               DB    $00,$00,$2A {08h: blauw}
               DB    $34,$00,$00 {09h: rood}
               DB    $20,$10,$00 {0Ah: bruin}
               DB    $20,$20,$20 {0Bh: grijs}
               DB    $15,$3F,$15 {0Ch: licht groen}
               DB    $00,$00,$00 {0Dh: zwart}
               DB    $3F,$3F,$15 {0Eh: geel}
               DB    $3F,$3F,$3F {0Fh: wit}
END;
{---[intensmono]------------------------------------------------------------}
PROCEDURE INTENSMONO; ASSEMBLER;
ASM;
               DB    $00,$3F,$00
END;
{---[intenscolor]-----------------------------------------------------------}
PROCEDURE INTENSCOLOR; ASSEMBLER;
ASM;
               DB    $00,$1C,$00
END;
{---[pcwaittable (filled depending on CPU speed)]---------------------------}
PROCEDURE PCWAITTABLE; ASSEMBLER;
ASM;
               DW    0
               DW    0
               DW    0
               DW    0
               DW    0
               DW    0
               DW    0
               DW    0
               DW    0
END;
{---[wachtconst (if specified in .INI file)]--------------------------------}
PROCEDURE WACHTCONST; ASSEMBLER;
ASM;
               DW    $0000
END;
{---[cursorx]---------------------------------------------------------------}
PROCEDURE CURSORX; ASSEMBLER;
ASM;
END;
{---[cursory]---------------------------------------------------------------}
PROCEDURE CURSORY; ASSEMBLER;
ASM;
END;
{---[dataseg (word)]--------------------------------------------------------}
PROCEDURE DATASEG; ASSEMBLER;
ASM;
               DB    $00
END;
{---[sortdir]---------------------------------------------------------------}
PROCEDURE SORTDIR (VAR A:FILELISTTYPE; LO,HI:INTEGER);
VAR X,Y:STR8;
  PROCEDURE SORTEER (L,R:INTEGER);
  VAR I,J:INTEGER;
  BEGIN
    I := L;
    J := R;
    X := A[(L+R) DIV 2];
    REPEAT
      WHILE A[I] < X DO INC (I);
      WHILE X < A[J] DO DEC (J);
      IF I <= J THEN
      BEGIN
        Y := A[I];
        A[I] := A[J];
        A[J] := Y;
        INC (I);
        DEC (J);
      END;
    UNTIL I > J;
    IF L < J THEN SORTEER (L,J);
    IF I < R THEN SORTEER (I,R);
  END;
BEGIN
  SORTEER (LO,HI);
END;
{---[readdirectory]---------------------------------------------------------}
PROCEDURE READDIRECTORY;
VAR D:SEARCHREC;
    I:WORD;
BEGIN
  AANTALATOMFILES := 0;
  AANTALTAPEIMAGES := 0;
  FINDFIRST ('*.TAP',ANYFILE,D);
  WHILE (DOSERROR = 0) AND (AANTALTAPEIMAGES < MAXAANTFILES) DO
  BEGIN
    IF D.ATTR AND $18 = $00 THEN
    BEGIN
      D.NAME := COPY(D.NAME,1,LENGTH(D.NAME)-4);
      TAPEIMAGES[AANTALTAPEIMAGES] := D.NAME;
      INC (AANTALTAPEIMAGES);
    END;
    FINDNEXT (D);
  END;
  IF AANTALTAPEIMAGES > 0 THEN SORTDIR (TAPEIMAGES,0,PRED(AANTALTAPEIMAGES));
  AANTALDISKIMAGES := 0;
  FINDFIRST ('*.DSK',ANYFILE,D);
  WHILE (DOSERROR = 0) AND (AANTALDISKIMAGES < MAXAANTFILES) DO
  BEGIN
    IF (D.ATTR AND (VOLUMEID OR DIRECTORY) = $00) AND (D.SIZE=40*10*256) THEN
    BEGIN
      D.NAME := COPY(D.NAME,1,LENGTH(D.NAME)-4);
      DISKIMAGES[AANTALDISKIMAGES] := D.NAME;
      INC (AANTALDISKIMAGES);
    END;
    FINDNEXT (D);
  END;
  IF AANTALDISKIMAGES > 0 THEN SORTDIR (DISKIMAGES,0,PRED(AANTALDISKIMAGES));
END;
{---[copywriteprot]---------------------------------------------------------}
PROCEDURE COPYWRITEPROT;
CONST WP:ARRAY[0..1] OF BYTE = ($0F,$F0);
VAR I,J:BYTE;
    D:SEARCHREC;
BEGIN
  WRITEPROTECT[$00] := $00;
  WRITEPROTECT[$01] := $00;
  FOR I := 0 TO 3 DO
  BEGIN
    IF DISKETTENAMES[I] <> '' THEN
    BEGIN
      FINDFIRST (DISKETTENAMES[I]+'.DSK',ANYFILE,D);
      IF DOSERROR=0 THEN
      BEGIN
        J := D.ATTR AND READONLY;
        IF J <> 0 THEN
          WRITEPROTECT[I AND 1] := WRITEPROTECT[I AND 1] OR WP[I SHR 1]
      END ELSE
      BEGIN
        DISKETTENAMES[I] := '';
      END;
    END;
  END;
END;
{---[readfilesintapeimage]--------------------------------------------------}
PROCEDURE READFILESINTAPEIMAGE;
VAR FROMF    : FILE;
    TAPESIZE : LONGINT;
    FPOS     : LONGINT;
    NR       : WORD;
    DUMMY    : INTEGER;
BEGIN
  DUMMY := IORESULT;
  AANTALATOMFILES := 0;
  IF LENGTH(TAPEIMAGENAME) = 0 THEN EXIT;
  ASSIGN (FROMF,TAPEIMAGENAME+'.TAP');
  RESET (FROMF,1);
  IF IORESULT <> 0 THEN EXIT;
  TAPESIZE := FILESIZE (FROMF);
  FPOS := 0;
  WHILE FPOS < TAPESIZE DO
  BEGIN
    SEEK (FROMF,FPOS);
    BLOCKREAD (FROMF,ATOMFILES[AANTALATOMFILES],SIZEOF(ATMFILEREC),NR);
    IF NR <> SIZEOF(ATMFILEREC) THEN
    BEGIN
      CLOSE (FROMF);
      EXIT;
    END;
    INC (FPOS,SIZEOF(ATMFILEREC)+LONGINT(ATOMFILES[AANTALATOMFILES].DATASIZE));
    INC (AANTALATOMFILES);
  END;
  CLOSE (FROMF);
END;
{---[tempdosprompt]---------------------------------------------------------}
PROCEDURE TEMPDOSPROMPT;
VAR CURDIR:STRING;
    I:BYTE;
    J:WORD;
BEGIN
  GETDIR (0,CURDIR);
  ASM;
               MOV   AX,$0003
               INT   $10
  END;
  WRITELN;
  WRITELN ('               Type EXIT to return to the Acorn Atom Emulator...');
  ASM;
                MOV   AX,$B800
                MOV   ES,AX
                MOV   BX,$0001
  @TDP1:        MOV   BYTE PTR [ES:BX],$1E
                ADD   BX,+$02
                CMP   BX,+481
                JB    @TDP1
  END;
  EXEC (GETENV('COMSPEC'),'');
  CHDIR (CURDIR);
  READDIRECTORY;
  COPYWRITEPROT;
  READFILESINTAPEIMAGE;
END;
{---[nextline]--------------------------------------------------------------}
PROCEDURE NEXTLINE; ASSEMBLER;
ASM;
               MOV   BYTE PTR [CS:CURSORX],$00
               INC   BYTE PTR [CS:CURSORY]
               CMP   BYTE PTR [CS:CURSORY],+19
               JB    @NEXTLINE1
               PUSHA
               DEC   BYTE PTR [CS:CURSORY]
               CLI
               MOV   DI,+20*$0120
               MOV   SI,+30*$0120
               MOV   CX,(200-30)*$0120/2
               REPZ
               MOVSW
               MOV   CX,+10*$0120/2
               SUB   AX,AX
               REPZ
               STOSW
               STI
               POPA
@NEXTLINE1:
END;
{---[printchar; AL=char; BL=color (used by desktop)]------------------------}
PROCEDURE PRINTCHAR; ASSEMBLER;
ASM;
               PUSH  DS
               PUSHA
               MOV   DI,SEG CHARDATA
               MOV   DS,DI
               MOV   AH,$00
               SHL   AX,4
               ADD   AX,OFFSET CHARDATA
               ADD   AX,+2
               MOV   SI,AX
               MOV   AL,BYTE PTR [CS:CURSORY]
               MOV   AH,$00
               MOV   CX,10*$0120
               MUL   CX
               ADD   AX,$0140
               MOV   DI,AX
               MOV   AL,BYTE PTR [CS:CURSORX]
               ADD   AL,+12
               MOV   AH,$00
               SHL   AX,2
               ADD   DI,AX
               MOV   CH,+10
@PRINTCH4:     LODSB
               MOV   AH,$01
@PRINTCH5:     TEST  BL,AH
               JZ    @PRINTCH1
               CMP   AH,$02
               JNZ   @PRINTCH6
               STOSB
               JMP   @PRINTCH2
@PRINTCH6:     MOV   BYTE PTR [ES:DI],$FF
               INC   DI
               JMP   @PRINTCH2
@PRINTCH1:     CMP   AH,$02
               JNZ   @PRINTCH7
               MOV   BYTE PTR [ES:DI],$00
               INC   DI
               JMP   @PRINTCH2
@PRINTCH7:     NOT   AL
               STOSB
               NOT   AL
@PRINTCH2:     SHL   AH,1
               CMP   AH,$10
               JB    @PRINTCH5
               ADD   DI,$011C
               DEC   CH
               JNZ   @PRINTCH4
               INC   BYTE PTR [CS:CURSORX]
               CMP   BYTE PTR [CS:CURSORX],+40
               JB    @PRINTCH3
               CALL  NEXTLINE
@PRINTCH3:     POPA
               POP   DS
END;
{---[xorput; DI=screenpos; AL=color (00h-0Fh); CX=length]-------------------}
PROCEDURE XORPUT; ASSEMBLER;
ASM;
               PUSH  AX
               PUSH  BX
               PUSH  CX
               PUSH  DX
               MOV   BYTE PTR @XORPKLR,AL
               MOV   DL,+9
@XORP6:        PUSH  DX
               PUSH  DI
               PUSH  CX
@XORP5:        PUSH  CX
               MOV   DL,BYTE PTR @XORPKLR
               MOV   CL,$0D
               MOV   AX,$FFFF
               SUB   BX,BX
@XORP2:        MOV   DH,BYTE PTR [ES:DI+BX]
               SHR   DL,1
               JC    @XORP1
               NOT   DH
@XORP1:        AND   AL,DH
               MOV   DH,BYTE PTR [ES:DI+BX]
               SHR   CL,1
               JC    @XORP7
               NOT   DH
@XORP7:        AND   AH,DH
               INC   BL
               CMP   BL,$04
               JNZ   @XORP2
               POP   CX
               {AL geeft posities van kleur aan; AH van zwart (0Dh)}
               OR    BYTE PTR [ES:DI],AL
               NOT   AL
               AND   BYTE PTR [ES:DI+$01],AL
               NOT   AL
               OR    BYTE PTR [ES:DI+$02],AL
               OR    BYTE PTR [ES:DI+$03],AL
               MOV   AL,AH
               NOT   AL
               MOV   DL,BYTE PTR @XORPKLR
               SUB   BX,BX
@XORP4:        AND   BYTE PTR [ES:DI+BX],AL
               SHR   DL,1
               JNC   @XORP3
               OR    BYTE PTR [ES:DI+BX],AH
@XORP3:        INC   BL
               CMP   BL,$04
               JNZ   @XORP4
               ADD   DI,+$04
               LOOP  @XORP5
               POP   CX
               POP   DI
               POP   DX
               ADD   DI,$0120
               DEC   DL
               JNZ   @XORP6
               POP   DX
               POP   CX
               POP   BX
               POP   AX
               RETN
@XORPKLR:
END;
{---[altkeyb (one byte)]----------------------------------------------------}
PROCEDURE ALTKEYB; ASSEMBLER;
ASM;
END;
{---[swapkeyboard]----------------------------------------------------------}
PROCEDURE SWAPKEYBOARD; ASSEMBLER;
ASM;
               PUSHA
               MOV   BYTE PTR [CS:CURSORX],+9
               MOV   BYTE PTR [CS:CURSORY],+8
               MOV   BL,$09
               MOV   AL,01000101b
               CALL  PRINTCHAR
               MOV   CX,+20
               MOV   AL,01001100b
@SWAP1:        CALL  PRINTCHAR
               LOOP  @SWAP1
               MOV   AL,01001010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+9
               MOV   BYTE PTR [CS:CURSORY],+9
               MOV   AL,01010101b
               CALL  PRINTCHAR
               MOV   SI,OFFSET @STANDARDTXT
               XOR   BYTE PTR [CS:ALTKEYB],$01
               JZ    @SWAP3
               MOV   SI,OFFSET @ALTERNATETXT
@SWAP3:        MOV   BL,$0C
@SWAP5:        MOV   AL,BYTE PTR [CS:SI]
               INC   SI
               AND   AL,$3F
               JZ    @SWAP4
               CALL  PRINTCHAR
               JMP   @SWAP5
@SWAP4:        MOV   BL,$09
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+9
               MOV   BYTE PTR [CS:CURSORY],+10
               MOV   AL,01010100b
               CALL  PRINTCHAR
               MOV   CX,+20
               MOV   AL,01001100b
@SWAP2:        CALL  PRINTCHAR
               LOOP  @SWAP2
               MOV   AL,01101000b
               CALL  PRINTCHAR
               POPA
               RETN
@ALTERNATETXT: DB    ' ALTERNATE KEYBOARD ',$00
@STANDARDTXT:  DB    ' STANDARD KEYBOARD  ',$00
END;
{---[cpuspeedmode]----------------------------------------------------------}
PROCEDURE CPUSPEEDMODE; ASSEMBLER;
ASM;
END;
{---[asmlayout]-------------------------------------------------------------}
PROCEDURE ASMLAYOUT; ASSEMBLER;
ASM;
END;
{---[soundoutput]-----------------------------------------------------------}
PROCEDURE SOUNDOUTPUT; ASSEMBLER;
ASM;
END;
{---[boxswitch (byte)]------------------------------------------------------}
PROCEDURE BOXSWITCH; ASSEMBLER; {use boxswitching; 00h=no; 01h=yes}
ASM;
END;
{---[box0onbreak (byte)]----------------------------------------------------}
PROCEDURE BOX0ONBREAK; ASSEMBLER; {restore box 0 on break; 00h=no; 01h=yes}
ASM;
END;
{---[ignorezpFEh (byte)]----------------------------------------------------}
PROCEDURE IGNOREzpFEh; ASSEMBLER; {ignore check char not sent to printer}
ASM;
END;
{---[nmiresponse (byte)]----------------------------------------------------}
PROCEDURE NMIRESPONSE; ASSEMBLER;
ASM;
END;
{---[leendertsrom (byte): use 80x87 or not]---------------------------------}
PROCEDURE LEENDERTSROM; ASSEMBLER;
ASM;
END;
{---[abloksprong (word): offset for JMP A002h in D-block]-------------------}
PROCEDURE ABLOKSPRONG; ASSEMBLER;
ASM;
               DB    $00
END;
{---[fppc_addr (dword)]-----------------------------------------------------}
PROCEDURE FPPC_ADDR; ASSEMBLER;
ASM;
               DB    0,0,0
END;
{---[swapcpuspeed]----------------------------------------------------------}
PROCEDURE SWAPCPUSPEED; ASSEMBLER;
ASM;
               PUSHA
               MOV   BYTE PTR [CS:CURSORX],+9
               MOV   BYTE PTR [CS:CURSORY],+8
               MOV   BL,$09
               MOV   AL,01000101b
               CALL  PRINTCHAR
               MOV   CX,+20
               MOV   AL,01001100b
@SWAP1:        CALL  PRINTCHAR
               LOOP  @SWAP1
               MOV   AL,01001010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+9
               MOV   BYTE PTR [CS:CURSORY],+9
               MOV   AL,01010101b
               CALL  PRINTCHAR
               MOV   SI,OFFSET @ORIGINALTXT
               XOR   BYTE PTR [CS:CPUSPEEDMODE],$01
               JZ    @SWAP3
               MOV   SI,OFFSET @MAXIMUMTXT
@SWAP3:        MOV   BL,$0C
@SWAP5:        MOV   AL,BYTE PTR [CS:SI]
               INC   SI
               AND   AL,$3F
               JZ    @SWAP4
               CALL  PRINTCHAR
               JMP   @SWAP5
@SWAP4:        MOV   BL,$09
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+9
               MOV   BYTE PTR [CS:CURSORY],+10
               MOV   AL,01010100b
               CALL  PRINTCHAR
               MOV   CX,+20
               MOV   AL,01001100b
@SWAP2:        CALL  PRINTCHAR
               LOOP  @SWAP2
               MOV   AL,01101000b
               CALL  PRINTCHAR
               POPA
               RETN
@MAXIMUMTXT:   DB    ' MAXIMUM CPU SPEED  ',$00
@ORIGINALTXT:  DB    ' ORIGINAL CPU SPEED ',$00
END;
{---[hex (byte)]------------------------------------------------------------}
FUNCTION HEX (B:BYTE):STR2;
BEGIN
  HEX := HEXSTR[B SHR 4] + HEXSTR[B AND $0F];
END;
{---[hexw (word)]-----------------------------------------------------------}
FUNCTION HEXW (W:WORD):STR4;
BEGIN
  HEXW := HEXSTR[HI(W) SHR 4] + HEXSTR[HI(W) AND $0F] +
          HEXSTR[LO(W) SHR 4] + HEXSTR[LO(W) AND $0F];
END;
{---[readinifile]-----------------------------------------------------------}
PROCEDURE READINIFILE;
LABEL 1;
CONST INI_BYTE : ARRAY[1..8] OF STRING[11] =
               ('ASMLAYOUT','SOUND','SPEEDINDEX','BOXSWITCH',
                'BOX0ONBREAK','IGNOREZPFEH','NMIRESPONSE','USE80X87');
      INI_STR  : ARRAY[1..9] OF STRING[10] =
                ('EXTROMFILE','BACKGR','FOREGR','GREYSB',
                 'COLOR0','COLOR1','COLOR2','COLOR3','DRIVE');
      PCHARMESTR = 'P-CHARME'+#0+#0+#0+#0+#0+#0+#0+#0;
VAR F:TEXT;
    S:STRING;
    R,G,I:BYTE;
    B:WORD;
    CODE:INTEGER;
    FROMF:FILE;
    NR:WORD;
    DUMMY:INTEGER;
    P,Q:POINTER;
    ATMHEADER:ATMFILEREC;
BEGIN
  WRITE ('Seaching for INI-file.');
  ASM;
               MOV   BYTE PTR [CS:ASMLAYOUT],$00
               MOV   BYTE PTR [CS:SOUNDOUTPUT],$01
               MOV   WORD PTR [CS:WACHTCONST],$0000
               MOV   BYTE PTR [CS:BOXSWITCH],$01
               MOV   BYTE PTR [CS:BOX0ONBREAK],$01
               MOV   BYTE PTR [CS:IGNOREzpFEh],$01
               MOV   BYTE PTR [CS:NMIRESPONSE],+15
               MOV   BYTE PTR [CS:LEENDERTSROM],$00
               MOV   WORD PTR [CS:ABLOKSPRONG],$D4BE
  END;
  EXTROMFILE := 'EXTROM.TAP';
  DUMMY := IORESULT;
  ASSIGN (F,'ATOM.INI');
  RESET (F);
  IF IORESULT <> 0 THEN
  BEGIN
    WRITELN (' Not found.');
    GOTO 1;
  END ELSE
  BEGIN
    WRITELN (' Reading.');
  END;
  WHILE NOT EOF(F) DO
  BEGIN
    READLN (F,S);
    FOR I := 1 TO LENGTH(S) DO S[I] := UPCASE(S[I]);
    FOR I := 1 TO 8 DO
    BEGIN
      IF COPY(S,1,LENGTH(INI_BYTE[I]))=INI_BYTE[I] THEN
      BEGIN
        DELETE (S,1,SUCC(LENGTH(INI_BYTE[I])));
        VAL (S,B,CODE);
        IF CODE = 0 THEN
        BEGIN
          CASE I OF 1: ASM;
                            MOV   AX,WORD PTR B
                            OR    AX,AX
                            JZ    @R1
                            MOV   AL,$01
                       @R1: MOV   BYTE PTR [CS:ASMLAYOUT],AL
                       END;
                    2: ASM;
                            MOV   AX,WORD PTR B
                            OR    AX,AX
                            JZ    @R2
                            MOV   AL,$01
                       @R2: MOV   BYTE PTR [CS:SOUNDOUTPUT],AL
                       END;
                    3: ASM;
                            MOV   AX,WORD PTR B
                            MOV   WORD PTR [CS:WACHTCONST],AX
                       END;
                    4: ASM;
                            MOV   AX,WORD PTR B
                            OR    AX,AX
                            JZ    @R4
                            MOV   AL,$01
                       @R4: MOV   BYTE PTR [CS:BOXSWITCH],AL
                       END;
                    5: ASM;
                            MOV   AX,WORD PTR B
                            OR    AX,AX
                            JZ    @R5
                            MOV   AL,$01
                       @R5: MOV   BYTE PTR [CS:BOX0ONBREAK],AL
                       END;
                    6: ASM;
                            MOV   AX,WORD PTR B
                            OR    AX,AX
                            JZ    @R6
                            MOV   AL,$01
                            MOV   ES,WORD PTR ATOMMEMSEG
                            MOV   BYTE PTR [ES:$FF07],$00
                       @R6: MOV   BYTE PTR [CS:IGNOREzpFEh],AL
                       END;
                    7: ASM;
                            MOV   AX,WORD PTR B
                            CMP   AL,+15
                            JAE   @R7
                            MOV   AL,+15
                       @R7: MOV   BYTE PTR [CS:NMIRESPONSE],AL
                       END;
                    8: ASM;
                            MOV   AX,WORD PTR B
                            OR    AX,AX
                            JZ    @R8
                            MOV   AL,$01
                       @R8: MOV   BYTE PTR [CS:LEENDERTSROM],AL
                       END;
          END;
        END;
      END;
    END;
    FOR I := 1 TO 9 DO
    BEGIN
      IF COPY(S,1,LENGTH(INI_STR[I]))=INI_STR[I] THEN
      BEGIN
        DELETE (S,1,LENGTH(INI_STR[I]));
        IF I=1 THEN
        BEGIN
          DELETE (S,1,1);
          IF LENGTH(S) > 0 THEN EXTROMFILE := S;
        END ELSE
        IF I=9 THEN
        BEGIN
          G := ORD(S[1]);
          DEC (G,48);
          IF G <= 3 THEN
          BEGIN
            DELETE (S,1,2);
            IF COPY (S,LENGTH(S)-3,4)='.DSK' THEN DEC (S[0],4);
            IF (S <> '') AND (AANTALDISKIMAGES > 0) THEN
            BEGIN
              B := 0;
              WHILE (DISKETTENAMES[G] = '') AND (B < AANTALDISKIMAGES) DO
              BEGIN
                IF S=DISKIMAGES[B] THEN DISKETTENAMES[G] := S;
                INC (B);
              END;
            END;
          END;
        END ELSE
        BEGIN
          DELETE (S,1,1);
          IF LENGTH(S)=6 THEN
          BEGIN
            FOR B := 1 TO LENGTH(S) DO
            BEGIN
              S[B] := CHR(ORD(S[B])-48);
              IF ORD(S[B]) > 9 THEN S[B] := CHR(ORD(S[B])-7);
            END;
            R := (ORD(S[1]) SHL 4) + ORD(S[2]);
            G := (ORD(S[3]) SHL 4) + ORD(S[4]);
            B := (ORD(S[5]) SHL 4) + ORD(S[6]);
            ASM;
               MOV   AL,BYTE PTR I
               SUB   AL,$02
               MOV   AH,$00
               MOV   BX,AX
               SHL   AX,1
               ADD   BX,AX
               MOV   AL,BYTE PTR R
               AND   AL,$3F
               MOV   BYTE PTR EMULCOLORS[CS:BX],AL
               MOV   AL,BYTE PTR G
               AND   AL,$3F
               MOV   BYTE PTR EMULCOLORS[CS:BX+$01],AL
               MOV   AL,BYTE PTR B
               AND   AL,$3F
               MOV   BYTE PTR EMULCOLORS[CS:BX+$02],AL
            END;
          END;
        END;
      END;
    END;
  END;
  CLOSE (F);
  FOR I := 3 DOWNTO 1 DO
    FOR G := I-1 DOWNTO 0 DO
      IF DISKETTENAMES[I] = DISKETTENAMES[G] THEN DISKETTENAMES[I] := '';
1:ASM;
               PUSH  DS
               POP   ES
               MOV   DI,OFFSET BOXNAMES
               MOV   AL,$00
               MOV   CX,+16*16
               CLD
               REPZ
               STOSB
  END;
  IF MEM[CSEG:OFS(LEENDERTSROM)] <> $00 THEN
  BEGIN
    ASM;
               CLD
               MOV   ES,WORD PTR ATOMMEMSEG
               MOV   SI,OFFSET LEENDERTS_FPROM_DAT
               MOV   DI,$D000
               MOV   CX,LEENDERTS_FPROM_SIZE
               REPZ
               MOVSB
    END;
    GETMEM (P,SIZEOF(FPPC_DAT)+$0010);
    B := SEG(P^);
    IF OFS(P^) <> $0000 THEN INC (B);
    MOVE (FPPC_DAT,MEM[B:$0000],SIZEOF(FPPC_DAT));
    ASM;
               MOV   WORD PTR FPPC_ADDR[CS:$00],$0000
               MOV   AX,WORD PTR B
               MOV   WORD PTR FPPC_ADDR[CS:$02],AX
    END;
  END;
  DUMMY := IORESULT;
  ASSIGN (FROMF,EXTROMFILE);
  RESET (FROMF,1);
  IF IORESULT = 0 THEN
  BEGIN
    B := 0;
    WHILE (B < 16) AND (NOT EOF(FROMF)) DO
    BEGIN
      BLOCKREAD (FROMF,ATMHEADER,SIZEOF(ATMHEADER),NR);
      IF (IORESULT = 0) AND (NR=$16) THEN
      BEGIN
        IF (ATMHEADER.STARTADRS = $A000) AND (ATMHEADER.DATASIZE = $1000) THEN
        BEGIN
          MOVE (ATMHEADER.ATMNAME,BOXNAMES[B],$10);
          P := PTR (ATOMMEMSEG+$1000,B*$1000);
          BLOCKREAD (FROMF,P^,$1000,NR);
          IF (MEM[CSEG:OFS(LEENDERTSROM)] <> 0) AND (BOXNAMES[B] = PCHARMESTR) THEN
          BEGIN
            ASM;
               {---initialize the P-Charme for Leendert's FP-ROM---}
               PUSH  DS
               MOV   AX,WORD PTR ATOMMEMSEG
               MOV   DS,AX
               MOV   BH,BYTE PTR B
               MOV   BL,$00
               ADD   AX,BX
               ADD   AX,$1000-$0A00
               MOV   ES,AX {segment of p-charme, when offset = A000h}
               MOV   SI,$DEF0
               MOV   AX,WORD PTR [SI]
               MOV   WORD PTR [CS:ABLOKSPRONG],AX
               MOV   AX,WORD PTR [SI+$02]
               MOV   WORD PTR [ES:$A591+1],AX
               MOV   WORD PTR [ES:$A66E+1],AX
               SUB   AX,$000A
               MOV   WORD PTR [ES:$A79A+1],AX
               SUB   AX,$003C-$000A
               MOV   WORD PTR [ES:$A9D4+1],AX
               SUB   AX,$0015-$003C
               MOV   WORD PTR [ES:$AB07+1],AX
               MOV   WORD PTR [ES:$AB25+1],AX
               MOV   AX,WORD PTR [SI+$04]
               MOV   WORD PTR [ES:$A598+1],AX
               MOV   WORD PTR [ES:$AB1F+1],AX
               SUB   AX,$0007
               MOV   WORD PTR [ES:$A9C8+1],AX
               MOV   AX,WORD PTR [SI+$06]
               MOV   WORD PTR [ES:$A952+1],AX
               MOV   AX,WORD PTR [SI+$08]
               MOV   WORD PTR [ES:$AB04+1],AX
               ADD   AX,$0061
               MOV   WORD PTR [ES:$AB19+1],AX
               MOV   AX,WORD PTR [SI+$0A]
               MOV   WORD PTR [ES:$AB22+1],AX
               MOV   AX,WORD PTR [SI+$0C]
               MOV   WORD PTR [ES:$AD86+1],AX
               MOV   AX,WORD PTR [SI+$0E]
               MOV   WORD PTR [ES:$AF09+1],AX
               MOV   AX,WORD PTR [SI+$10]
               MOV   WORD PTR [ES:$AF10+1],AX
               POP   DS
            END;
          END;
          INC (B);
        END ELSE
        BEGIN
          SEEK (FROMF,FILEPOS(FROMF)+LONGINT(ATMHEADER.DATASIZE));
          NR := $1000;
        END;
      END ELSE
      BEGIN
        NR := 0;
      END;
      IF NR <> $1000 THEN
      BEGIN
        WRITELN ('Error while loading extension ROMs.');
        CLOSE (FROMF);
        HALT (1);
      END;
    END;
    CLOSE (FROMF);
    {---load EPROM box 0 into Atom memory---}
    P := PTR (ATOMMEMSEG+$1000,$0000);
    Q := PTR (ATOMMEMSEG,$A000);
    MOVE (P^,Q^,$1000);
  END ELSE
  BEGIN
    WRITELN ('No extension ROMs loaded.');
    {---only AXR1 available---}
    P := PTR (ATOMMEMSEG,$A000);
    Q := PTR (ATOMMEMSEG+$1000,$0000);
    MOVE (P^,Q^,$1000);
    BOXNAMES[0,0] := 'A';
    BOXNAMES[0,1] := 'X';
    BOXNAMES[0,2] := 'R';
    BOXNAMES[0,3] := '1';
  END;
END;
{---[writeinifile]----------------------------------------------------------}
PROCEDURE WRITEINIFILE;
VAR F:TEXT;
    B:BYTE;
    W:WORD;
    S:STRING[6];
    DUMMY:INTEGER;
BEGIN
  DUMMY := IORESULT;
  ASSIGN (F,'ATOM.INI');
  REWRITE (F);
  IF IORESULT <> 0 THEN EXIT;
  WRITELN (F,'[Config]');
  B := MEM[CSEG:OFS(ASMLAYOUT)];
  IF B > 0 THEN B := 1;
  WRITELN (F,'ASMLayout=',B);
  B := MEM[CSEG:OFS(SOUNDOUTPUT)];
  IF B > 0 THEN B := 1;
  WRITELN (F,'Sound=',B);
  W := MEMW[CSEG:OFS(WACHTCONST)];
  WRITE (F,'SpeedIndex=');
  IF W > 0 THEN WRITELN (F,W)
           ELSE WRITELN (F);
  WRITELN (F,'ExtROMFile=',EXTROMFILE);
  B := MEM[CSEG:OFS(LEENDERTSROM)];
  IF B > 0 THEN B := 1;
  WRITELN (F,'Use80x87=',B);
  WRITELN (F);
  WRITELN (F,'[Emulation]');
  B := MEM[CSEG:OFS(IGNOREzpFEh)];
  IF B > 0 THEN B := 1;
  WRITELN (F,'IgnoreZpFEh=',B);
  B := MEM[CSEG:OFS(BOXSWITCH)];
  IF B > 0 THEN B := 1;
  WRITELN (F,'BoxSwitch=',B);
  B := MEM[CSEG:OFS(BOX0ONBREAK)];
  IF B > 0 THEN B := 1;
  WRITELN (F,'Box0onBreak=',B);
  B := MEM[CSEG:OFS(NMIRESPONSE)];
  IF B < 15 THEN B := 15;
  WRITELN (F,'NMIResponse=',B);
  WRITELN (F);
  WRITELN (F,'[Colors]');
  S := '';
  FOR B := 0 TO 2 DO
    S := S + HEX(MEM[CSEG:OFS(EMULCOLORS)+0*3+B]);
  WRITELN (F,'BackGr=',S);
  S := '';
  FOR B := 0 TO 2 DO
    S := S + HEX(MEM[CSEG:OFS(EMULCOLORS)+1*3+B]);
  WRITELN (F,'ForeGr=',S);
  S := '';
  FOR B := 0 TO 2 DO
    S := S + HEX(MEM[CSEG:OFS(EMULCOLORS)+2*3+B]);
  WRITELN (F,'GreySb=',S);
  S := '';
  FOR B := 0 TO 2 DO
    S := S + HEX(MEM[CSEG:OFS(EMULCOLORS)+3*3+B]);
  WRITELN (F,'Color0=',S);
  S := '';
  FOR B := 0 TO 2 DO
    S := S + HEX(MEM[CSEG:OFS(EMULCOLORS)+4*3+B]);
  WRITELN (F,'Color1=',S);
  S := '';
  FOR B := 0 TO 2 DO
    S := S + HEX(MEM[CSEG:OFS(EMULCOLORS)+5*3+B]);
  WRITELN (F,'Color2=',S);
  S := '';
  FOR B := 0 TO 2 DO
    S := S + HEX(MEM[CSEG:OFS(EMULCOLORS)+6*3+B]);
  WRITELN (F,'Color3=',S);
  WRITELN (F);
  WRITELN (F,'[Disk]');
  FOR B := 0 TO 3 DO
  BEGIN
    WRITE (F,'Drive',B,'=');
    IF DISKETTENAMES[B] <> '' THEN WRITE (F,DISKETTENAMES[B],'.DSK');
    WRITELN (F);
  END;
  CLOSE (F);
END;
{---[outbyte (output byte to dsp)]------------------------------------------}
PROCEDURE OUTBYTE; ASSEMBLER;
ASM;
               MOV   AH,AL
@OUTB1:        IN    AL,DX
               OR    AL,AL
               JS    @OUTB1
               MOV   AL,AH
               OUT   DX,AL
END;
{---[sbsound]---------------------------------------------------------------}
PROCEDURE SBSOUND; ASSEMBLER;
ASM;
               PUSH  DS
               PUSH  DX
               MOV   AX,SEG IOPORT
               MOV   DS,AX
               MOV   DX,WORD PTR IOPORT
               ADD   DL,$0C
               MOV   AL,$10
               CALL  OUTBYTE
               MOV   AL,BYTE PTR @SOUNDBYTE
               CALL  OUTBYTE
               XOR   BYTE PTR @SOUNDBYTE,11000000b
               POP   DX
               POP   DS
               RETN
@SOUNDBYTE:    DB    01100000b
END;
{---[errorsnd]--------------------------------------------------------------}
PROCEDURE ERRORSND; ASSEMBLER;
ASM;
               PUSH  DS
               PUSH  DX
               MOV   DX,WORD PTR IOPORT
               ADD   DL,$0C
               MOV   DS,WORD PTR ATOMMEMSEG
               MOV   CX,$0800
@ERRORSND3:    PUSH  CX
@ERRORSND2:    MOV   AX,WORD PTR PCWAITTABLE[CS:$0002]
@ERRORSND1:    DEC   AX
               JNZ   @ERRORSND1
               LOOP  @ERRORSND2
               CMP   DX,+$0C
               JNZ   @ERRORSND4
               IN    AL,$61
               XOR   AL,$02
               OUT   $61,AL
               JMP   @ERRORSND5
@ERRORSND4:    CALL  SBSOUND
@ERRORSND5:    POP   CX
               SUB   CX,+$10
               CMP   CX,$0020
               JAE   @ERRORSND3
               POP   DX
               POP   DS
END;
{---[fouterrorsnd]----------------------------------------------------------}
PROCEDURE FOUTERRORSND; ASSEMBLER;
ASM;
               PUSH  DS
               PUSH  BX
               PUSH  DX
               MOV   BL,$03
@ERRORSND6:    MOV   DX,WORD PTR IOPORT
               ADD   DL,$0C
               MOV   DS,WORD PTR ATOMMEMSEG
               MOV   CX,$0040
@ERRORSND3:    PUSH  CX
@ERRORSND2:    MOV   AX,WORD PTR PCWAITTABLE[CS:$0002]
@ERRORSND1:    DEC   AX
               JNZ   @ERRORSND1
               LOOP  @ERRORSND2
               CMP   DX,+$0C
               JNZ   @ERRORSND4
               IN    AL,$61
               XOR   AL,$02
               OUT   $61,AL
               JMP   @ERRORSND5
@ERRORSND4:    CALL  SBSOUND
@ERRORSND5:    POP   CX
               ADD   CX,+$20
               CMP   CX,$0700
               JB    @ERRORSND3
               DEC   BL
               JNZ   @ERRORSND6
               POP   DX
               POP   BX
               POP   DS
END;
{---[makewider; AL=byte; return: AX=word]-----------------------------------}
PROCEDURE MAKEWIDER; ASSEMBLER;
ASM;
               PUSH  BX
               MOV   BL,AL
               SUB   AX,AX
               MOV   BH,$08
@MAKEW1:       SHL   BL,1
               JNC   @MAKEW2
               RCL   AX,1
               STC
               RCL   AX,1
               JMP   @MAKEW3
@MAKEW2:       SHL   AX,2
@MAKEW3:       DEC   BH
               JNZ   @MAKEW1
               POP   BX
END;
{---[initialize]------------------------------------------------------------}
PROCEDURE INITIALIZE;
CONST EMUDETECT : ARRAY[0..64] OF CHAR =
        'ACORN ATOM EMULATOR V1.32 (C) BYWOUTER RAS, DELFT, OCT''97-MAY''98'+#$0D;
VAR I:WORD;
BEGIN
  {---reset dsp---}
  ASM;
               MOV   WORD PTR IOPORT,$0210
  @RESDSP7:    MOV   DX,WORD PTR IOPORT
               ADD   DL,$06
               MOV   AL,$01
               OUT   DX,AL
               MOV   CX,$0400
  @RESDSP1:    LOOP  @RESDSP1
               MOV   AL,$00
               OUT   DX,AL
               MOV   BL,$10
  @RESDSP3:    MOV   DX,WORD PTR IOPORT
               ADD   DL,$0E
               MOV   CX,$0100
  @RESDSP2:    IN    AL,DX
               TEST  AL,$80
               JNZ   @RESDSP4
               LOOP  @RESDSP2
               JMP   @RESDSP5
  @RESDSP4:    SUB   DL,$04
               IN    AL,DX
               CMP   AL,$AA
               JZ    @RESDSP6
               DEC   BL
               JNZ   @RESDSP3
  @RESDSP5:    ADD   WORD PTR IOPORT,+$10
               CMP   WORD PTR IOPORT,$0270
               JBE   @RESDSP7
               MOV   WORD PTR IOPORT,$0000
  @RESDSP6:
  END;
  IF IOPORT <> 0 THEN
  BEGIN
    WRITELN ('SoundBlaster found at port ',HEXW(IOPORT),'h.');
  END ELSE
  BEGIN
    WRITELN ('No SoundBlaster detected. Sound output set to PC-speaker.');
  END;
  WRITELN ('Allocating Atom memory.');
  GETMEM (ATOMMEM1,$FFF8);
  GETMEM (ATOMMEM2,$FFF8);
  GETMEM (ATOMMEM3,$0200);
  ATOMMEMSEG := SEG(ATOMMEM1^);
  IF OFS(ATOMMEM1^) <> $0000 THEN INC (ATOMMEMSEG);
  GETMEM (FINBUF,SIZEOF(FINBUFTYPE));
  FINBUFOFS := OFS(FINBUF^);
  FINBUFSEG := SEG(FINBUF^);
  FINSIZE := 0;
  FOUTOPEN := 0;
  GETMEM (FOUTBUF,SIZEOF(FOUTBUFTYPE));
  FOUTBUFOFS := OFS(FOUTBUF^);
  FOUTBUFSEG := SEG(FOUTBUF^);
  ASM;
               CLD
               MOV   WORD PTR [CS:DATASEG],DS
               {---clear extROMmem---}
               SUB   AX,AX
               SUB   DI,DI
               MOV   BX,WORD PTR ATOMMEMSEG
               ADD   BX,$1000
               MOV   ES,BX
               MOV   CX,$8000
               REPZ
               STOSW
               MOV   BX,ES
               ADD   BX,$1000
               MOV   ES,BX
               MOV   CX,$0140/2
               REPZ
               STOSW
               {---clear atom memory---}
               SUB   DI,DI
               MOV   ES,WORD PTR ATOMMEMSEG
               MOV   CX,$8000
               REPZ
               STOSW
               {---store EMU detection---}
               MOV   SI,OFFSET EMUDETECT
               MOV   DI,$BF80
               MOV   CX,+65
               REPZ
               MOVSB
               {---store atom rom memory---}
               MOV   SI,OFFSET ATOMROMMEM
               MOV   DI,$A000
               MOV   CX,$0800
               REPZ
               MOVSW
               MOV   DI,$C000
               MOV   CX,$2000
               REPZ
               MOVSW
               {---store random seed---}
               PUSHF
               PUSHA
               MOV   AH,$2C
               INT   $21
               XOR   CL,CH
               ROL   CL,4
               ADD   DH,CL
               MOV   WORD PTR [ES:$0008],DX
               MOV   AX,DX
               AND   CX,$00FF
               MUL   CX
               MOV   WORD PTR [ES:$000A],AX
               MOV   BYTE PTR [ES:$000C],DL
               POPA
               POPF
               {---make graphtables---}
               SUB   DI,DI
               MOV   BL,$00
  @INIT2:      MOV   AL,BL
               CALL  MAKEWIDER
               MOV   BYTE PTR MONOGRAPHTABLE[DI    ],AH
               MOV   BYTE PTR MONOGRAPHTABLE[DI+$01],$00
               MOV   WORD PTR MONOGRAPHTABLE[DI+$02],$0000
               MOV   BYTE PTR MONOGRAPHTABLE[DI+$04],AL
               MOV   BYTE PTR MONOGRAPHTABLE[DI+$05],$00
               MOV   WORD PTR MONOGRAPHTABLE[DI+$06],$0000
               MOV   BYTE PTR GREYGRAPHTABLE[DI    ],$00
               MOV   BYTE PTR GREYGRAPHTABLE[DI+$01],AH
               MOV   WORD PTR GREYGRAPHTABLE[DI+$02],$0000
               MOV   BYTE PTR GREYGRAPHTABLE[DI+$04],$00
               MOV   BYTE PTR GREYGRAPHTABLE[DI+$05],AL
               MOV   WORD PTR GREYGRAPHTABLE[DI+$06],$0000
               ADD   DI,+$08
               INC   BL
               JNZ   @INIT2
               SUB   DI,DI
               MOV   BL,$00
  @INIT3:      MOV   WORD PTR COLORGRAPHTABLE[DI    ],+$00
               MOV   WORD PTR COLORGRAPHTABLE[DI+$02],+$00
               MOV   WORD PTR COLORGRAPHTABLE[DI+$04],+$00
               MOV   WORD PTR COLORGRAPHTABLE[DI+$06],+$00
               MOV   AL,BL
               MOV   CX,$0004
  @INIT8:      MOV   AH,$00
               SHL   AX,2
               CMP   AH,$00
               JNZ   @INIT4
               OR    BYTE PTR COLORGRAPHTABLE[DI+$04],$0F
               OR    BYTE PTR COLORGRAPHTABLE[DI+$05],$0F
               JMP   @INIT7
  @INIT4:      CMP   AH,$01
               JNZ   @INIT5
               OR    BYTE PTR COLORGRAPHTABLE[DI+$06],$0F
               JMP   @INIT7
  @INIT5:      CMP   AH,$02
               JNZ   @INIT6
               OR    BYTE PTR COLORGRAPHTABLE[DI+$04],$0F
               OR    BYTE PTR COLORGRAPHTABLE[DI+$06],$0F
               JMP   @INIT7
  @INIT6:      OR    BYTE PTR COLORGRAPHTABLE[DI+$05],$0F
               OR    BYTE PTR COLORGRAPHTABLE[DI+$06],$0F
  @INIT7:      CMP   CX,+$01
               JZ    @INIT10
               PUSH  CX
               MOV   CX,$0004
  @INIT9:      SHL   BYTE PTR COLORGRAPHTABLE[DI+$04],1
               RCL   BYTE PTR COLORGRAPHTABLE[DI    ],1
               SHL   BYTE PTR COLORGRAPHTABLE[DI+$05],1
               RCL   BYTE PTR COLORGRAPHTABLE[DI+$01],1
               SHL   BYTE PTR COLORGRAPHTABLE[DI+$06],1
               RCL   BYTE PTR COLORGRAPHTABLE[DI+$02],1
               SHL   BYTE PTR COLORGRAPHTABLE[DI+$07],1
               RCL   BYTE PTR COLORGRAPHTABLE[DI+$03],1
               LOOP  @INIT9
               POP   CX
               LOOP  @INIT8
  @INIT10:     ADD   DI,+$08
               INC   BL
               JNZ   @INIT3
  END;
  FOUTNAME := '';
END;
{---[timer (for determining the CPU speed)]---------------------------------}
PROCEDURE TIMER;
LABEL 1;
VAR P:POINTER;
    POFS,PSEG:WORD;
    T:LONGINT;
    W:WORD;
    I:BYTE;
BEGIN
  IF MEMW[CSEG:OFS(WACHTCONST)] <> 0 THEN
  BEGIN
    W := MEMW[CSEG:OFS(WACHTCONST)];
    GOTO 1;
  END;
  WRITE ('Determining CPU-speed. ');
  GETMEM (P,$FFF8);
  POFS := OFS(P^);
  PSEG := SEG(P^);
  T := 0;
  FOR I := 1 TO 20 DO
  BEGIN
    ASM;
               MOV   DI,WORD PTR POFS
               MOV   WORD PTR @SUBR[$00],DI
               MOV   ES,WORD PTR PSEG
               MOV   WORD PTR @SUBR[$02],ES
               CLD
               MOV   AX,$F8F8
               MOV   CX,$FFF0/2
               REPZ
               STOSW
               MOV   AL,$CB
               STOSB
               NOP
               IN    AL,$61
               PUSH  AX
               CLI
               AND   AL,$FE
               OUT   $61,AL
               MOV   AL,$B2
               OUT   $43,AL
               MOV   AL,$00
               OUT   $42,AL
               OUT   $42,AL
               IN    AL,$61
               OR    AL,$01
               AND   AL,$FD
               OUT   $61,AL
               MOV   CX,$0003
    @TIMER2:   NOP
               DB    $2E,$FF,$1E
               DW    OFFSET @SUBR
               NOP
               LOOP  @TIMER2
               IN    AL,$61
               AND   AL,$FE
               OUT   $61,AL
               MOV   AL,$B0
               OUT   $43,AL
               IN    AL,$42
               MOV   AH,AL
               IN    AL,$42
               XCHG  AL,AH
               NEG   AX
               MOV   WORD PTR W,AX
               POP   AX
               OUT   $61,AL
               STI
               JMP   @TIMER1
    @SUBR:     DD    $00000000
    @TIMER1:
    END;
    INC (T,LONGINT(W));
  END;
  FREEMEM (P,$FFF8);
  T := T DIV 20; {P120: 3839}
  W := 460680 DIV T;
1:ASM;
               MOV   AX,WORD PTR W
               MOV   BX,AX
    @TIMER5:   SUB   BX,+33
               JC    @TIMER4
               INC   AX
               JMP   @TIMER5
    @TIMER4:   MOV   WORD PTR PCWAITTABLE[CS:$0002],AX
               MOV   DI,$0004
               MOV   CX,$0002
    @TIMER3:   MOV   AX,WORD PTR PCWAITTABLE[CS:$0002]
               MUL   CX
               MOV   WORD PTR PCWAITTABLE[CS:DI],AX
               ADD   DI,+$02
               INC   CX
               CMP   CX,+$08
               JBE   @TIMER3
  END;
  WRITELN ('SpeedIndex set to ',MEMW[CSEG:OFS(PCWAITTABLE)+2],'.');
END;
{---[graphmode]-------------------------------------------------------------}
PROCEDURE GRAPHMODE; ASSEMBLER;
ASM;
               DB    $00 {00=0;01=1;02=2;03=3;04=4;05=1a;06=2a;07=3a;08=4a}
END;
{---[programcnt (word)]-----------------------------------------------------}
PROCEDURE PROGRAMCNT; ASSEMBLER;
ASM;
               DB    $00
END;
{---[stackpointer (word)]---------------------------------------------------}
PROCEDURE STACKPOINTER; ASSEMBLER;
ASM;
               DB    $00
END;
{---[accu_b (byte)]---------------------------------------------------------}
PROCEDURE ACCU_B; ASSEMBLER;
ASM;
END;
{---[accumulator (byte)]----------------------------------------------------}
PROCEDURE ACCUMULATOR; ASSEMBLER;
ASM;
END;
{---[flagregister (byte)]---------------------------------------------------}
PROCEDURE FLAGREGISTER; ASSEMBLER;
ASM;
END;
{---[xregister (byte)]------------------------------------------------------}
PROCEDURE XREGISTER; ASSEMBLER;
ASM;
END;
{---[yregister (byte)]------------------------------------------------------}
PROCEDURE YREGISTER; ASSEMBLER;
ASM;
END;
{---[t2l_l (VIA timer 2 low latch register)]--------------------------------}
PROCEDURE T2L_L; ASSEMBLER;
ASM;
END;
{---[mousenr]---------------------------------------------------------------}
PROCEDURE MOUSENR; ASSEMBLER;
ASM;
END;
{---[mousebackgrpos (word)]-------------------------------------------------}
PROCEDURE MOUSEBACKGRPOS; ASSEMBLER;
ASM;
               DB    $00
END;
{---[irqdelay (VIA interrupt delay count)]----------------------------------}
PROCEDURE IRQDELAY; ASSEMBLER;
ASM;
END;
{---[nmidelay]--------------------------------------------------------------}
PROCEDURE NMIDELAY; ASSEMBLER;
ASM;
END;
{---[graphtop (depending on graphics mode)]---------------------------------}
PROCEDURE GRAPHTOP; ASSEMBLER;
ASM;
               DW    $8200
               DW    $8400
               DW    $8600
               DW    $8C00
               DW    $9800
               DW    $8400
               DW    $8800
               DW    $8C00
               DW    $9800
END;
{---[brkpnton (bit 7 reserved for TRACE/STEP/HERE)]-------------------------}
PROCEDURE BRKPNTON; ASSEMBLER;
ASM;
               DB    $00
END;
{---[brkpnts]---------------------------------------------------------------}
PROCEDURE BRKPNTS; ASSEMBLER;
ASM;
               DW    $0000
               DW    $0000
               DW    $0000
               DW    $0000
END;
{---[aantboxret (byte)]-----------------------------------------------------}
PROCEDURE AANTBOXRET; ASSEMBLER; {---max.20h---}
ASM;
               DB    $00
END;
{---[boxreturns]------------------------------------------------------------}
PROCEDURE BOXRETURNS; ASSEMBLER;
ASM;
               DW    $0000,$0000,$0000,$0000
               DW    $0000,$0000,$0000,$0000
               DW    $0000,$0000,$0000,$0000
               DW    $0000,$0000,$0000,$0000
               DW    $0000,$0000,$0000,$0000
               DW    $0000,$0000,$0000,$0000
               DW    $0000,$0000,$0000,$0000
               DW    $0000,$0000,$0000,$0000
END;
{---[boxinfo]---------------------------------------------------------------}
PROCEDURE BOXINFO; ASSEMBLER;
ASM;
               PUSH  DS
               PUSHA
               MOV   BH,BYTE PTR [SCHAKELBYTE]
               AND   BH,$0F
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   BYTE PTR [CS:CURSORX],+9
               MOV   BYTE PTR [CS:CURSORY],+1
               MOV   BL,$09
               MOV   AL,01000101b
               CALL  PRINTCHAR
               MOV   CX,+21
               MOV   AL,01001100b
@BOXINF1:      CALL  PRINTCHAR
               LOOP  @BOXINF1
               MOV   AL,01001010b
               CALL  PRINTCHAR
               MOV   DL,$00
@BOXINF2:      MOV   BYTE PTR [CS:CURSORX],+9
               MOV   AL,DL
               ADD   AL,$02
               MOV   BYTE PTR [CS:CURSORY],AL
               MOV   AL,01010101b
               CALL  PRINTCHAR
               MOV   CX,+21
               MOV   AL,' '
@BOXINF3:      CALL  PRINTCHAR
               LOOP  @BOXINF3
               MOV   AL,01101010b
               CALL  PRINTCHAR
               INC   DL
               CMP   DL,$10
               JB    @BOXINF2
               MOV   BYTE PTR [CS:CURSORX],+9
               MOV   BYTE PTR [CS:CURSORY],+18
               MOV   AL,01010100b
               CALL  PRINTCHAR
               MOV   CX,+21
               MOV   AL,01001100b
@BOXINF8:      CALL  PRINTCHAR
               LOOP  @BOXINF8
               MOV   AL,01101000b
               CALL  PRINTCHAR
               MOV   DL,$00
@BOXINF4:      MOV   BL,$0E
               CMP   BH,DL
               JNZ   @BOXINF7
               MOV   BL,$0F
@BOXINF7:      MOV   BYTE PTR [CS:CURSORX],+11
               MOV   AL,DL
               ADD   AL,$02
               MOV   BYTE PTR [CS:CURSORY],AL
               MOV   AL,DL
               ADD   AL,'0'
               CMP   AL,'9'
               JBE   @BOXINF9
               ADD   AL,$07
               AND   AL,$3F
@BOXINF9:      CALL  PRINTCHAR
               MOV   AL,':'
               CALL  PRINTCHAR
               INC   BYTE PTR [CS:CURSORX]
               MOV   SI,DX
               AND   SI,$000F
               SHL   SI,4
               ADD   SI,OFFSET BOXNAMES
               MOV   CX,$0010
@BOXINF5:      LODSB
               AND   AL,$3F
               JZ    @BOXINF6
               CALL  PRINTCHAR
               LOOP  @BOXINF5
@BOXINF6:      INC   DL
               CMP   DL,$10
               JB    @BOXINF4
               POPA
               POP   DS
END;
{---[atomseg (word)]--------------------------------------------------------}
PROCEDURE ATOMSEG; ASSEMBLER;
ASM;
               DB    $00
END;
{---[tapescreen (byte)]-----------------------------------------------------}
PROCEDURE TAPESCREEN; ASSEMBLER;
ASM;
               DB    $00
END;
{---[putbyte_part2]---------------------------------------------------------}
PROCEDURE PUTBYTE_PART2; ASSEMBLER;
ASM;
               TEST  BYTE PTR [CS:MOUSENR],$80
               JNZ   @PUTBYTE1
               MOV   AX,DI
               SUB   AX,WORD PTR [CS:MOUSEBACKGRPOS]
               JC    @PUTBYTE1
               CMP   AX,$07F0
               JAE   @PUTBYTE1
               MOV   BX,AX
               SHR   AX,4
               PUSH  CX
               MOV   CL,$12
               DIV   CL
               POP   CX
               OR    AH,AH
               JNZ   @PUTBYTE1
               {---under mousecursor---}
               AND   BX,$0008
               SHL   AX,4
               ADD   BX,AX
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR [SI]
               MOV   WORD PTR MOUSEBACKGROUND[BX],AX
               OR    AX,WORD PTR MOUSEPOINTER[BX]
               MOV   WORD PTR [ES:DI],AX
               MOV   AX,WORD PTR [SI+2]
               MOV   WORD PTR MOUSEBACKGROUND[BX+2],AX
               OR    AX,WORD PTR MOUSEPOINTER[BX+2]
               MOV   WORD PTR [ES:DI+2],AX
               MOV   AX,WORD PTR [SI+4]
               MOV   WORD PTR MOUSEBACKGROUND[BX+4],AX
               OR    AX,WORD PTR MOUSEPOINTER[BX+4]
               MOV   WORD PTR [ES:DI+4],AX
               MOV   AX,WORD PTR [SI+6]
               MOV   WORD PTR MOUSEBACKGROUND[BX+6],AX
               OR    AX,WORD PTR MOUSEPOINTER[BX+6]
               MOV   WORD PTR [ES:DI+6],AX
               RETN
@PUTBYTE1:     MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR [SI]
               MOV   WORD PTR [ES:DI],AX
               MOV   AX,WORD PTR [SI+2]
               MOV   WORD PTR [ES:DI+2],AX
               MOV   AX,WORD PTR [SI+4]
               MOV   WORD PTR [ES:DI+4],AX
               MOV   AX,WORD PTR [SI+6]
               MOV   WORD PTR [ES:DI+6],AX
END;
{---[putmode0byte; AL=byte; AH=00:white/01:grey; DI=screenpos]--------------}
PROCEDURE PUTMODE0BYTE; ASSEMBLER;
ASM;
@PUTMODE0BYTE: PUSH  DS
               PUSH  SI
               PUSH  BX
               PUSH  DI
               PUSH  AX
               MOV   SI,AX
               AND   SI,$00FF
               SHL   SI,3
               OR    AH,AH
               JNZ   @PUTMODE0_1
               ADD   SI,OFFSET MONOGRAPHTABLE
               JMP   @PUTMODE0_2
@PUTMODE0_1:   ADD   SI,OFFSET GREYGRAPHTABLE
@PUTMODE0_2:   CALL  PUTBYTE_PART2
               POP   AX
               POP   DI
               POP   BX
               POP   SI
               POP   DS
END;
{---[putmonobyte; AL=byte; DI=screenpos]------------------------------------}
PROCEDURE PUTMONOBYTE; ASSEMBLER;
ASM;
               PUSH  DS
               PUSH  SI
               PUSH  BX
               PUSH  DI
               PUSH  AX
               MOV   SI,AX
               AND   SI,$00FF
               SHL   SI,3
               ADD   SI,OFFSET MONOGRAPHTABLE
               CALL  PUTBYTE_PART2
               POP   AX
               POP   DI
               POP   BX
               POP   SI
               POP   DS
END;
{---[putmonoword; AX=word; DI=screenpos]------------------------------------}
PROCEDURE PUTMONOWORD; ASSEMBLER;
ASM;
               PUSH  DS
               PUSH  SI
               PUSH  BX
               PUSH  DI
               PUSH  AX
               MOV   SI,AX
               AND   SI,$00FF
               SHL   SI,3
               ADD   SI,OFFSET MONOGRAPHTABLE
               CALL  PUTBYTE_PART2
               POP   AX
               POP   DI
               PUSH  DI
               PUSH  AX
               ADD   DI,+$08
               MOV   AL,AH
               MOV   SI,AX
               AND   SI,$00FF
               SHL   SI,3
               ADD   SI,OFFSET MONOGRAPHTABLE
               CALL  PUTBYTE_PART2
               POP   AX
               POP   DI
               POP   BX
               POP   SI
               POP   DS
END;
{---[putcolorbyte; AL=byte; DI=screenpos]-----------------------------------}
PROCEDURE PUTCOLORBYTE; ASSEMBLER;
ASM;
               PUSH  DS
               PUSH  SI
               PUSH  BX
               PUSH  DI
               PUSH  AX
               MOV   SI,AX
               AND   SI,$00FF
               SHL   SI,3
               ADD   SI,OFFSET COLORGRAPHTABLE
               CALL  PUTBYTE_PART2
               POP   AX
               POP   DI
               POP   BX
               POP   SI
               POP   DS
END;
{---[putcolorword; AX=word; DI=screenpos]-----------------------------------}
PROCEDURE PUTCOLORWORD; ASSEMBLER;
ASM;
               PUSH  DS
               PUSH  SI
               PUSH  BX
               PUSH  DI
               PUSH  AX
               MOV   SI,AX
               AND   SI,$00FF
               SHL   SI,3
               ADD   SI,OFFSET COLORGRAPHTABLE
               CALL  PUTBYTE_PART2
               POP   AX
               POP   DI
               PUSH  DI
               PUSH  AX
               ADD   DI,+$08
               MOV   AL,AH
               MOV   SI,AX
               AND   SI,$00FF
               SHL   SI,3
               ADD   SI,OFFSET COLORGRAPHTABLE
               CALL  PUTBYTE_PART2
               POP   AX
               POP   DI
               POP   BX
               POP   SI
               POP   DS
END;
{---[updatem0]--------------------------------------------------------------}
PROCEDURE UPDATEM0; ASSEMBLER;
ASM;
               PUSHF
               ADD   WORD PTR [PCCYCLES],+750
               CLI
               PUSH  DS
               PUSH  SI
               MOV   AH,$00
               MOV   AL,BYTE PTR [DI]
               CMP   AL,$C0
               JB    @UPDM0_1
               {---grey graphics symbols---}
               AND   AL,$7F
               MOV   AH,$01
@UPDM0_1:      PUSH  AX
               PUSH  AX
               MOV   AX,DI
               PUSH  AX
               AND   AX,$01E0
               SHL   AX,2
               MOV   DI,AX
               SHL   AX,1
               ADD   DI,AX
               SHL   AX,2
               ADD   DI,AX
               SHL   AX,1
               ADD   DI,AX
               POP   AX
               AND   AX,$001F
               SHL   AX,3
               ADD   AX,$0140
               ADD   DI,AX
               POP   AX
               MOV   AH,$00
               SHL   AX,4
               ADD   AX,OFFSET CHARDATA
               MOV   SI,AX
               MOV   DS,WORD PTR [CS:DATASEG]
               POP   AX
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CALL  PUTMODE0BYTE
               ADD   DI,$0120
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CALL  PUTMODE0BYTE
               ADD   DI,$0120
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CALL  PUTMODE0BYTE
               ADD   DI,$0120
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CALL  PUTMODE0BYTE
               ADD   DI,$0120
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CALL  PUTMODE0BYTE
               ADD   DI,$0120
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CALL  PUTMODE0BYTE
               ADD   DI,$0120
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CALL  PUTMODE0BYTE
               ADD   DI,$0120
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CALL  PUTMODE0BYTE
               ADD   DI,$0120
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CALL  PUTMODE0BYTE
               ADD   DI,$0120
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CALL  PUTMODE0BYTE
               ADD   DI,$0120
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CALL  PUTMODE0BYTE
               ADD   DI,$0120
               MOV   AL,BYTE PTR [SI]
               CALL  PUTMODE0BYTE
               POP   SI
               POP   DS
               POPF
END;
{---[updatem1]--------------------------------------------------------------}
PROCEDURE UPDATEM1; ASSEMBLER;
ASM;
               PUSHF
               CLI
               ADD   WORD PTR [PCCYCLES],+337
               PUSH  BX
               MOV   BL,BYTE PTR [DI]
               PUSH  DI
               AND   DI,$03F0
               SHL   DI,1
               MOV   AX,DI
               SHL   AX,1
               ADD   DI,AX
               SHL   AX,2
               ADD   DI,AX
               SHL   AX,1
               ADD   DI,AX
               POP   AX
               AND   AX,$000F
               SHL   AX,4
               ADD   AX,$0140
               ADD   DI,AX
               MOV   BH,$00
               SHL   BX,1
               MOV   AX,WORD PTR WIDERTABLE[CS:BX]
               CALL  PUTMONOWORD
               ADD   DI,$0120
               CALL  PUTMONOWORD
               ADD   DI,$0120
               CALL  PUTMONOWORD
               POP   BX
               POPF
END;
{---[updatem1a]-------------------------------------------------------------}
PROCEDURE UPDATEM1a; ASSEMBLER;
ASM;
               PUSHF
               CLI
               ADD   WORD PTR [PCCYCLES],+310
               PUSH  BX
               MOV   BL,BYTE PTR [DI]
               PUSH  DI
               AND   DI,$03F0
               SHL   DI,1
               MOV   AX,DI
               SHL   AX,1
               ADD   DI,AX
               SHL   AX,2
               ADD   DI,AX
               SHL   AX,1
               ADD   DI,AX
               POP   AX
               AND   AX,$000F
               SHL   AX,4
               ADD   AX,$0140
               ADD   DI,AX
               MOV   BH,$00
               SHL   BX,1
               MOV   AX,WORD PTR WIDER1aTABLE[CS:BX]
               CALL  PUTCOLORWORD
               ADD   DI,$0120
               CALL  PUTCOLORWORD
               ADD   DI,$0120
               CALL  PUTCOLORWORD
               POP   BX
               POPF
END;
{---[updatem2]--------------------------------------------------------------}
PROCEDURE UPDATEM2; ASSEMBLER;
ASM;
               PUSHF
               CLI
               ADD   WORD PTR [PCCYCLES],+254
               PUSH  BX
               MOV   BL,BYTE PTR [DI]
               PUSH  DI
               AND   DI,$0FF0
               SHL   DI,2
               MOV   AX,DI
               SHL   AX,3
               ADD   DI,AX
               POP   AX
               AND   AX,$000F
               SHL   AX,4
               ADD   AX,$0140
               ADD   DI,AX
               MOV   BH,$00
               SHL   BX,1
               MOV   AX,WORD PTR WIDERTABLE[CS:BX]
               CALL  PUTMONOWORD
               ADD   DI,$0120
               CALL  PUTMONOWORD
               POP   BX
               POPF
END;
{---[updatem2a]-------------------------------------------------------------}
PROCEDURE UPDATEM2a; ASSEMBLER;
ASM;
               PUSHF
               CLI
               ADD   WORD PTR [PCCYCLES],+217
               MOV   AL,BYTE PTR [DI]
               PUSH  AX
               PUSH  DI
               AND   DI,$07E0
               MOV   AX,DI
               SHL   AX,1
               ADD   DI,AX
               SHL   AX,2
               ADD   DI,AX
               SHL   AX,1
               ADD   DI,AX
               POP   AX
               AND   AX,$001F
               SHL   AX,3
               ADD   AX,$0140
               ADD   DI,AX
               POP   AX
               CALL  PUTCOLORBYTE
               ADD   DI,$0120
               CALL  PUTCOLORBYTE
               ADD   DI,$0120
               CALL  PUTCOLORBYTE
               POPF
END;
{---[updatem3]--------------------------------------------------------------}
PROCEDURE UPDATEM3; ASSEMBLER;
ASM;
               PUSHF
               CLI
               ADD   WORD PTR [PCCYCLES],+178
               PUSH  BX
               MOV   BL,BYTE PTR [DI]
               PUSH  DI
               AND   DI,$0FF0
               SHL   DI,1
               MOV   AX,DI
               SHL   AX,3
               ADD   DI,AX
               POP   AX
               AND   AX,$000F
               SHL   AX,4
               ADD   AX,$0140
               ADD   DI,AX
               MOV   BH,$00
               SHL   BX,1
               MOV   AX,WORD PTR WIDERTABLE[CS:BX]
               CALL  PUTMONOWORD
               POP   BX
               POPF
END;
{---[updatem3a]-------------------------------------------------------------}
PROCEDURE UPDATEM3a; ASSEMBLER;
ASM;
               PUSHF
               CLI
               ADD   WORD PTR [PCCYCLES],+177
               MOV   AL,BYTE PTR [DI]
               PUSH  AX
               PUSH  DI
               AND   DI,$0FE0
               SHL   DI,1
               MOV   AX,DI
               SHL   AX,3
               ADD   DI,AX
               POP   AX
               AND   AX,$001F
               SHL   AX,3
               ADD   AX,$0140
               ADD   DI,AX
               POP   AX
               CALL  PUTCOLORBYTE
               ADD   DI,$0120
               CALL  PUTCOLORBYTE
               POPF
END;
{---[updatem4]--------------------------------------------------------------}
PROCEDURE UPDATEM4; ASSEMBLER;
ASM;
               PUSHF
               CLI
               ADD   WORD PTR [PCCYCLES],+139
               MOV   AL,BYTE PTR [DI]
               PUSH  AX
               PUSH  DI
               AND   DI,$1FE0
               MOV   AX,DI
               SHL   AX,3
               ADD   DI,AX
               POP   AX
               AND   AX,$001F
               SHL   AX,3
               ADD   AX,$0140
               ADD   DI,AX
               POP   AX
               CALL  PUTMONOBYTE
               POPF
END;
{---[updatem4a]-------------------------------------------------------------}
PROCEDURE UPDATEM4a; ASSEMBLER;
ASM;
               PUSHF
               CLI
               ADD   WORD PTR [PCCYCLES],+134
               MOV   AL,BYTE PTR [DI]
               PUSH  AX
               PUSH  DI
               AND   DI,$1FE0
               MOV   AX,DI
               SHL   AX,3
               ADD   DI,AX
               POP   AX
               AND   AX,$001F
               SHL   AX,3
               ADD   AX,$0140
               ADD   DI,AX
               POP   AX
               CALL  PUTCOLORBYTE
               POPF
END;
{---[updatetable]-----------------------------------------------------------}
PROCEDURE UPDATETABLE; ASSEMBLER;
ASM;
               DW    OFFSET UPDATEM0
               DW    OFFSET UPDATEM1
               DW    OFFSET UPDATEM2
               DW    OFFSET UPDATEM3
               DW    OFFSET UPDATEM4
               DW    OFFSET UPDATEM1a
               DW    OFFSET UPDATEM2a
               DW    OFFSET UPDATEM3a
               DW    OFFSET UPDATEM4a
END;
{---[updategraph DI=dest.address]-------------------------------------------}
PROCEDURE UPDATEGRAPH; ASSEMBLER;
ASM;
               PUSHF
               CMP   DI,$8000
               JAE   @UPDATEG1
               ADD   WORD PTR [PCCYCLES],+21
               POPF
               RETN
@UPDATEG1:     PUSH  BX
               MOV   BL,BYTE PTR [CS:GRAPHMODE]
               MOV   BH,$00
               SHL   BX,1
               CMP   DI,WORD PTR GRAPHTOP[CS:BX]
               JB    @UPDATEG2
               POP   BX
               ADD   WORD PTR [PCCYCLES],+40
               POPF
               RETN
@UPDATEG2:     MOV   AX,WORD PTR UPDATETABLE[CS:BX]
               POP   BX
               POPF
               JMP   AX
END;
{---[setmousecursor (AL=waarde)]--------------------------------------------}
PROCEDURE SETMOUSECURSOR; ASSEMBLER;
ASM;
               TEST  BYTE PTR [CS:MOUSENR],$80
               JNZ   @SETMOUSE2
@SETMOUSE3:    RETN
@SETMOUSE2:    OR    AL,AL
               JS    @SETMOUSE3
               MOV   BYTE PTR [CS:MOUSENR],AL
               PUSH  DS
               PUSHA
               MOV   DS,WORD PTR [CS:ATOMSEG]
               MOV   AL,+255
               SUB   AL,BYTE PTR [$BFE1]
               MOV   AH,$00
               SHL   AX,5
               MOV   DI,AX
               SHL   AX,3
               ADD   DI,AX
               MOV   AL,BYTE PTR [$BFE0]
               MOV   CL,AL
               AND   CL,$07
               AND   AX,$00F8
               ADD   DI,AX
               ADD   DI,$0140
               MOV   AL,BYTE PTR [CS:MOUSENR]
               AND   AX,$001F
               SHL   AX,3
               MOV   SI,AX
               SUB   BX,BX
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   WORD PTR [CS:MOUSEBACKGRPOS],DI
@SETMOUSE1:    MOV   AH,BYTE PTR MOUSECURSORS[CS:SI]
               MOV   AL,$00
               SHR   AX,CL
               XCHG  AL,AH
               PUSH  SI
               PUSH  AX
               MOV   AX,WORD PTR [ES:DI]
               MOV   WORD PTR MOUSEBACKGROUND[BX],AX
               MOV   AX,WORD PTR [ES:DI+2]
               MOV   WORD PTR MOUSEBACKGROUND[BX+2],AX
               MOV   AX,WORD PTR [ES:DI+4]
               MOV   WORD PTR MOUSEBACKGROUND[BX+4],AX
               MOV   AX,WORD PTR [ES:DI+6]
               MOV   WORD PTR MOUSEBACKGROUND[BX+6],AX
               MOV   AX,WORD PTR [ES:DI+8]
               MOV   WORD PTR MOUSEBACKGROUND[BX+8],AX
               MOV   AX,WORD PTR [ES:DI+10]
               MOV   WORD PTR MOUSEBACKGROUND[BX+10],AX
               MOV   AX,WORD PTR [ES:DI+12]
               MOV   WORD PTR MOUSEBACKGROUND[BX+12],AX
               MOV   AX,WORD PTR [ES:DI+14]
               MOV   WORD PTR MOUSEBACKGROUND[BX+14],AX
               POP   AX
               MOV   SI,AX
               AND   SI,$00FF
               SHL   SI,3
               ADD   SI,OFFSET MONOGRAPHTABLE
               PUSH  AX
               MOV   AL,BYTE PTR [SI]
               MOV   AH,AL
               MOV   WORD PTR MOUSEPOINTER[BX],AX
               OR    WORD PTR [ES:DI],AX
               MOV   WORD PTR MOUSEPOINTER[BX+2],AX
               OR    WORD PTR [ES:DI+2],AX
               MOV   AL,BYTE PTR [SI+4]
               MOV   AH,AL
               MOV   WORD PTR MOUSEPOINTER[BX+4],AX
               OR    WORD PTR [ES:DI+4],AX
               MOV   WORD PTR MOUSEPOINTER[BX+6],AX
               OR    WORD PTR [ES:DI+6],AX
               POP   AX
               XCHG  AL,AH
               MOV   SI,AX
               AND   SI,$00FF
               SHL   SI,3
               ADD   SI,OFFSET MONOGRAPHTABLE
               MOV   AL,BYTE PTR [SI]
               MOV   AH,AL
               MOV   WORD PTR MOUSEPOINTER[BX+8],AX
               OR    WORD PTR [ES:DI+8],AX
               MOV   WORD PTR MOUSEPOINTER[BX+10],AX
               OR    WORD PTR [ES:DI+10],AX
               MOV   AL,BYTE PTR [SI+4]
               MOV   AH,AL
               MOV   WORD PTR MOUSEPOINTER[BX+12],AX
               OR    WORD PTR [ES:DI+12],AX
               MOV   WORD PTR MOUSEPOINTER[BX+14],AX
               OR    WORD PTR [ES:DI+14],AX
               POP   SI
               ADD   BX,+16
               ADD   DI,$0120
               INC   SI
               TEST  SI,$0007
               JNZ   @SETMOUSE1
               POPA
               POP   DS
END;
{---[clrmousecursor]--------------------------------------------------------}
PROCEDURE CLRMOUSECURSOR; ASSEMBLER;
ASM;
               TEST  BYTE PTR [CS:MOUSENR],$80
               JZ    @CLRMOUSE2
               RETN
@CLRMOUSE2:    OR    BYTE PTR [CS:MOUSENR],$80
               PUSH  DS
               PUSHA
               MOV   DS,WORD PTR [CS:ATOMSEG]
               MOV   AL,+255
               SUB   AL,BYTE PTR [$BFE1]
               MOV   AH,$00
               SHL   AX,5
               MOV   DI,AX
               SHL   AX,3
               ADD   DI,AX
               MOV   AL,BYTE PTR [$BFE0]
               AND   AX,$00F8
               ADD   DI,AX
               ADD   DI,$0140
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   SI,OFFSET MOUSEBACKGROUND
               MOV   CX,$0008
@CLRMOUSE1:    MOV   AX,WORD PTR [SI]
               MOV   WORD PTR [ES:DI],AX
               MOV   AX,WORD PTR [SI+2]
               MOV   WORD PTR [ES:DI+2],AX
               MOV   AX,WORD PTR [SI+4]
               MOV   WORD PTR [ES:DI+4],AX
               MOV   AX,WORD PTR [SI+6]
               MOV   WORD PTR [ES:DI+6],AX
               MOV   AX,WORD PTR [SI+8]
               MOV   WORD PTR [ES:DI+8],AX
               MOV   AX,WORD PTR [SI+10]
               MOV   WORD PTR [ES:DI+10],AX
               MOV   AX,WORD PTR [SI+12]
               MOV   WORD PTR [ES:DI+12],AX
               MOV   AX,WORD PTR [SI+14]
               MOV   WORD PTR [ES:DI+14],AX
               ADD   SI,+16
               ADD   DI,$0120
               LOOP  @CLRMOUSE1
               POPA
               POP   DS
END;
{---[disablemouse (called whenever desktop opened)]-------------------------}
PROCEDURE DISABLEMOUSE; ASSEMBLER;
ASM;
               PUSH  DS
               PUSH  ES
               PUSHA
               MOV   DS,WORD PTR [CS:ATOMSEG]
               MOV   ES,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR [$BFE0]
               MOV   WORD PTR TEMPMOUSEDAT[ES:$00],AX
               MOV   AL,BYTE PTR [CS:MOUSENR]
               MOV   BYTE PTR TEMPMOUSEDAT[ES:$02],AL
               MOV   AX,$0003
               INT   $33
               MOV   WORD PTR TEMPMOUSEDAT[ES:$03],CX
               MOV   WORD PTR TEMPMOUSEDAT[ES:$05],DX
               POPA
               POP   ES
               POP   DS
               CALL  CLRMOUSECURSOR
END;
{---[enablemouse (called when resuming emulation)]--------------------------}
PROCEDURE ENABLEMOUSE; ASSEMBLER;
ASM;
               PUSH  DS
               PUSH  ES
               PUSHA
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   ES,WORD PTR [CS:ATOMSEG]
               MOV   AX,WORD PTR TEMPMOUSEDAT[$00]
               MOV   WORD PTR [ES:$BFE0],AX
               MOV   AL,BYTE PTR TEMPMOUSEDAT[$02]
               MOV   BYTE PTR [CS:MOUSENR],AL
               MOV   AX,$0004
               MOV   CX,WORD PTR TEMPMOUSEDAT[$03]
               MOV   DX,WORD PTR TEMPMOUSEDAT[$05]
               INT   $33
               MOV   AX,$0003
               INT   $33
               XOR   BL,$07
               MOV   BYTE PTR [ES:$BFE2],BL
               POPA
               POP   ES
               POP   DS
               TEST  BYTE PTR [CS:MOUSENR],$80
               JNZ   @ENABLE1
               MOV   AL,BYTE PTR [CS:MOUSENR]
               OR    BYTE PTR [CS:MOUSENR],$80
               CALL  SETMOUSECURSOR
@ENABLE1:
END;
{---[savezp90]--------------------------------------------------------------}
PROCEDURE SAVEZP90; ASSEMBLER;
ASM;
               TEST  BYTE PTR [CS:BOXSWITCH],$FF
               JZ    @SAVEZP1
               PUSH  ES
               PUSH  BX
               PUSH  SI
               MOV   AX,DS
               ADD   AX,$2000
               MOV   ES,AX
               MOV   AL,BYTE PTR [SCHAKELBYTE]
               AND   AX,$000F
               SHL   AX,4
               MOV   SI,AX
               SUB   BX,BX
@SAVEZP2:      MOV   AX,WORD PTR [BX+$0090]
               MOV   WORD PTR [ES:SI+BX],AX
               ADD   BL,$02
               CMP   BL,$0A
               JB    @SAVEZP2
               SUB   BX,BX
@SAVEZP4:      MOV   AX,WORD PTR [BX+$0200]
               PUSH  AX
               AND   AH,$F0
               CMP   AH,$A0
               POP   AX
               JNZ   @SAVEZP3
               CMP   AX,WORD PTR [ES:BX+$0100]
               JZ    @SAVEZP3
               MOV   WORD PTR [ES:BX+$0100],AX
               MOV   AL,BYTE PTR [SCHAKELBYTE]
               AND   AX,$000F
               MOV   WORD PTR [ES:BX+$0120],AX
@SAVEZP3:      ADD   BL,$02
               CMP   BL,$1C
               JB    @SAVEZP4
               MOV   AX,WORD PTR [$03FE]
               MOV   BL,AH
               AND   BL,$F0
               CMP   BL,$A0
               JNZ   @SAVEZP5
               CMP   AX,WORD PTR [ES:$011C]
               JZ    @SAVEZP5
               MOV   WORD PTR [ES:$011C],AX
               MOV   AL,BYTE PTR [SCHAKELBYTE]
               AND   AX,$000F
               MOV   WORD PTR [ES:$013C],AX
@SAVEZP5:      POP   SI
               POP   BX
               POP   ES
@SAVEZP1:
END;
{---[setA000mem]------------------------------------------------------------}
PROCEDURE SETA000MEM; ASSEMBLER;
ASM;
               TEST  BYTE PTR [CS:BOXSWITCH],$FF
               JZ    @SETA000_1
               PUSH  DS
               PUSH  ES
               PUSH  BX
               PUSH  CX
               PUSH  SI
               MOV   AH,BYTE PTR [SCHAKELBYTE]
               AND   AX,$0F00
               SHL   AH,4
               MOV   SI,AX
               MOV   DI,$A000
               MOV   AX,DS
               MOV   ES,AX
               ADD   AX,$1000
               MOV   DS,AX
               MOV   CX,$0800
               REPZ
               MOVSW
               MOV   AL,BYTE PTR [ES:SCHAKELBYTE]
               AND   AX,$000F
               SHL   AX,4
               MOV   SI,AX
               MOV   AX,DS
               ADD   AX,$1000
               MOV   DS,AX
               SUB   BX,BX
@SETA000_2:    MOV   AX,WORD PTR [SI+BX]
               MOV   WORD PTR [ES:BX+$0090],AX
               ADD   BL,$02
               CMP   BL,$0A
               JB    @SETA000_2
               POP   SI
               POP   CX
               POP   BX
               POP   ES
               POP   DS
@SETA000_1:
END;
{---[setbordercol]----------------------------------------------------------}
PROCEDURE SETBORDERCOL; ASSEMBLER;
ASM;
               MOV   AL,BYTE PTR [CS:GRAPHMODE]
               OR    AL,AL
               JZ    @BORDERCOL1
               CMP   AL,$05
               JAE   @BORDERCOL2
               {---hires mode---}
               MOV   AL,BYTE PTR EMULCOLORS[CS:(1*3)]
               MOV   BYTE PTR EMULCOLORS[CS:(7*3)],AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(1*3+1)]
               MOV   BYTE PTR EMULCOLORS[CS:(7*3+1)],AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(1*3+2)]
               MOV   BYTE PTR EMULCOLORS[CS:(7*3+2)],AL
               TEST  BYTE PTR [$B002],$08
               JZ    @BORDERCOL3
               PUSH  DX
               CLI
               MOV   DX,$03C8
               MOV   AL,$07
               OUT   DX,AL
               INC   DX
               MOV   AL,BYTE PTR INTENSMONO[CS:$00]
               OUT   DX,AL
               MOV   AL,BYTE PTR INTENSMONO[CS:$01]
               OUT   DX,AL
               MOV   AL,BYTE PTR INTENSMONO[CS:$02]
               OUT   DX,AL
               STI
               POP   DX
               RETN
@BORDERCOL1:   {---lores mode---}
               MOV   AL,BYTE PTR EMULCOLORS[CS:(0*3)]
               MOV   BYTE PTR EMULCOLORS[CS:(7*3)],AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(0*3+1)]
               MOV   BYTE PTR EMULCOLORS[CS:(7*3+1)],AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(0*3+2)]
               MOV   BYTE PTR EMULCOLORS[CS:(7*3+2)],AL
@BORDERCOL3:   PUSH  DX
               CLI
               MOV   DX,$03C8
               MOV   AL,$07
               OUT   DX,AL
               INC   DX
               MOV   AL,BYTE PTR EMULCOLORS[CS:(7*3)]
               OUT   DX,AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(7*3+1)]
               OUT   DX,AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(7*3+2)]
               OUT   DX,AL
               STI
               POP   DX
               RETN
@BORDERCOL2:   {---hires colour mode---}
               MOV   AL,BYTE PTR EMULCOLORS[CS:(3*3)]
               MOV   BYTE PTR EMULCOLORS[CS:(7*3)],AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(3*3+1)]
               MOV   BYTE PTR EMULCOLORS[CS:(7*3+1)],AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(3*3+2)]
               MOV   BYTE PTR EMULCOLORS[CS:(7*3+2)],AL
               TEST  BYTE PTR [$B002],$08
               JZ    @BORDERCOL3
               PUSH  DX
               CLI
               MOV   DX,$03C8
               MOV   AL,$07
               OUT   DX,AL
               INC   DX
               MOV   AL,BYTE PTR INTENSCOLOR[CS:$00]
               OUT   DX,AL
               MOV   AL,BYTE PTR INTENSCOLOR[CS:$01]
               OUT   DX,AL
               MOV   AL,BYTE PTR INTENSCOLOR[CS:$02]
               OUT   DX,AL
               STI
               POP   DX
END;
{---[setintenscol]----------------------------------------------------------}
PROCEDURE SETINTENSCOL; ASSEMBLER;
ASM;
               PUSHA
               SUB   BX,BX
@SETINT2:      MOV   AL,BYTE PTR EMULCOLORS[CS:BX+$03]
               MOV   AH,AL
               SHR   AH,1
               ADD   AL,AH
               CMP   AL,$3F
               JBE   @SETINT1
               MOV   AL,$3F
@SETINT1:      MOV   BYTE PTR INTENSMONO[CS:BX],AL
               INC   BL
               CMP   BL,$02
               JBE   @SETINT2
               SUB   BX,BX
@SETINT4:      MOV   AL,BYTE PTR EMULCOLORS[CS:BX+$09]
               MOV   AH,AL
               SHR   AH,1
               ADD   AL,AH
               CMP   AL,$3F
               JBE   @SETINT3
               MOV   AL,$3F
@SETINT3:      MOV   BYTE PTR INTENSCOLOR[CS:BX],AL
               INC   BL
               CMP   BL,$02
               JBE   @SETINT4
               POPA
END;
{---[sortimp]---------------------------------------------------------------}
PROCEDURE SORTIMP (VAR A:ATMFILETYPE; LO,HI:INTEGER);
VAR X,Y:ATMFILEREC;
  PROCEDURE SORTEER (L,R:INTEGER);
  VAR I,J:INTEGER;
  BEGIN
    I := L;
    J := R;
    X := A[(L+R) DIV 2];
    REPEAT
      WHILE A[I].ATMNAME < X.ATMNAME DO INC (I);
      WHILE X.ATMNAME < A[J].ATMNAME DO DEC (J);
      IF I <= J THEN
      BEGIN
        Y := A[I];
        A[I] := A[J];
        A[J] := Y;
        INC (I);
        DEC (J);
      END;
    UNTIL I > J;
    IF L < J THEN SORTEER (L,J);
    IF I < R THEN SORTEER (I,R);
  END;
BEGIN
  SORTEER (LO,HI);
END;
{---[readimportablefiles]---------------------------------------------------}
PROCEDURE READIMPORTABLEFILES;
VAR D:SEARCHREC;
    F:FILE;
    NR:WORD;
    DUMMY:INTEGER;
BEGIN
  AANTALIMPFILES := 0;
  FINDFIRST ('*.ATM',ANYFILE,D);
  WHILE (DOSERROR = 0) AND (AANTALIMPFILES < MAXAANTFILES) DO
  BEGIN
    IF D.ATTR AND $18 = $00 THEN
    BEGIN
      DUMMY := IORESULT;
      ASSIGN (F,D.NAME);
      RESET (F,1);
      BLOCKREAD (F,IMPFILES[AANTALIMPFILES],SIZEOF(ATMFILEREC),NR);
      CLOSE (F);
      FOR NR := 0 TO 15 DO IMPFILES[AANTALIMPFILES].ATMNAME[NR] := #$00;
      FOR NR := 1 TO LENGTH(D.NAME) DO
        IMPFILES[AANTALIMPFILES].ATMNAME[PRED(NR)] := D.NAME[NR];
      INC (AANTALIMPFILES);
    END;
    FINDNEXT (D);
  END;
  IF AANTALIMPFILES > 0 THEN SORTIMP (IMPFILES,0,PRED(AANTALIMPFILES));
END;
{---[load]------------------------------------------------------------------}
PROCEDURE LOAD (TABLEOFS:WORD; FILEPOINTER:INTEGER; VAR NEWFP:WORD);
LABEL 1;
CONST BUFSIZE = $FFF8;
VAR FROMF     : FILE;
    TAPESIZE  : LONGINT;
    FILENAME  : STRING[16];
    CURNAME   : STRING[16];
    W,I,NR    : WORD;
    ATMHEADER : ATMFILEREC;
    STARTADRS : WORD;
    DEST      : POINTER;
    FPOS      : LONGINT;
    INITPOS   : LONGINT;
    BUF       : POINTER;
    BUFSEG    : WORD;
    DUMMY     : INTEGER;
    FRZVERSION: WORD;
BEGIN
  ASM;
               PUSH  DS
               MOV   DS,WORD PTR ATOMMEMSEG
               CALL  SAVEZP90
               POP   DS
  END;
  IF LENGTH(TAPEIMAGENAME) = 0 THEN
  BEGIN
    NEWFP := $8000; {---no tape image selected---}
    EXIT;
  END;
  W := MEMW[ATOMMEMSEG:TABLEOFS];
  FILENAME := '';
  I := 0;
  WHILE (I < 16) AND (MEM[ATOMMEMSEG:W+I] <> $0D) DO
  BEGIN
    FILENAME := FILENAME + CHR(MEM[ATOMMEMSEG:W+I]);
    INC(I);
  END;
  IF LENGTH(FILENAME) = 0 THEN FILENAME := '*';
  DUMMY := IORESULT;
  ASSIGN (FROMF,TAPEIMAGENAME+'.TAP');
  RESET (FROMF,1);
  IF IORESULT <> 0 THEN
  BEGIN
    NEWFP := $8000; {---tape image not found---}
    EXIT;
  END;
  TAPESIZE := FILESIZE(FROMF);
  NEWFP := 0;
  FPOS := 0;
  WHILE (FPOS < TAPESIZE) AND (FILEPOINTER > 0) DO
  BEGIN
    ATMHEADER := ATOMFILES[NEWFP];
    INC (FPOS,SIZEOF(ATMHEADER)+LONGINT(ATMHEADER.DATASIZE));
    DEC (FILEPOINTER);
    INC (NEWFP);
  END;
  INITPOS := FPOS;
  IF INITPOS = 0 THEN INITPOS := TAPESIZE;
1:IF FPOS >= TAPESIZE THEN
  BEGIN
    NEWFP := 0;
    FPOS := 0;
  END;
  ATMHEADER := ATOMFILES[NEWFP];
  INC (FPOS,SIZEOF(ATMHEADER));
  CURNAME := '';
  I := 0;
  WHILE (I < 16) AND (ATMHEADER.ATMNAME[I] <> #$00) DO
  BEGIN
    CURNAME := CURNAME + ATMHEADER.ATMNAME[I];
    INC (I);
  END;
  IF (FILENAME[LENGTH(FILENAME)] = '*') THEN
  BEGIN
    IF (LENGTH(FILENAME) = 1) OR
       (COPY(FILENAME,1,PRED(LENGTH(FILENAME))) =
        COPY (CURNAME,1,PRED(LENGTH(FILENAME)))) THEN FILENAME := CURNAME;
  END;
  IF FILENAME <> CURNAME THEN
  BEGIN
    INC (NEWFP);
    INC (FPOS,LONGINT(ATMHEADER.DATASIZE));
    IF FPOS <> INITPOS THEN GOTO 1;
    CLOSE (FROMF);
    NEWFP := $8000; {---atom file not on this image---}
    EXIT;
  END;
  FRZVERSION := NOT(ATMHEADER.STARTADRS AND ATMHEADER.EXECADRS);
  IF FRZVERSION > 3 THEN
  BEGIN {---normal file---}
    IF MEM[ATOMMEMSEG:TABLEOFS+$04] AND $80 <> $00 THEN
    BEGIN
      STARTADRS := MEMW[ATOMMEMSEG:TABLEOFS+$02];
    END ELSE
    BEGIN
      STARTADRS := ATMHEADER.STARTADRS;
    END;
    MEM[ATOMMEMSEG:$00DD] := $00;
    MEMW[ATOMMEMSEG:$00D6] := ATMHEADER.EXECADRS;
    {---no unnamed files, so no JMP ($00CB) will occur when *RUN---}
    DEST := PTR(ATOMMEMSEG,STARTADRS);
    SEEK (FROMF,FPOS);
    IF LONGINT(STARTADRS)+LONGINT(PRED(ATMHEADER.DATASIZE)) > $FFFF THEN
    BEGIN
      NR := 0;
    END ELSE
    BEGIN
      BLOCKREAD (FROMF,DEST^,ATMHEADER.DATASIZE,NR);
    END;
    IF NR <> ATMHEADER.DATASIZE THEN
    BEGIN
      CLOSE (FROMF);
      NEWFP := $8000; {---dos read error---}
      EXIT;
    END;
    {---ok, atom file loaded---}
    CLOSE (FROMF);
    INC (NEWFP);
  END ELSE
  BEGIN {---frozen file---}
    GETMEM (BUF,BUFSIZE);
    BUFSEG := SEG(BUF^);
    IF OFS(BUF^) <> $0000 THEN INC (BUFSEG);
    DEST := PTR(BUFSEG,$0000);
    SEEK (FROMF,FPOS);
    BLOCKREAD (FROMF,DEST^,ATMHEADER.DATASIZE,NR);
    IF NR <> ATMHEADER.DATASIZE THEN
    BEGIN
      CLOSE (FROMF);
      FREEMEM (BUF,BUFSIZE);
      NEWFP := $8000; {---dos read error---}
      EXIT;
    END;
    CLOSE (FROMF);
    ASM;
               MOV   BX,WORD PTR FRZVERSION
               PUSH  DS
               MOV   ES,WORD PTR ATOMMEMSEG
               SUB   DI,DI
               MOV   DS,WORD PTR BUFSEG
               SUB   SI,SI
               LODSW
               ADD   AX,SI
               MOV   DX,AX
    @UNPACK3:  CMP   SI,DX
               JZ    @UNPACK2
               MOVSB
               JMP   @UNPACK3
    @UNPACK2:  LODSW
               CMP   AX,$FFFF
               JZ    @UNPACK1
               ADD   AX,SI
               MOV   DX,AX
               LODSW
               MOV   CX,AX
               LODSB
               REPZ
               STOSB
               JMP   @UNPACK3
    @UNPACK1:  MOV   DI,$B000
               MOVSW
               MOVSW
               MOV   DI,$B800
               MOV   CX,$0008
               REPZ
               MOVSW
               PUSH  ES
               MOV   AX,$A000
               MOV   ES,AX
               CALL  CLRMOUSECURSOR
               POP   ES
               CMP   BX,$0001
               JB    @UNPACK4
               {freeze version 1, from emulator v1.30 and higher}
               PUSH  ES
               MOV   ES,WORD PTR [CS:DATASEG]
               LODSW
               MOV   WORD PTR TEMPMOUSEDAT[ES:$00],AX
               LODSB
               MOV   BYTE PTR TEMPMOUSEDAT[ES:$02],AL
               LODSW
               MOV   WORD PTR TEMPMOUSEDAT[ES:$03],AX
               LODSW
               MOV   WORD PTR TEMPMOUSEDAT[ES:$05],AX
               MOV   AX,$A000
               MOV   ES,AX
               CALL  ENABLEMOUSE
               POP   ES
               PUSH  ES
               MOV   AX,ES
               ADD   AX,$2000
               MOV   ES,AX
               SUB   DI,DI
               CMP   BX,$0002
               JAE   @UNPACK6
               {freeze version 1: up to 8 toolboxes}
               MOV   CX,$0080
               REPZ
               MOVSB
               MOV   CX,$0080
               MOV   AL,$00
               REPZ
               STOSB
               MOV   CX,$0040
               REPZ
               MOVSB
               JMP   @UNPACK7
    @UNPACK6:  {freeze version 2 and higher: up to 16 toolboxes}
               MOV   CX,$0140
               REPZ
               MOVSB
    @UNPACK7:  LODSB
               MOV   BYTE PTR [CS:AANTBOXRET],AL
               MOV   AX,CS
               MOV   ES,AX
               MOV   DI,OFFSET BOXRETURNS
               MOV   CX,$0020
               REPZ
               MOVSW
               POP   ES
               JMP   @UNPACK5
    @UNPACK4:  {freeze version 0, until emulator v1.30}
               MOV   DI,$BFE0
               SUB   AX,AX
               STOSW
               STOSB
               MOV   BYTE PTR [CS:MOUSENR],$80
    @UNPACK5:  MOV   DI,$BFF6
               MOVSW
               MOVSW
               MOVSW
               MOVSW
               MOVSW
               MOV   AX,CS
               MOV   ES,AX
               MOV   DI,OFFSET GRAPHMODE
               MOVSB
               MOV   DI,OFFSET PROGRAMCNT
               MOVSW
               MOV   DI,OFFSET STACKPOINTER
               MOVSW
               MOV   DI,OFFSET ACCUMULATOR
               MOVSB
               MOV   DI,OFFSET FLAGREGISTER
               MOVSB
               CMP   BX,$0003
               JB    @UNPACK8
               {freeze version 3 and higher: extra accumulator}
               MOV   DI,OFFSET XREGISTER
               MOVSB
               MOV   DI,OFFSET YREGISTER
               MOVSB
               MOV   DI,OFFSET ACCU_B
               MOVSB
               JMP   @UNPACK9
    @UNPACK8:  MOV   DI,OFFSET XREGISTER
               MOVSB
               INC   SI
               MOV   DI,OFFSET YREGISTER
               MOVSB
               INC   SI
    @UNPACK9:  MOV   DI,OFFSET CPUSPEEDMODE
               MOVSB
               MOV   DI,OFFSET ALTKEYB
               MOVSB
               MOV   DI,OFFSET T2L_L
               MOVSB
               MOV   DI,OFFSET IRQDELAY
               MOVSB
               POP   DS
               MOV   AX,CS
               MOV   ES,AX
               MOV   DI,OFFSET TOETS
               MOV   CX,$0082
               MOV   AL,$00
               REPZ
               STOSB
    END;
    FREEMEM (BUF,BUFSIZE);
    INC (NEWFP,$4001);
  END;
  ASM;
               MOV   ES,WORD PTR ATOMMEMSEG
               MOV   BYTE PTR [ES:FLIPFLOP],$55
               MOV   SI,OFFSET ATOMROMMEM + $1000
               MOV   DI,$C000
               MOV   CX,$2000
               REPZ
               MOVSW
               TEST  BYTE PTR [CS:LEENDERTSROM],$FF
               JZ    @SK2
               MOV   SI,OFFSET LEENDERTS_FPROM_DAT
               MOV   DI,$D000
               MOV   CX,LEENDERTS_FPROM_SIZE
               REPZ
               MOVSB
  @SK2:        TEST  BYTE PTR [CS:IGNOREzpFEh],$FF
               JZ    @SK1
               MOV   BYTE PTR [ES:$FF07],$00
  @SK1:        PUSH  DS
               MOV   DS,WORD PTR ATOMMEMSEG
               PUSH  WORD PTR [$0090]
               PUSH  WORD PTR [$0092]
               PUSH  WORD PTR [$0094]
               PUSH  WORD PTR [$0096]
               PUSH  WORD PTR [$0098]
               CALL  SETA000MEM
               POP   WORD PTR [$0098]
               POP   WORD PTR [$0096]
               POP   WORD PTR [$0094]
               POP   WORD PTR [$0092]
               POP   WORD PTR [$0090]
               POP   DS
  END;
END;
{---[readfinbuf]------------------------------------------------------------}
PROCEDURE READFINBUF (NAMEOFFSET:WORD; FILEPOINTER:INTEGER; VAR NEWFP: WORD);
LABEL 1;
VAR FROMF     : FILE;
    TAPESIZE  : LONGINT;
    FILENAME  : STRING[16];
    CURNAME   : STRING[16];
    ATMHEADER : ATMFILEREC;
    FPOS      : LONGINT;
    INITPOS   : LONGINT;
    I         : WORD;
    NR        : WORD;
    DUMMY     : INTEGER;
BEGIN
  FINBUFPTR := $0000;
  FINSIZE := 0;
  IF LENGTH(TAPEIMAGENAME) = 0 THEN
  BEGIN
    NEWFP := $8000; {---no tape image selected---}
    EXIT;
  END;
  FILENAME := '';
  I := 0;
  WHILE (I < 16) AND (MEM[ATOMMEMSEG:NAMEOFFSET+I] <> $0D) DO
  BEGIN
    FILENAME := FILENAME + CHR(MEM[ATOMMEMSEG:NAMEOFFSET+I]);
    INC(I);
  END;
  IF LENGTH(FILENAME) = 0 THEN FILENAME := '*';
  DUMMY := IORESULT;
  ASSIGN (FROMF,TAPEIMAGENAME+'.TAP');
  RESET (FROMF,1);
  IF IORESULT <> 0 THEN
  BEGIN
    NEWFP := $8000; {---tape image not found---}
    EXIT;
  END;
  TAPESIZE := FILESIZE(FROMF);
  NEWFP := 0;
  FPOS := 0;
  WHILE (FPOS < TAPESIZE) AND (FILEPOINTER > 0) DO
  BEGIN
    ATMHEADER := ATOMFILES[NEWFP];
    INC (FPOS,SIZEOF(ATMHEADER)+LONGINT(ATMHEADER.DATASIZE));
    DEC (FILEPOINTER);
    INC (NEWFP);
  END;
  INITPOS := FPOS;
  IF INITPOS = 0 THEN INITPOS := TAPESIZE;
1:IF FPOS >= TAPESIZE THEN
  BEGIN
    NEWFP := 0;
    FPOS := 0;
  END;
  ATMHEADER := ATOMFILES[NEWFP];
  INC (FPOS,SIZEOF(ATMHEADER));
  CURNAME := '';
  I := 0;
  WHILE (I < 16) AND (ATMHEADER.ATMNAME[I] <> #$00) DO
  BEGIN
    CURNAME := CURNAME + ATMHEADER.ATMNAME[I];
    INC (I);
  END;
  IF (FILENAME[LENGTH(FILENAME)] = '*') THEN
  BEGIN
    IF (LENGTH(FILENAME) = 1) OR
       (COPY(FILENAME,1,PRED(LENGTH(FILENAME))) =
        COPY (CURNAME,1,PRED(LENGTH(FILENAME)))) THEN FILENAME := CURNAME;
  END;
  IF FILENAME <> CURNAME THEN
  BEGIN
    INC (NEWFP);
    INC (FPOS,LONGINT(ATMHEADER.DATASIZE));
    IF FPOS <> INITPOS THEN GOTO 1;
    CLOSE (FROMF);
    NEWFP := $8000; {---file not on this image---}
    EXIT;
  END;
  SEEK (FROMF,FPOS);
  BLOCKREAD (FROMF,FINBUF^,ATMHEADER.DATASIZE,NR);
  IF NR <> ATMHEADER.DATASIZE THEN
  BEGIN
    CLOSE (FROMF);
    NEWFP := $8000; {---dos read error---}
    EXIT;
  END;
  {---ok, file loaded into finbuf---}
  CLOSE (FROMF);
  FINSIZE := ATMHEADER.DATASIZE;
  INC (NEWFP);
END;
{---[createfout]------------------------------------------------------------}
PROCEDURE CREATEFOUT;
VAR TOF       : FILE;
    ATMHEADER : ATMFILEREC;
    I         : BYTE;
    NW        : WORD;
    DUMMY     : INTEGER;
BEGIN
  IF LENGTH(TAPEIMAGENAME) = 0 THEN EXIT;
  DUMMY := IORESULT;
  ASSIGN (TOF,TAPEIMAGENAME+'.TAP');
  RESET (TOF,1);
  IF IORESULT <> 0 THEN EXIT;
  SEEK (TOF,FILESIZE(TOF));
  FOR I := 0 TO 15 DO ATMHEADER.ATMNAME[I] := #$00;
  FOR I := 1 TO LENGTH(FOUTNAME) DO ATMHEADER.ATMNAME[PRED(I)] := FOUTNAME[I];
  ATMHEADER.STARTADRS := $8200;
  ATMHEADER.EXECADRS := $C2B2;
  ATMHEADER.DATASIZE := 0;
  BLOCKWRITE (TOF,ATMHEADER,SIZEOF(ATMHEADER),NW);
  CLOSE (TOF);
  READFILESINTAPEIMAGE;
END;
{---[writefoutbuf]----------------------------------------------------------}
PROCEDURE WRITEFOUTBUF;
VAR TOF       : FILE;
    TAPESIZE  : LONGINT;
    CURNAME   : STRING[16];
    ATMHEADER : ATMFILEREC;
    FPOS      : LONGINT;
    PREV      : LONGINT;
    I         : WORD;
    NW        : WORD;
    DUMMY     : INTEGER;
BEGIN
  IF (FOUTOPEN=0) OR (FOUTBUFPTR=0) THEN EXIT;
  IF LENGTH(TAPEIMAGENAME) = 0 THEN
  BEGIN
    FOUTERRORSND;
    FOUTOPEN := 0;
    EXIT;
  END;
  DUMMY := IORESULT;
  ASSIGN (TOF,TAPEIMAGENAME+'.TAP');
  RESET (TOF,1);
  IF IORESULT <> 0 THEN
  BEGIN
    FOUTERRORSND;
    FOUTOPEN := 0;
    EXIT;
  END;
  TAPESIZE := FILESIZE(TOF);
  FPOS := 0;
  PREV := 0;
  I := 0;
  WHILE FPOS < TAPESIZE DO
  BEGIN
    PREV := FPOS;
    ATMHEADER := ATOMFILES[I];
    INC (FPOS,SIZEOF(ATMHEADER)+LONGINT(ATMHEADER.DATASIZE));
    INC (I);
  END;
  FPOS := PREV;
  CURNAME := '';
  I := 0;
  WHILE (I < 16) AND (ATMHEADER.ATMNAME[I] <> #$00) DO
  BEGIN
    CURNAME := CURNAME + ATMHEADER.ATMNAME[I];
    INC (I);
  END;
  IF (CURNAME <> FOUTNAME) OR (TAPEIMAGENAME <> IMAGEFOUTNAME) THEN
  BEGIN
    CLOSE (TOF);
    FOUTERRORSND;
    FOUTOPEN := 0;
    EXIT;
  END;
  INC (ATMHEADER.DATASIZE,FOUTBUFPTR);
  SEEK (TOF,FPOS);
  BLOCKWRITE (TOF,ATMHEADER,SIZEOF(ATMHEADER),NW);
  SEEK (TOF,TAPESIZE);
  BLOCKWRITE (TOF,FOUTBUF^,FOUTBUFPTR,NW);
  CLOSE (TOF);
  FOUTBUFPTR := 0;
  READFILESINTAPEIMAGE;
END;
{---[writebmp]--------------------------------------------------------------}
PROCEDURE WRITEBMP;
LABEL 1,2;
CONST BUFSIZE = $6000;
VAR TOF    : FILE;
    BMPNR  : ARRAY[1..4] OF CHAR;
    I      : BYTE;
    BUF    : POINTER;
    BUFOFS : WORD;
    BUFSEG : WORD;
    NR     : WORD;
BEGIN
  FOR I := 0 TO SIZEOF(BMPHEADER) DO BMPHEADER[I] := $00;
  BMPHEADER[$00] := $42; BMPHEADER[$01] := $4D; BMPHEADER[$02] := $76;
  BMPHEADER[$03] := $70; BMPHEADER[$0A] := $76; BMPHEADER[$0E] := $28;
  BMPHEADER[$13] := $01; BMPHEADER[$16] := $C0; BMPHEADER[$1A] := $01;
  BMPHEADER[$1C] := $04; BMPHEADER[$23] := $60; BMPHEADER[$2E] := $10;
  BMPHEADER[$32] := $10;
  ASM;
               MOV   CX,$0010
               SUB   SI,SI
               SUB   DI,DI
  @LP1:        MOV   AL,BYTE PTR EMULCOLORS[CS:SI]
               SHL   AL,2
               MOV   BYTE PTR BMPHEADER[DI+$0038],AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:SI+$01]
               SHL   AL,2
               MOV   BYTE PTR BMPHEADER[DI+$0037],AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:SI+$02]
               SHL   AL,2
               MOV   BYTE PTR BMPHEADER[DI+$0036],AL
               ADD   SI,+$03
               ADD   DI,+$04
               LOOP  @LP1
  END;
  GETMEM (BUF,BUFSIZE);
  BUFOFS := OFS(BUF^);
  BUFSEG := SEG(BUF^);
  ASM;
               PUSH  DS
               MOV   DI,WORD PTR BUFOFS
               MOV   ES,WORD PTR BUFSEG
               MOV   SI,$0140+191*$0120
               MOV   AX,$A000
               MOV   DS,AX
               MOV   DL,+192
  @LP1:        MOV   DH,$40
  @LP2:        MOV   BX,$C0C0
               SUB   CX,CX
  @LP3:        MOV   AX,WORD PTR [SI]
               AND   AX,BX
               TEST  AH,$FF
               JZ    @SK1
               OR    CL,$02
  @SK1:        TEST  AL,$FF
               JZ    @SK2
               OR    CL,$01
  @SK2:        MOV   AX,WORD PTR [SI+$02]
               AND   AX,BX
               TEST  AH,$FF
               JZ    @SK3
               OR    CL,$08
  @SK3:        TEST  AL,$FF
               JZ    @SK4
               OR    CL,$04
  @SK4:        ROL   CX,4
               SHR   BX,2
               JNZ   @LP3
               ROR   CX,4
               XCHG  CL,CH
               MOV   WORD PTR [ES:DI],CX
               ADD   SI,+$04
               ADD   DI,+$02
               DEC   DH
               JNZ   @LP2
               SUB   SI,$40*4+$0120
               DEC   DL
               JNZ   @LP1
               POP   DS
  END;
  BMPNR := '0000';
1:ASSIGN (TOF,'ATOM'+BMPNR+'.BMP');
  RESET (TOF,1);
  IF IORESULT = 0 THEN
  BEGIN
    CLOSE (TOF);
    I := 4;
2:  INC (BMPNR[I]);
    IF BMPNR[I] > '9' THEN
    BEGIN
      BMPNR[I] := '0';
      DEC (I);
      IF I >= 1 THEN GOTO 2;
      FREEMEM (BUF,BUFSIZE);
      EXIT;
    END;
    GOTO 1;
  END;
  REWRITE (TOF,1);
  BLOCKWRITE (TOF,BMPHEADER,SIZEOF(BMPHEADER),NR);
  BLOCKWRITE (TOF,BUF^,BUFSIZE,NR);
  CLOSE (TOF);
  FREEMEM (BUF,BUFSIZE);
END;
{---[insertinimage]---------------------------------------------------------}
PROCEDURE INSERTINIMAGE (FILEPTR:INTEGER; HEADER:ATMFILEREC; DATA:POINTER;
                         VAR CODE:WORD);
CONST BUFSIZE = $1000;
VAR FROMF,TOF : FILE;
    I         : WORD;
    NR,NW     : WORD;
    FPOS      : LONGINT;
    AANT      : LONGINT;
    MAX       : WORD;
    BUF       : POINTER;
    TMPHEADER : ATMFILEREC;
    DUMMY     : INTEGER;
BEGIN
  IF LENGTH(TAPEIMAGENAME) = 0 THEN
  BEGIN
    CODE := $8000; {---no tape image selected---}
    EXIT;
  END;
  DUMMY := IORESULT;
  ASSIGN (FROMF,TAPEIMAGENAME+'.TAP');
  RESET (FROMF,1);
  IF IORESULT <> 0 THEN
  BEGIN
    CODE := $8000; {---tape image not found---}
    EXIT;
  END;
  ASSIGN (TOF,'ATOMTEMP.TMP');
  REWRITE (TOF,1);
  IF IORESULT <> 0 THEN
  BEGIN
    CLOSE (FROMF);
    CODE := $8000; {---dos write error---}
    EXIT;
  END;
  FPOS := 0;
  I := 0;
  WHILE I < FILEPTR DO
  BEGIN
    TMPHEADER := ATOMFILES[I];
    INC (FPOS,SIZEOF(TMPHEADER)+LONGINT(TMPHEADER.DATASIZE));
    INC (I);
  END;
  AANT := FPOS;
  GETMEM (BUF,BUFSIZE);
  WHILE AANT > 0 DO
  BEGIN
    MAX := BUFSIZE;
    IF MAX > AANT THEN MAX := AANT;
    BLOCKREAD (FROMF,BUF^,MAX,NR);
    BLOCKWRITE (TOF,BUF^,NR,NW);
    IF NR<>NW THEN
    BEGIN
      FREEMEM (BUF,BUFSIZE);
      CLOSE (TOF);
      ERASE (TOF);
      CLOSE (FROMF);
      CODE := $8000; {---dos read/write error---}
      EXIT;
    END;
    DEC (AANT,LONGINT(NW));
  END;
  BLOCKWRITE (TOF,HEADER,SIZEOF(HEADER),NW);
  IF NW <> SIZEOF(HEADER) THEN
  BEGIN
    FREEMEM (BUF,BUFSIZE);
    CLOSE (TOF);
    ERASE (TOF);
    CLOSE (FROMF);
    CODE := $8000; {---dos write error---}
    EXIT;
  END;
  BLOCKWRITE (TOF,DATA^,HEADER.DATASIZE,NW);
  IF NW <> HEADER.DATASIZE THEN
  BEGIN
    FREEMEM (BUF,BUFSIZE);
    CLOSE (TOF);
    ERASE (TOF);
    CLOSE (FROMF);
    CODE := $8000; {---dos write error---}
    EXIT;
  END;
  IF FILEPTR < AANTALATOMFILES THEN
  BEGIN
    REPEAT
      BLOCKREAD (FROMF,BUF^,BUFSIZE,NR);
      BLOCKWRITE (TOF,BUF^,NR,NW);
    UNTIL NR=0;
  END;
  FREEMEM (BUF,BUFSIZE);
  CLOSE (TOF);
  CLOSE (FROMF);
  ERASE (FROMF);
  RENAME (TOF,TAPEIMAGENAME+'.TAP');
  READFILESINTAPEIMAGE;
  CODE := $0000;
END;
{---[save]------------------------------------------------------------------}
PROCEDURE SAVE (TABLEOFS:WORD; FILEPOINTER:INTEGER; VAR CODE:WORD);
VAR W         : WORD;
    I         : WORD;
    FILENAME  : STRING[16];
    ATMHEADER : ATMFILEREC;
    SOURCE    : POINTER;
BEGIN
  W := MEMW[ATOMMEMSEG:TABLEOFS];
  FILENAME := '';
  I := 0;
  WHILE (I < 16) AND (MEM[ATOMMEMSEG:W+I] <> $0D) DO
  BEGIN
    FILENAME := FILENAME + CHR(MEM[ATOMMEMSEG:W+I]);
    INC(I);
  END;
  IF LENGTH(FILENAME)=0 THEN FILENAME := 'FILE';
  FOR I := 0 TO 15 DO ATMHEADER.ATMNAME[I] := #$00;
  FOR I := 1 TO LENGTH(FILENAME) DO ATMHEADER.ATMNAME[PRED(I)] := FILENAME[I];
  ATMHEADER.STARTADRS := MEMW[ATOMMEMSEG:TABLEOFS+2];
  ATMHEADER.EXECADRS := MEMW[ATOMMEMSEG:TABLEOFS+4];
  W := MEMW[ATOMMEMSEG:TABLEOFS+8] - MEMW[ATOMMEMSEG:TABLEOFS+6];
  ATMHEADER.DATASIZE := W;
  SOURCE := PTR(ATOMMEMSEG,MEMW[ATOMMEMSEG:TABLEOFS+6]);
  INSERTINIMAGE (FILEPOINTER,ATMHEADER,SOURCE,CODE);
END;
{---[freeze]----------------------------------------------------------------}
PROCEDURE FREEZE;
CONST BUFSIZE = $FFF8;
VAR TOF       : FILE;
    BUF       : POINTER;
    P         : POINTER;
    BUFSEG    : WORD;
    LASTOFS   : WORD;
    SRC       : WORD;
    DST       : WORD;
    AANT      : WORD;
    NR        : WORD;
    B         : BYTE;
    ATMHEADER : ATMFILEREC;
    DUMMY     : INTEGER;
BEGIN
  IF AANTALATOMFILES >= MAXAANTFILES THEN EXIT;
  ATMHEADER.ATMNAME := 'FROZEN FILE'+#0+#0+#0+#0+#0;
  GETMEM (BUF,BUFSIZE);
  BUFSEG := SEG(BUF^);
  IF OFS(BUF^) <> $0000 THEN INC (BUFSEG);
  LASTOFS := $0000;
  DST := $0002;
  SRC := $0000;
  WHILE SRC <= $9FFF DO
  BEGIN
    B := MEM[ATOMMEMSEG:SRC];
    IF SRC <= $9FFB THEN
    BEGIN
      IF (B = MEM[ATOMMEMSEG:SRC+1]) AND
         (B = MEM[ATOMMEMSEG:SRC+2]) AND
         (B = MEM[ATOMMEMSEG:SRC+3]) AND
         (B = MEM[ATOMMEMSEG:SRC+4]) THEN
      BEGIN
        AANT := 5;
        WHILE (SRC+AANT <= $9FFF) AND (B = MEM[ATOMMEMSEG:SRC+AANT]) DO INC (AANT);
        MEMW[BUFSEG:LASTOFS] := DST-(LASTOFS+2);
        LASTOFS := DST;
        INC (DST,2);
        MEMW[BUFSEG:DST] := AANT;
        INC (DST,2);
        MEM[BUFSEG:DST] := B;
        INC (DST);
        INC (SRC,AANT);
      END ELSE
      BEGIN
        MEM[BUFSEG:DST] := B;
        INC (DST);
        INC (SRC);
      END;
    END ELSE
    BEGIN
      MEM[BUFSEG:DST] := B;
      INC (DST);
      INC (SRC);
    END;
  END;
  MEMW[BUFSEG:LASTOFS] := DST-(LASTOFS+2);
  MEMW[BUFSEG:DST] := $FFFF;
  INC (DST,2);
  FOR SRC := $B000 TO $B003 DO
  BEGIN
    MEM[BUFSEG:DST] := MEM[ATOMMEMSEG:SRC];
    INC (DST);
  END;
  FOR SRC := $B800 TO $B80F DO
  BEGIN
    MEM[BUFSEG:DST] := MEM[ATOMMEMSEG:SRC];
    INC (DST);
  END;
  MEM[BUFSEG:DST] := TEMPMOUSEDAT.B_BFE0;
  INC (DST);
  MEM[BUFSEG:DST] := TEMPMOUSEDAT.B_BFE1;
  INC (DST);
  MEM[BUFSEG:DST] := TEMPMOUSEDAT.B_MOUSENR;
  INC (DST);
  MEMW[BUFSEG:DST] := TEMPMOUSEDAT.MOUSEX;
  INC (DST,2);
  MEMW[BUFSEG:DST] := TEMPMOUSEDAT.MOUSEY;
  INC (DST,2);
  FOR SRC := $0000 TO $013F DO
  BEGIN
    MEM[BUFSEG:DST] := MEM[ATOMMEMSEG+$2000:SRC];
    INC (DST);
  END;
  MEM[BUFSEG:DST] := MEM[CSEG:OFS(AANTBOXRET)];
  INC (DST);
  FOR SRC := $00 TO $3F DO
  BEGIN
    MEM[BUFSEG:DST] := MEM[CSEG:OFS(BOXRETURNS)+SRC];
    INC (DST);
  END;
  FOR SRC := $BFF6 TO $BFFF DO
  BEGIN
    MEM[BUFSEG:DST] := MEM[ATOMMEMSEG:SRC];
    INC (DST);
  END;
  MEM [BUFSEG:DST] := MEM [CSEG:OFS(GRAPHMODE)];    INC (DST);
  MEMW[BUFSEG:DST] := MEMW[CSEG:OFS(PROGRAMCNT)];   INC (DST,2);
  MEMW[BUFSEG:DST] := MEMW[CSEG:OFS(STACKPOINTER)]; INC (DST,2);
  MEM [BUFSEG:DST] := MEM [CSEG:OFS(ACCUMULATOR)];  INC (DST);
  MEM [BUFSEG:DST] := MEM [CSEG:OFS(FLAGREGISTER)]; INC (DST);
  MEM [BUFSEG:DST] := MEM [CSEG:OFS(XREGISTER)];    INC (DST);
  MEM [BUFSEG:DST] := MEM [CSEG:OFS(YREGISTER)];    INC (DST);
  MEM [BUFSEG:DST] := MEM [CSEG:OFS(ACCU_B)];       INC (DST);
  MEM [BUFSEG:DST] := MEM [CSEG:OFS(CPUSPEEDMODE)]; INC (DST);
  MEM [BUFSEG:DST] := MEM [CSEG:OFS(ALTKEYB)];      INC (DST);
  MEM [BUFSEG:DST] := MEM [CSEG:OFS(T2L_L)];        INC (DST);
  MEM [BUFSEG:DST] := MEM [CSEG:OFS(IRQDELAY)];     INC (DST);
  P := PTR (BUFSEG,$0000);
  DUMMY := IORESULT;
  ASSIGN (TOF,TAPEIMAGENAME+'.TAP');
  RESET (TOF,1);
  IF IORESULT <> 0 THEN
  BEGIN
    FREEMEM (BUF,BUFSIZE);
    EXIT;
  END;
  SEEK (TOF,FILESIZE(TOF));
  ATMHEADER.STARTADRS := $FFFF;
  ATMHEADER.EXECADRS := $FFFC; {not (freeze version)}
  ATMHEADER.DATASIZE := DST;
  BLOCKWRITE (TOF,ATMHEADER,SIZEOF(ATMHEADER),NR);
  BLOCKWRITE (TOF,P^,DST,NR);
  CLOSE (TOF);
  ATOMFILES[AANTALATOMFILES] := ATMHEADER;
  INC (AANTALATOMFILES);
  FREEMEM (BUF,BUFSIZE);
END;
{---[deletefile]------------------------------------------------------------}
PROCEDURE DELETEFILE (WHICHFILE:WORD);
CONST BUFSIZE = $8000;
VAR FROMF,TOF : FILE;
    ATMHEADER : ATMFILEREC;
    FPOS      : LONGINT;
    AANT      : LONGINT;
    I,MAX     : WORD;
    NR,NW     : WORD;
    BUF       : POINTER;
    DUMMY     : INTEGER;
BEGIN
  DUMMY := IORESULT;
  ASSIGN (FROMF,TAPEIMAGENAME+'.TAP');
  RESET (FROMF,1);
  IF IORESULT <> 0 THEN EXIT;
  ASSIGN (TOF,'ATOMTEMP.TMP');
  REWRITE (TOF,1);
  IF IORESULT <> 0 THEN
  BEGIN
    CLOSE (FROMF);
    EXIT;
  END;
  FPOS := 0;
  I := 0;
  WHILE I < WHICHFILE DO
  BEGIN
    ATMHEADER := ATOMFILES[I];
    INC (FPOS,SIZEOF(ATMHEADER)+LONGINT(ATMHEADER.DATASIZE));
    INC (I);
  END;
  AANT := FPOS;
  GETMEM (BUF,BUFSIZE);
  WHILE AANT > 0 DO
  BEGIN
    MAX := BUFSIZE;
    IF MAX > AANT THEN MAX := AANT;
    BLOCKREAD (FROMF,BUF^,MAX,NR);
    BLOCKWRITE (TOF,BUF^,NR,NW);
    IF NR<>NW THEN
    BEGIN
      FREEMEM (BUF,BUFSIZE);
      CLOSE (TOF);
      ERASE (TOF);
      CLOSE (FROMF);
      EXIT;
    END;
    DEC (AANT,LONGINT(NW));
  END;
  ATMHEADER := ATOMFILES[I];
  INC (FPOS,SIZEOF(ATMHEADER)+LONGINT(ATMHEADER.DATASIZE));
  SEEK (FROMF,FPOS);
  IF WHICHFILE < AANTALATOMFILES THEN
  BEGIN
    REPEAT
      BLOCKREAD (FROMF,BUF^,BUFSIZE,NR);
      BLOCKWRITE (TOF,BUF^,NR,NW);
    UNTIL (NR=0);
  END;
  FREEMEM (BUF,BUFSIZE);
  CLOSE (TOF);
  CLOSE (FROMF);
  ERASE (FROMF);
  RENAME (TOF,TAPEIMAGENAME+'.TAP');
  READFILESINTAPEIMAGE;
END;
{---[export]----------------------------------------------------------------}
PROCEDURE EXPORT (WHICHFILE:WORD);
CONST BUFSIZE = $8000;
VAR FROMF,TOF : FILE;
    ATMHEADER : ATMFILEREC;
    FILENAME  : STRING[16];
    CH        : CHAR;
    I,AANT    : WORD;
    NR,NW     : WORD;
    FPOS      : LONGINT;
    BUF       : POINTER;
    DUMMY     : INTEGER;
BEGIN
  ATMHEADER := ATOMFILES[WHICHFILE];
  FILENAME := '';
  I := 0;
  WHILE (I < 16) AND (ATMHEADER.ATMNAME[I] <> #$0D) DO
  BEGIN
    CH := ATMHEADER.ATMNAME[I];
    IF ((CH >= '0') AND (CH <= '9')) OR ((CH >= 'A') AND (CH <= 'Z')) THEN
    BEGIN
      FILENAME := FILENAME + CH;
    END;
    INC(I);
  END;
  IF LENGTH(FILENAME) = 0 THEN FILENAME := 'FILE';
  IF LENGTH(FILENAME) > 8 THEN
  BEGIN
    I := LENGTH(FILENAME);
    WHILE (LENGTH(FILENAME) > 8) AND (I > 0) DO
    BEGIN
      IF ((FILENAME[I] <= 'A') OR (FILENAME[I] = 'E') OR
          (FILENAME[I] = 'I') OR (FILENAME[I] = 'O') OR
          (FILENAME[I] = 'U') OR (FILENAME[I] = 'Y') OR
          (FILENAME[I] > 'Z'))
         AND NOT ((FILENAME[I] >= '0') AND (FILENAME[I] <= '9')) THEN
      BEGIN
        DELETE (FILENAME,I,1);
        I := LENGTH(FILENAME);
      END ELSE
      BEGIN
        DEC (I);
      END;
    END;
    IF LENGTH(FILENAME) > 8 THEN FILENAME := COPY(FILENAME,1,8);
  END;
  DUMMY := IORESULT;
  ASSIGN (TOF,FILENAME+'.ATM');
  RESET (TOF,1);
  IF IORESULT = 0 THEN
  BEGIN
    CLOSE (TOF);
    ERRORSND;
    EXIT;
  END;
  REWRITE (TOF,1);
  IF IORESULT <> 0 THEN EXIT;
  BLOCKWRITE (TOF,ATMHEADER,SIZEOF(ATMHEADER),NW);
  IF NW <> SIZEOF(ATMHEADER) THEN
  BEGIN
    CLOSE (TOF);
    ERASE (TOF);
    EXIT;
  END;
  ASSIGN (FROMF,TAPEIMAGENAME+'.TAP');
  RESET (FROMF,1);
  IF IORESULT <> 0 THEN
  BEGIN
    CLOSE (TOF);
    ERASE (TOF);
    EXIT;
  END;
  FPOS := 0;
  I := 0;
  WHILE I < WHICHFILE DO
  BEGIN
    ATMHEADER := ATOMFILES[I];
    INC (FPOS,SIZEOF(ATMHEADER)+LONGINT(ATMHEADER.DATASIZE));
    INC (I);
  END;
  INC (FPOS,SIZEOF(ATMHEADER));
  SEEK (FROMF,FPOS);
  IF IORESULT <> 0 THEN
  BEGIN
    CLOSE (FROMF);
    CLOSE (TOF);
    ERASE (TOF);
    EXIT;
  END;
  I := ATOMFILES[WHICHFILE].DATASIZE;
  GETMEM (BUF,BUFSIZE);
  REPEAT
    AANT := I;
    IF AANT > BUFSIZE THEN AANT := BUFSIZE;
    DEC (I,AANT);
    BLOCKREAD (FROMF,BUF^,AANT,NR);
    BLOCKWRITE (TOF,BUF^,NR,NW);
  UNTIL I=0;
  FREEMEM (BUF,BUFSIZE);
  CLOSE (FROMF);
  CLOSE (TOF);
END;
{---[import]----------------------------------------------------------------}
PROCEDURE IMPORT (ATMFILEPTR,IMPFILEPTR:INTEGER; VAR CODE:WORD);
CONST BUFSIZE = $FFF8;
VAR BUF       : POINTER;
    BUFOFS    : WORD;
    BUFSEG    : WORD;
    ATMHEADER : ATMFILEREC;
    FILENAME  : STRING[13];
    FILEHANDLE: WORD;
    FNOFS     : WORD;
    ATOFS     : WORD;
    NR        : WORD;
    RESULTAAT : BYTE;
CONST ATMSIZE = SIZEOF(ATMHEADER);
BEGIN
  CODE := $8000;
  FILENAME := '';
  NR := 0;
  WHILE (NR < 12) AND (IMPFILES[IMPFILEPTR].ATMNAME[NR] <> #$00) DO
  BEGIN
    FILENAME := FILENAME + IMPFILES[IMPFILEPTR].ATMNAME[NR];
    INC (NR);
  END;
  FILENAME := FILENAME + #$00;
  FNOFS := SUCC(OFS(FILENAME));
  ATOFS := OFS(ATMHEADER);
  GETMEM (BUF,BUFSIZE);
  BUFOFS := OFS(BUF^);
  BUFSEG := SEG(BUF^);
  ASM;
               MOV   BYTE PTR RESULTAAT,$01
               PUSH  DS
               MOV   AX,$3D00
               MOV   DX,WORD PTR FNOFS
               PUSH  SS
               POP   DS
               INT   $21 {open file}
               POP   DS
               JC    @EINDE
               MOV   WORD PTR FILEHANDLE,AX
               PUSH  DS
               MOV   AH,$3F {read from file}
               MOV   BX,WORD PTR FILEHANDLE
               MOV   CX,ATMSIZE
               MOV   DX,WORD PTR ATOFS
               PUSH  SS
               POP   DS
               INT   $21
               POP   DS
               JC    @CLOSE
               CMP   AX,ATMSIZE
               JNZ   @CLOSE
               PUSH  DS
               MOV   AH,$3F {read from file}
               MOV   BX,WORD PTR FILEHANDLE
               MOV   CX,WORD PTR ATMHEADER[$0014] {atmheader.datasize}
               MOV   DX,WORD PTR BUFOFS
               MOV   DS,WORD PTR BUFSEG
               INT   $21
               POP   DS
               JC    @CLOSE
               CMP   AX,WORD PTR ATMHEADER[$0014]
               JNZ   @CLOSE
               MOV   BYTE PTR RESULTAAT,$00
  @CLOSE:      MOV   AH,$3E {close file}
               MOV   BX,WORD PTR FILEHANDLE
               INT   $21
  @EINDE:
  END;
  IF RESULTAAT = 0 THEN INSERTINIMAGE (ATMFILEPTR,ATMHEADER,BUF,CODE)
                   ELSE ERRORSND;
  FREEMEM (BUF,BUFSIZE);
END;
{---[renamefile]------------------------------------------------------------}
PROCEDURE RENAMEFILE (WHICHFILE:INTEGER; SEGM,ADRS:WORD);
VAR F       : FILE;
    I       : WORD;
    NW      : WORD;
    FPOS    : LONGINT;
    SOURCE  : POINTER;
    DUMMY   : INTEGER;
BEGIN
  DUMMY := IORESULT;
  ASSIGN (F,TAPEIMAGENAME+'.TAP');
  RESET (F,1);
  IF IORESULT <> 0 THEN
  BEGIN
    CLOSE (F);
    EXIT;
  END;
  FPOS := 0;
  I := 0;
  WHILE I < WHICHFILE DO
  BEGIN
    INC (FPOS,SIZEOF(ATMFILEREC)+LONGINT(ATOMFILES[I].DATASIZE));
    INC (I);
  END;
  SEEK (F,FPOS);
  IF IORESULT <> 0 THEN
  BEGIN
    CLOSE (F);
    EXIT;
  END;
  SOURCE := PTR(SEGM,ADRS);
  MOVE (SOURCE^,ATOMFILES[WHICHFILE].ATMNAME,$10);
  BLOCKWRITE (F,ATOMFILES[WHICHFILE],SIZEOF(ATMFILEREC),NW);
  CLOSE (F);
  IF NW <> SIZEOF(ATMFILEREC) THEN READFILESINTAPEIMAGE;
END;
{---[createtapefile]--------------------------------------------------------}
PROCEDURE CREATETAPEFILE (SEGM,ADRS:WORD; VAR NEWTAPEPTR:WORD);
VAR F        : FILE;
    FILENAME : STRING[8];
    I        : WORD;
    DUMMY    : INTEGER;
BEGIN
  FILENAME := '';
  I := 0;
  WHILE (I < 8) AND (MEM[SEGM:ADRS+I] <> $00) DO
  BEGIN
    FILENAME := FILENAME + CHR(MEM[SEGM:ADRS+I]);
    INC (I);
  END;
  IF LENGTH(FILENAME) = 0 THEN FILENAME := 'NEWTAPE';
  DUMMY := IORESULT;
  ASSIGN (F,FILENAME+'.TAP');
  RESET (F,1);
  IF IORESULT = 0 THEN
  BEGIN
    CLOSE (F);
    ERRORSND;
    EXIT;
  END;
  REWRITE (F,1);
  CLOSE (F);
  READDIRECTORY;
  COPYWRITEPROT;
  NEWTAPEPTR := 0;
  WHILE FILENAME <> TAPEIMAGES[NEWTAPEPTR] DO INC(NEWTAPEPTR);
  TAPEIMAGENAME := FILENAME;
  READFILESINTAPEIMAGE;
END;
{---[creatediskfile]--------------------------------------------------------}
PROCEDURE CREATEDISKFILE (SEGM,ADRS:WORD; VAR NEWDISKPTR:WORD);
TYPE BUFTYPE = ARRAY[$00..$FF] OF BYTE;
VAR F        : FILE;
    FILENAME : STRING[8];
    I        : WORD;
    DUMMY    : INTEGER;
    BUF      : ^BUFTYPE;
BEGIN
  FILENAME := '';
  I := 0;
  WHILE (I < 8) AND (MEM[SEGM:ADRS+I] <> $00) DO
  BEGIN
    FILENAME := FILENAME + CHR(MEM[SEGM:ADRS+I]);
    INC (I);
  END;
  IF LENGTH(FILENAME) = 0 THEN FILENAME := 'NEWDISK';
  DUMMY := IORESULT;
  ASSIGN (F,FILENAME+'.DSK');
  RESET (F,1);
  IF IORESULT = 0 THEN
  BEGIN
    CLOSE (F);
    ERRORSND;
    EXIT;
  END;
  REWRITE (F,1);
  GETMEM (BUF,SIZEOF(BUFTYPE));
  FOR I := $00 TO $07 DO BUF^[I] := $20;
  FOR I := $08 TO PRED(SIZEOF(BUFTYPE)) DO BUF^[I] := $00;
  BLOCKWRITE (F,BUF^,SIZEOF(BUFTYPE));
  BUF^[$05] := $00;
  BUF^[$06] := $01;
  BUF^[$07] := $90;
  BLOCKWRITE (F,BUF^,SIZEOF(BUFTYPE));
  FOR I := $00 TO PRED(SIZEOF(BUFTYPE)) DO BUF^[I] := $E5;
  FOR I := 2 TO PRED(40*10) DO BLOCKWRITE (F,BUF^,SIZEOF(BUFTYPE));
  FREEMEM (BUF,SIZEOF(BUFTYPE));
  CLOSE (F);
  READDIRECTORY;
  COPYWRITEPROT;
  NEWDISKPTR := 0;
  WHILE FILENAME <> DISKIMAGES[NEWDISKPTR] DO INC(NEWDISKPTR);
  READFILESINTAPEIMAGE;
END;
{---[tijd]------------------------------------------------------------------}
FUNCTION TIJD:LONGINT;
VAR H,M,S,T:WORD;
BEGIN
  GETTIME (H,M,S,T);
  TIJD := LONGINT(T) + LONGINT(S)*100 + LONGINT(M)*100*60 +
          LONGINT(H)*100*60*60;
END;
{---[wachteventjes (english: wait a moment)]--------------------------------}
PROCEDURE WACHTEVENTJES;
VAR STARTTIJD:LONGINT;
    HUIDIGETIJD:LONGINT;
BEGIN
  STARTTIJD := TIJD;
  REPEAT
    HUIDIGETIJD := TIJD;
  UNTIL (HUIDIGETIJD > STARTTIJD+60) OR (HUIDIGETIJD < STARTTIJD);
END;
{---[speedloop (used during emulation for delay)]---------------------------}
{This procedure will be filled with bytes F8h (CLC) by SETUPSPEEDLOOP.      }
{It is now filled with 0's because all the F8h's take up some much space.   }
{Depending on various parameters, between every emulated 65C02 instruction,a}
{CALL will be made to this procedure in order to get the correct delay count}
{The shorter the wait period must be, the futher back in this procedure the }
{CALL address will be. This depends on the PC's CPU speed, the number of    }
{cycles that a 65C02 instruction should take and the number of cycles the PC}
{needs to emulate this instruction. This procedure is filled with CLC for   }
{four reasons: Firstly, it is a one-byte instruction; Secondly, it always   }
{takes 2 cycles, regardless the CPU type; thirdly, it is not pairable with  }
{the Pentium's V- nor U-pipe; therefore n CLCs always take n x 2 cycles; and}
{finally, the value of the carry flag is of no importance when calling this.}
{---------------------------------------------------------------------------}
PROCEDURE SPEEDLOOP; ASSEMBLER;
ASM;
{0}            DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
{1000}         DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
{2000}         DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
{3000}         DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
               DD    0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0
END;
{---[setupspeedloop (fill up with CLC)]-------------------------------------}
PROCEDURE SETUPSPEEDLOOP; ASSEMBLER;
ASM;
               CLD
               MOV   AX,CS
               MOV   ES,AX
               MOV   DI,OFFSET SPEEDLOOP
               MOV   CX,+4000
               MOV   AL,$F8 {clc}
               REPZ
               STOSB
END;
{---[setcolors]-------------------------------------------------------------}
PROCEDURE SETCOLORS; ASSEMBLER;
ASM;
               PUSH  DS
               PUSH  DX
               PUSH  BX
               CLI
               MOV   AX,CS
               MOV   DS,AX
               MOV   SI,OFFSET EMULCOLORS
               SUB   BX,BX
@SETCOL1:      MOV   DX,$03C8
               MOV   AL,BL
               OUT   DX,AL
               INC   DX
               LODSB
               OUT   DX,AL
               LODSB
               OUT   DX,AL
               LODSB
               OUT   DX,AL
               INC   BL
               INC   BH
               CMP   BH,$10
               JB    @SETCOL1
               STI
               POP   BX
               POP   DX
               POP   DS
END;
{---[initatomgraph]---------------------------------------------------------}
PROCEDURE INITATOMGRAPH; ASSEMBLER;
ASM;
               MOV   AX,$0012
               INT   $10
               MOV   DX,$03D4
               MOV   AL,$09
               OUT   DX,AL
               INC   DX
               IN    AL,DX
               OR    AL,$80
               OUT   DX,AL {double scan active}
               MOV   DX,$03C4
               MOV   AL,$04
               OUT   DX,AL
               INC   DX
               IN    AL,DX
               OR    AL,$08
               OUT   DX,AL {chain 4 linear graphics mode}
               MOV   DX,$03D4
               MOV   AL,$14
               OUT   DX,AL
               INC   DX
               IN    AL,DX
               OR    AL,$40
               OUT   DX,AL {dword mode}
               DEC   DX
               MOV   AX,$0908
               OUT   DX,AX {preset rowscan: top border}
               MOV   AX,$2413
               OUT   DX,AX {logical screen line width}
               MOV   AL,$11
               OUT   DX,AL
               INC   DX
               IN    AL,DX
               AND   AL,$F0
               OR    AL,$09
               OUT   DX,AL {vertical retrace end}
               CALL  SETCOLORS
               MOV   AX,$1001
               MOV   BH,$07
               INT   $10
               MOV   BL,$00
@INITATGR1:    MOV   AX,$1000
               MOV   BH,BL
               PUSH  BX
               INT   $10
               POP   BX
               INC   BL
               CMP   BL,$10
               JNZ   @INITATGR1
               CLD
               MOV   AX,$A000
               MOV   ES,AX
               MOV   BYTE PTR [ES:$FFFF],$00
               SUB   DI,DI
               MOV   CX,$4000
@INITATGR2:    MOV   AX,$FFFF
               STOSW
               STOSB
               MOV   AL,$00
               STOSB
               LOOP  @INITATGR2
END;
{---[printstring; prints text after CALL and resumes execution after text]--}
PROCEDURE PRINTSTRING; ASSEMBLER;
ASM;
               PUSH  BP
               MOV   BP,SP
               MOV   SI,WORD PTR [SS:BP+$02]
               MOV   AL,BYTE PTR [CS:SI]
               INC   SI
               MOV   BYTE PTR [CS:CURSORX],AL
               MOV   AL,BYTE PTR [CS:SI]
               INC   SI
               MOV   BYTE PTR [CS:CURSORY],AL
               MOV   AL,BYTE PTR [CS:SI]
               INC   SI
               MOV   BL,AL
@PRINTSTR2:    MOV   AL,BYTE PTR [CS:SI]
               INC   SI
               AND   AL,$3F
               JZ    @PRINTSTR1
               CALL  PRINTCHAR
               JMP   @PRINTSTR2
@PRINTSTR1:    MOV   WORD PTR [SS:BP+$02],SI
               POP   BP
END;
{---[printbyte; AL=byte; BL=color]------------------------------------------}
PROCEDURE PRINTBYTE; ASSEMBLER;
ASM;
               PUSH  AX
               SHR   AL,4
               OR    AL,$30
               CMP   AL,$3A
               JB    @PRINTBYTE1
               SUB   AL,$39
@PRINTBYTE1:   CALL  PRINTCHAR
               POP   AX
               AND   AL,$0F
               OR    AL,$30
               CMP   AL,$3A
               JB    @PRINTBYTE2
               SUB   AL,$39
@PRINTBYTE2:   CALL  PRINTCHAR
END;
{---[printword; AX=word; BL=color]------------------------------------------}
PROCEDURE PRINTWORD; ASSEMBLER;
ASM;
               PUSH  AX
               MOV   AL,AH
               CALL  PRINTBYTE
               POP   AX
               CALL  PRINTBYTE
END;
{---[printdec]; AX=word; BL=color]------------------------------------------}
PROCEDURE PRINTDEC; ASSEMBLER;
ASM;
               MOV   CX,+10
               SUB   DX,DX
               DIV   CX
               OR    DL,$30
               MOV   BYTE PTR DECNUM[CS:$04],DL
               SUB   DX,DX
               DIV   CX
               OR    DL,$30
               MOV   BYTE PTR DECNUM[CS:$03],DL
               SUB   DX,DX
               DIV   CX
               OR    DL,$30
               MOV   BYTE PTR DECNUM[CS:$02],DL
               SUB   DX,DX
               DIV   CX
               OR    DL,$30
               MOV   BYTE PTR DECNUM[CS:$01],DL
               OR    AL,$30
               MOV   BYTE PTR DECNUM[CS:$00],AL
               MOV   BYTE PTR DECNUM[CS:$05],$00
@PRINTDEC2:    CMP   BYTE PTR DECNUM[CS:$00],'0'
               JNZ   @PRINTDEC1
               MOV   AX,WORD PTR DECNUM[CS:$01]
               MOV   WORD PTR DECNUM[CS:$00],AX
               MOV   AX,WORD PTR DECNUM[CS:$03]
               MOV   WORD PTR DECNUM[CS:$02],AX
               MOV   AL,BYTE PTR DECNUM[CS:$05]
               MOV   BYTE PTR DECNUM[CS:$04],AL
               JMP   @PRINTDEC2
@PRINTDEC1:    CMP   BYTE PTR DECNUM[CS:$00],$00
               JNZ   @PRINTDEC3
               MOV   BYTE PTR DECNUM[CS:$00],'0'
@PRINTDEC3:    PUSH  SI
               SUB   SI,SI
@PRINTDEC5:    MOV   AL,BYTE PTR DECNUM[CS:SI]
               OR    AL,AL
               JZ    @PRINTDEC4
               CALL  PRINTCHAR
               INC   SI
               JMP   @PRINTDEC5
@PRINTDEC4:    POP   SI
END;
{---[upperlines]------------------------------------------------------------}
PROCEDURE UPPERLINES; ASSEMBLER;
ASM;
               NOP
               SUB   AX,AX
               SUB   DI,DI
               MOV   CX,$4000
@UPPERL1:      MOV   AX,$00FF
               STOSW
               MOV   AX,$FFFF
               STOSW
               LOOP  @UPPERL1
               STI
               CALL  PRINTSTRING
               DB    +0,+0,$0F,'ACORN ATOM EMULATOR V1.32  BY WOUTER RAS'
               DB    'DISK  TAPE  OPTIONS  MONITOR',$00
               MOV   AL,'D' AND $3F
               MOV   BL,$09
               MOV   BYTE PTR [CS:CURSORX],+0
               MOV   BYTE PTR [CS:CURSORY],+1
               CALL  PRINTCHAR
               MOV   AL,'T' AND $3F
               MOV   BL,$09
               MOV   BYTE PTR [CS:CURSORX],+6
               CALL  PRINTCHAR
               MOV   AL,'O' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+12
               CALL  PRINTCHAR
               MOV   AL,'M' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+21
               CALL  PRINTCHAR
               MOV   AX,$FFFF
               MOV   DI,+9*$0120+$0140+12*4
               MOV   CX,+80
               REPZ
               STOSW
               MOV   DI,+19*$0120+$0140+12*4
               MOV   CX,+80
               REPZ
               STOSW
END;
{---[printdebugtxt]---------------------------------------------------------}
PROCEDURE PRINTDEBUGTXT; ASSEMBLER;
ASM;
               PUSH  DS
               PUSH  BX
               PUSH  CX
               PUSH  SI
               PUSH  DI
               MOV   AX,CS
               MOV   DS,AX
               MOV   SI,OFFSET DEBUGTXT
               MOV   DI,$0240
               MOV   CH,+17
@DBGMDON2:     MOV   CL,$04
@DBGMDON1:     MOV   WORD PTR [ES:DI],$00FF
               MOV   WORD PTR [ES:DI+$02],$FF00
               MOV   WORD PTR [ES:DI+$04],$00FF
               MOV   WORD PTR [ES:DI+$06],$FF00
               LODSB
               CALL  MAKEWIDER
               SUB   BX,BX
@DBGMDON3:     OR    BYTE PTR [ES:DI+BX],AH
               OR    BYTE PTR [ES:DI+$04+BX],AL
               INC   BL
               CMP   BL,$04
               JNZ   @DBGMDON3
               ADD   DI,+$08
               DEC   CL
               JNZ   @DBGMDON1
               ADD   DI,$0120-8*4
               DEC   CH
               JNZ   @DBGMDON2
               POP   DI
               POP   SI
               POP   CX
               POP   BX
               POP   DS
END;
{---[rebuildscreen]---------------------------------------------------------}
PROCEDURE REBUILDSCREEN; ASSEMBLER;
ASM;
               PUSHF
               CLI
               PUSH  BX
               PUSH  CX
               PUSH  DX
               MOV   BL,BYTE PTR [CS:GRAPHMODE]
               MOV   BH,$00
               SHL   BX,1
               MOV   CX,WORD PTR GRAPHTOP[CS:BX]
               MOV   DX,$8000
               SUB   CX,DX
               MOV   BX,WORD PTR UPDATETABLE[CS:BX]
@REBUILD1:     MOV   DI,DX
               CALL  BX
               INC   DX
               LOOP  @REBUILD1
               TEST  BYTE PTR [CS:BRKPNTON],$FF
               JZ    @REBUILD4
               CALL  PRINTDEBUGTXT
@REBUILD4:     POP   DX
               POP   CX
               POP   BX
               SUB   AX,AX
               MOV   WORD PTR [WACHTSCHULD],AX
               MOV   WORD PTR [PCCYCLES],AX
               POPF
END;
{---[keyreleasetel (byte)]--------------------------------------------------}
PROCEDURE KEYRELEASETEL; ASSEMBLER;
ASM;
END;
{---[keyrelease; BL=key#]---------------------------------------------------}
PROCEDURE KEYRELEASE; ASSEMBLER;
ASM;
               MOV   BH,$00
               MOV   BYTE PTR [CS:KEYRELEASETEL],$00
@KEYREL1:      CMP   BYTE PTR [CS:KEYRELEASETEL],+3
               JAE   @KEYREL2
               TEST  BYTE PTR TOETS[CS:BX],$03
               JNZ   @KEYREL1
@KEYREL2:
END;
{---[getcharcode (for usage in desktop)]------------------------------------}
PROCEDURE GETCHARCODE; ASSEMBLER;
ASM;
               NOP
               CLI   {shift,ctrl & alt not implemented yet}
               SUB   SI,SI
@CHARCODE2:    CMP   SI,$001D {---ctrl---}
               JZ    @CHARCODE7
               CMP   SI,$0038 {---alt---}
               JZ    @CHARCODE7
               CMP   SI,$002A {---left shift---}
               JZ    @CHARCODE7
               CMP   SI,$0036 {---right shift---}
               JZ    @CHARCODE7
               TEST  BYTE PTR TOETS[CS:SI],$03
               JNZ   @CHARCODE1
@CHARCODE7:    INC   SI
               CMP   SI,+$80
               JB    @CHARCODE2
@CHARCODE3:    STI
               PUSH  CX
               MOV   CX,$0800
@CHARCODE4:    DEC   CX
               JNZ   @CHARCODE4
               POP   CX
               JMP   GETCHARCODE
@CHARCODE1:    MOV   BYTE PTR TOETS[CS:SI],$80
               SHL   SI,1
               MOV   AX,WORD PTR BIOSCODE[CS:SI]
               CMP   AL,$FF
               JZ    @CHARCODE3
               TEST  BYTE PTR TOETS[CS:$2A],$03 {---left shift---}
               JNZ   @CHARCODE5
               TEST  BYTE PTR TOETS[CS:$36],$03 {---right shift---}
               JZ    @CHARCODE6
@CHARCODE5:    MOV   AL,AH
@CHARCODE6:    STI
END;
{---[inputword; ret carry clear if successful; AX=word]---------------------}
PROCEDURE INPUTWORD; ASSEMBLER;
ASM;
               MOV   BL,$0E
               MOV   AL,$7F
               CALL  PRINTCHAR
               SUB   BX,BX
@INPUTW2:      CALL  GETCHARCODE
               CMP   AL,$0D
               JZ    @INPUTW6
               CMP   AL,$1B
               JZ    @INPUTW7
               CMP   AL,$08
               JNZ   @INPUTW8
               OR    BL,BL
               JZ    @INPUTW2
               PUSH  BX
               DEC   BYTE PTR [CS:CURSORX]
               MOV   BL,$0E
               MOV   AL,' '
               CALL  PRINTCHAR
               SUB   BYTE PTR [CS:CURSORX],$02
               MOV   AL,$7F
               CALL  PRINTCHAR
               POP   BX
               DEC   BL
               JMP   @INPUTW2
@INPUTW8:      MOV   CL,AL
               CMP   AL,'0'
               JB    @INPUTW2
               CMP   AL,'9'
               JBE   @INPUTW5
               CMP   AL,'A'
               JB    @INPUTW2
               CMP   AL,'F'
               JA    @INPUTW2
               SUB   AL,$07
@INPUTW5:      SUB   AL,'0'
               CMP   BL,$04
               JAE   @INPUTW2
               MOV   BYTE PTR DECNUM[CS:BX],AL
               PUSH  BX
               DEC   BYTE PTR [CS:CURSORX]
               MOV   BL,$0E
               MOV   AL,CL
               AND   AL,$3F
               CALL  PRINTCHAR
               MOV   AL,$7F
               CALL  PRINTCHAR
               POP   BX
               INC   BL
               JMP   @INPUTW2
@INPUTW6:      OR    BL,BL
               JZ    @INPUTW7
               SUB   AX,AX
               SUB   DI,DI
@INPUTW10:     SHL   BYTE PTR DECNUM[CS:DI],4
               MOV   CX,$0004
@INPUTW9:      SHL   BYTE PTR DECNUM[CS:DI],1
               RCL   AX,1
               LOOP  @INPUTW9
               INC   DI
               DEC   BL
               JNZ   @INPUTW10
               CLC
               RETN
@INPUTW7:      TEST  BYTE PTR TOETS[CS:$01],$03
               JNZ   @INPUTW7
               STC
END;
{---[inputstring; CL=length; DS:DI-->buf; ret carry clear if successful]----}
PROCEDURE INPUTSTRING; ASSEMBLER;
ASM;
               PUSH  ES
               PUSH  DI
               PUSH  CX
               MOV   CH,$00
               MOV   AX,DS
               MOV   ES,AX
               MOV   AL,$00
               REPZ
               STOSB
               POP   CX
               POP   DI
               POP   ES
               MOV   BL,$0E
               MOV   AL,$7F
               CALL  PRINTCHAR
               SUB   BX,BX
@INPUTS2:      CALL  GETCHARCODE
               CMP   AL,$0D
               JZ    @INPUTS6
               CMP   AL,$1B
               JZ    @INPUTS7
               CMP   AL,$08
               JNZ   @INPUTS8
               OR    BL,BL
               JZ    @INPUTS2
               PUSH  BX
               DEC   BYTE PTR [CS:CURSORX]
               MOV   BL,$0E
               MOV   AL,' '
               CALL  PRINTCHAR
               SUB   BYTE PTR [CS:CURSORX],$02
               MOV   AL,$7F
               CALL  PRINTCHAR
               POP   BX
               DEC   BL
               JMP   @INPUTS2
@INPUTS8:      CMP   AL,' '
               JB    @INPUTS2
               CMP   AL,$60
               JAE   @INPUTS2
               CMP   BL,CL
               JAE   @INPUTS2
               MOV   BYTE PTR [DI+BX],AL
               PUSH  BX
               DEC   BYTE PTR [CS:CURSORX]
               MOV   BL,$0E
               AND   AL,$3F
               CALL  PRINTCHAR
               MOV   AL,$7F
               CALL  PRINTCHAR
               POP   BX
               INC   BL
               JMP   @INPUTS2
@INPUTS6:      OR    BL,BL
               JZ    @INPUTS7
@INPUTS3:      CMP   BL,CL
               JAE   @INPUTS1
               MOV   BYTE PTR [DI+BX],$00
               INC   BL
               JMP   @INPUTS3
@INPUTS1:      CLC
               RETN
@INPUTS7:      STC
END;
{---[checkexittape]---------------------------------------------------------}
PROCEDURE CHECKEXITTAPE; ASSEMBLER;
ASM;
               TEST  BYTE PTR TOETS[CS:$42],$03 {---f8---}
               JNZ   @TAPE93
               TEST  BYTE PTR TOETS[CS:$44],$03 {---f10---}
               JNZ   @TAPE91
               TEST  BYTE PTR TOETS[CS:$57],$03 {---f11---}
               JNZ   @TAPE92
               TEST  BYTE PTR TOETS[CS:$38],$03 {---alt---}
               JZ    @TAPE7
               TEST  BYTE PTR TOETS[CS:$18],$03 {---o---}
               JZ    @TAPE6
@TAPE91:       MOV   AL,$02
               RETN
@TAPE6:        TEST  BYTE PTR TOETS[CS:$32],$03 {---m---}
               JZ    @TAPE94
@TAPE92:       MOV   AL,$03
               RETN
@TAPE94:       TEST  BYTE PTR TOETS[CS:$20],$03 {---d---}
               JZ    @TAPE7
@TAPE93:       MOV   AL,$04
               RETN
@TAPE7:        TEST  BYTE PTR TOETS[CS:$01],$03 {---escape---}
               JZ    @TAPE8
               MOV   AL,$00
               RETN
@TAPE8:        MOV   AL,$FF
END;
{---[resetandload_ofs (word; holds offset for forward jump into main part)]-}
PROCEDURE RESETANDLOAD_OFS; ASSEMBLER;
ASM;
               DB    $00
END;
{---[lasttape (word)]-------------------------------------------------------}
PROCEDURE LASTTAPE; ASSEMBLER;
ASM;
               DW    $0000
END;
{---[vanaftape (word)]------------------------------------------------------}
PROCEDURE VANAFTAPE; ASSEMBLER;
ASM;
               DW    $0000
END;
{---[lastdisk (word)]-------------------------------------------------------}
PROCEDURE LASTDISK; ASSEMBLER;
ASM;
               DW    $0000
END;
{---[vanafdisk (word)]------------------------------------------------------}
PROCEDURE VANAFDISK; ASSEMBLER;
ASM;
               DW    $0000
END;
{---[vanafatm (word)]-------------------------------------------------------}
PROCEDURE VANAFATM; ASSEMBLER;
ASM;
               DW    $0000
END;
{---[lastatm (word)]--------------------------------------------------------}
PROCEDURE LASTATM; ASSEMBLER;
ASM;
               DW    $0000
END;
{---[vanafimp (word)]-------------------------------------------------------}
PROCEDURE VANAFIMP; ASSEMBLER;
ASM;
               DW    $0000
END;
{---[lastimp (word)]--------------------------------------------------------}
PROCEDURE LASTIMP; ASSEMBLER;
ASM;
               DW    $0000
END;
{---[importcode (word)]-----------------------------------------------------}
PROCEDURE IMPORTCODE; ASSEMBLER;
ASM;
               DW    $0000
END;
{---[showdir (AL=00:tape; AL=01:disk)]--------------------------------------}
PROCEDURE SHOWDIR; ASSEMBLER;
ASM;
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               OR    AL,AL
               JNZ   @SHOWDIR6
               MOV   AX,WORD PTR [CS:VANAFTAPE]
               MOV   BX,WORD PTR AANTALTAPEIMAGES
               MOV   CX,OFFSET TAPEIMAGES
               JMP   @SHOWDIR5
@SHOWDIR6:     MOV   AX,WORD PTR [CS:VANAFDISK]
               MOV   BX,WORD PTR AANTALDISKIMAGES
               MOV   CX,OFFSET DISKIMAGES
@SHOWDIR5:     MOV   WORD PTR @VANAF,AX
               MOV   WORD PTR @AANTALIMAGES,BX
               MOV   WORD PTR @OFSIMAGES,CX
               MOV   BYTE PTR [CS:CURSORY],+3
               MOV   AX,WORD PTR @VANAF
@SHOWDIR4:     PUSH  AX
               MOV   BYTE PTR [CS:CURSORX],+0
               CMP   AX,WORD PTR @AANTALIMAGES
               JAE   @SHOWDIR1
               MOV   CX,STR8GROOTTE
               MUL   CX
               ADD   AX,WORD PTR @OFSIMAGES
               MOV   SI,AX
               LODSB
               OR    AL,AL
               JZ    @SHOWDIR1
               MOV   AH,$00
               MOV   CX,AX
               MOV   BL,$0E
@SHOWDIR2:     LODSB
               AND   AL,$3F
               CALL  PRINTCHAR
               LOOP  @SHOWDIR2
@SHOWDIR1:     CMP   BYTE PTR [CS:CURSORX],+8
               JAE   @SHOWDIR3
               MOV   AL,' '
               CALL  PRINTCHAR
               JMP   @SHOWDIR1
@SHOWDIR3:     POP   AX
               INC   AX
               INC   BYTE PTR [CS:CURSORY]
               CMP   BYTE PTR [CS:CURSORY],+18
               JB    @SHOWDIR4
               MOV   AX,$FFFF
               MOV   DI,+(18*10-1)*$0120+$0140+12*4
               MOV   CX,+80
               REPZ
               STOSW
               POP   DS
               RETN
@VANAF:        DW    $0000
@AANTALIMAGES: DW    $0000
@OFSIMAGES:    DW    $0000
END;
{---[showatmfiles]----------------------------------------------------------}
PROCEDURE SHOWATMFILES; ASSEMBLER;
ASM;
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   BYTE PTR [CS:CURSORY],+3
               MOV   AX,WORD PTR [CS:VANAFATM]
@SHOWATM4:     PUSH  AX
               MOV   BYTE PTR [CS:CURSORX],+9
               CMP   AX,WORD PTR AANTALATOMFILES
               JAE   @SHOWATM6
               MOV   CX,ATMRECGROOTTE
               MUL   CX
               ADD   AX,OFFSET ATOMFILES
               MOV   SI,AX
               PUSH  SI
               MOV   CX,$0010
@SHOWATM2:     MOV   BL,$0E
               LODSB
               OR    AL,AL
               JZ    @SHOWATM1
               CMP   AL,'a'
               JB    @SHOWATM11
               CMP   AL,'z'
               JA    @SHOWATM11
               SUB   AL,'a'-'A'
               MOV   BL,$0C
@SHOWATM11:    AND   AL,$3F
               CALL  PRINTCHAR
               LOOP  @SHOWATM2
@SHOWATM1:     MOV   BL,$0E
               CMP   BYTE PTR [CS:CURSORX],+26
               JAE   @SHOWATM3
               MOV   AL,' '
               CALL  PRINTCHAR
               JMP   @SHOWATM1
@SHOWATM3:     POP   SI
               ADD   SI,+$10
               LODSW
               CMP   AX,$FFFF
               JZ    @SHOWATM8
@SHOWATM10:    CALL  PRINTWORD
               MOV   AL,' '
               CALL  PRINTCHAR
               LODSW
               CALL  PRINTWORD
               JMP   @SHOWATM9
@SHOWATM8:     CMP   WORD PTR [SI],$FFFC {not (freeze version)}
               JB    @SHOWATM10
               MOV   AL,'-'
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               MOV   AL,' '
               CALL  PRINTCHAR
               MOV   AL,'-'
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               ADD   SI,+$02
@SHOWATM9:     MOV   AL,' '
               CALL  PRINTCHAR
               LODSW
               CALL  PRINTWORD
               JMP   @SHOWATM5
@SHOWATM6:     MOV   CX,+31
               MOV   AL,' '
@SHOWATM7:     CALL  PRINTCHAR
               LOOP  @SHOWATM7
@SHOWATM5:     POP   AX
               INC   AX
               CMP   BYTE PTR [CS:CURSORY],+18
               JB    @SHOWATM4
               MOV   AX,$FFFF
               MOV   DI,+(18*10-1)*$0120+$0140+12*4
               MOV   CX,+80
               REPZ
               STOSW
               POP   DS
END;
{---[showimpfiles]----------------------------------------------------------}
PROCEDURE SHOWIMPFILES; ASSEMBLER;
ASM;
               MOV   AX,WORD PTR [CS:LASTIMP]
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               CMP   AX,WORD PTR AANTALIMPFILES
               POP   DS
               JBE   @SHOWIMP11
               SUB   AX,AX
               MOV   WORD PTR [CS:LASTIMP],AX
@SHOWIMP11:    CMP   AX,WORD PTR [CS:VANAFIMP]
               JAE   @SHOWIMP12
               MOV   WORD PTR [CS:VANAFIMP],AX
               JMP   @SHOWIMP13
@SHOWIMP12:    MOV   AX,WORD PTR [CS:VANAFIMP]
               ADD   AX,+15
               CMP   WORD PTR [CS:LASTIMP],AX
               JB    @SHOWIMP13
               INC   WORD PTR [CS:VANAFIMP]
               JMP   @SHOWIMP12
@SHOWIMP13:    PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   BYTE PTR [CS:CURSORY],+3
               MOV   AX,WORD PTR [CS:VANAFIMP]
@SHOWIMP4:     PUSH  AX
               MOV   BYTE PTR [CS:CURSORX],+9
               CMP   AX,WORD PTR AANTALIMPFILES
               JAE   @SHOWIMP6
               MOV   CX,ATMRECGROOTTE
               MUL   CX
               ADD   AX,OFFSET IMPFILES
               MOV   SI,AX
               PUSH  SI
               MOV   BL,$0E
               MOV   CX,$0010
@SHOWIMP2:     LODSB
               OR    AL,AL
               JZ    @SHOWIMP1
               AND   AL,$3F
               CALL  PRINTCHAR
               LOOP  @SHOWIMP2
@SHOWIMP1:     CMP   BYTE PTR [CS:CURSORX],+26
               JAE   @SHOWIMP3
               MOV   AL,' '
               CALL  PRINTCHAR
               JMP   @SHOWIMP1
@SHOWIMP3:     POP   SI
               ADD   SI,+$10
               LODSW
               CMP   AX,$FFFF
               JZ    @SHOWIMP8
@SHOWIMP10:    CALL  PRINTWORD
               MOV   AL,' '
               CALL  PRINTCHAR
               LODSW
               CALL  PRINTWORD
               JMP   @SHOWIMP9
@SHOWIMP8:     CMP   WORD PTR [SI],$FFFF
               JNZ   @SHOWIMP10
               MOV   AL,'-'
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               MOV   AL,' '
               CALL  PRINTCHAR
               MOV   AL,'-'
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               ADD   SI,+$02
@SHOWIMP9:     MOV   AL,' '
               CALL  PRINTCHAR
               LODSW
               CALL  PRINTWORD
               JMP   @SHOWIMP5
@SHOWIMP6:     MOV   CX,+31
               MOV   AL,' '
@SHOWIMP7:     CALL  PRINTCHAR
               LOOP  @SHOWIMP7
@SHOWIMP5:     POP   AX
               INC   AX
               CMP   BYTE PTR [CS:CURSORY],+18
               JB    @SHOWIMP4
               POP   DS
               MOV   AX,WORD PTR [CS:LASTIMP]
               SUB   AX,WORD PTR [CS:VANAFIMP]
               MOV   CX,+10*$0120
               MUL   CX
               ADD   AX,+30*$0120+$0140+12*4+9*4
               MOV   DI,AX
               MOV   CX,+31
               MOV   AL,$09
               CALL  XORPUT
               MOV   AX,$FFFF
               MOV   DI,+(18*10-1)*$0120+$0140+12*4
               MOV   CX,+80
               REPZ
               STOSW
END;
{---[bottomln2]-------------------------------------------------------------}
PROCEDURE BOTTOMLN2; ASSEMBLER;
ASM;
               MOV   AX,$FFFF
               MOV   DI,+(18*10-1)*$0120+$0140+12*4
               MOV   CX,+80
               REPZ
               STOSW
               MOV   DI,+20*$0120+$0140+12*4
               MOV   CX,+40
               MOV   AL,$0B
               CALL  XORPUT
END;
{---[tapebottomln]----------------------------------------------------------}
PROCEDURE TAPEBOTTOMLN; ASSEMBLER;
ASM;
               CMP   BYTE PTR [CS:TAPESCREEN],$00
               JNZ   @BOTTOMLN1
               CALL  PRINTSTRING
               DB    +0,+18,$0F,'OPEN  NEW                            ',$00
               MOV   AL,'O' AND $3F
               MOV   BL,$09
               MOV   BYTE PTR [CS:CURSORX],+0
               CALL  PRINTCHAR
               MOV   AL,'N' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+6
               CALL  PRINTCHAR
               JMP   BOTTOMLN2
@BOTTOMLN1:    CALL  PRINTSTRING
               DB    +0,+18,$0F,'SET LOAD REN IMPORT EXPORT DEL FREEZE',$00
               MOV   AL,'S' AND $3F
               MOV   BL,$09
               MOV   BYTE PTR [CS:CURSORX],+0
               CALL  PRINTCHAR
               MOV   AL,'L' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+4
               CALL  PRINTCHAR
               MOV   AL,'R' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+9
               CALL  PRINTCHAR
               MOV   AL,'I' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+13
               CALL  PRINTCHAR
               MOV   AL,'E' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+20
               CALL  PRINTCHAR
               MOV   AL,'D' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+27
               CALL  PRINTCHAR
               MOV   AL,'F' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+31
               CALL  PRINTCHAR
               JMP   BOTTOMLN2
END;
{---[newtapefile]-----------------------------------------------------------}
PROCEDURE NEWTAPEFILE; ASSEMBLER;
ASM;
               PUSH  ES
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,DS
               MOV   ES,AX
               MOV   AX,WORD PTR [CS:LASTTAPE]
               MOV   CX,STR8GROOTTE
               MUL   CX
               ADD   AX,OFFSET TAPEIMAGES
               MOV   SI,AX
               MOV   DI,OFFSET TAPEIMAGENAME
               MOV   CX,STR8GROOTTE
               REPZ
               MOVSB
               CALL  READFILESINTAPEIMAGE
               POP   DS
               POP   ES
               MOV   WORD PTR [CS:LASTATM],$0000
END;
{---[showall1tape]----------------------------------------------------------}
PROCEDURE SHOWALL1TAPE; ASSEMBLER;
ASM;
               MOV   AX,WORD PTR [CS:LASTTAPE]
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               CMP   AX,WORD PTR AANTALTAPEIMAGES
               POP   DS
               JBE   @SHOWALL7
               SUB   AX,AX
               MOV   WORD PTR [CS:LASTTAPE],AX
@SHOWALL7:     CMP   AX,WORD PTR [CS:VANAFTAPE]
               JAE   @SHOWALL3
               MOV   WORD PTR [CS:VANAFTAPE],AX
               JMP   @SHOWALL4
@SHOWALL3:     MOV   AX,WORD PTR [CS:VANAFTAPE]
               ADD   AX,+15
               CMP   WORD PTR [CS:LASTTAPE],AX
               JB    @SHOWALL4
               INC   WORD PTR [CS:VANAFTAPE]
               JMP   @SHOWALL3
@SHOWALL4:     MOV   AL,$00
               CALL  SHOWDIR
               MOV   AX,WORD PTR [CS:LASTTAPE]
               SUB   AX,WORD PTR [CS:VANAFTAPE]
               MOV   CX,+10*$0120
               MUL   CX
               ADD   AX,+30*$0120+$0140+12*4
               MOV   DI,AX
               MOV   CX,+8
               MOV   AL,$08
               CALL  XORPUT
END;
{---[showall2]--------------------------------------------------------------}
PROCEDURE SHOWALL2; ASSEMBLER;
ASM;
               MOV   AX,WORD PTR [CS:LASTATM]
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               CMP   AX,WORD PTR AANTALATOMFILES
               POP   DS
               JBE   @SHOWALL8
               SUB   AX,AX
               MOV   WORD PTR [CS:LASTATM],AX
@SHOWALL8:     CMP   AX,WORD PTR [CS:VANAFATM]
               JAE   @SHOWALL5
               MOV   WORD PTR [CS:VANAFATM],AX
               JMP   @SHOWALL6
@SHOWALL5:     MOV   AX,WORD PTR [CS:VANAFATM]
               ADD   AX,+15
               CMP   WORD PTR [CS:LASTATM],AX
               JB    @SHOWALL6
               INC   WORD PTR [CS:VANAFATM]
               JMP   @SHOWALL5
@SHOWALL6:     CALL  SHOWATMFILES
               CMP   BYTE PTR [CS:TAPESCREEN],$00
               JZ    @SHOWALL9
               MOV   AX,WORD PTR [CS:LASTATM]
               SUB   AX,WORD PTR [CS:VANAFATM]
               MOV   CX,+10*$0120
               MUL   CX
               ADD   AX,+30*$0120+$0140+12*4+9*4
               MOV   DI,AX
               MOV   CX,+31
               MOV   AL,$0A
               CALL  XORPUT
@SHOWALL9:
END;
{---[showall1disk]----------------------------------------------------------}
PROCEDURE SHOWALL1DISK; ASSEMBLER;
ASM;
               MOV   AX,WORD PTR [CS:LASTDISK]
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               CMP   AX,WORD PTR AANTALDISKIMAGES
               POP   DS
               JBE   @SHOWALL7
               SUB   AX,AX
               MOV   WORD PTR [CS:LASTDISK],AX
@SHOWALL7:     CMP   AX,WORD PTR [CS:VANAFDISK]
               JAE   @SHOWALL3
               MOV   WORD PTR [CS:VANAFDISK],AX
               JMP   @SHOWALL4
@SHOWALL3:     MOV   AX,WORD PTR [CS:VANAFDISK]
               ADD   AX,+15
               CMP   WORD PTR [CS:LASTDISK],AX
               JB    @SHOWALL4
               INC   WORD PTR [CS:VANAFDISK]
               JMP   @SHOWALL3
@SHOWALL4:     MOV   AL,$01
               CALL  SHOWDIR
               MOV   AX,WORD PTR [CS:LASTDISK]
               SUB   AX,WORD PTR [CS:VANAFDISK]
               MOV   CX,+10*$0120
               MUL   CX
               ADD   AX,+30*$0120+$0140+12*4
               MOV   DI,AX
               MOV   CX,+8
               MOV   AL,$09
               CALL  XORPUT
END;
{---[disk (desktop)]--------------------------------------------------------}
PROCEDURE DISK; ASSEMBLER;
ASM;
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   DI,+10*$0120+$0140+12*4
               MOV   CX,+4
               MOV   AL,$0B
               CALL  XORPUT
@DISK28:       MOV   DI,+20*$0120+$0140
               MOV   CX,+168*$0120/4
@DISK1:        MOV   AX,$00FF
               STOSW
               MOV   AX,$FFFF
               STOSW
               LOOP  @DISK1
               MOV   AX,CS
               MOV   DS,AX
               CALL  PRINTSTRING
               DB    +0,+18,$0F,'OPEN  NEW  SAVE  DRIVE          PROTECT',$00
               MOV   AL,'O' AND $3F
               MOV   BL,$09
               MOV   BYTE PTR [CS:CURSORX],+0
               MOV   BYTE PTR [CS:CURSORY],+18
               CALL  PRINTCHAR
               MOV   AL,'N' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+6
               CALL  PRINTCHAR
               MOV   AL,'S' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+11
               CALL  PRINTCHAR
               MOV   AL,'P' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+32
               CALL  PRINTCHAR
               CALL  PRINTSTRING
               DB    +23,+18,$09,'0 1 2 3',$00
               MOV   AX,$FFFF
               MOV   DI,+(18*10-1)*$0120+$0140+12*4
               MOV   CX,+80
               REPZ
               STOSW
               CALL  PRINTSTRING
               DB    +0,+2,$0C,'DISKIMG',$00
               MOV   DI,+20*$0120+12*4+8*4+$0140
               MOV   CX,+16*10-1
@DISK10:       AND   WORD PTR [ES:DI+$02],$FCFC
               ADD   DI,$0120
               LOOP  @DISK10
               MOV   AX,$FFFF
               MOV   DI,+29*$0120+$0140+12*4
               MOV   CX,+9
@DISK11:       STOSW
               INC   AX
               STOSW
               DEC   AX
               LOOP  @DISK11
               CALL  PRINTSTRING
               DB    +12,+5,$0C,'DRIVE 0:',$00
               CALL  PRINTSTRING
               DB    +12,+8,$0C,'DRIVE 1:',$00
               CALL  PRINTSTRING
               DB    +12,+11,$0C,'DRIVE 2:',$00
               CALL  PRINTSTRING
               DB    +12,+14,$0C,'DRIVE 3:',$00
               CALL  @XORPUTDRV
               MOV   AL,$01
               CALL  SHOWALL1DISK
               CALL  @SHOWDISKETTES
@DISK35:       MOV   AL,BYTE PTR TOETS[CS:$18] {---o---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               OR    AL,BYTE PTR TOETS[CS:$19] {---p---}
               AND   AL,$03
               JNZ   @DISK35
@DISK2:        TEST  BYTE PTR TOETS[CS:$0B],$03 {---0---}
               JZ    @DISK12
               CMP   BYTE PTR @DRIVE,$00
               JZ    @DISK12
               CALL  @XORPUTDRV
               MOV   BYTE PTR @DRIVE,$00
               CALL  @XORPUTDRV
               JMP   @DISK2
@DISK12:       MOV   BX,$0001
@DISK14:       TEST  BYTE PTR TOETS[CS:BX+$01],$03 {---1/2/3---}
               JZ    @DISK13
               CMP   BYTE PTR @DRIVE,BL
               JZ    @DISK13
               CALL  @XORPUTDRV
               MOV   BYTE PTR @DRIVE,BL
               CALL  @XORPUTDRV
               JMP   @DISK2
@DISK13:       INC   BL
               CMP   BL,$03
               JBE   @DISK14
               TEST  BYTE PTR TOETS[CS:$0F],$03 {---tab---}
               JZ    @DISK36
               MOV   AL,BYTE PTR TOETS[CS:$2A] {---left shift---}
               OR    AL,BYTE PTR TOETS[CS:$36] {---right shift---}
               AND   AL,$03
               JNZ   @DISK37
               CALL  @XORPUTDRV
               INC   BYTE PTR @DRIVE
@DISK39:       AND   BYTE PTR @DRIVE,$03
               CALL  @XORPUTDRV
               MOV   BL,$0F {---tab---}
               CALL  KEYRELEASE
               JMP   @DISK2
@DISK37:       CALL  @XORPUTDRV
               DEC   BYTE PTR @DRIVE
               JMP   @DISK39
@DISK36:       TEST  BYTE PTR TOETS[CS:$1F],$03 {---s---}
               JZ    @DISK15
               {---save ini-file---}
               CALL  PRINTSTRING
               DB    +24,+16,$0B,'WRITING INI-FILE',$00
               PUSH  ES
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  WRITEINIFILE
               POP   DS
               POP   ES
@DISK16:       TEST  BYTE PTR TOETS[CS:$1F],$03 {---s---}
               JNZ   @DISK16
               CALL  PRINTSTRING
               DB    +24,+16,$0B,'                ',$00
               JMP   @DISK2
@DISK15:       TEST  BYTE PTR TOETS[CS:$48],$03 {---up---}
               JZ    @DISK17
               CMP   WORD PTR [CS:LASTDISK],+$00
               JZ    @DISK2
               DEC   WORD PTR [CS:LASTDISK]
               MOV   AL,$01
               CALL  SHOWALL1DISK
               MOV   BL,$48 {---up---}
               CALL  KEYRELEASE
               JMP   @DISK2
@DISK17:       TEST  BYTE PTR TOETS[CS:$50],$03 {---down---}
               JZ    @DISK18
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALDISKIMAGES
               POP   DS
               CMP   WORD PTR [CS:LASTDISK],AX
               JAE   @DISK2
               INC   WORD PTR [CS:LASTDISK]
               MOV   AL,$01
               CALL  SHOWALL1DISK
               MOV   BL,$50 {---down---}
               CALL  KEYRELEASE
               JMP   @DISK2
@DISK18:       TEST  BYTE PTR TOETS[CS:$49],$03 {---page up---}
               JZ    @DISK20
               CMP   WORD PTR [CS:LASTDISK],+$00
               JZ    @DISK2
               SUB   WORD PTR [CS:LASTDISK],+14
               JNC   @DISK19
               MOV   WORD PTR [CS:LASTDISK],$0000
@DISK19:       MOV   AL,$01
               CALL  SHOWALL1DISK
               MOV   BL,$49 {---page up---}
               CALL  KEYRELEASE
               JMP   @DISK2
@DISK20:       TEST  BYTE PTR TOETS[CS:$51],$03 {---page down---}
               JZ    @DISK22
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALDISKIMAGES
               POP   DS
               CMP   WORD PTR [CS:LASTDISK],AX
               JAE   @DISK2
               ADD   WORD PTR [CS:LASTDISK],+14
               CMP   WORD PTR [CS:LASTDISK],AX
               JB    @DISK21
               MOV   WORD PTR [CS:LASTDISK],AX
@DISK21:       MOV   AL,$01
               CALL  SHOWALL1DISK
               MOV   BL,$51 {---page down---}
               CALL  KEYRELEASE
               JMP   @DISK2
@DISK22:       TEST  BYTE PTR TOETS[CS:$31],$03 {---n---}
               JZ    @DISK23
               MOV   BYTE PTR [CS:CURSORX],+11
               MOV   BYTE PTR [CS:CURSORY],+8
               MOV   BL,$09
               MOV   AL,01000101b
               CALL  PRINTCHAR
               MOV   CX,+16
               MOV   AL,01001100b
@DISK24:       CALL  PRINTCHAR
               LOOP  @DISK24
               MOV   AL,01001010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+11
               MOV   BYTE PTR [CS:CURSORY],+9
               MOV   AL,01010101b
               CALL  PRINTCHAR
               CALL  PRINTSTRING
               DB    +12,+9,$0C,' NEW DISK IMAGE ',$00
               MOV   BL,$09
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+11
               MOV   BYTE PTR [CS:CURSORY],+10
               MOV   AL,01010101b
               CALL  PRINTCHAR
               MOV   CX,+16
               MOV   AL,' '
@DISK25:       CALL  PRINTCHAR
               LOOP  @DISK25
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+11
               MOV   BYTE PTR [CS:CURSORY],+11
               MOV   AL,01010100b
               CALL  PRINTCHAR
               MOV   CX,+16
               MOV   AL,01001100b
@DISK26:       CALL  PRINTCHAR
               LOOP  @DISK26
               MOV   AL,01101000b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+16
               MOV   BYTE PTR [CS:CURSORY],+10
               MOV   BL,$31 {---n---}
               CALL  KEYRELEASE
               PUSH  DS
               MOV   AX,CS
               MOV   DS,AX
               MOV   DI,OFFSET FILENAMEBUF
               MOV   CL,$08
               CALL  INPUTSTRING
               POP   DS
               JC    @DISK27
               PUSH  ES
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               PUSH  CS {---segment of newname---}
               PUSH  OFFSET FILENAMEBUF {---offset of newname---}
               PUSH  CS {---segment of [CS:LASTDISK]---}
               PUSH  OFFSET [CS:LASTDISK] {---offset of [CS:LASTDISK]---}
               CALL  CREATEDISKFILE
               POP   DS
               POP   ES
@DISK27:       MOV   AL,BYTE PTR TOETS[CS:$01] {---escape---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               AND   AL,$03
               JNZ   @DISK27
               JMP   @DISK28
@DISK23:       TEST  BYTE PTR TOETS[CS:$38],$03 {---alt---}
               JNZ   @DISK29
               MOV   AL,BYTE PTR TOETS[CS:$18] {---o---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               AND   AL,$03
               JZ    @DISK29
               SUB   DI,DI
               MOV   AX,WORD PTR [CS:LASTDISK]
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               CMP   AX,WORD PTR AANTALDISKIMAGES
               POP   DS
               JZ    @DISK38
@DISK32:       MOV   BX,DI
               SHR   BL,1
               CMP   BL,BYTE PTR @DRIVE
               JZ    @DISK31
               PUSH  AX
               PUSH  DI
               CALL  @COMPAREDRIVE
               POP   DI
               POP   AX
               JZ    @DISK34
@DISK31:       ADD   DI,+$02
               CMP   DI,+$06
               JBE   @DISK32
               JMP   @DISK33
@DISK34:       CALL  ERRORSND
               JMP   @DISK28
@DISK38:       MOV   AL,BYTE PTR @DRIVE
               MOV   CL,+14
               MUL   CL
               MOV   DI,AX
               PUSH  DS
               PUSH  ES
               PUSHA
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   BYTE PTR DISKETTENAMES[DI],$00
               MOV   AL,BYTE PTR @DRIVE
               MOV   AH,$00
               PUSH  AX {drive#}
               CALL  CLOSE_DISK_IMAGE
               POPA
               POP   ES
               POP   DS
               JMP   @DISK28
@DISK33:       MOV   AL,BYTE PTR @DRIVE
               MOV   CL,+14
               MUL   CL
               MOV   DI,AX
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               CMP   BYTE PTR DISKETTENAMES[DI],$00
               POP   DS
               JZ    @DISK30
               PUSH  DS
               PUSH  ES
               PUSHA
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AL,BYTE PTR @DRIVE
               MOV   AH,$00
               PUSH  AX {drive#}
               CALL  CLOSE_DISK_IMAGE
               POPA
               POP   ES
               POP   DS
@DISK30:       PUSH  DS
               PUSH  ES
               PUSHA
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AL,BYTE PTR @DRIVE
               MOV   CL,+14
               MUL   CL
               MOV   BX,AX
               MOV   AX,WORD PTR [CS:LASTDISK]
               MOV   DI,AX
               SHL   AX,3
               ADD   AX,OFFSET DISKIMAGES
               ADD   DI,AX
               MOV   CX,+9
@DISK42:       MOV   AL,BYTE PTR [DI]
               MOV   BYTE PTR DISKETTENAMES[BX],AL
               INC   DI
               INC   BX
               LOOP  @DISK42
               CALL  COPYWRITEPROT
               MOV   CL,BYTE PTR @DRIVE
               MOV   CH,$00
               PUSH  CX {drive#}
               MOV   BL,CL
               AND   BX,$0001
               MOV   AL,BYTE PTR WRITEPROTECT[BX]
               AND   CL,$02
               SHL   CL,1
               SHR   AL,CL
               AND   AX,$0001
               PUSH  AX {read/write}
               CALL  OPEN_DISK_IMAGE
               POPA
               POP   ES
               POP   DS
               JMP   @DISK28
@DISK29:       TEST  BYTE PTR TOETS[CS:$19],$03 {---p---}
               JZ    @DISK40
               MOV   AL,BYTE PTR @DRIVE
               MOV   CL,+14
               MUL   CL
               MOV   BX,AX
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               CMP   BYTE PTR DISKETTENAMES[BX],$00
               POP   DS
               JZ    @DISK40
               PUSH  DS
               PUSH  ES
               PUSHA
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AL,BYTE PTR @DRIVE
               MOV   AH,$00
               PUSH  AX {drive#}
               CALL  CLOSE_DISK_IMAGE
               MOV   AL,BYTE PTR @DRIVE
               MOV   CL,+14
               MUL   CL
               ADD   AX,OFFSET DISKETTENAMES
               MOV   SI,AX
               LODSB
               MOV   DX,SI
               MOV   AH,$00
               ADD   SI,AX
               MOV   WORD PTR [SI],'D.'
               MOV   WORD PTR [SI+$02],'KS'
               MOV   BYTE PTR [SI+$04],$00
               MOV   AX,$4300
               PUSH  DX
               INT   $21 {---get file attributes---}
               POP   DX
               JC    @DISK41
               XOR   CL,READONLY {---toggle read only---}
               MOV   AX,$4301
               INT   $21 {---set file attributes---}
@DISK41:       CALL  COPYWRITEPROT
               MOV   CL,BYTE PTR @DRIVE
               MOV   CH,$00
               PUSH  CX {drive#}
               MOV   BL,CL
               AND   BX,$0001
               MOV   AL,BYTE PTR WRITEPROTECT[BX]
               AND   CL,$02
               SHL   CL,1
               SHR   AL,CL
               AND   AX,$0001
               PUSH  AX {read/write}
               CALL  OPEN_DISK_IMAGE
               POPA
               POP   ES
               POP   DS
               JMP   @DISK28
@DISK40:       TEST  BYTE PTR TOETS[CS:$43],$03 {---f9---}
               JNZ   @DISK3
               TEST  BYTE PTR TOETS[CS:$44],$03 {---f10---}
               JNZ   @DISK4
               TEST  BYTE PTR TOETS[CS:$57],$03 {---f11---}
               JNZ   @DISK5
               TEST  BYTE PTR TOETS[CS:$38],$03 {---alt---}
               JZ    @DISK6
               TEST  BYTE PTR TOETS[CS:$14],$03 {---t---}
               JZ    @DISK7
@DISK3:        MOV   AL,$01
               JMP   @DISK9
@DISK7:        TEST  BYTE PTR TOETS[CS:$18],$03 {---o---}
               JZ    @DISK8
@DISK4:        MOV   AL,$02
               JMP   @DISK9
@DISK8:        TEST  BYTE PTR TOETS[CS:$32],$03 {---m---}
               JZ    @DISK6
@DISK5:        MOV   AL,$03
               JMP   @DISK9
@DISK6:        TEST  BYTE PTR TOETS[CS:$01],$03 {---escape---}
               JZ    @DISK2
               MOV   AL,$00
@DISK9:        PUSH  AX
               MOV   DI,+10*$0120+$0140+12*4
               MOV   CX,+4
               MOV   AL,$0B
               CALL  XORPUT
               POP   AX
               RETN
@XORPUTDRV:    MOV   AL,BYTE PTR @DRIVE
               MOV   CL,+30
               MUL   CL
               MOV   CX,$0120
               MUL   CX
               ADD   AX,+50*$0120+$0140+92
               MOV   DI,AX
               MOV   AL,$0A
               MOV   CX,+25
               CALL  XORPUT
               RETN
@SHOWDISKETTES:CALL  @XORPUTDRV
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               SUB   DI,DI
@SHOWDSK1:     MOV   BYTE PTR [CS:CURSORX],+23
               MOV   AX,DI
               MOV   AH,AL
               SHL   AL,1
               ADD   AL,AH
               ADD   AL,+5
               MOV   BYTE PTR [CS:CURSORY],AL
               MOV   AX,DI
               MOV   CL,+14
               MUL   CL
               ADD   AX,OFFSET DISKETTENAMES
               MOV   SI,AX
               LODSB
               OR    AL,AL
               JZ    @SHOWDSK4
               MOV   CL,AL
@SHOWDSK3:     LODSB
               AND   AL,$3F
               MOV   BL,$0E
               CALL  PRINTCHAR
               DEC   CL
               JNZ   @SHOWDSK3
               MOV   CX,DI
               MOV   BL,CL
               AND   BX,$0001
               MOV   AL,BYTE PTR WRITEPROTECT[BX]
               AND   CL,$02
               SHL   CL,1
               SHR   AL,CL
               AND   AL,$01
               MOV   AL,' '
               JZ    @SHOWDSK7
               MOV   AL,'#'
@SHOWDSK7:     MOV   BYTE PTR [CS:CURSORX],+34
               MOV   BL,$0F
               CALL  PRINTCHAR
               JMP   @SHOWDSK2
@SHOWDSK4:     MOV   CX,$0008
@SHOWDSK5:     MOV   AL,'-'
               MOV   BL,$0E
               CALL  PRINTCHAR
               LOOP  @SHOWDSK5
@SHOWDSK2:     INC   DI
               CMP   DI,+$03
               JBE   @SHOWDSK1
               POP   DS
               CALL  @XORPUTDRV
               RETN
@COMPAREDRIVE: {---BL=drive; AX=index in diskimages---}
               PUSH  DS
               PUSH  ES
               MOV   DS,WORD PTR [CS:DATASEG]
               PUSH  DS
               POP   ES
               MOV   SI,AX
               SHL   AX,3
               ADD   AX,OFFSET DISKIMAGES
               ADD   SI,AX
               MOV   AL,BL
               MOV   CL,+14
               MUL   CL
               ADD   AX,OFFSET DISKETTENAMES
               MOV   DI,AX
               LODSB
               SCASB
               JNZ   @COMPDR1
               MOV   CL,AL
@COMPDR2:      CMPSB
               JNZ   @COMPDR1
               DEC   CL
               JNZ   @COMPDR2
@COMPDR1:      POP   ES
               POP   DS
               RETN
@DRIVE:        DB    $00
END;
{---[tape (desktop)]--------------------------------------------------------}
PROCEDURE TAPE; ASSEMBLER;
ASM;
               PUSH  DS
               PUSH  ES
               PUSHA
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  WRITEFOUTBUF
               POPA
               POP   ES
               POP   DS
               MOV   DI,+20*$0120+$0140
               MOV   CX,+168*$0120/4
@TAPE5:        MOV   AX,$00FF
               STOSW
               MOV   AX,$FFFF
               STOSW
               LOOP  @TAPE5
               MOV   DI,+10*$0120+$0140+12*4+6*4
               MOV   CX,4
               MOV   AL,$0B
               CALL  XORPUT
               CALL  PRINTSTRING
               DB    +0,+2,$0C,'TAPEIMG  ATOMFILE         STRT EXEC SIZE',$00
               MOV   DI,+20*$0120+12*4+8*4+$0140
               MOV   CX,+16*10-1
@TAPE9:        AND   WORD PTR [ES:DI+$02],$FCFC
               ADD   DI,$0120
               LOOP  @TAPE9
               MOV   AX,$FFFF
               MOV   DI,+29*$0120+$0140+12*4
               MOV   CX,+40
@TAPE2:        STOSW
               INC   AX
               STOSW
               DEC   AX
               LOOP  @TAPE2
               CMP   BYTE PTR [CS:TAPESCREEN],$00
               JNZ   @TAPE10
               MOV   DI,+20*$0120+$0140+12*4+9*4
               MOV   CX,+31
               JMP   @TAPE11
@TAPE10:       MOV   DI,+20*$0120+$0140+12*4
               MOV   CX,+9
@TAPE11:       MOV   AL,$0B
               CALL  XORPUT
               CALL  SHOWALL1TAPE
               CALL  SHOWALL2
@TAPE19:       CALL  TAPEBOTTOMLN
               CMP   BYTE PTR [CS:TAPESCREEN],$00
               JNZ   @TAPE12
@TAPE15:       {---cursor in directory screen---}
               TEST  BYTE PTR TOETS[CS:$48],$03 {---up---}
               JZ    @TAPE14
               CMP   WORD PTR [CS:LASTTAPE],+$00
               JZ    @TAPE15
               DEC   WORD PTR [CS:LASTTAPE]
               CALL  NEWTAPEFILE
               CALL  SHOWALL1TAPE
               CALL  SHOWALL2
               MOV   BL,$48 {---up---}
               CALL  KEYRELEASE
               JMP   @TAPE15
@TAPE14:       TEST  BYTE PTR TOETS[CS:$50],$03 {---down---}
               JZ    @TAPE13
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALTAPEIMAGES
               POP   DS
               CMP   WORD PTR [CS:LASTTAPE],AX
               JAE   @TAPE15
               INC   WORD PTR [CS:LASTTAPE]
               CALL  NEWTAPEFILE
               CALL  SHOWALL1TAPE
               CALL  SHOWALL2
               MOV   BL,$50 {---down---}
               CALL  KEYRELEASE
               JMP   @TAPE15
@TAPE13:       TEST  BYTE PTR TOETS[CS:$49],$03 {---page up---}
               JZ    @TAPE68
               CMP   WORD PTR [CS:LASTTAPE],+$00
               JZ    @TAPE15
               SUB   WORD PTR [CS:LASTTAPE],+14
               JNC   @TAPE67
               MOV   WORD PTR [CS:LASTTAPE],$0000
@TAPE67:       CALL  NEWTAPEFILE
               CALL  SHOWALL1TAPE
               CALL  SHOWALL2
               MOV   BL,$49 {---page up---}
               CALL  KEYRELEASE
               JMP   @TAPE15
@TAPE68:       TEST  BYTE PTR TOETS[CS:$51],$03 {---page down---}
               JZ    @TAPE69
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALTAPEIMAGES
               POP   DS
               CMP   WORD PTR [CS:LASTTAPE],AX
               JAE   @TAPE15
               ADD   WORD PTR [CS:LASTTAPE],+14
               CMP   WORD PTR [CS:LASTTAPE],AX
               JB    @TAPE70
               MOV   WORD PTR [CS:LASTTAPE],AX
@TAPE70:       CALL  NEWTAPEFILE
               CALL  SHOWALL1TAPE
               CALL  SHOWALL2
               MOV   BL,$51 {---page down---}
               CALL  KEYRELEASE
               JMP   @TAPE15
@TAPE69:       TEST  BYTE PTR TOETS[CS:$38],$03 {---alt---}
               JNZ   @TAPE18
               MOV   AL,BYTE PTR TOETS[CS:$18] {---o---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               OR    AL,BYTE PTR TOETS[CS:$4D] {---right---}
               AND   AL,$03
               JZ    @TAPE18
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALTAPEIMAGES
               POP   DS
               CMP   WORD PTR [CS:LASTTAPE],AX
               JAE   @TAPE15
               MOV   BYTE PTR [CS:TAPESCREEN],$01
               CALL  SHOWALL1TAPE
               CALL  SHOWALL2
@TAPE20:       MOV   BL,$1C {---enter---}
               CALL  KEYRELEASE
               JNZ   @TAPE20
               JMP   @TAPE19
@TAPE18:       TEST  BYTE PTR TOETS[CS:$31],$03 {---n---}
               JZ    @TAPE85
               MOV   BYTE PTR [CS:CURSORX],+11
               MOV   BYTE PTR [CS:CURSORY],+8
               MOV   BL,$09
               MOV   AL,01000101b
               CALL  PRINTCHAR
               MOV   CX,+16
               MOV   AL,01001100b
@TAPE86:       CALL  PRINTCHAR
               LOOP  @TAPE86
               MOV   AL,01001010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+11
               MOV   BYTE PTR [CS:CURSORY],+9
               MOV   AL,01010101b
               CALL  PRINTCHAR
               CALL  PRINTSTRING
               DB    +12,+9,$0C,' NEW TAPE IMAGE ',$00
               MOV   BL,$09
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+11
               MOV   BYTE PTR [CS:CURSORY],+10
               MOV   AL,01010101b
               CALL  PRINTCHAR
               MOV   CX,+16
               MOV   AL,' '
@TAPE87:       CALL  PRINTCHAR
               LOOP  @TAPE87
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+11
               MOV   BYTE PTR [CS:CURSORY],+11
               MOV   AL,01010100b
               CALL  PRINTCHAR
               MOV   CX,+16
               MOV   AL,01001100b
@TAPE88:       CALL  PRINTCHAR
               LOOP  @TAPE88
               MOV   AL,01101000b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+16
               MOV   BYTE PTR [CS:CURSORY],+10
               MOV   BL,$31 {---n---}
               CALL  KEYRELEASE
               PUSH  DS
               MOV   AX,CS
               MOV   DS,AX
               MOV   DI,OFFSET FILENAMEBUF
               MOV   CL,$08
               CALL  INPUTSTRING
               POP   DS
               JC    @TAPE89
               PUSH  ES
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               PUSH  CS {---segment of newname---}
               PUSH  OFFSET FILENAMEBUF {---offset of newname---}
               PUSH  CS {---segment of [CS:LASTTAPE]---}
               PUSH  OFFSET [CS:LASTTAPE] {---offset of [CS:LASTTAPE]---}
               CALL  CREATETAPEFILE
               POP   DS
               POP   ES
@TAPE89:       CALL  SHOWALL1TAPE
               CALL  SHOWALL2
@TAPE90:       MOV   AL,BYTE PTR TOETS[CS:$01] {---escape---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               AND   AL,$03
               JNZ   @TAPE90
               JMP   @TAPE15
@TAPE85:       CALL  CHECKEXITTAPE
               CMP   AL,$FF
               JZ    @TAPE15
               PUSH  AX
               MOV   DI,+10*$0120+$0140+12*4+6*4
               MOV   CX,4
               MOV   AL,$0B
               CALL  XORPUT
               POP   AX
               RETN
@TAPE12:       {---cursor in atom files screen---}
               TEST  BYTE PTR TOETS[CS:$48],$03 {---up---}
               JZ    @TAPE21
               CMP   WORD PTR [CS:LASTATM],+$00
               JZ    @TAPE12
               DEC   WORD PTR [CS:LASTATM]
               CALL  SHOWALL2
               MOV   BL,$48 {---up---}
               CALL  KEYRELEASE
               JMP   @TAPE12
@TAPE21:       TEST  BYTE PTR TOETS[CS:$50],$03 {---down---}
               JZ    @TAPE23
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALATOMFILES
               POP   DS
               CMP   WORD PTR [CS:LASTATM],AX
               JAE   @TAPE12
               INC   WORD PTR [CS:LASTATM]
               CALL  SHOWALL2
               MOV   BL,$50 {---down---}
               CALL  KEYRELEASE
               JMP   @TAPE12
@TAPE23:       TEST  BYTE PTR TOETS[CS:$49],$03 {---page up---}
               JZ    @TAPE27
               CMP   WORD PTR [CS:LASTATM],+$00
               JZ    @TAPE12
               SUB   WORD PTR [CS:LASTATM],+14
               JNC   @TAPE29
               MOV   WORD PTR [CS:LASTATM],$0000
@TAPE29:       CALL  SHOWALL2
               MOV   BL,$49 {---page up---}
               CALL  KEYRELEASE
               JMP   @TAPE12
@TAPE27:       TEST  BYTE PTR TOETS[CS:$51],$03 {---page down---}
               JZ    @TAPE28
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALATOMFILES
               POP   DS
               CMP   WORD PTR [CS:LASTATM],AX
               JAE   @TAPE12
               ADD   WORD PTR [CS:LASTATM],+14
               CMP   WORD PTR [CS:LASTATM],AX
               JB    @TAPE31
               MOV   WORD PTR [CS:LASTATM],AX
@TAPE31:       CALL  SHOWALL2
               MOV   BL,$51 {---page down---}
               CALL  KEYRELEASE
               JMP   @TAPE12
@TAPE28:       TEST  BYTE PTR TOETS[CS:$38],$03 {---alt---}
               JNZ   @TAPE25
               MOV   AL,BYTE PTR TOETS[CS:$14] {---t---}
               OR    AL,BYTE PTR TOETS[CS:$4B] {---left---}
               AND   AL,$03
               JZ    @TAPE25
               MOV   BYTE PTR [CS:TAPESCREEN],$00
               CALL  SHOWALL1TAPE
               CALL  SHOWALL2
               JMP   @TAPE19
@TAPE25:       TEST  BYTE PTR TOETS[CS:$26],$03 {---l---}
               JZ    @TAPE33
               TEST  BYTE PTR [CS:BRKPNTON],$FF
               JNZ   @TAPE33
               PUSH  ES
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   ES,WORD PTR [CS:ATOMSEG]
               MOV   AX,WORD PTR [CS:LASTATM]
               CMP   AX,WORD PTR AANTALATOMFILES
               JB    @TAPE38
               SUB   AX,AX
               MOV   WORD PTR [CS:LASTATM],AX
@TAPE38:       MOV   CX,ATMRECGROOTTE
               MUL   CX
               ADD   AX,OFFSET ATOMFILES
               MOV   SI,AX
               MOV   DI,$0100
               CMP   WORD PTR [SI+$0010],$2900
               JNZ   @TAPE36
               CMP   WORD PTR [SI+$0012],$C2B2
               JNZ   @TAPE54
               MOV   AL,'L'
               STOSB
               MOV   AL,'O'
               JMP   @TAPE37
@TAPE36:       CMP   WORD PTR [SI+$0012],$C2B2
               JNZ   @TAPE54
               MOV   AL,'*'
               STOSB
               MOV   AL,'L'
               JMP   @TAPE37
@TAPE54:       MOV   AL,'*'
               STOSB
               MOV   AL,'R'
@TAPE37:       STOSB
               MOV   AL,'.'
               STOSB
               MOV   AL,'"'
               STOSB
               MOV   CX,$0010
@TAPE34:       LODSB
               OR    AL,AL
               JZ    @TAPE35
               STOSB
               LOOP  @TAPE34
@TAPE35:       MOV   AL,'"'
               STOSB
               MOV   AL,$0D
               STOSB
               MOV   AL,$0A
               STOSB
               POP   DS
               POP   ES
               ADD   SP,+$04 {call TAPE and call @SHOWMENU}
               JMP   WORD PTR [CS:RESETANDLOAD_OFS]
@TAPE33:       MOV   AL,BYTE PTR TOETS[CS:$1F] {---s---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               AND   AL,$03
               JZ    @TAPE39
@TAPE40:       MOV   AL,BYTE PTR TOETS[CS:$1F] {---s---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               AND   AL,$03
               JNZ   @TAPE40
               MOV   AL,$00
               RETN
@TAPE39:       TEST  BYTE PTR TOETS[CS:$21],$03 {---f---}
               JZ    @TAPE16
               PUSH  ES
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  FREEZE
               MOV   AX,WORD PTR AANTALATOMFILES
               MOV   WORD PTR [CS:LASTATM],AX
               POP   DS
               POP   ES
               CALL  SHOWALL1TAPE
               CALL  SHOWALL2
               MOV   BL,$21 {---f---}
               CALL  KEYRELEASE
               JMP   @TAPE12
@TAPE16:       TEST  BYTE PTR TOETS[CS:$20],$FF {---d---}
               JZ    @TAPE41
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALATOMFILES
               POP   DS
               CMP   WORD PTR [CS:LASTATM],AX
               JAE   @TAPE41
               MOV   BYTE PTR [CS:CURSORX],+10
               MOV   BYTE PTR [CS:CURSORY],+7
               MOV   BL,$09
               MOV   AL,01000101b
               CALL  PRINTCHAR
               MOV   CX,+18
               MOV   AL,01001100b
@TAPE42:       CALL  PRINTCHAR
               LOOP  @TAPE42
               MOV   AL,01001010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+10
               MOV   BYTE PTR [CS:CURSORY],+8
               MOV   AL,01010101b
               CALL  PRINTCHAR
               CALL  PRINTSTRING
               DB    +11,+8,$0E,'   DELETE FILE:   ',$00
               MOV   BL,$09
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+10
               MOV   BYTE PTR [CS:CURSORY],+9
               MOV   AL,01010101b
               CALL  PRINTCHAR
               MOV   AL,' '
               CALL  PRINTCHAR
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR [CS:LASTATM]
               MOV   CX,ATMRECGROOTTE
               MUL   CX
               ADD   AX,OFFSET ATOMFILES
               MOV   SI,AX
               SUB   BX,BX
@TAPE45:       CMP   BYTE PTR [SI+BX],$00
               JZ    @TAPE44
               INC   BL
               CMP   BL,$10
               JB    @TAPE45
@TAPE44:       SHR   BL,1
               PUSHF
               ADC   BL,$00
               MOV   CH,$00
               MOV   CL,$08
               SUB   CL,BL
               PUSH  CX
               JZ    @TAPE84
               MOV   AL,' '
@TAPE46:       CALL  PRINTCHAR
               LOOP  @TAPE46
@TAPE84:       MOV   CL,$10
@TAPE48:       LODSB
               OR    AL,AL
               JZ    @TAPE47
               AND   AL,$3F
               MOV   BL,$09
               CALL  PRINTCHAR
               LOOP  @TAPE48
@TAPE47:       POP   CX
               POPF
               ADC   CL,$00
               INC   CL
               MOV   AL,' '
@TAPE49:       CALL  PRINTCHAR
               LOOP  @TAPE49
               POP   DS
               MOV   BL,$09
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+10
               MOV   BYTE PTR [CS:CURSORY],+10
               MOV   AL,01010101b
               CALL  PRINTCHAR
               CALL  PRINTSTRING
               DB    +11,+10,$0C,'    YES OR NO?    ',$00
               MOV   BL,$09
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+10
               MOV   BYTE PTR [CS:CURSORY],+11
               MOV   AL,01010100b
               CALL  PRINTCHAR
               MOV   CX,+18
               MOV   AL,01001100b
@TAPE43:       CALL  PRINTCHAR
               LOOP  @TAPE43
               MOV   AL,01101000b
               CALL  PRINTCHAR
@TAPE50:       MOV   AL,BYTE PTR TOETS[CS:$01] {---escape---}
               OR    AL,BYTE PTR TOETS[CS:$15] {---y---}
               OR    AL,BYTE PTR TOETS[CS:$31] {---n---}
               AND   AL,$03
               JNZ   @TAPE50
@TAPE52:       MOV   AL,BYTE PTR TOETS[CS:$01] {---escape---}
               OR    AL,BYTE PTR TOETS[CS:$31] {---n---}
               AND   AL,$03
               JNZ   @TAPE51
               TEST  BYTE PTR TOETS[CS:$15],$03 {---y---}
               JZ    @TAPE52
               PUSH  ES
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               PUSH  WORD PTR [CS:LASTATM] {---filenumber to be deleted---}
               CALL  DELETEFILE
               POP   DS
               POP   ES
@TAPE51:       CALL  SHOWALL1TAPE
               CALL  SHOWALL2
@TAPE53:       MOV   AL,BYTE PTR TOETS[CS:$01] {---escape---}
               OR    AL,BYTE PTR TOETS[CS:$15] {---y---}
               OR    AL,BYTE PTR TOETS[CS:$31] {---n---}
               AND   AL,$03
               JNZ   @TAPE53
               JMP   @TAPE12
@TAPE41:       TEST  BYTE PTR TOETS[CS:$12],$03 {---e---}
               JZ    @TAPE55
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALATOMFILES
               POP   DS
               CMP   WORD PTR [CS:LASTATM],AX
               JAE   @TAPE55
               PUSH  ES
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               PUSH  WORD PTR [CS:LASTATM] {---filenumber to be exported---}
               CALL  EXPORT
               POP   DS
               POP   ES
               MOV   BL,$12 {---e---}
               CALL  KEYRELEASE
               JMP   @TAPE12
@TAPE55:       TEST  BYTE PTR TOETS[CS:$17],$03 {---i---}
               JZ    @TAPE56
               CALL  PRINTSTRING
               DB    +0,+18,$0F,'SELECT                               ',$00
               MOV   AL,'S' AND $3F
               MOV   BL,$09
               MOV   BYTE PTR [CS:CURSORX],+0
               CALL  PRINTCHAR
               PUSH  ES
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  READIMPORTABLEFILES
               POP   DS
               POP   ES
               MOV   WORD PTR [CS:LASTIMP],$0000
               CALL  SHOWIMPFILES
@TAPE57:       TEST  BYTE PTR TOETS[CS:$48],$03 {---up---}
               JZ    @TAPE58
               CMP   WORD PTR [CS:LASTIMP],+$00
               JZ    @TAPE57
               DEC   WORD PTR [CS:LASTIMP]
               CALL  SHOWIMPFILES
               MOV   BL,$48 {---up---}
               CALL  KEYRELEASE
               JMP   @TAPE57
@TAPE58:       TEST  BYTE PTR TOETS[CS:$50],$03 {---down---}
               JZ    @TAPE59
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALIMPFILES
               POP   DS
               CMP   WORD PTR [CS:LASTIMP],AX
               JAE   @TAPE57
               INC   WORD PTR [CS:LASTIMP]
               CALL  SHOWIMPFILES
               MOV   BL,$50 {---down---}
               CALL  KEYRELEASE
               JMP   @TAPE57
@TAPE59:       TEST  BYTE PTR TOETS[CS:$49],$03 {---page up---}
               JZ    @TAPE60
               CMP   WORD PTR [CS:LASTIMP],+$00
               JZ    @TAPE57
               SUB   WORD PTR [CS:LASTIMP],+14
               JNC   @TAPE61
               MOV   WORD PTR [CS:LASTIMP],$0000
@TAPE61:       CALL  SHOWIMPFILES
               MOV   BL,$49 {---page up---}
               CALL  KEYRELEASE
               JMP   @TAPE57
@TAPE60:       TEST  BYTE PTR TOETS[CS:$51],$03 {---page down---}
               JZ    @TAPE62
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALIMPFILES
               POP   DS
               CMP   WORD PTR [CS:LASTIMP],AX
               JAE   @TAPE57
               ADD   WORD PTR [CS:LASTIMP],+14
               CMP   WORD PTR [CS:LASTIMP],AX
               JB    @TAPE63
               MOV   WORD PTR [CS:LASTIMP],AX
@TAPE63:       CALL  SHOWIMPFILES
               MOV   BL,$51 {---page down---}
               CALL  KEYRELEASE
               JMP   @TAPE57
@TAPE62:       TEST  BYTE PTR TOETS[CS:$01],$03
               JZ    @TAPE64
@TAPE65:       TEST  BYTE PTR TOETS[CS:$01],$03
               JNZ   @TAPE65
               CALL  SHOWALL2
               CALL  BOTTOMLN2
               JMP   @TAPE19
@TAPE64:       MOV   AL,BYTE PTR TOETS[CS:$1F] {---s---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               AND   AL,$03
               JZ    @TAPE57
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALIMPFILES
               POP   DS
               CMP   WORD PTR [CS:LASTIMP],AX
               JAE   @TAPE57
               PUSH  ES
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               PUSH  WORD PTR [CS:LASTATM] {---filepointer:where to import---}
               PUSH  WORD PTR [CS:LASTIMP] {---file to be imported---}
               PUSH  CS {---segment exitcode---}
               PUSH  OFFSET [CS:IMPORTCODE] {---offset exitcode---}
               CALL  IMPORT
               POP   DS
               POP   ES
               TEST  WORD PTR [CS:IMPORTCODE],$8000
               JNZ   @TAPE66
               INC   WORD PTR [CS:LASTATM]
@TAPE66:       MOV   AL,BYTE PTR TOETS[CS:$1F] {---s---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               AND   AL,$03
               JNZ   @TAPE66
               CALL  SHOWALL2
               CALL  BOTTOMLN2
               JMP   @TAPE19
@TAPE56:       TEST  BYTE PTR TOETS[CS:$13],$03 {---r---}
               JZ    @TAPE71
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR AANTALATOMFILES
               POP   DS
               CMP   WORD PTR [CS:LASTATM],AX
               JAE   @TAPE71
               MOV   BYTE PTR [CS:CURSORX],+10
               MOV   BYTE PTR [CS:CURSORY],+7
               MOV   BL,$09
               MOV   AL,01000101b
               CALL  PRINTCHAR
               MOV   CX,+18
               MOV   AL,01001100b
@TAPE72:       CALL  PRINTCHAR
               LOOP  @TAPE72
               MOV   AL,01001010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+10
               MOV   BYTE PTR [CS:CURSORY],+8
               MOV   AL,01010101b
               CALL  PRINTCHAR
               CALL  PRINTSTRING
               DB    +11,+8,$0E,'   RENAME FILE:   ',$00
               MOV   BL,$09
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+10
               MOV   BYTE PTR [CS:CURSORY],+9
               MOV   AL,01010101b
               CALL  PRINTCHAR
               MOV   AL,' '
               CALL  PRINTCHAR
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   AX,WORD PTR [CS:LASTATM]
               MOV   CX,ATMRECGROOTTE
               MUL   CX
               ADD   AX,OFFSET ATOMFILES
               MOV   SI,AX
               SUB   BX,BX
@TAPE75:       CMP   BYTE PTR [SI+BX],$00
               JZ    @TAPE74
               INC   BL
               CMP   BL,$10
               JB    @TAPE75
@TAPE74:       SHR   BL,1
               PUSHF
               ADC   BL,$00
               MOV   CH,$00
               MOV   CL,$08
               SUB   CL,BL
               PUSH  CX
               JZ    @TAPE83
               MOV   AL,' '
@TAPE76:       CALL  PRINTCHAR
               LOOP  @TAPE76
@TAPE83:       MOV   CL,$10
@TAPE78:       LODSB
               OR    AL,AL
               JZ    @TAPE77
               AND   AL,$3F
               MOV   BL,$09
               CALL  PRINTCHAR
               LOOP  @TAPE78
@TAPE77:       POP   CX
               POPF
               ADC   CL,$00
               INC   CL
               MOV   AL,' '
@TAPE79:       CALL  PRINTCHAR
               LOOP  @TAPE79
               POP   DS
               MOV   BL,$09
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+10
               MOV   BYTE PTR [CS:CURSORY],+10
               MOV   AL,01010101b
               CALL  PRINTCHAR
               MOV   CX,$12
               MOV   AL,' '
@TAPE81:       CALL  PRINTCHAR
               LOOP  @TAPE81
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+10
               MOV   BYTE PTR [CS:CURSORY],+11
               MOV   AL,01010100b
               CALL  PRINTCHAR
               MOV   CX,+18
               MOV   AL,01001100b
@TAPE73:       CALL  PRINTCHAR
               LOOP  @TAPE73
               MOV   AL,01101000b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+12
               MOV   BYTE PTR [CS:CURSORY],+10
               MOV   BL,$13 {---r---}
               CALL  KEYRELEASE
               PUSH  DS
               MOV   AX,CS
               MOV   DS,AX
               MOV   DI,OFFSET FILENAMEBUF
               MOV   CL,$10
               CALL  INPUTSTRING
               POP   DS
               JC    @TAPE82
               PUSH  ES
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               PUSH  WORD PTR [CS:LASTATM] {---filepointer---}
               PUSH  CS {---segment of newname---}
               PUSH  OFFSET FILENAMEBUF {---offset of newname---}
               CALL  RENAMEFILE
               POP   DS
               POP   ES
@TAPE82:       CALL  SHOWALL1TAPE
               CALL  SHOWALL2
@TAPE80:       MOV   AL,BYTE PTR TOETS[CS:$01] {---escape---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               AND   AL,$03
               JNZ   @TAPE80
               JMP   @TAPE12
@TAPE71:       CALL  CHECKEXITTAPE
               CMP   AL,$FF
               JZ    @TAPE12
               PUSH  AX
               MOV   DI,+10*$0120+$0140+12*4+6*4
               MOV   CX,4
               MOV   AL,$0B
               CALL  XORPUT
               POP   AX
               RETN
@FOUTEXITCODE: DW    $0000
END;
{---[optcurs (byte)]--------------------------------------------------------}
PROCEDURE OPTCURS; ASSEMBLER;
ASM;
               DB    $00
END;
{---[xorputoptcurs]---------------------------------------------------------}
PROCEDURE XORPUTOPTCURS; ASSEMBLER;
ASM;
               MOV   BL,BYTE PTR [CS:OPTCURS]
               MOV   BH,$00
               MOV   AL,BYTE PTR @OPTYTABLE[CS:BX]
               MOV   AH,$00
               MOV   CX,+10*$0120
               MUL   CX
               ADD   AX,+$0140+12*4
               MOV   DI,AX
               MOV   AL,BYTE PTR @OPTXTABLE[CS:BX]
               MOV   AH,$00
               SHL   AX,2
               ADD   DI,AX
               MOV   CL,BYTE PTR @OPTLTABLE[CS:BX]
               MOV   CH,$00
               MOV   AL,$0B
               CALL  XORPUT
               RETN
@OPTXTABLE:    DB     0, 0,24,24, 7,10,13, 7,10,13, 7,10,13, 7,10,13
               DB     7,10,13, 7,10,13, 7,10,13,24, 0, 0
@OPTYTABLE:    DB     3, 4, 3, 4, 7, 7, 7, 8, 8, 8, 9, 9, 9,10,10,10
               DB    11,11,11,12,12,12,13,13,13,15,16,17
@OPTLTABLE:    DB    12,12,14,14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
               DB     2, 2, 2, 2, 2, 2, 2, 2, 2,12, 7, 7
END;
{---[options (desktop)]-----------------------------------------------------}
PROCEDURE OPTIONS; ASSEMBLER;
ASM;
               MOV   DI,+20*$0120+$0140
               MOV   CX,+168*$0120/4
@OPT3:         MOV   AX,$00FF
               STOSW
               MOV   AX,$FFFF
               STOSW
               LOOP  @OPT3
               MOV   DI,+10*$0120+$0140+12*4+12*4
               MOV   CX,+7
               MOV   AL,$0B
               CALL  XORPUT
               MOV   AX,CS
               MOV   DS,AX
               CALL  PRINTSTRING
               DB    +0,+2,$0C,'CPU SPEED',$00
               CALL  PRINTSTRING
               DB    +0,+3,$0E,'( ) ORIGINAL            ( ) ACORN ATOM',$00
               CALL  PRINTSTRING
               DB    +0,+4,$0E,'( ) MAXIMUM             ( ) REGULAR',$00
               CALL  PRINTSTRING
               DB    +24,+2,$0C,'ASSEMBLER LAYOUT',$00
               CALL  PRINTSTRING
               DB    +0,+6,$0C,'COLORS DURING EMULATION',$00
               CALL  PRINTSTRING
               DB    +0,+7,$0F,'BACKGR',$00
               CALL  PRINTSTRING
               DB    +0,+8,$0F,'FOREGR',$00
               CALL  PRINTSTRING
               DB    +0,+9,$0F,'GREYSB',$00
               CALL  PRINTSTRING
               DB    +0,+10,$0F,'COLOR0',$00
               CALL  PRINTSTRING
               DB    +0,+11,$0F,'COLOR1',$00
               CALL  PRINTSTRING
               DB    +0,+12,$0F,'COLOR2',$00
               CALL  PRINTSTRING
               DB    +0,+13,$0F,'COLOR3',$00
               CALL  PRINTSTRING
               DB    +0,+15,$0C,'SOUND OUTPUT',$00
               CALL  PRINTSTRING
               DB    +0,+16,$0E,'( ) YES',$00
               CALL  PRINTSTRING
               DB    +0,+17,$0E,'( ) NO',$00
               CALL  PRINTSTRING
               DB    +24,+15,$0E,'SAVE OPTIONS',$00
               CALL  PRINTSTRING
               DB    +0,+18,$0F,'CHANGE  + INCREASE  - DECREASE',$00
               MOV   AL,'C' AND $3F
               MOV   BL,$09
               MOV   BYTE PTR [CS:CURSORX],+0
               MOV   BYTE PTR [CS:CURSORY],+18
               CALL  PRINTCHAR
               MOV   AL,'+'
               MOV   BYTE PTR [CS:CURSORX],+8
               CALL  PRINTCHAR
               MOV   AL,'-'
               MOV   BYTE PTR [CS:CURSORX],+20
               CALL  PRINTCHAR
               MOV   AX,$FFFF
               MOV   DI,+(18*10-1)*$0120+$0140+12*4
               MOV   CX,+80
               REPZ
               STOSW
@OPT1:         PUSH  DS
               MOV   AX,CS
               MOV   DS,AX
               MOV   BYTE PTR [CS:CURSORY],+7
               MOV   SI,OFFSET EMULCOLORS
               MOV   CH,$00
@OPT11:        MOV   BYTE PTR [CS:CURSORX],+7
               MOV   CL,$03
@OPT10:        LODSB
               MOV   BL,$0E
               CALL  PRINTBYTE
               INC   BYTE PTR [CS:CURSORX]
               DEC   CL
               JNZ   @OPT10
               MOV   BL,CH
               MOV   CL,$07
               MOV   AL,$7F
@OPT12:        CALL  PRINTCHAR
               DEC   CL
               JNZ   @OPT12
               INC   BYTE PTR [CS:CURSORY]
               INC   CH
               CMP   CH,$07
               JB    @OPT11
@OPT33:        POP   DS
               MOV   AX,' *'
               TEST  BYTE PTR [CS:CPUSPEEDMODE],$FF
               JZ    @OPT2
               XCHG  AL,AH
@OPT2:         MOV   BL,$0E
               MOV   BYTE PTR [CS:CURSORX],+1
               MOV   BYTE PTR [CS:CURSORY],+3
               CALL  PRINTCHAR
               DEC   BYTE PTR [CS:CURSORX]
               INC   BYTE PTR [CS:CURSORY]
               MOV   AL,AH
               CALL  PRINTCHAR
               MOV   AX,' *'
               TEST  BYTE PTR [CS:ASMLAYOUT],$FF
               JZ    @OPT4
               XCHG  AL,AH
@OPT4:         MOV   BYTE PTR [CS:CURSORX],+25
               MOV   BYTE PTR [CS:CURSORY],+3
               CALL  PRINTCHAR
               DEC   BYTE PTR [CS:CURSORX]
               INC   BYTE PTR [CS:CURSORY]
               MOV   AL,AH
               CALL  PRINTCHAR
               MOV   AX,' *'
               TEST  BYTE PTR [CS:SOUNDOUTPUT],$FF
               JNZ   @OPT35
               XCHG  AL,AH
@OPT35:        MOV   BYTE PTR [CS:CURSORX],+1
               MOV   BYTE PTR [CS:CURSORY],+16
               CALL  PRINTCHAR
               DEC   BYTE PTR [CS:CURSORX]
               INC   BYTE PTR [CS:CURSORY]
               MOV   AL,AH
               CALL  PRINTCHAR
               MOV   WORD PTR [ES:51924],$FFFF
               MOV   WORD PTR [ES:51926],$FFFF
               CALL  XORPUTOPTCURS
@OPT13:        TEST  BYTE PTR TOETS[CS:$48],$03 {---up---}
               JZ    @OPT14
               CALL  XORPUTOPTCURS
               MOV   BL,BYTE PTR [CS:OPTCURS]
               MOV   BH,$00
               MOV   AL,BYTE PTR @OPTUPTABLE[CS:BX]
               MOV   BYTE PTR [CS:OPTCURS],AL
               CALL  XORPUTOPTCURS
               MOV   BL,$48
               CALL  KEYRELEASE
               JMP   @OPT13
@OPT14:        TEST  BYTE PTR TOETS[CS:$50],$03 {---down---}
               JZ    @OPT15
               CALL  XORPUTOPTCURS
               MOV   BL,BYTE PTR [CS:OPTCURS]
               MOV   BH,$00
               MOV   AL,BYTE PTR @OPTDNTABLE[CS:BX]
               MOV   BYTE PTR [CS:OPTCURS],AL
               CALL  XORPUTOPTCURS
               MOV   BL,$50
               CALL  KEYRELEASE
               JMP   @OPT13
@OPT15:        TEST  BYTE PTR TOETS[CS:$4B],$03 {---left---}
               JZ    @OPT16
               CALL  XORPUTOPTCURS
               MOV   BL,BYTE PTR [CS:OPTCURS]
               MOV   BH,$00
               MOV   AL,BYTE PTR @OPTLFTABLE[CS:BX]
               MOV   BYTE PTR [CS:OPTCURS],AL
               CALL  XORPUTOPTCURS
               MOV   BL,$4B
               CALL  KEYRELEASE
               JMP   @OPT13
@OPT16:        TEST  BYTE PTR TOETS[CS:$4D],$03 {---right---}
               JZ    @OPT17
               CALL  XORPUTOPTCURS
               MOV   BL,BYTE PTR [CS:OPTCURS]
               MOV   BH,$00
               MOV   AL,BYTE PTR @OPTRTTABLE[CS:BX]
               MOV   BYTE PTR [CS:OPTCURS],AL
               CALL  XORPUTOPTCURS
               MOV   BL,$4D
               CALL  KEYRELEASE
               JMP   @OPT13
@OPT17:        MOV   AL,BYTE PTR TOETS[CS:$39] {---space---}
               OR    AL,BYTE PTR TOETS[CS:$2E] {---c---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               AND   AL,$03
               JZ    @OPT18
               CMP   BYTE PTR [CS:OPTCURS],$04
               JB    @OPT19
               CMP   BYTE PTR [CS:OPTCURS],$19
               JA    @OPT34
               JNZ   @OPT18
               {---save ini-file---}
               CALL  XORPUTOPTCURS
               PUSH  ES
               PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  WRITEINIFILE
               POP   DS
               POP   ES
@OPT22:        MOV   AL,BYTE PTR TOETS[CS:$39] {---space---}
               OR    AL,BYTE PTR TOETS[CS:$2E] {---c---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               AND   AL,$03
               JNZ   @OPT22
               JMP   @OPT1
@OPT19:        MOV   AL,BYTE PTR [CS:OPTCURS]
               TEST  AL,$02
               JNZ   @OPT21
               MOV   BYTE PTR [CS:CPUSPEEDMODE],AL
               JMP   @OPT20
@OPT21:        AND   AL,$01
               MOV   BYTE PTR [CS:ASMLAYOUT],AL
@OPT20:        MOV   AL,BYTE PTR TOETS[CS:$39] {---space---}
               OR    AL,BYTE PTR TOETS[CS:$2E] {---c---}
               OR    AL,BYTE PTR TOETS[CS:$1C] {---enter---}
               AND   AL,$03
               JNZ   @OPT20
               CALL  XORPUTOPTCURS
               JMP   @OPT1
@OPT34:        MOV   AL,BYTE PTR [CS:OPTCURS]
               XOR   AL,$01
               AND   AL,$01
               MOV   BYTE PTR [CS:SOUNDOUTPUT],AL
               JMP   @OPT20
@OPT18:        TEST  BYTE PTR TOETS[CS:$0D],$03 {---plus---}
               JZ    @OPT23
               MOV   AL,BYTE PTR [CS:OPTCURS]
               CMP   AL,$04
               JB    @OPT13
               CMP   AL,$18
               JA    @OPT13
               SUB   AL,$04
               MOV   AH,$00
               MOV   BX,AX
               INC   BYTE PTR EMULCOLORS[CS:BX]
               AND   BYTE PTR EMULCOLORS[CS:BX],$3F
               CALL  SETCOLORS
               MOV   DX,$03C8
               MOV   AL,$07
               OUT   DX,AL
               INC   DX
               MOV   AL,$00
               OUT   DX,AL
               OUT   DX,AL
               OUT   DX,AL
               MOV   BL,$0D
               CALL  KEYRELEASE
               CALL  XORPUTOPTCURS
               JMP   @OPT1
@OPT23:        TEST  BYTE PTR TOETS[CS:$0C],$03 {---min---}
               JZ    @OPT24
               MOV   AL,BYTE PTR [CS:OPTCURS]
               CMP   AL,$04
               JB    @OPT13
               CMP   AL,$18
               JA    @OPT13
               SUB   AL,$04
               MOV   AH,$00
               MOV   BX,AX
               DEC   BYTE PTR EMULCOLORS[CS:BX]
               AND   BYTE PTR EMULCOLORS[CS:BX],$3F
               CALL  SETCOLORS
               MOV   DX,$03C8
               MOV   AL,$07
               OUT   DX,AL
               INC   DX
               MOV   AL,$00
               OUT   DX,AL
               OUT   DX,AL
               OUT   DX,AL
               MOV   BL,$0C
               CALL  KEYRELEASE
               CALL  XORPUTOPTCURS
               JMP   @OPT1
@OPT24:        TEST  BYTE PTR TOETS[CS:$42],$03 {---f8---}
               JNZ   @OPT43
               TEST  BYTE PTR TOETS[CS:$43],$03 {---f9---}
               JNZ   @OPT39
               TEST  BYTE PTR TOETS[CS:$57],$03 {---f11---}
               JNZ   @OPT40
               TEST  BYTE PTR TOETS[CS:$38],$03 {---alt---}
               JZ    @OPT25
               TEST  BYTE PTR TOETS[CS:$14],$03 {---t---}
               JZ    @OPT26
@OPT39:        MOV   AL,$01
               JMP   @OPT38
@OPT26:        TEST  BYTE PTR TOETS[CS:$32],$03 {---m---}
               JZ    @OPT44
@OPT40:        MOV   AL,$03
               JMP   @OPT38
@OPT44:        TEST  BYTE PTR TOETS[CS:$20],$03 {---d---}
               JZ    @OPT25
@OPT43:        MOV   AL,$04
               JMP   @OPT38
@OPT25:        TEST  BYTE PTR TOETS[CS:$01],$03 {---escape---}
               JZ    @OPT13
               MOV   AL,$00
@OPT38:        PUSH  AX
               CALL  SETCOLORS
               MOV   DX,$03C8
               MOV   AL,$07
               OUT   DX,AL
               INC   DX
               MOV   AL,$00
               OUT   DX,AL
               OUT   DX,AL
               OUT   DX,AL
               MOV   DI,+10*$0120+$0140+12*4+12*4
               MOV   CX,+7
               MOV   AL,$0B
               CALL  XORPUT
               POP   AX
               RETN
@OPTUPTABLE:   DB    $1B,$00,$19,$02,$01,$01,$01,$04
               DB    $05,$06,$07,$08,$09,$0A,$0B,$0C
               DB    $0D,$0E,$0F,$10,$11,$12,$13,$14
               DB    $15,$03,$16,$1A
@OPTDNTABLE:   DB    $01,$04,$03,$19,$07,$08,$09,$0A
               DB    $0B,$0C,$0D,$0E,$0F,$10,$11,$12
               DB    $13,$14,$15,$16,$17,$18,$1A,$1A
               DB    $1A,$02,$1B,$00
@OPTLFTABLE:   DB    $02,$03,$00,$01,$06,$04,$05,$09
               DB    $07,$08,$0C,$0A,$0B,$0F,$0D,$0E
               DB    $12,$10,$11,$15,$13,$14,$18,$16
               DB    $17,$1A,$19,$19
@OPTRTTABLE:   DB    $02,$03,$00,$01,$05,$06,$04,$08
               DB    $09,$07,$0B,$0C,$0A,$0E,$0F,$0D
               DB    $11,$12,$10,$14,$15,$13,$17,$18
               DB    $16,$1A,$19,$19
END;
{---[monitormode (byte)]----------------------------------------------------}
PROCEDURE MONITORMODE; ASSEMBLER;
ASM;
               DB    $00 {00h=code; 01h=dump}
END;
{---[hexteken (word)]-------------------------------------------------------}
PROCEDURE HEXTEKEN; ASSEMBLER;
ASM;
               DW    $0000 {whether to print #$ or @#}
END;
{---[dmptxt]----------------------------------------------------------------}
PROCEDURE DMPTXT; ASSEMBLER;
ASM;
               DW    $0000,$0000,$0000,$0000
END;
{---[disasptr (word)]-------------------------------------------------------}
PROCEDURE DISASPTR; ASSEMBLER;
ASM;
               DW    $0100
END;
{---[dataptr (word)]--------------------------------------------------------}
PROCEDURE DATAPTR; ASSEMBLER;
ASM;
               DW    $0000
END;
{---[step_ofs (word; holds offset for forward jump into main part)]---------}
PROCEDURE STEP_OFS; ASSEMBLER;
ASM;
               DB    $00
END;
{---[traceorstep (byte)]----------------------------------------------------}
PROCEDURE TRACEORSTEP; ASSEMBLER;
ASM;
               DB    $00 {00h=trace;01h=step}
END;
{---[trace_ofs (word; holds offset for forward jump into main part)]--------}
PROCEDURE TRACE_OFS; ASSEMBLER;
ASM;
               DB    $00
END;
{---[untilcursor_ofs (word; holds offset for forward jump into main part)]--}
PROCEDURE UNTILCURSOR_OFS; ASSEMBLER;
ASM;
               DB    $00
END;
{---[breakpoint_ofs (word; holds offset for forward jump into main part)]---}
PROCEDURE BREAKPOINT_OFS; ASSEMBLER;
ASM;
               DB    $00
END;
{---[clreol (works only until column +30)]----------------------------------}
PROCEDURE CLREOL; ASSEMBLER;
ASM;
               PUSH  WORD PTR [CS:CURSORX]
@CLREOL2:      CMP   BYTE PTR [CS:CURSORX],+30
               JA    @CLREOL1
               MOV   AL,' '
               CALL  PRINTCHAR
               JMP   @CLREOL2
@CLREOL1:      POP   WORD PTR [CS:CURSORX]
END;
{---[disas; DS:SI=startofs; BX=endofs]--------------------------------------}
PROCEDURE DISAS; ASSEMBLER;
ASM;
               PUSH  BX
               MOV   AL,BYTE PTR [SI]
               MOV   BL,AL
               MOV   BH,$00
               SHL   BX,1
               MOV   CH,BYTE PTR OPCODES[CS:BX    ]
               MOV   CL,BYTE PTR OPCODES[CS:BX+$01]
               MOV   BL,$0B
               MOV   AL,'.'
               CALL  PRINTCHAR
               MOV   AX,SI
               CALL  PRINTWORD
               MOV   AL,' '
               CALL  PRINTCHAR
               MOV   AL,BYTE PTR [SI]
               CALL  PRINTBYTE
               MOV   AL,' '
               CALL  PRINTCHAR
               CMP   CL,+1
               JZ    @DIS3
               CMP   CL,+9
               JZ    @DIS3
@DIS2:         INC   SI
               MOV   AL,BYTE PTR [SI]
               DEC   SI
               CALL  PRINTBYTE
               JMP   @DIS4
@DIS3:         MOV   AL,' '
               CALL  PRINTCHAR
               CALL  PRINTCHAR
@DIS4:         MOV   AL,' '
               CALL  PRINTCHAR
               CMP   CL,+13
               JZ    @DIS5
               CMP   CL,+15
               JZ    @DIS5
               CMP   CL,+6
               JB    @DIS6
               CMP   CL,+8
               JA    @DIS6
@DIS5:         MOV   AL,BYTE PTR [SI+$02]
               CALL  PRINTBYTE
               JMP   @DIS7
@DIS6:         MOV   AL,' '
               CALL  PRINTCHAR
               CALL  PRINTCHAR
@DIS7:         MOV   AL,' '
               CALL  PRINTCHAR
               MOV   AL,CH
               MOV   AH,$00
               PUSH  SI
               MOV   SI,AX
               SHL   AX,1
               ADD   SI,AX
               MOV   AL,BYTE PTR MNEMONICS[CS:SI]
               AND   AL,$3F
               CALL  PRINTCHAR
               INC   SI
               MOV   AL,BYTE PTR MNEMONICS[CS:SI]
               AND   AL,$3F
               CALL  PRINTCHAR
               INC   SI
               MOV   AL,BYTE PTR MNEMONICS[CS:SI]
               AND   AL,$3F
               CALL  PRINTCHAR
               POP   SI
               MOV   AL,' '
               CALL  PRINTCHAR
               CMP   CL,+11
               JB    @DIS8
               MOV   AL,'('
               CALL  PRINTCHAR
@DIS8:         CMP   CL,+2
               JNZ   @DIS9
               MOV   AL,BYTE PTR [CS:HEXTEKEN+$01]
               CALL  PRINTCHAR
@DIS9:         CMP   CL,+1
               JB    @DIS10
               JA    @DIS36
               MOV   AL,'A' AND $3F
               JMP   @DIS37
@DIS36:        CMP   CL,+9
               JZ    @DIS10
               MOV   AL,BYTE PTR [CS:HEXTEKEN]
@DIS37:        CALL  PRINTCHAR
@DIS10:        CMP   CL,+10
               JNZ   @DIS11
               MOV   AL,BYTE PTR [SI+$01]
               TEST  AL,$80
               JZ    @DIS12
               NEG   AL
               MOV   AH,$00
               PUSH  BX
               MOV   BX,AX
               MOV   AX,SI
               ADD   AX,+$02
               SUB   AX,BX
               POP   BX
               JMP   @DIS13
@DIS12:        MOV   AH,$00
               ADD   AX,SI
               ADD   AX,+$02
               JMP   @DIS13
@DIS11:        CMP   CL,+13
               JZ    @DIS14
               CMP   CL,+15
               JZ    @DIS14
               CMP   CL,+6
               JB    @DIS15
               CMP   CL,+8
               JA    @DIS15
@DIS14:        MOV   AX,WORD PTR [SI+$01]
               JMP   @DIS13
@DIS15:        MOV   AL,BYTE PTR [SI+$01]
               MOV   AH,$00
@DIS13:        CMP   CL,+1
               JBE   @DIS16
               CMP   CL,+9
               JZ    @DIS16
               CMP   CL,+10
               JZ    @DIS17
               CMP   CL,+13
               JZ    @DIS17
               CMP   CL,+15
               JZ    @DIS17
               CMP   CL,+6
               JB    @DIS18
               CMP   CL,+9
               JBE   @DIS17
@DIS18:        CALL  PRINTBYTE
               JMP   @DIS16
@DIS17:        CALL  PRINTWORD
@DIS16:        CMP   CL,+4
               JZ    @DIS19
               CMP   CL,+7
               JZ    @DIS19
               CMP   CL,+11
               JZ    @DIS19
               CMP   CL,+15
               JNZ   @DIS20
@DIS19:        MOV   AL,','
               CALL  PRINTCHAR
               MOV   AL,'X' AND $3F
               CALL  PRINTCHAR
@DIS20:        CMP   CL,+5
               JZ    @DIS21
               CMP   CL,+8
               JNZ   @DIS22
@DIS21:        MOV   AL,','
               CALL  PRINTCHAR
               MOV   AL,'Y' AND $3F
               CALL  PRINTCHAR
@DIS22:        CMP   CL,+11
               JZ    @DIS23
               CMP   CL,+13
               JB    @DIS24
@DIS23:        MOV   AL,')'
               CALL  PRINTCHAR
@DIS24:        CMP   CL,+12
               JNZ   @DIS25
               MOV   AL,')'
               CALL  PRINTCHAR
               MOV   AL,','
               CALL  PRINTCHAR
               MOV   AL,'Y' AND $3F
               CALL  PRINTCHAR
@DIS25:        CALL  CLREOL
               CALL  NEXTLINE
               CMP   CL,+1
               JZ    @DIS27
               CMP   CL,+9
               JNZ   @DIS28
@DIS27:        INC   SI
               JZ    @DIS35
               JMP   @DIS32
@DIS28:        CMP   CL,+6
               JB    @DIS29
               CMP   CL,+9
               JBE   @DIS30
               CMP   CL,+13
               JNZ   @DIS29
@DIS30:        INC   SI
               JZ    @DIS35
@DIS29:        ADD   SI,$0002
               JC    @DIS35
@DIS32:        POP   BX
               CMP   SI,BX
               JA    @DIS33
               JMP   DISAS
@DIS33:        RETN
@DIS35:        POP   BX
END;
{---[dump; DS:SI=startofs; BX=endofs (moet veelvoud van 08h verder zijn)]---}
PROCEDURE DUMP; ASSEMBLER;
ASM;
               INC   BX
               MOV   CX,BX
@DUMP5:        MOV   AX,'  '
               MOV   WORD PTR DMPTXT[CS:$0000],AX
               MOV   WORD PTR DMPTXT[CS:$0002],AX
               MOV   WORD PTR DMPTXT[CS:$0004],AX
               MOV   WORD PTR DMPTXT[CS:$0006],AX
               MOV   BL,$0B
               MOV   AL,':'
               CALL  PRINTCHAR
               MOV   AX,SI
               CALL  PRINTWORD
               MOV   AL,' '
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               SUB   DI,DI
@DUMP3:        LODSB
               MOV   AH,AL
               AND   AL,$7F
               CMP   AL,'A'
               JB    @DUMP12
               CMP   AL,'Z'
               JA    @DUMP12
               AND   AL,$3F
               JMP   @DUMP1
@DUMP12:       CMP   AL,$40
               JAE   @DUMP8
               CMP   AL,$20
               JAE   @DUMP1
@DUMP8:        MOV   AL,'.'
@DUMP1:        OR    AL,$80
               MOV   BYTE PTR DMPTXT[CS:DI],AL
               INC   DI
               MOV   AL,AH
               CALL  PRINTBYTE
               MOV   AL,' '
               CALL  PRINTCHAR
               CMP   DI,$0008
               JB    @DUMP3
@DUMP2:        CMP   BYTE PTR [CS:CURSORX],$20
               JAE   @DUMP4
               MOV   AL,' '
               CALL  PRINTCHAR
               JMP   @DUMP2
@DUMP4:        SUB   DI,DI
@DUMP6:        MOV   AL,BYTE PTR DMPTXT[CS:DI]
               CALL  PRINTCHAR
               INC   DI
               CMP   DI,$0008
               JB    @DUMP6
@DUMP10:       CMP   SI,CX
               JNZ   @DUMP5
END;
{---[showreg]---------------------------------------------------------------}
PROCEDURE SHOWREG; ASSEMBLER;
ASM;
               MOV   BYTE PTR [CS:CURSORX],+32
               MOV   BYTE PTR [CS:CURSORY],+2
               MOV   BL,$0E
               MOV   AL,'P' AND $3F
               CALL  PRINTCHAR
               MOV   AL,'C' AND $3F
               CALL  PRINTCHAR
               MOV   BL,$09
               MOV   AL,'='
               CALL  PRINTCHAR
               MOV   BL,$0E
               MOV   AL,BYTE PTR [CS:HEXTEKEN]
               CALL  PRINTCHAR
               MOV   AX,WORD PTR [CS:PROGRAMCNT]
               CALL  PRINTWORD
               MOV   BYTE PTR [CS:CURSORX],+32
               MOV   BYTE PTR [CS:CURSORY],+3
               MOV   BL,$0E
               MOV   AL,'A' AND $3F
               CALL  PRINTCHAR
               MOV   AL,' ' AND $3F
               CALL  PRINTCHAR
               MOV   BL,$09
               MOV   AL,'='
               CALL  PRINTCHAR
               MOV   BL,$0E
               MOV   AL,BYTE PTR [CS:HEXTEKEN]
               CALL  PRINTCHAR
               MOV   AH,BYTE PTR [CS:ACCU_B]
               MOV   AL,BYTE PTR [CS:ACCUMULATOR]
               CALL  PRINTWORD
               MOV   BYTE PTR [CS:CURSORX],+32
               MOV   BYTE PTR [CS:CURSORY],+4
               MOV   BL,$0E
               MOV   AL,'X' AND $3F
               CALL  PRINTCHAR
               MOV   AL,' ' AND $3F
               CALL  PRINTCHAR
               MOV   BL,$09
               MOV   AL,'='
               CALL  PRINTCHAR
               MOV   BL,$0E
               MOV   AL,BYTE PTR [CS:HEXTEKEN]
               CALL  PRINTCHAR
               MOV   AL,BYTE PTR [CS:XREGISTER]
               CALL  PRINTBYTE
               MOV   BYTE PTR [CS:CURSORX],+32
               MOV   BYTE PTR [CS:CURSORY],+5
               MOV   BL,$0E
               MOV   AL,'Y' AND $3F
               CALL  PRINTCHAR
               MOV   AL,' ' AND $3F
               CALL  PRINTCHAR
               MOV   BL,$09
               MOV   AL,'='
               CALL  PRINTCHAR
               MOV   BL,$0E
               MOV   AL,BYTE PTR [CS:HEXTEKEN]
               CALL  PRINTCHAR
               MOV   AL,BYTE PTR [CS:YREGISTER]
               CALL  PRINTBYTE
               MOV   BYTE PTR [CS:CURSORX],+32
               MOV   BYTE PTR [CS:CURSORY],+6
               MOV   BL,$0E
               MOV   AL,'S' AND $3F
               CALL  PRINTCHAR
               MOV   AL,'P' AND $3F
               CALL  PRINTCHAR
               MOV   BL,$09
               MOV   AL,'='
               CALL  PRINTCHAR
               MOV   BL,$0E
               MOV   AL,BYTE PTR [CS:HEXTEKEN]
               CALL  PRINTCHAR
               MOV   AX,WORD PTR [CS:STACKPOINTER]
               CALL  PRINTBYTE
               CALL  PRINTSTRING
               DB    +32,+7,$0E,'NV-BDIZC',$00
               MOV   BYTE PTR [CS:CURSORX],+32
               MOV   BYTE PTR [CS:CURSORY],+8
               MOV   CL,$80
@SHOWREG2:     MOV   AL,'0'
               TEST  BYTE PTR [CS:FLAGREGISTER],CL
               JZ    @SHOWREG1
               MOV   AL,'1'
@SHOWREG1:     CALL  PRINTCHAR
               SHR   CL,1
               JNC   @SHOWREG2
END;
{---[monitor (desktop)]-----------------------------------------------------}
PROCEDURE MONITOR; ASSEMBLER;
ASM;
               MOV   BL,BYTE PTR [CS:ASMLAYOUT]
               MOV   BH,$00
               SHL   BX,1
               MOV   AX,WORD PTR @WHICHHEXSIGN[BX]
               MOV   WORD PTR [CS:HEXTEKEN],AX
               MOV   DI,+20*$0120+$0140
               MOV   CX,+168*$0120/4
@MON48:        MOV   AX,$00FF
               STOSW
               MOV   AX,$FFFF
               STOSW
               LOOP  @MON48
               MOV   DI,+10*$0120+$0140+12*4+21*4
               MOV   CX,+7
               MOV   AL,$0B
               CALL  XORPUT
               CALL  PRINTSTRING
               DB    +0,+18,$0F,'TRACE STEP HERE BRKPNT GOTO WHERE MODE',$00
               MOV   AL,'T' AND $3F
               MOV   BL,$09
               MOV   BYTE PTR [CS:CURSORX],+0
               MOV   BYTE PTR [CS:CURSORY],+18
               CALL  PRINTCHAR
               MOV   AL,'S' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+6
               CALL  PRINTCHAR
               MOV   AL,'H' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+11
               CALL  PRINTCHAR
               MOV   AL,'B' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+16
               CALL  PRINTCHAR
               MOV   AL,'G' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+23
               CALL  PRINTCHAR
               MOV   AL,'W' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+28
               CALL  PRINTCHAR
               MOV   AL,'M' AND $3F
               MOV   BYTE PTR [CS:CURSORX],+34
               CALL  PRINTCHAR
@MON5:         SUB   CX,CX
@MON52:        MOV   SI,CX
               SHL   SI,1
               MOV   AX,WORD PTR @BRKPNTCOORD[CS:SI]
               MOV   BYTE PTR [CS:CURSORX],AL
               MOV   BYTE PTR [CS:CURSORY],AH
               MOV   AL,$01
               SHL   AL,CL
               TEST  BYTE PTR [CS:BRKPNTON],AL
               JNZ   @MON53
               MOV   AL,' '
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               CALL  PRINTCHAR
               JMP   @MON54
@MON53:        MOV   AX,WORD PTR BRKPNTS[CS:SI]
               MOV   BL,$09
               CMP   AX,WORD PTR [CS:DISASPTR]
               JNZ   @MON55
               MOV   BL,$0F
@MON55:        CALL  PRINTWORD
@MON54:        INC   CL
               CMP   CL,$04
               JNZ   @MON52
               TEST  BYTE PTR [CS:MONITORMODE],$FF
               JZ    @MON33
               CALL  PRINTSTRING
               DB    +36,+12,$0C,'DUMP',$00
               JMP   @MON57
@MON33:        CALL  PRINTSTRING
               DB    +36,+12,$0C,'CODE',$00
@MON57:        MOV   DS,WORD PTR [CS:ATOMSEG]
               MOV   BYTE PTR [CS:CURSORX],+0
               MOV   BYTE PTR [CS:CURSORY],+2
               MOV   SI,WORD PTR [CS:DISASPTR]
@MON3:         MOV   BX,SI
               CALL  DISAS
               CMP   BYTE PTR [CS:CURSORY],+13
               JB    @MON3
               INC   BYTE PTR [CS:CURSORY]
               MOV   SI,WORD PTR [CS:DATAPTR]
@MON2:         MOV   BX,SI
               ADD   BX,+$07
               CALL  DUMP
               CMP   BYTE PTR [CS:CURSORY],+18
               JB    @MON2
               MOV   AX,$FFFF
               MOV   DI,+(18*10-1)*$0120+$0140+12*4
               MOV   CX,+80
               REPZ
               STOSW
               CALL  SHOWREG
@MON26:        TEST  BYTE PTR TOETS[CS:$32],$03 {---m---}
               JNZ   @MON26
@MON6:         TEST  BYTE PTR TOETS[CS:$1F],$03 {---s---}
               JZ    @MON1
               OR    BYTE PTR [CS:BRKPNTON],$80
               CALL  WORD PTR [CS:STEP_OFS]
               AND   BYTE PTR [CS:BRKPNTON],$7F
               MOV   BL,$1F {---s---}
               CALL  KEYRELEASE
               MOV   AX,WORD PTR [CS:PROGRAMCNT]
               MOV   WORD PTR [CS:DISASPTR],AX
               TEST  BYTE PTR [CS:TRACEORSTEP],$FF
               JZ    @MON5
               CALL  UPPERLINES
               JMP   MONITOR
@MON1:         TEST  BYTE PTR TOETS[CS:$14],$03 {---t---}
               JZ    @MON7
               TEST  BYTE PTR TOETS[CS:$38],$03 {---alt---}
               JNZ   @MON7
               OR    BYTE PTR [CS:BRKPNTON],$80
               CALL  WORD PTR [CS:TRACE_OFS]
               AND   BYTE PTR [CS:BRKPNTON],$7F
               MOV   BL,$14 {---t---}
               CALL  KEYRELEASE
               MOV   AX,WORD PTR [CS:PROGRAMCNT]
               MOV   WORD PTR [CS:DISASPTR],AX
               JMP   @MON5
@MON7:         TEST  BYTE PTR TOETS[CS:$48],$03 {---up---}
               JZ    @MON9
               TEST  BYTE PTR [CS:MONITORMODE],$FF
               JZ    @MON34
               SUB   WORD PTR [CS:DATAPTR],+$08
               MOV   BL,$48 {---up---}
               CALL  KEYRELEASE
               JMP   @MON5
@MON34:        MOV   SI,WORD PTR [CS:DISASPTR]
               SUB   SI,+$18
@MON15:        MOV   CX,SI
               MOV   BL,BYTE PTR [SI]
               MOV   BH,$00
               SHL   BX,1
               MOV   BL,BYTE PTR OPCODES[CS:BX+$01]
               DEC   BL
               MOV   BH,$00
               MOV   AL,BYTE PTR @SI_ERBIJ[BX]
               MOV   AH,$00
               ADD   SI,AX
               CMP   SI,WORD PTR [CS:DISASPTR]
               JB    @MON15
               JA    @MON18
               MOV   SI,CX
               JMP   @MON11
@MON18:        MOV   SI,WORD PTR [CS:DISASPTR]
               SUB   SI,+$03
               MOV   AL,$03
@MON12:        MOV   BL,BYTE PTR [SI]
               MOV   BH,$00
               SHL   BX,1
               MOV   BL,BYTE PTR OPCODES[CS:BX+$01]
               DEC   BL
               MOV   BH,$00
               CMP   BYTE PTR @SI_ERBIJ[BX],AL
               JZ    @MON11
               INC   SI
               DEC   AL
               CMP   AL,$01
               JA    @MON12
@MON11:        MOV   WORD PTR [CS:DISASPTR],SI
               MOV   BL,$48 {---up---}
               CALL  KEYRELEASE
               JMP   @MON5
@MON9:         TEST  BYTE PTR TOETS[CS:$50],$03 {---down---}
               JZ    @MON10
               TEST  BYTE PTR [CS:MONITORMODE],$FF
               JZ    @MON35
               ADD   WORD PTR [CS:DATAPTR],+$08
               MOV   BL,$50 {---down---}
               CALL  KEYRELEASE
               JMP   @MON5
@MON35:        MOV   SI,WORD PTR [CS:DISASPTR]
               MOV   BL,BYTE PTR [SI]
               MOV   BH,$00
               SHL   BX,1
               MOV   BL,BYTE PTR OPCODES[CS:BX+$01]
               DEC   BL
               MOV   BH,$00
               MOV   AL,BYTE PTR @SI_ERBIJ[BX]
               MOV   AH,$00
               ADD   WORD PTR [CS:DISASPTR],AX
               MOV   BL,$50 {---down---}
               CALL  KEYRELEASE
               JMP   @MON5
@MON10:        TEST  BYTE PTR TOETS[CS:$4B],$03 {---left---}
               JZ    @MON21
               TEST  BYTE PTR [CS:MONITORMODE],$FF
               JZ    @MON41
               DEC   WORD PTR [CS:DATAPTR]
               JMP   @MON42
@MON41:        DEC   WORD PTR [CS:DISASPTR]
@MON42:        MOV   BL,$4B {---left---}
               CALL  KEYRELEASE
               JMP   @MON5
@MON21:        TEST  BYTE PTR TOETS[CS:$4D],$03 {---right---}
               JZ    @MON20
               TEST  BYTE PTR [CS:MONITORMODE],$FF
               JZ    @MON43
               INC   WORD PTR [CS:DATAPTR]
               JMP   @MON44
@MON43:        INC   WORD PTR [CS:DISASPTR]
@MON44:        MOV   BL,$4D {---right---}
               CALL  KEYRELEASE
               JMP   @MON5
@MON20:        TEST  BYTE PTR TOETS[CS:$49],$03 {---page up---}
               JZ    @MON22
               TEST  BYTE PTR [CS:MONITORMODE],$FF
               JZ    @MON36
               SUB   WORD PTR [CS:DATAPTR],+$20
               JMP   @MON37
@MON36:        SUB   WORD PTR [CS:DISASPTR],+$10
@MON37:        MOV   BL,$49 {---page up---}
               CALL  KEYRELEASE
               JMP   @MON5
@MON22:        TEST  BYTE PTR TOETS[CS:$51],$03 {---page down---}
               JZ    @MON28
               TEST  BYTE PTR [CS:MONITORMODE],$FF
               JZ    @MON38
               ADD   WORD PTR [CS:DATAPTR],+$20
               JMP   @MON39
@MON38:        ADD   WORD PTR [CS:DISASPTR],+$10
@MON39:        MOV   BL,$51 {---page down---}
               CALL  KEYRELEASE
               JMP   @MON5
@MON28:        TEST  BYTE PTR TOETS[CS:$22],$03 {---g---}
               JZ    @MON27
               MOV   BYTE PTR [CS:CURSORX],+9
               MOV   BYTE PTR [CS:CURSORY],+7
               MOV   BL,$0C
               MOV   AL,01000101b
               CALL  PRINTCHAR
               MOV   CX,+20
               MOV   AL,01001100b
@MON29:        CALL  PRINTCHAR
               LOOP  @MON29
               MOV   AL,01001010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+9
               MOV   BYTE PTR [CS:CURSORY],+8
               MOV   AL,01010101b
               CALL  PRINTCHAR
               CALL  PRINTSTRING
               DB    +10,+8,$0E,' GOTO ADDRESS:      ',$00
               MOV   BL,$0C
               MOV   AL,01101010b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+9
               MOV   BYTE PTR [CS:CURSORY],+9
               MOV   AL,01010100b
               CALL  PRINTCHAR
               MOV   CX,+20
               MOV   AL,01001100b
@MON30:        CALL  PRINTCHAR
               LOOP  @MON30
               MOV   AL,01101000b
               CALL  PRINTCHAR
               MOV   BYTE PTR [CS:CURSORX],+25
               MOV   BYTE PTR [CS:CURSORY],+8
               CALL  INPUTWORD
               JC    @MON5
               TEST  BYTE PTR [CS:MONITORMODE],$FF
               JZ    @MON40
               MOV   WORD PTR [CS:DATAPTR],AX
               JMP   @MON5
@MON40:        MOV   WORD PTR [CS:DISASPTR],AX
               JMP   @MON5
@MON27:        TEST  BYTE PTR TOETS[CS:$23],$03 {---h---}
               JZ    @MON56
               OR    BYTE PTR [CS:BRKPNTON],$80
               CALL  WORD PTR [CS:UNTILCURSOR_OFS]
               AND   BYTE PTR [CS:BRKPNTON],$7F
               MOV   AX,WORD PTR [CS:PROGRAMCNT]
               MOV   WORD PTR [CS:DISASPTR],AX
               CALL  UPPERLINES
               JMP   MONITOR
@MON56:        TEST  BYTE PTR TOETS[CS:$30],$03 {---b---}
               JZ    @MON31
               CALL  WORD PTR [CS:BREAKPOINT_OFS]
               CALL  UPPERLINES
               JMP   MONITOR
@MON31:        TEST  BYTE PTR TOETS[CS:$32],$03 {---m---}
               JZ    @MON32
               TEST  BYTE PTR TOETS[CS:$38],$03 {---alt---}
               JNZ   @MON32
               XOR   BYTE PTR [CS:MONITORMODE],$01
               MOV   BL,$32 {---m---}
               CALL  KEYRELEASE
               JMP   @MON5
@MON32:        TEST  BYTE PTR TOETS[CS:$11],$03 {---w---}
               JZ    @MON49
               MOV   AX,WORD PTR [CS:PROGRAMCNT]
               MOV   WORD PTR [CS:DISASPTR],AX
               MOV   BL,$11 {---w---}
               CALL  KEYRELEASE
               JMP   @MON5
@MON49:        TEST  BYTE PTR TOETS[CS:$42],$03 {---f8---}
               JNZ   @MON58
               TEST  BYTE PTR TOETS[CS:$43],$03 {---f9---}
               JNZ   @MON50
               TEST  BYTE PTR TOETS[CS:$44],$03 {---f10---}
               JNZ   @MON51
               TEST  BYTE PTR TOETS[CS:$38],$03 {---alt---}
               JZ    @MON25
@MON23:        TEST  BYTE PTR TOETS[CS:$14],$03 {---t---}
               JZ    @MON24
@MON50:        MOV   DI,+10*$0120+$0140+12*4+21*4
               MOV   CX,+7
               MOV   AL,$0B
               CALL  XORPUT
               MOV   AL,$01
               RETN
@MON24:        TEST  BYTE PTR TOETS[CS:$18],$03 {---o---}
               JZ    @MON59
@MON51:        MOV   DI,+10*$0120+$0140+12*4+21*4
               MOV   CX,+7
               MOV   AL,$0B
               CALL  XORPUT
               MOV   AL,$02
               RETN
@MON59:        TEST  BYTE PTR TOETS[CS:$20],$03 {---d---}
               JZ    @MON25
@MON58:        MOV   DI,+10*$0120+$0140+12*4+21*4
               MOV   CX,+7
               MOV   AL,$0B
               CALL  XORPUT
               MOV   AL,$04
               RETN
@MON25:        TEST  BYTE PTR TOETS[CS:$01],$03 {---escape---}
               JZ    @MON6
               MOV   DI,+10*$0120+$0140+12*4+21*4
               MOV   CX,+7
               MOV   AL,$0B
               CALL  XORPUT
               MOV   AL,$00
               RETN
@SI_ERBIJ:     DB    1,2,2,2,2,3,3,3,1,2,2,2,3,2,3
@WHICHHEXSIGN: DB    '#','@' AND $3F,'$#'
@BRKPNTCOORD:  DB    +36,+10
               DB    +31,+10
               DB    +36,+11
               DB    +31,+11
END;
{===[program]===============================================================}
VAR I:BYTE;
BEGIN
SETUPSPEEDLOOP;
WRITELN ('Acorn Atom Emulator v1.32 (c) by Wouter Ras.');
INITIALIZE;
WRITELN ('Seaching directory for tape and disk images.');
READDIRECTORY;
IF AANTALTAPEIMAGES > 0 THEN
BEGIN
  TAPEIMAGENAME := TAPEIMAGES[0];
  READFILESINTAPEIMAGE;
END;
READINIFILE;
IF MEM[CSEG:OFS(LEENDERTSROM)] <> 0 THEN
  WRITELN ('Installing co-processor support (c) Roland Leurs/Leendert Bijnagte.');
COPYWRITEPROT;
TIMER;
FOR I := 0 TO 3 DO
BEGIN
  IF DISKETTENAMES[I] <> '' THEN
    OPEN_DISK_IMAGE (I,(WRITEPROTECT[I AND 1] SHR ((I AND $02) SHL 1))<>0);
END;
WACHTEVENTJES;
ASM;
{---[main]------------------------------------------------------------------}
               MOV   WORD PTR [CS:RESETANDLOAD_OFS],OFFSET @RESETANDLOAD
               MOV   WORD PTR [CS:STEP_OFS],OFFSET @STEP
               MOV   WORD PTR [CS:TRACE_OFS],OFFSET @TRACE
               MOV   WORD PTR [CS:UNTILCURSOR_OFS],OFFSET @UNTILCURSOR
               MOV   WORD PTR [CS:BREAKPOINT_OFS],OFFSET @BREAKPOINT
               MOV   AX,WORD PTR IOPORT
               OR    AX,AX
               JZ    @MAIN9
               MOV   AL,$01
@MAIN9:        MOV   BYTE PTR @SBAVAIL,AL
               {---make widertable---}
               SUB   DI,DI
               MOV   BL,$00
@INIT11:       MOV   BH,BL
               SUB   AX,AX
               MOV   CX,$0008
@INIT10:       SHL   BH,1
               JNC   @INIT8
               RCL   AX,1
               STC
               RCL   AX,1
               JMP   @INIT9
@INIT8:        SHL   AX,2
@INIT9:        LOOP  @INIT10
               XCHG  AL,AH
               MOV   WORD PTR WIDERTABLE[CS:DI],AX
               ADD   DI,+$02
               INC   BL
               JNZ   @INIT11
               {---make wider1atable---}
               SUB   DI,DI
               MOV   BL,$00
@INIT7:        MOV   BH,BL
               SUB   AX,AX
               MOV   CX,$0004
@INIT6:        MOV   DL,$02
@INIT1:        PUSH  BX
               SHL   BH,1
               JNC   @INIT4
               RCL   AX,1
               JMP   @INIT5
@INIT4:        SHL   AX,1
@INIT5:        SHL   BX,1
               JNC   @INIT2
               RCL   AX,1
               JMP   @INIT3
@INIT2:        SHL   AX,1
@INIT3:        POP   BX
               DEC   DL
               JNZ   @INIT1
               SHL   BH,2
               LOOP  @INIT6
               XCHG  AL,AH
               MOV   WORD PTR WIDER1aTABLE[CS:DI],AX
               ADD   DI,+$02
               INC   BL
               JNZ   @INIT7
               CLD
               MOV   AX,WORD PTR ATOMMEMSEG
               MOV   WORD PTR [CS:ATOMSEG],AX
               MOV   BYTE PTR [CS:GRAPHMODE],$00
               PUSH  DS
               MOV   AX,DS
               MOV   ES,AX
               MOV   AX,CS
               MOV   DS,AX
               {---characters---}
               MOV   SI,OFFSET CHARACTERS
               MOV   DI,OFFSET CHARDATA
               MOV   BL,$40
@MAIN1:        MOV   AL,$00
               STOSB
               STOSB
               STOSB
               MOV   CX,$0007
@MAIN3:        LODSB
               ROL   AL,1
               STOSB
               LOOP  @MAIN3
               MOV   AL,$00
               STOSB
               STOSB
               ADD   DI,+$04
               DEC   BL
               JNZ   @MAIN1
               {---inverted characters---}
               MOV   SI,OFFSET CHARACTERS
               MOV   DI,OFFSET CHARDATA+$0800
               MOV   BL,$40
@MAIN2:        MOV   AL,$FF
               STOSB
               STOSB
               STOSB
               MOV   CX,$0007
@MAIN4:        LODSB
               ROL   AL,1
               NOT   AL
               STOSB
               LOOP  @MAIN4
               MOV   AL,$FF
               STOSB
               STOSB
               ADD   DI,+$04
               DEC   BL
               JNZ   @MAIN2
               {---white/grey graphics symbols---}
               MOV   DI,OFFSET CHARDATA+$0400
               MOV   BL,$40
@MAIN5:        MOV   BH,00100000b
@MAIN8:        MOV   AL,$00
               TEST  BL,BH
               JZ    @MAIN6
               OR    AL,$F0
@MAIN6:        SHR   BH,1
               TEST  BL,BH
               JZ    @MAIN7
               OR    AL,$0F
@MAIN7:        STOSB
               STOSB
               STOSB
               STOSB
               SHR   BH,1
               JNC   @MAIN8
               ADD   DI,+$04
               INC   BL
               CMP   BL,$80
               JB    @MAIN5
               POP   DS
               CALL  INITATOMGRAPH
               MOV   AX,$A000
               MOV   ES,AX
               CALL  @SETINT
               MOV   DS,WORD PTR ATOMMEMSEG
               MOV   BYTE PTR [$B001],$FF
               MOV   BYTE PTR [$B002],$40
               MOV   WORD PTR [INSTRCYCLES],$0000
               MOV   WORD PTR [PCCYCLES],$0000
               MOV   WORD PTR [WACHTSCHULD],$0000
               CALL  @VOLUMEON
               CALL  SETBORDERCOL
               CALL  SETINTENSCOL
               PUSH  DS
               PUSH  ES
               PUSHA
               PUSHF
               MOV   WORD PTR @PCSP,SP
               JMP   @BREAKKEY
@ENDOFEMUL:    MOV   SP,WORD PTR @PCSP
               POPF
               POPA
               POP   ES
               POP   DS
               CALL  @VOLUMEOFF
               CALL  @CLRINT
               MOV   AX,$0003
               INT   $10
               MOV   AX,CS
               MOV   DS,AX
               MOV   DX,OFFSET @BYEBYETXT
               MOV   AH,$09
               INT   $21
               MOV   DS,WORD PTR [CS:DATASEG]
               JMP   @ENDOFPRG
@BYEBYETXT:    DB    'Acorn Atom Emulator v1.32 (c) Wouter Ras, Delft, '
               DB    'Oct 1997 - May 1998.',$0D,$0A,$0A,'Bye bye!'
               DB    $0D,$0A,$0A,'$'
{---[00h: brk implied]------------------------------------------------------}
@OPCODE00:     MOV   WORD PTR [INSTRCYCLES],$1507
               MOV   AX,SI
               INC   AX
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],AH
               DEC   BP
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],AL
               DEC   BP
               AND   BP,$00FF
               MOV   AL,BH
               OR    AL,00010000b {set break flag}
               MOV   BYTE PTR [DS:BP+STACKBASE],AL
               DEC   BP
               OR    BH,00000100b {set interrupt flag}
               MOV   SI,WORD PTR [BRK_VECTOR]
               JMP   @NEXTOPC
{---[01h: ora (indirect,x)]-------------------------------------------------}
@OPCODE01:     MOV   WORD PTR [INSTRCYCLES],$1406+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               OR    BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[02h: cop implied]------------------------------------------------------}
@OPCODE02:     TEST  BYTE PTR [CS:LEENDERTSROM],$FF
               JNZ   @OPC02_1
               MOV   WORD PTR [INSTRCYCLES],$0B03
               INC   SI
               JMP   @NEXTOPC
@OPC02_1:      MOV   WORD PTR [INSTRCYCLES],$4007
               PUSH  DS
               PUSH  ES
               PUSHA
               MOV   AL,BL
               MOV   BL,CL
               MOV   BH,DL
               PUSH  DS
               POP   ES
               DB    $2E,$FF,$1E
               DW    OFFSET FPPC_ADDR
               TEST  AL,$01
               JZ    @OPC02_2
               {---invalid operation: generate error 123---}
               POPA
               POP   ES
               POP   DS
               MOV   SI,+122
               JMP   @OPCODE00
@OPC02_2:      TEST  AL,$04
               JZ    @OPC02_3
               {---division by zero error; generate error 169---}
               POPA
               POP   ES
               POP   DS
               MOV   SI,+168
               JMP   @OPCODE00
@OPC02_3:      TEST  AL,$40
               JZ    @OPC02_4
               {---power of neg.number with non-int exp: error 191---}
               POPA
               POP   ES
               POP   DS
               MOV   SI,+190
               JMP   @OPCODE00
@OPC02_4:      POPA
               POP   ES
               POP   DS
               JMP   @NEXTOPC
{---[04h: tsb zero page]----------------------------------------------------}
@OPCODE04:     MOV   WORD PTR [INSTRCYCLES],$1205+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               TEST  BL,BYTE PTR [DI]
               LAHF
               OR    BYTE PTR [DI],BL
               AND   BH,11111101b
               AND   AH,01000000b
               SHR   AH,5
               OR    BH,AH {zero flag}
               JMP   @NEXTOPC
{---[05h: ora zero page]----------------------------------------------------}
@OPCODE05:     MOV   WORD PTR [INSTRCYCLES],$1003+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               OR    BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[06h: asl zero page]----------------------------------------------------}
@OPCODE06:     MOV   WORD PTR [INSTRCYCLES],$1105+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               SHL   BYTE PTR [DI],1
               JMP   @UPDATECNZ
{---[08h: php implied]------------------------------------------------------}
@OPCODE08:     MOV   WORD PTR [INSTRCYCLES],$0903
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],BH
               DEC   BP
               JMP   @NEXTOPC
{---[09h: ora immediate]----------------------------------------------------}
@OPCODE09:     MOV   WORD PTR [INSTRCYCLES],$0B02+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               OR    BL,AL
               JMP   @UPDATENZ
{---[0Ah: asl accumulator]--------------------------------------------------}
@OPCODE0A:     MOV   WORD PTR [INSTRCYCLES],$0802+$0F00
               SHL   BL,1
               JMP   @UPDATECNZ
{---[0Ch: tsb absolute]-----------------------------------------------------}
@OPCODE0C:     MOV   WORD PTR [INSTRCYCLES],$1206+$0F00
               MOV   DI,WORD PTR [SI]
               ADD   SI,+$02
               TEST  BL,BYTE PTR [DI]
               LAHF
               CMP   DI,$A000
               JAE   @OPC0C_1
               OR    BYTE PTR [DI],BL
@OPC0C_1:      AND   BH,11111101b
               AND   AH,01000000b
               SHR   AH,5
               OR    BH,AH {zero flag}
               JMP   @NEXTOPC
{---[0Dh: ora absolute]-----------------------------------------------------}
@OPCODE0D:     MOV   WORD PTR [INSTRCYCLES],$0E04+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               MOV   DI,AX
               OR    BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[0Eh: asl absolute]-----------------------------------------------------}
@OPCODE0E:     MOV   WORD PTR [INSTRCYCLES],$1306+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
@ASL_ABS:      MOV   DI,AX
               AND   AH,$F0
               CMP   AH,$A0
               JAE   @OPC0E_1
               SHL   BYTE PTR [DI],1
               CALL  UPDATEGRAPH
               JMP   @UPDATECNZ
@OPC0E_1:      CMP   DI,SCHAKELBYTE
               JZ    @OPC0E_2
               MOV   AL,BYTE PTR [DI]
               SHL   AL,1
               JMP   @UPDATECNZ
@OPC0E_2:      CALL  SAVEZP90
               SHL   BYTE PTR [DI],1
               PUSHF
               CALL  SETA000MEM
               POPF
               JMP   @UPDATECNZ
{---[10h: bpl relative]-----------------------------------------------------}
@OPCODE10:     MOV   AL,BH
               SHL   AL,1 {get negative}
               JC    @OPC10_1
               MOV   WORD PTR [INSTRCYCLES],$1303
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CBW
               ADD   SI,AX
               JMP   @NEXTOPC
@OPC10_1:      MOV   WORD PTR [INSTRCYCLES],$0E02
               INC   SI
               JMP   @NEXTOPC
{---[11h: ora (indirect),y]-------------------------------------------------}
@OPCODE11:     MOV   WORD PTR [INSTRCYCLES],$1705+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AX,WORD PTR [DI]
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               OR    BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[12h: ora (indirect)]---------------------------------------------------}
@OPCODE12:     MOV   WORD PTR [INSTRCYCLES],$1305+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               OR    BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[14h: trb zero page]----------------------------------------------------}
@OPCODE14:     MOV   WORD PTR [INSTRCYCLES],$1405+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               TEST  BL,BYTE PTR [DI]
               LAHF
               MOV   AL,BL
               NOT   AL
               AND   BYTE PTR [DI],AL
               AND   BH,11111101b
               AND   AH,01000000b
               SHR   AH,5
               OR    BH,AH {zero flag}
               JMP   @NEXTOPC
{---[15h: ora zero page,x]--------------------------------------------------}
@OPCODE15:     MOV   WORD PTR [INSTRCYCLES],$1104+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               OR    BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[16h: asl zero page,x]--------------------------------------------------}
@OPCODE16:     MOV   WORD PTR [INSTRCYCLES],$1306+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               SHL   BYTE PTR [DI],1
               JMP   @UPDATECNZ
{---[18h: clc]--------------------------------------------------------------}
@OPCODE18:     MOV   WORD PTR [INSTRCYCLES],$0802
               AND   BH,11111110b
               JMP   @NEXTOPC
{---[19h: ora absolute,y]---------------------------------------------------}
@OPCODE19:     MOV   WORD PTR [INSTRCYCLES],$1104+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               OR    BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[1Ah: inc accumulator]--------------------------------------------------}
@OPCODE1A:     MOV   WORD PTR [INSTRCYCLES],$1406+$0F00
               INC   BL
               JMP   @UPDATENZ
{---[1Bh: tas implied]------------------------------------------------------}
@OPCODE1B:     MOV   WORD PTR [INSTRCYCLES],$0902
               MOV   AL,BL
               MOV   AH,$00
               MOV   BP,AX
               JMP   @NEXTOPC
{---[1Ch: trb absolute]-----------------------------------------------------}
@OPCODE1C:     MOV   WORD PTR [INSTRCYCLES],$1406+$0F00
               MOV   DI,WORD PTR [SI]
               ADD   SI,+$02
               TEST  BL,BYTE PTR [DI]
               LAHF
               CMP   DI,$A000
               JAE   @OPC1C_1
               MOV   AL,BL
               NOT   AL
               AND   BYTE PTR [DI],AL
@OPC1C_1:      AND   BH,11111101b
               AND   AH,01000000b
               SHR   AH,5
               OR    BH,AH {zero flag}
               JMP   @NEXTOPC
{---[1Dh: ora absolute,x]---------------------------------------------------}
@OPCODE1D:     MOV   WORD PTR [INSTRCYCLES],$1104+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               MOV   DI,AX
               OR    BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[1Eh: asl absolute,x]---------------------------------------------------}
@OPCODE1E:     MOV   WORD PTR [INSTRCYCLES],$1707+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               JMP   @ASL_ABS
{---[20h: jsr absolute]-----------------------------------------------------}
@OPCODE20:     MOV   WORD PTR [INSTRCYCLES],$1306
               MOV   AX,SI
               INC   AX
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],AH
               DEC   BP
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],AL
               DEC   BP
               MOV   SI,WORD PTR [SI]
               JMP   @NEXTOPC
{---[21h: and (indirect,x)]-------------------------------------------------}
@OPCODE21:     MOV   WORD PTR [INSTRCYCLES],$1406+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               AND   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[22h: nop zero page]----------------------------------------------------}
@OPCODE22:
@OPCODE42:
@OPCODE44:
@OPCODE54:
@OPCODE62:
@OPCODE82:
@OPCODEC2:
@OPCODED4:
@OPCODEE2:
@OPCODEF4:     MOV   WORD PTR [INSTRCYCLES],$0803
               INC   SI
               JMP   @NEXTOPC
{---[24h: bit zero page]----------------------------------------------------}
@OPCODE24:     MOV   WORD PTR [INSTRCYCLES],$1C03
               MOV   AL,BYTE PTR [SI]
               INC   SI
@OPC24_1:      MOV   AH,$00
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI]
               MOV   AH,AL
               AND   BH,00111101b
               AND   AH,11000000b
               OR    BH,AH {get m6, m7 in flags}
               TEST  BL,AL {a & m}
               LAHF
               AND   AH,01000000b
               SHR   AH,5
               OR    BH,AH
               JMP   @NEXTOPC
{---[25h: and zero page]----------------------------------------------------}
@OPCODE25:     MOV   WORD PTR [INSTRCYCLES],$1003+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               AND   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[26h: rol zero page]----------------------------------------------------}
@OPCODE26:     MOV   WORD PTR [INSTRCYCLES],$1105+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AL,BH
               SHR   AL,1 {get carry}
               RCL   BYTE PTR [DI],1
               JC    @OPC26_1
               OR    BYTE PTR [DI],$00
               CLC
               JMP   @UPDATECNZ
@OPC26_1:      OR    BYTE PTR [DI],$00
               STC
               JMP   @UPDATECNZ
{---[28h: plp implied]------------------------------------------------------}
@OPCODE28:     MOV   WORD PTR [INSTRCYCLES],$0C04
               CMP   SI,$CFAE
               JNZ   @OPC28_1
               {---finfoutcmd preparation---}
               MOV   WORD PTR @FILENAMEOFS,$0140
               TEST  BH,$01 {test carry}
               JZ    @OPC28_1
               PUSH  BX
               MOV   BL,BYTE PTR [$0004]
               MOV   BH,$00
               MOV   AL,BYTE PTR [BX+$0016]
               MOV   AH,BYTE PTR [BX+$0025]
               MOV   WORD PTR @FILENAMEOFS,AX
               POP   BX
@OPC28_1:      INC   BP
               AND   BP,$00FF
               MOV   BH,BYTE PTR [DS:BP+STACKBASE]
               JMP   @NEXTOPC
{---[29h: and immediate]----------------------------------------------------}
@OPCODE29:     MOV   WORD PTR [INSTRCYCLES],$0B02+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               AND   BL,AL
               JMP   @UPDATENZ
{---[2Ah: rol accumulator]--------------------------------------------------}
@OPCODE2A:     MOV   WORD PTR [INSTRCYCLES],$0802+$0F00
               MOV   AL,BH
               SHR   AL,1 {get carry}
               RCL   BL,1
               JC    @OPC2A_1
               OR    BL,BL
               CLC
               JMP   @UPDATECNZ
@OPC2A_1:      OR    BL,BL
               STC
               JMP   @UPDATECNZ
{---[2Ch: bit absolute]-----------------------------------------------------}
@OPCODE2C:     MOV   WORD PTR [INSTRCYCLES],$2304
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
@OPC2C_4:      MOV   DI,AX
               MOV   AL,AH
               AND   AL,$F0
               CMP   AL,$B0
               JNZ   @OPC2C_2
               CMP   DI,$B001
               JB    @OPC2C_2
               JZ    @BIT_B001
               CMP   DI,$B003
               JB    @BIT_B002
               JZ    @BIT_B003
               CMP   AH,$B8
               JZ    @BIT_VIA
               CMP   AH,$BA
               JZ    @OPC2C_3
@OPC2C_2:      MOV   AL,BYTE PTR [DI]
               JMP   @OPC2C_1
@BIT_B001:     CALL  @L_B001_1
               JMP   @OPC2C_1
@BIT_B002:     CALL  @L_B002_1
               JMP   @OPC2C_1
@BIT_B003:     CALL  @L_B003_1
@OPC2C_1:      MOV   AH,AL
               AND   BH,00111101b
               AND   AH,11000000b
               OR    BH,AH {get m6, m7 in flags}
               TEST  BL,AL {a & m}
               LAHF
               AND   AH,01000000b
               SHR   AH,5
               OR    BH,AH
               JMP   @NEXTOPC
@OPC2C_3:      CALL  READ_FDC
               JMP   @OPC2C_1
{---[2Dh: and absolute]-----------------------------------------------------}
@OPCODE2D:     MOV   WORD PTR [INSTRCYCLES],$1204+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               MOV   DI,AX
               CMP   AX,$B001
               JB    @OPC2D_1
               JZ    @AND_B001
               CMP   AX,$B003
               JB    @AND_B002
               JZ    @AND_B003
               CMP   AH,$B8
               JZ    @OPC2D_2
               CMP   AH,$BA
               JZ    @OPC2D_3
@OPC2D_1:      AND   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
@AND_B001:     CALL  @L_B001_1
               AND   BL,AL
               JMP   @UPDATENZ
@AND_B002:     CALL  @L_B002_1
               AND   BL,AL
               JMP   @UPDATENZ
@AND_B003:     CALL  @L_B003_1
               AND   BL,AL
               JMP   @UPDATENZ
@OPC2D_2:      CALL  @GETVIAREG
               AND   BL,AL
               JMP   @UPDATENZ
@OPC2D_3:      CALL  READ_FDC
               AND   BL,AL
               JMP   @UPDATENZ
{---[2Eh: rol absolute]-----------------------------------------------------}
@OPCODE2E:     MOV   WORD PTR [INSTRCYCLES],$2306+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               MOV   DI,AX
               AND   AH,$F0
               CMP   AH,$A0
               JAE   @OPC2E_1
               MOV   AL,BH
               SHR   AL,1 {get carry}
               RCL   BYTE PTR [DI],1
               JC    @OPC2E_3
               OR    BYTE PTR [DI],$00
               CLC
               CALL  UPDATEGRAPH
               JMP   @UPDATECNZ
@OPC2E_3:      OR    BYTE PTR [DI],$00
               STC
               CALL  UPDATEGRAPH
               JMP   @UPDATECNZ
@OPC2E_1:      MOV   AL,BH
               SHR   AL,1 {get carry}
               MOV   AL,BYTE PTR [DI]
               RCL   AL,1
               JC    @OPC2E_4
               OR    AL,AL
               CLC
               JMP   @UPDATECNZ
@OPC2E_4:      OR    AL,AL
               STC
               JMP   @UPDATECNZ
{---[30h: bmi relative]-----------------------------------------------------}
@OPCODE30:     MOV   AL,BH
               SHL   AL,1 {get negative}
               JNC   @OPC30_1
               MOV   WORD PTR [INSTRCYCLES],$1303
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CBW
               ADD   SI,AX
               JMP   @NEXTOPC
@OPC30_1:      MOV   WORD PTR [INSTRCYCLES],$0E02
               INC   SI
               JMP   @NEXTOPC
{---[31h: and (indirect),y]-------------------------------------------------}
@OPCODE31:     MOV   WORD PTR [INSTRCYCLES],$1705+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AX,WORD PTR [DI] {get address from atom memory}
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               AND   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[32h: and (indirect)]---------------------------------------------------}
@OPCODE32:     MOV   WORD PTR [INSTRCYCLES],$1305+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               AND   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[34h: bit zero page,x]--------------------------------------------------}
@OPCODE34:     MOV   WORD PTR [INSTRCYCLES],$1E04
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               JMP   @OPC24_1
{---[35h: and zero page,x]--------------------------------------------------}
@OPCODE35:     MOV   WORD PTR [INSTRCYCLES],$1104+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               AND   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[36h: rol zero page,x]--------------------------------------------------}
@OPCODE36:     MOV   WORD PTR [INSTRCYCLES],$1306+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   AL,BH
               SHR   AL,1 {get carry}
               RCL   BYTE PTR [DI],1
               JC    @OPC36_1
               OR    BYTE PTR [DI],$00
               CLC
               JMP   @UPDATECNZ
@OPC36_1:      OR    BYTE PTR [DI],$00
               STC
               JMP   @UPDATECNZ
{---[38h: sec implied]------------------------------------------------------}
@OPCODE38:     MOV   WORD PTR [INSTRCYCLES],$0802
               OR    BH,00000001h
               JMP   @NEXTOPC
{---[39h: and absolute,y]---------------------------------------------------}
@OPCODE39:     MOV   WORD PTR [INSTRCYCLES],$1104+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               AND   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[3Ah: dec accumulator]--------------------------------------------------}
@OPCODE3A:     MOV   WORD PTR [INSTRCYCLES],$0802
               DEC   BL
               JMP   @UPDATENZ
{---[3Bh: tsa implied]------------------------------------------------------}
@OPCODE3B:     MOV   WORD PTR [INSTRCYCLES],$0902+$0F00
               MOV   AX,BP
               MOV   BL,AL
               OR    AL,AL
               JMP   @UPDATENZ
{---[3Ch: bit absolute,x]---------------------------------------------------}
@OPCODE3C:     MOV   WORD PTR [INSTRCYCLES],$2404
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               JMP   @OPC2C_4
{---[3Dh: and absolute,x]---------------------------------------------------}
@OPCODE3D:     MOV   WORD PTR [INSTRCYCLES],$1104+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               MOV   DI,AX
               AND   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[3Eh: rol absolute,x]---------------------------------------------------}
@OPCODE3E:     MOV   WORD PTR [INSTRCYCLES],$2407+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               MOV   DI,AX
               AND   AH,$F0
               CMP   AH,$A0
               JAE   @OPC3E_1
               MOV   AL,BH
               SHR   AL,1 {get carry}
               RCL   BYTE PTR [DI],1
               JC    @OPC3E_3
               OR    BYTE PTR [DI],$00
               CLC
               CALL  UPDATEGRAPH
               JMP   @UPDATECNZ
@OPC3E_3:      OR    BYTE PTR [DI],$00
               STC
               CALL  UPDATEGRAPH
               JMP   @UPDATECNZ
@OPC3E_1:      MOV   AL,BH
               SHR   AL,1 {get carry}
               MOV   AL,BYTE PTR [DI]
               RCL   AL,1
               JC    @OPC3E_4
               OR    AL,AL
               CLC
               JMP   @UPDATECNZ
@OPC3E_4:      OR    AL,AL
               STC
               JMP   @UPDATECNZ
{---[40h: rti implied]------------------------------------------------------}
@OPCODE40:     MOV   WORD PTR [INSTRCYCLES],$1706
               CMP   BYTE PTR [CS:AANTBOXRET],$00
               JZ    @OPC40_1
               PUSH  BX
               MOV   BL,BYTE PTR [CS:AANTBOXRET]
               DEC   BL
               MOV   BH,$00
               SHL   BX,1
               MOV   AX,BP
               DEC   AL {ivm met PHA voor ind. jmp, bij zowel IRQ als NMI}
               CMP   AL,BYTE PTR BOXRETURNS[CS:BX+$01]
               MOV   AL,BYTE PTR BOXRETURNS[CS:BX]
               POP   BX
               JNZ   @OPC40_1
               {---return to previous box---}
               DEC   BYTE PTR [CS:AANTBOXRET]
               PUSH  AX
               CALL  SAVEZP90
               POP   AX
               MOV   BYTE PTR [SCHAKELBYTE],AL
               CALL  SETA000MEM
@OPC40_1:      INC   BP
               AND   BP,$00FF
               MOV   BH,BYTE PTR [DS:BP+STACKBASE]
               INC   BP
               AND   BP,$00FF
               MOV   AL,BYTE PTR [DS:BP+STACKBASE]
               INC   BP
               AND   BP,$00FF
               MOV   AH,BYTE PTR [DS:BP+STACKBASE]
               MOV   SI,AX
               JMP   @NEXTOPC
{---[41h: eor (indirect,x)]-------------------------------------------------}
@OPCODE41:     MOV   WORD PTR [INSTRCYCLES],$1406+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               XOR   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[45h: eor zero page]----------------------------------------------------}
@OPCODE45:     MOV   WORD PTR [INSTRCYCLES],$1003+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               XOR   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[46h: lsr zero page]----------------------------------------------------}
@OPCODE46:     MOV   WORD PTR [INSTRCYCLES],$1105+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               SHR   BYTE PTR [DI],1
               JMP   @UPDATECNZ
{---[48h: pha implied]------------------------------------------------------}
@OPCODE48:     MOV   WORD PTR [INSTRCYCLES],$0903
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],BL
               DEC   BP
               JMP   @NEXTOPC
{---[49h: eor immediate]----------------------------------------------------}
@OPCODE49:     MOV   WORD PTR [INSTRCYCLES],$0B02+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               XOR   BL,AL
               JMP   @UPDATENZ
{---[4Ah: lsr accumulator]--------------------------------------------------}
@OPCODE4A:     MOV   WORD PTR [INSTRCYCLES],$0802+$0F00
               SHR   BL,1
               JMP   @UPDATECNZ
{---[4Ch: jmp absolute]-----------------------------------------------------}
@OPCODE4C:     MOV   WORD PTR [INSTRCYCLES],$1003
               CMP   SI,WORD PTR [CS:ABLOKSPRONG]
               JZ    @OPC4C_1
@OPC4C_2:      MOV   SI,WORD PTR [SI]
               JMP   @NEXTOPC
@OPC4C_1:      TEST  BYTE PTR [CS:BOXSWITCH],$FF
               JZ    @OPC4C_2
               MOV   AL,BYTE PTR [SCHAKELBYTE]
               AND   AL,$0F
               MOV   BYTE PTR @SCHAKELSTART,AL
               CMP   WORD PTR [$A000],$BF40
               JNZ   @OPC4C_3
@OPC4C_4:      MOV   BP,$00FF
               MOV   SI,$A002
               JMP   @NEXTOPC
@OPC4C_3:      CALL  SAVEZP90
               INC   BYTE PTR [SCHAKELBYTE]
               AND   BYTE PTR [SCHAKELBYTE],$0F
               PUSH  ES
               MOV   AX,DS
               ADD   AX,$1000
               MOV   ES,AX
               MOV   AL,$00
               MOV   AH,BYTE PTR SCHAKELBYTE
               SHL   AH,4
               MOV   DI,AX
               CMP   WORD PTR [ES:DI],$BF40
               POP   ES
               JNZ   @OPC4C_5
               CALL  SETA000MEM
               MOV   AL,BYTE PTR [SCHAKELBYTE]
               CMP   AL,BYTE PTR @SCHAKELSTART
               JNZ   @OPC4C_4
               JMP   @JMPTOBRK
@OPC4C_5:      MOV   AL,BYTE PTR [SCHAKELBYTE]
               CMP   AL,BYTE PTR @SCHAKELSTART
               JNZ   @OPC4C_3
               CALL  SETA000MEM
               JMP   @JMPTOBRK
{---[schakel_brk]-----------------------------------------------------------}
@SCHAKEL_BRK:  PUSH  BX
               MOV   BX,BP
               ADD   BL,$02
               AND   BX,$00FF
               CMP   BYTE PTR [BX+STACKBASE],+94
               POP   BX
               JZ    @OPC4C_3
@JMPTOBRK:     MOV   AX,WORD PTR [$0202]
               AND   AH,$F0
               CMP   AH,$A0
               JNZ   @JMPBRK1
               PUSH  ES
               MOV   AX,DS
               ADD   AX,$2000
               MOV   ES,AX
               MOV   AL,BYTE PTR [ES:$0122]
               POP   ES
               MOV   AH,BYTE PTR [SCHAKELBYTE]
               AND   AX,$0F0F
               CMP   AL,AH
               JZ    @JMPBRK1
               CALL  SAVEZP90
               PUSH  ES
               MOV   AX,DS
               ADD   AX,$2000
               MOV   ES,AX
               MOV   AL,BYTE PTR [ES:$0122]
               POP   ES
               MOV   BYTE PTR [SCHAKELBYTE],AL
               CALL  SETA000MEM
@JMPBRK1:      MOV   SI,WORD PTR [$0202]
               JMP   @NEXTOPC
{---[4Dh: eor absolute]-----------------------------------------------------}
@OPCODE4D:     MOV   WORD PTR [INSTRCYCLES],$0E04+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               MOV   DI,AX
               XOR   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[4Eh: lsr absolute]-----------------------------------------------------}
@OPCODE4E:     MOV   WORD PTR [INSTRCYCLES],$1306+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
@LSR_ABS:      MOV   DI,AX
               AND   AH,$F0
               CMP   AH,$A0
               JAE   @OPC4E_1
               SHR   BYTE PTR [DI],1
               CALL  UPDATEGRAPH
               JMP   @UPDATECNZ
@OPC4E_1:      CMP   DI,SCHAKELBYTE
               JZ    @OPC4E_2
               MOV   AL,BYTE PTR [DI]
               SHR   AL,1
               JMP   @UPDATECNZ
@OPC4E_2:      CALL  SAVEZP90
               SHR   BYTE PTR [DI],1
               PUSHF
               CALL  SETA000MEM
               POPF
               JMP   @UPDATECNZ
{---[50h: bvc relative]-----------------------------------------------------}
@OPCODE50:     MOV   AL,BH
               SHL   AL,2 {get overflow}
               JC    @OPC50_1
               MOV   WORD PTR [INSTRCYCLES],$1303
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CBW
               ADD   SI,AX
               JMP   @NEXTOPC
@OPC50_1:      MOV   WORD PTR [INSTRCYCLES],$0E02
               INC   SI
               JMP   @NEXTOPC
{---[51h: eor (indirect),y]-------------------------------------------------}
@OPCODE51:     MOV   WORD PTR [INSTRCYCLES],$1705+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AX,WORD PTR [DI] {get address from atom memory}
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               XOR   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[52h: eor (indirect)]---------------------------------------------------}
@OPCODE52:     MOV   WORD PTR [INSTRCYCLES],$1305+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI]
               XOR   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[55h: eor zero page,x]--------------------------------------------------}
@OPCODE55:     MOV   WORD PTR [INSTRCYCLES],$1104+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               XOR   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[56h: lsr zero page,x]--------------------------------------------------}
@OPCODE56:     MOV   WORD PTR [INSTRCYCLES],$1306+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               SHR   BYTE PTR [DI],1
               JMP   @UPDATECNZ
{---[58h: cli]--------------------------------------------------------------}
@OPCODE58:     MOV   WORD PTR [INSTRCYCLES],$0802
               AND   BH,11111011b
               JMP   @NEXTOPC
{---[59h: eor absolute,y]---------------------------------------------------}
@OPCODE59:     MOV   WORD PTR [INSTRCYCLES],$1104+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               XOR   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[5Ah: phy implied]------------------------------------------------------}
@OPCODE5A:     MOV   WORD PTR [INSTRCYCLES],$0903
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],DL
               DEC   BP
               JMP   @NEXTOPC
{---[5Ch: nop absolute]-----------------------------------------------------}
@OPCODE5C:
@OPCODEDC:     MOV   WORD PTR [INSTRCYCLES],$0804
               ADD   SI,+$02
               JMP   @NEXTOPC
{---[5Dh: eor absolute,x]---------------------------------------------------}
@OPCODE5D:     MOV   WORD PTR [INSTRCYCLES],$1104+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               MOV   DI,AX
               XOR   BL,BYTE PTR [DI]
               JMP   @UPDATENZ
{---[5Eh: lsr absolute,x]---------------------------------------------------}
@OPCODE5E:     MOV   WORD PTR [INSTRCYCLES],$1707+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               JMP   @LSR_ABS
{---[60h: rts implied]------------------------------------------------------}
@OPCODE60:     MOV   WORD PTR [INSTRCYCLES],$1406
               CMP   BYTE PTR [CS:AANTBOXRET],$00
               JZ    @OPC60_1
               PUSH  BX
               MOV   BL,BYTE PTR [CS:AANTBOXRET]
               DEC   BL
               MOV   BH,$00
               SHL   BX,1
               MOV   AX,BP
               CMP   AL,BYTE PTR BOXRETURNS[CS:BX+$01]
               MOV   AL,BYTE PTR BOXRETURNS[CS:BX]
               POP   BX
               JNZ   @OPC60_1
               {---return to previous box---}
               DEC   BYTE PTR [CS:AANTBOXRET]
               PUSH  AX
               CALL  SAVEZP90
               POP   AX
               MOV   BYTE PTR [SCHAKELBYTE],AL
               CALL  SETA000MEM
@OPC60_1:      INC   BP
               AND   BP,$00FF
               MOV   AL,BYTE PTR [DS:BP+STACKBASE]
               INC   BP
               AND   BP,$00FF
               MOV   AH,BYTE PTR [DS:BP+STACKBASE]
               INC   AX
               MOV   SI,AX
               JMP   @NEXTOPC
{---[61h: adc (indirect,x)]-------------------------------------------------}
@OPCODE61:     MOV   WORD PTR [INSTRCYCLES],$1E06+$1400
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @ADC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               ADC   BL,AL
               JMP   @UPDATECVNZ
{---[64h: stz zero page]----------------------------------------------------}
@OPCODE64:     MOV   WORD PTR [INSTRCYCLES],$0F03
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   BYTE PTR [DI],$00
               JMP   @NEXTOPC
{---[65h: adc zero page]----------------------------------------------------}
@OPCODE65:     MOV   WORD PTR [INSTRCYCLES],$1A03+$1400
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @ADC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               ADC   BL,AL
               JMP   @UPDATECVNZ
{---[66h: ror zero page]----------------------------------------------------}
@OPCODE66:     MOV   WORD PTR [INSTRCYCLES],$1105+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AL,BH
               SHR   AL,1 {get carry}
               RCR   BYTE PTR [DI],1
               JC    @OPC66_1
               OR    BYTE PTR [DI],$00
               CLC
               JMP   @UPDATECNZ
@OPC66_1:      OR    BYTE PTR [DI],$00
               STC
               JMP   @UPDATECNZ
{---[68h: pla implied]------------------------------------------------------}
@OPCODE68:     MOV   WORD PTR [INSTRCYCLES],$0904+$0F00
               INC   BP
               AND   BP,$00FF
               MOV   BL,BYTE PTR [DS:BP+STACKBASE]
               OR    BL,BL
               JMP   @UPDATENZ
{---[69h: adc immediate]----------------------------------------------------}
@OPCODE69:     MOV   WORD PTR [INSTRCYCLES],$1502+$1400
               MOV   AL,BYTE PTR [SI]
               INC   SI
               TEST  BH,00001000b
               JNZ   @ADC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               ADC   BL,AL
               JMP   @UPDATECVNZ
{---[6Ah: ror accumulator]--------------------------------------------------}
@OPCODE6A:     MOV   WORD PTR [INSTRCYCLES],$0802+$0F00
               MOV   AL,BH
               SHR   AL,1 {get carry}
               RCR   BL,1
               JC    @OPC6A_1
               OR    BL,BL
               CLC
               JMP   @UPDATECNZ
@OPC6A_1:      OR    BL,BL
               STC
               JMP   @UPDATECNZ
{---[6Ch: jmp (absolute indirect)]------------------------------------------}
@OPCODE6C:     MOV   WORD PTR [INSTRCYCLES],$4005
               MOV   SI,WORD PTR [SI]
               MOV   AX,WORD PTR [SI]
               CMP   SI,LOADVEC
               JNZ   @OPC6C_9
               CMP   AX,WORD PTR [$FFA2]
               JNZ   @OPC6C_2
               JMP   @LOADFILE
@OPC6C_9:      CMP   SI,SAVEVEC
               JNZ   @OPC6C_10
               CMP   AX,WORD PTR [$FFA4]
               JNZ   @OPC6C_2
               JMP   @SAVEFILE
@OPC6C_10:     CMP   SI,GETBYTEVEC
               JNZ   @OPC6C_11
               CMP   AX,WORD PTR [$FFAA]
               JNZ   @OPC6C_2
               JMP   @GETBYTE
@OPC6C_11:     CMP   SI,PUTBYTEVEC
               JNZ   @OPC6C_12
               CMP   AX,WORD PTR [$FFAC]
               JNZ   @OPC6C_2
               JMP   @PUTBYTE
@OPC6C_12:     CMP   SI,FINDVEC
               JNZ   @OPC6C_1
               AND   BP,$00FF
               CMP   WORD PTR [DS:BP+STACKBASE+1],$CFB0
               JNZ   @OPC6C_2
               CMP   AX,WORD PTR [$FFAE]
               JNZ   @OPC6C_2
               JMP   @FINFOUTCMD
@OPC6C_1:      CMP   SI,$00C9
               JNZ   @OPC6C_2
               MOV   SI,WORD PTR [SI]
               CMP   SI,$FA2A
               JZ    @TAPECAT
               JMP   @NEXTOPC
@OPC6C_2:      CMP   SI,$0200
               JB    @OPC6C_4
               CMP   SI,$021C
               JAE   @OPC6C_6
               CMP   SI,$0202
               JNZ   @OPC6C_8
               TEST  BYTE PTR [CS:BOXSWITCH],$FF
               JZ    @OPC6C_4
               JMP   @SCHAKEL_BRK
@OPC6C_6:      CMP   SI,$03FE
               JNZ   @OPC6C_4
               AND   AH,$F0
               CMP   AH,$A0
               JNZ   @OPC6C_4
               MOV   DI,$001C
               JMP   @OPC6C_3
@OPC6C_8:      MOV   AX,WORD PTR [SI]
               AND   AH,$F0
               CMP   AH,$A0
               JNZ   @OPC6C_4
               MOV   DI,SI
               AND   DI,$00FF
@OPC6C_3:      PUSH  ES
               MOV   AX,DS
               ADD   AX,$2000
               MOV   ES,AX
               MOV   AL,BYTE PTR [ES:DI+$0120]
               POP   ES
@OPC6C_7:      MOV   AH,BYTE PTR [SCHAKELBYTE]
               AND   AX,$0F0F
               CMP   AL,AH
               JZ    @OPC6C_4
               CMP   BYTE PTR [CS:AANTBOXRET],$20
               JAE   @OPC6C_5
               {---jump into another box than currently at A000h---}
               PUSH  DI
               PUSH  AX
               CALL  SAVEZP90
               POP   AX
               POP   DI
               PUSH  BX
               MOV   BL,BYTE PTR [CS:AANTBOXRET]
               MOV   BH,$00
               SHL   BX,1
               MOV   BYTE PTR BOXRETURNS[CS:BX],AH
               MOV   AX,BP
               MOV   BYTE PTR BOXRETURNS[CS:BX+$01],AL
               INC   BYTE PTR [CS:AANTBOXRET]
               POP   BX
               PUSH  ES
               MOV   AX,DS
               ADD   AX,$2000
               MOV   ES,AX
               MOV   AL,BYTE PTR [ES:$0120+DI]
               POP   ES
               MOV   BYTE PTR [SCHAKELBYTE],AL
               CALL  SETA000MEM
@OPC6C_4:      MOV   SI,WORD PTR [SI]
               JMP   @NEXTOPC
@OPC6C_5:      {---too many calls from one box to other; generate error 33---}
               MOV   BYTE PTR [CS:AANTBOXRET],$00
               MOV   SI,+32
               JMP   @OPCODE00
{---[6Dh: adc absolute]-----------------------------------------------------}
@OPCODE6D:     MOV   WORD PTR [INSTRCYCLES],$1804+$1400
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @ADC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               ADC   BL,AL
               JMP   @UPDATECVNZ
{---[6Eh: ror absolute]-----------------------------------------------------}
@OPCODE6E:     MOV   WORD PTR [INSTRCYCLES],$2306+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               MOV   DI,AX
               AND   AH,$F0
               CMP   AH,$A0
               JAE   @OPC6E_1
               MOV   AL,BH
               SHR   AL,1 {get carry}
               RCR   BYTE PTR [DI],1
               JC    @OPC6E_3
               OR    BYTE PTR [DI],$00
               CLC
               CALL  UPDATEGRAPH
               JMP   @UPDATECNZ
@OPC6E_3:      OR    BYTE PTR [DI],$00
               STC
               CALL  UPDATEGRAPH
               JMP   @UPDATECNZ
@OPC6E_1:      MOV   AL,BH
               SHR   AL,1 {get carry}
               MOV   AL,BYTE PTR [DI]
               RCR   AL,1
               JC    @OPC6E_4
               OR    AL,AL
               CLC
               JMP   @UPDATECNZ
@OPC6E_4:      OR    AL,AL
               STC
               JMP   @UPDATECNZ
{---[adc_dec]---------------------------------------------------------------}
@ADC_DEC:      MOV   AH,BH
               SHR   AH,1 {get carry}
               ADC   AL,BL
               JO    @ADCDEC1
               DAA
               LAHF
               MOV   BL,AL
               AND   BH,10111111b {clear overflow}
               SAHF
               JMP   @UPDATECNZ
@ADCDEC1:      DAA
               LAHF
               MOV   BL,AL
               OR    BH,01000000b {set overflow}
               SAHF
               JMP   @UPDATECNZ
{---[70h: bvs relative]-----------------------------------------------------}
@OPCODE70:     MOV   AL,BH
               SHL   AL,2 {get overflow}
               JNC   @OPC70_1
               MOV   WORD PTR [INSTRCYCLES],$1303
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CBW
               ADD   SI,AX
               JMP   @NEXTOPC
@OPC70_1:      MOV   WORD PTR [INSTRCYCLES],$0E02
               INC   SI
               JMP   @NEXTOPC
{---[71h: adc (indirect),y]-------------------------------------------------}
@OPCODE71:     MOV   WORD PTR [INSTRCYCLES],$2105+$1400
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AX,WORD PTR [DI] {get address from atom memory}
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @ADC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               ADC   BL,AL
               JMP   @UPDATECVNZ
{---[72h: adc (indirect)]---------------------------------------------------}
@OPCODE72:     MOV   WORD PTR [INSTRCYCLES],$1D05+$1400
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @ADC_DEC
               MOV   AH,BH
               SHR   AH,1
               ADC   BL,AL
               JMP   @UPDATECVNZ
{---[74h: stz zero page,x]--------------------------------------------------}
@OPCODE74:     MOV   WORD PTR [INSTRCYCLES],$1004
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   BYTE PTR [DI],$00
               JMP   @NEXTOPC
{---[75h: adc zero page,x]--------------------------------------------------}
@OPCODE75:     MOV   WORD PTR [INSTRCYCLES],$1B04+$1400
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @ADC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               ADC   BL,AL
               JMP   @UPDATECVNZ
{---[76h: ror zero page,x]--------------------------------------------------}
@OPCODE76:     MOV   WORD PTR [INSTRCYCLES],$1306+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   AL,BH
               SHR   AL,1 {get carry}
               RCR   BYTE PTR [DI],1
               JC    @OPC76_1
               OR    BYTE PTR [DI],$00
               CLC
               JMP   @UPDATECNZ
@OPC76_1:      OR    BYTE PTR [DI],$00
               STC
               JMP   @UPDATECNZ
{---[78h: sei]--------------------------------------------------------------}
@OPCODE78:     MOV   WORD PTR [INSTRCYCLES],$0802
               OR    BH,00000100b
               JMP   @NEXTOPC
{---[79h: adc absolute,y]---------------------------------------------------}
@OPCODE79:     MOV   WORD PTR [INSTRCYCLES],$1B04+$1400
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @ADC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               ADC   BL,AL
               JMP   @UPDATECVNZ
{---[7Ah: ply implied]------------------------------------------------------}
@OPCODE7A:     MOV   WORD PTR [INSTRCYCLES],$0904+$0F00
               INC   BP
               AND   BP,$00FF
               MOV   DL,BYTE PTR [DS:BP+STACKBASE]
               OR    DL,DL
               JMP   @UPDATENZ
{---[7Ch: jmp (absolute,x)]-------------------------------------------------}
@OPCODE7C:     MOV   WORD PTR [INSTRCYCLES],$0806
               MOV   AX,WORD PTR [SI]
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               MOV   SI,AX
               MOV   SI,WORD PTR [SI]
               JMP   @NEXTOPC
{---[7Dh: adc absolute,x]---------------------------------------------------}
@OPCODE7D:     MOV   WORD PTR [INSTRCYCLES],$1B04+$1400
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @ADC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               ADC   BL,AL
               JMP   @UPDATECVNZ
{---[7Eh: ror absolute,x]---------------------------------------------------}
@OPCODE7E:     MOV   WORD PTR [INSTRCYCLES],$2407+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               MOV   DI,AX
               AND   AH,$F0
               CMP   AH,$A0
               JAE   @OPC7E_1
               MOV   AL,BH
               SHR   AL,1 {get carry}
               RCR   BYTE PTR [DI],1
               JC    @OPC7E_3
               OR    BYTE PTR [DI],$00
               CLC
               CALL  UPDATEGRAPH
               JMP   @UPDATECNZ
@OPC7E_3:      OR    BYTE PTR [DI],$00
               STC
               CALL  UPDATEGRAPH
               JMP   @UPDATECNZ
@OPC7E_1:      MOV   AL,BH
               SHR   AL,1 {get carry}
               MOV   AL,BYTE PTR [DI]
               RCR   AL,1
               JC    @OPC7E_4
               OR    AL,AL
               CLC
               JMP   @UPDATECNZ
@OPC7E_4:      OR    AL,AL
               STC
               JMP   @UPDATECNZ
{---[80h: bra relative]-----------------------------------------------------}
@OPCODE80:     MOV   WORD PTR [INSTRCYCLES],$0803
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CBW
               ADD   SI,AX
               JMP   @NEXTOPC
{---[81h: sta (indirect,x)]-------------------------------------------------}
@OPCODE81:     MOV   WORD PTR [INSTRCYCLES],$2506
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   AX,WORD PTR [DI] {get address from atom memory}
               JMP   @STORE_A
{---[84h: sty zero page]----------------------------------------------------}
@OPCODE84:     MOV   WORD PTR [INSTRCYCLES],$0F03
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   BYTE PTR [DI],DL
               JMP   @NEXTOPC
{---[85h: sta zero page]----------------------------------------------------}
@OPCODE85:     MOV   WORD PTR [INSTRCYCLES],$0F03
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   BYTE PTR [DI],BL
               JMP   @NEXTOPC
{---[86h: stx zero page]----------------------------------------------------}
@OPCODE86:     MOV   WORD PTR [INSTRCYCLES],$0F03
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   BYTE PTR [DI],CL
               JMP   @NEXTOPC
{---[88h: dey implied]------------------------------------------------------}
@OPCODE88:     MOV   WORD PTR [INSTRCYCLES],$0802+$0F00
               DEC   DL
               JMP   @UPDATENZ
{---[89h: bit immediate (only affects zero flag)]---------------------------}
@OPCODE89:     MOV   WORD PTR [INSTRCYCLES],$0B02+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               TEST  BL,AL
               LAHF
               AND   BH,11111101b
               AND   AH,01000000b
               SHR   AH,5
               OR    BH,AH {zero flag}
               JMP   @NEXTOPC
{---[8Ah: txa implied]------------------------------------------------------}
@OPCODE8A:     MOV   WORD PTR [INSTRCYCLES],$0902+$0F00
               MOV   BL,CL
               OR    BL,BL
               JMP   @UPDATENZ
{---[8Ch: sty absolute]-----------------------------------------------------}
@OPCODE8C:     MOV   WORD PTR [INSTRCYCLES],$1F04
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               MOV   DI,AX
               MOV   AL,AH
               AND   AL,$F0
               CMP   AL,$A0
               JB    @OPC8C_2
               CMP   AL,$B0
               JNZ   @OPC8C_3
               CMP   AH,$B0
               JNZ   @OPC8C_4
               CMP   DI,$B000
               JZ    @STY_B000
               CMP   DI,$B002
               JZ    @STY_B002
               CMP   DI,$B003
               JNZ   @OPC8C_3
               JMP   @STY_B003
@OPC8C_4:      CMP   AH,$B8
               JZ    @STY_VIA
               CMP   AH,$BA
               JNZ   @OPC8C_6
               MOV   AL,DL
               CALL  WRITE_FDC
               JMP   @NEXTOPC
@OPC8C_6:      CMP   DI,$BFE0
               JZ    @STY_MOUSEX
               CMP   DI,$BFE1
               JZ    @STY_MOUSEY
               CMP   DI,$BFE2
               JNZ   @OPC8C_1
               MOV   AL,DL
               JMP   @STORE_MOUSENR
@OPC8C_1:      CMP   DI,SCHAKELBYTE
               JNZ   @OPC8C_3
               CALL  SAVEZP90
               MOV   BYTE PTR [DI],DL
               CALL  SETA000MEM
               JMP   @NEXTOPC
@OPC8C_2:      MOV   BYTE PTR [DI],DL
               CALL  UPDATEGRAPH
@OPC8C_3:      JMP   @NEXTOPC
{---[8Dh: sta absolute]-----------------------------------------------------}
@OPCODE8D:     MOV   WORD PTR [INSTRCYCLES],$1F04
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
@STORE_A:      MOV   DI,AX
               MOV   AL,AH
               AND   AL,$F0
               CMP   AL,$A0
               JB    @OPC8D_2
               CMP   AL,$B0
               JNZ   @OPC8D_3
               CMP   AH,$B0
               JNZ   @OPC8D_4
               CMP   DI,$B000
               JZ    @STA_B000
               CMP   DI,$B002
               JZ    @STA_B002
               CMP   DI,$B003
               JNZ   @OPC8D_3
               JMP   @STA_B003
@OPC8D_4:      CMP   AH,$B8
               JZ    @STA_VIA
               CMP   AH,$BA
               JNZ   @OPC8D_6
               MOV   AL,BL
               CALL  WRITE_FDC
               JMP   @NEXTOPC
@OPC8D_6:      CMP   DI,$BFE0
               JZ    @STA_MOUSEX
               CMP   DI,$BFE1
               JZ    @STA_MOUSEY
               CMP   DI,$BFE2
               JNZ   @OPC8D_1
               MOV   AL,BL
               JMP   @STORE_MOUSENR
@OPC8D_1:      CMP   DI,SCHAKELBYTE
               JNZ   @OPC8D_3
               CALL  SAVEZP90
               MOV   BYTE PTR [DI],BL
               CALL  SETA000MEM
               JMP   @NEXTOPC
@OPC8D_2:      MOV   BYTE PTR [DI],BL
               CALL  UPDATEGRAPH
@OPC8D_3:      JMP   @NEXTOPC
{---[8Eh: stx absolute]-----------------------------------------------------}
@OPCODE8E:     MOV   WORD PTR [INSTRCYCLES],$1F04
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               MOV   DI,AX
               MOV   AL,AH
               AND   AL,$F0
               CMP   AL,$A0
               JB    @OPC8E_2
               CMP   AL,$B0
               JNZ   @OPC8E_3
               CMP   AH,$B0
               JNZ   @OPC8E_4
               CMP   DI,$B000
               JZ    @STX_B000
               CMP   DI,$B002
               JZ    @STX_B002
               CMP   DI,$B003
               JNZ   @OPC8E_3
               JMP   @STX_B003
@OPC8E_4:      CMP   AH,$B8
               JZ    @STX_VIA
               CMP   AH,$BA
               JNZ   @OPC8E_6
               MOV   AL,CL
               CALL  WRITE_FDC
               JMP   @NEXTOPC
@OPC8E_6:      CMP   DI,$BFE0
               JZ    @STX_MOUSEX
               CMP   DI,$BFE1
               JZ    @STX_MOUSEY
               CMP   DI,$BFE2
               JNZ   @OPC8E_1
               MOV   AL,CL
               JMP   @STORE_MOUSENR
@OPC8E_1:      CMP   DI,SCHAKELBYTE
               JNZ   @OPC8E_3
               CALL  SAVEZP90
               MOV   BYTE PTR [DI],CL
               CALL  SETA000MEM
               JMP   @NEXTOPC
@OPC8E_2:      MOV   BYTE PTR [DI],CL
               CALL  UPDATEGRAPH
@OPC8E_3:      JMP   @NEXTOPC
{---[sta/stx/sty/stz_b002]--------------------------------------------------}
@STZ_B002:     MOV   AL,$00
               JMP   @S_B002_1
@STA_B002:     MOV   AL,BL
               JMP   @S_B002_1
@STX_B002:     MOV   AL,CL
               JMP   @S_B002_1
@STY_B002:     MOV   AL,DL
@S_B002_1:     MOV   AH,BYTE PTR [$B002]
               AND   AL,$0F
               AND   BYTE PTR [$B002],$F0
               OR    BYTE PTR [$B002],AL
               PUSH  AX
               AND   AX,$0808
               CMP   AL,AH
               JZ    @S_B002_4
               OR    AL,AL
               JNZ   @S_B002_5
               CMP   BYTE PTR [CS:GRAPHMODE],$05
               JB    @S_B002_6
               PUSH  DX
               MOV   DX,$03C8
               MOV   AL,$03
               OUT   DX,AL
               INC   DX
               MOV   AL,BYTE PTR EMULCOLORS[CS:(3*3)]
               OUT   DX,AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(3*3+1)]
               OUT   DX,AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(3*3+2)]
               OUT   DX,AL
               MOV   DX,$03C8
               MOV   AL,$07
               OUT   DX,AL
               INC   DX
               MOV   AL,BYTE PTR EMULCOLORS[CS:(7*3)]
               OUT   DX,AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(7*3+1)]
               OUT   DX,AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(7*3+2)]
               OUT   DX,AL
               POP   DX
               JMP   @S_B002_4
@S_B002_6:     PUSH  DX
               MOV   DX,$03C8
               MOV   AL,$01
               OUT   DX,AL
               INC   DX
               MOV   AL,BYTE PTR EMULCOLORS[CS:(1*3)]
               OUT   DX,AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(1*3+1)]
               OUT   DX,AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(1*3+2)]
               OUT   DX,AL
               MOV   DX,$03C8
               MOV   AL,$07
               OUT   DX,AL
               INC   DX
               MOV   AL,BYTE PTR EMULCOLORS[CS:(7*3)]
               OUT   DX,AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(7*3+1)]
               OUT   DX,AL
               MOV   AL,BYTE PTR EMULCOLORS[CS:(7*3+2)]
               OUT   DX,AL
               POP   DX
               JMP   @S_B002_4
@S_B002_5:     CMP   BYTE PTR [CS:GRAPHMODE],$05
               JB    @S_B002_7
               PUSH  DX
               MOV   DX,$03C8
               MOV   AL,$03
               OUT   DX,AL
               INC   DX
               MOV   AL,BYTE PTR INTENSCOLOR[CS:$00]
               OUT   DX,AL
               MOV   AL,BYTE PTR INTENSCOLOR[CS:$01]
               OUT   DX,AL
               MOV   AL,BYTE PTR INTENSCOLOR[CS:$02]
               OUT   DX,AL
               MOV   DX,$03C8
               MOV   AL,$07
               OUT   DX,AL
               INC   DX
               MOV   AL,BYTE PTR INTENSCOLOR[CS:$00]
               OUT   DX,AL
               MOV   AL,BYTE PTR INTENSCOLOR[CS:$01]
               OUT   DX,AL
               MOV   AL,BYTE PTR INTENSCOLOR[CS:$02]
               OUT   DX,AL
               POP   DX
               JMP   @S_B002_4
@S_B002_7:     PUSH  DX
               MOV   DX,$03C8
               MOV   AL,$01
               OUT   DX,AL
               INC   DX
               MOV   AL,BYTE PTR INTENSMONO[CS:$00]
               OUT   DX,AL
               MOV   AL,BYTE PTR INTENSMONO[CS:$01]
               OUT   DX,AL
               MOV   AL,BYTE PTR INTENSMONO[CS:$02]
               OUT   DX,AL
               CMP   BYTE PTR [CS:GRAPHMODE],$00
               JZ    @S_B002_9
               MOV   DX,$03C8
               MOV   AL,$07
               OUT   DX,AL
               INC   DX
               MOV   AL,BYTE PTR INTENSMONO[CS:$00]
               OUT   DX,AL
               MOV   AL,BYTE PTR INTENSMONO[CS:$01]
               OUT   DX,AL
               MOV   AL,BYTE PTR INTENSMONO[CS:$02]
               OUT   DX,AL
@S_B002_9:     POP   DX
@S_B002_4:     POP   AX
               AND   AX,$0404
               CMP   AL,AH
               JZ    @S_B002_2
               CMP   BYTE PTR [CS:SOUNDOUTPUT],$00
               JZ    @S_B002_2
               CMP   BYTE PTR @SBAVAIL,$00
               JNZ   @S_B002_3
               IN    AL,$61
               XOR   AL,$02
               OUT   $61,AL
               ADD   WORD PTR [PCCYCLES],+95
               JMP   @NEXTOPC
@S_B002_3:     CALL  SBSOUND
               ADD   WORD PTR [PCCYCLES],+300
               JMP   @NEXTOPC
@S_B002_2:     ADD   WORD PTR [PCCYCLES],+25
               JMP   @NEXTOPC
{---[sta/stx/sty/stz_b003]--------------------------------------------------}
@STZ_B003:     MOV   AL,$00
               JMP   @S_B003_1
@STA_B003:     MOV   AL,BL
               JMP   @S_B003_1
@STX_B003:     MOV   AL,CL
               JMP   @S_B003_1
@STY_B003:     MOV   AL,DL
@S_B003_1:     TEST  AL,00001000b
               JNZ   @S_B003_2
               PUSH  CX
               MOV   CL,AL
               AND   CL,00000110b
               SHR   CL,1
               AND   AL,00000001b
               SHL   AL,CL
               POP   CX
               MOV   AH,AL
               NEG   AH
               AND   AH,BYTE PTR [$B002]
               OR    AL,AH
               JMP   @S_B002_1
@S_B003_2:     ADD   WORD PTR [PCCYCLES],+10
               JMP   @NEXTOPC
{---[sta/stx/sty/stz_b000]--------------------------------------------------}
@STZ_B000:     MOV   AL,$00
               JMP   @S_B000_1
@STA_B000:     MOV   AL,BL
               JMP   @S_B000_1
@STX_B000:     MOV   AL,CL
               JMP   @S_B000_1
@STY_B000:     MOV   AL,DL
@S_B000_1:     ADD   WORD PTR [PCCYCLES],+25
               MOV   BYTE PTR [$B000],AL
               SHR   AL,5
               JNC   @S_B000_2 {lores}
               SHR   AL,1
               JNC   @S_B000_3 {hires color mode}
               INC   AL        {hires mode}
               JMP   @S_B000_4
@S_B000_3:     ADD   AL,$05
               JMP   @S_B000_4
@S_B000_2:     MOV   AL,$00
@S_B000_4:     CMP   AL,BYTE PTR [CS:GRAPHMODE]
               JZ    @S_B000_5
               MOV   BYTE PTR [CS:GRAPHMODE],AL
               CALL  SETBORDERCOL
               CALL  REBUILDSCREEN
@S_B000_5:     JMP   @NEXTOPC
{---[90h: bcc relative]-----------------------------------------------------}
@OPCODE90:     MOV   AL,BH
               SHR   AL,1 {get carry}
               JC    @OPC90_1
               MOV   WORD PTR [INSTRCYCLES],$1303
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CBW
               ADD   SI,AX
               JMP   @NEXTOPC
@OPC90_1:      MOV   WORD PTR [INSTRCYCLES],$0E02
               INC   SI
               JMP   @NEXTOPC
{---[91h: sta (indirect),y]-------------------------------------------------}
@OPCODE91:     MOV   WORD PTR [INSTRCYCLES],$2306
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AX,WORD PTR [DI] {get address from atom memory}
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               JMP   @STORE_A
{---[92h: sta (indirect)]---------------------------------------------------}
@OPCODE92:     MOV   WORD PTR [INSTRCYCLES],$2405
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AX,WORD PTR [DI] {get address from atom memory}
               JMP   @STORE_A
{---[94h: sty zero page,x]--------------------------------------------------}
@OPCODE94:     MOV   WORD PTR [INSTRCYCLES],$1004
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL
               MOV   AH,$00
               MOV   DI,AX
               MOV   BYTE PTR [DI],DL
               JMP   @NEXTOPC
{---[95h: sta zero page,x]--------------------------------------------------}
@OPCODE95:     MOV   WORD PTR [INSTRCYCLES],$1004
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL
               MOV   AH,$00
               MOV   DI,AX
               MOV   BYTE PTR [DI],BL
               JMP   @NEXTOPC
{---[96h: stx zero page,y]--------------------------------------------------}
@OPCODE96:     MOV   WORD PTR [INSTRCYCLES],$1004
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,DL
               MOV   AH,$00
               MOV   DI,AX
               MOV   BYTE PTR [DI],CL
               JMP   @NEXTOPC
{---[98h: tya implied]------------------------------------------------------}
@OPCODE98:     MOV   WORD PTR [INSTRCYCLES],$0902+$0F00
               MOV   BL,DL
               OR    BL,BL
               JMP   @UPDATENZ
{---[99h: sta absolute,y]---------------------------------------------------}
@OPCODE99:     MOV   WORD PTR [INSTRCYCLES],$2105
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               JMP   @STORE_A
{---[9Ah: txs implied]------------------------------------------------------}
@OPCODE9A:     MOV   WORD PTR [INSTRCYCLES],$0902
               MOV   AL,CL
               MOV   AH,$00
               MOV   BP,AX
               JMP   @NEXTOPC
{---[9Bh: txy implied]------------------------------------------------------}
@OPCODE9B:     MOV   WORD PTR [INSTRCYCLES],$0902+$0F00
               MOV   DL,CL
               OR    DL,DL
               JMP   @UPDATENZ
{---[9Ch: stz absolute]-----------------------------------------------------}
@OPCODE9C:     MOV   WORD PTR [INSTRCYCLES],$1F04
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
@STORE_Z:      MOV   DI,AX
               MOV   AL,AH
               AND   AL,$F0
               CMP   AL,$A0
               JB    @OPC9C_2
               CMP   AL,$B0
               JNZ   @OPC9C_3
               CMP   AH,$B0
               JNZ   @OPC9C_4
               CMP   DI,$B000
               JZ    @STZ_B000
               CMP   DI,$B002
               JZ    @STZ_B002
               CMP   DI,$B003
               JNZ   @OPC9C_3
               JMP   @STZ_B003
@OPC9C_4:      CMP   AH,$B8
               JZ    @STZ_VIA
               CMP   AH,$BA
               JNZ   @OPC9C_6
               MOV   AL,$00
               CALL  WRITE_FDC
               JMP   @NEXTOPC
@OPC9C_6:      CMP   DI,$BFE0
               JZ    @STZ_MOUSEX
               CMP   DI,$BFE1
               JZ    @STZ_MOUSEY
               CMP   DI,$BFE2
               JNZ   @OPC9C_1
               MOV   AL,$00
               JMP   @STORE_MOUSENR
@OPC9C_1:      CMP   DI,SCHAKELBYTE
               JNZ   @OPC9C_3
               CALL  SAVEZP90
               MOV   BYTE PTR [DI],$00
               CALL  SETA000MEM
               JMP   @NEXTOPC
@OPC9C_2:      MOV   BYTE PTR [DI],$00
               CALL  UPDATEGRAPH
@OPC9C_3:      JMP   @NEXTOPC
{---[9Dh: sta absolute,x]---------------------------------------------------}
@OPCODE9D:     MOV   WORD PTR [INSTRCYCLES],$2105
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               JMP   @STORE_A
{---[9Eh: stz absolute,x]---------------------------------------------------}
@OPCODE9E:     MOV   WORD PTR [INSTRCYCLES],$2105
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               JMP   @STORE_Z
{---[A0h: ldy immediate]----------------------------------------------------}
@OPCODEA0:     MOV   WORD PTR [INSTRCYCLES],$0B02+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   DL,AL
               OR    AL,AL
               JMP   @UPDATENZ
{---[A1h: lda (indirect,x)]-------------------------------------------------}
@OPCODEA1:     MOV   WORD PTR [INSTRCYCLES],$1D06+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               JMP   @LOAD_A
{---[A2h: ldx immediate]----------------------------------------------------}
@OPCODEA2:     MOV   WORD PTR [INSTRCYCLES],$0B02+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   CL,AL
               OR    AL,AL
               JMP   @UPDATENZ
{---[A4h: ldy zero page]----------------------------------------------------}
@OPCODEA4:     MOV   WORD PTR [INSTRCYCLES],$1003+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   DL,BYTE PTR [DI]
               OR    DL,DL
               JMP   @UPDATENZ
{---[A5h: lda zero page]----------------------------------------------------}
@OPCODEA5:     MOV   WORD PTR [INSTRCYCLES],$1003+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   BL,BYTE PTR [DI]
               OR    BL,BL
               JMP   @UPDATENZ
{---[A6h: ldx zero page]----------------------------------------------------}
@OPCODEA6:     MOV   WORD PTR [INSTRCYCLES],$1003+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   CL,BYTE PTR [DI]
               OR    CL,CL
               JMP   @UPDATENZ
{---[A8h: tay implied]------------------------------------------------------}
@OPCODEA8:     MOV   WORD PTR [INSTRCYCLES],$0902+$0F00
               MOV   DL,BL
               OR    DL,DL
               JMP   @UPDATENZ
{---[A9h: lda immediate]----------------------------------------------------}
@OPCODEA9:     MOV   WORD PTR [INSTRCYCLES],$0B02+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   BL,AL
               OR    AL,AL
               JMP   @UPDATENZ
{---[AAh: tax implied]------------------------------------------------------}
@OPCODEAA:     MOV   WORD PTR [INSTRCYCLES],$0902+$0F00
               MOV   CL,BL
               OR    CL,CL
               JMP   @UPDATENZ
{---[lda/ldx/ldy_b002]------------------------------------------------------}
@LDY_B002:     CALL  @L_B002_1
               MOV   DL,AL
               JMP   @UPDATENZ
@LDA_B002:     CALL  @L_B002_1
               MOV   BL,AL
               JMP   @UPDATENZ
@LDX_B002:     CALL  @L_B002_1
               MOV   CL,AL
               JMP   @UPDATENZ
@L_B002_1:     TEST  BYTE PTR [CS:CPUSPEEDMODE],$01
               JZ    @L_B002_4
               MOV   AL,$00
               CMP   WORD PTR [AANTCYCLES],CYCLESFLYBACK
               JB    @L_B002_6
               MOV   AL,$80
               CMP   WORD PTR [AANTCYCLES],(1026620/60)
               JB    @L_B002_6
               JMP   @L_B002_7
@L_B002_4:     MOV   AL,$00
               CMP   WORD PTR [AANTCYCLES],CYCLESFLYBACK
               JB    @L_B002_6
               CMP   WORD PTR [AANTCYCLES],(1026620/60)
               JAE   @L_B002_5
               PUSH  DX
               MOV   DX,$03DA
               IN    AL,DX
               POP   DX
               TEST  AL,$08
               JNZ   @L_B002_7
               MOV   AL,$80
               JMP   @L_B002_6
@L_B002_5:     PUSH  BX
               MOV   BX,$0A00
               PUSH  DX
               MOV   DX,$03DA
@L_B002_9:     IN    AL,DX
               TEST  AL,$08
               JNZ   @L_B002_10
               DEC   BX
               JNZ   @L_B002_9
@L_B002_10:    POP   DX
               POP   BX
@L_B002_7:     MOV   WORD PTR [AANTCYCLES],$0000
               MOV   AL,$00
@L_B002_6:     AND   BYTE PTR [$B002],$7F
               OR    AL,BYTE PTR [$B002]
@L_B002_3:     PUSH  DI
               MOV   DI,$0038 {---alt---}
               CMP   BYTE PTR [CS:ALTKEYB],$00
               JZ    @L_B002_8
               MOV   DI,$0036 {---right shift---}
@L_B002_8:     TEST  BYTE PTR TOETS[CS:DI],$03
               POP   DI
               JZ    @L_B002_2
               ADD   WORD PTR [PCCYCLES],+158
               AND   AL,$BF
               RETN
@L_B002_2:     ADD   WORD PTR [PCCYCLES],+158
               OR    AL,$40
               RETN
{---[lda/ldx/ldy_b003]------------------------------------------------------}
@LDY_B003:     CALL  @L_B003_1
               MOV   DL,AL
               JMP   @UPDATENZ
@LDA_B003:     CALL  @L_B003_1
               MOV   BL,AL
               JMP   @UPDATENZ
@LDX_B003:     CALL  @L_B003_1
               MOV   CL,AL
               JMP   @UPDATENZ
@L_B003_1:     AND   BYTE PTR [$B003],$3F
               MOV   AL,$C0
               OR    AL,BYTE PTR [$B003]
               CMP   BYTE PTR [CS:ALTKEYB],$00
               JNZ   @L_B003_9
               {---standard keyboard---}
               MOV   AH,BYTE PTR TOETS[CS:$2A] {---left shift---}
               OR    AH,BYTE PTR TOETS[CS:$36] {---right shift---}
               OR    AH,BYTE PTR TOETS[CS:$4B] {---crsr left---}
               OR    AH,BYTE PTR TOETS[CS:$50] {---crsr down---}
               AND   AH,$03
               JZ    @L_B003_5
               AND   AL,$7F
@L_B003_5:     MOV   AH,BYTE PTR TOETS[CS:$1D] {---ctrl---}
               OR    AH,BYTE PTR TOETS[CS:$38] {---alt---}
               AND   AH,$03
               JZ    @L_B003_3
               AND   AL,$BF
               JMP   @L_B003_3
@L_B003_9:     {---alternate keyboard---}
               MOV   AH,BYTE PTR TOETS[CS:$1D] {---ctrl---}
               OR    AH,BYTE PTR TOETS[CS:$38] {---alt---}
               AND   AH,$03
               JZ    @L_B003_10
               AND   AL,$7F
@L_B003_10:    MOV   AH,BYTE PTR TOETS[CS:$2A] {---left shift---}
               OR    AH,BYTE PTR TOETS[CS:$36] {---right shift---}
               AND   AH,$03
               JZ    @L_B003_3
               AND   AL,$BF
@L_B003_3:     ADD   WORD PTR [PCCYCLES],+158
               OR    AL,AL
               RETN
{---[ACh: ldy absolute]-----------------------------------------------------}
@OPCODEAC:     MOV   WORD PTR [INSTRCYCLES],$1604+$0F00
               MOV   DI,WORD PTR [SI]
               ADD   SI,+$02
@LOAD_Y:       CMP   DI,$B001
               JB    @OPCAC_1
               JZ    @LDY_B001
               CMP   DI,$B003
               JB    @LDY_B002
               JZ    @LDY_B003
               MOV   AX,DI
               CMP   AH,$B8
               JZ    @LDY_VIA
               CMP   AH,$BA
               JNZ   @OPCAC_2
               CALL  READ_FDC
               MOV   DL,AL
               OR    AL,AL
               JMP   @UPDATENZ
@OPCAC_2:      CMP   AX,FLIPFLOP
               JNZ   @OPCAC_1
               NOT   BYTE PTR [DI]
@OPCAC_1:      MOV   DL,BYTE PTR [DI]
               OR    DL,DL
               JMP   @UPDATENZ
{---[ADh: lda absolute]-----------------------------------------------------}
@OPCODEAD:     MOV   WORD PTR [INSTRCYCLES],$1604+$0F00
               MOV   DI,WORD PTR [SI]
               ADD   SI,+$02
@LOAD_A:       CMP   DI,$B001
               JB    @OPCAD_1
               JZ    @LDA_B001
               CMP   DI,$B003
               JB    @LDA_B002
               JZ    @LDA_B003
               MOV   AX,DI
               CMP   AH,$B8
               JZ    @LDA_VIA
               CMP   AH,$BA
               JNZ   @OPCAD_2
               CALL  READ_FDC
               MOV   BL,AL
               OR    AL,AL
               JMP   @UPDATENZ
@OPCAD_2:      CMP   AX,FLIPFLOP
               JNZ   @OPCAD_1
               NOT   BYTE PTR [DI]
@OPCAD_1:      MOV   BL,BYTE PTR [DI]
               OR    BL,BL
               JMP   @UPDATENZ
{---[AEh: ldx absolute]-----------------------------------------------------}
@OPCODEAE:     MOV   WORD PTR [INSTRCYCLES],$1604+$0F00
               MOV   DI,WORD PTR [SI]
               ADD   SI,+$02
@LOAD_X:       CMP   DI,$B001
               JB    @OPCAE_1
               JZ    @LDX_B001
               CMP   DI,$B003
               JB    @LDX_B002
               JZ    @LDX_B003
               MOV   AX,DI
               CMP   AH,$B8
               JZ    @LDX_VIA
               CMP   AH,$BA
               JNZ   @OPCAE_2
               CALL  READ_FDC
               MOV   CL,AL
               OR    AL,AL
               JMP   @UPDATENZ
@OPCAE_2:      CMP   AX,FLIPFLOP
               JNZ   @OPCAE_1
               NOT   BYTE PTR [DI]
@OPCAE_1:      MOV   CL,BYTE PTR [DI]
               OR    CL,CL
               JMP   @UPDATENZ
{---[lda/ldx/ldy_b001]------------------------------------------------------}
@LDY_B001:     CALL  @L_B001_1
               MOV   DL,AL
               OR    AL,AL
               JMP   @UPDATENZ
@LDA_B001:     CALL  @L_B001_1
               MOV   BL,AL
               OR    AL,AL
               JMP   @UPDATENZ
@LDX_B001:     CALL  @L_B001_1
               MOV   CL,AL
               OR    AL,AL
               JMP   @UPDATENZ
@L_B001_1:     MOV   AL,$FF
               CMP   BYTE PTR [CS:ALTKEYB],$00
               JNZ   @L_B001_9
               {---standard keyboard---}
               MOV   AH,BYTE PTR TOETS[CS:$2A] {---left shift---}
               OR    AH,BYTE PTR TOETS[CS:$36] {---right shift---}
               OR    AH,BYTE PTR TOETS[CS:$4B] {---crsr left---}
               OR    AH,BYTE PTR TOETS[CS:$50] {---crsr down---}
               AND   AH,$03
               JZ    @L_B001_5
               AND   AL,$7F
@L_B001_5:     TEST  BYTE PTR TOETS[CS:$1D],$03 {---ctrl---}
               JZ    @L_B001_3
               AND   AL,$BF
               JMP   @L_B001_3
@L_B001_9:     {---alternate keyboard---}
               MOV   AH,BYTE PTR TOETS[CS:$1D] {---ctrl---}
               OR    AH,BYTE PTR TOETS[CS:$38] {---alt---}
               AND   AH,$03
               JZ    @L_B001_10
               AND   AL,$7F
@L_B001_10:    TEST  BYTE PTR TOETS[CS:$2A],$03 {---left shift---}
               JZ    @L_B001_3
               AND   AL,$BF
@L_B001_3:     PUSH  BX
               MOV   BL,BYTE PTR [$B000]
               AND   BX,$000F
               CMP   BL,$09
               JA    @L_B001_6
               SHL   BX,3
               MOV   DI,BX
               CMP   BYTE PTR [CS:ALTKEYB],$00
               JNZ   @L_B001_8
               ADD   DI,OFFSET KEYSCAN
               JMP   @L_B001_7
@L_B001_8:     ADD   DI,OFFSET ALTKEYSCAN
@L_B001_7:     MOV   AH,11111110b
@L_B001_4:     MOV   BL,BYTE PTR [CS:DI]
               TEST  BYTE PTR TOETS[CS:BX],$03 {BH=0}
               JZ    @L_B001_2
               AND   AL,AH
@L_B001_2:     INC   DI
               STC
               RCL   AH,1
               CMP   AH,10111111b
               JNZ   @L_B001_4
@L_B001_6:     POP   BX
               MOV   BYTE PTR [$B001],AL
               ADD   WORD PTR [PCCYCLES],+156
               RETN
{---[B0h: bcs relative]-----------------------------------------------------}
@OPCODEB0:     MOV   AL,BH
               SHR   AL,1 {get carry}
               JNC   @OPCB0_1
               MOV   WORD PTR [INSTRCYCLES],$1303
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CBW
               ADD   SI,AX
               JMP   @NEXTOPC
@OPCB0_1:      MOV   WORD PTR [INSTRCYCLES],$0E02
               INC   SI
               JMP   @NEXTOPC
{---[B1h: lda (indirect),y]-------------------------------------------------}
@OPCODEB1:     MOV   WORD PTR [INSTRCYCLES],$1E05+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AX,WORD PTR [DI] {get address from atom memory}
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               JMP   @LOAD_A
{---[B2h: lda (indirect)]---------------------------------------------------}
@OPCODEB2:     MOV   WORD PTR [INSTRCYCLES],$1C05+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               JMP   @LOAD_A
{---[B4h: ldy zero page,x]--------------------------------------------------}
@OPCODEB4:     MOV   WORD PTR [INSTRCYCLES],$1104+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   DL,BYTE PTR [DI]
               OR    DL,DL
               JMP   @UPDATENZ
{---[B5h: lda zero page,x]--------------------------------------------------}
@OPCODEB5:     MOV   WORD PTR [INSTRCYCLES],$1104+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   BL,BYTE PTR [DI]
               OR    BL,BL
               JMP   @UPDATENZ
{---[B6h: ldx zero page,y]--------------------------------------------------}
@OPCODEB6:     MOV   WORD PTR [INSTRCYCLES],$1104+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,DL {add y-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   CL,BYTE PTR [DI]
               OR    CL,CL
               JMP   @UPDATENZ
{---[B8h: clv]--------------------------------------------------------------}
@OPCODEB8:     MOV   WORD PTR [INSTRCYCLES],$0802
               AND   BH,10111111b
               JMP   @NEXTOPC
{---[B9h: lda absolute,y]---------------------------------------------------}
@OPCODEB9:     MOV   WORD PTR [INSTRCYCLES],$1B04+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               JMP   @LOAD_A
{---[BAh: tsx implied]------------------------------------------------------}
@OPCODEBA:     MOV   WORD PTR [INSTRCYCLES],$0902+$0F00
               MOV   AX,BP
               MOV   CL,AL
               OR    AL,AL
               JMP   @UPDATENZ
{---[BBh: tyx implied]------------------------------------------------------}
@OPCODEBB:     MOV   WORD PTR [INSTRCYCLES],$0902+$0F00
               MOV   CL,DL
               OR    CL,CL
               JMP   @UPDATENZ
{---[BCh: ldy absolute,x]---------------------------------------------------}
@OPCODEBC:     MOV   WORD PTR [INSTRCYCLES],$1B04+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               MOV   DI,AX
               JMP   @LOAD_Y
{---[BDh: lda absolute,x]---------------------------------------------------}
@OPCODEBD:     MOV   WORD PTR [INSTRCYCLES],$1B04+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               MOV   DI,AX
               JMP   @LOAD_A
{---[BEh: ldx absolute,y]---------------------------------------------------}
@OPCODEBE:     MOV   WORD PTR [INSTRCYCLES],$1B04+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               JMP   @LOAD_X
{---[C0h: cpy immediate]----------------------------------------------------}
@OPCODEC0:     MOV   WORD PTR [INSTRCYCLES],$0D02+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CMP   DL,AL
               CMC
               JMP   @UPDATECNZ
{---[C1h: cmp (indirect,x)]-------------------------------------------------}
@OPCODEC1:     MOV   WORD PTR [INSTRCYCLES],$1606+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               CMP   BL,BYTE PTR [DI]
               CMC
               JMP   @UPDATECNZ
{---[C4h: cpy zero page]----------------------------------------------------}
@OPCODEC4:     MOV   WORD PTR [INSTRCYCLES],$1203+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               CMP   DL,BYTE PTR [DI]
               CMC
               JMP   @UPDATECNZ
{---[C5h: cmp zero page]----------------------------------------------------}
@OPCODEC5:     MOV   WORD PTR [INSTRCYCLES],$1203+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               CMP   BL,BYTE PTR [DI]
               CMC
               JMP   @UPDATECNZ
{---[C6h: dec zero page]----------------------------------------------------}
@OPCODEC6:     MOV   WORD PTR [INSTRCYCLES],$1105+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               DEC   BYTE PTR [DI]
               JMP   @UPDATENZ
{---[C8h: iny implied]------------------------------------------------------}
@OPCODEC8:     MOV   WORD PTR [INSTRCYCLES],$0802+$0F00
               INC   DL
               JMP   @UPDATENZ
{---[C9h: cmp immediate]----------------------------------------------------}
@OPCODEC9:     MOV   WORD PTR [INSTRCYCLES],$0D02+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CMP   BL,AL
               CMC
               JMP   @UPDATECNZ
{---[CAh: dex implied]------------------------------------------------------}
@OPCODECA:     MOV   WORD PTR [INSTRCYCLES],$0802+$0F00
               DEC   CL
               JMP   @UPDATENZ
{---[CCh: cpy absolute]-----------------------------------------------------}
@OPCODECC:     MOV   WORD PTR [INSTRCYCLES],$1004+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               MOV   DI,AX
               CMP   DL,BYTE PTR [DI]
               CMC
               JMP   @UPDATECNZ
{---[CDh: cmp absolute]-----------------------------------------------------}
@OPCODECD:     MOV   WORD PTR [INSTRCYCLES],$1204+$0F00
               MOV   DI,WORD PTR [SI]
               ADD   SI,+$02
               CMP   DI,FLIPFLOP
               JNZ   @OPCCD_1
               NOT   BYTE PTR [DI]
@OPCCD_1:      CMP   BL,BYTE PTR [DI]
               CMC
               JMP   @UPDATECNZ
{---[CEh: dec absolute]-----------------------------------------------------}
@OPCODECE:     MOV   WORD PTR [INSTRCYCLES],$1406+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
@DEC_ABS:      MOV   DI,AX
               AND   AH,$F0
               CMP   AH,$A0
               JAE   @OPCCE_1
               DEC   BYTE PTR [DI]
               CALL  UPDATEGRAPH
               JMP   @UPDATENZ
@OPCCE_1:      CMP   AH,$B0
               JZ    @OPCCE_2
               MOV   AL,BYTE PTR [DI]
               DEC   AL
               JMP   @UPDATENZ
@OPCCE_2:      CMP   DI,$B002
               JNZ   @OPCCE_3
               MOV   AH,AL
               AND   AH,$F0
               DEC   AL
               AND   AL,$0F
               OR    AL,AH
               MOV   BYTE PTR [$B002],AL
               JMP   @UPDATENZ
@OPCCE_3:      CMP   DI,SCHAKELBYTE
               JZ    @OPCCE_4
               DEC   BYTE PTR [DI]
               JMP   @UPDATENZ
@OPCCE_4:      CALL  SAVEZP90
               DEC   BYTE PTR [DI]
               PUSHF
               CALL  SETA000MEM
               POPF
               JMP   @UPDATENZ
{---[D0h: bne relative]-----------------------------------------------------}
@OPCODED0:     MOV   AL,BH
               SHR   AL,2 {get zero}
               JC    @OPCD0_1
               MOV   WORD PTR [INSTRCYCLES],$1303
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CBW
               ADD   SI,AX
               JMP   @NEXTOPC
@OPCD0_1:      MOV   WORD PTR [INSTRCYCLES],$0E02
               INC   SI
               JMP   @NEXTOPC
{---[D1h: cmp (indirect),y]-------------------------------------------------}
@OPCODED1:     MOV   WORD PTR [INSTRCYCLES],$1905+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AX,WORD PTR [DI] {get address from atom memory}
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               CMP   BL,BYTE PTR [DI]
               CMC
               JMP   @UPDATECNZ
{---[D2h: cmp (indirect)]---------------------------------------------------}
@OPCODED2:     MOV   WORD PTR [INSTRCYCLES],$1505+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               CMP   BL,BYTE PTR [DI]
               CMC
               JMP   @UPDATECNZ
{---[D5h: cmp zero page,x]--------------------------------------------------}
@OPCODED5:     MOV   WORD PTR [INSTRCYCLES],$1304+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               CMP   BL,BYTE PTR [DI]
               CMC
               JMP   @UPDATECNZ
{---[D6h: dec zero page,x]--------------------------------------------------}
@OPCODED6:     MOV   WORD PTR [INSTRCYCLES],$1206+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               DEC   BYTE PTR [DI]
               JMP   @UPDATENZ
{---[D8h: cld]--------------------------------------------------------------}
@OPCODED8:     MOV   WORD PTR [INSTRCYCLES],$0802
               AND   BH,11110111b
               JMP   @NEXTOPC
{---[D9h: cmp absolute,y]---------------------------------------------------}
@OPCODED9:     MOV   WORD PTR [INSTRCYCLES],$1304+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               CMP   BL,BYTE PTR [DI]
               CMC
               JMP   @UPDATECNZ
{---[DAh: phx implied]------------------------------------------------------}
@OPCODEDA:     MOV   WORD PTR [INSTRCYCLES],$0903
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],CL
               DEC   BP
               JMP   @NEXTOPC
{---[DDh: cmp absolute,x]---------------------------------------------------}
@OPCODEDD:     MOV   WORD PTR [INSTRCYCLES],$1304+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               MOV   DI,AX
               CMP   BL,BYTE PTR [DI]
               CMC
               JMP   @UPDATECNZ
{---[DEh: dec absolute,x]---------------------------------------------------}
@OPCODEDE:     MOV   WORD PTR [INSTRCYCLES],$1607+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               JMP   @DEC_ABS
{---[E0h: cpx immediate]----------------------------------------------------}
@OPCODEE0:     MOV   WORD PTR [INSTRCYCLES],$0D02+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CMP   CL,AL
               CMC
               JMP   @UPDATECNZ
{---[E1h: sbc (indirect,x)]-------------------------------------------------}
@OPCODEE1:     MOV   WORD PTR [INSTRCYCLES],$2006+$1400
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @SBC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               CMC
               SBB   BL,AL
               CMC
               JMP   @UPDATECVNZ
{---[E4h: cpx zero page]----------------------------------------------------}
@OPCODEE4:     MOV   WORD PTR [INSTRCYCLES],$1203+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               CMP   CL,BYTE PTR [DI]
               CMC
               JMP   @UPDATECNZ
{---[E5h: sbc zero page]----------------------------------------------------}
@OPCODEE5:     MOV   WORD PTR [INSTRCYCLES],$1C03+$1400
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @SBC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               CMC
               SBB   BL,AL
               CMC
               JMP   @UPDATECVNZ
{---[E6h: inc zero page]----------------------------------------------------}
@OPCODEE6:     MOV   WORD PTR [INSTRCYCLES],$1105+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               INC   BYTE PTR [DI]
               JMP   @UPDATENZ
{---[E8h: inx implied]------------------------------------------------------}
@OPCODEE8:     MOV   WORD PTR [INSTRCYCLES],$0802+$0F00
               INC   CL
               JMP   @UPDATENZ
{---[E9h: sbc immediate]----------------------------------------------------}
@OPCODEE9:
               MOV   WORD PTR [INSTRCYCLES],$1702+$1400
               MOV   AL,BYTE PTR [SI]
               INC   SI
               TEST  BH,00001000b
               JNZ   @SBC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               CMC
               SBB   BL,AL
               CMC
               JMP   @UPDATECVNZ
{---[EAh: nop implied]------------------------------------------------------}
@OPCODEEA:
@OPCODE03:
@OPCODE07:
@OPCODE0B:
@OPCODE0F:
@OPCODE13:
@OPCODE17:
@OPCODE1F:
@OPCODE23:
@OPCODE27:
@OPCODE2B:
@OPCODE2F:
@OPCODE33:
@OPCODE37:
@OPCODE3F:
@OPCODE43:
@OPCODE47:
@OPCODE4B:
@OPCODE4F:
@OPCODE53:
@OPCODE57:
@OPCODE5B:
@OPCODE5F:
@OPCODE63:
@OPCODE67:
@OPCODE6B:
@OPCODE6F:
@OPCODE73:
@OPCODE77:
@OPCODE7B:
@OPCODE7F:
@OPCODE83:
@OPCODE87:
@OPCODE8B:
@OPCODE8F:
@OPCODE93:
@OPCODE97:
@OPCODE9F:
@OPCODEA3:
@OPCODEA7:
@OPCODEAB:
@OPCODEAF:
@OPCODEB3:
@OPCODEB7:
@OPCODEBF:
@OPCODEC3:
@OPCODEC7:
@OPCODECB:
@OPCODECF:
@OPCODED3:
@OPCODED7:
@OPCODEDB:
@OPCODEDF:
@OPCODEE3:
@OPCODEE7:
@OPCODEEF:
@OPCODEF3:
@OPCODEF7:
@OPCODEFB:
@OPCODEFF:     MOV   WORD PTR [INSTRCYCLES],$0702
               JMP   @NEXTOPC
{---[EBh: swa implied]------------------------------------------------------}
@OPCODEEB:     MOV   WORD PTR [INSTRCYCLES],$0902+$0F00
               XCHG  BL,BYTE PTR [CS:ACCU_B]
               OR    BL,BL
               JMP   @UPDATENZ
{---[ECh: cpx absolute]-----------------------------------------------------}
@OPCODEEC:     MOV   WORD PTR [INSTRCYCLES],$1004+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               MOV   DI,AX
               CMP   CL,BYTE PTR [DI]
               CMC
               JMP   @UPDATECNZ
{---[EDh: sbc absolute]-----------------------------------------------------}
@OPCODEED:     MOV   WORD PTR [INSTRCYCLES],$1A04+$1400
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @SBC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               CMC
               SBB   BL,AL
               CMC
               JMP   @UPDATECVNZ
{---[EEh: inc absolute]-----------------------------------------------------}
@OPCODEEE:     MOV   WORD PTR [INSTRCYCLES],$1406+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
@INC_ABS:      MOV   DI,AX
               AND   AH,$F0
               CMP   AH,$A0
               JAE   @OPCEE_1
               INC   BYTE PTR [DI]
               CALL  UPDATEGRAPH
               JMP   @UPDATENZ
@OPCEE_1:      CMP   AH,$B0
               JZ    @OPCEE_2
               MOV   AL,BYTE PTR [DI]
               INC   AL
               JMP   @UPDATENZ
@OPCEE_2:      CMP   DI,$B002
               JNZ   @OPCEE_3
               MOV   AH,AL
               AND   AH,$F0
               INC   AL
               AND   AL,$0F
               OR    AL,AH
               MOV   BYTE PTR [$B002],AL
               JMP   @UPDATENZ
@OPCEE_3:      CMP   DI,SCHAKELBYTE
               JZ    @OPCEE_4
               INC   BYTE PTR [DI]
               JMP   @UPDATENZ
@OPCEE_4:      CALL  SAVEZP90
               INC   BYTE PTR [DI]
               PUSHF
               CALL  SETA000MEM
               POPF
               JMP   @UPDATENZ
{---[sbc_dec]---------------------------------------------------------------}
@SBC_DEC:      XCHG  AL,BL
               MOV   AH,BH
               SHR   AH,1 {get carry}
               CMC
               SBB   AL,BL
               JO    @SBCDEC1
               DAS
               CMC
               LAHF
               MOV   BL,AL
               AND   BH,10111111b {clear overflow}
               SAHF
               JMP   @UPDATECNZ
@SBCDEC1:      DAS
               CMC
               LAHF
               MOV   BL,AL
               OR    BH,01000000b {set overflow}
               SAHF
               JMP   @UPDATECNZ
{---[F0h: beq relative]-----------------------------------------------------}
@OPCODEF0:     MOV   AL,BH
               SHR   AL,2 {get zero}
               JNC   @OPCF0_1
               MOV   WORD PTR [INSTRCYCLES],$1303
               MOV   AL,BYTE PTR [SI]
               INC   SI
               CBW
               ADD   SI,AX
               JMP   @NEXTOPC
@OPCF0_1:      MOV   WORD PTR [INSTRCYCLES],$0E02
               INC   SI
               JMP   @NEXTOPC
{---[F1h: sbc (indirect),y]-------------------------------------------------}
@OPCODEF1:     MOV   WORD PTR [INSTRCYCLES],$2305+$1400
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   AX,WORD PTR [DI] {get address from atom memory}
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @SBC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               CMC
               SBB   BL,AL
               CMC
               JMP   @UPDATECVNZ
{---[F2h: sbc (indirect)]---------------------------------------------------}
@OPCODEF2:     MOV   WORD PTR [INSTRCYCLES],$1F05+$1400
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               MOV   DI,AX
               MOV   DI,WORD PTR [DI] {get address from atom memory}
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @SBC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               CMC
               SBB   BL,AL
               CMC
               JMP   @UPDATECVNZ
{---[F5h: sbc zero page,x]--------------------------------------------------}
@OPCODEF5:     MOV   WORD PTR [INSTRCYCLES],$1D04+$1400
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @SBC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               CMC
               SBB   BL,AL
               CMC
               JMP   @UPDATECVNZ
{---[F6h: inc zero page,x]--------------------------------------------------}
@OPCODEF6:     MOV   WORD PTR [INSTRCYCLES],$1206+$0F00
               MOV   AL,BYTE PTR [SI]
               INC   SI
               ADD   AL,CL {add x-reg}
               MOV   AH,$00
               MOV   DI,AX
               INC   BYTE PTR [DI]
               JMP   @UPDATENZ
{---[F8h: sed]--------------------------------------------------------------}
@OPCODEF8:     MOV   WORD PTR [INSTRCYCLES],$0802
               OR    BH,00001000b
               JMP   @NEXTOPC
{---[F9h: sbc absolute,y]---------------------------------------------------}
@OPCODEF9:     MOV   WORD PTR [INSTRCYCLES],$1D04+$1400
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,DL {add y-reg}
               ADC   AH,$00
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @SBC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               CMC
               SBB   BL,AL
               CMC
               JMP   @UPDATECVNZ
{---[FAh: plx implied]------------------------------------------------------}
@OPCODEFA:     MOV   WORD PTR [INSTRCYCLES],$0904+$0F00
               INC   BP
               AND   BP,$00FF
               MOV   CL,BYTE PTR [DS:BP+STACKBASE]
               OR    CL,CL
               JMP   @UPDATENZ
{---[FCh: jsr (absolute,x)]-------------------------------------------------}
@OPCODEFC:     MOV   WORD PTR [INSTRCYCLES],$1906
               MOV   AX,SI
               INC   AX
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],AH
               DEC   BP
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],AL
               DEC   BP
               MOV   AX,WORD PTR [SI]
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               MOV   SI,AX
               MOV   SI,WORD PTR [SI]
               JMP   @NEXTOPC
{---[FDh: sbc absolute,x]---------------------------------------------------}
@OPCODEFD:     MOV   WORD PTR [INSTRCYCLES],$1D04+$1400
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               MOV   DI,AX
               MOV   AL,BYTE PTR [DI] {get byte from atom memory}
               TEST  BH,00001000b
               JNZ   @SBC_DEC
               MOV   AH,BH
               SHR   AH,1 {get carry}
               CMC
               SBB   BL,AL
               CMC
               JMP   @UPDATECVNZ
{---[FEh: inc absolute,x]---------------------------------------------------}
@OPCODEFE:     MOV   WORD PTR [INSTRCYCLES],$1607+$0F00
               MOV   AX,WORD PTR [SI]
               ADD   SI,+$02
               ADD   AL,CL {add x-reg}
               ADC   AH,$00
               JMP   @INC_ABS
{---[updatenz]--------------------------------------------------------------}
@UPDATENZ:     LAHF
               AND   BH,01111101b
               MOV   AL,AH
               AND   AH,10000000b
               OR    BH,AH {negative}
               AND   AL,01000000b
               SHR   AL,5
               OR    BH,AL {zero}
               JMP   @NEXTOPC
{---[updatecnz]-------------------------------------------------------------}
@UPDATECNZ:    LAHF
               AND   BH,01111100b
               MOV   AL,AH
               AND   AH,10000001b
               OR    BH,AH {negative & carry}
               AND   AL,01000000b
               SHR   AL,5
               OR    BH,AL {zero}
               JMP   @NEXTOPC
{---[updatecvnz]------------------------------------------------------------}
@UPDATECVNZ:   LAHF
               JNO   @CVNZ_2
               OR    BH,01000000b {overflow}
               JMP   @CVNZ_1
@CVNZ_2:       AND   BH,10111111b {no overflow}
@CVNZ_1:       AND   BH,01111100b
               MOV   AL,AH
               AND   AH,10000001b
               OR    BH,AH {negative & carry}
               AND   AL,01000000b
               SHR   AL,5
               OR    BH,AL {zero}
              {JMP   @NEXTOPC}
{---[nextopc]---------------------------------------------------------------}
@NEXTOPC:      MOV   AL,BYTE PTR [INSTRCYCLES]
               MOV   AH,$00
               TEST  BYTE PTR [$B80B],00100000b
               JNZ   @DECRTIM5
               {---t2 one shot mode---}
               SUB   WORD PTR [$B808],AX
               JA    @DECRTIM5
               TEST  BYTE PTR [$B80D],00100000b
               JNZ   @DECRTIM5
               OR    BYTE PTR [$B80D],00100000b
               TEST  BYTE PTR [$B80E],00100000b
               JZ    @DECRTIM5
               OR    BYTE PTR [IRQ_NMI],$02
               JMP   @DECRTIM2
@DECRTIM5:     TEST  BYTE PTR [$B80B],01000000b
               JNZ   @DECRTIM1
               {---t1 one shot mode---}
               SUB   WORD PTR [$B804],AX
               JA    @DECRTIM2
               TEST  BYTE PTR [$B80D],01000000b
               JNZ   @DECRTIM2
               OR    BYTE PTR [$B80D],01000000b
               PUSH  AX
               MOV   AL,BYTE PTR [$B80B]
               AND   AL,BYTE PTR [$B802]
               POP   AX
               JNS   @DECRTIM3
               OR    BYTE PTR [$B800],10000000b
@DECRTIM3:     TEST  BYTE PTR [$B80E],01000000b
               JZ    @DECRTIM2
               OR    BYTE PTR [IRQ_NMI],$01
               JMP   @DECRTIM2
@DECRTIM1:     {---t1 free run mode---}
               SUB   WORD PTR [$B804],AX
               JA    @DECRTIM2
               PUSH  AX
               MOV   AX,WORD PTR [$B806]
               ADD   WORD PTR [$B804],AX
               OR    BYTE PTR [$B80D],01000000b
               MOV   AL,BYTE PTR [$B80B]
               AND   AL,BYTE PTR [$B802]
               POP   AX
               JNS   @DECRTIM4
               XOR   BYTE PTR [$B800],10000000b
@DECRTIM4:     TEST  BYTE PTR [$B80E],01000000b
               JZ    @DECRTIM2
               OR    BYTE PTR [IRQ_NMI],$01
@DECRTIM2:     CMP   BYTE PTR [IRQ_NMI],$00
               JZ    @DECRTIM6
               JNS   @IRQOCC
               {---nmi---}
               PUSH  AX
               INC   BYTE PTR [CS:NMIDELAY]
               MOV   AL,BYTE PTR [CS:NMIRESPONSE]
               CMP   BYTE PTR [CS:NMIDELAY],AL
               POP   AX
               JB    @DECRTIM6
               AND   BYTE PTR [IRQ_NMI],$7F
               MOV   BYTE PTR [CS:NMIDELAY],$00
               PUSH  AX
               MOV   AX,SI
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],AH
               DEC   BP
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],AL
               DEC   BP
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],BH
               DEC   BP
               OR    BH,00000100b {set interrupt disable flag}
               AND   BH,11110111b {clear decimal mode flag}
               CALL  FDC_NMI_HANDLER {call fdc}
               MOV   SI,WORD PTR [NMI_VECTOR]
               POP   AX
               JMP   @DECRTIM6
@IRQOCC:       {---irq---}
               TEST  BH,00000100b {test interrupt disable flag}
               JNZ   @DECRTIM6
               INC   BYTE PTR [CS:IRQDELAY]
               CMP   BYTE PTR [CS:IRQDELAY],$02
               JB    @DECRTIM6
               AND   BYTE PTR [IRQ_NMI],$FC
               MOV   BYTE PTR [CS:IRQDELAY],$00
               PUSH  AX
               MOV   AX,SI
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],AH
               DEC   BP
               AND   BP,$00FF
               MOV   BYTE PTR [DS:BP+STACKBASE],AL
               DEC   BP
               AND   BP,$00FF
               MOV   AL,BH
               AND   AL,11101111b {clear break flag}
               MOV   BYTE PTR [DS:BP+STACKBASE],AL
               DEC   BP
               OR    BH,00000100b {set interrupt disable flag}
               AND   BH,11110111b {clear decimal mode flag}
               MOV   SI,WORD PTR [IRQ_VECTOR]
               POP   AX
@DECRTIM6:     ADD   WORD PTR [AANTCYCLES],AX
               CMP   BYTE PTR [CS:CPUSPEEDMODE],$00
               JNZ   @NEXTOPC3
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR PCWAITTABLE[CS:DI]
               SUB   AX,+90-15
               SUB   AX,WORD PTR [PCCYCLES]
               JS    @NEXTOPC6
               JZ    @NEXTOPC3
               MOV   DI,WORD PTR [WACHTSCHULD]
               OR    DI,DI
               JNZ   @NEXTOPC5
@NEXTOPC8:     SHR   AX,1
               JZ    @NEXTOPC3
               NEG   AX
               ADD   AX,+4000+OFFSET SPEEDLOOP {4000=size of speedloop}
               CALL  AX
               JMP   @NEXTOPC3
@NEXTOPC5:     CMP   AX,DI
               JAE   @NEXTOPC7
               SUB   WORD PTR [WACHTSCHULD],AX
               JMP   @NEXTOPC3
@NEXTOPC7:     MOV   WORD PTR [WACHTSCHULD],$0000
               SUB   AX,DI
               JZ    @NEXTOPC3
               JMP   @NEXTOPC8
@NEXTOPC6:     NEG   AX
               ADD   WORD PTR [WACHTSCHULD],AX
@NEXTOPC3:     MOV   WORD PTR [PCCYCLES],$0000
               DEC   WORD PTR [COUNTER]
               JNZ   @DBGSWAPBYTE2
               MOV   WORD PTR [COUNTER],$3FFF
               MOV   AL,BYTE PTR TOETS[CS:$1D] {---ctrl+f12---}
               AND   AL,BYTE PTR TOETS[CS:$58]
               AND   AL,$03
               JZ    @NEXTOPC9
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  WRITEFOUTBUF
               JMP   @ENDOFEMUL
@NEXTOPC9:     MOV   AL,BYTE PTR TOETS[CS:$38] {---alt+f12---}
               AND   AL,BYTE PTR TOETS[CS:$58]
               AND   AL,$03
               JNZ   @BOOT
@NEXTOPC21:    MOV   AL,BYTE PTR TOETS[CS:$2A] {---shift+f12---}
               OR    AL,BYTE PTR TOETS[CS:$36]
               AND   AL,BYTE PTR TOETS[CS:$58]
               AND   AL,$03
               JZ    @NEXTOPC1
               PUSH  DS
               PUSH  ES
               PUSHA
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  WRITEFOUTBUF
               CALL  @VOLUMEOFF
               CALL  @CLRINT
               CALL  TEMPDOSPROMPT
               CALL  INITATOMGRAPH
               MOV   AX,$A000
               MOV   ES,AX
               CALL  @SETINT
               POPA
               POP   ES
               POP   DS
               CALL  @VOLUMEON
               CALL  SETBORDERCOL
               CALL  SETINTENSCOL
               CALL  REBUILDSCREEN
               JMP   @DBGSWAPBYTE1
@NEXTOPC1:     TEST  BYTE PTR TOETS[CS:$3E],$03 {---f4---}
               JZ    @NEXTOPC12
               CALL  DISABLEMOUSE
               CALL  SWAPKEYBOARD
@NEXTOPC13:    TEST  BYTE PTR TOETS[CS:$3E],$03 {---f4---}
               JNZ   @NEXTOPC13
               CALL  ENABLEMOUSE
               CALL  REBUILDSCREEN
               JMP   @DBGSWAPBYTE1
@NEXTOPC12:    TEST  BYTE PTR TOETS[CS:$3F],$03 {---f5---}
               JZ    @NEXTOPC14
               CALL  DISABLEMOUSE
               CALL  SWAPCPUSPEED
@NEXTOPC15:    TEST  BYTE PTR TOETS[CS:$3F],$03 {---f5---}
               JNZ   @NEXTOPC15
               CALL  ENABLEMOUSE
               CALL  REBUILDSCREEN
               JMP   @DBGSWAPBYTE1
@NEXTOPC14:    TEST  BYTE PTR TOETS[CS:$40],$03 {---f6---}
               JZ    @NEXTOPC2
               CALL  DISABLEMOUSE
               CALL  BOXINFO
@NEXTOPC17:    TEST  BYTE PTR TOETS[CS:$40],$03 {---f6---}
               JNZ   @NEXTOPC17
               CALL  ENABLEMOUSE
               CALL  REBUILDSCREEN
               JMP   @DBGSWAPBYTE1
@NEXTOPC2:     TEST  BYTE PTR TOETS[CS:$37],$03 {---print scrn---}
               JZ    @NEXTOPC18
               CALL  DISABLEMOUSE
               PUSH  DS
               PUSH  ES
               PUSHA
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  WRITEBMP
               POPA
               POP   ES
               POP   DS
@NEXTOPC19:    TEST  BYTE PTR TOETS[CS:$37],$03 {---print scrn---}
               JNZ   @NEXTOPC19
               CALL  ENABLEMOUSE
               JMP   @DBGSWAPBYTE1
@NEXTOPC18:    TEST  BYTE PTR TOETS[CS:$58],$03 {---f12---}
               JZ    @DBGSWAPBYTE1
@NEXTOPC4:     TEST  BYTE PTR TOETS[CS:$58],$03 {---f12---}
               JNZ   @NEXTOPC4
               {---breakkey---}
@BREAKKEY:     PUSH  DS
               PUSH  ES
               PUSHA
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  WRITEFOUTBUF
               POPA
               POP   ES
               MOV   BYTE PTR FOUTOPEN,$00
               POP   DS
               CALL  CLRDRIVETXT
               TEST  BYTE PTR [CS:BOX0ONBREAK],$FF
               JZ    @BRKKEY1
               CMP   BYTE PTR [SCHAKELBYTE],$00
               JZ    @BRKKEY1
               CALL  SAVEZP90
               MOV   BYTE PTR [SCHAKELBYTE],$00
               CALL  SETA000MEM
@BRKKEY1:      MOV   BYTE PTR [CS:AANTBOXRET],$00
               MOV   BYTE PTR [CS:ALTKEYB],$00
               MOV   BYTE PTR [CS:CPUSPEEDMODE],$00
               MOV   DS,WORD PTR [CS:ATOMSEG]
               MOV   BX,$2000
               MOV   BYTE PTR [CS:ACCU_B],$00
               SUB   CX,CX
               SUB   DX,DX
               MOV   WORD PTR [$B800],CX
               MOV   WORD PTR [$B802],CX
               MOV   BYTE PTR [$B80B],CL
               MOV   WORD PTR [$B80C],CX
               MOV   WORD PTR [$B80E],CX
               MOV   BYTE PTR [CS:T2L_L],CL
               MOV   BYTE PTR [$BFE2],$07
               MOV   BYTE PTR [CS:MOUSENR],$80 {mouse off}
               MOV   BYTE PTR [IRQ_NMI],CL
               MOV   BYTE PTR [CS:IRQDELAY],CL
               MOV   BYTE PTR [CS:NMIDELAY],CL
               MOV   WORD PTR [$0202],CX
               MOV   BYTE PTR [FLIPFLOP],$55
               TEST  BYTE PTR [CS:LEENDERTSROM],$FF
               JZ    @BRKKEY2
               {---initialize fp-rom: determine co-processor type---}
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE1],AL
               PUSH  AX
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE2],AL
               PUSH  AX
               MOV   SI,$DBA9
@INITFPROM1:   LODSB
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR @OPCODETABLE[DI]
               CALL  AX
               CMP   SI,$DBB1
               JNZ   @INITFPROM1
               POP   AX
               MOV   BYTE PTR [CS:@DBGSWAPBYTE2],AL
               POP   AX
               MOV   BYTE PTR [CS:@DBGSWAPBYTE1],AL
@BRKKEY2:      MOV   SI,WORD PTR [RES_VECTOR]
               JMP   @DBGSWAPBYTE2
@DBGSWAPBYTE1: {@DBGSWAPBYTE1 can be RETN byte-swapped}
               TEST  BYTE PTR TOETS[CS:$42],$03 {---f8---}
               JZ    @NEXTOPC20
               MOV   BYTE PTR @LASTMENU,$04
               CALL  @SHOWMENU
               JMP   @DBGSWAPBYTE2
@NEXTOPC20:    TEST  BYTE PTR TOETS[CS:$43],$03 {---f9---}
               JZ    @NEXTOPC10
               MOV   BYTE PTR @LASTMENU,$01
               CALL  @SHOWMENU
               JMP   @DBGSWAPBYTE2
@NEXTOPC10:    TEST  BYTE PTR TOETS[CS:$44],$03 {---f10---}
               JZ    @NEXTOPC16
               MOV   BYTE PTR @LASTMENU,$02
               CALL  @SHOWMENU
               JMP   @DBGSWAPBYTE2
@NEXTOPC16:    TEST  BYTE PTR TOETS[CS:$57],$03 {---f11---}
               JZ    @DBGSWAPBYTE2
               MOV   BYTE PTR @LASTMENU,$03
               CALL  @SHOWMENU
@DBGSWAPBYTE2: {@DBGSWAPBYTE2 can be RETN byte-swapped}
               MOV   AL,BYTE PTR [SI]
               INC   SI
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               JMP   WORD PTR @OPCODETABLE[DI]
{---[lda/ldx/ldy_via]-------------------------------------------------------}
@LDX_VIA:      CALL  @GETVIAREG
               MOV   CL,AL
               OR    AL,AL
               JMP   @UPDATENZ
@LDY_VIA:      CALL  @GETVIAREG
               MOV   DL,AL
               OR    AL,AL
               JMP   @UPDATENZ
@LDA_VIA:      CALL  @GETVIAREG
               MOV   BL,AL
               OR    AL,AL
               JMP   @UPDATENZ
@BIT_VIA:      CALL  @GETVIAREG
               JMP   @OPC2C_1
@GETVIAREG:    MOV   AL,BYTE PTR [DI]
               AND   DI,$000F
               SHL   DI,1
               MOV   DI,WORD PTR @VIAGETTABLE[DI]
               OR    DI,DI
               JZ    @GETVIA1
               JMP   DI
@GETVIA1:      RETN
@GETB801:      PUSH  DS
               PUSH  ES
               PUSHA
               MOV   AH,$02
               SUB   DX,DX
               INT   $17
               TEST  AH,00100000b {test: out of paper}
               JZ    @GETB801_1
@GETB801_2:    POPA
               POP   ES
               POP   DS
               {---printer out of paper---}
               MOV   AL,$FF
               XOR   AL,BYTE PTR [$B803]
               RETN
@GETB801_1:    TEST  AH,10010000b {test: not busy, selected}
               JZ    @GETB801_2
               POPA
               POP   ES
               POP   DS
               {---printer ready---}
               MOV   AL,$00
               RETN
@GETB804:      MOV   AL,BYTE PTR [$B804]
               AND   BYTE PTR [$B80D],10111111b
               RETN
@GETB808:      MOV   AL,BYTE PTR [$B808]
               AND   BYTE PTR [$B80D],11011111b
               RETN
@GETB80C:      PUSH  DS
               PUSH  ES
               PUSHA
               MOV   AH,$02
               SUB   DX,DX
               INT   $17
               TEST  AH,00001001b {test: I/O error, timeout}
               JZ    @GETB80C_1
               {---printer not ready---}
               POPA
               POP   ES
               POP   DS
               MOV   AL,$00
               MOV   BYTE PTR [$B80C],AL
               RETN
@GETB80C_1:    {---printer ready---}
               POPA
               POP   ES
               POP   DS
               MOV   AL,BYTE PTR [$B80C]
               RETN
@GETB80D:      MOV   AL,BYTE PTR [$B80D]
               AND   AL,01111111b
               TEST  AL,BYTE PTR [$B80E]
               JZ    @GETB80D_1
               OR    AL,10000000b
@GETB80D_1:    RETN
@GETB80E:      MOV   AL,BYTE PTR [$B80E]
               OR    AL,$80
               RETN
@GETB80F:      MOV   AL,BYTE PTR [$B800]
               RETN
{---[sta/stx/sty/stz_via]---------------------------------------------------}
@STZ_VIA:      MOV   AL,$00
               JMP   @STOREVIA1
@STX_VIA:      MOV   AL,CL
               JMP   @STOREVIA1
@STY_VIA:      MOV   AL,DL
               JMP   @STOREVIA1
@STA_VIA:      MOV   AL,BL
@STOREVIA1:    AND   DI,$000F
               SHL   DI,1
               JMP   WORD PTR @VIASTORETABLE[DI]
@STOREB801:    MOV   BYTE PTR [$B801],AL
               JMP   @NEXTOPC
@STOREB804:    MOV   BYTE PTR [$B806],AL
               JMP   @NEXTOPC
@STOREB805:    MOV   BYTE PTR [$B807],AL
               MOV   AH,AL
               MOV   AL,BYTE PTR [$B806]
               MOV   WORD PTR [$B804],AX
               AND   BYTE PTR [$B80D],10111111b
               MOV   AL,BYTE PTR [$B80B]
               AND   AL,BYTE PTR [$B802]
               JNS   @STB805_1
               AND   BYTE PTR [$B800],01111111b
@STB805_1:     MOV   AL,BYTE PTR [INSTRCYCLES]
               MOV   AH,$00
               JMP   @DECRTIM2
@STOREB808:    MOV   BYTE PTR [CS:T2L_L],AL
               JMP   @NEXTOPC
@STOREB809:    MOV   AH,AL
               MOV   AL,BYTE PTR [CS:T2L_L]
               MOV   WORD PTR [$B808],AX
               AND   BYTE PTR [$B80D],11011111b
               MOV   AL,BYTE PTR [INSTRCYCLES]
               MOV   AH,$00
               JMP   @DECRTIM2
@STOREB80C:    MOV   BYTE PTR [$B80C],AL
               AND   AL,$0F
               CMP   AL,$0C
               JNZ   @STB80C_1
               PUSH  DS
               PUSH  ES
               PUSHA
               MOV   AH,$00
               MOV   AL,BYTE PTR [$B801]
               SUB   DX,DX
               INT   $17
               POPA
               POP   ES
               POP   DS
@STB80C_1:     JMP   @NEXTOPC
@STOREB80D:    OR    BYTE PTR [$B80D],AL
               JMP   @NEXTOPC
@STOREB80E:    OR    AL,AL
               JS    @STB80E_1
               NOT   AL
               AND   BYTE PTR [$B80E],AL
               JMP   @NEXTOPC
@STB80E_1:     OR    BYTE PTR [$B80E],AL
               JMP   @NEXTOPC
@STOREB80F:    MOV   BYTE PTR [$B800],AL
               JMP   @NEXTOPC
@STOREB8xx:    SHR   DI,1
               MOV   BYTE PTR [$B800+DI],AL
               JMP   @NEXTOPC
{---[store_mousex]----------------------------------------------------------}
@STZ_MOUSEX:   MOV   AL,$00
               JMP   @STOREMX
@STA_MOUSEX:   MOV   AL,BL
               JMP   @STOREMX
@STX_MOUSEX:   MOV   AL,CL
               JMP   @STOREMX
@STY_MOUSEX:   MOV   AL,DL
@STOREMX:      CMP   AL,$F8
               JBE   @STMX1
               MOV   AL,$F8
@STMX1:        CLI
               PUSH  ES
               MOV   DI,$A000
               MOV   ES,DI
               PUSH  WORD PTR [CS:MOUSENR]
               CALL  CLRMOUSECURSOR
               MOV   BYTE PTR [$BFE0],AL
               JMP   @NEWPOSMOUSE
{---[store_mousey]----------------------------------------------------------}
@STZ_MOUSEY:   MOV   AL,$00
               JMP   @STOREMY
@STA_MOUSEY:   MOV   AL,BL
               JMP   @STOREMY
@STX_MOUSEY:   MOV   AL,CL
               JMP   @STOREMY
@STY_MOUSEY:   MOV   AL,DL
@STOREMY:      CMP   AL,$47
               JAE   @STMY1
               MOV   AL,$47
@STMY1:        CLI
               PUSH  ES
               MOV   DI,$A000
               MOV   ES,DI
               PUSH  WORD PTR [CS:MOUSENR]
               CALL  CLRMOUSECURSOR
               MOV   BYTE PTR [$BFE1],AL
@NEWPOSMOUSE:  MOV   ES,WORD PTR [CS:DATASEG]
               MOV   AL,BYTE PTR [$BFE0]
               MOV   BYTE PTR TEMPMOUSEDAT[ES:$00],AL
               MOV   AH,$00
               SHL   AX,1
               MOV   WORD PTR TEMPMOUSEDAT[ES:$03],AX
               MOV   AL,BYTE PTR [$BFE1]
               MOV   BYTE PTR TEMPMOUSEDAT[ES:$01],AL
               SUB   AL,+64
               MOV   AH,$00
               SHL   AX,1
               SUB   AX,+511
               NEG   AX
               MOV   WORD PTR TEMPMOUSEDAT[ES:$05],AX
               POP   AX {---[cs:mousenr]---}
               MOV   DI,$A000
               MOV   ES,DI
               CALL  SETMOUSECURSOR
               MOV   ES,WORD PTR [CS:DATASEG]
               PUSH  DS
               PUSHA
               MOV   AX,$0004
               MOV   CX,WORD PTR TEMPMOUSEDAT[ES:$03]
               MOV   DX,WORD PTR TEMPMOUSEDAT[ES:$05]
               INT   $33
               POPA
               POP   DS
               POP   ES
               STI
               JMP   @NEXTOPC
{---[store_mousenr]---------------------------------------------------------}
@STORE_MOUSENR:CLI
               CALL  CLRMOUSECURSOR
               CALL  SETMOUSECURSOR
               STI
               JMP   @NEXTOPC
{---[trace]-----------------------------------------------------------------}
@TRACE:        MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE1],AL
               PUSH  AX
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE2],AL
               PUSH  AX
               MOV   SI,WORD PTR [CS:PROGRAMCNT]
@TRACE1:       MOV   BP,WORD PTR [CS:STACKPOINTER]
               MOV   BL,BYTE PTR [CS:ACCUMULATOR]
               MOV   BH,BYTE PTR [CS:FLAGREGISTER]
               MOV   CL,BYTE PTR [CS:XREGISTER]
               MOV   DL,BYTE PTR [CS:YREGISTER]
               MOV   DS,WORD PTR [CS:ATOMSEG]
               LODSB
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR @OPCODETABLE[DI]
               CALL  AX
               MOV   WORD PTR [CS:PROGRAMCNT],SI
               MOV   WORD PTR [CS:STACKPOINTER],BP
               MOV   BYTE PTR [CS:ACCUMULATOR],BL
               MOV   BYTE PTR [CS:FLAGREGISTER],BH
               MOV   BYTE PTR [CS:XREGISTER],CL
               MOV   BYTE PTR [CS:YREGISTER],DL
               POP   AX
               MOV   BYTE PTR [CS:@DBGSWAPBYTE2],AL
               POP   AX
               MOV   BYTE PTR [CS:@DBGSWAPBYTE1],AL
               RETN
{---[step]------------------------------------------------------------------}
@STEP:         MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE1],AL
               PUSH  AX
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE2],AL
               PUSH  AX
               MOV   SI,WORD PTR [CS:PROGRAMCNT]
               MOV   BYTE PTR [CS:TRACEORSTEP],$00
               CMP   BYTE PTR[SI],$20 {---jsr---}
               JNZ   @TRACE1
               MOV   BYTE PTR [CS:TRACEORSTEP],$01
               MOV   AX,SI
               ADD   AX,$03
@STEP4:        MOV   WORD PTR @STEPENDOFS,AX
               PUSH  SI
               CALL  SETCOLORS
               POP   SI
               SUB   DI,DI
               MOV   CX,$4000
               MOV   AL,$FF
@STEP5:        STOSB
               STOSB
               STOSB
               INC   AL
               STOSB
               DEC   AL
               LOOP  @STEP5
               CALL  ENABLEMOUSE
               MOV   BP,WORD PTR [CS:STACKPOINTER]
               MOV   BL,BYTE PTR [CS:ACCUMULATOR]
               MOV   BH,BYTE PTR [CS:FLAGREGISTER]
               MOV   CL,BYTE PTR [CS:XREGISTER]
               MOV   DL,BYTE PTR [CS:YREGISTER]
               MOV   DS,WORD PTR [CS:ATOMSEG]
               CALL  SETBORDERCOL
               CALL  REBUILDSCREEN
@STEP1:        LODSB
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR @OPCODETABLE[DI]
               CALL  AX
               MOV   AL,BYTE PTR TOETS[CS:$3B] {---f1---}
               OR    AL,BYTE PTR TOETS[CS:$42] {---f8---}
               OR    AL,BYTE PTR TOETS[CS:$43] {---f9---}
               OR    AL,BYTE PTR TOETS[CS:$44] {---f10---}
               OR    AL,BYTE PTR TOETS[CS:$57] {---f11---}
               AND   AL,$03
               JNZ   @STEP3
               CMP   SI,WORD PTR @STEPENDOFS
               JNZ   @STEP1
               JMP   @STEP2
@STEP3:        MOV   AL,BYTE PTR TOETS[CS:$3B] {---f1---}
               OR    AL,BYTE PTR TOETS[CS:$42] {---f8---}
               OR    AL,BYTE PTR TOETS[CS:$43] {---f9---}
               OR    AL,BYTE PTR TOETS[CS:$44] {---f10---}
               OR    AL,BYTE PTR TOETS[CS:$57] {---f11---}
               AND   AL,$03
               JNZ   @STEP3
@STEP2:        MOV   WORD PTR [CS:PROGRAMCNT],SI
               MOV   WORD PTR [CS:STACKPOINTER],BP
               MOV   BYTE PTR [CS:ACCUMULATOR],BL
               MOV   BYTE PTR [CS:FLAGREGISTER],BH
               MOV   BYTE PTR [CS:XREGISTER],CL
               MOV   BYTE PTR [CS:YREGISTER],DL
               CALL  DISABLEMOUSE
               POP   AX
               MOV   BYTE PTR [CS:@DBGSWAPBYTE2],AL
               POP   AX
               MOV   BYTE PTR [CS:@DBGSWAPBYTE1],AL
               RETN
{---[untilcursor]-----------------------------------------------------------}
@UNTILCURSOR:  MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE1],AL
               PUSH  AX
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE2],AL
               PUSH  AX
@UNTILCURS1:   TEST  BYTE PTR TOETS[CS:$23],$03 {---h---}
               JNZ   @UNTILCURS1
               MOV   SI,WORD PTR [CS:PROGRAMCNT]
               MOV   AX,WORD PTR [CS:DISASPTR]
               JMP   @STEP4
{---[breakpoint]------------------------------------------------------------}
@BREAKPOINT:   PUSH  DS
               MOV   AX,CS
               MOV   DS,AX
               MOV   BYTE PTR CURSORX,+10
               MOV   BYTE PTR CURSORY,+6
               MOV   BL,$0C
               MOV   AL,01000101b
               CALL  PRINTCHAR
               MOV   CX,+18
               MOV   AL,01001100b
@BRKPNT2:      CALL  PRINTCHAR
               LOOP  @BRKPNT2
               MOV   AL,01001010b
               CALL  PRINTCHAR
               MOV   CL,+7
@BRKPNT3:      MOV   BYTE PTR CURSORX,+10
               MOV   BYTE PTR CURSORY,CL
               MOV   AL,01010101b
               CALL  PRINTCHAR
               MOV   BYTE PTR CURSORX,+29
               MOV   AL,01101010b
               CALL  PRINTCHAR
               INC   CL
               CMP   CL,+12
               JBE   @BRKPNT3
               MOV   BYTE PTR CURSORX,+10
               MOV   BYTE PTR CURSORY,+13
               MOV   AL,01010100b
               CALL  PRINTCHAR
               MOV   CX,+18
               MOV   AL,01001100b
@BRKPNT4:      CALL  PRINTCHAR
               LOOP  @BRKPNT4
               MOV   AL,01101000b
               CALL  PRINTCHAR
               CALL  PRINTSTRING
               DB    +11, +7,$0E,' ADD BRKP :       ',$00
               CALL  PRINTSTRING
               DB    +11, +8,$0E,'                  ',$00
               CALL  PRINTSTRING
               DB    +11, +9,$0E,' REMOVE   :       ',$00
               CALL  PRINTSTRING
               DB    +11,+10,$0E,' REMOVE   :       ',$00
               CALL  PRINTSTRING
               DB    +11,+11,$0E,' REMOVE   :       ',$00
               CALL  PRINTSTRING
               DB    +11,+12,$0E,' REMOVE   :       ',$00
               MOV   BYTE PTR CURSORX,+12
               MOV   BYTE PTR CURSORY,+7
               MOV   AL,'A' AND $3F
               MOV   BL,$0F
               CALL  PRINTCHAR
               MOV   CL,'1'
@BRKPNT5:      MOV   BYTE PTR CURSORX,+19
               MOV   AL,CL
               ADD   AL,+9-'1'
               MOV   BYTE PTR CURSORY,AL
               MOV   AL,CL
               CALL  PRINTCHAR
               INC   CL
               CMP   CL,'4'
               JBE   @BRKPNT5
               MOV   BYTE PTR CURSORX,+23
               MOV   BYTE PTR CURSORY,+7
               MOV   AL,BYTE PTR [CS:HEXTEKEN]
               MOV   BL,$09
               CALL  PRINTCHAR
               MOV   AX,WORD PTR [CS:DISASPTR]
               CALL  PRINTWORD
               MOV   BL,$0E
               SUB   CX,CX
@BRKPNT7:      MOV   AL,$01
               SHL   AL,CL
               TEST  BYTE PTR [CS:BRKPNTON],AL
               JZ    @BRKPNT8
               MOV   BYTE PTR CURSORX,+23
               MOV   AL,CL
               ADD   AL,+9
               MOV   BYTE PTR CURSORY,AL
               MOV   AL,BYTE PTR [CS:HEXTEKEN]
               MOV   BL,$0E
               CALL  PRINTCHAR
               MOV   SI,CX
               SHL   SI,1
               MOV   AX,WORD PTR BRKPNTS[CS:SI]
               CALL  PRINTWORD
@BRKPNT8:      INC   CL
               CMP   CL,$04
               JNZ   @BRKPNT7
@BRKPNT6:      TEST  BYTE PTR TOETS[CS:$30],$03 {---b---}
               JNZ   @BRKPNT6
@BRKPNT9:      TEST  BYTE PTR TOETS[CS:$1E],$03 {---a---}
               JZ    @BRKPNT10
               CMP   BYTE PTR [CS:BRKPNTON],$0F
               JAE   @BRKPNT10
               MOV   AX,WORD PTR [CS:DISASPTR]
               SUB   CX,CX
@BRKPNT11:     MOV   BL,$01
               SHL   BL,CL
               TEST  BYTE PTR [CS:BRKPNTON],BL
               JZ    @BRKPNT12
               MOV   SI,CX
               SHL   SI,1
               CMP   AX,WORD PTR BRKPNTS[CS:SI]
               JZ    @BRKPNT10
@BRKPNT12:     INC   CL
               CMP   CL,$04
               JNZ   @BRKPNT11
               SUB   CX,CX
@BRKPNT14:     MOV   BL,$01
               SHL   BL,CL
               TEST  BYTE PTR [CS:BRKPNTON],BL
               JZ    @BRKPNT13
               INC   CL
               JMP   @BRKPNT14
@BRKPNT13:     MOV   SI,CX
               SHL   SI,1
               MOV   WORD PTR BRKPNTS[CS:SI],AX
               OR    BYTE PTR [CS:BRKPNTON],BL
               JMP   @BRKPNT15
@BRKPNT10:     MOV   BX,$0002
@BRKPNT17:     TEST  BYTE PTR TOETS[CS:BX],$03 {---1/2/3/4---}
               JZ    @BRKPNT16
               MOV   CL,BL
               SUB   CL,$02
               MOV   AL,$01
               SHL   AL,CL
               TEST  BYTE PTR [CS:BRKPNTON],AL
               JZ    @BRKPNT16
               XOR   AL,$0F
               AND   BYTE PTR [CS:BRKPNTON],AL
               JMP   @BRKPNT15
@BRKPNT16:     INC   BL
               CMP   BL,$05
               JBE   @BRKPNT17
               TEST  BYTE PTR TOETS[CS:$01],$03 {---esc---}
               JZ    @BRKPNT9
@BRKPNT15:     MOV   AL,BYTE PTR TOETS[CS:$01] {---esc---}
               OR    AL,BYTE PTR TOETS[CS:$1E] {---a---}
               OR    AL,BYTE PTR TOETS[CS:$02] {---1---}
               OR    AL,BYTE PTR TOETS[CS:$03] {---2---}
               OR    AL,BYTE PTR TOETS[CS:$04] {---3---}
               OR    AL,BYTE PTR TOETS[CS:$05] {---4---}
               AND   AL,$03
               JNZ   @BRKPNT15
               POP   DS
               RETN
{---[showmenu]--------------------------------------------------------------}
@SHOWMENU:     MOV   WORD PTR [CS:PROGRAMCNT],SI
               MOV   WORD PTR [CS:STACKPOINTER],BP
               MOV   BYTE PTR [CS:ACCUMULATOR],BL
               MOV   BYTE PTR [CS:FLAGREGISTER],BH
               MOV   BYTE PTR [CS:XREGISTER],CL
               MOV   BYTE PTR [CS:YREGISTER],DL
               CALL  DISABLEMOUSE
               MOV   DX,$03C8
               MOV   AL,$07
               OUT   DX,AL
               INC   DX
               MOV   AL,$00
               OUT   DX,AL
               OUT   DX,AL
               OUT   DX,AL
               CALL  UPPERLINES
               MOV   AL,BYTE PTR @LASTMENU
               OR    AL,AL
               JNZ   @SHOWMENU4
               MOV   AL,$01
@SHOWMENU4:    CMP   AL,$01
               JNZ   @SHOWMENU5
               CALL  TAPE
               JMP   @SHOWMENU3
@SHOWMENU5:    CMP   AL,$02
               JNZ   @SHOWMENU6
               CALL  OPTIONS
               JMP   @SHOWMENU3
@SHOWMENU6:    CMP   AL,$03
               JNZ   @SHOWMENU8
               CALL  MONITOR
               JMP   @SHOWMENU3
@SHOWMENU8:    CALL  DISK
@SHOWMENU3:    OR    AL,AL
               JZ    @SHOWMENU1
               MOV   BYTE PTR @LASTMENU,AL
               JMP   @SHOWMENU4
@SHOWMENU1:    TEST  BYTE PTR TOETS[CS:$01],$03 {---escape---}
               JNZ   @SHOWMENU1
               CALL  SETCOLORS
               SUB   DI,DI
               MOV   CX,$4000
               MOV   AL,$FF
@SHOWMENU2:    STOSB
               STOSB
               STOSB
               INC   AL
               STOSB
               DEC   AL
               LOOP  @SHOWMENU2
               CALL  ENABLEMOUSE
               MOV   SI,WORD PTR [CS:PROGRAMCNT]
               MOV   BP,WORD PTR [CS:STACKPOINTER]
               MOV   BL,BYTE PTR [CS:ACCUMULATOR]
               MOV   BH,BYTE PTR [CS:FLAGREGISTER]
               MOV   CL,BYTE PTR [CS:XREGISTER]
               MOV   DL,BYTE PTR [CS:YREGISTER]
               MOV   DS,WORD PTR [CS:ATOMSEG]
               CALL  SETBORDERCOL
               CALL  SETINTENSCOL
               CALL  REBUILDSCREEN
               TEST  BYTE PTR [CS:BRKPNTON],$0F
               JNZ   @SHOWMENU7
               RETN
@SHOWMENU7:    {---execute until breakpoint or f1 (exit debug mode)---}
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE1],AL
               PUSH  AX
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE2],AL
               PUSH  AX
@BREAKP1:      LODSB
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR @OPCODETABLE[DI]
               CALL  AX
               MOV   AL,BYTE PTR TOETS[CS:$3B] {---f1---}
               OR    AL,BYTE PTR TOETS[CS:$42] {---f8---}
               OR    AL,BYTE PTR TOETS[CS:$43] {---f9---}
               OR    AL,BYTE PTR TOETS[CS:$44] {---f10---}
               OR    AL,BYTE PTR TOETS[CS:$57] {---f11---}
               AND   AL,$03
               JNZ   @BREAKP3
               MOV   AL,BYTE PTR [CS:BRKPNTON]
               TEST  AL,00000001b
               JZ    @BREAKP4
               CMP   SI,WORD PTR BRKPNTS[CS:$0000]
               JZ    @BREAKP2
@BREAKP4:      TEST  AL,00000010b
               JZ    @BREAKP5
               CMP   SI,WORD PTR BRKPNTS[CS:$0002]
               JZ    @BREAKP2
@BREAKP5:      TEST  AL,00000100b
               JZ    @BREAKP6
               CMP   SI,WORD PTR BRKPNTS[CS:$0004]
               JZ    @BREAKP2
@BREAKP6:      TEST  AL,00001000b
               JZ    @BREAKP1
               CMP   SI,WORD PTR BRKPNTS[CS:$0006]
               JZ    @BREAKP2
               JMP   @BREAKP1
@BREAKP3:      MOV   BYTE PTR @LASTMENU,$03
               TEST  BYTE PTR TOETS[CS:$43],$03
               JZ    @BREAKP9
               MOV   BYTE PTR @LASTMENU,$01
@BREAKP9:      TEST  BYTE PTR TOETS[CS:$44],$03
               JZ    @BREAKP7
               MOV   BYTE PTR @LASTMENU,$02
@BREAKP7:      MOV   AL,BYTE PTR TOETS[CS:$3B] {---f1---}
               OR    AL,BYTE PTR TOETS[CS:$42] {---f8---}
               OR    AL,BYTE PTR TOETS[CS:$43] {---f9---}
               OR    AL,BYTE PTR TOETS[CS:$44] {---f10---}
               OR    AL,BYTE PTR TOETS[CS:$57] {---f11---}
               AND   AL,$03
               JNZ   @BREAKP7
               JMP   @BREAKP8
@BREAKP2:      MOV   BYTE PTR @LASTMENU,$03
@BREAKP8:      MOV   WORD PTR [CS:DISASPTR],SI
               POP   AX
               MOV   BYTE PTR [CS:@DBGSWAPBYTE2],AL
               POP   AX
               MOV   BYTE PTR [CS:@DBGSWAPBYTE1],AL
               JMP   @SHOWMENU
{---[resetandload; commandline in 0100h preset (including 0Dh,0Ah)]---------}
@RESETANDLOAD: MOV   BYTE PTR [CS:AANTBOXRET],$00
               MOV   DS,WORD PTR [CS:ATOMSEG]
               CALL  SETBORDERCOL
               CALL  REBUILDSCREEN
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE1],AL
               PUSH  AX
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE2],AL
               PUSH  AX
               MOV   BYTE PTR [CS:AANTBOXRET],$00
               MOV   BX,$2000
               MOV   BYTE PTR [CS:ACCU_B],$00
               SUB   CX,CX
               SUB   DX,DX
               MOV   WORD PTR [$B800],CX
               MOV   WORD PTR [$B802],CX
               MOV   BYTE PTR [$B80B],CL
               MOV   WORD PTR [$B80C],CX
               MOV   WORD PTR [$B80E],CX
               MOV   BYTE PTR [CS:T2L_L],CL
               MOV   BYTE PTR [$BFE2],$07
               MOV   BYTE PTR [CS:MOUSENR],$80 {mouse off}
               MOV   BYTE PTR [IRQ_NMI],CL
               MOV   BYTE PTR [CS:IRQDELAY],CL
               MOV   BYTE PTR [CS:NMIDELAY],CL
               MOV   WORD PTR [$0202],CX
               MOV   SI,WORD PTR [RES_VECTOR]
@RESANDLOAD1:  LODSB
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR @OPCODETABLE[DI]
               CALL  AX
               CMP   SI,$C2D2
               JNZ   @RESANDLOAD1
               MOV   DI,$00FF
               MOV   AL,'>'
               XCHG  AL,BYTE PTR [DI]
               PUSH  AX
@RESANDLOAD4:  MOV   BL,BYTE PTR [DI]
               PUSH  DI
               MOV   SI,$FFEF
@RESANDLOAD2:  LODSB
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR @OPCODETABLE[DI]
               CALL  AX
               CMP   SI,$FFF2
               JNZ   @RESANDLOAD2
               POP   DI
               CMP   BL,$0A
               JZ    @RESANDLOAD3
               INC   DI
               JMP   @RESANDLOAD4
@RESANDLOAD3:  POP   AX
               MOV   BYTE PTR [$00FF],AL
               MOV   BYTE PTR [$0007],$00
               MOV   SI,$C2D5
               POP   AX
               MOV   BYTE PTR [CS:@DBGSWAPBYTE2],AL
               POP   AX
               MOV   BYTE PTR [CS:@DBGSWAPBYTE1],AL
               JMP   @DBGSWAPBYTE2
{---[boot]------------------------------------------------------------------}
@BOOT:         MOV   AL,BYTE PTR TOETS[CS:$38] {---alt+f12---}
               AND   AL,BYTE PTR TOETS[CS:$58]
               AND   AL,$03
               JNZ   @BOOT
               MOV   WORD PTR [$0100],'TS'
               MOV   WORD PTR [$0102],'RA'
               MOV   WORD PTR [$0104],'0T'
               MOV   WORD PTR [$0106],$0A0D
               JMP   @RESETANDLOAD
{---[setint]----------------------------------------------------------------}
@SETINT:       CLI
               PUSH  DS
               SUB   AX,AX
               MOV   DS,AX
               MOV   AX,WORD PTR [$0020]
               MOV   WORD PTR @ORGIRQVEC[CS:$0000],AX
               MOV   AX,WORD PTR [$0022]
               MOV   WORD PTR @ORGIRQVEC[CS:$0002],AX
               MOV   AX,OFFSET @IRQHANDLER
               MOV   WORD PTR [$0020],AX
               MOV   WORD PTR [$0022],CS
               MOV   AX,WORD PTR [$0024]
               MOV   WORD PTR @ORGKEYVEC[CS:$0000],AX
               MOV   AX,WORD PTR [$0026]
               MOV   WORD PTR @ORGKEYVEC[CS:$0002],AX
               MOV   AX,OFFSET @KEYHANDLER
               MOV   WORD PTR [$0024],AX
               MOV   WORD PTR [$0026],CS
               MOV   AX,WORD PTR [$006C]
               MOV   WORD PTR @ORGBRKVEC[CS:$0000],AX
               MOV   AX,WORD PTR [$006E]
               MOV   WORD PTR @ORGBRKVEC[CS:$0002],AX
               MOV   AX,OFFSET @BRKHANDLER
               MOV   WORD PTR [$006C],AX
               MOV   WORD PTR [$006E],CS
               MOV   AL,$36
               OUT   $43,AL
               MOV   AL,$00
               OUT   $40,AL
               OUT   $40,AL
               PUSH  ES
               MOV   AX,CS
               MOV   ES,AX
               MOV   DI,OFFSET TOETS
               MOV   CX,$0082
               MOV   AL,$00
               CLD
               REPZ
               STOSB
               SUB   AX,AX
               INT   $33
               CMP   AX,$FFFF
               JNZ   @SETINT1
               MOV   AX,$000C
               MOV   CX,$007F
               MOV   DX,OFFSET @MOUSEHANDLER
               PUSH  CS
               POP   ES
               INT   $33
               MOV   AX,$0007
               SUB   CX,CX
               MOV   DX,$01F0
               INT   $33
               MOV   AX,$0008
               MOV   CX,+128
               MOV   DX,+496
               INT   $33
               MOV   AX,$0004
               SUB   CX,CX
               MOV   DX,+128
               INT   $33
               MOV   DS,WORD PTR [CS:ATOMSEG]
               MOV   BYTE PTR [$BFE0],0
               MOV   BYTE PTR [$BFE1],+255
@SETINT1:      POP   ES
               STI
               POP   DS
               RETN
{---[clrint]----------------------------------------------------------------}
@CLRINT:       PUSH  DS
               CLI
               SUB   AX,AX
               MOV   DS,AX
               MOV   AX,WORD PTR @ORGIRQVEC[CS:$0000]
               MOV   WORD PTR [$0020],AX
               MOV   AX,WORD PTR @ORGIRQVEC[CS:$0002]
               MOV   WORD PTR [$0022],AX
               MOV   AX,WORD PTR @ORGKEYVEC[CS:$0000]
               MOV   WORD PTR [$0024],AX
               MOV   AX,WORD PTR @ORGKEYVEC[CS:$0002]
               MOV   WORD PTR [$0026],AX
               MOV   AX,WORD PTR @ORGBRKVEC[CS:$0000]
               MOV   WORD PTR [$006C],AX
               MOV   AX,WORD PTR @ORGBRKVEC[CS:$0002]
               MOV   WORD PTR [$006E],AX
               SUB   AX,AX
               INT   $33
               STI
               POP   DS
               RETN
{---[mousehandler]----------------------------------------------------------}
@MOUSEHANDLER: PUSH  DS
               PUSH  ES
               PUSHA
               MOV   SI,$A000
               MOV   ES,SI
               MOV   AH,BYTE PTR [CS:MOUSENR]
               TEST  AL,$01
               JZ    @MOUSEH1
               CALL  CLRMOUSECURSOR
@MOUSEH1:      MOV   DS,WORD PTR [CS:ATOMSEG]
               SHR   CX,1
               MOV   BYTE PTR [$BFE0],CL
               NEG   DX
               ADD   DX,+511
               SHR   DX,1
               ADD   DL,+64
               MOV   BYTE PTR [$BFE1],DL
               XOR   BL,$07
               MOV   BYTE PTR [$BFE2],BL
               TEST  AL,$01
               JZ    @MOUSEH2
               TEST  AH,$80
               JNZ   @MOUSEH2
               MOV   AL,BYTE PTR [CS:MOUSENR]
               AND   AL,$1F
               CALL  SETMOUSECURSOR
@MOUSEH2:      POPA
               POP   ES
               POP   DS
               RETF
{---[keyhandler]------------------------------------------------------------}
@KEYHANDLER:   PUSH  AX
               PUSH  DI
               IN    AL,$60
               MOV   AH,AL
               IN    AL,$61
               OR    AL,$80
               OUT   $61,AL
               AND   AL,$7F
               OUT   $61,AL
               MOV   AL,AH
               MOV   AH,$00
               OR    AL,AL
               JNS   @KEYHND6
               AND   AL,$7F
               MOV   DI,AX
               MOV   BYTE PTR TOETS[CS:DI],$00
               CMP   AL,$48
               JB    @KEYHND4
               JNZ   @KEYHND7
               AND   BYTE PTR TOETS[CS:$80],$FE
               JMP   @KEYHND4
@KEYHND7:      CMP   AL,$50
               JNZ   @KEYHND8
               AND   BYTE PTR TOETS[CS:$80],$FD
               JMP   @KEYHND4
@KEYHND8:      CMP   AL,$4B
               JNZ   @KEYHND9
               AND   BYTE PTR TOETS[CS:$81],$FE
               JMP   @KEYHND4
@KEYHND9:      CMP   AL,$4D
               JNZ   @KEYHND4
               AND   BYTE PTR TOETS[CS:$81],$FD
@KEYHND4:      MOV   AL,$20
               OUT   $20,AL
               POP   DI
               POP   AX
@BRKHANDLER:   IRET
@KEYHND6:      MOV   DI,AX
               MOV   BYTE PTR TOETS[CS:DI],$01
               CMP   AL,$48
               JB    @KEYHND4
               JNZ   @KEYHND10
               OR    BYTE PTR TOETS[CS:$80],$01
               JMP   @KEYHND4
@KEYHND10:     CMP   AL,$50
               JNZ   @KEYHND11
               OR    BYTE PTR TOETS[CS:$80],$02
               JMP   @KEYHND4
@KEYHND11:     CMP   AL,$4B
               JNZ   @KEYHND12
               OR    BYTE PTR TOETS[CS:$81],$01
               JMP   @KEYHND4
@KEYHND12:     CMP   AL,$4D
               JNZ   @KEYHND4
               OR    BYTE PTR TOETS[CS:$81],$02
               JMP   @KEYHND4
{---[irqhandler]------------------------------------------------------------}
@IRQHANDLER:   INC   BYTE PTR [CS:KEYRELEASETEL]
               DB    $2E,$FF,$2E
               DW    OFFSET @ORGIRQVEC
{---[loadfile]--------------------------------------------------------------}
@LOADFILE:     PUSH  DS
               PUSH  ES
               PUSH  BX
               PUSH  CX
               PUSH  DX
               PUSH  BP
               PUSH  CX {---offset loadtable---}
               PUSH  WORD PTR [CS:LASTATM] {---file pointer---}
               PUSH  CS {---segment exitcode---}
               PUSH  OFFSET @LOADCODE {---offset exitcode---}
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  LOAD
               MOV   AX,$A000
               MOV   ES,AX
               SUB   DI,DI
               MOV   CX,$4000
               MOV   AL,$FF
@LOADFILE4:    STOSB
               STOSB
               STOSB
               INC   AL
               STOSB
               DEC   AL
               LOOP  @LOADFILE4
               POP   BP
               POP   DX
               POP   CX
               POP   BX
               POP   ES
               POP   DS
               CALL  SETBORDERCOL
               CALL  REBUILDSCREEN
               MOV   AX,WORD PTR @LOADCODE
               TEST  AH,$80
               JZ    @LOADFILE1
               MOV   SI,$F9FD
               JMP   @NEXTOPC {---generate checksum error 6---}
@LOADFILE1:    TEST  AH,$40
               JNZ   @LOADFILE3
               {---load ok---}
               MOV   WORD PTR [CS:LASTATM],AX
@LOADFILE2:    TEST  BYTE PTR TOETS[CS:$1C],$FF {---enter---}
               JNZ   @LOADFILE2
               JMP   @OPCODE60 {---rts---}
@LOADFILE3:    {---frozen file---}
               AND   AH,$3F
               MOV   WORD PTR [CS:LASTATM],AX
               MOV   SI,WORD PTR [CS:PROGRAMCNT]
               MOV   BP,WORD PTR [CS:STACKPOINTER]
               MOV   BL,BYTE PTR [CS:ACCUMULATOR]
               MOV   BH,BYTE PTR [CS:FLAGREGISTER]
               MOV   CL,BYTE PTR [CS:XREGISTER]
               MOV   DL,BYTE PTR [CS:YREGISTER]
               JMP   @NEXTOPC
{---[savefile]--------------------------------------------------------------}
@SAVEFILE:     PUSH  DS
               PUSH  ES
               PUSH  BX
               PUSH  CX
               PUSH  DX
               PUSH  BP
               PUSH  CX {---offset savetable---}
               PUSH  WORD PTR [CS:LASTATM] {---file pointer---}
               PUSH  CS {---segment exitcode---}
               PUSH  OFFSET @SAVECODE {---offset exitcode---}
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  SAVE
               POP   BP
               POP   DX
               POP   CX
               POP   BX
               POP   ES
               POP   DS
               MOV   AX,WORD PTR @SAVECODE
               TEST  AH,$80
               JNZ   @SAVEFILE1
               {---save ok---}
               INC   WORD PTR [CS:LASTATM]
               JMP   @OPCODE60 {---rts---}
@SAVEFILE1:    MOV   SI,$F9FD
               JMP   @NEXTOPC {---generate checksum error 6---}
{---[getbyte]---------------------------------------------------------------}
@GETBYTE:      PUSH  DS
               PUSH  SI
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   SI,WORD PTR FINBUFPTR
               CMP   SI,WORD PTR FINSIZE
               JAE   @GETB1
               ADD   SI,WORD PTR FINBUFOFS
               INC   WORD PTR FINBUFPTR
               MOV   DS,WORD PTR FINBUFSEG
               MOV   BL,BYTE PTR [SI]
               JMP   @GETB2
@GETB1:        MOV   BL,$0D
@GETB2:        POP   SI
               POP   DS
               JMP   @OPCODE60
{---[putbyte]---------------------------------------------------------------}
@PUTBYTE:      PUSH  DS
               MOV   DS,WORD PTR [CS:DATASEG]
               TEST  BYTE PTR FOUTOPEN,$FF
               JNZ   @PUTB2
               POP   DS
               MOV   SI,$F9FD
               JMP   @NEXTOPC {---generate checksum error 6---}
@PUTB2:        PUSH  DI
               MOV   DI,WORD PTR FOUTBUFPTR
               ADD   DI,WORD PTR FOUTBUFOFS
               MOV   DS,WORD PTR FOUTBUFSEG
               MOV   BYTE PTR [DI],BL
               POP   DI
               MOV   DS,WORD PTR [CS:DATASEG]
               INC   WORD PTR FOUTBUFPTR
               CMP   WORD PTR FOUTBUFPTR,FOUTBUFSIZE
               JB    @PUTB1
               PUSH  ES
               PUSHA
               CALL  WRITEFOUTBUF
               POPA
               POP   ES
@PUTB1:        POP   DS
               JMP   @OPCODE60
{---[finfoutcmd (see also finfoutcmd preparation at @OPCODE28)]-------------}
@FINFOUTCMD:   PUSH  DS
               PUSH  ES
               PUSHA
               TEST  BH,$01 {test carry}
               JZ    @FINFOUT1
               {---fin---}
               PUSH  WORD PTR @FILENAMEOFS
               PUSH  WORD PTR [CS:LASTATM] {---file pointer---}
               PUSH  CS {---segment exitcode---}
               PUSH  OFFSET @LOADCODE {---offset exitcode---}
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  READFINBUF
               POPA
               POP   ES
               POP   DS
               MOV   AX,WORD PTR @LOADCODE
               TEST  AH,$80
               JZ    @FINFOUT5
               MOV   SI,$F9FD
               JMP   @NEXTOPC {---generate checksum error 6---}
@FINFOUT5:     MOV   WORD PTR [CS:LASTATM],AX
               MOV   BL,$0D {---return filehandle---}
               JMP   @OPCODE60
@FINFOUT1:     {---fout---}
               PUSH  DS
               PUSHA
               MOV   DS,WORD PTR [CS:DATASEG]
               CALL  WRITEFOUTBUF
               POPA
               POP   DS
               MOV   ES,WORD PTR [CS:DATASEG]
               MOV   SI,WORD PTR @FILENAMEOFS
               SUB   BX,BX
@FINFOUT4:     MOV   AL,BYTE PTR [SI+BX]
               CMP   AL,$0D
               JZ    @FINFOUT3
               MOV   BYTE PTR [ES:FOUTNAME+$01+BX],AL
               INC   BL
               CMP   BL,$10
               JB    @FINFOUT4
@FINFOUT3:     MOV   BYTE PTR [ES:FOUTNAME],BL
               OR    BL,BL
               JNZ   @FINFOUT2
               MOV   BYTE PTR [ES:FOUTNAME],$04
               MOV   WORD PTR [ES:FOUTNAME+$01],'IF'
               MOV   WORD PTR [ES:FOUTNAME+$03],'EL'
@FINFOUT2:     MOV   DS,WORD PTR [CS:DATASEG]
               SUB   BX,BX
@FINFOUT6:     MOV   AL,BYTE PTR TAPEIMAGENAME[BX]
               MOV   BYTE PTR IMAGEFOUTNAME[BX],AL
               INC   BL
               CMP   BL,$09
               JB    @FINFOUT6
               MOV   BYTE PTR FOUTOPEN,$01
               MOV   WORD PTR FOUTBUFPTR,$0000
               CALL  CREATEFOUT
               POPA
               POP   ES
               POP   DS
               MOV   BL,$0D {---return filehandle---}
               JMP   @OPCODE60
{---[tapecat]---------------------------------------------------------------}
@TAPECAT:      PUSH  ES
               PUSHA
               MOV   ES,WORD PTR [CS:DATASEG]
               CMP   BYTE PTR [ES:AANTALTAPEIMAGES],$00
               JZ    @CAT2
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE1],AL
               PUSH  AX
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE2],AL
               PUSH  ES
               PUSHA
               PUSH  WORD PTR [@STEPENDOFS]
               {---check rest of *cat command for searchstring---}
               MOV   BYTE PTR CATSEARCH[ES:$00],$00
               MOV   BX,DX
               DEC   BX
@CAT19:        INC   BX
               CMP   BYTE PTR [$0100+BX],' '
               JZ    @CAT19
               SUB   SI,SI
@CAT15:        MOV   AL,BYTE PTR [$0100+BX]
               CMP   AL,'"'
               JZ    @CAT17
               CMP   AL,$0D
               JZ    @CAT18
               MOV   BYTE PTR CATSEARCH[ES:SI],AL
               INC   SI
               CMP   SI,$0010
               JZ    @CAT23
@CAT17:        INC   BX
               CMP   AL,'*'
               JNZ   @CAT15
@CAT18:        MOV   BYTE PTR CATSEARCH[ES:SI],$00
@CAT23:        {---name of tape image---}
               MOV   AX,WORD PTR [CS:LASTTAPE]
               MOV   CX,STR8GROOTTE
               MUL   CX
               MOV   SI,AX
               MOV   BX,$0001
@CAT11:        MOV   AL,BYTE PTR TAPEIMAGES[ES:SI+BX]
               CMP   AL,$40
               JB    @CAT14
               ADD   AL,$20
               JMP   @CAT13
@CAT14:        ADD   AL,$60
@CAT13:        MOV   BYTE PTR [BX+$00EC],AL
               INC   BL
               CMP   BL,BYTE PTR TAPEIMAGES[ES:SI]
               JBE   @CAT11
               MOV   BYTE PTR [BX+$00EC],$0D
               MOV   AX,$A000
               MOV   ES,AX
               {---print name of tape image---}
               MOV   DL,$00 {y-reg=00h}
               MOV   SI,$FA4A
               MOV   WORD PTR @STEPENDOFS,$FA4D
@CAT10:        LODSB
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR @OPCODETABLE[DI]
               CALL  AX
               CMP   SI,WORD PTR @STEPENDOFS
               JNZ   @CAT10
               {---go to next line---}
               MOV   SI,$FA5D
               MOV   WORD PTR @STEPENDOFS,$FA60
@CAT12:        LODSB
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR @OPCODETABLE[DI]
               CALL  AX
               CMP   SI,WORD PTR @STEPENDOFS
               JNZ   @CAT12
               POP   WORD PTR [@STEPENDOFS]
               POPA
               POP   ES
               MOV   BYTE PTR [CS:@DBGSWAPBYTE2],AL
               POP   AX
               MOV   BYTE PTR [CS:@DBGSWAPBYTE1],AL
               {---contents of tape image---}
               SUB   DX,DX
               SUB   SI,SI
@CAT1:         CMP   DX,WORD PTR [ES:AANTALATOMFILES]
               JZ    @CAT2
               SUB   BX,BX
@CAT22:        MOV   AL,BYTE PTR CATSEARCH[ES:BX]
               CMP   AL,$00
               JZ    @CAT16
               CMP   AL,'*'
               JZ    @CAT16
               CMP   AL,BYTE PTR ATOMFILES[ES:SI+BX]
               JNZ   @CAT20
               INC   BL
               CMP   BL,$10
               JB    @CAT22
@CAT16:        {---name ok for searchstring---}
               SUB   BX,BX
@CAT4:         MOV   AL,BYTE PTR ATOMFILES[ES:SI+BX] {filename}
               OR    AL,AL
               JNZ   @CAT3
               MOV   AL,' '
@CAT3:         MOV   BYTE PTR [$00ED+BX],AL
               INC   BL
               CMP   BL,$10
               JB    @CAT4
               MOV   BYTE PTR [$00ED+BX],$0D
               MOV   AX,WORD PTR ATOMFILES[ES:SI+$0010] {strtaddr}
               MOV   WORD PTR [$00D4],AX
               MOV   AX,WORD PTR ATOMFILES[ES:SI+$0012] {execaddr}
               MOV   WORD PTR [$00D6],AX
               MOV   AX,WORD PTR ATOMFILES[ES:SI+$0014] {datasize}
               MOV   WORD PTR [$00D9],AX
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE1],AL
               PUSH  AX
               MOV   AL,$C3 {retn}
               XCHG  BYTE PTR [CS:@DBGSWAPBYTE2],AL
               PUSH  ES
               PUSHA
               PUSH  WORD PTR [@STEPENDOFS]
               MOV   AX,$A000
               MOV   ES,AX
               {---print filename, strtaddr and execaddr---}
               MOV   DL,$00 {y-reg=00h}
               MOV   SI,$FA4A
               MOV   WORD PTR @STEPENDOFS,$FA50
@CAT5:         LODSB
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR @OPCODETABLE[DI]
               CALL  AX
               CMP   SI,WORD PTR @STEPENDOFS
               JNZ   @CAT5
               {---print hi-byte of datasize---}
               MOV   SI,$F7FA
               MOV   WORD PTR @STEPENDOFS,$F7FD
               MOV   BL,[$00DA] {acc=hi-byte}
@CAT7:         LODSB
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR @OPCODETABLE[DI]
               CALL  AX
               CMP   SI,WORD PTR @STEPENDOFS
               JNZ   @CAT7
               {---print lo-byte of datasize---}
               MOV   SI,$F7FA
               MOV   WORD PTR @STEPENDOFS,$F7FD
               MOV   BL,[$00D9] {acc=lo-byte}
@CAT8:         LODSB
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR @OPCODETABLE[DI]
               CALL  AX
               CMP   SI,WORD PTR @STEPENDOFS
               JNZ   @CAT8
               {---go to next line---}
               MOV   SI,$FA5D
               MOV   WORD PTR @STEPENDOFS,$FA60
@CAT6:         LODSB
               MOV   AH,$00
               SHL   AX,1
               MOV   DI,AX
               MOV   AX,WORD PTR @OPCODETABLE[DI]
               CALL  AX
               CMP   SI,WORD PTR @STEPENDOFS
               JNZ   @CAT6
               POP   WORD PTR [@STEPENDOFS]
               POPA
               POP   ES
               MOV   BYTE PTR [CS:@DBGSWAPBYTE2],AL
               POP   AX
               MOV   BYTE PTR [CS:@DBGSWAPBYTE1],AL
@CAT20:        INC   DX
               ADD   SI,ATMRECGROOTTE
               MOV   AL,BYTE PTR TOETS[CS:$01] {---escape---}
               OR    AL,BYTE PTR TOETS[CS:$1D] {---ctrl---}
               AND   AL,$03
               JZ    @CAT1
@CAT9:         MOV   AL,BYTE PTR TOETS[CS:$01] {---escape---}
               OR    AL,BYTE PTR TOETS[CS:$1D] {---ctrl---}
               AND   AL,$03
               JNZ   @CAT9
@CAT2:         POPA
               POP   ES
               JMP   @OPCODE60
{---[volumeon]--------------------------------------------------------------}
@VOLUMEON:     CMP   BYTE PTR @SBAVAIL,$00
               JNZ   @VOLON1
               IN    AL,$61
               AND   AL,$FC
               OUT   $61,AL
               RETN
@VOLON1:       PUSH  DS
               PUSH  DX
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   DX,WORD PTR IOPORT
               ADD   DL,$0C
               MOV   AL,$D1
               CALL  OUTBYTE
               POP   DX
               POP   DS
               RETN
{---[volumeoff]-------------------------------------------------------------}
@VOLUMEOFF:    CMP   BYTE PTR @SBAVAIL,$00
               JNZ   @VOLOFF1
               IN    AL,$61
               AND   AL,$FC
               OUT   $61,AL
               RETN
@VOLOFF1:      PUSH  DS
               PUSH  DX
               MOV   DS,WORD PTR [CS:DATASEG]
               MOV   DX,WORD PTR IOPORT
               ADD   DL,$0C
               MOV   AL,$D3
               CALL  OUTBYTE
               POP   DX
               POP   DS
               RETN
{---[data]------------------------------------------------------------------}
@OPCODETABLE:  DW    OFFSET @OPCODE00
               DW    OFFSET @OPCODE01
               DW    OFFSET @OPCODE02
               DW    OFFSET @OPCODE03
               DW    OFFSET @OPCODE04
               DW    OFFSET @OPCODE05
               DW    OFFSET @OPCODE06
               DW    OFFSET @OPCODE07
               DW    OFFSET @OPCODE08
               DW    OFFSET @OPCODE09
               DW    OFFSET @OPCODE0A
               DW    OFFSET @OPCODE0B
               DW    OFFSET @OPCODE0C
               DW    OFFSET @OPCODE0D
               DW    OFFSET @OPCODE0E
               DW    OFFSET @OPCODE0F
               DW    OFFSET @OPCODE10
               DW    OFFSET @OPCODE11
               DW    OFFSET @OPCODE12
               DW    OFFSET @OPCODE13
               DW    OFFSET @OPCODE14
               DW    OFFSET @OPCODE15
               DW    OFFSET @OPCODE16
               DW    OFFSET @OPCODE17
               DW    OFFSET @OPCODE18
               DW    OFFSET @OPCODE19
               DW    OFFSET @OPCODE1A
               DW    OFFSET @OPCODE1B
               DW    OFFSET @OPCODE1C
               DW    OFFSET @OPCODE1D
               DW    OFFSET @OPCODE1E
               DW    OFFSET @OPCODE1F
               DW    OFFSET @OPCODE20
               DW    OFFSET @OPCODE21
               DW    OFFSET @OPCODE22
               DW    OFFSET @OPCODE23
               DW    OFFSET @OPCODE24
               DW    OFFSET @OPCODE25
               DW    OFFSET @OPCODE26
               DW    OFFSET @OPCODE27
               DW    OFFSET @OPCODE28
               DW    OFFSET @OPCODE29
               DW    OFFSET @OPCODE2A
               DW    OFFSET @OPCODE2B
               DW    OFFSET @OPCODE2C
               DW    OFFSET @OPCODE2D
               DW    OFFSET @OPCODE2E
               DW    OFFSET @OPCODE2F
               DW    OFFSET @OPCODE30
               DW    OFFSET @OPCODE31
               DW    OFFSET @OPCODE32
               DW    OFFSET @OPCODE33
               DW    OFFSET @OPCODE34
               DW    OFFSET @OPCODE35
               DW    OFFSET @OPCODE36
               DW    OFFSET @OPCODE37
               DW    OFFSET @OPCODE38
               DW    OFFSET @OPCODE39
               DW    OFFSET @OPCODE3A
               DW    OFFSET @OPCODE3B
               DW    OFFSET @OPCODE3C
               DW    OFFSET @OPCODE3D
               DW    OFFSET @OPCODE3E
               DW    OFFSET @OPCODE3F
               DW    OFFSET @OPCODE40
               DW    OFFSET @OPCODE41
               DW    OFFSET @OPCODE42
               DW    OFFSET @OPCODE43
               DW    OFFSET @OPCODE44
               DW    OFFSET @OPCODE45
               DW    OFFSET @OPCODE46
               DW    OFFSET @OPCODE47
               DW    OFFSET @OPCODE48
               DW    OFFSET @OPCODE49
               DW    OFFSET @OPCODE4A
               DW    OFFSET @OPCODE4B
               DW    OFFSET @OPCODE4C
               DW    OFFSET @OPCODE4D
               DW    OFFSET @OPCODE4E
               DW    OFFSET @OPCODE4F
               DW    OFFSET @OPCODE50
               DW    OFFSET @OPCODE51
               DW    OFFSET @OPCODE52
               DW    OFFSET @OPCODE53
               DW    OFFSET @OPCODE54
               DW    OFFSET @OPCODE55
               DW    OFFSET @OPCODE56
               DW    OFFSET @OPCODE57
               DW    OFFSET @OPCODE58
               DW    OFFSET @OPCODE59
               DW    OFFSET @OPCODE5A
               DW    OFFSET @OPCODE5B
               DW    OFFSET @OPCODE5C
               DW    OFFSET @OPCODE5D
               DW    OFFSET @OPCODE5E
               DW    OFFSET @OPCODE5F
               DW    OFFSET @OPCODE60
               DW    OFFSET @OPCODE61
               DW    OFFSET @OPCODE62
               DW    OFFSET @OPCODE63
               DW    OFFSET @OPCODE64
               DW    OFFSET @OPCODE65
               DW    OFFSET @OPCODE66
               DW    OFFSET @OPCODE67
               DW    OFFSET @OPCODE68
               DW    OFFSET @OPCODE69
               DW    OFFSET @OPCODE6A
               DW    OFFSET @OPCODE6B
               DW    OFFSET @OPCODE6C
               DW    OFFSET @OPCODE6D
               DW    OFFSET @OPCODE6E
               DW    OFFSET @OPCODE6F
               DW    OFFSET @OPCODE70
               DW    OFFSET @OPCODE71
               DW    OFFSET @OPCODE72
               DW    OFFSET @OPCODE73
               DW    OFFSET @OPCODE74
               DW    OFFSET @OPCODE75
               DW    OFFSET @OPCODE76
               DW    OFFSET @OPCODE77
               DW    OFFSET @OPCODE78
               DW    OFFSET @OPCODE79
               DW    OFFSET @OPCODE7A
               DW    OFFSET @OPCODE7B
               DW    OFFSET @OPCODE7C
               DW    OFFSET @OPCODE7D
               DW    OFFSET @OPCODE7E
               DW    OFFSET @OPCODE7F
               DW    OFFSET @OPCODE80
               DW    OFFSET @OPCODE81
               DW    OFFSET @OPCODE82
               DW    OFFSET @OPCODE83
               DW    OFFSET @OPCODE84
               DW    OFFSET @OPCODE85
               DW    OFFSET @OPCODE86
               DW    OFFSET @OPCODE87
               DW    OFFSET @OPCODE88
               DW    OFFSET @OPCODE89
               DW    OFFSET @OPCODE8A
               DW    OFFSET @OPCODE8B
               DW    OFFSET @OPCODE8C
               DW    OFFSET @OPCODE8D
               DW    OFFSET @OPCODE8E
               DW    OFFSET @OPCODE8F
               DW    OFFSET @OPCODE90
               DW    OFFSET @OPCODE91
               DW    OFFSET @OPCODE92
               DW    OFFSET @OPCODE93
               DW    OFFSET @OPCODE94
               DW    OFFSET @OPCODE95
               DW    OFFSET @OPCODE96
               DW    OFFSET @OPCODE97
               DW    OFFSET @OPCODE98
               DW    OFFSET @OPCODE99
               DW    OFFSET @OPCODE9A
               DW    OFFSET @OPCODE9B
               DW    OFFSET @OPCODE9C
               DW    OFFSET @OPCODE9D
               DW    OFFSET @OPCODE9E
               DW    OFFSET @OPCODE9F
               DW    OFFSET @OPCODEA0
               DW    OFFSET @OPCODEA1
               DW    OFFSET @OPCODEA2
               DW    OFFSET @OPCODEA3
               DW    OFFSET @OPCODEA4
               DW    OFFSET @OPCODEA5
               DW    OFFSET @OPCODEA6
               DW    OFFSET @OPCODEA7
               DW    OFFSET @OPCODEA8
               DW    OFFSET @OPCODEA9
               DW    OFFSET @OPCODEAA
               DW    OFFSET @OPCODEAB
               DW    OFFSET @OPCODEAC
               DW    OFFSET @OPCODEAD
               DW    OFFSET @OPCODEAE
               DW    OFFSET @OPCODEAF
               DW    OFFSET @OPCODEB0
               DW    OFFSET @OPCODEB1
               DW    OFFSET @OPCODEB2
               DW    OFFSET @OPCODEB3
               DW    OFFSET @OPCODEB4
               DW    OFFSET @OPCODEB5
               DW    OFFSET @OPCODEB6
               DW    OFFSET @OPCODEB7
               DW    OFFSET @OPCODEB8
               DW    OFFSET @OPCODEB9
               DW    OFFSET @OPCODEBA
               DW    OFFSET @OPCODEBB
               DW    OFFSET @OPCODEBC
               DW    OFFSET @OPCODEBD
               DW    OFFSET @OPCODEBE
               DW    OFFSET @OPCODEBF
               DW    OFFSET @OPCODEC0
               DW    OFFSET @OPCODEC1
               DW    OFFSET @OPCODEC2
               DW    OFFSET @OPCODEC3
               DW    OFFSET @OPCODEC4
               DW    OFFSET @OPCODEC5
               DW    OFFSET @OPCODEC6
               DW    OFFSET @OPCODEC7
               DW    OFFSET @OPCODEC8
               DW    OFFSET @OPCODEC9
               DW    OFFSET @OPCODECA
               DW    OFFSET @OPCODECB
               DW    OFFSET @OPCODECC
               DW    OFFSET @OPCODECD
               DW    OFFSET @OPCODECE
               DW    OFFSET @OPCODECF
               DW    OFFSET @OPCODED0
               DW    OFFSET @OPCODED1
               DW    OFFSET @OPCODED2
               DW    OFFSET @OPCODED3
               DW    OFFSET @OPCODED4
               DW    OFFSET @OPCODED5
               DW    OFFSET @OPCODED6
               DW    OFFSET @OPCODED7
               DW    OFFSET @OPCODED8
               DW    OFFSET @OPCODED9
               DW    OFFSET @OPCODEDA
               DW    OFFSET @OPCODEDB
               DW    OFFSET @OPCODEDC
               DW    OFFSET @OPCODEDD
               DW    OFFSET @OPCODEDE
               DW    OFFSET @OPCODEDF
               DW    OFFSET @OPCODEE0
               DW    OFFSET @OPCODEE1
               DW    OFFSET @OPCODEE2
               DW    OFFSET @OPCODEE3
               DW    OFFSET @OPCODEE4
               DW    OFFSET @OPCODEE5
               DW    OFFSET @OPCODEE6
               DW    OFFSET @OPCODEE7
               DW    OFFSET @OPCODEE8
               DW    OFFSET @OPCODEE9
               DW    OFFSET @OPCODEEA
               DW    OFFSET @OPCODEEB
               DW    OFFSET @OPCODEEC
               DW    OFFSET @OPCODEED
               DW    OFFSET @OPCODEEE
               DW    OFFSET @OPCODEEF
               DW    OFFSET @OPCODEF0
               DW    OFFSET @OPCODEF1
               DW    OFFSET @OPCODEF2
               DW    OFFSET @OPCODEF3
               DW    OFFSET @OPCODEF4
               DW    OFFSET @OPCODEF5
               DW    OFFSET @OPCODEF6
               DW    OFFSET @OPCODEF7
               DW    OFFSET @OPCODEF8
               DW    OFFSET @OPCODEF9
               DW    OFFSET @OPCODEFA
               DW    OFFSET @OPCODEFB
               DW    OFFSET @OPCODEFC
               DW    OFFSET @OPCODEFD
               DW    OFFSET @OPCODEFE
               DW    OFFSET @OPCODEFF
@VIASTORETABLE:DW    OFFSET @STOREB8xx
               DW    OFFSET @STOREB801
               DW    OFFSET @STOREB8xx
               DW    OFFSET @STOREB8xx
               DW    OFFSET @STOREB804
               DW    OFFSET @STOREB805
               DW    OFFSET @STOREB8xx
               DW    OFFSET @STOREB8xx
               DW    OFFSET @STOREB808
               DW    OFFSET @STOREB809
               DW    OFFSET @NEXTOPC
               DW    OFFSET @STOREB8xx
               DW    OFFSET @STOREB80C
               DW    OFFSET @STOREB80D
               DW    OFFSET @STOREB80E
               DW    OFFSET @STOREB80F
@VIAGETTABLE:  DW    $0000
               DW    OFFSET @GETB801
               DW    $0000
               DW    $0000
               DW    OFFSET @GETB804
               DW    $0000
               DW    $0000
               DW    $0000
               DW    OFFSET @GETB808
               DW    $0000
               DW    $0000
               DW    $0000
               DW    OFFSET @GETB80C
               DW    OFFSET @GETB80D
               DW    OFFSET @GETB80E
               DW    OFFSET @GETB80F
@ORGIRQVEC:    DD    $00000000
@ORGKEYVEC:    DD    $00000000
@ORGBRKVEC:    DD    $00000000
@PCSP:         DW    $0000
@SBAVAIL:      DB    $00
@STEPENDOFS:   DW    $0000
@LASTMENU:     DB    $00
@LOADCODE:     DW    $0000
@SAVECODE:     DW    $0000
@SCHAKELSTART: DB    $00
@FILENAMEOFS:  DW    $0000
@ENDOFPRG:
END;
FOR I := 0 TO 3 DO
  IF DISKETTENAMES[I] <> '' THEN CLOSE_DISK_IMAGE (I);
END.
{===========================================================================
BL = A
CL = X
DL = Y
BH flags  bit value  description                  pc-bit
           7  (80h)  N negative   1=NEG             7
           6  (40h)  V overflow   1=OVFL
           5  (20h)  -
           4  (10h)  B break
           3  (08h)  D decimal    1=DEC
           2  (04h)  I interrupt  1=DISABLE
           1  (02h)  Z zero       1=RESULT ZERO     6
           0  (01h)  C carry      1=TRUE            0
DS = segment of atom memory
SI = PC
BP = stackpointer (only lower 8 bits valid)
----------------------------------------------------------------------------
Memory heap requirements (for $m directive at top of code):
Atom memory              FFF8h
Extension boxes & data  101F0h
FIN buffer               FFF8h
FOUT buffer              1000h
Flt.Point PC buffer      0900h
Temporary buffers       10FF8h  (maximum wanted)
                        ------+
                        42AD8h = 273,112 bytes minimum required.
terug.gif