.equ locat, 0x2000 ;Location for this program ;82C55 memory locations .equ port_a, 0xF800 .equ port_b, 0xF801 .equ port_c, 0xF802 .equ port_abc_pgm, 0xF803 ;routines within paulmon2. .equ cout, 0x0030 ;Send Acc to serial port .equ cin, 0x0032 ;Get Acc from serial port .equ phex, 0x0034 ;Print Hex value of Acc .equ pstr, 0x0038 ;Print string pointed to by DPTR, .equ upper, 0x0040 ;Convert Acc to uppercase .equ newline, 0x0048 ;print CR/LF (13 and 10) .equ pint8u, 0x004D ;print Acc at an integer, 0 to 255 .equ pint16u, 0x0053 ;print DPTR as an integer, 0 to 65535 .equ cin_filter, 0x0062 ;get a character, but look for esc sequences .org locat .db 0x80,0x3E,0xE0,0xA5 ;signiture bytes .db 35,255,0,0 ;id (35=prog) .db 0,0,0,0 ;prompt code vector .db 0,0,0,0 ;reserved .db 0,0,0,0 ;reserved .db 0,0,0,0 ;reserved .db 0,0,0,0 ;user defined .db 255,255,255,255 ;length and checksum (255=unused) .db "Test IDE Pins",0 ;max 31 characters, plus the zero .org locat+64 ;executable code begins here startup: mov sp, #0x40 mov dptr, #port_abc_pgm mov a, #128 movx @dptr, a ;make all pins output mov r7, #0 ;r7 has pin # we're testing main_loop: mov a, r7 acall print_pinout_diagram mov a, r7 acall update_pins mov dptr, #msg_anykey lcall pstr lcall cin_filter main1: cjne a, #27, main2 ;ESC to quit sjmp quit main2: cjne a, #8, main3 ;left arrow back to previous pin sjmp previous main3: next: inc r7 cjne r7, #24, main_loop quit: ljmp 0 previous: mov a, r7 jz main_loop dec r7 sjmp main_loop msg_anykey: .db "Press any key for next pin, or ESC to quit",0 ; +-----+ ; 1 | . . | 2 ; 3 | . . | 4 ; 5 | . . | 6 ; 7 | . . | 8 ; 9 | . . | 10 ; 11 | . . | 12 ; 13 | . . | 14 ; 15 | . . | 16 ; 17 | . . | 18 ; 19 | . | 20 ; 21 | . . | 22 ; 23 | . . | 24 ; 25 | . . | 26 ; 27 | . . | 28 ; 29 | . . | 30 ; 31 | . . | 32 ; 33 | . . | 34 ; 35 | . . | 36 ; 37 | . . | 38 ; 39 | . . | 40 ; +-----+ print_pinout_diagram: rl a rl a rl a anl a, #0xF8 mov r4, a ;r4 has table offset for bit that's set lcall clear_screen mov dptr, #msg_pin_1 lcall pstr mov a, r4 add a, #7 mov dptr, #table movc a, @a+dptr mov r6, a ;r6 has pin # that is high acall print_int mov dptr, #msg_pin_2 lcall pstr mov a, r4 add a, #table & 255 mov dpl, a clr a addc a, #table >> 8 mov dph, a lcall pstr mov dptr, #msg_pin_3 lcall pstr mov a, r4 add a, #4 mov dptr, #table movc a, @a+dptr add a, #'A' lcall cout mov a, #'.' lcall cout mov a, r4 add a, #5 movc a, @a+dptr add a, #'0' lcall cout lcall newline mov dptr, #diagram_str_0 lcall pstr mov dptr, #diagram_str_1 lcall pstr mov r0, #0 print_pinout_loop: mov dptr, #diagram_str_0 lcall pstr inc r0 mov a, r0 acall print_int mov dptr, #diagram_str_2 lcall pstr acall print_pin mov a, #' ' lcall cout inc r0 acall print_pin mov dptr, #diagram_str_3 lcall pstr mov a, r0 acall print_int lcall newline cjne r0, #40, print_pinout_loop mov dptr, #diagram_str_0 lcall pstr mov dptr, #diagram_str_1 lcall pstr ret diagram_str_0: .db " ",0 diagram_str_1: .db " +-----+",13,10,0 diagram_str_2: .db " | ",0 diagram_str_3: .db " | ",0 msg_pin_1: .db 13,10,"IDE Pin ",0 msg_pin_2: .db " (",0 msg_pin_3: .db ") is high, all others low. Driven via P",0 print_pin: cjne r0, #20, print_pin_2 mov a, #' ' ;pin 20 always prints as space ljmp cout print_pin_2: mov a, r0 mov b, r6 cjne a, b, print_pin_3 mov a, #'@' ;this is the pin that's high ljmp cout print_pin_3: mov a, #'.' ;else print only a dot for low ljmp cout print_int: mov b, #10 div ab jnz print_int_2 mov a, #' ' lcall cout sjmp print_int_3 print_int_2: add a, #'0' lcall cout print_int_3: mov a, b add a, #'0' ljmp cout ; clears the screen and puts the cursor at the top ; left corner on VT100 compatible terminals clear_screen: mov dptr, #msg_clr lcall pstr mov r0, #20 mov r1, #0 clr_dly:djnz r1, clr_dly djnz r0, clr_dly ret msg_clr:.db 27, "[H", 27, "[2J", 0 update_pins: mov b, a ;b has pin # to set (all others clear) mov dptr, #table mov r1, #0 pins_loop: inc dptr ;skip name inc dptr inc dptr inc dptr clr a movc a, @a+dptr ;fetch port offset inc dptr add a, #2 mov r0, a ;use r2/r3/r4 for output data clr a movc a, @a+dptr ;fetch pin offset inc dptr acall bitmask mov r5, a ;keep bitmask in r5 clr a movc a, @a+dptr ;fetch polarity inc dptr mov r6, a ;r6 has polarity inc dptr ;skip IDE pin number mov a, r1 cjne a, b, pin_clear pin_set: mov a, r6 ;if this is the pin we are supposed to cpl acc.0 ;set, then invert it's polarity so the mov r6, a ;code below will set instead of clear pin_clear: cjne r6, #0, pin_inverter pin_no_inverter: mov a, r5 cpl a mov r5, a mov a, @r0 anl a, r5 ;clear bit if no inverter mov @r0, a sjmp pin_next pin_inverter: mov a, @r0 orl a, r5 ;set bit if inverter on this signal mov @r0, a pin_next: inc r1 cjne r1, #24, pins_loop ; now all 24 bits in r2/r3/r4 should mov dptr, #port_a mov a, r2 movx @dptr, a mov dptr, #port_b mov a, r3 movx @dptr, a mov dptr, #port_c mov a, r4 movx @dptr, a ret space: mov a, #' ' ljmp cout bitmask: anl a, #7 inc a movc a, @a+pc ret .db 1,2,4,8,16,32,64,128 .equ P_A, 0 .equ P_B, 1 .equ P_C, 2 table: ; NAME (4 char) Port/Pin Invert IDE Pin Invert .db "D0",0,0, P_A,0, 0, 17 .db "D1",0,0, P_A,1, 0, 15 .db "D2",0,0, P_A,2, 0, 13 .db "D3",0,0, P_A,3, 0, 11 .db "D4",0,0, P_A,4, 0, 9 .db "D5",0,0, P_A,5, 0, 7 .db "D6",0,0, P_A,6, 0, 5 .db "D7",0,0, P_A,7, 0, 3 .db "D8",0,0, P_B,0, 0, 4 .db "D9",0,0, P_B,1, 0, 6 .db "D10",0, P_B,2, 0, 8 .db "D11",0, P_B,3, 0, 10 .db "D12",0, P_B,4, 0, 12 .db "D13",0, P_B,5, 0, 14 .db "D14",0, P_B,6, 0, 16 .db "D15",0, P_B,7, 0, 18 .db "A0",0,0, P_C,0, 0, 35 .db "A1",0,0, P_C,1, 0, 33 .db "A2",0,0, P_C,2, 0, 36 .db "CS0",0, P_C,3, 1, 37 .db "CS1",0, P_C,4, 1, 38 .db "WR",0,0, P_C,5, 1, 23 .db "RD",0,0, P_C,6, 1, 25 .db "RST",0, P_C,7, 1, 1