Ignore:
Timestamp:
Sep 20, 2010, 5:40:16 PM (9 years ago)
Author:
mulligan
Message:

Fixed physical interface file. Refactoring ASMInterface.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Deliverables/D4.1/ASMInterpret.ml

    r91 r92  
    11open BitVectors;;
     2open ASM;;
    23open Physical;;
    34
     
    8384
    8485let get_cy_flag status =
    85   let (cy,_,_,_),_ = status.psw in cy
     86  let [cy;_;_;_;_;_;_;_] = to_bits status.psw in cy
    8687let get_ac_flag status =
    87   let (_,ac,_,_),_ = status.psw in ac
     88  let [_;ac;_;_;_;_;_;_] = to_bits status.psw in ac
    8889let get_fo_flag status =
    89   let (_,_,fo,_),_ = status.psw in fo
     90  let [_;_;fo;_;_;_;_;_] = to_bits status.psw in fo
    9091let get_rs1_flag status =
    91   let (_,_,_,rs1),_ = status.psw in rs1
     92  let [_;_;_;rs1;_;_;_;_] = to_bits status.psw in rs1
    9293let get_rs0_flag status =
    93   let _,(rs0,_,_,_) = status.psw in rs0
     94  let [_;_;_;_;rs0;_;_;_] = to_bits status.psw in rs0
    9495let get_ov_flag status =
    95   let _,(_,ov,_,_) = status.psw in ov
     96  let [_;_;_;_;_;ov;_;_] = to_bits status.psw in ov
    9697let get_ud_flag status =
    97   let _,(_,_,ud,_) = status.psw in ud
     98  let [_;_;_;_;_;_;ud;_] = to_bits status.psw in ud
    9899let get_p_flag status =
    99   let _,(_,_,_,p) = status.psw in p
     100  let [_;_;_;_;_;_;_;p] = to_bits status.psw in p
    100101
    101102(* timings taken from SIEMENS *)
    102103
    103104let fetch pmem pc =
    104  let next pc = pc ++ 1, WordMap.find pc pmem in
     105 let next pc =
     106   let (carry, res) = half_add pc (vect_of_int 1 `Sixteen) in
     107     res, WordMap.find pc pmem
     108 in
    105109 let instr = WordMap.find pc pmem in
    106  let pc = pc ++ 1 in
     110 let cy, pc = half_add pc (vect_of_int 1 `Sixteen) in
     111 let (un, ln) = from_byte instr in
     112 let bits = (from_nibble un, from_nibble ln) in
    107113 try
    108   match instr with
     114  match bits with
    109115     (a10,a9,a8,true),(false,false,false,true) ->
    110116      let pc,b1 = next pc in
    111        ACALL (`ADDR11 (a10,a9,a8,b1)), pc, 2
     117       ACALL (`ADDR11 (mk_word11 a10 a9 a8 b1)), pc, 2
    112118   | (false,false,true,false),(true,r1,r2,r3) ->
    113119      ADD (`A,`REG (r1,r2,r3)), pc, 1
     
    132138   | (a10,a9,a8,false),(false,false,false,true) ->
    133139      let pc,b1 = next pc in
    134        AJMP (`ADDR11 (a10,a9,a8,b1)), pc, 2
     140       AJMP (`ADDR11 (mk_word11 a10 a9 a8 b1)), pc, 2
    135141   | (false,true,false,true),(true,r1,r2,r3) ->
    136142      ANL (`U1 (`A, `REG (r1,r2,r3))), pc, 1
     
    246252       let pc,b1 = next pc in
    247253       let pc,b2 = next pc in
    248          LCALL (`ADDR16 (b1,b2)), pc, 2
     254         LCALL (`ADDR16 (mk_word b1 b2)), pc, 2
    249255   | (false,false,false,false),(false,false,true,false) ->
    250256       let pc,b1 = next pc in
    251257       let pc,b2 = next pc in
    252          LJMP (`ADDR16 (b1,b2)), pc, 2
     258         LJMP (`ADDR16 (mk_word b1 b2)), pc, 2
    253259   | (true,true,true,false),(true,r1,r2,r3) ->
    254260         MOV (`U1 (`A, `REG(r1,r2,r3))), pc, 1
     
    303309       let pc,b1 = next pc in
    304310       let pc,b2 = next pc in
    305          MOV (`U4 (`DPTR, `DATA16(b1,b2))), pc, 2
     311         MOV (`U4 (`DPTR, `DATA16(mk_word b1 b2))), pc, 2
    306312   | (true,false,false,true),(false,false,true,true) ->
    307313         MOVC (`A, `A_DPTR), pc, 2
     
    411417;;
    412418
     419let lift a f g =
     420  let (x, y) = f a in
     421    (g x, g x)
     422
    413423let assembly1 =
    414424 function
    415     ACALL (`ADDR11 (a10,a9,a8,b1)) ->
    416      [(a10,a9,a8,true),(false,false,false,true); b1]
     425    ACALL (`ADDR11 w) ->
     426      let (a10,a9,a8,b1) = from_word11 w in
     427        [(a10,a9,a8,true),(false,false,false,true); lift b1 from_byte from_nibble]
    417428  | ADD (`A,`REG (r1,r2,r3)) ->
    418429     [(false,false,true,false),(true,r1,r2,r3)]
    419430  | ADD (`A, `DIRECT b1) ->
    420      [(false,false,true,false),(false,true,false,true); b1]
     431     [(false,false,true,false),(false,true,false,true); lift b1 from_byte from_nibble]
    421432  | ADD (`A, `INDIRECT i1) ->
    422433     [(false,false,true,false),(false,true,true,i1)]
    423434  | ADD (`A, `DATA b1) ->
    424      [(false,false,true,false),(false,true,false,false); b1]
     435     [(false,false,true,false),(false,true,false,false); lift b1 from_byte from_nibble]
    425436  | ADDC (`A, `REG(r1,r2,r3)) ->
    426437     [(false,false,true,true),(true,r1,r2,r3)]
    427438  | ADDC (`A, `DIRECT b1) ->
    428      [(false,false,true,true),(false,true,false,true); b1]
     439     [(false,false,true,true),(false,true,false,true); lift b1 from_byte from_nibble]
    429440  | ADDC (`A,`INDIRECT i1) ->
    430441     [(false,false,true,true),(false,true,true,i1)]
    431442  | ADDC (`A,`DATA b1) ->
    432      [(false,false,true,true),(false,true,false,false); b1]
    433   | AJMP (`ADDR11 (a10,a9,a8,b1)) ->
    434      [(a10,a9,a8,false),(false,false,false,true)]
     443     [(false,false,true,true),(false,true,false,false); lift b1 from_byte from_nibble]
     444  | AJMP (`ADDR11 w) ->
     445     let (a10,a9,a8,b1) = from_word11 w in
     446       [(a10,a9,a8,false),(false,false,false,true)]
    435447  | ANL (`U1 (`A, `REG (r1,r2,r3))) ->
    436448     [(false,true,false,true),(true,r1,r2,r3)]
    437449  | ANL (`U1 (`A, `DIRECT b1)) ->
    438      [(false,true,false,true),(false,true,false,true); b1]
     450     [(false,true,false,true),(false,true,false,true); lift b1 from_byte from_nibble]
    439451  | ANL (`U1 (`A, `INDIRECT i1)) ->
    440452     [(false,true,false,true),(false,true,true,i1)]
    441453  | ANL (`U1 (`A, `DATA b1)) ->
    442      [(false,true,false,true),(false,true,false,false); b1]
     454     [(false,true,false,true),(false,true,false,false); lift b1 from_byte from_nibble]
    443455  | ANL (`U2 (`DIRECT b1,`A)) ->
    444      [(false,true,false,true),(false,false,true,false); b1]
     456     [(false,true,false,true),(false,false,true,false); lift b1 from_byte from_nibble]
    445457  | ANL (`U2 (`DIRECT b1,`DATA b2)) ->
    446      [(false,true,false,true),(false,false,true,true); b1; b2]
     458     [(false,true,false,true),(false,false,true,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    447459  | ANL (`U3 (`C,`BIT b1)) ->
    448      [(true,false,false,false),(false,false,true,false);  b1]
     460     [(true,false,false,false),(false,false,true,false); lift b1 from_byte from_nibble]
    449461  | ANL (`U3 (`C,`NBIT b1)) ->
    450     [(true,false,true,true),(false,false,false,false);  b1]
     462    [(true,false,true,true),(false,false,false,false); lift b1 from_byte from_nibble]
    451463  | CJNE (`U1 (`A, `DIRECT b1), `REL b2) ->
    452     [(true,false,true,true),(false,true,false,true); b1; b2]
     464    [(true,false,true,true),(false,true,false,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    453465  | CJNE (`U1 (`A, `DATA b1), `REL b2) ->
    454     [(true,false,true,true),(false,true,false,false); b1; b2]
     466    [(true,false,true,true),(false,true,false,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    455467  | CJNE (`U2 (`REG(r1,r2,r3), `DATA b1), `REL b2) ->
    456     [(true,false,true,true),(true,r1,r2,r3); b1; b2]
     468    [(true,false,true,true),(true,r1,r2,r3); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    457469  | CJNE (`U2 (`INDIRECT i1, `DATA b1), `REL b2) ->
    458     [(true,false,true,true),(false,true,true,i1); b1; b2]
     470    [(true,false,true,true),(false,true,true,i1); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    459471  | CLR `A ->
    460472    [(true,true,true,false),(false,true,false,false)]
     
    462474    [(true,true,false,false),(false,false,true,true)]
    463475  | CLR (`BIT b1) ->
    464     [(true,true,false,false),(false,false,true,false);  b1]
     476    [(true,true,false,false),(false,false,true,false); lift b1 from_byte from_nibble]
    465477  | CPL `A ->
    466478    [(true,true,true,true),(false,true,false,false)]
     
    468480    [(true,false,true,true),(false,false,true,true)]
    469481  | CPL (`BIT b1) ->
    470     [(true,false,true,true),(false,false,true,false); b1]
     482    [(true,false,true,true),(false,false,true,false); lift b1 from_byte from_nibble]
    471483  | DA `A ->
    472484    [(true,true,false,true),(false,true,false,false)]
     
    476488    [(false,false,false,true),(true,r1,r2,r3)]
    477489  | DEC (`DIRECT b1) ->
    478     [(false,false,false,true),(false,true,false,true); b1]
     490    [(false,false,false,true),(false,true,false,true); lift b1 from_byte from_nibble]
    479491  | DEC (`INDIRECT i1) ->
    480492    [(false,false,false,true),(false,true,true,i1)]
     
    482494    [(true,false,false,false),(false,true,false,false)]
    483495  | DJNZ (`REG(r1,r2,r3), `REL b1) ->
    484     [(true,true,false,true),(true,r1,r2,r3); b1]
     496    [(true,true,false,true),(true,r1,r2,r3); lift b1 from_byte from_nibble]
    485497  | DJNZ (`DIRECT b1, `REL b2) ->
    486     [(true,true,false,true),(false,true,false,true); b1; b2]
     498    [(true,true,false,true),(false,true,false,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    487499  | INC `A ->
    488500    [(false,false,false,false),(false,true,false,false)]
     
    490502    [(false,false,false,false),(true,r1,r2,r3)]
    491503  | INC (`DIRECT b1) ->
    492     [(false,false,false,false),(false,true,false,true); b1]
     504    [(false,false,false,false),(false,true,false,true); lift b1 from_byte from_nibble]
    493505  | INC (`INDIRECT i1) ->
    494506    [(false,false,false,false),(false,true,true,i1)]
     
    496508    [(true,false,true,false),(false,false,true,true)]
    497509  | JB (`BIT b1, `REL b2) ->
    498     [(false,false,true,false),(false,false,false,false);  b1; b2]
     510    [(false,false,true,false),(false,false,false,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    499511  | JBC (`BIT b1, `REL b2) ->
    500     [(false,false,false,true),(false,false,false,false);  b1; b2]
     512    [(false,false,false,true),(false,false,false,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    501513  | JC (`REL b1) ->
    502     [(false,true,false,false),(false,false,false,false); b1]
     514    [(false,true,false,false),(false,false,false,false); lift b1 from_byte from_nibble]
    503515  | JMP `IND_DPTR ->
    504516    [(false,true,true,true),(false,false,true,true)]
    505517  | JNB (`BIT b1, `REL b2) ->
    506     [(false,false,true,true),(false,false,false,false);  b1; b2]
     518    [(false,false,true,true),(false,false,false,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    507519  | JNC (`REL b1) ->
    508     [(false,true,false,true),(false,false,false,false); b1]
     520    [(false,true,false,true),(false,false,false,false); lift b1 from_byte from_nibble]
    509521  | JNZ (`REL b1) ->
    510     [(false,true,true,true),(false,false,false,false); b1]
     522    [(false,true,true,true),(false,false,false,false); lift b1 from_byte from_nibble]
    511523  | JZ (`REL b1) ->
    512     [(false,true,true,false),(false,false,false,false); b1]
    513   | LCALL (`ADDR16 (b1,b2)) ->
    514     [(false,false,false,true),(false,false,true,false); b1; b2]
    515   | LJMP (`ADDR16 (b1,b2)) ->
    516     [(false,false,false,false),(false,false,true,false); b1; b2]
     524    [(false,true,true,false),(false,false,false,false); lift b1 from_byte from_nibble]
     525  | LCALL (`ADDR16 w) ->
     526      let (b1,b2) = from_word w in
     527        [(false,false,false,true),(false,false,true,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
     528  | LJMP (`ADDR16 w) ->
     529      let (b1,b2) = from_word w in
     530        [(false,false,false,false),(false,false,true,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    517531  | MOV (`U1 (`A, `REG(r1,r2,r3))) ->
    518532    [(true,true,true,false),(true,r1,r2,r3)]
    519533  | MOV (`U1 (`A, `DIRECT b1)) ->
    520     [(true,true,true,false),(false,true,false,true); b1]
     534    [(true,true,true,false),(false,true,false,true); lift b1 from_byte from_nibble]
    521535  | MOV (`U1 (`A, `INDIRECT i1)) ->
    522536    [(true,true,true,false),(false,true,true,i1)]
    523537  | MOV (`U1 (`A, `DATA b1)) ->
    524     [(false,true,true,true),(false,true,false,false); b1]
     538    [(false,true,true,true),(false,true,false,false); lift b1 from_byte from_nibble]
    525539  | MOV (`U2 (`REG(r1,r2,r3), `A)) ->
    526540    [(true,true,true,true),(true,r1,r2,r3)]
    527541  | MOV (`U2 (`REG(r1,r2,r3), (`DIRECT b1))) ->
    528     [(true,false,true,false),(true,r1,r2,r3); b1]
     542    [(true,false,true,false),(true,r1,r2,r3); lift b1 from_byte from_nibble]
    529543  | MOV (`U2 (`REG(r1,r2,r3), (`DATA b1))) ->
    530     [(false,true,true,true),(true,r1,r2,r3); b1]
     544    [(false,true,true,true),(true,r1,r2,r3); lift b1 from_byte from_nibble]
    531545  | MOV (`U3 (`DIRECT b1, `A)) ->
    532     [(true,true,true,true),(false,true,false,true); b1]
     546    [(true,true,true,true),(false,true,false,true); lift b1 from_byte from_nibble]
    533547  | MOV (`U3 (`DIRECT b1, `REG(r1,r2,r3))) ->
    534     [(true,false,false,false),(true,r1,r2,r3); b1]
     548    [(true,false,false,false),(true,r1,r2,r3); lift b1 from_byte from_nibble]
    535549  | MOV (`U3 (`DIRECT b1, `DIRECT b2)) ->
    536     [(true,false,false,false),(false,true,false,true); b1; b2]
     550    [(true,false,false,false),(false,true,false,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    537551  | MOV (`U3 (`DIRECT b1, `INDIRECT i1)) ->
    538     [(true,false,false,false),(false,true,true,i1); b1]
     552    [(true,false,false,false),(false,true,true,i1); lift b1 from_byte from_nibble]
    539553  | MOV (`U3 (`DIRECT b1, `DATA b2)) ->
    540     [(false,true,true,true),(false,true,false,true); b1; b2]
     554    [(false,true,true,true),(false,true,false,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    541555  | MOV (`U2 (`INDIRECT i1, `A)) ->
    542556    [(true,true,true,true),(false,true,true,i1)]
    543557  | MOV (`U2 (`INDIRECT i1, `DIRECT b1)) ->
    544     [(true,false,true,false),(false,true,true,i1); b1]
     558    [(true,false,true,false),(false,true,true,i1); lift b1 from_byte from_nibble]
    545559  | MOV (`U2 (`INDIRECT i1, `DATA b1)) ->
    546     [(false,true,true,true),(false,true,true,i1); b1]
     560    [(false,true,true,true),(false,true,true,i1); lift b1 from_byte from_nibble]
    547561  | MOV (`U5 (`C, `BIT b1)) ->
    548     [(true,false,true,false),(false,false,true,false);  b1]
     562    [(true,false,true,false),(false,false,true,false); lift b1 from_byte from_nibble]
    549563  | MOV (`U6 (`BIT b1, `C)) ->
    550     [(true,false,false,true),(false,false,true,false);  b1]
    551   | MOV (`U4 (`DPTR, `DATA16(b1,b2))) ->
    552     [(true,false,false,true),(false,false,false,false); b1; b2]
     564    [(true,false,false,true),(false,false,true,false); lift b1 from_byte from_nibble]
     565  | MOV (`U4 (`DPTR, `DATA16 w)) ->
     566    let (b1,b2) = from_word w in
     567      [(true,false,false,true),(false,false,false,false); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    553568  | MOVC (`A, `A_DPTR) ->
    554569    [(true,false,false,true),(false,false,true,true)]
     
    570585    [(false,true,false,false),(true,r1,r2,r3)]
    571586  | ORL (`U1(`A, `DIRECT b1)) ->
    572     [(false,true,false,false),(false,true,false,true); b1]
     587    [(false,true,false,false),(false,true,false,true); lift b1 from_byte from_nibble]
    573588  | ORL (`U1(`A, `INDIRECT i1)) ->
    574589    [(false,true,false,false),(false,true,true,i1)]
    575590  | ORL (`U1(`A, `DATA b1)) ->
    576     [(false,true,false,false),(false,true,false,false); b1]
     591    [(false,true,false,false),(false,true,false,false); lift b1 from_byte from_nibble]
    577592  | ORL (`U2(`DIRECT b1, `A)) ->
    578     [(false,true,false,false),(false,false,true,false); b1]
     593    [(false,true,false,false),(false,false,true,false); lift b1 from_byte from_nibble]
    579594  | ORL (`U2 (`DIRECT b1, `DATA b2)) ->
    580     [(false,true,false,false),(false,false,true,true); b1; b2]
     595    [(false,true,false,false),(false,false,true,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    581596  | ORL (`U3 (`C, `BIT b1)) ->
    582     [(false,true,true,true),(false,false,true,false);  b1]
     597    [(false,true,true,true),(false,false,true,false); lift b1 from_byte from_nibble]
    583598  | ORL (`U3 (`C, `NBIT b1)) ->
    584     [(true,false,true,false),(false,false,false,false);  b1]
     599    [(true,false,true,false),(false,false,false,false); lift b1 from_byte from_nibble]
    585600  | POP (`DIRECT b1) ->
    586     [(true,true,false,true),(false,false,false,false); b1]
     601    [(true,true,false,true),(false,false,false,false); lift b1 from_byte from_nibble]
    587602  | PUSH (`DIRECT b1) ->
    588     [(true,true,false,false),(false,false,false,false); b1]
     603    [(true,true,false,false),(false,false,false,false); lift b1 from_byte from_nibble]
    589604  | RET ->
    590605    [(false,false,true,false),(false,false,true,false)]
     
    602617    [(true,true,false,true),(false,false,true,true)]
    603618  | SETB (`BIT b1) ->
    604     [(true,true,false,true),(false,false,true,false);  b1]
     619    [(true,true,false,true),(false,false,true,false); lift b1 from_byte from_nibble]
    605620  | SJMP (`REL b1) ->
    606     [(true,false,false,false),(false,false,false,false); b1]
     621    [(true,false,false,false),(false,false,false,false); lift b1 from_byte from_nibble]
    607622  | SUBB (`A, `REG(r1,r2,r3)) ->
    608623    [(true,false,false,true),(true,r1,r2,r3)]
    609624  | SUBB (`A, `DIRECT b1) ->
    610     [(true,false,false,true),(false,true,false,true); b1]
     625    [(true,false,false,true),(false,true,false,true); lift b1 from_byte from_nibble]
    611626  | SUBB (`A, `INDIRECT i1) ->
    612627    [(true,false,false,true),(false,true,true,i1)]
    613628  | SUBB (`A, `DATA b1) ->
    614     [(true,false,false,true),(false,true,false,false); b1]
     629    [(true,false,false,true),(false,true,false,false); lift b1 from_byte from_nibble]
    615630  | SWAP `A ->
    616631    [(true,true,false,false),(false,true,false,false)]
     
    618633    [(true,true,false,false),(true,r1,r2,r3)]
    619634  | XCH (`A, `DIRECT b1) ->
    620     [(true,true,false,false),(false,true,false,true); b1]
     635    [(true,true,false,false),(false,true,false,true); lift b1 from_byte from_nibble]
    621636  | XCH (`A, `INDIRECT i1) ->
    622637    [(true,true,false,false),(false,true,true,i1)]
     
    626641    [(false,true,true,false),(true,r1,r2,r3)]
    627642  | XRL(`U1(`A, `DIRECT b1)) ->
    628     [(false,true,true,false),(false,true,false,true); b1]
     643    [(false,true,true,false),(false,true,false,true); lift b1 from_byte from_nibble]
    629644  | XRL(`U1(`A, `INDIRECT i1)) ->
    630645    [(false,true,true,false),(false,true,true,i1)]
    631646  | XRL(`U1(`A, `DATA b1)) ->
    632     [(false,true,true,false),(false,true,false,false); b1]
     647    [(false,true,true,false),(false,true,false,false); lift b1 from_byte from_nibble]
    633648  | XRL(`U2(`DIRECT b1, `A)) ->
    634     [(false,true,true,false),(false,false,true,false); b1]
     649    [(false,true,true,false),(false,false,true,false); lift b1 from_byte from_nibble]
    635650  | XRL(`U2(`DIRECT b1, `DATA b2)) ->
    636     [(false,true,true,false),(false,false,true,true); b1; b2]
     651    [(false,true,true,false),(false,false,true,true); lift b1 from_byte from_nibble; lift b2 from_byte from_nibble]
    637652;;
    638653
    639654let get_address_of_register status (b1,b2,b3) =
    640  let (_,_,rs1,rs0),_ = status.psw in
     655 let (_,_,rs1,rs0),_ = from_word status.psw in
    641656 let base =
    642657  match rs1,rs0 with
Note: See TracChangeset for help on using the changeset viewer.