dia.s 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. .define .diagnos
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. space = 040
  7. del = 0177
  8. .sect .data
  9. .range: .data1 space, del-1
  10. .align 2
  11. .sect .text
  12. .diagnos:
  13. movem.l d0/d1/d2/a0, -(sp)
  14. move.l (.lino), -(sp)
  15. move.l (.filn), d2
  16. beq 1f
  17. move.l d2, a0
  18. move.l #40, d0
  19. 3:
  20. move.b (a0)+, d1
  21. beq 2f
  22. cmp2.b (.range), d1
  23. bcs 1f
  24. dbf d0, 3b
  25. 2:
  26. move.l d2, -(sp)
  27. pea (fmt)
  28. jsr (printf)
  29. lea (12, sp), sp
  30. movem.l (sp)+, d0/d1/d2/a0
  31. jmp (printf)
  32. rts
  33. 1:
  34. move.l #unknwn, d2
  35. bra 2b
  36. .sect .bss
  37. getal:
  38. .space 12
  39. char:
  40. .space 1
  41. .align 4
  42. .sect .data
  43. hexs:
  44. .ascii "0123456789abcdef"
  45. .align 4
  46. .sect .text
  47. printf:
  48. movem.l d0/d1/d2/a0/a1/a2/a3/a4/a5/a6, -(sp)
  49. lea (44, sp), a6 ! a6 <- address of arguments
  50. move.l (a6)+, a5 ! a5 <- address of format
  51. next: move.b (a5)+, d0
  52. beq out
  53. cmp.b #'%', d0
  54. beq procnt
  55. put: move.l d0, -(sp)
  56. jsr (putchar) ! long argument on stack
  57. tst.l (sp)+
  58. bra next
  59. procnt: move.b (a5)+, d0
  60. cmp.b #'d', d0 ! NOTE: %d means unsigned.
  61. beq digit
  62. cmp.b #'x', d0
  63. beq hex
  64. cmp.b #'s', d0
  65. beq string
  66. cmp.b #'%', d0 ! second % has to be printed.
  67. beq put
  68. tst.b -(a5) ! normal char should be printed
  69. bra next
  70. string: move.l (a6)+, a2 ! a2 <- address of string
  71. sloop: move.b (a2)+, d0
  72. beq next
  73. move.l d0, -(sp)
  74. jsr (putchar) ! long argument on stack
  75. tst.l (sp)+
  76. bra sloop
  77. digit: move.l (a6)+, d1 ! d1 <- integer
  78. move.l #getal+12, a2 ! a2 <- ptr to last part of buf
  79. clr.b -(a2) ! stringterminator
  80. 1: divul.l #10, d2:d1 ! d1 <- qotient; d2 <- remainder
  81. add.l #'0', d2
  82. move.b d2, -(a2)
  83. tst.l d1 ! if quotient = 0 then ready
  84. bne 1b
  85. bra sloop ! print digitstring.
  86. hex: move.l (a6)+, d1 ! d1 <- integer
  87. move.l #getal+12, a2 ! a2 <- ptr to last part of buf
  88. clr.b -(a2) ! stringterminator
  89. move.l #7, d2 ! loop control
  90. 1: move.l d1, d0
  91. and.l #15, d0
  92. move.b (hexs,d0.w), -(a2) ! hex digit
  93. asr.l #4, d1
  94. dbf d2, 1b
  95. bra sloop
  96. out:
  97. movem.l (sp)+, d0/d1/d2/a0/a1/a2/a3/a4/a5/a6
  98. rts
  99. putchar:
  100. move.l #1, -(sp)
  101. pea (11,sp)
  102. move.l #1, -(sp)
  103. jsr (WRITE)
  104. lea (12, sp), sp
  105. rts
  106. .align 2
  107. .sect .data
  108. fmt: .asciz "%s, line %d: "
  109. unknwn: .asciz "unknown file"
  110. .align 2