Guida all'assembler



Partiamo con il codice del programma
      ;segmento base  9:0000
      ;00,08,04,00    segmento impostazioni
      ;00,08,04,80    segmento codice
      ;00,01,00,00    elenco compila
      ;4:0000         elenco compila
      ;4:0000         definizioni di assembler
      ;5:0000         definizione del testo
      ;5:0000         codice compilato
      ;6:0000         codifica del salto
      ;7:0000         etichette di salto
      ;10:0000        buffer di compila
      jmp 0000
      *00           ;0003 fondo riga
      *54 02 00 00  ;0004 orizzontale video
      *3d 02 00 00  ;0008 verticale video
      *00 00        ;000c riduzione del video
      *00 00        ;000e impaginazione sulla x
      *00 00        ;0010 impaginazione sulla y
      *00 00 40 00  ;0012 memoria grafica
      *00 00 00 00  ;0016 primo punto
      *00 00 00 00  ;001a numero punti della pagina
      *00 00
      *00 00 00 00  ;0020 dimensione del testo
      *00 00 00 00  ;0024 numero da convertire
      *00 00 06 00  ;0028 fondo codifica del salto
      *00000000
      *00000000000000000000000000000000  ;0030 numeri istruzione
      *00000000000000000000000000000000
      *00000000000000000000000000000000  ;0050 testo istruzione
      *00000000000000000000000000000000
:0010 push ecx      ;calcola i punti della pagina***********
      push edx
      mov eax,[00090004]
      mov ecx,[00090008]
      mul ecx
      shr eax,02
      mov [0009001A],eax
      mov ax,[00010218]
      sub ax,[00090004]
      mov [0009000C],ax  ;riduzione del video
      mov eax,[00090004]
      mov cx,[00050006]
      mul ecx
      mov [00090020],eax ;dimensione del testo
      pop edx
      pop ecx
      ret
:0011 push edi      ;cancella la pagina********************
      push ecx
      mov eax,[00100010]
      mov edi,[00090012]
      mov ecx,[0009001A]
      repz
      stosd
      pop ecx
      pop edi
      ret
:0012 push bx     ;disegna il video****************
      push cx
      push dx
      push esi
      push edi
      mov esi,[00090012] ;primo punto
      lea edi,000A0000
      cli
      mov ax,0004
      mov dx,03DE
      out dx,ax          ;imposta la pagina
      sti
      mov bx,0004
      mov cx,[00090008]  ;ciclo in verticale
:0016 push cx
      mov cx,[00090004]  ;ciclo in orizzontale
      shr cx,02
:0014 mov eax,[esi]
      mov [edi],eax
      add esi,00000004
      add di,0004
      jnz 0013
      cli
      inc bh
      mov ax,bx
      out dx,ax          ;cambia pagina
      sti
:0013 loop 0014
      add di,[0009000C]
      ja 0015
      cli
      inc bh
      mov ax,bx
      out dx,ax         ;cambia pagina
      sti
:0015 pop cx
      loop 0016
      pop edi
      pop esi
      pop dx
      pop cx
      pop bx
      ret
:0017 push esi      ;disegna i caratteri******************
      push edi
      push ecx
      push edx
      mov dh,[0010001A]  ;colore del carattere
:001a push esi           ;inizio ciclo
:001f mov eax,00050000
      mov al,[edi]
      cmp al,1C          ;ritorno a capo
      jnz 0018
      pop esi
      cmp edi,[00010208] ;fondo archivio
      jz 0019
      cmp dl,[00090010]  ;fondo pagina
      jz 0019
      add esi,[00090020] ;prossima riga
      inc edi
      inc dl
      jmp 001A
:0018 mov ch,[0005000A]  ;disegna il carattere
      mul ch
      mov ebx,eax        ;maschera
      push esi
      mov ah,00
      mov cx,[00050006]  ;ciclo in verticale
:001e push esi
      push cx
      mov cx,[00050004]  ;ciclo in orizzontale
