1 điểm bởi GN⁺ 7 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Zilog Z80, ra mắt tháng 7 năm 1976, được sử dụng rộng rãi từ máy tính cá nhân, máy tính cho người đam mê đến thiết bị nhúng và công nghiệp, trở thành đại diện cho kỷ nguyên vi xử lý 8-bit
  • Trong khi duy trì khả năng tương thích nhị phân với Intel 8080, Z80 mở rộng các chức năng thanh ghi, định địa chỉ, tập lệnh và ngắt, đồng thời được thiết kế với kết nối điện đơn giản hơn
  • Ngăn xếp hạn chế và không gian địa chỉ 14-bit của 8008 được cải thiện thành ngăn xếp bộ nhớ và không gian địa chỉ 16-bit trên 8080; Z80 bổ sung thêm thanh ghi chỉ mục, bank thanh ghi thay thế và lệnh khối
  • Nhờ nguồn 5V đơn, xung clock đơn, các tín hiệu điều khiển MREQ·IORQ·RD·WR và cơ chế refresh DRAM tích hợp, có thể dựng máy tính với ít chip ngoại vi
  • Dòng Z80 tạo ra nhiều sản phẩm phái sinh như Sharp LR35902 của Game Boy và eZ80; Z80 gốc trải qua vòng đời công nghiệp dài trước khi ngừng sản xuất vào tháng 6 năm 2024

Từ Datapoint 2200 đến Intel 8008

  • Computer Terminal Corporation (CTC) phát triển terminal lập trình được Datapoint 2200, trang bị bộ xử lý 8-bit làm từ các chip TTL rời rạc
  • Kế hoạch thay thế một phần mạch TTL bằng IC tùy chỉnh được mở rộng theo hướng đưa toàn bộ CPU vào một chip duy nhất, và Texas Instruments cùng Intel lần lượt phụ trách thiết kế
  • Cả hai công ty đều không hoàn thành thiết kế đúng hạn; khi chip của Intel sẵn sàng, CTC đã bán terminal dựa trên TTL
    • Các kỹ sư CTC cũng không hài lòng với hiệu năng của chip, và kiến trúc của terminal thế hệ tiếp theo cũng đã được thay đổi
    • TI dừng thiết kế, nhưng Intel đổi sản phẩm vốn có tên 1201 thành tên marketing 8008 và thương mại hóa

Cấu trúc và hạn chế của 8008

  • 8008 cung cấp 7 thanh ghi A·B·C·D·E·H·L
    • A là bộ tích lũy, còn H và L tạo thành con trỏ bộ nhớ HL
    • Thanh ghi giả M biểu thị byte bộ nhớ mà HL trỏ tới
  • Trạng thái ALU được duy trì bằng các cờ Carry, Parity, Zero và Sign, dùng cho nhảy, gọi và quay về có điều kiện
  • Bộ đếm chương trình khó thao tác trực tiếp, và lời gọi hàm sử dụng ngăn xếp địa chỉ quay về 8 mức bên trong bộ xử lý
    • Đây là thiết kế dựa trên nhận định rằng Datapoint 2200 dự kiến dùng bộ nhớ nối tiếp, nên ngăn xếp lời gọi dựa trên bộ nhớ có thể trở thành nút thắt
  • Địa chỉ bộ nhớ là 14-bit và cung cấp 32 cổng I/O trong không gian địa chỉ riêng
  • Khi xảy ra ngắt, thiết bị ngoại vi đặt lệnh RST lên bus dữ liệu và CPU thực thi lệnh đó
    • RST gọi một trong 8 slot ở phần đầu không gian địa chỉ
    • Vì không có ngăn xếp bộ nhớ đa dụng và mọi truy cập bộ nhớ đều cần HL, để lưu thanh ghi trong lúc xử lý ngắt phải dùng chốt ngoài trên bus I/O làm thanh ghi tạm
  • Sử dụng khoảng 3.500 transistor và gói DIP18, đồng thời ghép kênh bus địa chỉ và dữ liệu
    • Mạch ngoài phải chốt bus và diễn giải tín hiệu trạng thái nội bộ của CPU
    • Cần hai xung clock lệch pha 500kHz và nguồn +5V·-9V

