	; ROM dumper, drugicx
	; Matej Horvat
	; 8. avgust 2017

	; Uporablja isti "protokol" kot HDDump3.asm.

	; Ta program je treba po assemblanju zapisati na sliko, ki je
	; kopija slike vzorcxne diskete, na offset 1600h. S tem zamenjamo
	; vstopno tocxko, ki jo ROM klicxe na zacxetku. (Navadno je tam
	; rutina, ki izklopi ROM, prekopira CPMLDR na naslov 100h, in
	; skocxi tja; to seveda ni v redu, ker potem ne dobimo ROM-a.)

	; Program izvedemo tako, da izvedemo isti trik z GRMT20 kot pri
	; HDDump3.asm, nato resetiramo Partnerja, pritisnemo CTL+C, in
	; ko dobimo izbiro zagonske naprave, pritisnemo F.
	; (Ali pa ne?)

	; ----------------------------------------

	org 0F600h

	; ----------------------------------------

Zacetek:
	; Interruptov ne zxelimo.
	di

	; Nastavimo SP na vrh nalozxene kode.
	ld sp, 0FF00h

	; Posxljemo trenutno izbrano (prvo) banko.
	call Zapiskaj
	call PosljiBanko

	; Posxljemo skupno obmocxje.
	ld d, 0Ch
	ld hl, 0F400h
	call PosljiObmocje

	; Posxljemo drugo banko.
	in a, (90h)
	call PosljiBanko

	; Koncxali smo.
	call Zapiskaj
	halt

	; ----------------------------------------

PosljiBanko:
	; Posxlje vsebino naslovnega prostora od 0 do 0F3FFh.

	ld d, 0F4h
	ld h, 0
	ld l, h		; HL := 0

	; (se nadaljuje v PosljiObmocje)

	; ----------------------------------------

PosljiObmocje:
	; Posxlje obmocxje "sektorjev" (enot po 256 bajtov s checksumom), ki
	; se zacxne na zxelenem naslovu.

	; IN:
	; D = sxt. "sektorjev" (ne sme biti 0)
	; HL -> prvi bajt

	call PosljiSektor
	dec d
	jr nz, PosljiObmocje

	ret

	; ----------------------------------------

PosljiSektor:
	; Posxlje "sektor" in checksum.
	; Vzeto iz HDDump3.asm.

	; IN:
	; HL -> prvi bajt

	; OUT:
	; HL -> prvi bajt naslednjega "sektorja"

	ld b, 0		; 256 ponovitev notranje zanke
	ld c, b		; Checksum := 0

.naslednjiBajt:
	; Posxljemo en bajt.
	ld a, (hl)
	call PosljiBajt

	; Prisxtejemo k checksumu.
	add a, c
	ld c, a

	; Gremo na naslednji bajt.
	inc hl
	djnz .naslednjiBajt

	; Posxljemo checksum.
	ld a, c
	; (se nadaljuje v PosljiBajt)

	; ----------------------------------------

PosljiBajt:
	; Posxlje bajt po serijskem portu. Ista vrednost se posxlje
	; trikrat; prejemnik dekodira z "glasovanjem".
	; Vzeto iz HDDump3.asm.

	; IN:
	; A = bajt

	push bc

	ld b, 3
.seEnkrat:
	; Cxakamo, dokler serijski port ni pripravljen na naslednji bajt.
	push af
.cakaj:
	in a, (0DBh)
	and 4
	jr z, .cakaj
	pop af

	; Posxljemo bajt.
	out (0DAh), a

	djnz .seEnkrat

	pop bc

	ret

	; ----------------------------------------

Zapiskaj:
	; Sprozxi dolg pisk na tipkovnici.

	in a, (0D9h)
	and 4		; Ready flag
	jr z, Zapiskaj

	ld a, 4		; Dolg pisk
	out (0D8h), a

	ret