:001d cmp ah,00
      jnz 001B
      mov ah,80
      mov al,[ebx]
      inc bx
:001b test al,ah
      jz 001C
      mov [esi],dh
:001c inc esi
      shr ah,01
      loop 001D
      pop cx
      pop esi
      add esi,[00090004]
      loop 001E
      pop esi            ;ciclo sulla riga
      xor ecx,ecx
      mov cx,[00050004]
      add esi,ecx
      inc edi
      jmp 001F
:0019 pop edx
      pop ecx
      pop edi
      pop esi
      ret
:0020 push esi    ;disegna una croce***************
      mov cx,0008
:0021 inc esi
      xor b[esi],04
      loop 0021
      pop esi
      cmp dh,01
      jz 0022
      push esi
      mov cx,0008
:0023 dec esi
      xor b[esi],04
      loop 0023
      pop esi
:0022 push esi
      mov cx,0008
:0024 add esi,[00090004]
      xor b[esi],04
      loop 0024
      pop esi
      push esi
      mov cx,0008
:0025 sub esi,[00090004]
      xor b[esi],04
      loop 0025
      pop esi
      ret
:004f push cx    ;imposta la porta 64*******************
      xor cx,cx
:0054 in al,64
      jmp 0050
:0050 jmp 0051
:0051 jmp 0052
:0052 jmp 0053
:0053 test al,02
      loopnz 0054
      pop cx
      ret
:0060 push edi   ;cancella i caratteri******************
      push ecx
      push dx
      mov esi,[00090016] ;primo punto
      xor ecx,ecx
      mov cl,dl
      cmp cx,0000
      jz 0062
:0061 add esi,[00090020] ;imposta punto inizio testo
      loop 0061
:0062 add ecx,[00090020] ;numero punti da cancellare
      inc dl
      cmp dl,[00090010]
      jnz 0062
      shr ecx,02
      mov edi,esi
      mov eax,[00100010]
      repz
      stosd
      pop dx
      pop ecx
      pop edi
      ret
:0070 push ebx    ;conversione da carattere a numero****************
      mov [00090024],eax ;eax = numero da convertire
      lea ebx,00021500
      mov bl,[00090024]
      mov ah,[ebx]
      shl ah,04
      mov bl,[00090025]
      mov al,[ebx]
      add ah,al
      mov bl,[00090026]
      mov al,[ebx]
      shl al,04
      mov bl,[00090027]
      mov bl,[ebx]
      add al,bl
      pop ebx
      ret
:0073 push ebx    ;conversione da carattere a numero****************
      mov [00090024],ax  ;ax = numero da convertire
      lea ebx,00021500
      mov bl,[00090024]
      mov al,[ebx]
      shl al,04
      mov bl,[00090025]
      mov ah,[ebx]
      add al,ah
      pop ebx
      ret
:0083 push ebx    ;conversione da carattere a numero*************
      add dx,cx        ;esi = posizione numero da convertire
      push dx          ;edx = posizione numero convertito
      lea ebx,00021500 ;cx = numero di cifre
:0084 mov bl,[esi]
      mov ah,[ebx]
      shl ah,04
      mov bl,[esi+01]
      mov al,[ebx]
      add ah,al
      dec dx
      mov [edx],ah
      add si,0002
      loop 0084
      pop dx
      pop ebx
      ret
jmp 0018:0000
:0000 mov ax,0001        ;inizio codice*******************
      mov [0003011A],ax
      mov eax,00010000
      mov [0003011C],eax
      mov eax,00040000
      mov [00030120],eax
      call 0018:0020     ;carica l'elenco
      lea edi,00040000
      lea ebp,000213C8
:0005 mov al,[edi]
      cmp al,00          ;il nome non si trova
      jnz 0001
      jmp 0008:000E
:0001 push bp
:0006 mov ah,[ebp+00]
      mov al,[edi]
      cmp al,ah
      jz 0002
      cmp ax,00FF
      jz 0003