Từ 8008 đến 8080

  • Ngay trước khi việc phát triển 8008 kết thúc, các thảo luận nhằm cải thiện hạn chế đã bắt đầu, nhưng ban lãnh đạo Intel muốn xem phản ứng thị trường trước
  • Federico Faggin thúc đẩy việc phát triển phiên bản cải tiến, và do chờ đến khi đối thủ công bố sản phẩm 8-bit, Intel mất 9 tháng lợi thế đi trước
  • Ngay cả trước khi dự án được phê duyệt, Faggin đã tuyển Masatoshi Shima từ Busicom để tham gia thiết kế 8080
  • Những phê bình và phản hồi mà khách hàng tiềm năng đưa ra trong các buổi trình diễn 8008 cũng được phản ánh, và ngay từ đầu đã quyết định từ bỏ khả năng tương thích nhị phân với 8008

Kiến trúc 8080

  • 8080 giữ cấu hình thanh ghi tương tự 8008, đồng thời loại bỏ ngăn xếp địa chỉ quay về nội bộ và đưa vào ngăn xếp bộ nhớ do SP trỏ tới
    • Có thể đưa các cặp thanh ghi BC·DE·HL·AF vào ngăn xếp hoặc lấy ra
    • Trong assembly của Intel, AF được gọi là PSW, tức program status word
  • Không gian địa chỉ tăng lên 16-bit 64KB, số cổng I/O tăng lên 256
    • Có thể truy cập gián tiếp hạn chế thông qua BC và DE
    • Có thể đọc hoặc lưu bộ tích lũy và HL tại địa chỉ chỉ định tức thời
  • Các phép toán 16-bit như tăng/giảm cặp thanh ghi được bổ sung, cho phép xử lý tính toán con trỏ và bộ đếm 16-bit
    • Khối phép toán này không ảnh hưởng đến cờ ALU, nên sau khi giảm BC cần kiểm tra riêng xem cả hai byte có đều bằng 0 hay không
  • Ngắt vẫn giữ phương thức dựa trên RST, đồng thời có thể bật hoặc tắt bằng phần mềm
    • Nhờ ngăn xếp bộ nhớ tường minh, không còn cần phần cứng I/O để lưu thanh ghi
  • Assembly Intel 8080 có mnemonic và opcode gần như tương ứng 1:1, nên dễ triển khai assembler nhưng có thể khó đọc với con người
    • Lệnh cặp thanh ghi chỉ dùng tên một thanh ghi, và chữ X trong INX dùng để phân biệt với INC một byte

Giao diện điện của 8080

  • Để tăng tốc độ, 8080 dùng logic NMOS nên cần ba nguồn -5V·+5V·+12V và hai xung clock lệch pha
  • Nhờ gói 40 chân, đường địa chỉ và đường dữ liệu được tách riêng, nhưng một phần trạng thái điều khiển vẫn được ghép kênh lên bus dữ liệu, nên vẫn cần chốt và bộ giải mã ngoài
  • Intel bán các chip hỗ trợ để giải mã trạng thái và tạo clock; tùy hệ thống, có thể cần cả bộ điều khiển ngắt, timer và bộ điều khiển DMA
    • Timer lập trình được ít nhất có thể dùng để điều khiển refresh DRAM
  • 8085 kế nhiệm dùng nguồn 5V đơn và xung clock 5V đơn, đồng thời bổ sung một số tín hiệu điều khiển, nhưng vẫn cần chip hỗ trợ đặc thù

Thành lập Zilog và phát triển Z80

  • Không hài lòng với việc phê duyệt dự án 8080 bị trì hoãn và mâu thuẫn với ban lãnh đạo Intel, Faggin rời Intel cùng Ralph Ungermann, người phụ trách mảng vi xử lý, để thành lập công ty
  • Ban đầu họ cân nhắc microcontroller, nhưng cho rằng biên lợi nhuận quá thấp đối với một startup bán dẫn fabless
  • Sau đó họ quyết định thiết kế Super 80, phiên bản cải tiến của 8080, và sản phẩm này dẫn tới Zilog Z80
    • Huy động được vốn từ Exxon và cũng tuyển Shima từ Intel
    • Nhóm phụ trách layout, mô phỏng phần mềm và các việc khác mở rộng lên tổng cộng 11 người
  • Mục tiêu là duy trì tương thích nhị phân với 8080 đồng thời bổ sung thanh ghi, phương thức định địa chỉ và lệnh, cũng như phản ánh các đặc điểm của những bộ xử lý cùng thời như 6800
    • Tốc độ nhanh hơn 8080 và kết nối điện đơn giản cũng là mục tiêu
  • Đến nguyên mẫu hoạt động đầu tiên tốn khoảng 400.000 USD, đáp ứng tiến độ với chi phí thấp hơn ngân sách 500.000 USD huy động từ Exxon
  • Việc sản xuất phụ thuộc vào Mostek sau mâu thuẫn với Synertek, đối tác hợp đồng ban đầu
    • Sau đó, nhờ khoản đầu tư bổ sung từ Exxon, Zilog xây dựng fab riêng nhưng vẫn tiếp tục cung ứng Z80 từ nhiều nguồn

