;test program for acid reverse-engineering, february 2010 by nocash
;---
;beware:
;  most tests are out-commented in main program (at label "start:"),
;  all tests threw out whatever uncommented messy experimental numbers,
;  neither source code nor user interface are aimed to be user-friendly.
;---
.model tiny   ;assemble with TASM, link as .COM file
.code
.386
locals
org 100h
jmp start
;------------------
lpt_port dw 278h  ;378h,278h,3bch = LPT1,2,3
lpt_data db 0 ;+8;+255 ; +13;+255
lpt_ctrl db 0 +4 ; +8+2+4
lpt_recv db 0
buf1 dw 0
buf2 dw 0
buf3 dw 0
buf4 dw 0
global_time dd 0
;------------------
; d0-d7   --> a0-a7
; ctrl    --> clk4=stb, /ce=/sel, cclr=/init=green
; stat    <-- sin=busy=black
; gnd
; vcc
;---
;Baseaddress: 378h,278h,3bch = LPT1,2,3
;---
;SUBD   CNTR
;pin    pin   pin-name   register    bit   software                 direction
;------------------------------------------------------------------------------
;2..9   2-9   D0..D7     daten (0)   0..7  d0..7                    (*)
;15     32    /ERROR     status (1)  3     /error                   read only
;13     13    SLCT       status (1)  4     slct                     read only
;12     12    PE         status (1)  5     paper end                read only
;10     10    /ACK       status (1)  6     /acknowledge             read only
;11     11    BUSY     ! status (1)  7     /busy                    read only
;1      1     /STB     ! ctrl (2)    0     strobe                   read/write
;14     14    /AutoLF  ! ctrl (2)    1     auto linefeed            read/write
;16     31    /INIT      ctrl (2)    2     /reset                   read/write
;17     36    /Select  ! ctrl (2)    3     select                   read/write
;-            ---        ctrl (2)    4     irq enable
;-            ---        ctrl (2)    5     datenregister als eingang
;18..25 19-30 GND        -           -     -
;------------------
cast_to_hardware:
 inc  dword ptr ds:[global_time]
 mov  dx,word ptr ds:[lpt_port]
 mov  al,byte ptr ds:[lpt_data]
 out  dx,al
 add  dl,2
 mov  al,byte ptr ds:[lpt_ctrl]
 xor  al,0bh  ;undo hardware-inversion
 out  dx,al
 xor  al,01h  ;toggle STB (clock)
 out  dx,al
 dec  dx
 in   al,dx
 xor  al,80h  ;undo hardware-inversion
 mov  byte ptr ds:[lpt_recv],al
 ret
;------------------
apply_ctrl_and_get_sin:
 mov  dx,word ptr ds:[lpt_port]
 add  dl,2
 mov  al,byte ptr ds:[lpt_ctrl]
 xor  al,0bh  ;undo hardware-inversion
 out  dx,al
 dec  dx
 in   al,dx
 xor  al,80h  ;undo hardware-inversion
 shr  al,7
 ret
;------------------
issue_reset:
 xor  byte ptr ds:[lpt_ctrl],4
 call cast_to_hardware
 xor  byte ptr ds:[lpt_ctrl],4
 call cast_to_hardware
 ret
;------------------
wrchr:
 pusha
 mov  dl,al
 mov  ah,06h
 int  21h
 popa
 ret
;------------------
wrcrlf:
 mov  al,0dh
 call wrchr
 mov  al,0ah
 call wrchr
 ret
;------------------
wrspc:
 mov  al,20h
 call wrchr
 ret
;------------------
hexdigit:
 push ax
 and  al,0fh
 cmp  al,09h
 jbe  short @@cont
 add  al,07h
@@cont:
 add  al,30h
 call wrchr
 pop  ax
 ret
;------------------
hexal:
 ror  al,4
 call hexdigit
 ror  al,4
 call hexdigit
 ret
;------------------
hexax:
 ror  ax,8
 call hexal
 ror  ax,8
 call hexal
 ret
;------------------
hexeax:
 ror  eax,16
 call hexax
 ror  eax,16
 call hexax
 ret
;------------------
record_pattern1:
 call issue_reset
 mov  di,offset pattern1
 push cs
 pop  es
 mov  cx,100h
@@lop:
 call cast_to_hardware
 shr  al,7
 stosb
 loop short @@lop
 ret
;------------------
record_buf1:
 mov  es,word ptr ds:[buf1]
 jmp  short record_buf_inj
;------------------
record_buf2:
 mov  es,word ptr ds:[buf2]
;- - - - - --------
record_buf_inj:
 call issue_reset
 xor  di,di
 xor  cx,cx
@@lop:
 call cast_to_hardware
 shr  al,7
 stosb
 loop short @@lop
 ret
;------------------
get_patt2:
 mov  di,offset pattern2
 add  di,word ptr ds:[patt2_ptr]
 inc  byte ptr ds:[patt2_ptr]
 call cast_to_hardware
 shr  al,7
 mov  byte ptr ds:[di],al
 ret
;------------------
cmp_patt2:
 mov  si,offset pattern1
 mov  di,offset pattern2
 mov  bx,word ptr ds:[patt2_ptr]
 mov  cx,100h
@@lop:
 mov  al,byte ptr ds:[si]
 cmp  al,byte ptr ds:[di+bx]
 jne  short @@diff
 inc  si
 inc  bl
 loop short @@lop
 mov  eax,dword ptr ds:[global_time]
 call hexeax
 call wrcrlf
 mov  dword ptr ds:[global_time],0
@@diff:
 ret
;------------------
count_max_same:
 mov  al,byte ptr ds:[lpt_recv]
 xchg al,byte ptr ds:[@@prev]
 xor  al,byte ptr ds:[@@prev]
 js   short @@diff
 inc  word ptr ds:[@@same_count]
 ret
@@diff:
 mov  ax,word ptr ds:[@@same_count]
 mov  word ptr ds:[@@same_count],0
 cmp  ax,word ptr ds:[@@max_count]
 jae  short @@show
 ret
@@show:
 mov  word ptr ds:[@@max_count],ax
 call hexax
 call wrspc
 mov  al,byte ptr ds:[lpt_recv]
 xor  al,80h
 shr  al,7
 call hexdigit
 call wrcrlf
 ret
@@max_count  dw 0
@@same_count dw 0
@@prev       db 0
;------------------
alloc_buf:
 mov  ax,ds
 add  ax,1000h
 mov  word ptr ds:[buf1],ax
 add  ax,1000h
 mov  word ptr ds:[buf2],ax
 add  ax,1000h
 mov  word ptr ds:[buf3],ax
 add  ax,1000h
 mov  word ptr ds:[buf4],ax
 ret
;------------------
try_one:

 call wrspc
 call wrspc
 call wrspc

 mov  edx,01
 mov  ch,72
 mov  cl,byte ptr ds:[lpt_data]
@@lop:
 shl  edx,1
 test edx,10000h        ;\
 jz   short @@skip1     ;
 xor  edx,1             ;
@@skip1:                ;/
 mov  eax,1
 shl  eax,cl
 test edx,eax           ;\
 jz   short @@skip2     ;
 xor  edx,1             ;
@@skip2:                ;/
 xor  edx,1             ;

 mov  eax,edx
