{"id":117673,"date":"2015-01-28T12:10:56","date_gmt":"2015-01-28T10:10:56","guid":{"rendered":"http:\/\/mybroadband.co.za\/news\/?p=117673"},"modified":"2015-01-28T12:16:59","modified_gmt":"2015-01-28T10:16:59","slug":"smallest-ever-chess-program-487-bytes","status":"publish","type":"post","link":"https:\/\/mybroadband.co.za\/news\/gaming\/117673-smallest-ever-chess-program-487-bytes.html","title":{"rendered":"Smallest ever chess program: 487 bytes"},"content":{"rendered":"<p>BootChess is now the smallest computer implementation of chess on any platform at a size of only 487 bytes.<\/p>\n<p>BootChess was coded by Olivier Poudade, with assistance from Peter Ferrie, and is a 512-byte x86 boot sector program for Windows, Linux, OS X, DOS, BSD, DOSBox, and Bochs.<\/p>\n<p>The program beats the previous record held by the 672-byte 1K ZX Chess program, which was created by programmer David Horne.<\/p>\n<p>1K ZX Chess was first published in Your Computer Magazine in 1982 when Artic Computing started selling the program.<\/p>\n<p>Poudade wrote that 1K ZX Chess implemented most chess rules &#8211; castling, queening, and en-passant capture were missing \u2013 as well as artificial intelligence and a user interface.<\/p>\n<p>The screenshot from the February 1983 edition of Your Computer Magazine shows the code for 1K ZX Chess.<\/p>\n<div id=\"attachment_117685\" style=\"width: 610px\" class=\"wp-caption aligncenter\"><a  data-lightbox=\"post-image\" href=\"http:\/\/mybroadband.co.za\/news\/wp-content\/uploads\/2015\/01\/ZX81-Chess.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-117685\" class=\"wp-image-117685\" src=\"http:\/\/mybroadband.co.za\/news\/wp-content\/uploads\/2015\/01\/ZX81-Chess.jpg\" alt=\"1K ZX Chess\" width=\"600\" height=\"403\" srcset=\"https:\/\/mybroadband.co.za\/news\/wp-content\/uploads\/2015\/01\/ZX81-Chess.jpg 2014w, https:\/\/mybroadband.co.za\/news\/wp-content\/uploads\/2015\/01\/ZX81-Chess-596x400.jpg 596w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><p id=\"caption-attachment-117685\" class=\"wp-caption-text\">1K ZX Chess<\/p><\/div>\n<h3 class=\"my-4\">487 bytes BootChess<\/h3>\n<p>Red Sector Inc. and Poudade have significantly reduced the memory requirements of BootChess when compared to\u00a01K ZX Chess \u2013 down from 672 bytes to 487 bytes.<\/p>\n<p>The full program is provided below.<\/p>\n<blockquote>\n<pre>;----------RED-SECTOR-INC.-proudly-presents-a-33-year-old-record-:----------\r\n;                   ___ _\r\n;                  \/     \/         _____ _ _      _____ _ _        ___ _\r\n;     .::.        \/     \/         \/     \/  \/     \/     \/  \/       \/     \/\r\n;     ::::       \/     \/ ____  .-\/   _ ___\/-. .-\/   _ ___\/-.     \/     \/__\r\n;      ::       \/            \\ |    |  .    | |    |  .    |    \/        \/\r\n;      ::            __ _     \\     l  |    | |    l  |    |   \/     ___\/\r\n;     .::.    \/     \/   \/     \/     |  l    |_|    l  |    |__\/     \/ ____\r\n;    .::::.        \/ __\/            `--'           `--'            \/      |\r\n;   ::::::::                \/                               \/             |\r\n;                    ___ __    Cl!   ___ ___ \/      ___ _ _             __|\r\n;        ___ _ _    \/   __\/_ __  _ _\/      _\/_   _ \/_  \/  \/        ___ \/__\r\n;     \/_\/   \/  \/ \/ \/   \/ \/            _____\/ \/  \/ \/    __\/      _ \/   \/  \/\r\n;  .-\/     ___\/   \/     \/______         \/      ___\\    \\___    \/ \/    __\/\r\n;  |      \/      \/     \/       |     __\/ ___  |    \\       |  ___\\    \\___\r\n;  |     \/  ____               |    \/       | |   _\/       | |    \\       |\r\n;  |    \/--\/    |     ___\/     |            | |            | |   _\/       |\r\n;  |            |    \/  \/  ::  | ____\/  ::  | |  ::  \\_____| |            |\r\n;  |_____\/  ::  | __\/  \/_______|    \/_______| |_______\\      |  ::  \\_____|\r\n;       \/_______|     \/___ _       \/___ _         _ ___\\     |_______\\\r\n;      \/___ _                                                    _ ___\\\r\n; BootChess is the smallest computer implementation of chess on any platform\r\n; Chess in a 512-byte x86 boot sector for Windows \/ Linux \/ OS X \/ DOS \/ BSD\r\n; Coded by Olivier \"Baudsurfer\/RSi\" Poudade with extra help of Peter \"QKumba\"\r\n; Ferrie. Logo by Frederic \"Cleaner\/Break\" Cambus. (c)2015 WTFPL v2 license. \r\n; \"Fasm BootChess.asm\" + \"partcopy BootChess.bin 0 200 -f0\" = PC floppy boot \r\n;-BootChess.asm-------------------;-----------------------------------------\r\nx86 equ 1                         ; x86=1 PC\/emu vs. win32b\/(DOS)Box\r\nsaf equ 0                         ; saf=0 +queening -exotic failsafe \r\n_b equ byte                       ; DEFAULTS=PC FLOPPY BOOT+QUEENING\r\n_w equ word                       ; x86=1 saf=0 512b  inc.  queening \r\n_d equ dword                      ; x86=1 saf=1 500b+ excl. queening*\r\n_s equ short                      ; x86=0 saf=1 506b  inc.  queening  \r\n_n equ near                       ; x86=0 saf=0 487b  excl. queening\r\n_f equ far                        ; *only working version in Bochs\r\n    if x86                        ; beg of boot vs .com preprocessing\r\n    org 7c00h                     ; std start of bootsector after post\r\n    if saf                        ; beg clear any start ambiguous segment\r\n    jmp _f 0:fix                  ; 7c0:0000 vs. 0:7c000 cs para fix-up\r\n    end if                        ; end clear any start ambiguous segment  \r\nfix:push cs                       ; if post int 19h isr bootsrap loader \r\n    pop ds                        ; left any bda or shadow segment values \r\n    push cs                       ; then enforce ds=cs=0  \r\n    pop es                        ; then enforce es=ds=cs=0\r\n    mov aX,13h                    ; function set vga mode 320x200x256\r\n    else                          ; else if 16-bit binary assume ah=0\r\n    org 100h                      ; start of com binary program ip\r\n    mov aL,13h                    ; function set vga mode 320x200x256\r\n    end if                        ; end of boot vs .com preprocessing\r\n    int 10h                       ; standard bios video api\r\n    brd equ bf1+16                ; chess board at end of sector\r\n    mov di,brd                    ; set physical board index\r\n    mov bp,12                     ; set 6x8+8 empty sqr mid board lines\r\n    call in2                      ; pass#1 black \"rnbqkbnr\" low-caps\r\n    push word opn                 ; pass#2 hi-caps whites &amp; fall-through\r\nrle:lodsb                         ; al='.'\/al=null (fixed length rle)\r\n    mov cl,8                      ; empty sqr mid board line length\r\n    rep stosb                     ; set one empty sqr mid board line\r\n    dec bp                        ; all empty sqr mid brd lines inited ?\r\n    jnz rle                       ; if not repeat init else bp=0 assumed\r\n    mov ah,'A'-'a'                ; fall-through pass#2 white hi-caps\r\nin2:mov si,br0                    ; si points to endrank \"rnbqkbnr\" str\r\n    if x86=0                      ; if .com binary environment ch=0\r\n    mov cL,8                      ; \"rnbqkbnr\" endrank str length\r\n    else                          ; assume nothing although tempting \r\n    mov cX,8                      ; \"rnbqkbnr\" endrank str length\r\n    end if                        ; end of register ch startup value\r\nin3:lodsb                         ; read physical board str car\r\n    add al,ah                     ; hi-caps rank 1 \/ low-caps rank 8\r\n    stosb                         ; write physical board str car\r\n    loop in3                      ; all \"rnbqkbnr\" str car written ?\r\n    mov cl,8                      ; si-;equiv piece vals di-;0x88 brd\r\n    rep movsb                     ; write logical 0x88 board str vals\r\n    retn                          ; return to callers\r\nge0:mov bx,di                     ; physical board idx (bx=brd)\r\n    mov dh,'1'                    ; beg white move src rank\r\nge1:mov dl,'h'                    ; beg white move src file\r\nge2:mov [si],dx                   ; beg white move src str\r\n    mov ch,'1'                    ; beg white move dst rank\r\nge3:mov cl,'h'                    ; beg white move dst file\r\nge4:mov [si+2],cx                 ; beg white move dst str\r\n    pusha                         ; save all values\r\n    call idx                      ; passive chess coords to linear indexes\r\n    jbe  mis                      ; white move src color not conforming\r\n    push bx                       ; save white move dst idx\r\n    call ver                      ; white move legal chess ?\r\n    pop bx                        ; restore white move dst idx\r\n    jc mis                        ; white move not legal chess\r\n    mov di,num+3                  ; compare move destination rank in 7dfeh \r\n    inc si                        ; with move source rank in 7dfch \r\n    cmpsb                         ; is taxi distance to topmost bettered ? \r\n    jnc wor                       ; else not getting closer to black king\r\n    cmp _b [di],'?'               ; does any fallback move exist yet ?\r\n    jz lkj                        ; no, then last valid move good enough\r\nwor:mov aL,_b[si+bx+brd-num-'a'+6]; yes, previous valid legal exist so \r\n    dec aL                        ; only override if it's a capture \r\n    js mis                        ; no, don't want worse taxi distance  \r\n    mov bx,fs                     ; it's a capture with piece value=al\r\n    cmp bL,aL                     ; but hightest capture value yet ?\r\n    jnc mis                       ; no, less important opponent piece \r\nmax:mov fs,bx                     ; fs=best move yet in taxi half-ply\r\nlkj:dec si                        ; realign source index \r\n    dec si                        ; to copy dword bst=dword idx \r\n    movsd                         ; after 4096 tries : move=dword bst\r\nmis:popa                          ; restore all values\r\n    cmp cl,'a'                    ; end white move dst file ?\r\n    loopnz ge4                    ; dec white move else next dst file\r\n    inc ch                        ; inc white move dst rank\r\n    cmp ch,'9'                    ; end white move dst rank ?\r\n    jnz ge3                       ; else next move dst rank\r\ncpx:inc bx                        ; inc physical board index\r\n    dec dx                        ; dec white move src file\r\n    cmp dl,'`'                    ; end white move src file ?\r\n    jnz ge2                       ; else next move src file\r\n    inc dh                        ; inc white move src rank\r\n    cmp dh,ch                     ; end white move src rank ? ch=9\r\n    jnz ge1                       ; else next move src rank\r\n    push _d [si+4]                ; get best white move found\r\n    pop _d [si]                   ; set it as final white move\r\nval:mov cl,'.'                    ; valid : empty sqr replaces src piece\r\n    call act                      ; active chess coords to linear indexes\r\n    xor bp,3                      ; player turn and pawn unidir. delta\r\n    jz ge0                        ; white turn to play (case best=0)\r\nbla:mov al,'?'                    ; input str clear pattern\r\n    mov di,si                     ; input str clear pattern (di=num)\r\n    mov cx,8                      ; input str clear pattern\r\n    rep stosb                     ; input str clear pattern (di=brd)\r\n    call key                      ; get user keyboard input\r\n    jbe bla                       ; black move src color not conforming\r\nopn:call ver                      ; di=brd, black move legal chess ?\r\n    jc bla                        ; white move not legal chess\r\n    jmp _s  val                   ; validate black move\r\nver:call idx                      ; get lin indexes \/w implicit passive\r\n    xchg bx,dx                    ; switch bx=dst idx dx=src idx\r\n    mov ah,[si+bx+brd-num-'a'+8]  ; get piece logical 0x88 brd val...\r\n    mov dh,bl                     ; dh=src idx dl=dst idx\r\n    sub dx,\"aa\"                   ; get move file zero-based indexes\r\n    bsr bx,ax                     ; scan for 1st bit set (si=idx+10)\r\n    movsx bx,[si+bx-10-num+tab]   ; bl=moved piece type idx (bh=0)\r\n    mov cx,_w [si+bx-num+tab]     ; piece type deltas cl=repeats ch=num\r\n    sahf                          ; set piece logical 0x88 brd val  \r\n    jnp sp1                       ; branch if piece not pawn (bit#4!=1)\r\n    jc sp2                        ; branch if pawn prev moved (bit#0=1)\r\nsp1:jns sp3                       ; branch if piece not king (bit#7!=1)\r\nsp2:mov cl,1                      ; override repeat if piece pawn or king\r\nsp3:jnp sp4                       ; branch if piece not pawn (bit#4!=1)\r\n    add bx,bp                     ; pawn player turn unidirection mutex\r\nsp4:inc bx                        ; advance piece type struct field ptr\r\n    and ah,11111100b              ; isolate piece bitmask only \r\nvl1:push cx                       ; save piece type deltas\r\n    mov al,dh                     ; load start dst idx val\r\n    inc bx                        ; advance piece type struct field ptr\r\nvl2:add al,[si+bx-num+tab]        ; add this piece delta to dst idx val\r\n    xchg aL,bL                    ; base reg=dst idx val and preserved\r\n    mov ch,[si+bx+brd-num+8]      ; read projected dst square val\r\n    xchg aL,bL                    ; base reg=piece type struct field ptr\r\n    cmp al,dl                     ; wanted move found (src+delta(s)=dst) ?\r\n    jnz dif                       ; different than requested move\r\nsam:sahf                          ; get piece logical 0x88 brd val in flgs\r\n    jnp yes                       ; branch if piece is not pawn (bit#2=0)\r\n    test [si+bx-num+tab],1        ; pawn piece delta parity=diag vs. vert\r\n    jz ord                        ; branch if pawn piece moving vert\r\n    test ch,ch                    ; pawn piece vert move=;eating ?\r\n    jnz yes                       ; capturing verify dst sqr not empty\r\n    jmp _s bad                    ; else illegal chess move is a miss\r\nord:test ch,ch                    ; pawn piece vert move=;no eating ?\r\n    jz yes                        ; no eating=;empty dst sqr else illegal\r\ndif:sahf                          ; store piece nature in flags register\r\n    jnp skp                       ; not pawn piece so skip direction test\r\n    test [si+bx-num+tab],1        ; pawn piece delta parity=diag vs. vert\r\n    jnz bad                       ; diagonal pawn move is illegal\r\nskp:test ch,ch                    ; else skipping over dst square val ?\r\n    jnz bad                       ; projected dst sqr val is not empty\r\n    sahf                          ; get piece logical 0x88 brd val in flgs\r\n    jz x88                        ; branch if piece is queen (bit#6=1)\r\n    jna bad                       ; branch if piece is not knight(bit#4=0)\r\nx88:test al,88h                   ; ch=0 dst out of physical board limits?\r\n    loopz vl2                     ; else cont if delta repeats remain\r\nbad:pop cx                        ; restore piece type deltas\r\n    dec ch                        ; all possible delta nums verified ?\r\n    jnz vl1                       ; if not then cont next delta type\r\nnok:stc                           ; else return \/w no match flg set\r\n    retn                          ; return to caller\r\nyes:pop cx                        ; correct entry sp and disregard count\r\n    retn                          ; return to caller(s)\r\nkey:call prt                      ; refresh screen to account input echo\r\n    xor bx,bx                     ; bx=str idx=odd\/even\/alpha\/num mutex\r\nkbd:cbw                           ; fun blocking wait for keystroke (ah=0)\r\n    int 16h                       ; std bios keybd api (ah=scan al=ascii)\r\nesc:dec ah                        ; was esc key pressed to quit ?\r\n    jnz car                       ; else default process key input\r\nxit:if x86                        ; if x86 boot context environment\r\n    int 19h                       ; exit through bootstrap to reboot cpu\r\n    else                          ; else if .com 16-bit binary\r\n    int 20h                       ; dos 1+ - terminate program\r\n    end if                        ; end of exit methods (os load or shell)\r\ncar:mov [bx+si],al                ; sav ascii val to move string (si=num)\r\nprt:pusha                         ; save game state snapshot\r\n    cwd                           ; curs location dx=(0,0)=(row,column)\r\n    mov ax,1301h                  ; function ega write str write mode 1\r\n    mov bl,7                      ; page 0 grey car attrib matching tty\r\n    mov cl,8                      ; src str lngth (curs updated horiz)\r\n    mov bp,bf1                    ; es:bp is \"abcdefgh\" ptr\r\nlns:int 10h                       ; standard bios video api\r\n    add bp,16                     ; bp=para step siz separating strings\r\n    push ax                       ; save old bios video api func params\r\n    mov ax,0e39h                  ; function teletype outp car=rank '9'\r\n    sub al,dh                     ; decrement right handside rank value\r\n    int 10h                       ; standard bios video api\r\n    pop ax                        ; restore old bios video api fx params\r\n    cmp dh,cl                     ; src str total (curs updated vert)\r\n    inc dh                        ; preemptive off-by-one allows 9 verts\r\n    jc lns                        ; all 9 brd gui row strings printed ?\r\n    mov bp,si                     ; 10th row tail bp=move coords, cl=8\r\n    int 10h                       ; standard bios video api\r\n    popa                          ; restore game state snapshot\r\n    inc bx                        ; test if any more keys ?\r\n    cmp bl,4                      ; frFR format input string\r\n    jc kbd                        ; else continue input \r\nidx:loop idx                      ; ch=0 passive call load src\/dst lin idx\r\nact:mov si,num                    ; reinit si to point to coord input str.\r\n    mov bx,[si]                   ; bx=src coord (pass#1)\r\n    cbw                           ; empty sqr val in logical 0x88 board\r\n    call put                      ; place param passed as fun pass#1\r\n    mov dx,[si+2]                 ; bx=dst idx dx=src idx\r\n    xchg bx,dx                    ; fall-through for second pass\r\n    push word mat                 ; test for checkmate and conforming\r\nput:xchg ax,bx                    ; bx|dx=[num+di]+16*((8-'0')-[num+di+1])\r\n    aad -10h                      ; shl ah,4\/sub al,ah\/xor ah,ah\r\n    add al,80h                    ; bx|dx=al-640%256-16*ah\r\n    xchg ax,bx                    ; bx|dx=al+128-16*ah\r\n    jcxz sim                      ; active call request or simulation ?\r\n    if saf=0                      ; standard non-failsafe queening\r\n    cmp _b [si+3],'8'             ; validated dst rank is top-most ?    \r\n    jz qq                         ; if so then promote pawn to queen\r\n    cmp _b [si+3],'1'             ; validated dst rank is bottom-most ?\r\n    jnz prm                       ; if not no pawn queening promotion\r\nqq: sahf                          ; store piece nature in flag register\r\n    jnp prm                       ; no pawn queening promotion  \r\n    xor ah,01000110b              ; transform p to promoted queen\r\n    inc cx                        ; queen promotion p2q or P2Q\r\n    end if                        ; end of conditional queening\r\nprm:xchg ah,[si+bx+brd-num-'a'+8] ; update piece logical 0x88 board val\r\n    xchg cl,[si+bx+brd-num-'a']   ; update piece physical board ascii val\r\n    or ah,1                       ; update piece moved once (bit#0)\r\nsim:retn                          ; return to caller(s)\r\nmat:sahf                          ; catured piece king and mate ?\r\n    js xit                        ; if piece is king then game is over\r\n    call chk                      ; move src color conforming ?\r\n    jnz nok                       ; move src color not conforming\r\nchk:xchg bx,dx                    ; src idx &lt;- dst idx\r\n    mov al,[si+bx+brd-num-'a']    ; pass#1:src idx pass#2:dst idx di=brd\r\n    xor _b [si+len-num],8         ; self-modif 8\/26 val=[1;8]\/[a(A);z(Z)]\r\n    mov cl,-'a'                   ; assert black piece car interval\r\n    test bp,bp                    ; test whose turn it is to play\r\n    jnz lim                       ; assert white piece car interval\r\n    mov cl,-'A'                   ; al=ascii value cl=-(lower boundery)\r\nlim:xadd al,cl                    ; tmp=al+cl cl=al al=tmp +fall-trough\r\n    db 0d4h                       ; aam &lt;self-modified value&gt;\r\nlen:db 12h                        ; ah=al\/8 al%=8\r\n    mov al,cl                     ; al=restored ascii value\r\n    test ah,ah                    ; set\/clear zf=0 success zf=1 failure\r\n    retn                          ; return to caller(s) nb: destroys ah\r\ntab db p-tab,r-tab,n-tab,b-tab    ; piece type mov offset array\r\n    db q-tab,q-tab                ; note original 1K ZX Chess q=k trick\r\nbr0 db \"rnbqkbnr\",8,16,32,64,128  ; end rank pattern + beg piece values\r\n    db 32,16,8,'p',4,'.',0,'.',0  ; end piece values + beg mid board reps\r\n    db '.',0,'.',0,'P',4          ; ... end mid board reps\r\np   db 2,3,-10h,-15,-17,10h,15    ; bit#2 pf=04 p[6]=r[0] overlay\r\nr   db 17,4,10h,-1h,-10h          ; bit#3 ??=08 r[5]=n[0] overlay\r\nn   db 1,8,1fh,21h,12h,-0eh,-1fh  ; bit#4 af=16 n[9]=b[0] overlay\r\n    db -21h,-12h                  ; ... end of knight moves list\r\nb   db 0eh,4,-0fh,11h,-11h        ; bit#5 ??=32 b[5]=q[0] overlay\r\nq   db 0fh,8,10h,11h,0fh,1h,-10h  ; bit#6 zf=64 k=q except k[0]=1\r\n    db -11h,-0fh,-1h              ; ... end of queen\/king moves list\r\nbf1 db \"abcdefgh\"                 ; gui file index string\r\nnum db \"e2e4\"                     ; hardcoded Ruy Lopez opening\r\n    if saf and x86                ; x86 failsafe exotic boot environment\r\n    times 510-($-$$) db 0         ; nul padding if necessary\r\n    org 7df0h                     ; boot signature vbr\/mbr standard offset\r\n    sig db 55h,0aah               ; magic number no-endian boot signature\r\n    end if                        ; end of conditional failsafe signature<\/pre>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>BootChess has smashed the record for the smallest computer implementation for chess, held since 1983, with a total size of only 487 bytes<\/p>\n","protected":false},"author":2,"featured_media":117675,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[28549,36,28547,28553,28555,28551],"class_list":["post-117673","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gaming","tag-1k-zx-chess","tag-active","tag-chess","tag-olivier-poudade","tag-peter-ferrie","tag-your-computer-magazine"],"_links":{"self":[{"href":"https:\/\/mybroadband.co.za\/news\/wp-json\/wp\/v2\/posts\/117673"}],"collection":[{"href":"https:\/\/mybroadband.co.za\/news\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mybroadband.co.za\/news\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mybroadband.co.za\/news\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mybroadband.co.za\/news\/wp-json\/wp\/v2\/comments?post=117673"}],"version-history":[{"count":2,"href":"https:\/\/mybroadband.co.za\/news\/wp-json\/wp\/v2\/posts\/117673\/revisions"}],"predecessor-version":[{"id":117693,"href":"https:\/\/mybroadband.co.za\/news\/wp-json\/wp\/v2\/posts\/117673\/revisions\/117693"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mybroadband.co.za\/news\/wp-json\/wp\/v2\/media\/117675"}],"wp:attachment":[{"href":"https:\/\/mybroadband.co.za\/news\/wp-json\/wp\/v2\/media?parent=117673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mybroadband.co.za\/news\/wp-json\/wp\/v2\/categories?post=117673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mybroadband.co.za\/news\/wp-json\/wp\/v2\/tags?post=117673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}