Mở rộng trong kiến trúc Z80

  • Z80 hoàn toàn tương thích nhị phân với tập lệnh 8080
  • Bổ sung các thanh ghi chỉ mục 16-bit IX và IY, lấy cảm hứng từ 6800
    • Có thể dùng tiền tố opcode để thay thế HL, đồng thời hỗ trợ offset tức thời
  • Các cặp thanh ghi AF·BC·DE·HL có bank thay thế, cho phép chuyển đổi nhanh khi xử lý ngắt
  • Ngắt cung cấp ba chế độ
    • Chế độ 0 là phương thức tương thích 8080
    • Chế độ 1 luôn gọi một địa chỉ cố định
    • Chế độ 2 dùng giá trị trên bus làm chỉ mục để rẽ nhánh vào bảng gọi, còn một thanh ghi riêng chỉ định địa chỉ cơ sở trong bộ nhớ của bảng
  • Bổ sung các lệnh quay bit, kiểm tra bit, đặt bit, phép toán BCD, lệnh lặp dùng BC làm bộ đếm, truyền khối, so sánh khối và thao tác chuỗi
    • Có thể thay toàn bộ vòng lặp sao chép byte bằng một lệnh lặp tự thân LDIR
  • Vì Intel tuyên bố bản quyền với mnemonic assembly, Z80 áp dụng cú pháp riêng
    • Cú pháp này ghi toán hạng tường minh hơn và overload các mnemonic cơ bản, khiến dễ đọc hơn cú pháp 8080

Thiết kế bus được đơn giản hóa

  • Z80 chỉ cần nguồn 5V đơn và xung clock đơn
  • Những trạng thái mà trên 8080 mạch ngoài phải chốt và diễn giải được cung cấp trực tiếp dưới dạng tín hiệu chuyên dụng
    • MREQ và IORQ phân biệt truy cập bộ nhớ và I/O
    • RD và WR biểu thị đọc và ghi
    • M1 báo rằng truy cập bộ nhớ hiện tại là lấy lệnh
  • Có thể tạo máy tính cơ bản chỉ với mạch ở mức kết nối trực tiếp đường địa chỉ và dữ liệu, rồi dùng một 74xx138 để chọn EEPROM, RAM, UART
  • Bộ đếm refresh nội bộ xuất giá trị lên bus địa chỉ trong chu kỳ giải mã lệnh và kích hoạt đường điều khiển để xử lý refresh DRAM
  • Nếu dùng chế độ ngắt 1, có thể nối một thiết bị đơn lẻ vào chân ngắt mà không cần bộ điều khiển ngắt ngoài
    • Nhiều thiết bị có thể xử lý bằng mạch đơn giản như bộ mã hóa ưu tiên 74xx148 và chốt

Diễn biến sau Z80

  • Ngay trước khi Z80 ra mắt vào tháng 7 năm 1976, thiết kế ban đầu của Z8000 16-bit đã bắt đầu, và sản phẩm được phát hành năm 1979, sau Intel 8086 và trước Motorola 68000
  • Z8000 dùng bộ nhớ phân đoạn như 8086, nhưng xuất số segment ra bus và MMU ngoài phụ trách chuyển đổi địa chỉ tuyến tính cùng kiểm tra phạm vi và quyền
  • Tập lệnh 8086 phản ánh cả dòng dõi từ 8080 lẫn đặc điểm lệnh khối, chuỗi và vòng lặp tự lặp của Z80
  • Thiết kế MMU của Z8000 cũng ảnh hưởng đến chế độ bảo vệ 16-bit dựa trên bảng descriptor của 286

