bpxsvc_zos.s 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // Copyright 2024 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. #include "go_asm.h"
  5. #include "textflag.h"
  6. // function to call USS assembly language services
  7. //
  8. // doc: https://www.ibm.com/support/knowledgecenter/en/SSLTBW_3.1.0/com.ibm.zos.v3r1.bpxb100/bit64env.htm
  9. //
  10. // arg1 unsafe.Pointer array that ressembles an OS PLIST
  11. //
  12. // arg2 function offset as in
  13. // doc: https://www.ibm.com/support/knowledgecenter/en/SSLTBW_3.1.0/com.ibm.zos.v3r1.bpxb100/bpx2cr_List_of_offsets.htm
  14. //
  15. // func bpxcall(plist []unsafe.Pointer, bpx_offset int64)
  16. TEXT ·bpxcall(SB), NOSPLIT|NOFRAME, $0
  17. MOVD plist_base+0(FP), R1 // r1 points to plist
  18. MOVD bpx_offset+24(FP), R2 // r2 offset to BPX vector table
  19. MOVD R14, R7 // save r14
  20. MOVD R15, R8 // save r15
  21. MOVWZ 16(R0), R9
  22. MOVWZ 544(R9), R9
  23. MOVWZ 24(R9), R9 // call vector in r9
  24. ADD R2, R9 // add offset to vector table
  25. MOVWZ (R9), R9 // r9 points to entry point
  26. BYTE $0x0D // BL R14,R9 --> basr r14,r9
  27. BYTE $0xE9 // clobbers 0,1,14,15
  28. MOVD R8, R15 // restore 15
  29. JMP R7 // return via saved return address
  30. // func A2e(arr [] byte)
  31. // code page conversion from 819 to 1047
  32. TEXT ·A2e(SB), NOSPLIT|NOFRAME, $0
  33. MOVD arg_base+0(FP), R2 // pointer to arry of characters
  34. MOVD arg_len+8(FP), R3 // count
  35. XOR R0, R0
  36. XOR R1, R1
  37. BYTE $0xA7; BYTE $0x15; BYTE $0x00; BYTE $0x82 // BRAS 1,(2+(256/2))
  38. // ASCII -> EBCDIC conversion table:
  39. BYTE $0x00; BYTE $0x01; BYTE $0x02; BYTE $0x03
  40. BYTE $0x37; BYTE $0x2d; BYTE $0x2e; BYTE $0x2f
  41. BYTE $0x16; BYTE $0x05; BYTE $0x15; BYTE $0x0b
  42. BYTE $0x0c; BYTE $0x0d; BYTE $0x0e; BYTE $0x0f
  43. BYTE $0x10; BYTE $0x11; BYTE $0x12; BYTE $0x13
  44. BYTE $0x3c; BYTE $0x3d; BYTE $0x32; BYTE $0x26
  45. BYTE $0x18; BYTE $0x19; BYTE $0x3f; BYTE $0x27
  46. BYTE $0x1c; BYTE $0x1d; BYTE $0x1e; BYTE $0x1f
  47. BYTE $0x40; BYTE $0x5a; BYTE $0x7f; BYTE $0x7b
  48. BYTE $0x5b; BYTE $0x6c; BYTE $0x50; BYTE $0x7d
  49. BYTE $0x4d; BYTE $0x5d; BYTE $0x5c; BYTE $0x4e
  50. BYTE $0x6b; BYTE $0x60; BYTE $0x4b; BYTE $0x61
  51. BYTE $0xf0; BYTE $0xf1; BYTE $0xf2; BYTE $0xf3
  52. BYTE $0xf4; BYTE $0xf5; BYTE $0xf6; BYTE $0xf7
  53. BYTE $0xf8; BYTE $0xf9; BYTE $0x7a; BYTE $0x5e
  54. BYTE $0x4c; BYTE $0x7e; BYTE $0x6e; BYTE $0x6f
  55. BYTE $0x7c; BYTE $0xc1; BYTE $0xc2; BYTE $0xc3
  56. BYTE $0xc4; BYTE $0xc5; BYTE $0xc6; BYTE $0xc7
  57. BYTE $0xc8; BYTE $0xc9; BYTE $0xd1; BYTE $0xd2
  58. BYTE $0xd3; BYTE $0xd4; BYTE $0xd5; BYTE $0xd6
  59. BYTE $0xd7; BYTE $0xd8; BYTE $0xd9; BYTE $0xe2
  60. BYTE $0xe3; BYTE $0xe4; BYTE $0xe5; BYTE $0xe6
  61. BYTE $0xe7; BYTE $0xe8; BYTE $0xe9; BYTE $0xad
  62. BYTE $0xe0; BYTE $0xbd; BYTE $0x5f; BYTE $0x6d
  63. BYTE $0x79; BYTE $0x81; BYTE $0x82; BYTE $0x83
  64. BYTE $0x84; BYTE $0x85; BYTE $0x86; BYTE $0x87
  65. BYTE $0x88; BYTE $0x89; BYTE $0x91; BYTE $0x92
  66. BYTE $0x93; BYTE $0x94; BYTE $0x95; BYTE $0x96
  67. BYTE $0x97; BYTE $0x98; BYTE $0x99; BYTE $0xa2
  68. BYTE $0xa3; BYTE $0xa4; BYTE $0xa5; BYTE $0xa6
  69. BYTE $0xa7; BYTE $0xa8; BYTE $0xa9; BYTE $0xc0
  70. BYTE $0x4f; BYTE $0xd0; BYTE $0xa1; BYTE $0x07
  71. BYTE $0x20; BYTE $0x21; BYTE $0x22; BYTE $0x23
  72. BYTE $0x24; BYTE $0x25; BYTE $0x06; BYTE $0x17
  73. BYTE $0x28; BYTE $0x29; BYTE $0x2a; BYTE $0x2b
  74. BYTE $0x2c; BYTE $0x09; BYTE $0x0a; BYTE $0x1b
  75. BYTE $0x30; BYTE $0x31; BYTE $0x1a; BYTE $0x33
  76. BYTE $0x34; BYTE $0x35; BYTE $0x36; BYTE $0x08
  77. BYTE $0x38; BYTE $0x39; BYTE $0x3a; BYTE $0x3b
  78. BYTE $0x04; BYTE $0x14; BYTE $0x3e; BYTE $0xff
  79. BYTE $0x41; BYTE $0xaa; BYTE $0x4a; BYTE $0xb1
  80. BYTE $0x9f; BYTE $0xb2; BYTE $0x6a; BYTE $0xb5
  81. BYTE $0xbb; BYTE $0xb4; BYTE $0x9a; BYTE $0x8a
  82. BYTE $0xb0; BYTE $0xca; BYTE $0xaf; BYTE $0xbc
  83. BYTE $0x90; BYTE $0x8f; BYTE $0xea; BYTE $0xfa
  84. BYTE $0xbe; BYTE $0xa0; BYTE $0xb6; BYTE $0xb3
  85. BYTE $0x9d; BYTE $0xda; BYTE $0x9b; BYTE $0x8b
  86. BYTE $0xb7; BYTE $0xb8; BYTE $0xb9; BYTE $0xab
  87. BYTE $0x64; BYTE $0x65; BYTE $0x62; BYTE $0x66
  88. BYTE $0x63; BYTE $0x67; BYTE $0x9e; BYTE $0x68
  89. BYTE $0x74; BYTE $0x71; BYTE $0x72; BYTE $0x73
  90. BYTE $0x78; BYTE $0x75; BYTE $0x76; BYTE $0x77
  91. BYTE $0xac; BYTE $0x69; BYTE $0xed; BYTE $0xee
  92. BYTE $0xeb; BYTE $0xef; BYTE $0xec; BYTE $0xbf
  93. BYTE $0x80; BYTE $0xfd; BYTE $0xfe; BYTE $0xfb
  94. BYTE $0xfc; BYTE $0xba; BYTE $0xae; BYTE $0x59
  95. BYTE $0x44; BYTE $0x45; BYTE $0x42; BYTE $0x46
  96. BYTE $0x43; BYTE $0x47; BYTE $0x9c; BYTE $0x48
  97. BYTE $0x54; BYTE $0x51; BYTE $0x52; BYTE $0x53
  98. BYTE $0x58; BYTE $0x55; BYTE $0x56; BYTE $0x57
  99. BYTE $0x8c; BYTE $0x49; BYTE $0xcd; BYTE $0xce
  100. BYTE $0xcb; BYTE $0xcf; BYTE $0xcc; BYTE $0xe1
  101. BYTE $0x70; BYTE $0xdd; BYTE $0xde; BYTE $0xdb
  102. BYTE $0xdc; BYTE $0x8d; BYTE $0x8e; BYTE $0xdf
  103. retry:
  104. WORD $0xB9931022 // TROO 2,2,b'0001'
  105. BVS retry
  106. RET
  107. // func e2a(arr [] byte)
  108. // code page conversion from 1047 to 819
  109. TEXT ·E2a(SB), NOSPLIT|NOFRAME, $0
  110. MOVD arg_base+0(FP), R2 // pointer to arry of characters
  111. MOVD arg_len+8(FP), R3 // count
  112. XOR R0, R0
  113. XOR R1, R1
  114. BYTE $0xA7; BYTE $0x15; BYTE $0x00; BYTE $0x82 // BRAS 1,(2+(256/2))
  115. // EBCDIC -> ASCII conversion table:
  116. BYTE $0x00; BYTE $0x01; BYTE $0x02; BYTE $0x03
  117. BYTE $0x9c; BYTE $0x09; BYTE $0x86; BYTE $0x7f
  118. BYTE $0x97; BYTE $0x8d; BYTE $0x8e; BYTE $0x0b
  119. BYTE $0x0c; BYTE $0x0d; BYTE $0x0e; BYTE $0x0f
  120. BYTE $0x10; BYTE $0x11; BYTE $0x12; BYTE $0x13
  121. BYTE $0x9d; BYTE $0x0a; BYTE $0x08; BYTE $0x87
  122. BYTE $0x18; BYTE $0x19; BYTE $0x92; BYTE $0x8f
  123. BYTE $0x1c; BYTE $0x1d; BYTE $0x1e; BYTE $0x1f
  124. BYTE $0x80; BYTE $0x81; BYTE $0x82; BYTE $0x83
  125. BYTE $0x84; BYTE $0x85; BYTE $0x17; BYTE $0x1b
  126. BYTE $0x88; BYTE $0x89; BYTE $0x8a; BYTE $0x8b
  127. BYTE $0x8c; BYTE $0x05; BYTE $0x06; BYTE $0x07
  128. BYTE $0x90; BYTE $0x91; BYTE $0x16; BYTE $0x93
  129. BYTE $0x94; BYTE $0x95; BYTE $0x96; BYTE $0x04
  130. BYTE $0x98; BYTE $0x99; BYTE $0x9a; BYTE $0x9b
  131. BYTE $0x14; BYTE $0x15; BYTE $0x9e; BYTE $0x1a
  132. BYTE $0x20; BYTE $0xa0; BYTE $0xe2; BYTE $0xe4
  133. BYTE $0xe0; BYTE $0xe1; BYTE $0xe3; BYTE $0xe5
  134. BYTE $0xe7; BYTE $0xf1; BYTE $0xa2; BYTE $0x2e
  135. BYTE $0x3c; BYTE $0x28; BYTE $0x2b; BYTE $0x7c
  136. BYTE $0x26; BYTE $0xe9; BYTE $0xea; BYTE $0xeb
  137. BYTE $0xe8; BYTE $0xed; BYTE $0xee; BYTE $0xef
  138. BYTE $0xec; BYTE $0xdf; BYTE $0x21; BYTE $0x24
  139. BYTE $0x2a; BYTE $0x29; BYTE $0x3b; BYTE $0x5e
  140. BYTE $0x2d; BYTE $0x2f; BYTE $0xc2; BYTE $0xc4
  141. BYTE $0xc0; BYTE $0xc1; BYTE $0xc3; BYTE $0xc5
  142. BYTE $0xc7; BYTE $0xd1; BYTE $0xa6; BYTE $0x2c
  143. BYTE $0x25; BYTE $0x5f; BYTE $0x3e; BYTE $0x3f
  144. BYTE $0xf8; BYTE $0xc9; BYTE $0xca; BYTE $0xcb
  145. BYTE $0xc8; BYTE $0xcd; BYTE $0xce; BYTE $0xcf
  146. BYTE $0xcc; BYTE $0x60; BYTE $0x3a; BYTE $0x23
  147. BYTE $0x40; BYTE $0x27; BYTE $0x3d; BYTE $0x22
  148. BYTE $0xd8; BYTE $0x61; BYTE $0x62; BYTE $0x63
  149. BYTE $0x64; BYTE $0x65; BYTE $0x66; BYTE $0x67
  150. BYTE $0x68; BYTE $0x69; BYTE $0xab; BYTE $0xbb
  151. BYTE $0xf0; BYTE $0xfd; BYTE $0xfe; BYTE $0xb1
  152. BYTE $0xb0; BYTE $0x6a; BYTE $0x6b; BYTE $0x6c
  153. BYTE $0x6d; BYTE $0x6e; BYTE $0x6f; BYTE $0x70
  154. BYTE $0x71; BYTE $0x72; BYTE $0xaa; BYTE $0xba
  155. BYTE $0xe6; BYTE $0xb8; BYTE $0xc6; BYTE $0xa4
  156. BYTE $0xb5; BYTE $0x7e; BYTE $0x73; BYTE $0x74
  157. BYTE $0x75; BYTE $0x76; BYTE $0x77; BYTE $0x78
  158. BYTE $0x79; BYTE $0x7a; BYTE $0xa1; BYTE $0xbf
  159. BYTE $0xd0; BYTE $0x5b; BYTE $0xde; BYTE $0xae
  160. BYTE $0xac; BYTE $0xa3; BYTE $0xa5; BYTE $0xb7
  161. BYTE $0xa9; BYTE $0xa7; BYTE $0xb6; BYTE $0xbc
  162. BYTE $0xbd; BYTE $0xbe; BYTE $0xdd; BYTE $0xa8
  163. BYTE $0xaf; BYTE $0x5d; BYTE $0xb4; BYTE $0xd7
  164. BYTE $0x7b; BYTE $0x41; BYTE $0x42; BYTE $0x43
  165. BYTE $0x44; BYTE $0x45; BYTE $0x46; BYTE $0x47
  166. BYTE $0x48; BYTE $0x49; BYTE $0xad; BYTE $0xf4
  167. BYTE $0xf6; BYTE $0xf2; BYTE $0xf3; BYTE $0xf5
  168. BYTE $0x7d; BYTE $0x4a; BYTE $0x4b; BYTE $0x4c
  169. BYTE $0x4d; BYTE $0x4e; BYTE $0x4f; BYTE $0x50
  170. BYTE $0x51; BYTE $0x52; BYTE $0xb9; BYTE $0xfb
  171. BYTE $0xfc; BYTE $0xf9; BYTE $0xfa; BYTE $0xff
  172. BYTE $0x5c; BYTE $0xf7; BYTE $0x53; BYTE $0x54
  173. BYTE $0x55; BYTE $0x56; BYTE $0x57; BYTE $0x58
  174. BYTE $0x59; BYTE $0x5a; BYTE $0xb2; BYTE $0xd4
  175. BYTE $0xd6; BYTE $0xd2; BYTE $0xd3; BYTE $0xd5
  176. BYTE $0x30; BYTE $0x31; BYTE $0x32; BYTE $0x33
  177. BYTE $0x34; BYTE $0x35; BYTE $0x36; BYTE $0x37
  178. BYTE $0x38; BYTE $0x39; BYTE $0xb3; BYTE $0xdb
  179. BYTE $0xdc; BYTE $0xd9; BYTE $0xda; BYTE $0x9f
  180. retry:
  181. WORD $0xB9931022 // TROO 2,2,b'0001'
  182. BVS retry
  183. RET