:0004 inc di
      mov al,[edi]
      cmp al,FF
      jnz 0004
      add di,0005
      pop bp
      jmp 0005
:0002 inc bp
      inc di
      jmp 0006
:0003 pop bp             ;trovato il nome
      inc di
      mov ax,0080
      mov [0003011A],ax
      mov eax,[edi]
      mov [0003011C],eax
      lea edi,00100000   ;buffer di compila
      mov [00030120],edi
      call 0018:0020     ;carica le impostazioni
      lea esi,00100100
      mov ecx,[edi]
      shr ecx,10
      sub cx,0010
      jz 0007
:0008 mov eax,[esi]
      mov [0003011C],eax
      add edi,00010000
      mov [00030120],edi
      call 0018:0020     ;carica gli archivi
      add si,0004
      dec cx
      jnz 0008
:0007 mov eax,[00100000]
      mov [00010208],eax ;fondo buffer di compila
      mov eax,00020000
      mov al,[0010001B]
      mov [0003011A],ax
      mov ax,[00100018]
      mov [0003011C],eax
      mov eax,00050000
      mov [00030120],eax
      call 0018:0020     ;carica il testo
      mov ax,[00090004]
      mov ch,[00050004]
      div ch
      mov [0009000E],ax  ;impaginazione sulla x
      mov ax,[00090008]
      mov ch,[00050006]
      div ch
      mov [00090010],ax  ;impaginazione sulla y
      lea edi,00102001
      mov ax,[00100006]  ;calcola la pagina
      dec ax
      xor cx,cx
      mov cl,[00090010]
      mul cx
      mov cx,ax
:000c cmp cx,0000
      jz 0009
:000b mov al,[edi]
      cmp al,1C
      jz 000A
      inc edi
      jmp 000B
:000a inc edi
      dec cx
      jmp 000C
:0009 call 0018:002B     ;imposta la pagina
      mov esi,[00090012]
      xor eax,eax
      mov al,[0009000F]
      shr al,01
      add esi,eax
      mov al,[00090011]
      shr al,01
      mov cx,[00090004]
      mul cx
      add esi,eax
      mov [00090016],esi ;primo punto
      mov dh,01          ;imposta il fondo riga
      cmp edi,[00010208]
      jz 000D
      push edi
:000f mov al,[edi]
      cmp al,1C
      jz 000E
      inc edi
      inc dh
      jmp 000F
:000e pop edi
:000d mov [00090003],dh
      mov dx,0101        ;imposta le coordinate
      call 0010          ;calcola i punti della pagina
      call 0011          ;cancella la pagina
      call 0017          ;disegna i caratteri
      call 0020          ;disegna la croce
      call 0012          ;disegna il video
:0026 mov ax,[0003010A]  ;ciclo tastiera++++++++++++++++
      cmp al,00
      jz 0026
      mov w[0003010A],0000
      cmp ax,E02A
      jz 0026
      cmp ax,E04B
      jz 0027
      cmp ax,E04D
      jz 0028
      cmp ax,E050
      jz 0029
      cmp ax,E048
      jz 002A
      cmp ax,E051
      jz 002B
      cmp ax,E049
      jz 002C
      cmp al,3A
      jz 002D
      cmp al,0E
      jz 002E
      cmp al,1C
      jz 002F
      cmp al,0F
      jz 0030
      cmp al,3B
      jz 0031
      cmp al,01
      jz 0032
      mov cl,[00090003]  ;carattere+++++++++++++++++
      cmp cl,[0009000E]  ;test di fondo riga
      jz 0026
      mov ecx,[00010208]
      cmp ecx,[00090012] ;test di buffer pieno
      jz 0026
      mov bl,[00010222]  ;caps lock
      cmp bl,00
      jz 0034
      add al,80
:0034 push edi           ;sposta i caratteri
      inc ecx
