|
| 1 | +ca65 V2.18 - Ubuntu 2.19-1 |
| 2 | +Main file : alloc203.asm |
| 3 | +Current file: alloc203.asm |
| 4 | + |
| 5 | +000000r 1 ;ALLOC |
| 6 | +000000r 1 ;VERSION 2.03-A |
| 7 | +000000r 1 ;RELEASED: 10 OCTOBER 1982 |
| 8 | +000000r 1 ;LAST REVISION: |
| 9 | +000000r 1 ; 28 DECEMBER 1985 |
| 10 | +000000r 1 ; ADDED PARAM FOR WIDTH |
| 11 | +000000r 1 ; 30 MARCH 2008 |
| 12 | +000000r 1 ; REFORMATTED FOR TASM & ASM210 |
| 13 | +000000r 1 ; ELIMINATED PAGE ZERO 0 & 1 |
| 14 | +000000r 1 ; ADDED TOTAL BLOCK COUNT TO END MSG |
| 15 | +000000r 1 ; 3 APRIL 2008 |
| 16 | +000000r 1 ; CORRECTED ERRORS |
| 17 | +000000r 1 ;SYNTAX IS ALLOC X WHERE X IS THE DRIVE (A TO H) |
| 18 | +000000r 1 ;IF X IS BLANK THEN THE DEFAULT DRIVE IS USED. |
| 19 | +000000r 1 ;USERS MAY WANT TO CHANGE THE VALUE OF WIDTH |
| 20 | +000000r 1 ;TO A SMALLER VALUE IF THEIR CONSOLE IS LESS THAN 80 |
| 21 | +000000r 1 ;CHARACTERS WIDE. |
| 22 | +000000r 1 ;EXTERNAL REFERENCES |
| 23 | +000000r 1 PEM = $103 ;PEM ENTRY |
| 24 | +000000r 1 DFLFCB = $107 ;DEFAULT FCB |
| 25 | +000000r 1 TEA = $800 ;TEA START |
| 26 | +000000r 1 ;FIXED PARAMETERS |
| 27 | +000000r 1 CR = $D ;RETURN |
| 28 | +000000r 1 LF = $A ;LINEFEED |
| 29 | +000000r 1 ;WIDTH IS A SOMEWHAT OBSCURE WAY OF CONTROLLING DIPLAY WIDTH |
| 30 | +000000r 1 ;IT CAN BE SET TO 1, 3, 7, ETC. - AND WHEN SO SET THE NUMBER OF |
| 31 | +000000r 1 ;8 BLOCK WIDE BIT MAPS BECOMES 2, 4, 8, ETC. |
| 32 | +000000r 1 ;WIDTH CAN ONLY BE SET TO (2 TO THE N POWER) - 1 |
| 33 | +000000r 1 WIDTH = 3 ;(WIDTH+1)*8-->CHARS PER LINE |
| 34 | +000000r 1 ;PAGE ZERO VARIABLES |
| 35 | +000000r 1 |
| 36 | +000000r 1 DCBPNT = $02 ;DCB POINTER |
| 37 | +000000r 1 BITCNT = $04 ;COUNT OF TOTAL BLOCKS |
| 38 | +000000r 1 VECPNT = $06 ;VECTOR POINTER |
| 39 | +000000r 1 DFLDRV = $08 ;DEFAULT DRIVE |
| 40 | +000000r 1 TMPDRV = $09 ;TEMPORARY DRIVE |
| 41 | +000000r 1 FREE = $0A ;FREE BLOCKS |
| 42 | +000000r 1 BITNUM = $0C ;BIT (0 TO 7) |
| 43 | +000000r 1 BYTNUM = $0D ;BYTE (0 TO 255) |
| 44 | +000000r 1 LEADZ = $0E ;LEADING ZERO FLAG |
| 45 | +000000r 1 BLKSCD = $0F ;BLOCK SIZE CODE |
| 46 | +000000r 1 TOTAL = $10 ;TOTAL NUMBER OF BLOCK |
| 47 | +000000r 1 |
| 48 | +000000r 1 ;MAIN PROGRAM |
| 49 | +000000r 1 .segment "TEA" |
| 50 | +000000r 1 .ORG $0800 |
| 51 | +000800 1 A2 19 LDX #25 ;GET AND |
| 52 | +000802 1 20 03 01 JSR PEM ;SAVE |
| 53 | +000805 1 85 08 STA DFLDRV ;DEFAULT DRIVE |
| 54 | +000807 1 AD 08 01 LDA DFLFCB+1 ;GET OBJECT |
| 55 | +00080A 1 85 09 STA TMPDRV ;AND SAVE |
| 56 | +00080C 1 A2 0D LDX #13 ;INITIALIZE |
| 57 | +00080E 1 20 03 01 JSR PEM ;SYSTEM |
| 58 | +000811 1 A5 09 LDA TMPDRV ;GET TEMP |
| 59 | +000813 1 C9 20 CMP #' ' ;IF NOT A SPACE |
| 60 | +000815 1 D0 04 BNE HAVDRV ;USE DEFAULT |
| 61 | +000817 1 A5 08 LDA DFLDRV ;GET DEFAULT |
| 62 | +000819 1 10 05 BPL SETDRV ;AND GO |
| 63 | +00081B 1 38 HAVDRV: SEC ;DROP TEMP |
| 64 | +00081C 1 E9 01 SBC #1 ;BY ONE |
| 65 | +00081E 1 29 07 AND #%111 ;LOOK AT THREE LSBS |
| 66 | +000820 1 A2 0E SETDRV: LDX #14 ;THEN |
| 67 | +000822 1 85 09 STA TMPDRV ;SAVE DRIVE FOR DCB VECTOR |
| 68 | +000824 1 20 03 01 JSR PEM ;SELECT |
| 69 | +000827 1 A2 22 LDX #34 ;FIND DCB ADDRESS |
| 70 | +000829 1 20 03 01 JSR PEM |
| 71 | +00082C 1 85 02 STA DCBPNT ;SAVE POINTER |
| 72 | +00082E 1 84 03 STY DCBPNT+1 |
| 73 | +000830 1 A0 00 LDY #0 ;GET MAX BLOCK NUMBER |
| 74 | +000832 1 B1 02 LDA (DCBPNT),Y |
| 75 | +000834 1 18 CLC ;BUMP TO GET NUMBER |
| 76 | +000835 1 69 01 ADC #1 |
| 77 | +000837 1 85 0A STA FREE ;SET FREE COUNT |
| 78 | +000839 1 85 10 STA TOTAL ;AND TOTAL |
| 79 | +00083B 1 85 04 STA BITCNT ;AND BIT COUNTER |
| 80 | +00083D 1 C8 INY ;NOW GET HIGH |
| 81 | +00083E 1 B1 02 LDA (DCBPNT),Y ;AND ADD WITH CARRY |
| 82 | +000840 1 69 00 ADC #0 |
| 83 | +000842 1 85 0B STA FREE+1 |
| 84 | +000844 1 85 11 STA TOTAL+1 |
| 85 | +000846 1 85 05 STA BITCNT+1 |
| 86 | +000848 1 A0 06 LDY #6 ;GET SIZE CODE |
| 87 | +00084A 1 B1 02 LDA (DCBPNT),Y |
| 88 | +00084C 1 85 0F STA BLKSCD ;AND SAVE |
| 89 | +00084E 1 A2 1B LDX #27 ;GET VECTOR |
| 90 | +000850 1 20 03 01 JSR PEM ;TO MAP |
| 91 | +000853 1 85 06 STA VECPNT ;SAVE |
| 92 | +000855 1 84 07 STY VECPNT+1 ;IN MEMORY |
| 93 | +000857 1 A9 00 LDA #0 ;THEN CLEAR |
| 94 | +000859 1 85 0C STA BITNUM ;BIT |
| 95 | +00085B 1 85 0D STA BYTNUM ;BYTE |
| 96 | +00085D 1 85 0E STA LEADZ ;AND LEADING ZERO FLAG |
| 97 | +00085F 1 20 7A 09 JSR CRLF ;LEAVE BLANK LINE |
| 98 | +000862 1 A4 0D OUTLPE: LDY BYTNUM ;GET BYTE NUMBER |
| 99 | +000864 1 A6 0C LDX BITNUM ;AND BIT NUMBER |
| 100 | +000866 1 B1 06 LDA (VECPNT),Y ;GET MAP BYTE |
| 101 | +000868 1 3D 86 09 AND BITMSK,X ;OVERLAY MASK |
| 102 | +00086B 1 D0 04 BNE ISFULL ;BRANCH IF ALLOCATED |
| 103 | +00086D 1 A9 30 LDA #'0' ;ELSE SEND |
| 104 | +00086F 1 D0 0A BNE NEXT ;A ZERO |
| 105 | +000871 1 A5 0A ISFULL: LDA FREE ;GET LOW OF FREE COUNT |
| 106 | +000873 1 D0 02 BNE FRENZ ;JUMP IF NOT ZERO |
| 107 | +000875 1 C6 0B DEC FREE+1 ;ELSE DROP HIGH THEN DO LOW |
| 108 | +000877 1 C6 0A FRENZ: DEC FREE |
| 109 | +000879 1 A9 31 LDA #'1' ;SEND A |
| 110 | +00087B 1 20 81 09 NEXT: JSR CHROUT ;ONE |
| 111 | +00087E 1 A5 04 LDA BITCNT ;GET LOW OF COUNTER |
| 112 | +000880 1 D0 02 BNE BITNZ ;JUMP IF NOT ZERO |
| 113 | +000882 1 C6 05 DEC BITCNT+1 ;ELSE DROP HIGH THEN DO LOW |
| 114 | +000884 1 C6 04 BITNZ: DEC BITCNT |
| 115 | +000886 1 A5 04 LDA BITCNT ;TEST FOR ZERO |
| 116 | +000888 1 05 05 ORA BITCNT+1 |
| 117 | +00088A 1 F0 1E BEQ DONE ;DONE IF ZERO |
| 118 | +00088C 1 E6 0C INC BITNUM ;BUMP BIT NUMBER |
| 119 | +00088E 1 A5 0C LDA BITNUM ;GET IT |
| 120 | +000890 1 C9 08 CMP #8 ;SEE IF DONE WITH BYTE |
| 121 | +000892 1 D0 CE BNE OUTLPE ;THEN LOOP |
| 122 | +000894 1 A9 00 LDA #0 |
| 123 | +000896 1 85 0C STA BITNUM ;ELSE CLEAR BIT NUMBER |
| 124 | +000898 1 E6 0D INC BYTNUM ;BUMP BYTE NUMBER |
| 125 | +00089A 1 D0 02 BNE *+4 ;SKIP IF NOT ZERO |
| 126 | +00089C 1 E6 07 INC VECPNT+1 ;ELSE BUMP HIGH POINTER |
| 127 | +00089E 1 A5 0D LDA BYTNUM ;GET IT |
| 128 | +0008A0 1 29 03 AND #WIDTH ;IF NOT MOD-(WIDTH+1) |
| 129 | +0008A2 1 D0 BE BNE OUTLPE ;THEN LOOP |
| 130 | +0008A4 1 20 7A 09 JSR CRLF ;ELSE DO CR AND LF |
| 131 | +0008A7 1 4C 62 08 JMP OUTLPE ;AND LOOP |
| 132 | +0008AA 1 20 7A 09 DONE: JSR CRLF ;SEND TWO |
| 133 | +0008AD 1 20 7A 09 JSR CRLF ;CR AND LF PAIRS |
| 134 | +0008B0 1 ;NOW SEND FREE COUNT TO SCREEN |
| 135 | +0008B0 1 20 EF 08 JSR SNDFRE |
| 136 | +0008B3 1 A9 20 LDA #' ' ;SEND A SPACE |
| 137 | +0008B5 1 20 81 09 JSR CHROUT |
| 138 | +0008B8 1 ;NOW DISPLAY BLOCK SIZE |
| 139 | +0008B8 1 A5 0F LDA BLKSCD ;GET CODE |
| 140 | +0008BA 1 0A ASL A ;MULT BY TWO |
| 141 | +0008BB 1 AA TAX ;MAKE INDEX |
| 142 | +0008BC 1 BD 99 09 LDA BLKTBL,X ;GET ADDRESS |
| 143 | +0008BF 1 BC 9A 09 LDY BLKTBL+1,X |
| 144 | +0008C2 1 A2 09 LDX #9 ;SEND MESSAGE |
| 145 | +0008C4 1 20 03 01 JSR PEM |
| 146 | +0008C7 1 A9 A3 LDA #(CLSMSG & $ff) ;SEND |
| 147 | +0008C9 1 A0 09 LDY #((CLSMSG / $100)& $FF) ;SIZE |
| 148 | +0008CB 1 A2 09 LDX #9 ;MESSAGE |
| 149 | +0008CD 1 20 03 01 JSR PEM |
| 150 | +0008D0 1 ;NOW SHOW TOTAL BLOCK COUNT |
| 151 | +0008D0 1 A9 00 LDA #0 ;FIRST CLEAR LEADING ZERO FLAG |
| 152 | +0008D2 1 85 0E STA LEADZ |
| 153 | +0008D4 1 A5 10 LDA TOTAL |
| 154 | +0008D6 1 A4 11 LDY TOTAL+1 |
| 155 | +0008D8 1 85 0A STA FREE |
| 156 | +0008DA 1 84 0B STY FREE+1 |
| 157 | +0008DC 1 20 EF 08 JSR SNDFRE |
| 158 | +0008DF 1 A9 B5 LDA #(TTLMSG & $ff) |
| 159 | +0008E1 1 A0 09 LDY #((TTLMSG / $100)& $FF) |
| 160 | +0008E3 1 A2 09 LDX #9 |
| 161 | +0008E5 1 20 03 01 JSR PEM |
| 162 | +0008E8 1 ;NOW EXIT |
| 163 | +0008E8 1 A5 08 LDA DFLDRV ;SELECT |
| 164 | +0008EA 1 A2 0E LDX #14 ;DEFAULT |
| 165 | +0008EC 1 4C 03 01 JMP PEM ;AND RETURN |
| 166 | +0008EF 1 ;SEND 16 BIT VALUE IN FREE TO SCREEN |
| 167 | +0008EF 1 A2 00 SNDFRE: LDX #0 ;CLEAR 10000'S |
| 168 | +0008F1 1 38 SEC |
| 169 | +0008F2 1 A5 0A F10000: LDA FREE ;DROP BY 10000 |
| 170 | +0008F4 1 E9 10 SBC #(10000 & $ff) |
| 171 | +0008F6 1 85 0A STA FREE |
| 172 | +0008F8 1 A5 0B LDA FREE+1 |
| 173 | +0008FA 1 E9 27 SBC #((10000 / $100)& $FF) |
| 174 | +0008FC 1 85 0B STA FREE+1 |
| 175 | +0008FE 1 E8 INX ;BUMP DIGIT |
| 176 | +0008FF 1 B0 F1 BCS F10000 ;LOOP IF NO BORROW |
| 177 | +000901 1 A5 0A LDA FREE ;ELSE ADD 10000 BACK IN |
| 178 | +000903 1 69 10 ADC #(10000 & $ff) |
| 179 | +000905 1 85 0A STA FREE |
| 180 | +000907 1 A5 0B LDA FREE+1 |
| 181 | +000909 1 69 27 ADC #((10000 / $100)& $FF) |
| 182 | +00090B 1 85 0B STA FREE+1 |
| 183 | +00090D 1 CA DEX ;DROP DIGIT |
| 184 | +00090E 1 F0 06 BEQ N10000 ;SKIP IF ZERO |
| 185 | +000910 1 8A TXA ;ELSE SET FLAG |
| 186 | +000911 1 85 0E STA LEADZ |
| 187 | +000913 1 20 74 09 JSR SNDDIG ;SEND |
| 188 | +000916 1 A2 00 N10000: LDX #0 ;CLEAR 1000'S |
| 189 | +000918 1 38 SEC |
| 190 | +000919 1 A5 0A F1000: LDA FREE ;DROP BY 1000 |
| 191 | +00091B 1 E9 E8 SBC #(1000 & $ff) |
| 192 | +00091D 1 85 0A STA FREE |
| 193 | +00091F 1 A5 0B LDA FREE+1 |
| 194 | +000921 1 E9 03 SBC #((1000 / $100)& $FF) |
| 195 | +000923 1 85 0B STA FREE+1 |
| 196 | +000925 1 E8 INX ;BUMP DIGIT |
| 197 | +000926 1 B0 F1 BCS F1000 ;LOOP IF NO BORROW |
| 198 | +000928 1 A5 0A LDA FREE ;ELSE ADD BACK IN |
| 199 | +00092A 1 69 E8 ADC #(1000 & $ff) |
| 200 | +00092C 1 85 0A STA FREE |
| 201 | +00092E 1 A5 0B LDA FREE+1 |
| 202 | +000930 1 69 03 ADC #((1000 / $100)& $FF) |
| 203 | +000932 1 85 0B STA FREE+1 |
| 204 | +000934 1 20 68 09 JSR DIGOUT ;SEND DIGIT |
| 205 | +000937 1 A2 00 LDX #0 ;CLEAR 100'S COUNT |
| 206 | +000939 1 38 SEC ;NOW |
| 207 | +00093A 1 A5 0A F100: LDA FREE ;NOW DO 100'S |
| 208 | +00093C 1 E9 64 SBC #100 |
| 209 | +00093E 1 85 0A STA FREE |
| 210 | +000940 1 A5 0B LDA FREE+1 |
| 211 | +000942 1 E9 00 SBC #0 |
| 212 | +000944 1 85 0B STA FREE+1 |
| 213 | +000946 1 E8 INX ;BUMP COUNT |
| 214 | +000947 1 B0 F1 BCS F100 ;UNTIL A BORROW |
| 215 | +000949 1 A5 0A LDA FREE |
| 216 | +00094B 1 69 64 ADC #100 ;THEN ADD |
| 217 | +00094D 1 85 0A STA FREE ;100 BACK AND SAVE |
| 218 | +00094F 1 20 68 09 JSR DIGOUT ;SEND DIGIT |
| 219 | +000952 1 A2 00 LDX #0 ;CLEAR 10'S |
| 220 | +000954 1 38 SEC ;NOW |
| 221 | +000955 1 A5 0A LDA FREE ;DROP |
| 222 | +000957 1 E9 0A F10: SBC #10 ;FREE BY 10 |
| 223 | +000959 1 E8 INX ;AND BUMP COUNT |
| 224 | +00095A 1 B0 FB BCS F10 ;UNTIL A BORROW |
| 225 | +00095C 1 69 0A ADC #10 ;ADD 10 BACK IN |
| 226 | +00095E 1 85 0A STA FREE ;AND SAVE |
| 227 | +000960 1 20 68 09 JSR DIGOUT ;SEND DIGIT |
| 228 | +000963 1 A5 0A NO10: LDA FREE ;ALWAYS |
| 229 | +000965 1 4C 74 09 JMP SNDDIG ;DO 1'S |
| 230 | +000968 1 ;OUTPUT DIGIT |
| 231 | +000968 1 CA DIGOUT: DEX ;DROP COUNT |
| 232 | +000969 1 F0 04 BEQ CHKLDZ ;IF ZERO CHECK FLAG |
| 233 | +00096B 1 86 0E STX LEADZ ;ELSE SET |
| 234 | +00096D 1 D0 04 BNE MKEDIG ;THEN MAKE AND SEND |
| 235 | +00096F 1 A5 0E CHKLDZ: LDA LEADZ ;GET FLAG |
| 236 | +000971 1 F0 06 BEQ EXTDIG ;DONE IF ZERO |
| 237 | +000973 1 8A MKEDIG: TXA ;MOVE TO A |
| 238 | +000974 1 09 30 SNDDIG: ORA #'0' |
| 239 | +000976 1 20 81 09 JSR CHROUT ;SEND |
| 240 | +000979 1 60 EXTDIG: RTS ;QUIT |
| 241 | +00097A 1 ;OUTPUT A CR AND LF |
| 242 | +00097A 1 A9 0D CRLF: LDA #CR ;SEND |
| 243 | +00097C 1 20 81 09 JSR CHROUT ;A CR |
| 244 | +00097F 1 A9 0A LDA #LF ;THEN A LF |
| 245 | +000981 1 ;CHARACTER OUTPUT |
| 246 | +000981 1 conwrt: |
| 247 | +000981 1 A2 02 CHROUT: LDX #2 ;SEND CHAR |
| 248 | +000983 1 4C 03 01 JMP PEM ;TO CONSOLE |
| 249 | +000986 1 ;BIT MASK TABLE |
| 250 | +000986 1 80 40 20 10 BITMSK: .BYTE 128,64,32,16,8,4,2,1 |
| 251 | +00098A 1 08 04 02 01 |
| 252 | +00098E 1 ;BLOCK SIZE MESSAGES |
| 253 | +00098E 1 31 24 BLKMS0: .BYTE "1$" |
| 254 | +000990 1 32 24 BLKMS1: .BYTE "2$" |
| 255 | +000992 1 34 24 BLKMS2: .BYTE "4$" |
| 256 | +000994 1 38 24 BLKMS3: .BYTE "8$" |
| 257 | +000996 1 31 36 24 BLKMS4: .BYTE "16$" |
| 258 | +000999 1 ;BLOCK SIZE MESSAGE POINTERS |
| 259 | +000999 1 8E 09 90 09 BLKTBL: .WORD BLKMS0,BLKMS1,BLKMS2,BLKMS3,BLKMS4 |
| 260 | +00099D 1 92 09 94 09 |
| 261 | +0009A1 1 96 09 |
| 262 | +0009A3 1 ;CLOSING MESSAGE |
| 263 | +0009A3 1 4B 20 42 4C CLSMSG: .BYTE "K BLOCKS FREE OF $" |
| 264 | +0009A7 1 4F 43 4B 53 |
| 265 | +0009AB 1 20 46 52 45 |
| 266 | +0009B5 1 20 54 4F 54 TTLMSG: .BYTE " TOTAL$" |
| 267 | +0009B9 1 41 4C 24 |
| 268 | +0009BC 1 |
| 269 | +0009BC 1 .END |
0 commit comments