;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