1 ******************************************************************** 2 * Boot - NitrOS-9 Lemma Boot Module 3 * 4 * $Id: boot_lemma.asm,v 1.2 2023/03/16 07:16:54 strick Exp strick $ 5 * 6 * Edt/Rev YYYY/MM/DD Modified by 7 * Comment 8 * ------------------------------------------------------------------ 9 * 1 2023/03/15 Henry Strickland W6REK (github.com/strickyak) 10 * 11 * Created, based on boot_rom by Boisy G. Pitre for boilerplate, 12 * and Michael Furman N6IL's cocoio-dw repository 13 * (github.com/n6il). 14 15 ****** 16 * 17 * Lemma Definitions 18 Q.BfBegin equ 211 ; quint { cmd total_size.hi total_size.lo 0 0 } 19 Q.BfChunk equ 212 ; quint { cmd chunk_size.hi chunk_size.lo 0 0 } 20 Q.BfEnd equ 213 ; quint { cmd total_size.hi total_size.lo 0 0 } 21 22 ;; Page 0 between $11 and $20 is unused in OS9 Level 1. 23 ;; TODO use stack instead. Drivewire scribbles stats here. 24 BeginPtr equ $12 25 CurrPtr equ $14 26 Quint equ $16 27 QuintN equ $17 28 QuintSize equ 5 ; quint is 5 bytes 29 * 30 ****** 31 32 nam Boot 33 ttl NitrOS-9 Level 1 Lemma Boot Module 34 35 ifp1 36 use defsfile 37 use cocoio.d 38 use w5100s.d 39 endc 40 41 tylg set Systm+Objct 42 atrv set ReEnt+rev 43 rev set $01 44 edition set 1 45 46 mod eom,name,tylg,atrv,start,size 47 48 size equ . 49 50 name fcs /Boot/ 51 fcb edition 52 53 54 ;; Load Quint (for Q.BfBegin) 55 ;; Assert BfSize, and get sz. 56 ;; 57 ;; F$SRqMem D=sz => U=begin 58 ;; current := begin 59 ;; 60 ;; LOOP: 61 ;; Load Quint. 62 ;; If BfEnd{ s } , return: X=begin D=sz 63 ;; 64 ;; Assert BfChunk{ chunk_sz } 65 ;; 66 ;; Read(current, chunk_sz } 67 ;; current += chunk_sz 68 ;; 69 ;; GOTO LOOP; 70 71 start pshs u,y,dp 72 clra 73 tfr a,dp ; we use DP=0. 74 75 jsr ReadQuint 76 ldd temp 157 sty 8,u * exptectd bytes => len 158 @loop 159 ldd #S3_RX_RSR0 160 std CIO0ADDR 161 lda CIO0DATA 162 sta 6,u * rsize msb 163 ldb CIO0DATA 164 stb 7,u * rsize lsb 165 subd ,u * S3_RX_RSR0 - temp 166 blo @loop 167 * all bytes we want are available for reading now 168 169 * get current pointer in receive buffer 170 ldd #S3_RX_RD0 171 std CIO0ADDR 172 lda CIO0DATA 173 sta 2,u * rptr msb 174 ldb CIO0DATA 175 stb 3,u * rptr lsb 176 177 * offset into receive buffer 178 * roffset = rptr & SKBUFMASK 179 andd #SKBUFMASK 180 std 4,u * roffset 181 182 * The receieve buffer is circular. Check if we need to read from it in two 183 * parts or one 184 * if(roffset + len > SKBUFMASK) 185 sty ,u * exptectd bytes => temp 186 addd ,u * roffset + temp 187 cmpd #SKBUFMASK 188 ble once 189 twice 190 * 1) Read to end of buffer 191 pshs y ; len 192 * rsize = SKBUFSIZE - roffset 193 ldd #SKBUFSIZE 194 subd 4,u * roffset 195 std 6,u * rsize 196 * rgblkget(buf, sockp->skrbstrt + roffset, rsize) 197 tfr d,y 198 ldd 4,u * rofset 199 addd #S1_RX_BUF 200 std ,u * temp 201 jsr w51rd 202 203 * 2) Read remainder from beginning of buffer 204 * rgblkget(buf + rsize, sockp->skrbstrt, len - rsize) 205 ldd #S1_RX_BUF 206 std ,u * temp 207 puls d * len 208 subd 6,u * rsize 209 tfr d,y 210 bra doonce 211 once 212 * rgblkget(buf, sockp->skrbstrt + roffset, len) 213 ldd #S1_RX_BUF 214 addd 4,u * roffset 215 std ,u * temp 216 doonce 217 jsr w51rd 218 advance 219 ldd #S3_RX_RD0 220 std CIO0ADDR 221 ldd 8,u * len 222 sta CIO0DATA 223 stb CIO0DATA 224 rxdone 225 leas 10,s 226 puls u,pc 227 228 229 w51rd 230 * x - buf 231 * y - count 232 * temp rgaddr 233 ldd ,u * temp 234 std CIO0ADDR 235 bra @check 236 @loop 237 lda CIO0DATA 238 sta ,x+ 239 leay -1,y 240 @check 241 cmpy #0 242 bne @loop 243 rts 244 245 * End copy from github.com/n6il/cocoio-dw/dwread.asm }}} 246 * 247 ************************************************** 248 249 emod 250 eom equ *