shr eax,16
 and  eax,1
 call hexdigit
 dec  ch
 jnz  short @@lop
 call wrcrlf
call wrcrlf
 ret
;------------------
record_some_buf2:

 mov  byte ptr ds:[lpt_data],01h
@@data_lop:
 call @@core
 shl  byte ptr ds:[lpt_data],01h
 jnc  short @@data_lop

 mov  byte ptr ds:[lpt_data],00h
@@data_lop2:
 call @@core
 add  byte ptr ds:[lpt_data],01h
 cmp  byte ptr ds:[lpt_data],15h
 jb   short @@data_lop2
 ret
;---
@@core:
 call record_buf2                       ;-record DATA=nn to buf2
 mov  al,byte ptr ds:[lpt_data]         ;\
 call hexal                             ; show DATA
 call wrspc                             ;/
 mov  fs,word ptr ds:[buf1]             ;\
 mov  gs,word ptr ds:[buf2]             ;
 xor  di,di                             ;
@@count_same_lop:                       ; count same, and SHOW count
 inc  di                                ;
 jz   short @@no_diff                   ;
 mov  al,byte ptr fs:[di]               ;
 cmp  al,byte ptr gs:[di]               ;
 je   short @@count_same_lop            ;
@@no_diff:                              ;
 mov  ax,di                             ;
 call hexax                             ;
 call wrspc                             ;/
mov  bx,di
 mov  cx,60                             ;\
@@show_diff_lop:                        ;
 mov  al,byte ptr fs:[di]               ;
 xor  al,byte ptr gs:[di]               ; show DIFF bits
 call hexdigit                          ;
 inc  di                                ;
 loop short @@show_diff_lop             ;
 call wrcrlf                            ;/

sub bx,32                               ;\
call wrspc                              ;
 mov  cx,64
@@show_nearby_lop:
 mov  al,byte ptr gs:[bx]               ;
 call hexdigit                          ;
 inc  bx                                ;
 loop short @@show_nearby_lop           ;
 call wrcrlf                            ;/

 ret
;------------------
compare_table:
 @@def macro val,disp,xval,pos
  dd val+(disp*10000000h),xval+(pos*20000h)
 endm
 ;---- compare,disp,xor    ,pos
 @@def 13596h ,4   ,0c820h ,477Dh  ;00h
 @@def 0,0,0,0
 @@def 15596h ,4   ,0a820h ,175Bh  ;02h
 @@def 1559Ah ,1   ,0a824h ,1FAFh  ;03h ;or, less probably: @@def 15669h ,3   ,0a091h
 dd 3 dup (0,0)
 @@def 1545Ah ,1   ,0a8a4h ,7325h  ;07h
 @@def 135A6h ,10  ,0c800h ,57E1h  ;08h
 dd 1 dup (0,0)
 @@def 154A6h ,10  ,0a800h ,79CDh  ;0Ah
 dd 10h-9 dup (0,0)
 @@def 0D496h ,4   ,02820h ,0247h  ;12h
 dd 21h-13h dup (0,0)
 @@def 13599h ,1   ,0c824h ,3972h  ;21h
 dd 40h-22h dup (0,0)
 @@def 13296h ,4   ,0c820h ,2BB5h  ;40h
 dd 3 dup (0,0)
 @@def 13256h ,4   ,0c8a0h ,12B5h  ;44h
 dd 3 dup (0,0)
 @@def 132a6h ,10  ,0c800h ,61EFh  ;48h
 dd 40h-1 dup (0,0)
 @@def 12DA6h ,13  ,0c000h ,29E9h  ;88h
 dd 0ffh-89h dup (0,0)
 @@def 0,1,0               ,29DFh  ;FFh ()


;0088 29E9 04019 08032 10065 000CB 00196 0032D 0065B 00CB6 0196D 032DA 065B4 0CB69 196D3 12DA6 05B4D

;0008 57E1 1ED4D 1DA9A 1B535 16A6B 0D4D6 57DD 01101010011010110
;000A 79CD 18455 108AA 01154 022A9 04552 79C9 00100010101010010

;0088 29E9 04019 08032 10065 000CB 00196 29E5 00000000110010110


;------------------
try_calc_17bit:
 @@mod macro nn
  mov  ebx,dword ptr ds:[@@val_x]
  shr  ebx,nn
  xor  eax,ebx
 endm
@@do_compare equ 01
@@prev4 equ 1
 ;---
 mov  byte ptr ds:[lpt_data],00h        ;\
mov  byte ptr ds:[lpt_data],02h        ;
mov  byte ptr ds:[lpt_data],40h        ;
mov  byte ptr ds:[lpt_data],48h        ;
mov  byte ptr ds:[lpt_data],08h        ;
mov  byte ptr ds:[lpt_data],03h        ;
mov  byte ptr ds:[lpt_data],21h        ;
mov  byte ptr ds:[lpt_data],12h        ;
mov  byte ptr ds:[lpt_data],44h        ;
mov  byte ptr ds:[lpt_data],88h        ;
mov  byte ptr ds:[lpt_data],07h        ;
mov  byte ptr ds:[lpt_data],0ah        ;
 call record_buf2                       ;/
 mov  dword ptr ds:[@@val_x],1ffffh
 IF @@do_compare
   mov  fs,word ptr ds:[buf2]
   mov  di,0
   mov  cx,0fff0h
 ELSE
   mov  cx,64
 ENDIF
@@lop:

IF 1
 IF @@prev4
  movzx esi,byte ptr ds:[lpt_data]
  mov  eax,dword ptr ds:[compare_table+esi*8+0]
  and  eax,1ffffh
  cmp  dword ptr ds:[@@val_x],eax ;13596h when dat=00h
 ELSE
  cmp  dword ptr ds:[@@val_x],15359h   ;special case when DATA=00h
 ENDIF
 jne  short @@not_here
ELSE
 cmp di,0c70bh   -4*@@prev4
 je short @@here
 cmp di,08744h   -4*@@prev4
 je short @@here
 cmp di,0477dh   -4*@@prev4
 jne short @@not_here
 @@here:
ENDIF
 mov  eax,dword ptr ds:[@@val_x]
 call hexeax
 call wrcrlf

IF 1
 IF @@prev4
  mov  eax,dword ptr ds:[compare_table+esi*8+4]
  and  eax,1ffffh
  xor dword ptr ds:[@@val_x],eax  ;0c820h wgeb dat=00h
 ELSE
  xor dword ptr ds:[@@val_x],10c82h  ;2*8641h   ;special case when DATA=00h
 ENDIF
ELSE
 xor dword ptr ds:[@@val_x],1 shl (1+4*@@prev4+0)
 xor dword ptr ds:[@@val_x],1 shl (1+4*@@prev4+6)
 xor dword ptr ds:[@@val_x],1 shl (1+4*@@prev4+9)
 xor dword ptr ds:[@@val_x],1 shl (1+4*@@prev4+10)
 xor dword ptr ds:[@@val_x],1 shl (1+4*@@prev4+15)
ENDIF
@@not_here:

    xor  eax,eax
    @@mod 0
    @@mod 8+1
    @@mod 11+1
    @@mod 15+1
    and  eax,0001h
    shl  eax,16+1

 xor  dword ptr ds:[@@val_x],eax
 shr  dword ptr ds:[@@val_x],1