:0035 mov ah,[edi]
      mov [edi],al
      mov al,ah
      inc edi
      cmp edi,ecx
      jb 0035
      mov [edi],al
      mov [00010208],ecx
      pop edi
      call 0020          ;toglie la croce
      push esi           ;disegna i caratteri
      push edi
      push dx
      mov dh,[0010001A]  ;colore del carattere
      mov dl,[00100010]  ;colore dello sfondo
      push esi
:003c mov eax,00050000   ;inizio ciclo
      mov al,[edi]
      cmp al,1C
      jz 0036
      mov ch,[0005000A]
      mul ch
      mov ebx,eax        ;maschera
      push esi
      mov ah,00
      mov cx,[00050006]  ;ciclo in verticale
:003b push esi
      push cx
      mov cx,[00050004]  ;ciclo in orizzontale
:003a cmp ah,00
      jnz 0037
      mov ah,80
      mov al,[ebx]
      inc bx
:0037 test al,ah
      jz 0038
      mov [esi],dh
      jmp 0039
:0038 mov [esi],dl
:0039 inc esi
      shr ah,01
      loop 003A
      pop cx
      pop esi
      add esi,[00090004]
      loop 003B
      pop esi
      xor ecx,ecx
      mov cx,[00050004]  ;ciclo sulla riga
      add esi,ecx
      inc edi
      jmp 003C
:0036 pop esi
      pop dx
      pop edi
      pop esi
      add esi,ecx
      inc edi
      inc dh
      inc b[00090003]
      call 0020          ;disegna la croce
      call 0012          ;disegna il video
      jmp 0026
:0027 cmp dh,01          ;croce a sinistra++++++++++++++
      jz 0026
      call 0020
      xor ecx,ecx
      mov cx,[00050004]
      sub esi,ecx
      dec edi
      dec dh
      call 0020
      call 0012
      jmp 0026
:0028 mov al,[edi]       ;croce a destra+++++++++++++++
      cmp al,1C
      jz 0026
      call 0020
      xor ecx,ecx
      mov cx,[00050004]
      add esi,ecx
      inc edi
      inc dh
      call 0020
      call 0012
      jmp 0026
:0029 cmp dl,[00090010]  ;croce in basso+++++++++++++++
      jz 0026
      push edi
:003e mov al,[edi]
      cmp al,1C
      jz 003D
      inc edi
      jmp 003E
:003d mov eax,edi
      pop edi
      cmp eax,[00010208] ;test di fondo buffer
      jz 0026
      mov edi,eax
      inc edi
      call 0020
      push edi
      mov dh,01
:0040 mov al,[edi]       ;imposta il fondo riga
      cmp al,1C
      jz 003F
      inc edi
      inc dh
      jmp 0040
:003f pop edi
      mov [00090003],dh
      mov esi,[00090016] ;primo punto
      xor cx,cx
      mov cl,dl
:0041 add esi,[00090020] ;dimensione del testo
      loop 0041
      mov dh,01
      inc dl
      call 0020
      call 0012
      jmp 0026
:002a cmp dl,01          ;croce in alto++++++++++++++
      jz 0026
:0042 dec edi
      mov al,[edi]
      cmp al,1C
      jnz 0042
      call 0020
      mov dh,00
:0043 dec edi
      inc dh
      mov al,[edi]
      cmp al,1C
      jnz 0043
      inc edi
      mov [00090003],dh  ;imposta il fondo riga
      dec dl
      mov esi,[00090016] ;primo punto
      xor cx,cx
      mov cl,dl
:0045 dec cx
      jz 0044
      add esi,[00090020] ;dimensione del testo
      jmp 0045
:0044 mov dh,01
      call 0020
      call 0012
      jmp 0026
:002b push edi           ;pagina in basso+++++++++++++++++++
      push dx
:0047 mov al,[edi]
      cmp al,1C
      jz 0046
      inc edi
      jmp 0047
:0046 cmp edi,[00010208] ;test di fomdo buffer
      jnz 0048
      pop dx
      pop edi
      jmp 0026
