SMAL32 (rev 9/03) MP3 solved by Douglas Jone 09:01:55 Page 1 Tue Oct 28 2003 22 SUBTITLE PUTAT 45 SUBTITLE PUTCH 131 SUBTITLE PUTSTR 158 SUBTITLE MAIN SMAL32 (rev 9/03) MP3 solved by Douglas Jone 09:01:55 Page 2 Tue Oct 28 2003 1 TITLE MP3 solved by Douglas Jones 2 3 S MAIN 4 USE "hawk.macs" 5 USE "monitor.h" +000000:+00000000 6 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 7 COMMON STACK,#1000 +000030:+00000000 8 PSTACK: W STACK 9 10 ; private storage area for put-package 11 COMMON PUTCOM,12 12 MARGIN = 0 ; current margin 13 CURX = 4 ; current X position 14 CURY = 12 ; current Y position +000034:+00000000 15 PPUTCOM:W PUTCOM 16 17 ; ASCII codes supported by put-package 18 HT = 9 19 LF = 10 20 CR = 13 21 SMAL32 (rev 9/03) MP3 solved by Douglas Jone 09:01:55 Page 3 PUTAT Tue Oct 28 2003 22 SUBTITLE PUTAT 23 ; activation record format for PUTAT 24 RA = 0 ; the return address 25 ARSIZE = 4 ; size of activation record in bytes 26 27 ; receiving sequence assumptions 28 PUTAT: ; set display text coordinates and margin 29 ; takes R3=X R4=Y (origin in top left) 30 ; wipes out R3-7 31 STORES R1,R2 ; save return address +000038: F1A2 32 LOAD R5,PPUTCOM +00003A: F550 FFF6 33 STORE R3,R5,MARGIN ; margin = x; +00003E: F325 0000 34 STORE R3,R5,CURX ; curx = x; +000042: F325 0004 35 STORE R4,R5,CURY ; cury = y; +000046: F425 000C 36 37 ADDI R2,R2,ARSIZE +00004A: F262 0004 38 LOAD R1,PDSPAT +00004E: F150 FFB6 39 JSRS R1,R1 +000052: F1B1 40 ADDI R2,R2,-ARSIZE ; call dspat(x,y) +000054: F262 FFFC 41 42 LOADS R1,R2 ; restore return address +000058: F1D2 43 JUMPS R1 ; return +00005A: F0B1 44 SMAL32 (rev 9/03) MP3 solved by Douglas Jone 09:01:55 Page 4 PUTCH Tue Oct 28 2003 45 SUBTITLE PUTCH 46 ; activation record format for PUTCH 47 RA = 0 ; the return address 48 R3SAVE = 4 ; save R3 -- these registers are saved and 49 R6SAVE = 8 ; save R6 -- restored so that PUTCH is 50 R7SAVE = 12 ; save R7 -- completely compatable with DSPCH 51 ARSIZE = 16 ; size of activation record in bytes 52 53 ; receiving sequence assumptions 54 PUTCH: ; output one character, interpreting control chars 55 ; takes R3=character 56 ; wipes out R4-5 57 STORES R1,R2 ; save return address +00005C: F1A2 58 STORE R3,R2,R3SAVE ; save R3 +00005E: F322 0004 59 STORE R6,R2,R6SAVE ; save R6 +000062: F622 0008 60 STORE R7,R2,R7SAVE ; save R7 +000066: F722 000C 61 LOAD R5,PPUTCOM ; /* setup for use of PUTCPM variables */ +00006A: F550 FFC6 62 63 CMPI R3,' ' +00006E: F063 FFE0 64 BLT PUTCC ; if (character >= ' ') { +000072: 050D 65 66 LOAD R4,R5,CURX +000074: F455 0004 67 ADDSI R4,1 +000078: 14C1 68 STORE R4,R5,CURX ; curx = curx + 1; +00007A: F425 0004 69 70 ADDI R2,R2,ARSIZE +00007E: F262 0010 71 LOAD R1,PDSPCH +000082: F150 FF86 72 JSRS R1,R1 +000086: F1B1 73 ADDI R2,R2,-ARSIZE ; call dspch(character) +000088: F262 FFF0 74 75 BR PUTCHQ +00008C: 003B 76 PUTCC: ; } else { /* it's a control char */ 77 CMPI R3,CR +00008E: F063 FFF3 78 BEQ PUTCCR +000092: 0216 79 CMPI R3,LF +000094: F063 FFF6 80 BEQ PUTCLF +000098: 0204 81 CMPI R3,HT +00009A: F063 FFF7 82 BEQ PUTCHT +00009E: 021E 83 BR PUTCHQ ; switch (character) { +0000A0: 0031 84 PUTCLF: ; case '\n': /* newline */ 85 LOAD R4,R5,CURY +0000A2: F455 000C 86 ADDSI R4,1 +0000A6: 14C1 87 STORE R4,R5,CURY ; cury = cury + 1; +0000A8: F425 000C 88 89 LOAD R3,R5,CURX +0000AC: F355 0004 90 ADDI R2,R2,ARSIZE +0000B0: F262 0010 91 LOAD R1,PDSPAT +0000B4: F150 FF50 92 JSRS R1,R1 +0000B8: F1B1 93 ADDI R2,R2,-ARSIZE ; call dspat( curx, cury ); +0000BA: F262 FFF0 94 95 BR PUTCHQ ; break; +0000BE: 0022 96 PUTCCR: ; case '\r': /* carriage return */ 97 LOAD R3,R5,MARGIN +0000C0: F355 0000 98 STORE R3,R5,CURX ; curx = margin; +0000C4: F325 0004 99 SMAL32 (rev 9/03) MP3 solved by Douglas Jone 09:01:55 Page 5 PUTCH Tue Oct 28 2003 100 LOAD R4,R5,CURY +0000C8: F455 000C 101 ADDI R2,R2,ARSIZE +0000CC: F262 0010 102 LOAD R1,PDSPAT +0000D0: F150 FF34 103 JSRS R1,R1 +0000D4: F1B1 104 ADDI R2,R2,-ARSIZE ; call dspat( curx, cury ); +0000D6: F262 FFF0 105 106 BR PUTCHQ ; break; +0000DA: 0014 107 PUTCHT: ; case '\t': /* tab */ 108 LOAD R3,R5,CURX +0000DC: F355 0004 109 LOAD R4,R5,MARGIN +0000E0: F455 0000 110 SUB R4,R3,R4 ; temp = curx - margin; +0000E4: 2434 111 PUTCTL: ; do { 112 ADDSI R3,1 ; curx = curx + 1; +0000E6: 13C1 113 ADDSI R4,1 ; temp = temp + 1; +0000E8: 14C1 114 ADDSR R0,R4,3 ; /* this line is tricky, look it up */ +0000EA: 9043 115 BVS PUTCTL ; } while ((temp & 7) != 0) +0000EC: 03FC 116 STORE R3,R5,CURX +0000EE: F325 0004 117 118 LOAD R4,R5,CURY +0000F2: F455 000C 119 ADDI R2,R2,ARSIZE +0000F6: F262 0010 120 LOAD R1,PDSPAT +0000FA: F150 FF0A 121 JSRS R1,R1 +0000FE: F1B1 122 ADDI R2,R2,-ARSIZE ; call dspat( curx, cury ); +000100: F262 FFF0 123 ; } 124 PUTCHQ: ; } 125 LOAD R3,R2,R3SAVE ; restore R3 +000104: F352 0004 126 LOAD R6,R2,R6SAVE ; restore R6 +000108: F652 0008 127 LOAD R7,R2,R7SAVE ; restore R7 +00010C: F752 000C 128 LOADS R1,R2 ; restore return address +000110: F1D2 129 JUMPS R1 ; return +000112: F0B1 130 SMAL32 (rev 9/03) MP3 solved by Douglas Jone 09:01:55 Page 6 PUTSTR Tue Oct 28 2003 131 SUBTITLE PUTSTR 132 ; activation record format for PUTSTR 133 RA = 0 ; the return address 134 ARSIZE = 4 ; size of activation record in bytes 135 136 ; receiving sequence assumptions 137 PUTSTR: ; output null terminated string 138 ; takes R3=pointer to string 139 ; wipes out R3-7 140 STORES R1,R2 ; save return address +000114: F1A2 141 MOVE R7,R3 ; R7 = pointer +000116: F7F3 142 ADDI R2,R2,ARSIZE ; /* stack pointer adjust outside loop */ +000118: F262 0004 143 PUTSLP: ; while (TRUE) { 144 LOADS R3,R7 +00011C: F3D7 145 EXTB R3,R3,R7 ; char = *pointer +00011E: 5337 146 BZS PUTSLX ; if (char == '\0') break; +000120: 0204 147 148 JSR R1,PUTCH ; putch(character) +000122: F130 FF36 149 150 ADDSI R7,1 ; pointer = pointer + 1; +000126: 17C1 151 BR PUTSLP +000128: 00F9 152 PUTSLX: ; } 153 ADDI R2,R2,-ARSIZE ; /* stack pointer adjust outside loop */ +00012A: F262 FFFC 154 LOADS R1,R2 ; restore return address +00012E: F1D2 155 JUMPS R1 ; return +000130: F0B1 156 157 SMAL32 (rev 9/03) MP3 solved by Douglas Jone 09:01:55 Page 7 MAIN Tue Oct 28 2003 158 SUBTITLE MAIN 159 ; this main program serves to test the above code! It 160 ; simply puts out three messages on the screen, each 161 ; formulated with use of the features implemented in the 162 ; put package, with the messages positioned on the screen 163 ; so that, together, if everything works, they look good. 164 165 MAIN: LOAD R2,PSTACK ; set up the stack +000132: F250 FEFA 166 167 LOAD R1,PDSPINI +000136: F150 FECA 168 JSRS R1,R1 ; initialize the display +00013A: F1B1 169 170 LIS R3,8 +00013C: D308 171 LIS R4,2 +00013E: D402 172 JSR R1,PUTAT ; putat( 8, 2 ) +000140: F130 FEF4 173 174 LEA R3,LEFTSTARS +000144: F370 002A 175 JSR R1,PUTSTR ; putstr( leftstars ) +000148: F130 FFC8 176 177 LIS R3,40 +00014C: D328 178 LIS R4,3 +00014E: D403 179 JSR R1,PUTAT ; putat( 40, 3 ) +000150: F130 FEE4 180 181 LEA R3,RIGHTSTARS +000154: F370 002A 182 JSR R1,PUTSTR ; putstr( rightstars ) +000158: F130 FFB8 183 184 LIS R3,12 +00015C: D30C 185 LIS R4,3 +00015E: D403 186 JSR R1,PUTAT ; putat( 12, 3 ) +000160: F130 FED4 187 188 LEA R3,MESSAGE +000164: F370 002C 189 JSR R1,PUTSTR ; putstr( message ) +000168: F130 FFA8 190 191 LOAD R1,PEXIT +00016C: F150 FE90 192 JSRS R1,R1 ; call monitor routine to stop! +000170: F1B1 193 194 LEFTSTARS: ; the upper left corner of a box outlined in stars +000172: 2A 2A 2A 2A 195 ASCII "*********",CR,LF,"*",CR,LF,"*",0 2A 2A 2A 2A 2A 0D 0A 2A 0D 0A 2A 00 196 197 RIGHTSTARS: ; the lower right corner of a box outlined in stars +000182: 09 2A 0D 0A 198 ASCII "",HT,"*",CR,LF,HT,"*",CR,LF,"*********",0 09 2A 0D 0A 2A 2A 2A 2A 2A 2A 2A 2A 2A 00 199 200 MESSAGE: ; the contents of the box created by the above strings +000194: 4D 50 33 20 201 ASCII "MP3 as solved by|",HT,"|",HT,"|",CR,LF 61 73 20 73 6F 6C 76 65 64 20 62 79 7C 09 7C 09 7C 0D 0A SMAL32 (rev 9/03) MP3 solved by Douglas Jone 09:01:55 Page 8 MAIN Tue Oct 28 2003 +0001AB: 7C 09 7C 09 202 ASCII "|",HT,"|",HT,"|Douglas W. Jones",0 7C 44 6F 75 67 6C 61 73 20 57 2E 20 4A 6F 6E 65 73 00 203 END no errors