;mov  eax,dword ptr ds:[@@val_x]   ;0A9AC at mismatch
;call hexeax
;call wrcrlf


 IF @@do_compare
   mov  eax,dword ptr ds:[@@val_x]        ;\
   and  eax,0001h                         ;
   cmp  al,byte ptr fs:[di]
   jne  short @@abort
   inc  di
 ELSE
   test cx,0fh                            ;\
   jnz  short @@no_spc                    ;
   call wrspc                             ;
  @@no_spc:                               ;/
   mov  eax,dword ptr ds:[@@val_x]        ;\
   and  eax,0001h                         ;
   call hexdigit                          ;/
 ENDIF
 dec  cx
 jnz        @@lop
 ;---
@@abort:
 call wrcrlf
 mov  ax,di
 call hexax
 call wrcrlf

mov di,0477dh
mov cx,64
@@post_error_lop:
 mov  al,byte ptr fs:[di]
 inc  di
 call hexdigit
 loop short @@post_error_lop
 call wrcrlf
 ret
;---
@@val_x dd 0
;------------------
test_all_data:
 @@mod macro nn
  mov  ebx,dword ptr ds:[@@val_x]
  shr  ebx,nn
  xor  eax,ebx
 endm
 ;---
@@with_fix equ 01
 mov  word ptr ds:[@@dat],000h
@@data_lop:
 mov  ax,word ptr ds:[@@dat]            ;\
 mov  byte ptr ds:[lpt_data],al         ;
 shl  ah,3  ;/CE to /SELECT (bit3)      ; apply 9bit data
 and  byte ptr ds:[lpt_ctrl],not 3      ;
 or   byte ptr ds:[lpt_ctrl],ah         ;/
 call record_buf2                       ;-record DATA=nn to buf2
 ;---
 mov  dword ptr ds:[@@val_x],1ffffh
 mov  dword ptr ds:[@@recent_index],0
 mov  fs,word ptr ds:[buf2]
 mov  di,0
 mov  cx,0fff0h
@@lop:

 mov  eax,dword ptr ds:[@@val_x]                ;\
 mov  ebx,dword ptr ds:[@@recent_index]         ;
 and  ebx,1fh                                   ; memorize recent values
 mov  dword ptr ds:[@@recent_buf+ebx*4],eax     ;
 inc  dword ptr ds:[@@recent_index]             ;/
 IF @@with_fix
   @@xlat macro nn,cmp_val,xor_val
     test byte ptr ds:[lpt_data],1 shl nn
     jz   short @@skip_&nn
     xor  dword ptr ds:[@@cmp_val],cmp_val
     xor  dword ptr ds:[@@xor_val],xor_val
    @@skip_&nn:
   endm
   ;---   bit,compare,xor
   mov  dword ptr ds:[@@cmp_val],13596h
   mov  dword ptr ds:[@@xor_val],0c820h
   @@xlat 0  ,0000ch ,00004h
   @@xlat 1  ,06000h ,06000h
   @@xlat 2  ,000c0h ,00080h
   @@xlat 3  ,00030h ,00020h
   @@xlat 4  ,18000h ,08000h
   @@xlat 5  ,00003h ,00000h
   @@xlat 6  ,00600h ,00000h
   @@xlat 7  ,01800h ,00800h

   test word ptr ds:[@@dat],100h ;CE
   jnz  short @@not_here

   mov  eax,dword ptr ds:[@@cmp_val]
   xor  eax,dword ptr ds:[@@val_x]
and eax,not 100h
   jnz  short @@not_here

   mov  eax,dword ptr ds:[@@xor_val]
   xor  dword ptr ds:[@@val_x],eax
  @@not_here:
 ENDIF
 xor  eax,eax                                   ;\
 @@mod 0                                        ;
 @@mod 8+1                                      ;
 @@mod 11+1                                     ; advance shift-reg
 @@mod 15+1                                     ;
 and  eax,0001h                                 ;
 shl  eax,16+1                                  ;
 xor  dword ptr ds:[@@val_x],eax                ;
 shr  dword ptr ds:[@@val_x],1                  ;/
 mov  eax,dword ptr ds:[@@val_x]                ;\
 and  eax,0001h                                 ;
 cmp  al,byte ptr fs:[di]                       ; compare
 jne  short @@abort                             ;
 inc  di                                        ;/
 dec  cx                                        ;\lop next
 jnz        @@lop                               ;/
 jmp  short @@skip_match
;---
@@abort:
 mov  ax,word ptr ds:[@@dat]                    ;\
 call hexax                                     ; show 9bit data
 call wrspc                                     ;/
 mov  ax,di     ;\show position                 ;\
 call hexax     ;/                              ;
 mov  cx,5  ;;+10                               ; show location of
 mov  ebx,dword ptr ds:[@@recent_index]         ; mismatch, and recent values
@@show_recent_lop:                              ;
 call wrspc                                     ;
 dec  ebx                                       ;
 and  ebx,1fh                                   ;
 mov  al,byte ptr ds:[@@recent_buf+ebx*4+2]     ;
 call hexdigit                                  ;
 mov  ax,word ptr ds:[@@recent_buf+ebx*4+0]     ;
 call hexax                                     ;
 loop short @@show_recent_lop                   ;/
 call wrspc
 mov  ax,di     ;\show position @@prev4         ;\
 sub  ax,4      ;                               ;
 call hexax     ;/                              ;
 call wrspc                                     ; show pos prev4
 mov  eax,dword ptr ds:[@@recent_buf+ebx*4]     ; and binary value
 shl  eax,15                                    ; at that place
 mov  cx,17                                     ;
@@show_bin_lop:                                 ;
 rol  eax,1                                     ;
 and  al,01h                                    ;
 call hexdigit                                  ;
 loop short @@show_bin_lop                      ;/
 call wrcrlf
@@skip_match:
 inc  word ptr ds:[@@dat]                       ;\
 cmp  word ptr ds:[@@dat],10h  ;;110h                  ; lop next data
 jb         @@data_lop                          ;/
 ret
;---
@@val_x dd 0
@@dat dw 0
@@recent_buf dd 32 dup (0)
@@recent_index dd 0
@@cmp_val dd 0
@@xor_val dd 0
;------------------
test_cclr_time:
 mov  byte ptr ds:[@@ycnt],0
@@ylop:
 mov  byte ptr ds:[lpt_data],01h        ;\
 mov  byte ptr ds:[lpt_ctrl],04h        ; init
 call issue_reset                       ;/
 call @@clk_till_sin_zero
 @@cclr macro nn
   test byte ptr ds:[@@ycnt],1 shl nn     ;\
   jz   short @@nay&nn                    ;
   call @@toggle_cclr                     ;
   jmp  short @@fin&nn                    ;
  @@nay&nn:                               ;/
   call wrspc
   call wrspc
   call wrspc
   call wrspc
   call wrspc
  @@fin&nn:
 endm
 @@cclr 0
 @@cclr 1
 call @@toggle_clk                      ;-
 @@cclr 2
 @@cclr 3
 call @@toggle_clk                      ;-
 @@cclr 4
 @@cclr 5
 call @@toggle_clk                      ;-
 @@cclr 6
 @@cclr 7
 call @@toggle_clk                      ;-
 call wrspc                             ;-
 call @@clk_till_sin_zero               ;-
 call wrcrlf
 inc  byte ptr ds:[@@ycnt]
 test byte ptr ds:[@@ycnt],0ffh
 jnz  @@ylop
 ret
