trs80load: TRS80 loader
authorAlan Cox <alan@linux.intel.com>
Thu, 18 Dec 2014 00:53:20 +0000 (00:53 +0000)
committerAlan Cox <alan@linux.intel.com>
Thu, 18 Dec 2014 00:53:20 +0000 (00:53 +0000)
Assumes single sided double density disk. Sets up the memory map, moves itself
to 0x00-0xff and then loads the kernel at 0x100 before running it.

Kernel/platform-trs80/trs80load.s [new file with mode: 0644]

diff --git a/Kernel/platform-trs80/trs80load.s b/Kernel/platform-trs80/trs80load.s
new file mode 100644 (file)
index 0000000..5df52fc
--- /dev/null
@@ -0,0 +1,142 @@
+;
+;      TRS80 bootblock (256 bytes)
+;
+           .org 0x0
+start:
+           ld a, 0x36                  ; kernel map, 80 column
+           out (0x84), a
+           ld a, 0x50                  ; 80 column, sound, altchars off,
+                                       ; ext I/O on , 4MHz
+           out (0xEC), a
+           ld hl, 0x4300
+           ld de, 0x0
+           ld bc, 256
+           ldir
+           jp go
+;
+;      Assume the boot ROM left us on track 0 and motor on
+;
+floppy_read:
+           ld bc, 0x81F4               ; select drive
+           out (c), b
+           out (0xF2), a               ; sector please
+           ld a, 0x80                  ; READ
+           out (0xF0), a
+           ld b, 100
+l1:        djnz l1
+           ld de, 0x8116
+           ld bc, 0xF3
+flopin:            in a, (0xF0)
+           and e
+           jr z, flopin
+           ini
+           ld a, d
+flopind:
+           out (0xF4), a
+           ini
+           jr nz, flopind
+flopstat:
+           in a, (0xF0)
+           and 0x19
+           bit 0, a
+           jr nz, flopstat
+           or a
+           ret z
+           ld de, 0xF850
+           call prints
+           .db 'Read',0
+fail:      jr fail
+
+go:   
+           ld sp, floppy_read
+
+            ; load the 6845 parameters
+           ld hl, _ctc6845
+           ld bc, 1588
+ctcloop:    out (c), b                 ; register
+           ld a, (hl)
+           out (0x89), a               ; data
+           inc hl
+           djnz ctcloop
+
+           ; clear screen
+           ld hl, 0xF800
+           inc hl
+           ld de, 0xF801
+           ld bc, 1999
+           ld (hl), ' '
+           ldir
+           ld de, 0xF800
+           call prints
+           .db 'TRS80Load 0.1',0
+
+           ld hl, 0x0100
+
+
+
+lastsec:    ld a, (tracknum)
+           inc a
+           ld (tracknum), a
+           cp 40
+           jr z, booted
+           out (0xF3), a
+           ld a, 0x18                  ; seek
+           out (0xF0), a
+           ld b, 100
+cmd1:      djnz cmd1
+cmdwait:    in a, (0xF0)
+           bit 0, a
+           jr z, seekstat
+           bit 7, a
+           jr z, cmdwait
+seekstat:
+           in a, (0xF0)
+           and 0x18
+           bit 0, a
+           jr nz, seekstat
+           or a
+           jr z, secmove
+           ld de, 0xF850
+           call prints
+           .db 'seek',0
+bad:       jr bad
+secmove:    xor a
+           ld (secnum), a
+nextsec:
+           ld a, (secnum)
+           inc a
+           ld (secnum), a
+           cp 11
+           jr z, lastsec
+           push hl
+           call floppy_read
+           pop hl
+           inc h
+           jr nextsec
+
+tracknum:   .db 28                     ; tracks 29-39 (50688 bytes)
+
+
+_ctc6845:                              ; registers in reverse order
+           .db 99, 80, 85, 10, 25, 4, 24, 24, 0, 9, 101, 9, 0, 0, 0
+; recycle last crc value as secnum so we fit 256 bytes
+secnum:            .db 0
+
+
+prints:
+          pop hl
+printsl:
+          ld a, (hl)
+          inc hl
+          or a
+          jr z, out
+          ld (de), a
+          inc de
+          jr printsl
+out:      jp (hl)
+
+booted:            ld de, 0xF850
+           call prints
+           .db 'Booting..',0
+
+; OS starts on the following byte