Exxon, IBM PC và sự thay đổi của Zilog

  • Zilog nhắm tới thị trường máy tính từ thời vi xử lý còn được xem là sản phẩm thay thế mạch logic, nhưng quan hệ với Exxon trở thành một trong những lý do IBM chọn Intel 8088 thay vì Zilog cho PC
  • Exxon muốn xây dựng mảng kinh doanh điện toán riêng để đối đầu IBM, và đầu tư chiến lược vào các nhà sản xuất máy đánh chữ, máy xử lý văn bản, máy in, v.v.
    • Một số công ty trong đó thiết kế sản phẩm dựa trên linh kiện Zilog, làm xói mòn thị phần sản phẩm của IBM
  • Quan hệ mật thiết với Exxon cũng gây mâu thuẫn giữa Faggin và Ungermann; Ungermann rời Zilog trước khi công ty trở thành công ty con hoàn toàn của Exxon vào năm 1980
  • Zilog lại tách khỏi Exxon năm 1989 và niêm yết năm 1991
    • Sau đó công ty nhiều lần đổi chủ giữa các quỹ cổ phần tư nhân và doanh nghiệp điện tử, hiện thuộc sở hữu của Littelfuse
  • Z80 được dùng làm bộ xử lý nhúng trong thời gian dài rồi ngừng sản xuất vào tháng 6 năm 2024

Trải nghiệm cá nhân với Z80 và ảnh hưởng dài hạn

  • Z80 cùng các 8080·8085 tương thích nhị phân đã góp phần hình thành chuẩn phần cứng trên thực tế cho microcomputer 8-bit, và trở thành nền tảng để CP/M và Microsoft BASIC trở thành chuẩn phần mềm trên thực tế
  • Z80 được sử dụng trong các máy tính cá nhân đời đầu, máy tính gia đình/cho người đam mê, cùng nhiều hệ thống nhúng và công nghiệp
    • Các bản sao và kiến trúc phái sinh cũng xuất hiện, bao gồm Sharp LR35902 của Game Boy nguyên bản
    • Sau khi từ bỏ các dòng sản phẩm phái sinh 16/32-bit, Zilog quay lại với microcontroller dựa trên Z80 như eZ80, áp dụng pipeline và clock cao
  • Cuối tuổi thiếu niên, sau khi phát hiện Z80 vẫn đang được bán trong catalog linh kiện điện tử, tác giả thiết kế một máy tính nhỏ và mượn phòng ảnh của trường vào ban đêm để ăn mòn PCB
    • Tác giả nghe các giáo viên kể về kinh nghiệm với máy tính gia đình và console cũ, cũng như một máy tính chế tạo bằng wire wrapping trong hộp Tupperware chạy CP/M·WordStar
    • Tác giả cũng nhận được linh kiện MCS-85 và các chip Z80·8085·6502·6522 để dùng trong các dự án tự làm
  • Trong quá trình đó, tác giả học được rằng reset khi bật nguồn ổn định khó hơn dự kiến, linker khó triển khai hơn assembler rất nhiều, và cá nhân cũng có thể thực sự tạo ra compiler