;---
@@clk_till_sin_zero:
 mov  cx,0ffh
@@clk_lop:
 xor  byte ptr ds:[lpt_ctrl],01h  ;toggle STB (clock)
 call apply_ctrl_and_get_sin
 and  al,01h
 loopnz @@clk_lop
 mov  ax,0ffh
 sub  ax,cx
 call hexal
 ret
;---
@@toggle_clk:
 call wrspc
 xor  byte ptr ds:[lpt_ctrl],01h  ;toggle STB (clock)
 mov  al,'c'                            ;\
 call wrchr                             ;
 mov  al,byte ptr ds:[lpt_ctrl]         ; show new CLK state
 and  al,01h                            ;
 call hexdigit                          ;/
 mov  al,'s'                            ;\
 call wrchr                             ; show resulting SIN state
 call apply_ctrl_and_get_sin            ;
 call hexdigit                          ;/
 and  al,01h
 ret
;---
@@toggle_cclr:
 call wrspc
 xor  byte ptr ds:[lpt_ctrl],04h  ;toggle INIT (cclr)
 mov  al,'i'                            ;\
 call wrchr                             ;
 mov  al,byte ptr ds:[lpt_ctrl]         ; show new INIT state
 shr  al,2                              ;
 and  al,01h                            ;
 call hexdigit                          ;/
 mov  al,'s'                            ;\
 call wrchr                             ; show resulting SIN state
 call apply_ctrl_and_get_sin            ;
 call hexdigit                          ;/
 and  al,01h
 ret
;---
@@ycnt db 0
;------------------
test_data_compare_pos:
 @@mod macro nn
  mov  ebx,dword ptr ds:[@@val_x]
  shr  ebx,nn
  xor  eax,ebx
 endm
 ;---
mov  byte ptr ds:[@@dat],0ffh
mov  byte ptr ds:[@@dat],000h
mov  byte ptr ds:[@@dat],002h
mov  byte ptr ds:[@@dat],003h
mov  byte ptr ds:[@@dat],007h
mov  byte ptr ds:[@@dat],008h
mov  byte ptr ds:[@@dat],012h
mov  byte ptr ds:[@@dat],021h
mov  byte ptr ds:[@@dat],040h
mov  byte ptr ds:[@@dat],044h
mov  byte ptr ds:[@@dat],048h
mov  byte ptr ds:[@@dat],088h
mov  byte ptr ds:[@@dat],00Ah

; @@def 0D496h ,4   ,02820h ,0247   ;12h
; @@def 13599h ,1   ,0c824h ,3972   ;21h
; @@def 13296h ,4   ,0c820h ,2BB5h  ;40h
; @@def 13256h ,4   ,0c8a0h ,12B5h  ;44h
; @@def 13B99h ,1   ,0d864h ,61EFh  ;48h
; @@def 00196h ,4   ,1a460h ,29E9h  ;88h



 movzx esi,byte ptr ds:[@@dat]                  ;\
 mov  eax,dword ptr ds:[compare_table+esi*8+4]  ;
 shr  eax,17                                    ;
 sub  eax,8*2                                     ;
 mov  dword ptr ds:[@@pos],eax                  ;
 add  eax,8*2+2                                   ;
 mov  dword ptr ds:[@@end],eax                  ;/
@@pos_lop:
 mov  byte ptr ds:[lpt_data],01h        ;\
 and  byte ptr ds:[lpt_ctrl],not 3      ; init
 call issue_reset                       ;/
 ;---
 mov  dword ptr ds:[@@val_x],1ffffh
 mov  fs,word ptr ds:[buf2]
 mov  di,0
 mov  cx,0fff0h
@@lop:
 xor  eax,eax                                   ;\
 @@mod 0                                        ;
 @@mod 8+1                                      ;
 @@mod 11+1                                     ; advance shift-reg
 @@mod 15+1                                     ;
 and  eax,0001h                                 ;
 shl  eax,16+1                                  ;
 xor  dword ptr ds:[@@val_x],eax                ;
 shr  dword ptr ds:[@@val_x],1                  ;/
 cmp  di,word ptr ds:[@@pos]                    ;\
 mov  byte ptr ds:[lpt_data],01h                ;
 jne  short @@notyet                            ;
 mov  al,byte ptr ds:[@@dat]                    ;
 mov  byte ptr ds:[lpt_data],al                 ;
@@notyet:                                       ;/
 call cast_to_hardware                          ;\
 shr  al,7                                      ;
 xor  eax,dword ptr ds:[@@val_x]                ;
 and  eax,0001h                                 ; compare
 jnz  short @@abort                             ;
 inc  di                                        ;/
 dec  cx                                        ;\lop next
 jnz        @@lop                               ;/
 jmp  short @@no_abort
;---
@@abort:
 mov  ax,word ptr ds:[@@pos]            ;\
 call hexax                             ; show pos
 call wrspc                             ;/
 mov  ax,di     ;\show position                 ;\show position
 call hexax     ;/                              ;/
 call wrspc
 mov  eax,dword ptr ds:[compare_table+esi*8+4]  ;
 shr  eax,17  ;base pos                         ;
 mov  ecx,dword ptr ds:[compare_table+esi*8+0]  ;
 shr  ecx,28  ;disp pos
 sub  eax,ecx
 sub  ax,word ptr ds:[@@pos]
 call hexax   ;disp-to-expected-disp (=should be 0)
 call wrcrlf
@@no_abort:
 inc  word ptr ds:[@@pos]                       ;\
 mov  eax,dword ptr ds:[@@end]                  ;
 cmp  dword ptr ds:[@@pos],eax                  ; lop next pos
 jb         @@pos_lop                           ;/
 ret
;---
@@dat db 0
@@val_x dd 0
@@pos dd 0
@@end dd 0
;------------------
try_all_16bit:
 ; for i=0 to FFFFh
 ;  x=FFFFh
 ;  for j=0 to 0FFh
 ;   rol x,1
 ;   if carry <> buf1[j] then mismatch
 ;   for k=0 to 15
 ;    if (1 shl k) and i and x THEN x=x xor 1
 ;   next k
 ;  next j
 ;   print "match",i
 ;mismatch:
 ; next i
 ;---
 mov  fs,word ptr ds:[buf1]
 mov  word ptr ds:[@@val_i],0
@@lop_i:
 mov  word ptr ds:[@@val_x],0ffffh
 mov  word ptr ds:[@@val_j],0
@@lop_j:

;shl  word ptr ds:[@@val_x],1
;sar  word ptr ds:[@@val_x],1

 rol  word ptr ds:[@@val_x],1

 mov  al,0                              ;\
 adc  al,0                              ;
 mov  di,word ptr ds:[@@val_j]          ;
 cmp  al,byte ptr fs:[di]               ;
 jne  short @@mismatch                  ;/

;mov ax,word ptr ds:[@@val_x]
;mov ah,al
;shr al,5
;and ax,0101h
;and al,ah
;and ax,1
OR word ptr ds:[@@val_x],1
;xor word ptr ds:[@@val_x],ax

 mov  word ptr ds:[@@val_k],0