:0048 cmp dl,[00090010]  ;test di fondo pagina
      jz 0049
      inc edi
      inc dl
      jmp 0047
:0049 pop dx
      pop eax
      inc edi            ;inizio buffer
      inc w[00100006]    ;numero di pagina
:004e call 0018:002B     ;imposta la pagina
      mov esi,[00090016] ;primo punto
      mov dh,01
      push edi
:004b mov al,[edi]
      cmp al,1C
      jz 004A
      inc edi
      inc dh
      jmp 004B
:004a pop edi
      mov [00090003],dh  ;imposta il fondo riga
      mov dx,0101        ;imposta le coordinate
      call 0011          ;cancella la pagina
      call 0017          ;disegna i caratteri
      call 0020          ;disegna la croce
      call 0012          ;disegna il video
      jmp 0026
:002c mov ax,[00100006] ;pagina in alto++++++++++++++++++++++
      cmp ax,0001
      jz 0026
      add dl,[00090010]
:004c dec edi
      mov al,[edi]
      cmp al,1C
      jnz 004C
      cmp dl,01
      jz 004D
      dec dl
      jmp 004C
:004d inc edi            ;inizio buffer
      dec w[00100006]    ;numero di pagina
      jmp 004E
:002d xor b[00010222],01 ;minuscole e maiuscole+++++++++++++
      cli
      call 004F
      mov al,ED
      out 60,al
      call 004F
      mov al,[00010220]
      xor al,04
      out 60,al
      sti
      mov [00010220],al
      jmp 0026
:002e cmp dh,01          ;cancella un carattere+++++++++++++++
      jz 0026
      mov ecx,[00010208]
      dec edi
      push edi
:0055 mov al,[edi+01]    ;sposta i caratteri
      mov [edi],al
      inc edi
      cmp edi,ecx
      jb 0055
      dec ecx
      mov [00010208],ecx
      pop edi
      call 0020          ;toglie la croce
      xor ecx,ecx
      mov cx,[00050004]
      sub esi,ecx        ;punto di inizio
      push esi           ;disegna i caratteri
      push edi
      push dx
      mov dh,[0010001A]  ;colore del carattere
      mov dl,[00100010]  ;colore dello sfondo
      push esi
:005c mov eax,00050000   ;inizio ciclo
      mov al,[edi]
      mov ch,[0005000A]
      mul ch
      mov ebx,eax        ;maschera
      push esi           ;carattere
      mov ah,00
      mov cx,[00050006]  ;ciclo in verticale
:005a push esi
      push cx
      mov cx,[00050004]  ;ciclo in orizzontale
:0059 cmp ah,00
      jnz 0056
      mov ah,80
      mov al,[ebx]
      inc bx
:0056 test al,ah
      jz 0057
      mov [esi],dh
      jmp 0058
:0057 mov [esi],dl
:0058 inc esi
      shr ah,01
      loop 0059
      pop cx
      pop esi
      add esi,[00090004]
      loop 005A
      pop esi
      mov al,[edi]
      cmp al,1C
      jz 005B
      xor ecx,ecx
      mov cx,[00050004]  ;ciclo sulla riga
      add esi,ecx
      inc edi
      jmp 005C
:005b pop esi
      pop dx
      pop edi
      pop esi
      dec dh
      dec b[00090003]
      call 0020          ;disegna la croce
      call 0012          ;disegna il video
      jmp 0026
:002f cmp dl,[00090010]  ;va a capo++++++++++++++++++
      jz 0026
      mov ecx,[00010208]
      cmp ecx,[00090012] ;test di buffer pieno
      jz 0026
:005e mov al,[edi]
      cmp al,1C
      jz 005D
      inc edi
      jmp 005E
:005d inc edi
      push edi
      inc ecx