1 bình luận

 
Ý kiến trên Hacker News
  • Tôi bắt đầu lập trình bằng hợp ngữ vào năm 1978, và muốn hiểu không chỉ phần mềm mà cả nguyên lý hoạt động của phần cứng.
    Sau khi lắp ráp một bộ kit Z80, tôi học điện tử số bằng que dò logic và máy hiện sóng, rồi nghiền ngẫm tài liệu hướng dẫn để học tập lệnh. Giờ tôi gần 70 tuổi nhưng mọi thứ vẫn sống động như mới hôm qua; Z80 thật sự là một CPU xuất sắc.

    • Ba năm sau, tôi bắt đầu với một máy tính Radio Shack 4KB dựa trên 6809; dù đã hơn 40 năm không viết mã 6809, tôi vẫn nhớ nhiều opcode và gần đây còn giúp giải một lỗi hợp ngữ hóc búa trên retrocomputing.stackexchange.com.
      Tôi tự học bằng cách disassemble ROM và tham khảo thẻ tóm tắt của Motorola, không qua lớp học hay sách vở, nhưng sau đó đã có một sự nghiệp thành công khi lập nhiều startup. Việc học máy tính từ các nguyên lý đầu tiên ở tầng thấp nhất vẫn có giá trị không gì thay thế được.
    • Khuyến nghị Turing Complete(https://turingcomplete.game/)
      Đây là một trò chơi mô phỏng logic số, nơi bạn tạo các mạch cơ bản từ cổng NAND, kết hợp các khối chức năng và bộ giải mã lệnh để xây dựng một kiến trúc Turing-complete, rồi lập trình bằng hợp ngữ do chính bạn định nghĩa. Nếu cần opcode mới, bạn có thể tự triển khai; khó nhưng rất đáng công, trò chơi đã gần phát hành chính thức và cũng đã có trailer.
    • Z80 và 6502 đều ra đời từ những thiết kế bị từ chối trong nội bộ công ty. Ngày nay mọi thứ phức tạp hơn nhiều, nhưng tôi vẫn muốn thấy một nhà thiết kế khác tung ra thứ gì đó như FORK86-64.
    • Tôi cũng từng tự làm cả thiết bị ngoại vi gắn ngoài cho ZX81.
  • Năm 12 tuổi, tôi đã lắp ráp một máy tính Z80 từ bộ kit của chương trình TV “Klein Microcomputer Sebstgebaut und Programmiert”.
    Tôi dùng biến áp Märklin làm nguồn điện, máy ghi âm băng Telefunken làm thiết bị lưu trữ dữ liệu, nhập trò chơi tàu đổ bộ Mặt Trăng bằng mã máy Z80, rồi vì sợ mất chương trình nên không tắt nguồn suốt 2 tuần.

  • Cảm giác như quay về thập niên 1980 của ZX Spectrum; khi đó RAM 128KB là món xa xỉ khó với tới. Giờ cũng hơi giống vậy.
    https://spectrumcomputing.co.uk/entry/2000237/Book/Mastering...
    http://www.primrosebank.net/computers/zxspectrum/docs/Comple...

  • Tôi nhớ mình từng nhìn bảng tham chiếu lệnh Z80 ở cuối sách hướng dẫn ZX-81 mà chẳng hiểu gì. Khác với các tầng trừu tượng cấp cao như BASIC, phải mất khá lâu tôi mới nắm được CPU thực sự chạy chương trình như thế nào.

    • Năm 12 tuổi, chính cấu trúc đơn giản của BASIC lại giúp tôi dễ hiểu hợp ngữ Z80 hơn. Địa chỉ bộ nhớ tương ứng với số dòng, thanh ghi với biến, JP với GOTO, CALL với GOSUB, CP với IF, JP Z với THEN GOTO, và LD với LET.
    • Chiếc máy tính đầu tiên tôi mua là ZX-81 dạng kit, và tôi đã trở thành người tiên phong về công nghệ thông tin trong một thành phố nhỏ. Đó là thời mọi thứ vừa phức tạp vừa đơn giản; chỉ với 1KB RAM vẫn chạy được cả trình mô phỏng bay.
    • Tôi lần đầu tiếp xúc với máy tính qua ZX-81, và bị cuốn hút bởi cách tắt màn hình ở chế độ tốc độ cao cùng những đánh đổi thú vị giữa phần cứng và phần mềm.
  • Cách nói “Z80 hoàn toàn tương thích nhị phân với tập lệnh 8080” là không đúng nếu xét cả thanh ghi cờ. Ở một số phép toán, hành vi của cờ parity khác nhau.
    Ngoài ra, các chương trình dùng opcode chưa định nghĩa của 8080 có thể được thực thi theo cách tùy ý, nhưng Z80 đã tái sử dụng các opcode đó cho lệnh mới.

    • Việc không tương thích hoàn hảo với cờ parity là một lựa chọn khôn ngoan. Các chương trình hiện có hầu như không kiểm tra nó, và sau những lệnh có hành vi khác trên Z80 thì thực tế gần như chẳng chương trình nào kiểm tra.
      Nhờ vậy có thể tái sử dụng cờ parity làm cờ overflow, một mở rộng cực kỳ hữu ích. Datapoint 2200, Intel 8008, Intel 8080 và RISC-V là những tập lệnh hiếm hoi mà phần cứng không phát hiện overflow; khác với các thiết kế ban đầu đơn giản và rẻ tiền, RISC-V thì không có lý do bào chữa, và tôi xem đây là sai lầm lớn nhất của nó.
    • Các lệnh chưa định nghĩa không phải là một phần của tập lệnh 8080, nên việc hỗ trợ chúng thuộc về tính tương thích nhị phân với silicon 8080, chứ không phải với tập lệnh. Tuy nhiên khác biệt ở cờ parity thực sự phá vỡ tính tương thích, nên cách nói chính xác là “tương thích nhị phân với mã chỉ dựa vào tập lệnh 8080, ngoại trừ giá trị cờ parity”.
  • Đầu năm 1983, tôi bắt đầu lập trình bằng hợp ngữ Z80 trên TRS-80 Model I. Các sách của Bill Barden và loạt bài ‘The Next Step’ của Hardin Brothers trên tạp chí 80 Micro đã mở đường cho tôi; tôi đã ghi lại trải nghiệm khi đó trong bài viết này.

    • Khoảng năm 1980, khi còn là thiếu niên, tôi mua đọc những cuốn sách trong khả năng ở Radio Shack gần nhà; vì TRS-80 dùng Z80 nên tôi cũng biết đến sách Z80 của Bill Barden do Howard Sams xuất bản.
      Sách rõ ràng đến mức trẻ con cũng hiểu, tôi đọc từ đầu đến cuối; dù chưa từng chạm vào Z80 thật, nó đã tạo nền tảng để tôi hiểu không mấy khó khăn về 6502 cũng như các vi điều khiển đời đầu như 8051 và PIC. Đến giờ tôi dường như vẫn hiểu các vi xử lý hiện đại bằng cách so sánh với Z80, và tôi khuyên nên học vi xử lý 8-bit vì chúng đủ đơn giản để một người bình thường nắm được toàn bộ.
  • Tôi bắt đầu với Z80 vào thời các trình biên dịch ngôn ngữ cấp cao còn đắt đỏ, còn shareware cũng không dễ kiếm như mã nguồn mở ngày nay. Để hiểu mình đang bắt máy làm gì, ai cũng nên học một chút hợp ngữ, và Z80 đủ đơn giản để suy luận.

  • 35 năm trước, phải tự assemble chương trình bằng tay rồi nhập mã máy hệ thập lục phân vào bo mạch. Để làm việc đó tiện hơn, tôi tự viết assembler, và trải nghiệm ấy đã dẫn tôi qua lĩnh vực công cụ phát triển rồi đến công việc trên các trình biên dịch C++ lớn.

    • Vào thập niên 1980, nhiều người, trong đó có tôi, có thể đọc mã hex của lệnh Z80 dễ như hợp ngữ ký hiệu. Điều đó rất hữu ích khi reverse engineer trình thông dịch Microsoft CP/M BASIC hay trình biên dịch FORTRAN.
    • Việc đó nghe như chuyện cuối thập niên 1970, nhưng thực ra là vào năm 1991. Việc biết chính xác chương trình đang làm gì ở từng khoảnh khắc thật tuyệt, nhưng để triển khai thứ gì phức tạp thì khá cực nhọc.
    • Tức là trực tiếp chuyển hợp ngữ thành mã máy, ngôn ngữ duy nhất CPU hiểu được.
  • Bị bỏ sót là máy tính TI-84, hiện vẫn được hàng triệu học sinh Mỹ dùng và có thể lập trình bằng BASIC. Các mẫu đơn sắc dùng Z80, còn mẫu màn hình màu dùng eZ80.

    • Ở châu Âu, trường trung học cũng chỉ định mua TI-84 Plus, và nhìn việc nó vẫn được bán trong cửa hàng thì có vẻ vẫn đang được sử dụng.
      Tôi đã dành rất nhiều thời gian cùng bạn bè làm các chương trình nhỏ bằng TI-BASIC để khoe nhau, nhưng chưa học đến hợp ngữ Z80. Tôi từng in toàn bộ tài liệu hợp ngữ Z80 cho TI-84 Plus và bắt đầu đọc, nhưng vẫn chưa viết được dòng nào.
    • TI-84+ có lẽ là một trong những máy tính retro tôi thích nhất.
    • Của tôi là TI-83, không có công nghệ cao cấp đó.