@@lop_k:
 mov  ax,01h                            ;\
 mov  cx,word ptr ds:[@@val_k]          ;
 shl  ax,cl                             ;
 and  ax,word ptr ds:[@@val_i]          ;
 and  ax,word ptr ds:[@@val_x]          ;
 jz   short @@skip                      ;
 xor  word ptr ds:[@@val_x],1           ;
@@skip:                                 ;/

;xor  word ptr ds:[@@val_x],1           ;

 inc  word ptr ds:[@@val_k]             ;\
 cmp  word ptr ds:[@@val_k],10h         ; next k
 jb   short @@lop_k                     ;/

 inc  word ptr ds:[@@val_j]             ;\
 cmp  word ptr ds:[@@val_j],100h        ; next j
 jb   short @@lop_j                     ;/
@@mismatch:
 mov  ax,word ptr ds:[@@val_j]
 cmp  ax,1eh
 jb   short @@ignore_mismatch
 call hexax
 call wrspc
 mov  ax,word ptr ds:[@@val_i]
 call hexax
 call wrcrlf
 call wrcrlf

@@ignore_mismatch:
 inc  word ptr ds:[@@val_i]             ;\
;cmp  word ptr ds:[@@val_i],10000h      ; next i
 jnz        @@lop_i                     ;/
 ret
;---
@@val_x dw 0
@@val_i dw 0
@@val_j dw 0
@@val_k dw 0
;------------------
show_i_0122h:
 mov  fs,word ptr ds:[buf1]

 mov  word ptr ds:[@@val_i],0122h
@@lop_i:
 mov  word ptr ds:[@@val_x],0ffffh
 mov  word ptr ds:[@@val_j],0
@@lop_j:
 rol  word ptr ds:[@@val_x],1
 mov  al,0                              ;\
 adc  al,0                              ;
call hexdigit
; mov  di,word ptr ds:[@@val_j]          ;
; cmp  al,byte ptr fs:[di]               ;
; jne  short @@mismatch                  ;/
 mov  word ptr ds:[@@val_k],0
@@lop_k:
 mov  ax,01h                            ;\
 mov  cx,word ptr ds:[@@val_k]          ;
 shl  ax,cl                             ;
 and  ax,word ptr ds:[@@val_i]          ;
 and  ax,word ptr ds:[@@val_x]          ;
 jz   short @@skip                      ;
 xor  word ptr ds:[@@val_x],1           ;
@@skip:                                 ;/
 inc  word ptr ds:[@@val_k]             ;\
 cmp  word ptr ds:[@@val_k],10h         ; next k
 jb   short @@lop_k                     ;/

 inc  word ptr ds:[@@val_j]             ;\
 cmp  word ptr ds:[@@val_j],72          ; next j
 jb   short @@lop_j                     ;/

 call wrcrlf
 ret
;---
@@val_x dw 0
@@val_i dw 0
@@val_j dw 0
@@val_k dw 0
;------------------
show_buf1:
 mov  fs,word ptr ds:[buf1]

 mov  word ptr ds:[@@val_j],0
@@lop_j:
 mov  di,word ptr ds:[@@val_j]          ;
 test di,0fh                            ;\
 jnz  short @@no_spc                    ;
 call wrspc                             ;
@@no_spc:                               ;/

 mov  al,byte ptr fs:[di]               ;
call hexdigit

 inc  word ptr ds:[@@val_j]             ;\
 cmp  word ptr ds:[@@val_j],72          ; next j
 jb   short @@lop_j                     ;/

 call wrcrlf
 ret
;---
@@val_x dw 0
@@val_i dw 0
@@val_j dw 0
@@val_k dw 0
;------------------
start:
 call alloc_buf
 call record_pattern1                   ;-
 mov  byte ptr ds:[lpt_data],00h        ;\record DATA=00 to buf1
;;;;;;;;mov byte ptr ds:[lpt_data],04h
 call record_buf1                       ;/

;call try_all_16bit
;call show_i_0122h
;call show_buf1
;call try_calc_17bit
;call test_data_compare_pos
;call test_all_data
call test_cclr_time
;; call record_some_buf2
JMP exit


 JMP exit

mov cx,16
@@redo:
push cx
 call issue_reset

mov  al,byte ptr ds:[lpt_data]
call hexal
call wrspc

mov cx,72
@@preshow:
call cast_to_hardware
shr al,7
call hexdigit
loop short @@preshow
call wrcrlf

add  byte ptr ds:[lpt_data],01h
;xor  byte ptr ds:[lpt_ctrl],8
pop cx
loop short @@redo
jmp exit

mov cx,0ffffh
@@prelop:
call cast_to_hardware
loop short @@prelop

;; call show_pattern1
@@lop1:
 mov  cx,100
@@lop:
 push cx
 call get_patt2
 call cmp_patt2

call count_max_same

; mov  al,byte ptr ds:[lpt_recv]
; shr al,7
; call hexdigit


 pop  cx
 loop @@lop
 mov  ah,01h
 int  16h
 jz   @@lop1

mov  ah,0
int 16h

exit:
 mov  ah,4ch
 int  21h
;------------------
pattern1 db 100h dup (?)
pattern2 db 100h dup (?)
patt2_ptr dw 0
;------------------
end cs:100h


7E81h = 32385 = 127*17*15       ;when seed 001h or so
3FC7h = 16327 =                 ;when seed 000h

data=00h + calc_17bit --> mismatch at time 477Dh
data=01h + calc_17bit --> mismatch at time FFF0h (=never / bufsize)


          01234567 89012345 67890123 45678901 23456789 01234567 89012345 67890123 4567890123456789
seed 000: 11111111 11111111 01010011 11011100 11100011 11100011 00001100 11101100 0000110000010011




12 0247 100000101000010010111111111111000111111110101000100111010011
02 .... 100000100110000111001011001111000010111101110011010101000111

10000      01001      10000      11100      10110      01111      00001 01111 01110011010101000111
100000     100110     000111     001011     001111     000010     111101110011010101000111
1000001    0011000    0111001    0110011    1100001    0111101    110011010101000111
10000010   01100001   11001011   00111100   00101111   01110011   010101000111
100000100  110000111  001011001  111000010  111101110  011010101  000111
1000001001 1000011100 1011001111 0000101111 0111001101 0101000111

1) show surrounding values BEFORE/AFTER diff
2) search/show LONGEST all-one or all-zero

N  before diff                      after diff
01 00110000110000001001011110001101 00110101100101010011101111001010
02 01110110000101100001011011001101 10110111111101001111000011110110
03 10011000000000001000111101011001 11110110111111101010000010010010
04 00110000110000001001011110001101 00110101100101010011101111001010
0D 01001100100101001110011011101101 11011100111111101011100111110001
12 10000011010000101110011110101101 10100111111010111011100100000111



try_all_16bit:
 for i=0 to FFFFh
  x=FFFFh
  for j=0 to 0FFh
   shl x,1
   if carry <> buf1[j] then mismatch
   for k=0 to 15
    if (1 shl k) and i and x THEN x=x xor 1
   next k
  next j
  print "match",i
mismatch:
 next i

xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
1111111111111111 0101001111011100 0100100101101011 1010101011100100 01001000 122
1111111111111111 0101001111011100 1110001111100011 0000110011101100 00001100 buf
                                  x x x x x   x    x x  xx     x     x   x
                                  0123456789abcdef