:005f mov ah,[edi]       ;sposta i caratteri
      mov [edi],al
      mov al,ah
      inc edi
      cmp edi,ecx
      jb 005F
      mov [edi],al
      mov [00010208],ecx ;fondo buffer
      pop edi
      call 0020          ;toglie la croce
      call 0060          ;cancella i caratteri
      mov dh,01
      mov [00090003],dh
      inc dl
      call 0017          ;disegna i caratteri
      call 0020          ;disegna la croce
      call 0012          ;disegna il video
      jmp 0026
:0030 push esi           ;cancella una riga+++++++++++++++++
      mov ecx,[00010208]
:0063 dec edi
      mov al,[edi]
      cmp al,1C
      jnz 0063
      xor eax,eax
      mov al,[00090003]
      mov esi,edi
      add esi,eax
      push edi
:0065 mov al,[esi]       ;sposta i caratteri
      mov [edi],al
      cmp esi,ecx
      jz 0064
      inc esi
      inc edi
      jmp 0065
:0064 mov [00010208],edi ;imposta il fondo buffer
      mov eax,edi
      pop edi
      cmp eax,edi        ;test di fine buffer
      jnz 0066
      inc edi
      mov al,1C
      mov [edi],al
      mov [00010208],edi
      dec edi
:0066 inc edi
      pop esi
      call 0020          ;toglie la croce
      mov dh,01
      push edi
:0068 mov al,[edi]       ;imposta il fondo riga
      cmp al,1C
      jz 0067
      inc edi
      inc dh
      jmp 0068
:0067 mov [00090003],dh
      pop edi
      dec dl
      call 0060          ;cancella i caratteri
      inc dl
      mov dh,01
      call 0017          ;disegna i caratteri
      call 0020          ;disegna la croce
      call 0012          ;disegna il video
      jmp 0026
:0032 call 0018:0025  ;compilazione*************************
      mov eax,[0010001C]
      cmp eax,00080400   ;limite di compilazione
      ja 008A
      jmp 0008:000D
:008a mov ax,0080
      mov [0003011A],ax
      mov eax,00030000
      mov [0003011C],eax
      mov eax,00040000
      mov [00030120],eax
      call 0018:0020     ;carica l'assembler
      lea edi,00102000   ;buffer del testo
      lea ebp,00100200   ;etichette di salto
      lea edx,00050000   ;codice compilato
:006a cmp edi,[00010208] ;ciclo istruzioni++++++++++++++++
      jz 0069
:006b inc edi
:0071 mov al,[edi]
      cmp al,1C
      jz 006A
      cmp al,39
      jz 006B
      cmp al,B9
      jz 006B
      cmp al,33
      jz 006C
      cmp al,34
      jz 006D
      cmp al,37
      jz 006E
      jmp 006F
:006c inc edi          ;commento+++++++++++++
      mov al,[edi]
      cmp al,1C
      jz 006A
      jmp 006C
:006d inc edi          ;etichetta++++++++++++
      mov eax,[edi]
      call 0070        ;conversione da carattere a numero
      shl ax,01
      push bp
      add bp,ax
      mov [ebp+00],dx
      pop bp
      add edi,00000004
      jmp 0071
:006e cmp dx,FFF0       ;zona dati++++++++++++++++
      jb 0072
      mov eax,FFFF0004  ;segmento codice pieno
      jmp 0018:0000
:0072 inc edi
:0074 mov al,[edi]
      cmp al,1C
      jz 006A
      cmp al,33
      jz 006C
      cmp al,39
      jz 0072
      cmp al,B9
      jz 0072
      mov ax,[edi]
      call 0073         ;conversione da carattere a numero
      mov [edx],al
      inc dx
      add edi,00000002
      jmp 0074
:006f cmp dx,FFF0       ;istruzione++++++++++++++++++
      jb 0075
      mov eax,FFFF0004  ;segmento codice pieno
      jmp 0018:0000
:0075 lea ebx,00090030  ;copia i numeri
      lea esi,00090050  ;copia il testo
      jmp 0076
