diff --git a/docs/blockpunch.asm b/docs/blockpunch.asm new file mode 100644 index 0000000..a27af18 --- /dev/null +++ b/docs/blockpunch.asm @@ -0,0 +1,115 @@ +; typed in from imlacdocs/blockpunchsrc.pdf + org 037540 +start hlt ; wait for first address + lda ; + dac fad ; save in FAD + hlt ; wait for end address + lda ; + sub fad ; get length of block punch + cma ; ones complement the count + dac mwd ; save as 'minus number of words' + asm ; test if end address < first + jmp start ; jump if so +doblk add allbits ; test if num words + asp ; skip if + cla ; + sub allbits ; + dac wtb ; save in 'words this block' + cia ; twos complement block count + jms pbyte ; output word count BYTE + add mwd ; + dac mwd ; + lac fad ; + jms pword ; output block address WORD + cla ; + dac smc ; +loop lac *fad ; + jms pword ; + jms updchs ; update checksum + isz fad ; move address to next word + isz wtb ; check block finished + jmp loop ; jump if NOT, continue + lac smc ; + jms pword ; outp[ut checksum WORD + lac mwd ; are we finished the block punch? + asz ; skip if no more words to punch + jmp doblk ; punch next block + jmp start ; punch finished +;------------------------ +; Punch two bytes (a WORD) from AC +;------------------------ +pword bss 1 ; + rar 3 ; shift high byte to lower in AC + rar 3 ; + rar 2 ; + jms pbyte ; punch high byte + ral 3 ; get low byte to AC low byte + ral 3 ; + ral 2 ; + jms pbyte ; punch low byte + jmp *pword ; +;------------------------ +; Punch low byte of AC (AC left unchanged) +;------------------------ +pbyte bss 1 ; + tsf ; skip if TTYOUT free + jmp .-1 ; wait until TTYOUT is free + tpc ; punch and clear flag + jmp *pbyte ; +;------------------------ +; Update checksum, new value in AC +;------------------------ +updchs bss 1 ; + cll ; clear link + add smc ; add new value + lsz ; skip if no overflow + iac ; else increment checksum + dac smc ; put updated checksum back + jmp *updchs ; +;------------------------ +; What were literals in original code stored here +;------------------------ +fad data 0 ; first address +mwd data 0 ; minus number of words +wtb data 0 ; num words in this block +smc data 0 ; checksum +allbits data 0377 ; byte of all bits + +;------------------------ +; Punch block loader +;------------------------ + org start+0100 ; 037540 + 0100 = 037640 +pbldr lwc 0100 ; + dac fad ; + lwc 076 ; + dac wtb ; +pbloop lac *fad ; + jms pword ; + isz fad ; + isz wtb ; + jmp pbloop ; + jmp pldr ; punch leader + +;------------------------ +; Punch leader +;------------------------ + org start+0120 ; 037540 + 0120 = 037660 +pldr lwc 07 ; we want 16 bytes of leader (8 words) + dac wtb ; store leader count + cla ; + jms pword ; + isz wtb ; + jmp .-2 ; + jmp start ; wait for first address + +;------------------------ +; Punch end code +;------------------------ + org start+0130 ; 037540 + 0130 = 037670 +pend law 0377 ; + jms pbyte ; + jms pbyte ; + jms pbyte ; + jmp pldr ; punch more leader + + end