1011011111110100111100001111011000101010000000011110110100000110 post err
0011010110010101001110111100101000000101011100101011100101110010 no error

0123
8091

XxxxxxxxXxxXxxxX XXXX
1111111111111111 1111 ;\
1111111111111110 1110 ;
1111111111111101 1111 ;
1111111111111010 1110 ;
1111111111110101 1111 ;
1111111111101010 1100 ;
1111111111010100 1110 ;
1111111110101001 1101 ;
1111111101010011 1011 ;
1111111010100111 1101 ;
1111110101001111 1001 ;
1111101010011110 1110 ;
1111010100111101 1011 ;
1110101001111011 1011 ;
1101010011110111 1111 ;
1010100111101110 1100 ;/

XxxxxxxxXxxXxxxX XXXX
0101001111011100 0110 ;\
1010011110111001 1111 ;    <-- unknown how bit0 comes here
0100111101110011 0011 ;
1001111011100111 1101 ;    <--
0011110111001110 0100 ;
0111101110011100 0110 ;    <--     caused by bit0-error (which is now in bit4)
1111011100111000 1010 ;
1110111001110001 1011 ;    <--
1101110011100011 1101 ;
1011100111000111 1101 ;    <---
0111001110001111 0101 ;
1110011100011111 1011 ;
1100111000111110 1010 ;
1001110001111100 1010 ;    <---
0011100011111000 0110 ;
0111000111110001 0111 ;/

1110001111100011 1101 ;\
1100011111000110 1100 ;
1000111110001100 1100 ;
0001111100011000 0010 ;
0011111000110000 0010 ;
0111110001100001 0001 ;
1111100011000011 1101 ;
1111000110000110 1100 ;
1110001100001100 1000 ;
1100011000011001 1011 ;
1000110000110011 1011 ;
0001100001100111 0001 ;
0011000011001110 0100 ;
0110000110011101 0111 ;
1100001100111011 1011 ;
1000011001110110 1010 ;/
0000110011101100 0100

0000 477D 15359 0A6B2 14D65 09ACB 13596 4779 10011010110010110
                                   x
                                               x x      010
0002 175B 11559 02AB2 05565 0AACB 15596 1757 10101010110010110
0003 1FAF 0AACD 1559A 0AB34 15669 0ACD3 1FAB 01010110011010011

0016 0F5C 1ED45 1DA8A 1B515 16A2B 0D456 0F58 01101010001010110
0017 5880 16A2D 0D45A 1A8B5 1516B 0A2D6 587C 01010001011010110

001A 2235 00FB5 01F6A 03ED4 07DA9 0FB52 2231 01111101101010010
001B 203E 16AD5 0D5AA 1AB54 156A8 0AD51 203A 01010110101010001


0007 7325 0AA2D 1545A 0A8B5 1516A 0A2D4 7321 01010001011010100
0008 57E1 1ED4D 1DA9A 1B535 16A6B 0D4D6 57DD 01101010011010110
000A 79CD 18455 108AA 01154 022A9 04552 79C9 00100010101010010
000D 245F 09A35 1346A 068D5 0D1AB 1A356 245B 11010001101010110
000E 527E 04555 08AAB 11556 02AAC 05559 527A 00101010101011001
0011 56F6 15A4D 0B49A 16935 0D26B 1A4D7 56F2 11010010011010111
0012 0247 1ED49 1DA92 1B525 16A4B 0D496 0243 01101010010010110
0014 6219 1AB55 156AA 0AD55 15AAB 0B556 6215 01011010101010110

001D 5490 15A35 0B46A 168D5 0D1AA 1A354 548C 11010001101010100


                                               xx       FIX
0000 477D 15359 0A6B2 14D65 09ACB 13596 4779 10011010110010110
0002 175B 11559 02AB2 05565 0AACB 15596 1757 10101010110010110

0003 1FAF 0AACD 1559A 0AB34 15669 0ACD3 1FAB 01010110011010011
0007 7325 0AA2D 1545A 0A8B5 1516A 0A2D4 7321 01010001011010100

0008 57E1 1ED4D 1DA9A 1B535 16A6B 0D4D6 57DD 01101010011010110
000A 79CD 18455 108AA 01154 022A9 04552 79C9 00100010101010010

000D 245F 09A35 1346A 068D5 0D1AB 1A356 245B 11010001101010110
000E 527E 04555 08AAB 11556 02AAC 05559 527A 00101010101011001
0011 56F6 15A4D 0B49A 16935 0D26B 1A4D7 56F2 11010010011010111
0012 0247 1ED49 1DA92 1B525 16A4B 0D496 0243 01101010010010110
0014 6219 1AB55 156AA 0AD55 15AAB 0B556 6215 01011010101010110
0016 0F5C 1ED45 1DA8A 1B515 16A2B 0D456 0F58 01101010001010110
0017 5880 16A2D 0D45A 1A8B5 1516B 0A2D6 587C 01010001011010110
001A 2235 00FB5 01F6A 03ED4 07DA9 0FB52 2231 01111101101010010
001B 203E 16AD5 0D5AA 1AB54 156A8 0AD51 203A 01010110101010001
001D 5490 15A35 0B46A 168D5 0D1AA 1A354 548C 11010001101010100

                                                        Fxy     /x=bit5 AND bit0