:0078 inc edi
:0076 mov al,[edi]
      cmp al,1C
      jz 0077
      cmp al,33
      jz 0077
      cmp al,39
      jz 0078
      cmp al,B9
      jz 0078
      cmp al,80
      jb 0079
      mov [ebx],al
      inc bx
      jmp 0078
:0079 mov [esi],al
      inc si
      jmp 0078
:0077 mov b[esi],FF
      push edi
      lea edi,00040000 ;codifica assembler
:007e push di
      lea si,0050
:007b mov al,[esi]
      mov ah,[edi]
      cmp al,ah
      jnz 007A
      inc si
      inc di
      jmp 007B
:007a pop di
      cmp ax,00FF
      jz 007C
      cmp ah,FF
      jz 007D
      add di,0020
      jmp 007E
:007d pop edi          ;istruzione non trovata
      call 0018:0023   ;cancella la linea di comando
      mov esi,edi
      lea edi,000711E0
      mov bx,[00030124]
:007f dec esi
      mov al,[esi]
      cmp al,1C
      jnz 007F
:0081 inc esi
      mov al,[esi]
      cmp al,1C
      jz 0080
      call 0018:0013   ;stampa l'istruzione
      add di,0008
      jmp 0081
:0080 call 0018:006A   ;salva l'archivio
      jmp 0018:0000
:007c add di,0010      ;istruzione trovata
      mov ah,[edi]     ;copia il codice istruzione
:0082 inc di
      mov al,[edi]
      mov [edx],al
      inc dx
      dec ah
      jnz 0082
      lea esi,00090030 ;inserimento numeri
      xor cx,cx
:0086 inc di
      mov cl,[edi]
      cmp cl,00
      jz 0085
      call 0083
      jmp 0086
:0085 inc di
      mov al,[edi]
      cmp al,00
      jz 0087
      cmp al,01
      jz 0088
      mov ebx,[00090028] ;fondo codifica del salto
      mov [ebx],al
      inc bx
      mov [ebx],dx
      add bx,0002
      mov al,[edx+FE]
      mov [ebx],al
      inc bx
      mov [00090028],bx
:0087 pop edi
      jmp 0071
:0088 push bp            ;salto corto indietro
      lea ebx,00090030
      mov eax,[ebx]
      call 0070
      shl ax,01
      add bp,ax
      mov ax,[ebp+00]
      sub ax,dx
      cmp ax,FF80
      ja 0089
      pop bp
      jmp 007D           ;loop troppo lunga
:0089 mov [edx+FF],al
      pop bp
      pop edi
      jmp 0071
:0069 mov ax,0010        ;fine compilazione****************
      mov [0003011A],ax
      mov eax,00080100
      mov [0003011C],eax
      mov eax,00070000
      mov [00030120],eax
      call 0018:0020     ;carica le etichette di avvio programma
      mov ax,0010
      mov [0003011A],ax
      mov eax,00080300
      mov [0003011C],eax
      mov eax,00072000
      mov [00030120],eax
      call 0018:0020     ;carica le etichette delle call
      mov eax,[00100020]
      cmp eax,00000000
      jz 008B
      cmp eax,[0010001C]
      jz 008C
      mov [0003011C],eax
      mov eax,00074000
      mov [00030120],eax
      call 0018:0020     ;carica le etichette delle call++
      jmp 008B
:008c lea esi,00100000
      lea edi,00074000
      mov ecx,00000800
      repz
      movsd
:008b mov ebx,[00090028] ;fondo codifica del salto
      mov si,bx
      mov bx,0000
:0091 cmp bx,si
      jz 008E
      mov eax,[ebx]
      cmp al,02
      jz 008F
      cmp al,03
      jz 0090
:008f push bp             ;salto lungo
      shr eax,08
      mov cx,ax
      sub ax,0002
      mov dx,ax
      mov ax,[edx]
      shl ax,01
      add bp,ax
      mov ax,[ebp+00]
      sub ax,cx
      mov [edx],ax
      pop bp
      add bx,0004
      jmp 0091
