diff --git a/README.md b/README.md index 73b71ed..f891553 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,17 @@ gslib ===== Apple IIgs Assembly Language Crash Course + + +Source Files in "Lesson" Order + + + quit.s Quit, Old-School simple quit program + quit8.s Quit8.System, ProDOS8 simple quit program + quit16.s Quit16, GSOS/P16 simple quit program + shr1.s SHR1, Shows how to turn on SHR Graphics Mode and clear screen + shr2.s SHR2, Adds functions to write palettes, clear screen to color, set scan-line control bytes + font.s Font routines, this is a library you can include to draw text + shrhello.s "Hello World", Example program showing how to use the font routines + shrloadimg.s SHRLoadImage, Loads a PackBytes image and unpacks it to screen + shrloadimg.m.s macros for ToolBox calls in SHRLoadImage diff --git a/source/font.s b/source/font.s new file mode 100644 index 0000000..31f015f --- /dev/null +++ b/source/font.s @@ -0,0 +1,607 @@ +**************************************** +* FONT ENGINE (v3?) * +* * +* Dagen Brock * +* 2013-07-20 * +**************************************** +* A= ptr to string preceded by length * +* X= screen location * +**************************************** +; each char: +; draw char at loc +; update loc +; see if length hit - no? back to draw char + mx %00 +]F_Length ds 2 ;length of string (only one byte currently used) +]F_CharIdx ds 2 ;index of current character +]F_CurrentPos ds 2 ;current top left char position +]F_StrPtr equ $00 ;pointer to string (including length byte) / DP + + +DrawString sta ]F_StrPtr ;store at dp 0 ($00) for indirect loads + stx ]F_CurrentPos + stz ]F_CharIdx + lda (]F_StrPtr) + and #$00ff ;strip off first char (len is only one byte) + sta ]F_Length ;get our length byte + +NextChar lda ]F_CharIdx + cmp ]F_Length + bne :notDone + rts ;DONE! Return to caller + +:notDone inc ]F_CharIdx + ldy ]F_CharIdx + lda ($00),y ;get next char! + and #$00FF ;mask high byte + sec + sbc #' ' ;our table starts with space ' ' + asl ;*2 + tay + ldx ]F_CurrentPos + jsr :drawChar + inc ]F_CurrentPos ;compare to addition time (?) + inc ]F_CurrentPos + inc ]F_CurrentPos + inc ]F_CurrentPos ;update screen pos (2 words=8 pixels) + bra NextChar + +;x = TopLeft screen pos +;y = char table offset +:drawChar lda FontTable,y ;get real address of char data + sec + sbc #FontData ;pivot offset - now a is offset of fontdata + tay ;so we'll index with that + lda FontData,y + stal $E12000,x + lda FontData+2,y + stal #2+$E12000,x + lda FontData+4,y + stal #160+$E12000,x + lda FontData+6,y + stal #160+2+$E12000,x + lda FontData+8,y + stal #160*2+$E12000,x + lda FontData+10,y + stal #160*2+2+$E12000,x + lda FontData+12,y + stal #160*3+$E12000,x + lda FontData+14,y + stal #160*3+2+$E12000,x + lda FontData+16,y + stal #160*4+$E12000,x + lda FontData+18,y + stal #160*4+2+$E12000,x + lda FontData+20,y + stal #160*5+$E12000,x + lda FontData+22,y + stal #160*5+2+$E12000,x + rts + + + + + +FontTable dw s_Space + dw s_Exclaim + dw s_Quote + dw s_Number + dw s_Dollar + dw s_Percent + dw s_Amper + dw s_Single + dw s_OpenParen + dw s_CloseParen + dw s_Asterix + dw s_Plus + dw s_Comma + dw s_Minus + dw s_Period + dw s_Slash + dw s_N0 + dw s_N1 + dw s_N2 + dw s_N3 + dw s_N4 + dw s_N5 + dw s_N6 + dw s_N7 + dw s_N8 + dw s_N9 + dw s_Colon + dw s_Semi + dw s_LAngle + dw s_Equal + dw s_RAngle + dw s_Question + dw s_At + dw s_A + dw s_B + dw s_C + dw s_D + dw s_E + dw s_F + dw s_G + dw s_H + dw s_I + dw s_J + dw s_K + dw s_L + dw s_M + dw s_N + dw s_O + dw s_P + dw s_Q + dw s_R + dw s_S + dw s_T + dw s_U + dw s_V + dw s_W + dw s_X + dw s_Y + dw s_Z + dw s_LBracket + dw s_BackSlash + dw s_RBracket + dw s_Carot + dw s_UnderLine + +FontData = * +s_Space hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + +s_Exclaim hex 000FF000 + hex 000FF000 + hex 000FF000 + hex 000FF000 + hex 00000000 + hex 000FF000 + +s_Quote hex 0FF00FF0 + hex 00F000F0 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + +s_Number hex 00000000 + hex 00F00F00 + hex 0FFFFFF0 + hex 00F00F00 + hex 0FFFFFF0 + hex 00F00F00 + +s_Dollar hex 000F0F00 + hex 00FFFFF0 + hex 0F0F0F00 + hex 00FFFF00 + hex 000F0FF0 + hex 0FFFFF00 + +s_Percent hex 0FF000F0 + hex 00000F00 + hex 0000F000 + hex 000F0000 + hex 00F00000 + hex 0F000FF0 + +s_Amper hex 000FF000 + hex 00F00F00 + hex 0F00F000 + hex 00F000F0 + hex 0F0FFF00 + hex 00F0F000 + +s_Single hex 000FF000 + hex 0000F000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + +s_OpenParen hex 000FF000 + hex 00FF0000 + hex 0FF00000 + hex 0FF00000 + hex 00FF0000 + hex 000FF000 + +s_CloseParen hex 000FF000 + hex 0000FF00 + hex 00000FF0 + hex 00000FF0 + hex 0000FF00 + hex 000FF000 + + +s_Asterix hex 00000000 + hex 00F0F0F0 + hex 000FFF00 + hex 00FFFFF0 + hex 000FFF00 + hex 00F0F0F0 + +s_Plus hex 000F0000 + hex 000F0000 + hex 0FFFFF00 + hex 000F0000 + hex 000F0000 + hex 00000000 + +s_Comma hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000FF00 + hex 0000F000 + +s_Minus hex 00000000 + hex 00000000 + hex 0FFFFF00 + hex 00000000 + hex 00000000 + hex 00000000 + + +s_Period hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000FF00 + hex 0000FF00 + +s_Slash hex 000000F0 + hex 00000F00 + hex 0000F000 + hex 000F0000 + hex 00F00000 + hex 0F000000 + +s_N0 hex 00FFFF00 + hex 0F000FF0 + hex 0F00F0F0 + hex 0F0F00F0 + hex 0FF000F0 + hex 00FFFF00 + +s_N1 hex 000F0000 + hex 00FF0000 + hex 000F0000 + hex 000F0000 + hex 000F0000 + hex 00FFF000 + +s_N2 hex 00FFFF00 + hex 0F0000F0 + hex 00000F00 + hex 000FF000 + hex 00F00000 + hex 0FFFFFF0 + +s_N3 hex 00FFFF00 + hex 000000F0 + hex 000FFF00 + hex 000000F0 + hex 000000F0 + hex 00FFFF00 + +s_N4 hex 0000FF00 + hex 000F0F00 + hex 00F00F00 + hex 0FFFFFF0 + hex 00000F00 + hex 00000F00 + +s_N5 hex 0FFFFFF0 + hex 0F000000 + hex 0FFFFF00 + hex 000000F0 + hex 0F0000F0 + hex 00FFFF00 + +s_N6 hex 000FFF00 + hex 00F00000 + hex 0F000000 + hex 0FFFFF00 + hex 0F0000F0 + hex 00FFFFF0 + +s_N7 hex 0FFFFFF0 + hex 000000F0 + hex 00000F00 + hex 0000F000 + hex 000F0000 + hex 000F0000 + +s_N8 hex 00FFFF00 + hex 0F0000F0 + hex 00FFFF00 + hex 0F0000F0 + hex 0F0000F0 + hex 00FFFF00 + +s_N9 hex 00FFFF00 + hex 0F0000F0 + hex 00FFFF00 + hex 0000F000 + hex 000F0000 + hex 00F00000 + +s_Colon hex 000FF000 + hex 000FF000 + hex 00000000 + hex 000FF000 + hex 000FF000 + hex 00000000 + +s_Semi hex 00000000 + hex 000FF000 + hex 000FF000 + hex 00000000 + hex 000FF000 + hex 000F0000 + +s_LAngle hex 0000F000 + hex 000F0000 + hex 00F00000 + hex 000F0000 + hex 0000F000 + hex 00000000 + +s_Equal hex 00000000 + hex 00000000 + hex 0FFFFF00 + hex 00000000 + hex 0FFFFF00 + hex 00000000 + +s_RAngle hex 0000F000 + hex 00000F00 + hex 000000F0 + hex 00000F00 + hex 0000F000 + hex 00000000 + +s_Question hex 00FFF000 + hex 0F000F00 + hex 00000F00 + hex 000FF000 + hex 00000000 + hex 000FF000 + +s_At hex 00FFFF00 + hex 0F0000F0 + hex 0F00F0F0 + hex 0FFFF0F0 + hex 000000F0 + hex 0FFFFF00 + +s_A hex 000FF000 + hex 00F00F00 + hex 0F0000F0 + hex 0FFFFFF0 + hex 0F0000F0 + hex 0F0000F0 + +s_B hex 0FFFFF00 + hex 0F0000F0 + hex 0FFFFF00 + hex 0F0000F0 + hex 0F0000F0 + hex 0FFFFF00 + +s_C hex 00FFFFF0 + hex 0F000000 + hex 0F000000 + hex 0F000000 + hex 0F000000 + hex 00FFFFF0 + +s_D hex 0FFFFF00 + hex 0F0000F0 + hex 0F0000F0 + hex 0F0000F0 + hex 0F0000F0 + hex 0FFFFF00 + +s_E hex 0FFFFFF0 + hex 0F000000 + hex 0FFFF000 + hex 0F000000 + hex 0F000000 + hex 0FFFFFF0 + +s_F hex 0FFFFFF0 + hex 0F000000 + hex 0FFFF000 + hex 0F000000 + hex 0F000000 + hex 0F000000 + +s_G hex 00FFFFF0 + hex 0F000000 + hex 0F000000 + hex 0F00FFF0 + hex 0F0000F0 + hex 00FFFF00 + +s_H hex 0F0000F0 + hex 0F0000F0 + hex 0FFFFFF0 + hex 0F0000F0 + hex 0F0000F0 + hex 0F0000F0 + +s_I hex 0FFFFF00 + hex 000F0000 + hex 000F0000 + hex 000F0000 + hex 000F0000 + hex 0FFFFF00 + +s_J hex 000000F0 + hex 000000F0 + hex 000000F0 + hex 0F0000F0 + hex 0F0000F0 + hex 00FFFF00 + +s_K hex 0F000F00 + hex 0F00F000 + hex 0FFF0000 + hex 0F00F000 + hex 0F000F00 + hex 0F000F00 + +s_L hex 0F000000 + hex 0F000000 + hex 0F000000 + hex 0F000000 + hex 0F000000 + hex 0FFFFFF0 + +s_M hex 0F0000F0 + hex 0FF00FF0 + hex 0F0FF0F0 + hex 0F0000F0 + hex 0F0000F0 + hex 0F0000F0 + +s_N hex 0F0000F0 + hex 0FF000F0 + hex 0F0F00F0 + hex 0F00F0F0 + hex 0F000FF0 + hex 0F0000F0 + +s_O hex 00FFFF00 + hex 0F0000F0 + hex 0F0000F0 + hex 0F0000F0 + hex 0F0000F0 + hex 00FFFF00 + +s_P hex 0FFFFF00 + hex 0F0000F0 + hex 0FFFFF00 + hex 0F000000 + hex 0F000000 + hex 0F000000 + +s_Q hex 00FFFF00 + hex 0F0000F0 + hex 0F0000F0 + hex 0F00F0F0 + hex 0F000FF0 + hex 00FFFFF0 + +s_R hex 0FFFFF00 + hex 0F0000F0 + hex 0FFFFF00 + hex 0F000F00 + hex 0F0000F0 + hex 0F0000F0 + +s_S hex 00FFFFF0 + hex 0F000000 + hex 00FFFF00 + hex 000000F0 + hex 000000F0 + hex 0FFFFF00 + +s_T hex 0FFFFF00 + hex 000F0000 + hex 000F0000 + hex 000F0000 + hex 000F0000 + hex 000F0000 + +s_U hex 0F0000F0 + hex 0F0000F0 + hex 0F0000F0 + hex 0F0000F0 + hex 0F0000F0 + hex 00FFFF00 + +s_V hex 0F0000F0 + hex 0F0000F0 + hex 0F0000F0 + hex 0F0000F0 + hex 00F00F00 + hex 000FF000 + +s_W hex 0F0000F0 + hex 0F0000F0 + hex 0F0000F0 + hex 0F0FF0F0 + hex 0FF00FF0 + hex 0F0000F0 + +s_X hex 0F0000F0 + hex 00F00F00 + hex 000FF000 + hex 000FF000 + hex 00F00F00 + hex 0F0000F0 + +s_Y hex F00000F0 + hex 0F000F00 + hex 00F0F000 + hex 000F0000 + hex 000F0000 + hex 000F0000 + +s_Z hex 0FFFFFF0 + hex 00000F00 + hex 0000F000 + hex 000F0000 + hex 00F00000 + hex 0FFFFFF0 + +s_LBracket hex 000FFF00 + hex 000F0000 + hex 000F0000 + hex 000F0000 + hex 000F0000 + hex 000FFF00 + +s_BackSlash hex 0F000000 + hex 00F00000 + hex 000F0000 + hex 0000F000 + hex 00000F00 + hex 000000F0 + +s_RBracket hex 00FFF000 + hex 0000F000 + hex 0000F000 + hex 0000F000 + hex 0000F000 + hex 00FFF000 + +s_Carot hex 0000F000 + hex 000F0F00 + hex 00F000F0 + hex 00000000 + hex 00000000 + hex 00000000 + +s_UnderLine hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFF0 + +s_Template hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + diff --git a/source/quit.s b/source/quit.s new file mode 100644 index 0000000..d0b3ccd --- /dev/null +++ b/source/quit.s @@ -0,0 +1,11 @@ +**************************************** +* Quit * +* * +* Dagen Brock * +* 2013-06-24 * +**************************************** + + rts ; return from wherever we were called + + + diff --git a/source/quit16.s b/source/quit16.s new file mode 100644 index 0000000..d5a0652 --- /dev/null +++ b/source/quit16.s @@ -0,0 +1,26 @@ +**************************************** +* Quit16 * +* * +* Dagen Brock * +* 2013-06-10 * +**************************************** + + rel ; compile as relocatable code + dsk Quit16.l ; Save Name + + phk ; Set Data Bank to Program Bank + plb ; Always do this first! + + jsl $E100A8 ; Prodos 16 entry point + da $29 ; Quit code + adrl QuitParm ; address of parameter table + bcs Error ; never taken + +Error brk ; should never get here + +QuitParm adrl $0000 ; pointer to pathname (not used here) + da $00 ; quit type (absolute quit) + + + + diff --git a/source/quit8.s b/source/quit8.s new file mode 100644 index 0000000..b4ea3f3 --- /dev/null +++ b/source/quit8.s @@ -0,0 +1,29 @@ +**************************************** +* Quit8 * +* * +* Dagen Brock * +* 2013-06-24 * +**************************************** + + org $2000 ; start at $2000 (all ProDOS8 system files) + dsk quit8.system ; tell compiler what name for output file + typ $ff ; set P8 type ($ff = "SYS") for output file + +MLI equ $bf00 + + + +Quit jsr MLI ; first actual command, call ProDOS vector + dfb $65 ; with "quit" request ($65) + da QuitParm + bcs Error + brk $00 ; shouldn't ever here! + +QuitParm dfb 4 ; number of parameters + dfb 0 ; standard quit type + da $0000 ; not needed when using standard quit + dfb 0 ; not used + da $0000 ; not used + + +Error brk $00 ; shouldn't be here either diff --git a/source/shr1.s b/source/shr1.s new file mode 100644 index 0000000..80f9eb3 --- /dev/null +++ b/source/shr1.s @@ -0,0 +1,64 @@ +**************************************** +* SHR1 * +* * +* Dagen Brock * +* 2013-07-17 * +**************************************** + + rel ; Compile + dsk SHR1.l ; Save Name + mx %00 ; Program starts in 16-bit mode + + phk ; Set Data Bank to Program Bank + plb ; Always do this first! + +GraphicsOn sep #$30 ; 8-bit mode + lda #$81 + stal $00C029 ; Turn on SHR mode + rep #$30 ; back to 16-bit mode + + jsr WaitKey ; pause + + + +ClearNaive ldx #$0000 ; Start at first pixel + lda #$0000 ; store zeros +:clearloop stal $E12000,x ; screen location + inx + inx + cpx #$8000 ; see if we've filled entire frame/colors/scbs + bne :clearloop ; pause + + + jsr WaitKey + + + +ClearFaster ldx #$7FFE ; start at top this time + lda #$0000 ; store zeros +:clearloop stal $E12000,x ; screen location + dex + dex + ; avoid 16K "compare X's" for 80K cycle savings + bne :clearloop ; loop until we've worked our way down to 0 + jsr WaitKey + + + jsl $E100A8 ; Prodos 16 entry point + da $29 ; Quit code + adrl QuitParm ; address of parameter table + bcs Error ; never taken + +Error brk ; should never get here + +QuitParm adrl $0000 ; pointer to pathname (not used here) + da $00 ; quit type (absolute quite) + +WaitKey sep #$30 ; good old apple ii key wait routine +:wait ldal $00C000 ; but called using long addressing modes + bpl :wait ; in 8-bit mode + stal $00C010 + rep #$30 + rts + + diff --git a/source/shr2.s b/source/shr2.s new file mode 100644 index 0000000..ac8492b --- /dev/null +++ b/source/shr2.s @@ -0,0 +1,86 @@ +**************************************** +* SHR2 * +* * +* Dagen Brock * +* 2013-07-17 * +**************************************** + + rel ;Compile + dsk SHR2.l ;Save Name + mx %00 ;Program starts in 16-bit mode + + phk ;Set Data Bank to Program Bank + plb ;Always do this first! + + lda #$0FFF ; WHITE color + ldx #$0001 ; palette index 1 (NOT zero) + jsr SetPaletteColor + + lda #$0000 + jsr SetSCBs ;set all SCBs to 00 (320 mode, pal 0, no fill, no interrupt) + jsr ClearToColor ;clear screen (fill with zeros) + jsr GraphicsOn ;turn on SHR + jsr WaitKey + + lda #$1111 ;clear screen to color 1 + jsr ClearToColor + jsr WaitKey + + jsl $E100A8 ;Prodos 16 entry point + da $29 ;Quit code + adrl QuitParm ;address of parameter table + bcs Error ;never taken + +Error brk ;should never get here + +QuitParm adrl $0000 ;pointer to pathname (not used here) + da $00 ;quit type (absolute quite) + + +**************************************** +* Turn on SHR mode * +**************************************** +GraphicsOn sep #$30 ;8-bit mode + lda #$81 ;%1000 0001 + stal $00C029 ;Turn on SHR mode + rep #$30 ;back to 16-bit mode + rts + +**************************************** +* A= color values (0RGB) * +* X= color/palette offset * +* (0-F = pal0, 10-1F = pal1, etc.) * +**************************************** +SetPaletteColor pha ;save accumulator + txa + asl ;X*2 = real offset to color table + tax + pla + stal $E19E00,x ;palettes are stored from $E19E00-FF + rts ;yup, that's it + +**************************************** +* A= color values (0RGB) * +**************************************** +ClearToColor ldx #$7D00 ;start at top of pixel data! ($2000-9D00) +:clearloop dex + dex + stal $E12000,x ;screen location + bne :clearloop ;loop until we've worked our way down to 0 + rts + +SetSCBs ldx #$0100 ;set all $100 scbs to A +:scbloop dex + dex + stal $E19D00,x + bne :scbloop + rts + +WaitKey sep #$30 +:wait ldal $00C000 + bpl :wait + stal $00C010 + rep #$30 + rts + + diff --git a/source/shrhello.s b/source/shrhello.s new file mode 100644 index 0000000..dc6b389 --- /dev/null +++ b/source/shrhello.s @@ -0,0 +1,99 @@ +**************************************** +* SHRHELLO * +* * +* Dagen Brock * +* 2013-07-21 * +**************************************** + + rel ; Compile + dsk SHRHELLO.l ; Save Name + mx %00 + phk ; Set Data Bank to Program Bank + plb ; Always do this first! + + lda #$0FFF ; WHITE color + ldx #$000F ; palette index 1 (NOT zero) + jsr SetPaletteColor + lda #$0589 ; other color + ldx #$0001 ; palette index 1 (NOT zero) + jsr SetPaletteColor + lda #$0000 + jsr SetSCBs ; set all SCBs to 00 (320 mode, pal 0, no fill, no interrupt) + jsr GraphicsOn + + + lda #$0000 ; clear screen to color 0 and turn on SHR graphics + jsr ClearToColor + lda #HelloStr + ldx #60*160+30 + jsr DrawString + jsr WaitKey + + lda #$1111 ; clear screen to color 1 + jsr ClearToColor + lda #HelloStr + ldx #60*160+30 + jsr DrawString + jsr WaitKey + + + + jsl $E100A8 ; Prodos 16 entry point + da $29 ; Quit code + adrl QuitParm ; address of parameter table + bcs Error ; never taken + +Error brk ; should never get here + +QuitParm adrl $0000 ; pointer to pathname (not used here) + da $00 ; quit type (absolute quite) + +HelloStr str 'HELLO KANSASFEST' + +**************************************** +* Turn on SHR mode * +**************************************** +GraphicsOn sep #$30 ;8-bit mode + lda #$81 ;%1000 0001 + stal $00C029 ;Turn on SHR mode + rep #$30 ;back to 16-bit mode + rts + +**************************************** +* A= color values (0RGB) * +* X= color/palette offset * +* (0-F = pal0, 10-1F = pal1, etc.) * +**************************************** +SetPaletteColor pha ;save accumulator + txa + asl ;X*2 = real offset to color table + tax + pla + stal $E19E00,x ;palettes are stored from $E19E00-FF + rts ;yup, that's it + +**************************************** +* A= color values (0RGB) * +**************************************** +ClearToColor ldx #$7D00 ;start at top of pixel data! ($2000-9D00) +:clearloop dex + dex + stal $E12000,x ;screen location + bne :clearloop ;loop until we've worked our way down to 0 + rts + +SetSCBs ldx #$0100 ;set all $100 scbs to A +:scbloop dex + dex + stal $E19D00,x + bne :scbloop + rts + +WaitKey sep #$30 +:wait ldal $00c000 + bpl :wait + stal $00c010 + rep #$30 + rts + + use FONT ;include our font library diff --git a/source/shrloadimg.m.s b/source/shrloadimg.m.s new file mode 100644 index 0000000..1239f8b --- /dev/null +++ b/source/shrloadimg.m.s @@ -0,0 +1,39 @@ +_TLStartUp MAC + Tool $201 + <<< +_MMStartUp MAC + Tool $202 + <<< +_NewHandle MAC + Tool $902 + <<< +_UnPackBytes MAC + Tool $2703 + <<< +_TLTextMountVol MAC + Tool $1201 + <<< +PushLong MAC + IF #=]1 + PushWord #^]1 + ELSE + PushWord ]1+2 + FIN + PushWord ]1 + <<< +PushWord MAC + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< +Tool MAC + LDX #]1 + JSL $E10000 + <<< diff --git a/source/shrloadimg.s b/source/shrloadimg.s new file mode 100644 index 0000000..2160183 --- /dev/null +++ b/source/shrloadimg.s @@ -0,0 +1,266 @@ +**************************************** +* SHRLOADIMG * +* * +* Dagen Brock * +* 2013-07-21 * +**************************************** + + rel ; Compile + dsk SHRLOADIMG.l ; Save Name + use shrloadimg.m + mx %00 ; Program starts in 16-bit mode + +**************************************** +* Basic Error Macro * +**************************************** +_Err mac + bcc NoErr + do ]0 ; (DO if true) + jsr PgmDeath ; this is conditionally compiled if + str ]1 ; we pass in an error statement + else ; (ELSE) + jmp PgmDeath0 ; we just call the simpler error handler + fin ; (FIN) +NoErr eom + + +**************************************** +* Program Start * +**************************************** + phk ; Set Data Bank to Program Bank + plb ; Always do this first! + + +**************************************** +* Typical tool startup * +**************************************** + _TLStartUp ; normal tool initialization + pha + _MMStartUp + _Err ; should never happen + pla + sta MasterId ; our master handle references the memory allocated to us + ora #$0100 ; set auxID = $01 (valid values $01-0f) + sta UserId ; any memory we request must use our own id + +**************************************** +* Initialize graphics * +**************************************** + jsr AllocOneBank ; Alloc 64KB for Load/Unpack + sta BankLoad ; Store "Bank Pointer" + + ldx #ImageName ; Load+Unpack Boot Picture + jsr LoadPicture ; X=Name, A=Bank to use for loading + + lda BankLoad ; get address of loaded/uncompressed picture + clc + adc #$0080 ; skip header? + sta :copySHR+2 ; and store that over the 'ldal' address below + ldx #$7FFE ; copy all image data +:copySHR ldal $000000,x ; load from BankLoad we allocated + stal $E12000,x ; store to SHR screen + dex + dex + bpl :copySHR + + jsr GraphicsOn + + jsr WaitKey + + bra Quit + +ImageName strl '1/KFEST2013.PAK' +MasterId ds 2 +UserId ds 2 +BankLoad hex 0000 ; used for Load/Unpack + +Quit jsl $E100A8 ; Prodos 16 entry point + da $29 ; Quit code + adrl QuitParm ; address of parameter table + bcs Error ; never taken + +Error brk ; should never get here + +QuitParm adrl $0000 ; pointer to pathname (not used here) + da $00 ; quit type (absolute quite) + +**************************************** +* AllocOneBank * +* This is a custom allocation function * +* that makes use of the fact that we * +* request an entire locked bank and so * +* simply returns the bank in the * +* accumulator. (basically dereference * +* the Handle to get the pointer) * +**************************************** +AllocOneBank PushLong #0 + PushLong #$10000 + PushWord UserId + PushWord #%11000000_00011100 + PushLong #0 + _NewHandle ; returns LONG Handle on stack + plx ; base address of the new handle + pla ; high address 00XX of the new handle (bank) + xba ; swap accumulator bytes to XX00 + sta :bank+2 ; store as bank for next op (overwrite $XX00) +:bank ldal $000001,X ; recover the bank address in A=XX/00 + rts + +**************************************** +* Graphics Helpers * +**************************************** +LoadPicture jsr LoadFile ; X=Nom Image, A=Banc de chargement XX/00 + bcc :loadOK + brl Exit +:loadOK jsr UnpackPicture ; A=Packed Size + rts + + +UnpackPicture sta UP_PackedSize ; Size of Packed Data + lda #$8000 ; Size of output Data Buffer + sta UP_UnPackedSize + lda BankLoad ; Banc de chargement / Decompression + sta UP_Packed+1 ; Packed Data + clc + adc #$0080 + stz UP_UnPacked ; On remet a zero car modifie par l'appel + stz UP_UnPacked+2 + sta UP_UnPacked+1 ; Unpacked Data buffer + + PushWord #0 ; Space for Result : Number of bytes unpacked + PushLong UP_Packed ; Pointer to buffer containing the packed data + PushWord UP_PackedSize ; Size of the Packed Data + PushLong #UP_UnPacked ; Pointer to Pointer to unpacked buffer + PushLong #UP_UnPackedSize ; Pointer to a Word containing size of unpacked data + _UnPackBytes + pla ; Number of byte unpacked + rts + +UP_Packed hex 00000000 ; Address of Packed Data +UP_PackedSize hex 0000 ; Size of Packed Data +UP_UnPacked hex 00000000 ; Address of Unpacked Data Buffer (modified) +UP_UnPackedSize hex 0000 ; Size of Unpacked Data Buffer (modified) + +**************************************** +* Turn on SHR mode * +**************************************** +GraphicsOn sep #$30 ; 8-bit mode + lda #$C1 + stal $00C029 ; Turn on SHR mode + rep #$30 ; back to 16-bit mode + rts + +WaitKey sep #$30 +:wait ldal $00C000 + bpl :wait + stal $00C010 + rep #$30 + rts + + + +**************************************** +* Fatal Error Handler * +**************************************** +PgmDeath tax + pla + inc + phx + phk + pha + bra ContDeath +PgmDeath0 pha + pea $0000 + pea $0000 +ContDeath ldx #$1503 + jsl $E10000 + + +**************************************** +* Normal GSOS Quit * +**************************************** +Exit jsl GSOS + dw $2029 + adrl QuitGS + + +**************************************** +* GS/OS / ProDOS 16 File Routines * +**************************************** +GSOS = $E100A8 + +LoadFile stx OpenGS+4 ; X=File, A=Bank/Page XX/00 + sta ReadGS+5 + +:openFile jsl GSOS ; Open File + dw $2010 + adrl OpenGS + bcs :openReadErr + lda OpenGS+2 + sta GetEOFGS+2 + sta ReadGS+2 + + jsl GSOS ; Get File Size + dw $2019 + adrl GetEOFGS + lda GetEOFGS+4 + sta ReadGS+8 + lda GetEOFGS+6 + sta ReadGS+10 + + jsl GSOS ; Read File Content + dw $2012 + adrl ReadGS + bcs :openReadErr + +:closeFile jsl GSOS ; Close File + dw $2014 + adrl CloseGS + clc + lda GetEOFGS+4 ; File Size + rts + +:openReadErr jsr :closeFile + nop + nop + + PushWord #0 + PushLong #msgLine1 + PushLong #msgLine2 + PushLong #msgLine3 + PushLong #msgLine4 + _TLTextMountVol ; actualname is TLTextMountVolume + pla + cmp #1 + bne :loadFileErr + brl :openFile +:loadFileErr sec + rts + +msgLine1 str 'Unable to load File' +msgLine2 str 'Press a key :' +msgLine3 str ' -> Return to Try Again' +msgLine4 str ' -> Esc to Quit' + + +OpenGS dw 2 ; pCount + ds 2 ; refNum + adrl ImageName ; pathname + +GetEOFGS dw 2 ; pCount + ds 2 ; refNum + ds 4 ; eof + +ReadGS dw 4 ; pCount + ds 2 ; refNum + ds 4 ; dataBuffer + ds 4 ; requestCount + ds 4 ; transferCount + +CloseGS dw 1 ; pCount + ds 2 ; refNum + +QuitGS dw 2 ; pCount + ds 4 ; pathname + ds 2 ; flags +