0021 3972 19ACC 13599 06B32 0D664 1ACC9 396E 11010110011001001   y=not x ..bit4
0030 5E59 18B59 116B2 02D65 05ACA 0B595 5E55 01011010110010101
0031 5552 05ACC 0B599 16B32 0D665 1ACCB 554E 11010110011001011
0035 3AD0 05A2C 0B459 168B3 0D166 1A2CC 3ACC 11010001011001100
0036 1D20 1CD45 19A8A 13515 06A2A 0D455 1D1C 01101010001010101
0039 42B7 05A54 0B4A9 16953 0D2A7 1A54F 42B3 11010010101001111
003B 4363 06A54 0D4A9 1A953 152A6 0A54D 435F 01010010101001101
003C 5AED 162D1 0C5A3 18B46 1168C 02D19 5AE9 00010110100011001
003D 229B 05AB4 0B569 16AD2 0D5A4 1AB48 2297 11010101101001000
003F 5BCA 06A34 0D469 1A8D3 151A7 0A34E 5BC6 01010001101001110
0040 2BB5 17329 0E652 1CCA5 1994B 13296 2BB1 10011001010010110
0043 1B47 1A9CD 1539A 0A734 14E68 09CD0 1B43 01001110011010000
0044 12B5 17325 0E64A 1CC95 1992B 13256 12B1 10011001001010110
0047 0242 1A92D 1525A 0A4B5 1496B 092D7 023E 01001001011010111
0048 61EF 09DCC 13B99 07733 0EE67 1DCCE 61EB 11101110011001110
0049 3020 199D5 133AA 06754 0CEA9 19D52 301C 11001110101010010
004A 436A 0F4D4 1E9A9 1D352 1A6A5 14D4A 4366 10100110101001010
004C 01A0 1DCC9 1B993 17326 0E64C 1CC99 019C 11100110010011001
004D 4C0F 199B5 1336A 066D4 0CDA8 19B51 4C0B 11001101101010001
0050 7BDE 18B29 11652 02CA5 0594B 0B296 7BDA 01011001010010110
0055 0583 0592D 0B25A 164B5 0C96B 192D7 057F 11001001011010111
005B 7DC2 069D5 0D3AA 1A754 14EA9 09D52 7DBE 01001110101010010
005C 2B3F 162C9 0C593 18B26 1164C 02C99 2B3B 00010110010011001
005E 2AEF 1F34D 1E69B 1CD36 19A6C 134D9 2AEB 10011010011011001
0060 1FBE 15339 0A672 14CE5 099CA 13395 1FBA 10011001110010101
0063 3638 0A94C 15299 0A533 14A66 094CC 3634 01001010011001100
0064 7490 15325 0A64A 14C95 0992A 13255 748C 10011001001010101
0067 477E 0A9AC 15359 0A6B2 14D65 09ACB 477A 01001101011001011
006B 3405 0A9D4 153A9 0A752 14EA4 09D48 3401 01001110101001000
006C 3D31 0D4CD 1A99B 15336 0A66C 14CD9 3D2D 10100110011011001
006E 3769 04549 08A93 11526 02A4C 05499 3765 00101010010011001
006F 4E9C 0A934 15269 0A4D3 149A7 0934F 4E98 01001001101001111
0071 2533 1594C 0B299 16533 0CA66 194CC 252F 11001010011001100
0072 6E2F 1ED39 1DA72 1B4E5 169CA 0D395 6E2B 01101001110010101
0074 1EE7 1AB25 1564A 0AC95 1592A 0B255 1EE3 01011001001010101
0076 14B1 1ED35 1DA6A 1B4D5 169AA 0D355 14AD 01101001101010101
0077 29D6 169AC 0D359 1A6B2 14D64 09AC9 29D2 01001101011001001
007A 7722 08FB4 11F69 03ED3 07DA7 0FB4E 771E 01111101101001110
007C 44DF 06AC9 0D593 1AB26 1564C 0AC99 44DB 01010110010011001
007F 6BCF 16934 0D269 1A4D3 149A6 0934D 6BCB 01001001101001101
0086 6F01 074C5 0E98A 1D315 1A62B 14C56 6EFD 10100110001010110
0088 29E9 04019 08032 10065 000CB 00196 29E5 00000000110010110
008A 6359 07A74 0F4E9 1E9D3 1D3A6 1A74D 6355 11010011101001101
008D 4032 196B5 12D6A 05AD5 0B5AB 16B56 402E 10110101101010110
008E 09C8 09D31 13A63 074C6 0E98C 1D319 09C4 11101001100011001
0091 139B 056CD 0AD9A 15B35 0B66B 16CD7 1397 10110110011010111
0093 7CCC 066CD 0CD9A 19B35 1366A 06CD5 7CC8 00110110011010101
0095 127B 0562D 0AC5A 158B4 0B168 162D0 1277 10110001011010000
0097 02B0 0662D 0CC5A 198B4 13169 062D2 02AC 00110001011010010
0098 2541 08165 102CA 00595 00B2B 01656 253D 00001011001010110
009C 7961 0B2B5 1656B 0CAD6 195AC 12B59 795D 10010101101011001
009D 7996 05635 0AC6A 158D4 0B1A8 16350 7992 10110001101010000
009E 7C5A 02331 04663 08CC6 1198C 03319 7C56 00011001100011001
009F 1F86 06635 0CC6A 198D4 131A9 06352 1F82 00110001101010010
00A2 7492 054C9 0A992 15325 0A64A 14C95 748E 10100110010010101
00A4 7BA5 012D5 025AA 04B55 096AA 12D55 7BA1 10010110101010101
00A7 24BA 0A62C 14C59 098B2 13164 062C8 24B6 00110001011001000
00A8 131C 10E09 01C12 03825 0704B 0E096 1318 01110000010010110
00AA 4E38 10654 00CA9 01953 032A6 0654C 4E34 00110010101001100
00AC 3418 104B1 00963 012C6 0258C 04B19 3414 00100101100011001
00AE 4781 19535 12A6B 054D6 0A9AC 15359 477D 10101001101011001
00AF 57DA 0A6B4 14D69 09AD3 135A6 06B4C 57D6 00110101101001100
00B0 1EE9 0EAC9 1D592 1AB25 1564A 0AC95 1EE5 01010110010010101
00B1 44DC 1564C 0AC99 15932 0B265 164CB 44D8 10110010011001011
00B3 179E 1664C 0CC99 19932 13264 064C9 179A 00110010011001001
00B4 621B 0EAD5 1D5AA 1AB55 156AA 0AD55 6217 01010110101010101
00BB 4EA5 16654 0CCA9 19952 132A4 06549 4EA1 00110010101001001
00C0 4C86 012B9 02572 04AE5 095CB 12B96 4C82 10010101110010110
00C3 435F 0A54D 14A9A 09534 12A68 054D0 435B 00101010011010000
00C7 2ABD 0A5AD 14B5A 096B5 12D6B 05AD7 2AB9 00101101011010111
00C8 082D 0DE09 1BC12 17825 0F04A 1E095 0829 11110000010010101
00C9 36D5 09555 12AAA 05554 0AAA9 15552 36D1 10101010101010010
00CC 13A2 104AD 0095B 012B6 0256C 04AD9 139E 00100101011011001
00CE 363B 19529 12A53 054A6 0A94C 15299 3637 10101001010011001
00CF 2228 0A535 14A6A 094D4 129A9 05353 2224 00101001101010011
00D0 56CE 0EAA9 1D552 1AAA5 1554B 0AA96 56CA 01010101010010110
00D1 1D28 155CD 0AB9A 15735 0AE6A 15CD4 1D24 10101110011010100
00D7 4034 165AD 0CB5A 196B5 12D6A 05AD5 4030 00101101011010101
00DE 2536 12B29 05653 0ACA6 1594C 0B299 2532 01011001010011001
00E1 5320 195CC 12B99 05733 0AE67 15CCE 531C 10101110011001110
00E5 795E 195AC 12B59 056B3 0AD66 15ACD 795A 10101101011001101
00E7 421B 1A52C 14A59 094B2 12965 052CB 4217 00101001011001011
00E8 40C0 19019 12032 04065 080CA 10195 40BC 10000000110010101
00E9 573C 195D4 12BA9 05753 0AEA7 15D4E 5738 10101110101001110
00EA 771B 1DA74 1B4E9 169D2 0D3A5 1A74A 7717 11010011101001010
00EC 4E37 00CA9 01953 032A6 0654C 0CA99 4E33 01100101010011001
00EE 3962 09D2D 13A5B 074B6 0E96C 1D2D9 395E 11101001011011001
00EF 381A 1A534 14A69 094D2 129A5 0534B 3816 00101001101001011
00F0 16F9 0CAB9 19572 12AE5 055CA 0AB95 16F5 01010101110010101
00F1 081F 0554C 0AA99 15532 0AA64 154C8 081B 10101010011001000
00F3 0C35 065CC 0CB99 19733 12E67 05CCE 0C31 00101110011001110
00F6 69B4 08CA5 1194A 03295 0652A 0CA55 69B0 01100101001010101
00F9 36D3 05554 0AAA9 15552 0AAA4 15548 36CF 10101010101001000
00FA 4DA0 0588C 0B119 16232 0C465 188CB 4D9C 11000100011001011
00FB 40B6 06554 0CAA9 19552 12AA5 0554A 40B2 00101010101001010
00FD 2D91 055B4 0AB69 156D3 0ADA7 15B4F 2D8D 10101101101001111
00FE 6204 02329 04653 08CA6 1194C 03299 6200 00011001010011001
00FF 29DF 065B4 0CB69 196D3 12DA6 05B4D 29DB 00101101101001101

            xx1xx