:0090 push ebp           ;salto fuori segmento
      shr eax,08
      sub ax,0004
      mov dx,ax
      shr eax,10
      cmp al,08
      jz 008D
      cmp al,18
      jz 0092
      lea ebp,00074200   ;call++
      jmp 0093
:008d lea ebp,00070200   ;xxx
      jmp 0093
:0092 lea ebp,00072200   ;call
:0093 mov ax,[edx]
      shl ax,01
      add bp,ax
      mov ax,[ebp+00]
      mov [edx],ax
      pop ebp
      add bx,0004
      jmp 0091
:008e mov ax,0080
      mov [0003011A],ax
      mov eax,[00100014]
      mov [0003011C],eax
      mov eax,00050000
      mov [00030120],eax
      call 0018:004C     ;salva il segmento del codice
      mov eax,[00010208]
      mov [00100000],eax ;fomdo archivio
      mov ax,0080
      mov [0003011A],ax
      mov eax,[0010001C]
      mov [0003011C],eax
      lea edi,00100000
      mov [00030120],edi
      call 0018:004C     ;salva le impostazioni
      lea esi,00100100
      mov ecx,[edi]
      shr ecx,10
      sub cx,0010
      jz 0033
:0095 mov eax,[esi]
      cmp eax,00000000
      jnz 0094
      call 0018:0052     ;nuovo archivio lavori
:0094 mov [0003011C],eax
      add edi,00010000
      mov [00030120],edi
      call 0018:004C     ;salva gli archivi
      add si,0004
      dec cx
      jnz 0095
:0033 jmp 0018:0000
:0031 call 0018:0023     ;linea di comando***************
:0096 mov ax,[0003010A]
      cmp al,00
      jz 0096
      mov w[0003010A],0000
      cmp ax,E02A
      jz 0096
      cmp al,0E
      jz 0097
      cmp al,1C
      jz 0098
      mov ebx,[00010210] ;carattere++++++++++++++++++++
      cmp bx,1400
      jz 0096
      mov [ebx],al
      inc bx
      mov [00010210],bx
      mov edi,[00010214]
      mov bx,[00030126]
      call 0018:0013
      add di,0008
      mov [00010214],di
      jmp 0096
:0097 mov ebx,[00010210] ;cancella un carattere+++++++++
      cmp bx,13C0
      jz 0096
      dec bx
      mov b[ebx],00
      mov [00010210],bx
      mov edi,[00010214]
      sub di,0008
      mov bx,[00030126]
      call 0018:0013
      mov [00010214],di
      jmp 0096
:0098 lea esi,00021D2B   ;fine****************
      call 0018:0056
      jb 0099
      mov ax,0001
      mov [0003011A],ax
      mov eax,[0010001C]
      mov [0003011C],eax
      lea edi,00100000
      mov [00030120],edi
      call 0018:004C     ;salva le impostazioni
      jmp 0008:000D
:0099 lea esi,00021D30   ;colore di sfondo*********
      call 0018:0056
      jb 009A
      xor eax,eax
      mov al,[00100010]
      mov [0003012C],eax
      call 0018:0059     ;cambia numero
      mov ah,[0003012C]
      mov al,[0003012C]
      push ax
      shl eax,10
      pop ax
      mov [00100010],eax ;nuovo colore
:009c lea edi,00102001
      mov esi,[00090016]
      mov dx,0101
      call 0011          ;cancella la pagina
      call 0017          ;disegna i caratteri
      call 0012          ;disegna il video
      jmp 0031
:009a lea esi,00021D41   ;colore del testo**********
      call 0018:0056
      jb 009B
      xor eax,eax
      mov al,[0010001A]
      mov [0003012C],eax
      call 0018:0059     ;cambia numero
      mov al,[0003012C]
      mov [0010001A],al  ;nuovo colore
      jmp 009C
:009b ;prossimo comando
      jmp 0096
jmp 0018:0000
      


Introduzione alla programmazione in "Assembler"
invia E-mail