apage.cmac 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. ; page = cluster is create % -> page
  2. ; store % page, int, int, int => bounds
  3. ; fetch % page, int -> int, int => bounds
  4. ; dump % page, int, int, int, chan ->
  5. .insrt clusys;alpha >
  6. edesc e$bnd,bounds
  7. edesc e$dfa,dump_failed
  8. ti== ttype(tint)
  9. tc== ttype(tchan)
  10. tdesc tp,page
  11. ptdesc t$cre,[],[tp],[]
  12. ptdesc t$sto,[tp,ti,ti,ti],[],[e$bnd]
  13. ptdesc t$fet,[tp,ti],[ti,ti],[e$bnd]
  14. ptdesc t$dmp,[tp,ti,ti,ti,tc],[],[e$dfa]
  15. cluster page
  16. proc p.cre,[],[],[],t$cre
  17. hrri n1,pgsize+1 ; a whole page plus a header word
  18. hrli n1,(twvec)
  19. alloc pgsize+1,n1
  20. $rtn rr
  21. corp page$create
  22. proc p.sto,[p,i,l,r],[],[],t$sto
  23. rsbchk rr,i(er) ; get the index
  24. hrrz n1,rr
  25. $if caige n1,0 ; check 0 <= index < pgsize
  26. skipa
  27. cail n1,pgsize
  28. $then refchk r0,p(er) ; get page
  29. add r0,n1 ; compute address
  30. rsbchk n1,l(er) ; get the word
  31. rsbchk n2,r(er)
  32. hrl n2,n1
  33. movem n2,1(r0) ; store it
  34. $else signal e$bnd
  35. $fi
  36. $rtnc $none
  37. corp page$store,[p,i,l,r]
  38. proc p.fet,[p,i],[],[],t$fet
  39. rsbchk rr,i(er) ; get index
  40. hrrz n1,rr
  41. $if caige n1,0 ; check 0 <= index < pgsize
  42. skipa
  43. cail n1,pgsize
  44. $then refchk r0,p(er) ; get page
  45. add r0,n1 ; compute address
  46. move n2,1(r0) ; get word
  47. hlr n1,n2
  48. hrli n1,(tint)
  49. push sp,n1
  50. hrli n2,(tint)
  51. push sp,n2
  52. $mrtn 2.
  53. $else signal e$bnd
  54. $fi
  55. corp page$fetch,[p,i]
  56. proc p.dmp,[p,adr,low,len,c],[],[],t$dmp
  57. movn n3,len(er)
  58. hrl n3,n3
  59. hrr n3,adr(er)
  60. hrrz n1,c(er)
  61. hrroi n2,n3
  62. .call c.wt1(pr)
  63. $go fex
  64. hrrz n2,low(er)
  65. hrr r1,p(er)
  66. addi r1,1(n2)
  67. hll r1,n3
  68. move r0,r1
  69. .call c.wtv(pr)
  70. $go fex
  71. .here c.lp
  72. rot n3,1
  73. add n2,(r0)
  74. aobjn r0,c.lp(pr)
  75. hrroi n2,n3
  76. .call c.wt1(pr)
  77. $go fex
  78. $rtnc $none
  79. $label fex
  80. signal e$dfa
  81. .here c.wt1
  82. setz
  83. sixbit |iot|
  84. move n1
  85. move n2
  86. setzb rr
  87. .here c.wtv
  88. setz
  89. sixbit |iot|
  90. move n1
  91. move r1
  92. setzb rr
  93. corp page$dump,[p,addr,low,len,c]
  94. retsulc page
  95. .insrt clusys;omega >