0000 477D-4 13596                         4779
00FF 29DF-1 0CB69                         29DE

test data 000h..1FFh show diff-location, and RECENT data in shift-reg
search DATA=COMPARE position

00
 01
02
 04
08
 10
 20
40
 80


0000 477D-4 13596
0002 175B-4 15596
0008 57E1   1ED4D 1DA9A 1B535 16A6B 0D4D6
0040 2BB5-4 13296
00FF 29DF-1 0CB69 196D3 12DA6 05B4D


 @@mod macro nn
  mov  ebx,dword ptr ds:[@@val_x]
  shr  ebx,nn
  xor  eax,ebx
 endm
 ;---
@@with_fix equ 01
 mov  word ptr ds:[@@dat],000h
@@data_lop:
 mov  ax,word ptr ds:[@@dat]            ;\
 mov  byte ptr ds:[lpt_data],al         ;
 shl  ah,3  ;/CE to /SELECT (bit3)      ; apply 9bit data
 and  byte ptr ds:[lpt_ctrl],not 3      ;
 or   byte ptr ds:[lpt_ctrl],ah         ;/
 call record_buf2                       ;-record DATA=nn to buf2
 ;---
 mov  dword ptr ds:[@@val_x],1ffffh
 mov  dword ptr ds:[@@recent_index],0
 mov  fs,word ptr ds:[buf2]
 mov  di,0
 mov  cx,0fff0h
@@lop:

 ;ACID reverse-engineered 13-16 February 2010 by nocash (Martin Korth)
 ;below is repeated on every CLK cycle...
 CmpVal=13596h, XorVal=0c820h
 if PinA0=1 then CmpVal=CmpVal XOR 0000ch, XorVal=XorVal XOR 00004h
 if PinA1=1 then CmpVal=CmpVal XOR 06000h, XorVal=XorVal XOR 06000h
 if PinA2=1 then CmpVal=CmpVal XOR 000c0h, XorVal=XorVal XOR 00080h
 if PinA3=1 then CmpVal=CmpVal XOR 00030h, XorVal=XorVal XOR 00020h
 if PinA4=1 then CmpVal=CmpVal XOR 18000h, XorVal=XorVal XOR 08000h
 if PinA5=1 then CmpVal=CmpVal XOR 00003h, XorVal=XorVal XOR 00000h
 if PinA6=1 then CmpVal=CmpVal XOR 00600h, XorVal=XorVal XOR 00000h
 if PinA7=1 then CmpVal=CmpVal XOR 01800h, XorVal=XorVal XOR 00800h
 if PinCE=0 AND (ShiftReg OR 100h)=CmpVal then ShiftReg=ShiftReg XOR XorVal
 NewBit=ShiftRegBit0 XOR ShiftRegBit9 XOR ShiftRegBit12 XOR ShiftRegBit16
 ShiftReg=(ShiftReg SHR 1) + (NewBit SHL 16)
 Wait for falling edge on PinCLK
 if PinCCLR=0 then ShiftReg=1FFFFh      ;\done at falling CLK edge
 PinSIN=ShiftRegBit0                    ;/


SIN changes on falling-CLK-edge
CCLR when? 1clk=low, repeats every 18 clks, see http://groups.google.com/group/comp.sys.amstrad.8bit/browse_thread/thread/00621273fbd0f8f4
/OE when? A0-A7 valid when?


parity = shiftreg and mask
do shift, and add parity
wait for clk (via polling or interrupt)
output bit
read 9bit (oe and address lines)
compare shiftreg with old_shiftreg_table(9bit value)
if match then set shiftreg = new_shiftreg_table(9bit value)


read data_table(index), and increment index
mask index to 17bit range
wait for clk (via polling or interrupt)
output bit
read 9bit (oe and address lines)
compare index with old_index_table(9bit value)
if match then set index = new_index_table(9bit value)

:Misc

;EPROM Pin-Outs
;             _________  _________
;            !         \/         !
; A19,VPP12  ! 1  vcc     vcc  32 !  VCC6
;       A16  ! 2          vcc  31 !  A18,/PGM
; A15,VPP12  ! 3,1          28,30 !  A17,VCC6
;       A12  ! 4,2          27,29 !  A14,/PGM,/WE
;        A7  ! 5,3          26,28 !  A13
;        A6  ! 6,4          25,27 !  A8
;        A5  ! 7,5          24,26 !  A9,IDENT12
;        A4  ! 8,6          23,25 !  A11
;        A3  ! 9,7      gnd 22,24 !  /OE,VPP12
;        A2  ! 10,8         21,23 !  A10
;        A1  ! 11,9         20,22 !  /CE,(/PGM)
;        A0  ! 12,10        19,21 !  D7
;        D0  ! 13,11        18,20 !  D6
;        D1  ! 14,12        17,19 !  D5
;        D2  ! 15,13        16,18 !  D4
;       GND  ! 16,14        15,17 !  D3
;            !____________________!

;Cartridge Pin-Outs
 component side    solder side
 1  B18 VCC        2  A18 VCC
 3  B17 CLK4       4  A17 CA18/LK2
 5  B16 CA16       6  A16 CA17/LK4
 7  B15 CA15/LK6   8  A15 CA14
 9  B14 A12        10 A14 A13
 11 B13 A7         12 A13 A8
 13 B12 A6         14 A12 A9
 15 B11 A5         16 A11 A11
 17 B10 A4         18 A10 A3
 19 B9  A10        20 A9  A2
 21 B8  /CE        22 A8  A1
 23 B7  D7         24 A7  A0
 25 B6  D6         26 A6  D0
 27 B5  D5         28 A5  D1
 29 B4  D4         30 A4  D2
 31 B3  D3         32 A3  SIN
 33 B2  CCLR       34 A2  GND
 35 B1  GND        36 A1  GND

;Links:
          vcc--lk1--a18
          vcc--lk3--a17vcc28
          vcc--lk5--a15

;Acid Pin-outs:
       gnd 1       16 vcc
        a7 2       15 a6
      clk4 3       14 a5
       nc  4       13 a4
      cclr 5       12 a3
       sin 6       11 a2
       /ce 7       10 a1
       gnd 8        9 a0
The two gnd pins are interconnected inside of the chip.

;Wiring of original DSUB cable:

 black 1  stb                      13         1
 gray  2  d0                        25      14
 blue  3  d1
 yel   4  d2
 red   5  d3
 black 6  d4
 gray  7  d5
 blue  8  d6
 yel   9  d7
 red   10 ack
 black 11 busy
 gray  12 pe
 blue  13 slct

 white 14 autolf
 mag   15 error
 green 16 init
 orang 17 select
 brown 18 gnd
 white 19 gnd
 mag   20 gnd
 green 21 gnd
 orang 22 gnd
 brown 23 gnd
 white 24 gnd
 mag   25 gnd
